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.
Files changed (73) hide show
  1. package/README.md +15 -5
  2. package/dist/adapters/agentloopkit.d.ts.map +1 -1
  3. package/dist/adapters/agentloopkit.js +26 -7
  4. package/dist/adapters/agentloopkit.js.map +1 -1
  5. package/dist/adapters/projscan.d.ts.map +1 -1
  6. package/dist/adapters/projscan.js +26 -7
  7. package/dist/adapters/projscan.js.map +1 -1
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +40 -3
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/doctor.d.ts +1 -0
  12. package/dist/commands/doctor.d.ts.map +1 -1
  13. package/dist/commands/doctor.js +20 -12
  14. package/dist/commands/doctor.js.map +1 -1
  15. package/dist/commands/replay.d.ts +1 -0
  16. package/dist/commands/replay.d.ts.map +1 -1
  17. package/dist/commands/replay.js +26 -5
  18. package/dist/commands/replay.js.map +1 -1
  19. package/dist/commands/report.d.ts +1 -0
  20. package/dist/commands/report.d.ts.map +1 -1
  21. package/dist/commands/report.js +27 -2
  22. package/dist/commands/report.js.map +1 -1
  23. package/dist/commands/resume.d.ts +1 -0
  24. package/dist/commands/resume.d.ts.map +1 -1
  25. package/dist/commands/resume.js +26 -8
  26. package/dist/commands/resume.js.map +1 -1
  27. package/dist/commands/snapshot.d.ts +13 -0
  28. package/dist/commands/snapshot.d.ts.map +1 -0
  29. package/dist/commands/snapshot.js +45 -0
  30. package/dist/commands/snapshot.js.map +1 -0
  31. package/dist/commands/status.d.ts.map +1 -1
  32. package/dist/commands/status.js +58 -14
  33. package/dist/commands/status.js.map +1 -1
  34. package/dist/commands/verify.d.ts +13 -0
  35. package/dist/commands/verify.d.ts.map +1 -0
  36. package/dist/commands/verify.js +74 -0
  37. package/dist/commands/verify.js.map +1 -0
  38. package/dist/core/config.d.ts.map +1 -1
  39. package/dist/core/config.js +2 -0
  40. package/dist/core/config.js.map +1 -1
  41. package/dist/core/fs-safe.d.ts +1 -0
  42. package/dist/core/fs-safe.d.ts.map +1 -1
  43. package/dist/core/fs-safe.js +9 -0
  44. package/dist/core/fs-safe.js.map +1 -1
  45. package/dist/core/paths.d.ts.map +1 -1
  46. package/dist/core/paths.js +1 -0
  47. package/dist/core/paths.js.map +1 -1
  48. package/dist/core/risk.d.ts.map +1 -1
  49. package/dist/core/risk.js +3 -0
  50. package/dist/core/risk.js.map +1 -1
  51. package/dist/core/session.d.ts +17 -1
  52. package/dist/core/session.d.ts.map +1 -1
  53. package/dist/core/session.js +95 -0
  54. package/dist/core/session.js.map +1 -1
  55. package/dist/core/verification.d.ts +29 -0
  56. package/dist/core/verification.d.ts.map +1 -1
  57. package/dist/core/verification.js +159 -0
  58. package/dist/core/verification.js.map +1 -1
  59. package/dist/renderers/html-replay.d.ts +5 -6
  60. package/dist/renderers/html-replay.d.ts.map +1 -1
  61. package/dist/renderers/html-replay.js +57 -5
  62. package/dist/renderers/html-replay.js.map +1 -1
  63. package/dist/renderers/markdown-report.d.ts +7 -2
  64. package/dist/renderers/markdown-report.d.ts.map +1 -1
  65. package/dist/renderers/markdown-report.js +32 -7
  66. package/dist/renderers/markdown-report.js.map +1 -1
  67. package/dist/renderers/resume-prompt.d.ts +2 -0
  68. package/dist/renderers/resume-prompt.d.ts.map +1 -1
  69. package/dist/renderers/resume-prompt.js +9 -2
  70. package/dist/renderers/resume-prompt.js.map +1 -1
  71. package/dist/types/index.d.ts +22 -0
  72. package/dist/types/index.d.ts.map +1 -1
  73. package/package.json +1 -1
@@ -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")
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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"}
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":"AAAA,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM,EAAE,CAUjF"}
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":"AAIA,MAAM,UAAU,0BAA0B,CAAC,WAA4B;IACrE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,IAAI,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,OAAO,CAAC,SAAS;QAAE,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,IAAI;QAAE,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAChD,IAAI,OAAO,CAAC,IAAI;QAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,OAAO,CAAC,KAAK;QAAE,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAElD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
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 { VerificationEvidence } from "../types/index.js";
2
- export interface ReplayTimelineItem {
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: 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,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,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,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,oBAAoB,EAAE,oBAAoB,EAAE,CAAC;IAC7C,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAuD/D"}
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 `<ul>${items
61
- .map((item) => `<li><strong>${escapeHtml(item.timestamp)}</strong> ${escapeHtml(item.label)}</li>`)
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 `<ul>${evidence
73
- .map((item) => `<li><code>${escapeHtml(item.command)}</code>: ${escapeHtml(item.status)}</li>`)
74
- .join("")}</ul>`;
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":"AAkBA,MAAM,UAAU,gBAAgB,CAAC,KAAsB;IACrD,OAAO;;;;;8BAKqB,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;;;;;;;;;;;;;;;;;;;;+CAoBV,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;YAC9D,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;kCACA,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;4BACjC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,uBAAuB,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;;;;QAK/G,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC;;;;;QAK9B,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC;;;;;QAKlC,kBAAkB,CAAC,KAAK,CAAC,oBAAoB,CAAC;;;;;WAK3C,UAAU,CAAC,KAAK,CAAC,cAAc,CAAC;;;;;CAK1C,CAAC;AACF,CAAC;AAED,SAAS,cAAc,CAAC,KAA2B;IACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,qCAAqC,CAAC;IACrE,OAAO,OAAO,KAAK;SAChB,GAAG,CACF,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAC9F;SACA,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;AACrB,CAAC;AAED,SAAS,cAAc,CAAC,KAAe;IACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,mCAAmC,CAAC;IACnE,OAAO,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;AACjG,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgC;IAC1D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,2CAA2C,CAAC;IAC9E,OAAO,OAAO,QAAQ;SACnB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;SAC9F,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;AACrB,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;SACzB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC9B,CAAC"}
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, VerificationEvidence } from "../types/index.js";
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: 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,EAAE,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE/F,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,IAAI,EAAE,YAAY,CAAC;IACnB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,oBAAoB,EAAE,oBAAoB,EAAE,CAAC;IAC7C,OAAO,EAAE;QACP,QAAQ,EAAE,iBAAiB,CAAC;QAC5B,YAAY,EAAE,iBAAiB,CAAC;KACjC,CAAC;CACH;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAoCvE"}
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.risk, input.verificationEvidence)}
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
- return `No verification evidence recorded.${commands}`;
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
- return input.verificationEvidence
49
- .map((evidence) => `- ${evidence.command}: ${evidence.status}`)
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(risk, evidence) {
60
- if (evidence.length === 0) {
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":"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"}
1
+ {"version":3,"file":"markdown-report.js","sourceRoot":"","sources":["../../src/renderers/markdown-report.ts"],"names":[],"mappings":"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"}
@@ -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;