@xenos1996/usa 2.5.0 → 2.7.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC9F,OAAO,EACL,aAAa,EACb,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,GAIb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,aAAa,GAGd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EACd,WAAW,EACX,iBAAiB,GAGlB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,cAAc,EACd,gBAAgB,GAIjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAUlG,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EACL,UAAU,EACV,YAAY,EACZ,WAAW,GAGZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAiB,MAAM,mBAAmB,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEtE,2EAA2E;AAC3E,2BAA2B;AAC3B,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACpG,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Live session runner — drives the deterministic phases with optional LLM
3
+ * turns behind an injectable `ChatFn`.
4
+ *
5
+ * Doctrine: the engine verifies, the model only proposes. Without a
6
+ * configured provider (`chat` undefined) every model turn prints a loud skip
7
+ * line and the session continues deterministically — conversation is lost,
8
+ * correctness never is. A throwing `chat` degrades the same way (loud line,
9
+ * deterministic continuation), never a crash.
10
+ *
11
+ * Read-only seam: foundation builders and `runAudit` are imported, never
12
+ * modified. Types for the LLM call come from `src/agent` only.
13
+ */
14
+ import type { ChatRequest } from '../agent/types.js';
15
+ import type { AskFn, ChatFn, PrintFn } from './types.js';
16
+ export type { AskFn, ChatFn, PrintFn } from './types.js';
17
+ export type { ChatRequest };
18
+ /** Loud marker printed whenever a model turn is skipped (deterministic-only). */
19
+ export declare const DETERMINISTIC_SKIP_PREFIX = "LLM skipped (deterministic-only mode)";
20
+ export interface LiveSessionOptions {
21
+ dir: string;
22
+ ask: AskFn;
23
+ print: PrintFn;
24
+ chat?: ChatFn;
25
+ transcriptPath?: string;
26
+ provider?: string;
27
+ model?: string;
28
+ }
29
+ /**
30
+ * Runs foundation → audit → triage → report → done.
31
+ * Exit codes mirror the CLI gate convention: 0 done, 2 broken input.
32
+ */
33
+ export declare function runLiveSession(opts: LiveSessionOptions): Promise<number>;
34
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/live/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAYrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAiC,MAAM,YAAY,CAAC;AAExF,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACzD,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B,iFAAiF;AACjF,eAAO,MAAM,yBAAyB,0CAA0C,CAAC;AAEjF,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,KAAK,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAaD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqB9E"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Live session runner — drives the deterministic phases with optional LLM
3
+ * turns behind an injectable `ChatFn`.
4
+ *
5
+ * Doctrine: the engine verifies, the model only proposes. Without a
6
+ * configured provider (`chat` undefined) every model turn prints a loud skip
7
+ * line and the session continues deterministically — conversation is lost,
8
+ * correctness never is. A throwing `chat` degrades the same way (loud line,
9
+ * deterministic continuation), never a crash.
10
+ *
11
+ * Read-only seam: foundation builders and `runAudit` are imported, never
12
+ * modified. Types for the LLM call come from `src/agent` only.
13
+ */
14
+ import fs from 'node:fs';
15
+ import path from 'node:path';
16
+ import { runAudit } from '../engine/audit.js';
17
+ import { renderMarkdown } from '../report/markdown.js';
18
+ import { INTERVIEW_QUESTIONS, applyInterviewAnswer, formatQuestionPrompt, } from '../foundation/interview.js';
19
+ import { defaultFoundation } from '../foundation/types.js';
20
+ import { sanitizeIntent } from '../foundation/loader.js';
21
+ import { advance, initialSession, renderTranscript } from './session.js';
22
+ /** Loud marker printed whenever a model turn is skipped (deterministic-only). */
23
+ export const DETERMINISTIC_SKIP_PREFIX = 'LLM skipped (deterministic-only mode)';
24
+ const SYSTEM_PROMPT = 'You are the USA live audit assistant. Propose, never decide.';
25
+ /** Triage walks at most this many UNKNOWN findings; the rest stay queued. */
26
+ const TRIAGE_CAP = 50;
27
+ /**
28
+ * Runs foundation → audit → triage → report → done.
29
+ * Exit codes mirror the CLI gate convention: 0 done, 2 broken input.
30
+ */
31
+ export async function runLiveSession(opts) {
32
+ const dir = path.resolve(opts.dir);
33
+ if (!isUsableDir(dir)) {
34
+ opts.print(`live: target not found or not a directory: ${opts.dir}`);
35
+ return 2;
36
+ }
37
+ const ctx = { state: initialSession() };
38
+ let code = 0;
39
+ try {
40
+ await runFoundationStep(opts, ctx);
41
+ await runAuditStep(opts, ctx);
42
+ await runTriageStep(opts, ctx);
43
+ await runReportStep(opts, ctx);
44
+ ctx.state = advance(ctx.state, 'done');
45
+ opts.print('Live session complete.');
46
+ }
47
+ catch (err) {
48
+ opts.print(`live: ${err.message}`);
49
+ code = 2;
50
+ }
51
+ if (opts.transcriptPath)
52
+ code = writeTranscript(opts, ctx, code);
53
+ return code;
54
+ }
55
+ function isUsableDir(dir) {
56
+ try {
57
+ return fs.statSync(dir).isDirectory();
58
+ }
59
+ catch {
60
+ return false;
61
+ }
62
+ }
63
+ /** Transcript is the artifact: always written at the end when requested. */
64
+ function writeTranscript(opts, ctx, code) {
65
+ try {
66
+ const file = path.resolve(opts.transcriptPath);
67
+ fs.mkdirSync(path.dirname(file), { recursive: true });
68
+ fs.writeFileSync(file, renderTranscript(ctx.state), 'utf8');
69
+ opts.print(`Transcript written to ${opts.transcriptPath}.`);
70
+ return code;
71
+ }
72
+ catch (err) {
73
+ opts.print(`live: cannot write transcript: ${err.message}`);
74
+ return 2;
75
+ }
76
+ }
77
+ function appendTool(ctx, text) {
78
+ const entry = { phase: ctx.state.phase, kind: 'tool', text };
79
+ ctx.state = { ...ctx.state, transcript: [...ctx.state.transcript, entry] };
80
+ }
81
+ /* --------------------------------------------------------------- model -- */
82
+ async function modelTurn(opts, ctx, tag, user) {
83
+ if (!opts.chat) {
84
+ const line = `${DETERMINISTIC_SKIP_PREFIX}: no provider configured — ` +
85
+ `continuing without model input (${tag}).`;
86
+ opts.print(line);
87
+ appendTool(ctx, line);
88
+ return;
89
+ }
90
+ const req = {
91
+ provider: opts.provider ?? 'usa-live',
92
+ model: opts.model ?? 'usa-live',
93
+ messages: [
94
+ { role: 'system', content: SYSTEM_PROMPT },
95
+ { role: 'user', content: user },
96
+ ],
97
+ };
98
+ try {
99
+ const res = await opts.chat(req);
100
+ opts.print(res.text);
101
+ const entry = { phase: ctx.state.phase, kind: 'model', text: res.text };
102
+ ctx.state = { ...ctx.state, transcript: [...ctx.state.transcript, entry] };
103
+ }
104
+ catch (err) {
105
+ const line = `LLM unavailable (${err.message}) — continuing deterministically (${tag}).`;
106
+ opts.print(line);
107
+ appendTool(ctx, line);
108
+ }
109
+ }
110
+ /* ---------------------------------------------------------- foundation -- */
111
+ async function runFoundationStep(opts, ctx) {
112
+ ctx.state = advance(ctx.state, 'foundation');
113
+ opts.print('Foundation: capturing project intent (empty answers keep defaults).');
114
+ let config = defaultFoundation(path.basename(path.resolve(opts.dir)) || 'project');
115
+ for (const question of INTERVIEW_QUESTIONS) {
116
+ const raw = await opts.ask(formatQuestionPrompt(question, config));
117
+ if (raw === null) {
118
+ opts.print('(EOF — keeping defaults for the remaining questions.)');
119
+ break;
120
+ }
121
+ config = await applyWithRetries(opts, question, config, raw);
122
+ }
123
+ const facts = intentFacts(config);
124
+ ctx.state = { ...ctx.state, facts: [...ctx.state.facts, ...facts] };
125
+ const summary = `Foundation captured: ${facts.length > 0 ? facts.join(', ') : '(no usable intents)'}.`;
126
+ opts.print(summary);
127
+ appendTool(ctx, summary);
128
+ await modelTurn(opts, ctx, 'foundation', `[foundation] facts: ${facts.join(', ') || '(none)'}.`);
129
+ }
130
+ /** Intent entries that sanitize become `intent:<value>` facts; the rest assert nothing. */
131
+ function intentFacts(config) {
132
+ const facts = [];
133
+ for (const intent of config.project.intents) {
134
+ const flag = sanitizeIntent(intent);
135
+ if (flag !== undefined)
136
+ facts.push(flag);
137
+ }
138
+ return facts;
139
+ }
140
+ /** Invalid answers re-prompt (bounded); then the default stands, loudly. */
141
+ async function applyWithRetries(opts, question, config, firstRaw) {
142
+ let raw = firstRaw;
143
+ for (let attempt = 0; attempt < 3; attempt++) {
144
+ try {
145
+ return applyInterviewAnswer(config, question.id, raw);
146
+ }
147
+ catch (err) {
148
+ opts.print(err.message);
149
+ }
150
+ const retry = await opts.ask(formatQuestionPrompt(question, config));
151
+ if (retry === null)
152
+ return config;
153
+ raw = retry;
154
+ }
155
+ opts.print(`Keeping the default for ${question.id} after repeated invalid answers.`);
156
+ return config;
157
+ }
158
+ /* --------------------------------------------------------------- audit -- */
159
+ async function runAuditStep(opts, ctx) {
160
+ ctx.state = advance(ctx.state, 'audit');
161
+ const { report, warnings, profile } = runAudit({ target: path.resolve(opts.dir) });
162
+ for (const warning of warnings)
163
+ opts.print(`warning: ${warning}`);
164
+ ctx.report = report;
165
+ ctx.profile = profile;
166
+ const summary = auditSummary(report);
167
+ opts.print(summary);
168
+ appendTool(ctx, summary);
169
+ await modelTurn(opts, ctx, 'audit', `[audit] ${summary}`);
170
+ }
171
+ function auditSummary(report) {
172
+ const unknown = report.score.counts.UNKNOWN ?? 0;
173
+ return (`Audit: ${report.score.overall}/100 — ${report.findings.length} finding(s), ` +
174
+ `${unknown} to review (${report.score.automationCoverage}% verified automatically).`);
175
+ }
176
+ /* -------------------------------------------------------------- triage -- */
177
+ async function runTriageStep(opts, ctx) {
178
+ ctx.state = advance(ctx.state, 'next');
179
+ const report = ctx.report;
180
+ const unknowns = report.findings.filter((f) => f.status === 'UNKNOWN');
181
+ const capped = unknowns.slice(0, TRIAGE_CAP);
182
+ let recorded = 0;
183
+ for (const finding of capped) {
184
+ const raw = await opts.ask(`Evidence for ${finding.ruleId} (${finding.title}) — file:line or empty to skip: `);
185
+ const answer = (raw ?? '').trim();
186
+ if (answer === '')
187
+ continue;
188
+ recorded++;
189
+ const entry = {
190
+ phase: ctx.state.phase,
191
+ kind: 'decision',
192
+ text: `${finding.ruleId}: ${answer}`,
193
+ };
194
+ ctx.state = {
195
+ ...ctx.state,
196
+ transcript: [...ctx.state.transcript, entry],
197
+ facts: [...ctx.state.facts, `${finding.ruleId}@${answer}`],
198
+ };
199
+ }
200
+ if (unknowns.length > capped.length) {
201
+ appendTool(ctx, `${unknowns.length - capped.length} finding(s) left queued (triage cap ${TRIAGE_CAP}).`);
202
+ }
203
+ const summary = `Triage: ${recorded} evidence note(s) recorded over ${capped.length} finding(s) walked.`;
204
+ opts.print(summary);
205
+ appendTool(ctx, summary);
206
+ await modelTurn(opts, ctx, 'triage', `[triage] recorded ${recorded} evidence note(s).`);
207
+ }
208
+ /* -------------------------------------------------------------- report -- */
209
+ async function runReportStep(opts, ctx) {
210
+ ctx.state = advance(ctx.state, 'next');
211
+ const report = ctx.report;
212
+ const profile = ctx.profile;
213
+ const markdown = renderMarkdown(report, profile);
214
+ const summary = `Report rendered (${markdown.length} chars): ` +
215
+ `${report.score.overall}/100, ${report.findings.length} finding(s).`;
216
+ opts.print(summary);
217
+ appendTool(ctx, summary);
218
+ await modelTurn(opts, ctx, 'report', `[report] score ${report.score.overall}/100.`);
219
+ }
220
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/live/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GAErB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAyB,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAMzE,iFAAiF;AACjF,MAAM,CAAC,MAAM,yBAAyB,GAAG,uCAAuC,CAAC;AAkBjF,MAAM,aAAa,GAAG,8DAA8D,CAAC;AAErF,6EAA6E;AAC7E,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAwB;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,8CAA8C,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,GAAG,GAAgB,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC;IACrD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,CAAC;QACH,MAAM,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACnC,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC9B,MAAM,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/B,MAAM,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/B,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,SAAU,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,IAAI,GAAG,CAAC,CAAC;IACX,CAAC;IACD,IAAI,IAAI,CAAC,cAAc;QAAE,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,SAAS,eAAe,CAAC,IAAwB,EAAE,GAAgB,EAAE,IAAY;IAC/E,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAwB,CAAC,CAAC;QACzD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,kCAAmC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACvE,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAgB,EAAE,IAAY;IAChD,MAAM,KAAK,GAAoB,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC9E,GAAG,CAAC,KAAK,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,8EAA8E;AAE9E,KAAK,UAAU,SAAS,CACtB,IAAwB,EACxB,GAAgB,EAChB,GAAW,EACX,IAAY;IAEZ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,GACR,GAAG,yBAAyB,6BAA6B;YACzD,mCAAmC,GAAG,IAAI,CAAC;QAC7C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjB,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtB,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAgB;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,UAAU;QACrC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,UAAU;QAC/B,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE;YAC1C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;SAChC;KACF,CAAC;IACF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,KAAK,GAAoB,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACzF,GAAG,CAAC,KAAK,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC;IAC7E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,oBAAqB,GAAa,CAAC,OAAO,qCAAqC,GAAG,IAAI,CAAC;QACpG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjB,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,8EAA8E;AAE9E,KAAK,UAAU,iBAAiB,CAAC,IAAwB,EAAE,GAAgB;IACzE,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;IAClF,IAAI,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC;IACnF,KAAK,MAAM,QAAQ,IAAI,mBAAmB,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QACnE,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;YACpE,MAAM;QACR,CAAC;QACD,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,GAAG,CAAC,KAAK,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;IACpE,MAAM,OAAO,GAAG,wBAAwB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,qBAAqB,GAAG,CAAC;IACvG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACzB,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,uBAAuB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC;AACnG,CAAC;AAED,2FAA2F;AAC3F,SAAS,WAAW,CAAC,MAAwB;IAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,4EAA4E;AAC5E,KAAK,UAAU,gBAAgB,CAC7B,IAAwB,EACxB,QAA2B,EAC3B,MAAwB,EACxB,QAAgB;IAEhB,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,OAAO,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QACrE,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC;QAClC,GAAG,GAAG,KAAK,CAAC;IACd,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,2BAA2B,QAAQ,CAAC,EAAE,kCAAkC,CAAC,CAAC;IACrF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAE9E,KAAK,UAAU,YAAY,CAAC,IAAwB,EAAE,GAAgB;IACpE,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnF,KAAK,MAAM,OAAO,IAAI,QAAQ;QAAE,IAAI,CAAC,KAAK,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;IAClE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;IACpB,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;IACtB,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACzB,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,OAAO,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,YAAY,CAAC,MAAmB;IACvC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;IACjD,OAAO,CACL,UAAU,MAAM,CAAC,KAAK,CAAC,OAAO,UAAU,MAAM,CAAC,QAAQ,CAAC,MAAM,eAAe;QAC7E,GAAG,OAAO,eAAe,MAAM,CAAC,KAAK,CAAC,kBAAkB,4BAA4B,CACrF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAE9E,KAAK,UAAU,aAAa,CAAC,IAAwB,EAAE,GAAgB;IACrE,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAqB,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC7C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CACxB,gBAAgB,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,KAAK,kCAAkC,CACnF,CAAC;QACF,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,MAAM,KAAK,EAAE;YAAE,SAAS;QAC5B,QAAQ,EAAE,CAAC;QACX,MAAM,KAAK,GAAoB;YAC7B,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK;YACtB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE;SACrC,CAAC;QACF,GAAG,CAAC,KAAK,GAAG;YACV,GAAG,GAAG,CAAC,KAAK;YACZ,UAAU,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC;YAC5C,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;SAC3D,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACpC,UAAU,CACR,GAAG,EACH,GAAG,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,uCAAuC,UAAU,IAAI,CACxF,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,QAAQ,mCAAmC,MAAM,CAAC,MAAM,qBAAqB,CAAC;IACzG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACzB,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,qBAAqB,QAAQ,oBAAoB,CAAC,CAAC;AAC1F,CAAC;AAED,8EAA8E;AAE9E,KAAK,UAAU,aAAa,CAAC,IAAwB,EAAE,GAAgB;IACrE,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAqB,CAAC;IACzC,MAAM,OAAO,GAAG,GAAG,CAAC,OAA0B,CAAC;IAC/C,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,OAAO,GACX,oBAAoB,QAAQ,CAAC,MAAM,WAAW;QAC9C,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,SAAS,MAAM,CAAC,QAAQ,CAAC,MAAM,cAAc,CAAC;IACvE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACzB,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,kBAAkB,MAAM,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;AACtF,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Live session state machine — pure reducer plus deterministic rendering.
3
+ *
4
+ * The reducer never throws on user text: unknown input keeps the phase and
5
+ * appends a help line. Phase movement happens only on explicit commands
6
+ * (`foundation`, `audit`, `next`, `done`). Rendering carries no timestamps.
7
+ */
8
+ import type { SessionState } from './types.js';
9
+ /** Commands the reducer understands (matched case-insensitively, trimmed). */
10
+ export declare const LIVE_COMMANDS: readonly ["foundation", "audit", "next", "done"];
11
+ export declare const LIVE_HELP: string;
12
+ /** Fresh session: idle, silent, no facts. */
13
+ export declare function initialSession(): SessionState;
14
+ /**
15
+ * Advances the session on one line of user input. Pure: returns a new state,
16
+ * never mutates, never throws — even non-string input degrades to a help
17
+ * line in the current phase.
18
+ */
19
+ export declare function advance(state: SessionState, input: unknown): SessionState;
20
+ /**
21
+ * Renders the transcript as Markdown. Deterministic: phase names, kinds, and
22
+ * texts only — no timestamps, no dates, no durations.
23
+ */
24
+ export declare function renderTranscript(state: SessionState): string;
25
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/live/session.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAgB,YAAY,EAAmB,MAAM,YAAY,CAAC;AAE9E,8EAA8E;AAC9E,eAAO,MAAM,aAAa,kDAAmD,CAAC;AAW9E,eAAO,MAAM,SAAS,QAE2C,CAAC;AAElE,6CAA6C;AAC7C,wBAAgB,cAAc,IAAI,YAAY,CAE7C;AAkBD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,GAAG,YAAY,CA6BzE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAiB5D"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Live session state machine — pure reducer plus deterministic rendering.
3
+ *
4
+ * The reducer never throws on user text: unknown input keeps the phase and
5
+ * appends a help line. Phase movement happens only on explicit commands
6
+ * (`foundation`, `audit`, `next`, `done`). Rendering carries no timestamps.
7
+ */
8
+ /** Commands the reducer understands (matched case-insensitively, trimmed). */
9
+ export const LIVE_COMMANDS = ['foundation', 'audit', 'next', 'done'];
10
+ /** One-step walk for `next`, from every non-terminal phase. */
11
+ const NEXT_PHASE = {
12
+ idle: 'foundation',
13
+ foundation: 'audit',
14
+ audit: 'triage',
15
+ triage: 'report',
16
+ report: 'done',
17
+ };
18
+ export const LIVE_HELP = 'Commands: foundation | audit | next | done — ' +
19
+ 'any other text is recorded and the session stays where it is.';
20
+ /** Fresh session: idle, silent, no facts. */
21
+ export function initialSession() {
22
+ return { phase: 'idle', transcript: [], facts: [] };
23
+ }
24
+ function toolEntry(phase, text) {
25
+ return { phase, kind: 'tool', text };
26
+ }
27
+ function userEntry(phase, text) {
28
+ return { phase, kind: 'user', text };
29
+ }
30
+ function move(state, phase, note) {
31
+ return {
32
+ phase,
33
+ transcript: [...state.transcript, toolEntry(state.phase, note)],
34
+ facts: [...state.facts],
35
+ };
36
+ }
37
+ /**
38
+ * Advances the session on one line of user input. Pure: returns a new state,
39
+ * never mutates, never throws — even non-string input degrades to a help
40
+ * line in the current phase.
41
+ */
42
+ export function advance(state, input) {
43
+ try {
44
+ const raw = typeof input === 'string' ? input : String(input ?? '');
45
+ const cmd = raw.trim().toLowerCase();
46
+ const seen = {
47
+ phase: state.phase,
48
+ transcript: [...state.transcript, userEntry(state.phase, raw)],
49
+ facts: [...state.facts],
50
+ };
51
+ if (cmd === 'done')
52
+ return move(seen, 'done', 'Session complete.');
53
+ if (cmd === 'foundation')
54
+ return move(seen, 'foundation', 'Entering foundation.');
55
+ if (cmd === 'audit')
56
+ return move(seen, 'audit', 'Entering audit.');
57
+ if (cmd === 'next') {
58
+ const next = NEXT_PHASE[seen.phase];
59
+ if (next === undefined)
60
+ return move(seen, 'done', 'Session complete.');
61
+ return move(seen, next, `Entering ${next}.`);
62
+ }
63
+ return {
64
+ phase: seen.phase,
65
+ transcript: [...seen.transcript, toolEntry(seen.phase, LIVE_HELP)],
66
+ facts: seen.facts,
67
+ };
68
+ }
69
+ catch {
70
+ return {
71
+ phase: state.phase,
72
+ transcript: [...state.transcript, toolEntry(state.phase, LIVE_HELP)],
73
+ facts: [...state.facts],
74
+ };
75
+ }
76
+ }
77
+ /**
78
+ * Renders the transcript as Markdown. Deterministic: phase names, kinds, and
79
+ * texts only — no timestamps, no dates, no durations.
80
+ */
81
+ export function renderTranscript(state) {
82
+ const out = [];
83
+ out.push('# Live session transcript');
84
+ out.push('');
85
+ out.push(`Phase: ${state.phase}`);
86
+ out.push(`Facts: ${state.facts.length > 0 ? state.facts.join(', ') : '(none)'}`);
87
+ out.push('');
88
+ out.push('## Transcript');
89
+ out.push('');
90
+ if (state.transcript.length === 0)
91
+ out.push('(empty)');
92
+ for (const entry of state.transcript) {
93
+ out.push(`### ${entry.phase} · ${entry.kind}`);
94
+ out.push('');
95
+ out.push(entry.text === '' ? '(empty)' : entry.text);
96
+ out.push('');
97
+ }
98
+ return out.join('\n');
99
+ }
100
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/live/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Live conversational audit sessions — shared types.
3
+ *
4
+ * Doctrine: the session is a deterministic state machine. The transcript is
5
+ * the artifact; it carries no timestamps so its rendering is byte-stable and
6
+ * test-assertable (structure asserted, never times).
7
+ */
8
+ import type { ChatRequest, ChatResult } from '../agent/types.js';
9
+ /** Conversational phases, in walking order. */
10
+ export type SessionPhase = 'idle' | 'foundation' | 'audit' | 'triage' | 'report' | 'done';
11
+ /** Who produced a transcript line. */
12
+ export type TranscriptKind = 'user' | 'tool' | 'model' | 'decision';
13
+ /** One deterministic transcript line: no timestamps by design. */
14
+ export interface TranscriptEntry {
15
+ phase: SessionPhase;
16
+ kind: TranscriptKind;
17
+ text: string;
18
+ }
19
+ /** Reducer state: where the session is, what was said, what was learned. */
20
+ export interface SessionState {
21
+ phase: SessionPhase;
22
+ transcript: TranscriptEntry[];
23
+ facts: string[];
24
+ }
25
+ /** LLM call behind an injectable interface. Types come from `src/agent` only. */
26
+ export type ChatFn = (req: ChatRequest) => Promise<ChatResult>;
27
+ /** Synchronous line reader injected by the caller (stdin in the CLI). */
28
+ export type AskFn = (prompt: string) => string | null | Promise<string | null>;
29
+ /** Line printer injected by the caller (console in the CLI). */
30
+ export type PrintFn = (line: string) => void;
31
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/live/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEjE,+CAA+C;AAC/C,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE1F,sCAAsC;AACtC,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;AAEpE,kEAAkE;AAClE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,4EAA4E;AAC5E,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,YAAY,CAAC;IACpB,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,iFAAiF;AACjF,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AAE/D,yEAAyE;AACzE,MAAM,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAE/E,gEAAgE;AAChE,MAAM,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Live conversational audit sessions — shared types.
3
+ *
4
+ * Doctrine: the session is a deterministic state machine. The transcript is
5
+ * the artifact; it carries no timestamps so its rendering is byte-stable and
6
+ * test-assertable (structure asserted, never times).
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/live/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,4 @@
1
+ import type { AuditReport } from '../types.js';
2
+ import type { MaturityProfile } from '../engine/maturity.js';
3
+ export declare function renderNarrative(report: AuditReport, profile: MaturityProfile): string;
4
+ //# sourceMappingURL=narrative.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"narrative.d.ts","sourceRoot":"","sources":["../../src/report/narrative.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAwC,MAAM,aAAa,CAAC;AACrF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAuI7D,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM,CAgBrF"}