zelari-code 2.17.0 → 2.18.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.
@@ -0,0 +1,86 @@
1
+ /**
2
+ * inspectSession.ts — `zelari-code inspect <session-id> [--json]` (v0.10).
3
+ *
4
+ * FIRST consumer of the NDJSON `harness_state` event: reads the ADR-0023
5
+ * read-model for one spine session (`<sessionsDir>/<id>/events.jsonl`) and
6
+ * prints a human-readable report — header (session id + turnsTotal), one
7
+ * line per turn (verification verdict + completion contract with blocker
8
+ * count), and a "support lens" section (context projections, memory
9
+ * events, compactions). `--json` prints the raw state instead.
10
+ *
11
+ * Advisory-only: reads the session spine, writes nothing, emits no events,
12
+ * never influences mission/run exit codes. The sessions dir resolves exactly
13
+ * like the harness_state emitter (workspaceRoot + ZELARI_SESSIONS_DIR,
14
+ * ADR-0016) so the read matches what the headless hosts wrote. The
15
+ * reader/derivation are REUSED from harnessState.ts — no re-parsing here.
16
+ */
17
+ import path from 'node:path';
18
+ import { existsSync } from 'node:fs';
19
+ import { resolveSessionsDir } from '@zelari/core/session';
20
+ import { readHarnessState } from '../harnessState.js';
21
+ /**
22
+ * Pure renderer — HarnessState → report text. No I/O, no clock, no color,
23
+ * so it is testable without spawning the CLI (same discipline as the
24
+ * read-model it renders).
25
+ */
26
+ export function renderInspectReport(state) {
27
+ const lines = [
28
+ `session ${state.session.sessionId} status=${state.session.status} turns=${state.execution.turnsTotal}`,
29
+ ];
30
+ const contractByTurn = new Map(state.execution.contracts.map((c) => [c.turn, c]));
31
+ for (const turn of state.turns) {
32
+ const contract = contractByTurn.get(turn.index);
33
+ const verification = turn.verification
34
+ ? `${turn.verification.verdict}${turn.verification.strict ? '' : ' (non-strict)'}`
35
+ : 'unknown'; // ADR-0023: no verification evidence ⇒ unknown ≠ pass.
36
+ const blockers = contract?.blockers ?? [];
37
+ const completion = contract?.complete
38
+ ? 'complete'
39
+ : blockers.length > 0
40
+ ? `incomplete — ${blockers.length} blockers: ${blockers.join(', ')}`
41
+ : 'incomplete';
42
+ lines.push(` turn ${turn.index} [${turn.outcome}] verification: ${verification} contract: ${completion}`);
43
+ }
44
+ lines.push('');
45
+ lines.push('support lens:');
46
+ const projections = state.support.contextProjections;
47
+ const last = projections[projections.length - 1];
48
+ lines.push(` context projections: ${projections.length}` +
49
+ (last ? ` (last: ${last.contextChars} chars → ${last.returnedCount} items)` : ''));
50
+ lines.push(` memory events: ${state.support.memoryEvents}`);
51
+ const saved = state.support.tokensSavedByCompaction;
52
+ lines.push(` compactions: ${state.support.compactions}${saved !== undefined ? ` (${saved} tokens saved)` : ''}`);
53
+ return lines.join('\n');
54
+ }
55
+ /** Run the session-inspect command. Prints to stdout/stderr; returns the exit code. */
56
+ export async function runInspectSession(opts) {
57
+ const sessionsDir = resolveSessionsDir({ workspaceRoot: opts.cwd ?? process.cwd() });
58
+ const sessionDir = path.join(sessionsDir, opts.sessionId);
59
+ const eventsPath = path.join(sessionDir, 'events.jsonl');
60
+ // readHarnessState is tolerant by contract (missing log ⇒ empty pending
61
+ // state), so "session not found" is checked HERE, before the read.
62
+ if (!existsSync(sessionDir)) {
63
+ // eslint-disable-next-line no-console
64
+ console.error(`zelari-code inspect: no session directory at ${sessionDir}`);
65
+ return 1;
66
+ }
67
+ if (!existsSync(eventsPath)) {
68
+ // eslint-disable-next-line no-console
69
+ console.error(`zelari-code inspect: session directory has no events.jsonl at ${eventsPath}`);
70
+ return 1;
71
+ }
72
+ let state;
73
+ try {
74
+ state = await readHarnessState(sessionDir);
75
+ }
76
+ catch (err) {
77
+ const msg = err instanceof Error ? err.message : String(err);
78
+ // eslint-disable-next-line no-console
79
+ console.error(`zelari-code inspect: cannot read session at ${sessionDir}: ${msg}`);
80
+ return 1;
81
+ }
82
+ // eslint-disable-next-line no-console
83
+ console.log(opts.json ? JSON.stringify(state, null, 2) : renderInspectReport(state));
84
+ return 0;
85
+ }
86
+ //# sourceMappingURL=inspectSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspectSession.js","sourceRoot":"","sources":["../../../src/cli/commands/inspectSession.ts"],"names":[],"mappings":"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"}