agentflight 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -5
- package/dist/adapters/agentloopkit.d.ts.map +1 -1
- package/dist/adapters/agentloopkit.js +26 -7
- package/dist/adapters/agentloopkit.js.map +1 -1
- package/dist/adapters/projscan.d.ts.map +1 -1
- package/dist/adapters/projscan.js +26 -7
- package/dist/adapters/projscan.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +40 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/doctor.d.ts +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +20 -12
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/replay.d.ts +1 -0
- package/dist/commands/replay.d.ts.map +1 -1
- package/dist/commands/replay.js +26 -5
- package/dist/commands/replay.js.map +1 -1
- package/dist/commands/report.d.ts +1 -0
- package/dist/commands/report.d.ts.map +1 -1
- package/dist/commands/report.js +27 -2
- package/dist/commands/report.js.map +1 -1
- package/dist/commands/resume.d.ts +1 -0
- package/dist/commands/resume.d.ts.map +1 -1
- package/dist/commands/resume.js +26 -8
- package/dist/commands/resume.js.map +1 -1
- package/dist/commands/snapshot.d.ts +13 -0
- package/dist/commands/snapshot.d.ts.map +1 -0
- package/dist/commands/snapshot.js +45 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +58 -14
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/verify.d.ts +13 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +74 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +2 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/fs-safe.d.ts +1 -0
- package/dist/core/fs-safe.d.ts.map +1 -1
- package/dist/core/fs-safe.js +9 -0
- package/dist/core/fs-safe.js.map +1 -1
- package/dist/core/paths.d.ts.map +1 -1
- package/dist/core/paths.js +1 -0
- package/dist/core/paths.js.map +1 -1
- package/dist/core/risk.d.ts.map +1 -1
- package/dist/core/risk.js +3 -0
- package/dist/core/risk.js.map +1 -1
- package/dist/core/session.d.ts +17 -1
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +95 -0
- package/dist/core/session.js.map +1 -1
- package/dist/core/verification.d.ts +29 -0
- package/dist/core/verification.d.ts.map +1 -1
- package/dist/core/verification.js +159 -0
- package/dist/core/verification.js.map +1 -1
- package/dist/renderers/html-replay.d.ts +5 -6
- package/dist/renderers/html-replay.d.ts.map +1 -1
- package/dist/renderers/html-replay.js +57 -5
- package/dist/renderers/html-replay.js.map +1 -1
- package/dist/renderers/markdown-report.d.ts +7 -2
- package/dist/renderers/markdown-report.d.ts.map +1 -1
- package/dist/renderers/markdown-report.js +32 -7
- package/dist/renderers/markdown-report.js.map +1 -1
- package/dist/renderers/resume-prompt.d.ts +2 -0
- package/dist/renderers/resume-prompt.d.ts.map +1 -1
- package/dist/renderers/resume-prompt.js +9 -2
- package/dist/renderers/resume-prompt.js.map +1 -1
- package/dist/types/index.d.ts +22 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/core/session.js
CHANGED
|
@@ -17,6 +17,18 @@ export function buildSessionRecord(options) {
|
|
|
17
17
|
git: options.git,
|
|
18
18
|
packageManager: options.packageManager,
|
|
19
19
|
verificationCommands: options.verificationCommands ?? [],
|
|
20
|
+
verificationRuns: [],
|
|
21
|
+
events: [
|
|
22
|
+
buildSessionEvent({
|
|
23
|
+
type: "session_started",
|
|
24
|
+
timestamp: now,
|
|
25
|
+
title: "Session started",
|
|
26
|
+
metadata: {
|
|
27
|
+
git: options.git,
|
|
28
|
+
packageManager: options.packageManager
|
|
29
|
+
}
|
|
30
|
+
}, 1)
|
|
31
|
+
],
|
|
20
32
|
tools: options.tools ?? {
|
|
21
33
|
projscan: unavailableTool,
|
|
22
34
|
agentloopkit: unavailableTool
|
|
@@ -41,6 +53,82 @@ export async function startSession(options) {
|
|
|
41
53
|
handoffPath: paths.currentHandoff
|
|
42
54
|
};
|
|
43
55
|
}
|
|
56
|
+
export function getVerificationRuns(session) {
|
|
57
|
+
return session.verificationRuns ?? [];
|
|
58
|
+
}
|
|
59
|
+
export function getSessionEvents(session) {
|
|
60
|
+
return session.events ?? [];
|
|
61
|
+
}
|
|
62
|
+
export function getSessionTimelineEvents(session) {
|
|
63
|
+
const events = getSessionEvents(session);
|
|
64
|
+
if (events.length > 0)
|
|
65
|
+
return events;
|
|
66
|
+
const synthesizedEvents = [
|
|
67
|
+
buildSessionEvent({
|
|
68
|
+
type: "session_started",
|
|
69
|
+
timestamp: session.startedAt,
|
|
70
|
+
title: "Session started"
|
|
71
|
+
}, 1)
|
|
72
|
+
];
|
|
73
|
+
for (const run of getVerificationRuns(session)) {
|
|
74
|
+
synthesizedEvents.push(buildSessionEvent({
|
|
75
|
+
type: run.status === "passed" ? "verification_passed" : "verification_failed",
|
|
76
|
+
timestamp: run.finishedAt,
|
|
77
|
+
title: run.status === "passed" ? "Verification passed" : "Verification failed",
|
|
78
|
+
metadata: {
|
|
79
|
+
command: run.command,
|
|
80
|
+
exitCode: run.exitCode,
|
|
81
|
+
stdoutPath: run.stdoutPath,
|
|
82
|
+
stderrPath: run.stderrPath
|
|
83
|
+
}
|
|
84
|
+
}, synthesizedEvents.length + 1));
|
|
85
|
+
}
|
|
86
|
+
return synthesizedEvents;
|
|
87
|
+
}
|
|
88
|
+
export function getLatestSessionEvent(session, type) {
|
|
89
|
+
return (getSessionEvents(session)
|
|
90
|
+
.filter((event) => event.type === type)
|
|
91
|
+
.at(-1) ?? null);
|
|
92
|
+
}
|
|
93
|
+
export function buildSessionEvent(input, ordinal) {
|
|
94
|
+
const timestamp = normalizeEventTimestamp(input.timestamp);
|
|
95
|
+
const event = {
|
|
96
|
+
id: `evt-${formatDateForId(new Date(timestamp))}-${slugify(input.type)}-${String(ordinal).padStart(3, "0")}`,
|
|
97
|
+
type: input.type,
|
|
98
|
+
timestamp,
|
|
99
|
+
title: input.title
|
|
100
|
+
};
|
|
101
|
+
if (input.message !== undefined)
|
|
102
|
+
event.message = input.message;
|
|
103
|
+
if (input.metadata !== undefined)
|
|
104
|
+
event.metadata = input.metadata;
|
|
105
|
+
return event;
|
|
106
|
+
}
|
|
107
|
+
export function addSessionEvent(session, input) {
|
|
108
|
+
const events = getSessionEvents(session);
|
|
109
|
+
return {
|
|
110
|
+
...session,
|
|
111
|
+
events: [...events, buildSessionEvent(input, events.length + 1)]
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
export async function saveSession(repoRoot, session) {
|
|
115
|
+
const paths = resolveAgentFlightPaths(repoRoot);
|
|
116
|
+
await writeJsonFileSafe(`${paths.sessions}/${session.id}.json`, session, { overwrite: true });
|
|
117
|
+
await writeJsonFileSafe(paths.currentSession, session, { overwrite: true });
|
|
118
|
+
}
|
|
119
|
+
export async function appendSessionEvent(repoRoot, session, input) {
|
|
120
|
+
const updatedSession = addSessionEvent(session, input);
|
|
121
|
+
await saveSession(repoRoot, updatedSession);
|
|
122
|
+
return updatedSession;
|
|
123
|
+
}
|
|
124
|
+
export async function appendVerificationRun(repoRoot, session, run) {
|
|
125
|
+
const updatedSession = {
|
|
126
|
+
...session,
|
|
127
|
+
verificationRuns: [...getVerificationRuns(session), run]
|
|
128
|
+
};
|
|
129
|
+
await saveSession(repoRoot, updatedSession);
|
|
130
|
+
return updatedSession;
|
|
131
|
+
}
|
|
44
132
|
export function createSessionId(now, task) {
|
|
45
133
|
return `af-${formatDateForId(now)}-${slugify(task)}`;
|
|
46
134
|
}
|
|
@@ -56,6 +144,13 @@ function formatDateForId(now) {
|
|
|
56
144
|
const iso = now.toISOString();
|
|
57
145
|
return `${iso.slice(0, 10).replaceAll("-", "")}-${iso.slice(11, 19).replaceAll(":", "")}`;
|
|
58
146
|
}
|
|
147
|
+
function normalizeEventTimestamp(timestamp) {
|
|
148
|
+
if (timestamp instanceof Date)
|
|
149
|
+
return timestamp.toISOString();
|
|
150
|
+
if (typeof timestamp === "string")
|
|
151
|
+
return timestamp;
|
|
152
|
+
return new Date().toISOString();
|
|
153
|
+
}
|
|
59
154
|
function renderInitialHandoff(session) {
|
|
60
155
|
const proof = session.verificationCommands.length
|
|
61
156
|
? session.verificationCommands.map((command) => `- ${command}`).join("\n")
|
package/dist/core/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,34 @@
|
|
|
1
|
+
import { type CommandRunner } from "./process.js";
|
|
2
|
+
import type { AgentFlightSession, RiskLevel, VerificationRun } from "../types/index.js";
|
|
1
3
|
export interface PackageJsonLike {
|
|
2
4
|
scripts?: Record<string, string>;
|
|
3
5
|
}
|
|
6
|
+
export interface RunVerificationCommandOptions {
|
|
7
|
+
repoRoot: string;
|
|
8
|
+
session: AgentFlightSession;
|
|
9
|
+
commandArgs: string[];
|
|
10
|
+
now?: (() => Date) | undefined;
|
|
11
|
+
commandRunner?: CommandRunner | undefined;
|
|
12
|
+
}
|
|
13
|
+
export type ReviewReadiness = "Ready for review" | "Not ready for review" | "Blocked" | "Unknown";
|
|
14
|
+
export interface VerificationSummary {
|
|
15
|
+
runs: VerificationRun[];
|
|
16
|
+
passed: number;
|
|
17
|
+
failed: number;
|
|
18
|
+
missingCommands: string[];
|
|
19
|
+
gaps: string[];
|
|
20
|
+
readiness: ReviewReadiness;
|
|
21
|
+
nextAction: string;
|
|
22
|
+
}
|
|
23
|
+
export interface BuildVerificationSummaryOptions {
|
|
24
|
+
changedFilesCount?: number | undefined;
|
|
25
|
+
riskLevel?: RiskLevel | undefined;
|
|
26
|
+
}
|
|
4
27
|
export declare function detectVerificationCommands(packageJson: PackageJsonLike): string[];
|
|
28
|
+
export declare function parseCommandLine(command: string): string[];
|
|
29
|
+
export declare function runVerificationCommand(options: RunVerificationCommandOptions): Promise<VerificationRun>;
|
|
30
|
+
export declare function readVerificationStdout(repoRoot: string, run: VerificationRun): Promise<string>;
|
|
31
|
+
export declare function buildVerificationSummary(session: AgentFlightSession, options?: BuildVerificationSummaryOptions): VerificationSummary;
|
|
32
|
+
export declare function normalizeCommandString(command: string): string;
|
|
33
|
+
export declare function formatCommand(args: string[]): string;
|
|
5
34
|
//# sourceMappingURL=verification.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../src/core/verification.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../src/core/verification.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAG9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAExF,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC/B,aAAa,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,MAAM,eAAe,GAAG,kBAAkB,GAAG,sBAAsB,GAAG,SAAS,GAAG,SAAS,CAAC;AAElG,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,eAAe,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,+BAA+B;IAC9C,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACnC;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM,EAAE,CAUjF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CA+C1D;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,eAAe,CAAC,CAoC1B;AAED,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,GAAE,+BAAoC,GAC5C,mBAAmB,CAyBrB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAEpD"}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { ensureDir, writeTextFileSafe } from "./fs-safe.js";
|
|
4
|
+
import { runCommand } from "./process.js";
|
|
5
|
+
import { resolveAgentFlightPaths } from "./paths.js";
|
|
6
|
+
import { getVerificationRuns } from "./session.js";
|
|
1
7
|
export function detectVerificationCommands(packageJson) {
|
|
2
8
|
const scripts = packageJson.scripts ?? {};
|
|
3
9
|
const commands = [];
|
|
@@ -11,4 +17,157 @@ export function detectVerificationCommands(packageJson) {
|
|
|
11
17
|
commands.push("npm run build");
|
|
12
18
|
return commands;
|
|
13
19
|
}
|
|
20
|
+
export function parseCommandLine(command) {
|
|
21
|
+
const args = [];
|
|
22
|
+
let current = "";
|
|
23
|
+
let quote = null;
|
|
24
|
+
let escaping = false;
|
|
25
|
+
for (const char of command) {
|
|
26
|
+
if (escaping) {
|
|
27
|
+
current += char;
|
|
28
|
+
escaping = false;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (char === "\\") {
|
|
32
|
+
escaping = true;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (quote) {
|
|
36
|
+
if (char === quote) {
|
|
37
|
+
quote = null;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
current += char;
|
|
41
|
+
}
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (char === "'" || char === '"') {
|
|
45
|
+
quote = char;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (/\s/.test(char)) {
|
|
49
|
+
if (current.length > 0) {
|
|
50
|
+
args.push(current);
|
|
51
|
+
current = "";
|
|
52
|
+
}
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
current += char;
|
|
56
|
+
}
|
|
57
|
+
if (escaping)
|
|
58
|
+
current += "\\";
|
|
59
|
+
if (current.length > 0)
|
|
60
|
+
args.push(current);
|
|
61
|
+
return args;
|
|
62
|
+
}
|
|
63
|
+
export async function runVerificationCommand(options) {
|
|
64
|
+
if (options.commandArgs.length === 0) {
|
|
65
|
+
throw new Error("Verification command is empty.");
|
|
66
|
+
}
|
|
67
|
+
const now = options.now ?? (() => new Date());
|
|
68
|
+
const startedAt = now();
|
|
69
|
+
const runNumber = getVerificationRuns(options.session).length + 1;
|
|
70
|
+
const runName = `verification-${runNumber}`;
|
|
71
|
+
const paths = resolveAgentFlightPaths(options.repoRoot);
|
|
72
|
+
const evidenceDir = join(paths.evidence, options.session.id);
|
|
73
|
+
const stdoutPath = `.agentflight/evidence/${options.session.id}/${runName}.stdout.txt`;
|
|
74
|
+
const stderrPath = `.agentflight/evidence/${options.session.id}/${runName}.stderr.txt`;
|
|
75
|
+
const runner = options.commandRunner ?? runCommand;
|
|
76
|
+
await ensureDir(evidenceDir);
|
|
77
|
+
const result = await runner(options.commandArgs[0], options.commandArgs.slice(1), {
|
|
78
|
+
cwd: options.repoRoot,
|
|
79
|
+
timeoutMs: 10 * 60_000
|
|
80
|
+
});
|
|
81
|
+
const finishedAt = now();
|
|
82
|
+
await writeTextFileSafe(join(options.repoRoot, stdoutPath), result.stdout, { overwrite: true });
|
|
83
|
+
await writeTextFileSafe(join(options.repoRoot, stderrPath), result.stderr, { overwrite: true });
|
|
84
|
+
return {
|
|
85
|
+
command: formatCommand(options.commandArgs),
|
|
86
|
+
startedAt: startedAt.toISOString(),
|
|
87
|
+
finishedAt: finishedAt.toISOString(),
|
|
88
|
+
durationMs: Math.max(0, finishedAt.getTime() - startedAt.getTime()),
|
|
89
|
+
exitCode: result.exitCode,
|
|
90
|
+
status: result.exitCode === 0 ? "passed" : "failed",
|
|
91
|
+
stdoutPath,
|
|
92
|
+
stderrPath
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
export async function readVerificationStdout(repoRoot, run) {
|
|
96
|
+
return readFile(join(repoRoot, run.stdoutPath), "utf8");
|
|
97
|
+
}
|
|
98
|
+
export function buildVerificationSummary(session, options = {}) {
|
|
99
|
+
const runs = getVerificationRuns(session);
|
|
100
|
+
const passedRuns = runs.filter((run) => run.status === "passed");
|
|
101
|
+
const failedRuns = runs.filter((run) => run.status === "failed");
|
|
102
|
+
const passedCommands = new Set(passedRuns.map((run) => normalizeCommandString(run.command)));
|
|
103
|
+
const missingCommands = session.verificationCommands.filter((command) => !passedCommands.has(normalizeCommandString(command)));
|
|
104
|
+
const gaps = buildVerificationGaps(runs, missingCommands);
|
|
105
|
+
const readiness = determineReadiness({
|
|
106
|
+
runs,
|
|
107
|
+
failed: failedRuns.length,
|
|
108
|
+
missingCommands,
|
|
109
|
+
changedFilesCount: options.changedFilesCount ?? null
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
runs,
|
|
113
|
+
passed: passedRuns.length,
|
|
114
|
+
failed: failedRuns.length,
|
|
115
|
+
missingCommands,
|
|
116
|
+
gaps,
|
|
117
|
+
readiness,
|
|
118
|
+
nextAction: buildNextAction(readiness, missingCommands, options.riskLevel)
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
export function normalizeCommandString(command) {
|
|
122
|
+
const parsed = parseCommandLine(command);
|
|
123
|
+
return parsed.length > 0 ? formatCommand(parsed) : command.trim();
|
|
124
|
+
}
|
|
125
|
+
export function formatCommand(args) {
|
|
126
|
+
return args.map(formatCommandArg).join(" ");
|
|
127
|
+
}
|
|
128
|
+
function formatCommandArg(arg) {
|
|
129
|
+
if (/^[A-Za-z0-9_./:=@+-]+$/.test(arg))
|
|
130
|
+
return arg;
|
|
131
|
+
return JSON.stringify(arg);
|
|
132
|
+
}
|
|
133
|
+
function buildVerificationGaps(runs, missingCommands) {
|
|
134
|
+
const gaps = [];
|
|
135
|
+
if (runs.some((run) => run.status === "failed")) {
|
|
136
|
+
gaps.push("A verification command failed and must be fixed or rerun successfully.");
|
|
137
|
+
}
|
|
138
|
+
if (missingCommands.length > 0) {
|
|
139
|
+
gaps.push(...missingCommands.map((command) => `Missing passing verification evidence for: ${command}`));
|
|
140
|
+
}
|
|
141
|
+
if (gaps.length > 0)
|
|
142
|
+
return gaps;
|
|
143
|
+
if (runs.length === 0) {
|
|
144
|
+
return ["No verification evidence recorded."];
|
|
145
|
+
}
|
|
146
|
+
return ["No configured verification gaps."];
|
|
147
|
+
}
|
|
148
|
+
function determineReadiness(input) {
|
|
149
|
+
if (input.failed > 0)
|
|
150
|
+
return "Blocked";
|
|
151
|
+
if (input.changedFilesCount === 0 && input.runs.length === 0)
|
|
152
|
+
return "Unknown";
|
|
153
|
+
if (input.runs.length === 0 || input.missingCommands.length > 0)
|
|
154
|
+
return "Not ready for review";
|
|
155
|
+
return "Ready for review";
|
|
156
|
+
}
|
|
157
|
+
function buildNextAction(readiness, missingCommands, riskLevel) {
|
|
158
|
+
if (readiness === "Blocked") {
|
|
159
|
+
return missingCommands.length > 0
|
|
160
|
+
? `Fix the failed command, then rerun agentflight verify -- ${missingCommands[0]}`
|
|
161
|
+
: "Fix the failed verification command, then rerun agentflight verify.";
|
|
162
|
+
}
|
|
163
|
+
if (missingCommands.length > 0) {
|
|
164
|
+
return `Run agentflight verify -- ${missingCommands[0]}`;
|
|
165
|
+
}
|
|
166
|
+
if (readiness === "Ready for review") {
|
|
167
|
+
return riskLevel === "high"
|
|
168
|
+
? "Generate a report and request focused review for the high-risk areas."
|
|
169
|
+
: "Generate a report and hand off for review.";
|
|
170
|
+
}
|
|
171
|
+
return "Run agentflight verify -- <command> to capture proof before claiming completion.";
|
|
172
|
+
}
|
|
14
173
|
//# sourceMappingURL=verification.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification.js","sourceRoot":"","sources":["../../src/core/verification.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verification.js","sourceRoot":"","sources":["../../src/core/verification.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export
|
|
3
|
-
label: string;
|
|
4
|
-
timestamp: string;
|
|
5
|
-
}
|
|
1
|
+
import type { RiskCategorySummary, SessionEvent, VerificationRun } from "../types/index.js";
|
|
2
|
+
export type ReplayTimelineItem = Pick<SessionEvent, "type" | "timestamp" | "title" | "message" | "metadata">;
|
|
6
3
|
export interface HtmlReplayInput {
|
|
7
4
|
task: string;
|
|
8
5
|
sessionId: string;
|
|
9
6
|
startedAt: string;
|
|
10
7
|
timeline: ReplayTimelineItem[];
|
|
11
8
|
changedFiles: string[];
|
|
9
|
+
changedFileGroups?: RiskCategorySummary[] | undefined;
|
|
12
10
|
riskBadges: string[];
|
|
13
|
-
verificationEvidence:
|
|
11
|
+
verificationEvidence: VerificationRun[];
|
|
12
|
+
reviewReadiness?: string | undefined;
|
|
14
13
|
recommendation: string;
|
|
15
14
|
}
|
|
16
15
|
export declare function renderHtmlReplay(input: HtmlReplayInput): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-replay.d.ts","sourceRoot":"","sources":["../../src/renderers/html-replay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"html-replay.d.ts","sourceRoot":"","sources":["../../src/renderers/html-replay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE5F,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,YAAY,EACZ,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CACxD,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,CAAC,EAAE,mBAAmB,EAAE,GAAG,SAAS,CAAC;IACtD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,oBAAoB,EAAE,eAAe,EAAE,CAAC;IACxC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CA2E/D"}
|
|
@@ -15,10 +15,24 @@ export function renderHtmlReplay(input) {
|
|
|
15
15
|
.meta { color: #57606a; font-size: 14px; }
|
|
16
16
|
.badges { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }
|
|
17
17
|
.badge { border: 1px solid #d0d7de; border-radius: 999px; padding: 4px 10px; background: #ffffff; font-size: 13px; }
|
|
18
|
+
.summary-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; margin: 0 0 28px; }
|
|
19
|
+
.summary-card { background: #ffffff; border: 1px solid #d0d7de; border-radius: 8px; padding: 14px; min-width: 0; }
|
|
20
|
+
.summary-card span { color: #57606a; display: block; font-size: 12px; font-weight: 600; text-transform: uppercase; }
|
|
21
|
+
.summary-card strong { display: block; font-size: 18px; margin-top: 4px; overflow-wrap: anywhere; }
|
|
18
22
|
.panel { background: #ffffff; border: 1px solid #d0d7de; border-radius: 8px; padding: 18px; margin: 16px 0; }
|
|
23
|
+
.timeline { border-left: 3px solid #d0d7de; padding-left: 16px; }
|
|
24
|
+
.timeline-item { margin: 0 0 14px; }
|
|
25
|
+
.timeline-item strong { display: block; }
|
|
26
|
+
.verification-grid { display: grid; gap: 12px; }
|
|
27
|
+
.verification-card { border: 1px solid #d0d7de; border-radius: 8px; padding: 14px; background: #fbfcfe; }
|
|
28
|
+
.verification-card.passed { border-color: #2da44e; }
|
|
29
|
+
.verification-card.failed { border-color: #cf222e; }
|
|
30
|
+
.verification-card strong { display: inline-block; margin-bottom: 6px; }
|
|
31
|
+
footer { color: #57606a; font-size: 13px; margin-top: 28px; }
|
|
19
32
|
ul { margin: 0; padding-left: 22px; }
|
|
20
33
|
li { margin: 6px 0; }
|
|
21
34
|
code { background: #f0f3f6; border-radius: 4px; padding: 2px 5px; }
|
|
35
|
+
@media (max-width: 760px) { .summary-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
|
|
22
36
|
</style>
|
|
23
37
|
</head>
|
|
24
38
|
<body>
|
|
@@ -30,12 +44,16 @@ export function renderHtmlReplay(input) {
|
|
|
30
44
|
<div class="badges">${input.riskBadges.map((badge) => `<span class="badge">${escapeHtml(badge)}</span>`).join("")}</div>
|
|
31
45
|
</header>
|
|
32
46
|
|
|
47
|
+
${renderSummary(input)}
|
|
48
|
+
|
|
33
49
|
<section class="panel">
|
|
34
50
|
<h2>Timeline</h2>
|
|
35
51
|
${renderTimeline(input.timeline)}
|
|
36
52
|
</section>
|
|
37
53
|
|
|
38
54
|
<section class="panel">
|
|
55
|
+
<h2>Changed File Groups</h2>
|
|
56
|
+
${renderFileGroups(input.changedFileGroups ?? [])}
|
|
39
57
|
<h2>Changed Files</h2>
|
|
40
58
|
${renderFileList(input.changedFiles)}
|
|
41
59
|
</section>
|
|
@@ -49,16 +67,44 @@ export function renderHtmlReplay(input) {
|
|
|
49
67
|
<h2>Recommendation</h2>
|
|
50
68
|
<p>${escapeHtml(input.recommendation)}</p>
|
|
51
69
|
</section>
|
|
70
|
+
|
|
71
|
+
<footer>Generated by AgentFlight</footer>
|
|
52
72
|
</main>
|
|
53
73
|
</body>
|
|
54
74
|
</html>
|
|
55
75
|
`;
|
|
56
76
|
}
|
|
77
|
+
function renderSummary(input) {
|
|
78
|
+
const passed = input.verificationEvidence.filter((item) => item.status === "passed").length;
|
|
79
|
+
const failed = input.verificationEvidence.filter((item) => item.status === "failed").length;
|
|
80
|
+
const risk = input.riskBadges[0] ?? "unknown";
|
|
81
|
+
const readiness = input.reviewReadiness ?? "Unknown";
|
|
82
|
+
return `<section class="summary-grid" aria-label="Session summary">
|
|
83
|
+
${renderSummaryCard("Risk", risk)}
|
|
84
|
+
${renderSummaryCard("Changed Files", String(input.changedFiles.length))}
|
|
85
|
+
${renderSummaryCard("Proof", `${passed} passed / ${failed} failed`)}
|
|
86
|
+
${renderSummaryCard("Readiness", readiness)}
|
|
87
|
+
</section>`;
|
|
88
|
+
}
|
|
89
|
+
function renderSummaryCard(label, value) {
|
|
90
|
+
return `<div class="summary-card"><span>${escapeHtml(label)}</span><strong>${escapeHtml(value)}</strong></div>`;
|
|
91
|
+
}
|
|
57
92
|
function renderTimeline(items) {
|
|
58
93
|
if (items.length === 0)
|
|
59
94
|
return "<p>No timeline events recorded.</p>";
|
|
60
|
-
return `<
|
|
61
|
-
.map((item) => `<
|
|
95
|
+
return `<div class="timeline">${items
|
|
96
|
+
.map((item) => `<div class="timeline-item">
|
|
97
|
+
<strong>${escapeHtml(item.title)}</strong>
|
|
98
|
+
<div class="meta">${escapeHtml(item.timestamp)} · ${escapeHtml(item.type)}</div>
|
|
99
|
+
${item.message ? `<div>${escapeHtml(item.message)}</div>` : ""}
|
|
100
|
+
</div>`)
|
|
101
|
+
.join("")}</div>`;
|
|
102
|
+
}
|
|
103
|
+
function renderFileGroups(groups) {
|
|
104
|
+
if (groups.length === 0)
|
|
105
|
+
return "<p>No changed file groups detected.</p>";
|
|
106
|
+
return `<ul>${groups
|
|
107
|
+
.map((group) => `<li><strong>${escapeHtml(group.category)}</strong>: ${group.files.map((file) => `<code>${escapeHtml(file)}</code>`).join(", ")}</li>`)
|
|
62
108
|
.join("")}</ul>`;
|
|
63
109
|
}
|
|
64
110
|
function renderFileList(files) {
|
|
@@ -69,9 +115,15 @@ function renderFileList(files) {
|
|
|
69
115
|
function renderVerification(evidence) {
|
|
70
116
|
if (evidence.length === 0)
|
|
71
117
|
return "<p>No verification evidence recorded.</p>";
|
|
72
|
-
return `<
|
|
73
|
-
.map((item) => `<
|
|
74
|
-
.
|
|
118
|
+
return `<div class="verification-grid">${evidence
|
|
119
|
+
.map((item) => `<div class="verification-card ${escapeHtml(item.status)}">
|
|
120
|
+
<strong>${escapeHtml(item.status)}</strong>
|
|
121
|
+
<div><code>${escapeHtml(item.command)}</code></div>
|
|
122
|
+
<div class="meta">Exit ${escapeHtml(String(item.exitCode ?? "unknown"))} · ${escapeHtml(String(item.durationMs))}ms</div>
|
|
123
|
+
<div class="meta">stdout: ${escapeHtml(item.stdoutPath)}</div>
|
|
124
|
+
<div class="meta">stderr: ${escapeHtml(item.stderrPath)}</div>
|
|
125
|
+
</div>`)
|
|
126
|
+
.join("")}</div>`;
|
|
75
127
|
}
|
|
76
128
|
function escapeHtml(value) {
|
|
77
129
|
return value
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-replay.js","sourceRoot":"","sources":["../../src/renderers/html-replay.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"html-replay.js","sourceRoot":"","sources":["../../src/renderers/html-replay.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
import type { RiskAnalysis, ToolAdapterResult,
|
|
1
|
+
import type { RiskAnalysis, SessionEvent, ToolAdapterResult, VerificationRun } from "../types/index.js";
|
|
2
|
+
import type { ReviewReadiness } from "../core/verification.js";
|
|
2
3
|
export interface MarkdownReportInput {
|
|
3
4
|
task: string;
|
|
4
5
|
sessionId: string;
|
|
5
6
|
startedAt: string;
|
|
6
7
|
changedFiles: string[];
|
|
8
|
+
timelineEvents?: SessionEvent[] | undefined;
|
|
7
9
|
risk: RiskAnalysis;
|
|
8
10
|
verificationCommands: string[];
|
|
9
|
-
verificationEvidence:
|
|
11
|
+
verificationEvidence: VerificationRun[];
|
|
12
|
+
verificationGaps?: string[] | undefined;
|
|
13
|
+
recommendation?: ReviewReadiness | undefined;
|
|
14
|
+
nextAction?: string | undefined;
|
|
10
15
|
tooling: {
|
|
11
16
|
projscan: ToolAdapterResult;
|
|
12
17
|
agentloopkit: ToolAdapterResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-report.d.ts","sourceRoot":"","sources":["../../src/renderers/markdown-report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"markdown-report.d.ts","sourceRoot":"","sources":["../../src/renderers/markdown-report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC;IAC5C,IAAI,EAAE,YAAY,CAAC;IACnB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,oBAAoB,EAAE,eAAe,EAAE,CAAC;IACxC,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,cAAc,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,OAAO,EAAE;QACP,QAAQ,EAAE,iBAAiB,CAAC;QAC5B,YAAY,EAAE,iBAAiB,CAAC;KACjC,CAAC;CACH;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAuCvE"}
|
|
@@ -8,6 +8,9 @@ ${input.task}
|
|
|
8
8
|
- Session ID: ${input.sessionId}
|
|
9
9
|
- Started: ${input.startedAt}
|
|
10
10
|
|
|
11
|
+
## Timeline
|
|
12
|
+
${renderTimeline(input.timelineEvents ?? [])}
|
|
13
|
+
|
|
11
14
|
## Changed Files
|
|
12
15
|
${renderList(input.changedFiles, "No changed files detected.")}
|
|
13
16
|
|
|
@@ -23,7 +26,7 @@ ${renderVerification(input)}
|
|
|
23
26
|
${renderReviewFocus(input.risk)}
|
|
24
27
|
|
|
25
28
|
## Recommendation
|
|
26
|
-
${renderRecommendation(input
|
|
29
|
+
${renderRecommendation(input)}
|
|
27
30
|
|
|
28
31
|
## Next Action
|
|
29
32
|
${renderNextAction(input)}
|
|
@@ -43,10 +46,27 @@ function renderVerification(input) {
|
|
|
43
46
|
const commands = input.verificationCommands.length
|
|
44
47
|
? `\n\nSuggested commands:\n${renderList(input.verificationCommands)}`
|
|
45
48
|
: "";
|
|
46
|
-
|
|
49
|
+
const gaps = input.verificationGaps?.length
|
|
50
|
+
? `\n\nGaps:\n${renderList(input.verificationGaps)}`
|
|
51
|
+
: "";
|
|
52
|
+
return `No verification evidence recorded.${gaps}${commands}`;
|
|
47
53
|
}
|
|
48
|
-
|
|
49
|
-
.map((
|
|
54
|
+
const evidence = input.verificationEvidence
|
|
55
|
+
.map((run) => `- ${run.command}: ${run.status} (exit ${run.exitCode ?? "unknown"}, ${run.durationMs}ms)\n - stdout: ${run.stdoutPath}\n - stderr: ${run.stderrPath}`)
|
|
56
|
+
.join("\n");
|
|
57
|
+
const gaps = input.verificationGaps?.length
|
|
58
|
+
? `\n\nGaps:\n${renderList(input.verificationGaps)}`
|
|
59
|
+
: "";
|
|
60
|
+
return `${evidence}${gaps}`;
|
|
61
|
+
}
|
|
62
|
+
function renderTimeline(events) {
|
|
63
|
+
if (events.length === 0)
|
|
64
|
+
return "No timeline events recorded.";
|
|
65
|
+
return events
|
|
66
|
+
.map((event) => {
|
|
67
|
+
const message = event.message ? ` - ${event.message}` : "";
|
|
68
|
+
return `- ${event.timestamp}: ${event.title}${message}`;
|
|
69
|
+
})
|
|
50
70
|
.join("\n");
|
|
51
71
|
}
|
|
52
72
|
function renderReviewFocus(risk) {
|
|
@@ -56,16 +76,21 @@ function renderReviewFocus(risk) {
|
|
|
56
76
|
.join("\n")
|
|
57
77
|
: "- Confirm the session has meaningful changes before review.";
|
|
58
78
|
}
|
|
59
|
-
function renderRecommendation(
|
|
60
|
-
if (
|
|
79
|
+
function renderRecommendation(input) {
|
|
80
|
+
if (input.recommendation) {
|
|
81
|
+
return `${input.recommendation}.`;
|
|
82
|
+
}
|
|
83
|
+
if (input.verificationEvidence.length === 0) {
|
|
61
84
|
return "Do not claim completion yet. Run the suggested verification commands and regenerate the report.";
|
|
62
85
|
}
|
|
63
|
-
if (risk.level === "high") {
|
|
86
|
+
if (input.risk.level === "high") {
|
|
64
87
|
return "Request careful human review focused on the high-risk file categories before merging.";
|
|
65
88
|
}
|
|
66
89
|
return "Review the changed files and verification evidence before handoff.";
|
|
67
90
|
}
|
|
68
91
|
function renderNextAction(input) {
|
|
92
|
+
if (input.nextAction)
|
|
93
|
+
return input.nextAction;
|
|
69
94
|
if (input.verificationEvidence.length === 0 && input.verificationCommands.length > 0) {
|
|
70
95
|
return `Run ${input.verificationCommands[0]} and capture the result.`;
|
|
71
96
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-report.js","sourceRoot":"","sources":["../../src/renderers/markdown-report.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"markdown-report.js","sourceRoot":"","sources":["../../src/renderers/markdown-report.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,oBAAoB,CAAC,KAA0B;IAC7D,OAAO;;;EAGP,KAAK,CAAC,IAAI;;;gBAGI,KAAK,CAAC,SAAS;aAClB,KAAK,CAAC,SAAS;;;EAG1B,cAAc,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC;;;EAG1C,UAAU,CAAC,KAAK,CAAC,YAAY,EAAE,4BAA4B,CAAC;;;WAGnD,KAAK,CAAC,IAAI,CAAC,KAAK;mBACR,KAAK,CAAC,IAAI,CAAC,YAAY;EACxC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;;;EAG9B,kBAAkB,CAAC,KAAK,CAAC;;;EAGzB,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC;;;EAG7B,oBAAoB,CAAC,KAAK,CAAC;;;EAG3B,gBAAgB,CAAC,KAAK,CAAC;;;cAGX,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;kBAC9B,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;;;CAGvD,CAAC;AACF,CAAC;AAED,SAAS,UAAU,CAAC,KAAe,EAAE,KAAK,GAAG,OAAO;IAClD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5E,CAAC;AAED,SAAS,kBAAkB,CAAC,KAA0B;IACpD,IAAI,KAAK,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,oBAAoB,CAAC,MAAM;YAChD,CAAC,CAAC,4BAA4B,UAAU,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE;YACtE,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,GAAG,KAAK,CAAC,gBAAgB,EAAE,MAAM;YACzC,CAAC,CAAC,cAAc,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE;YACpD,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,qCAAqC,IAAI,GAAG,QAAQ,EAAE,CAAC;IAChE,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,oBAAoB;SACxC,GAAG,CACF,CAAC,GAAG,EAAE,EAAE,CACN,KAAK,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,MAAM,UAAU,GAAG,CAAC,QAAQ,IAAI,SAAS,KAAK,GAAG,CAAC,UAAU,oBAAoB,GAAG,CAAC,UAAU,iBAAiB,GAAG,CAAC,UAAU,EAAE,CAC3J;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,IAAI,GAAG,KAAK,CAAC,gBAAgB,EAAE,MAAM;QACzC,CAAC,CAAC,cAAc,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE;QACpD,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,GAAG,QAAQ,GAAG,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,cAAc,CAAC,MAAsB;IAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,8BAA8B,CAAC;IAC/D,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,OAAO,KAAK,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,CAAC;IAC1D,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAkB;IAC3C,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM;QAC3B,CAAC,CAAC,IAAI,CAAC,UAAU;aACZ,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;aACtE,IAAI,CAAC,IAAI,CAAC;QACf,CAAC,CAAC,6DAA6D,CAAC;AACpE,CAAC;AAED,SAAS,oBAAoB,CAAC,KAA0B;IACtD,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,OAAO,GAAG,KAAK,CAAC,cAAc,GAAG,CAAC;IACpC,CAAC;IACD,IAAI,KAAK,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,OAAO,iGAAiG,CAAC;IAC3G,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QAChC,OAAO,uFAAuF,CAAC;IACjG,CAAC;IACD,OAAO,oEAAoE,CAAC;AAC9E,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA0B;IAClD,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC,UAAU,CAAC;IAC9C,IAAI,KAAK,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrF,OAAO,OAAO,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,0BAA0B,CAAC;IACxE,CAAC;IACD,OAAO,0DAA0D,CAAC;AACpE,CAAC;AAED,SAAS,UAAU,CAAC,MAAyB;IAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC;IAC9D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAClF,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,EAAE,CAAC;AAC1C,CAAC"}
|
|
@@ -7,6 +7,8 @@ export interface ResumePromptInput {
|
|
|
7
7
|
riskLevel: RiskLevel;
|
|
8
8
|
riskReasons: string[];
|
|
9
9
|
verificationGaps: string[];
|
|
10
|
+
latestSnapshotNote?: string | undefined;
|
|
11
|
+
verificationState?: string | undefined;
|
|
10
12
|
nextAction: string;
|
|
11
13
|
}
|
|
12
14
|
export declare function renderResumePrompt(input: ResumePromptInput): string;
|