Files
wursor/packages/ai-layer/src/features/diff-summary.ts
T
2026-05-04 12:30:56 +01:00

73 lines
2.4 KiB
TypeScript

import type { AIGateway } from '../gateway.js';
import { buildDiffSummaryMessages, buildAggregateSummaryMessages } from '../prompts/diff-summary.prompt.js';
export interface DiffSummaryInput {
/** Serialized component-level changes (JSON) */
changesJson: string;
/** Component name */
componentName: string;
/** Active DLF as JSON string — passed through for rule-violation annotation */
dlfJson?: string;
}
export interface DiffSummaryOutput {
summary: string;
}
export async function generateDiffSummary(
gateway: AIGateway,
input: DiffSummaryInput
): Promise<DiffSummaryOutput> {
const { system, userContent, maxTokens } = buildDiffSummaryMessages(input);
const response = await gateway.complete({
system,
messages: [{ role: 'user', content: userContent }],
maxTokens,
temperature: 0.2, // spec Layer 6.3: 0.2 for diff-summary (consistent output)
});
return { summary: response.text.trim() };
}
// ── Aggregate summary ─────────────────────────────────────────────────────────
export interface AggregateSummaryInput {
/** All changes in the diff as serialized JSON */
changesJson: string;
/** Human-readable artboard name, e.g. "Homepage Hero" */
artboardName: string;
/** Active DLF as JSON string — used to flag rule violations in the summary */
dlfJson?: string;
}
export interface AggregateSummaryOutput {
summary: string;
}
/**
* Generates a 2-3 sentence summary of ALL changes across a single diff
* (artboard-level granularity, suitable for the diff card header and PR body).
* Uses buildAggregateSummaryMessages — the session-level counterpart of
* buildDiffSummaryMessages (component-level).
*/
export async function generateAggregateSummary(
gateway: AIGateway,
input: AggregateSummaryInput,
): Promise<AggregateSummaryOutput> {
const { system, userContent, maxTokens } = buildAggregateSummaryMessages({
changesJson: input.changesJson,
artboardName: input.artboardName,
...(input.dlfJson !== undefined ? { dlfJson: input.dlfJson } : {}),
});
const response = await gateway.complete({
system,
messages: [{ role: 'user', content: userContent }],
maxTokens,
temperature: 0.2, // same as per-component summary — deterministic aggregate
});
return { summary: response.text.trim() };
}