@jigyasudham/veto 3.1.2 → 3.2.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 (79) hide show
  1. package/README.md +26 -1
  2. package/dist/cli.js +51 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/host.d.ts +23 -0
  5. package/dist/host.d.ts.map +1 -0
  6. package/dist/host.js +81 -0
  7. package/dist/host.js.map +1 -0
  8. package/dist/server/handlers/observability.d.ts.map +1 -1
  9. package/dist/server/handlers/observability.js +16 -1
  10. package/dist/server/handlers/observability.js.map +1 -1
  11. package/dist/server/handlers/session.d.ts.map +1 -1
  12. package/dist/server/handlers/session.js +18 -5
  13. package/dist/server/handlers/session.js.map +1 -1
  14. package/dist/server.d.ts.map +1 -1
  15. package/dist/server.js +17 -0
  16. package/dist/server.js.map +1 -1
  17. package/dist/tools/definitions.d.ts +3 -3
  18. package/dist/tools/definitions.js +3 -3
  19. package/dist/tools/definitions.js.map +1 -1
  20. package/dist/transcripts/adapters/claude.d.ts +2 -24
  21. package/dist/transcripts/adapters/claude.d.ts.map +1 -1
  22. package/dist/transcripts/adapters/claude.js +31 -129
  23. package/dist/transcripts/adapters/claude.js.map +1 -1
  24. package/dist/transcripts/adapters/codex.d.ts +4 -0
  25. package/dist/transcripts/adapters/codex.d.ts.map +1 -0
  26. package/dist/transcripts/adapters/codex.js +120 -0
  27. package/dist/transcripts/adapters/codex.js.map +1 -0
  28. package/dist/transcripts/adapters/gemini.d.ts +4 -0
  29. package/dist/transcripts/adapters/gemini.d.ts.map +1 -0
  30. package/dist/transcripts/adapters/gemini.js +124 -0
  31. package/dist/transcripts/adapters/gemini.js.map +1 -0
  32. package/dist/transcripts/adapters/index.d.ts +16 -0
  33. package/dist/transcripts/adapters/index.d.ts.map +1 -0
  34. package/dist/transcripts/adapters/index.js +36 -0
  35. package/dist/transcripts/adapters/index.js.map +1 -0
  36. package/dist/transcripts/adapters/jsonl.d.ts +67 -0
  37. package/dist/transcripts/adapters/jsonl.d.ts.map +1 -0
  38. package/dist/transcripts/adapters/jsonl.js +138 -0
  39. package/dist/transcripts/adapters/jsonl.js.map +1 -0
  40. package/dist/transcripts/archive.d.ts.map +1 -1
  41. package/dist/transcripts/archive.js +2 -1
  42. package/dist/transcripts/archive.js.map +1 -1
  43. package/dist/transcripts/discover.d.ts +50 -0
  44. package/dist/transcripts/discover.d.ts.map +1 -0
  45. package/dist/transcripts/discover.js +247 -0
  46. package/dist/transcripts/discover.js.map +1 -0
  47. package/dist/transcripts/expand.d.ts +33 -2
  48. package/dist/transcripts/expand.d.ts.map +1 -1
  49. package/dist/transcripts/expand.js +95 -9
  50. package/dist/transcripts/expand.js.map +1 -1
  51. package/dist/transcripts/ingest.js +2 -2
  52. package/dist/transcripts/ingest.js.map +1 -1
  53. package/dist/transcripts/mapping.d.ts +8 -0
  54. package/dist/transcripts/mapping.d.ts.map +1 -1
  55. package/dist/transcripts/mapping.js +1 -1
  56. package/dist/transcripts/mapping.js.map +1 -1
  57. package/dist/transcripts/metric.d.ts +80 -0
  58. package/dist/transcripts/metric.d.ts.map +1 -0
  59. package/dist/transcripts/metric.js +306 -0
  60. package/dist/transcripts/metric.js.map +1 -0
  61. package/dist/transcripts/on-save.d.ts +18 -0
  62. package/dist/transcripts/on-save.d.ts.map +1 -1
  63. package/dist/transcripts/on-save.js +41 -2
  64. package/dist/transcripts/on-save.js.map +1 -1
  65. package/dist/transcripts/pyramid.d.ts +8 -0
  66. package/dist/transcripts/pyramid.d.ts.map +1 -1
  67. package/dist/transcripts/pyramid.js +40 -6
  68. package/dist/transcripts/pyramid.js.map +1 -1
  69. package/dist/transcripts/recall.d.ts +2 -0
  70. package/dist/transcripts/recall.d.ts.map +1 -1
  71. package/dist/transcripts/recall.js +36 -12
  72. package/dist/transcripts/recall.js.map +1 -1
  73. package/dist/transcripts/search.d.ts.map +1 -1
  74. package/dist/transcripts/search.js +20 -11
  75. package/dist/transcripts/search.js.map +1 -1
  76. package/dist/transcripts/toc.js +3 -4
  77. package/dist/transcripts/toc.js.map +1 -1
  78. package/package.json +2 -2
  79. package/server.json +2 -2
@@ -0,0 +1,120 @@
1
+ // Codex CLI rollout adapter (VERSION-3 item 6, v3.2).
2
+ //
3
+ // Codex writes ~/.codex/sessions/YYYY/MM/DD/rollout-<ts>-<uuid>.jsonl, where each
4
+ // line is an envelope `{timestamp, type, payload}` carrying TWO interleaved
5
+ // streams of the same conversation:
6
+ //
7
+ // • `response_item` — the model-API transcript (what the model actually saw);
8
+ // • `event_msg` — the TUI event stream (what the user actually saw).
9
+ //
10
+ // Indexing both would double-count every message in BM25, so exactly one stream
11
+ // is canonical per role. Which one is not a coin flip — it was measured over 12
12
+ // real rollouts spanning six CLI versions (0.118 → 0.130):
13
+ //
14
+ // • ASSISTANT: `event_msg/agent_message` is a strict SUPERSET — every one of
15
+ // the 196 `response_item` assistant messages had an agent_message twin, and
16
+ // 143 interim "commentary" messages existed ONLY as agent_message (older
17
+ // builds did not persist commentary as response_items). Canonical:
18
+ // agent_message; the response_item twin is demoted to meta.
19
+ // • USER: `response_item/message(role=user)` is the strict superset — zero
20
+ // real user messages appeared only as `event_msg/user_message`, while 21
21
+ // synthetic-but-real inputs (<environment_context>, <subagent_notification>,
22
+ // <turn_aborted>) existed only as response_items. Canonical: the
23
+ // response_item; the event_msg twin is demoted to meta.
24
+ // • TOOLS: `response_item` function_call/function_call_output pair up exactly
25
+ // (543/543), so the tool spine is the response_item stream and the
26
+ // `event_msg` echoes (exec_command_end, patch_apply_end, …) are meta.
27
+ //
28
+ // Demoted lines are still stored and ordered — nothing is dropped, they just do
29
+ // not enter the search index.
30
+ //
31
+ // `reasoning` payloads carry only `encrypted_content` (an opaque base64 blob;
32
+ // summary was empty in 342/342 observed) — that is deliberately NEVER indexed.
33
+ import { walkJsonl, normalizeTs, contentText, digestArgs, TOOL_DIGEST_CHARS, } from './jsonl.js';
34
+ // response_item payload types that are the canonical tool spine.
35
+ const TOOL_CALL_TYPES = new Set(['function_call', 'custom_tool_call', 'local_shell_call']);
36
+ const TOOL_OUTPUT_TYPES = new Set(['function_call_output', 'custom_tool_call_output', 'local_shell_call_output']);
37
+ function toolNameOf(p) {
38
+ if (typeof p.name === 'string' && p.name)
39
+ return p.name;
40
+ if (p.type === 'web_search_call')
41
+ return 'web_search';
42
+ return 'tool';
43
+ }
44
+ function mapResponseItem(p) {
45
+ const t = p.type;
46
+ if (t === 'message') {
47
+ const text = contentText(p.content);
48
+ // Assistant text is canonical on the event_msg stream (see header note).
49
+ if (p.role === 'assistant')
50
+ return [{ kind: 'meta', text: '' }];
51
+ if (p.role === 'user')
52
+ return [{ kind: 'user_message', text }];
53
+ return [{ kind: 'meta', text: '' }]; // developer/system instruction injections
54
+ }
55
+ if (t === 'reasoning') {
56
+ // summary[] is the only readable part; encrypted_content is never indexed.
57
+ const summary = Array.isArray(p.summary) ? contentText(p.summary, '\n') : '';
58
+ return [{ kind: 'reasoning', text: summary }];
59
+ }
60
+ if (TOOL_CALL_TYPES.has(t)) {
61
+ const name = toolNameOf(p);
62
+ return [{ kind: 'tool_call', text: digestArgs(name, p.arguments ?? p.input ?? p.action ?? {}), toolName: name }];
63
+ }
64
+ if (t === 'web_search_call') {
65
+ return [{ kind: 'tool_call', text: digestArgs('web_search', p.action ?? {}), toolName: 'web_search' }];
66
+ }
67
+ if (TOOL_OUTPUT_TYPES.has(t)) {
68
+ return [{ kind: 'tool_result', text: contentText(p.output ?? p.result ?? '').slice(0, TOOL_DIGEST_CHARS) }];
69
+ }
70
+ return [{ kind: 'meta', text: '' }];
71
+ }
72
+ function mapEventMsg(p) {
73
+ // Only the assistant stream is canonical here; user_message duplicates the
74
+ // response_item and every other event type is UI telemetry.
75
+ if (p.type === 'agent_message') {
76
+ return [{ kind: 'assistant_message', text: typeof p.message === 'string' ? p.message : contentText(p.message) }];
77
+ }
78
+ return [{ kind: 'meta', text: '' }];
79
+ }
80
+ function mapLine(obj, sessionIds) {
81
+ const p = obj.payload && typeof obj.payload === 'object' ? obj.payload : {};
82
+ const outerType = typeof obj.type === 'string' ? obj.type : null;
83
+ const innerType = typeof p.type === 'string' ? p.type : null;
84
+ const base = {
85
+ // `response_item/function_call` reads better in the TOC than a bare
86
+ // `response_item`, so the source type records both envelope and payload.
87
+ sourceType: outerType && innerType ? `${outerType}/${innerType}` : outerType,
88
+ role: typeof p.role === 'string' ? p.role : null,
89
+ // call_id links a tool call to its output; turn_id groups one turn.
90
+ eventUuid: typeof p.call_id === 'string' ? p.call_id : null,
91
+ parentUuid: typeof p.turn_id === 'string' ? p.turn_id : null,
92
+ isSidechain: false,
93
+ tsSource: typeof obj.timestamp === 'string' ? obj.timestamp : null,
94
+ tsUtc: normalizeTs(obj.timestamp),
95
+ };
96
+ if (outerType === 'session_meta') {
97
+ if (typeof p.id === 'string')
98
+ sessionIds.add(p.id);
99
+ // A subagent rollout replays its parent's session_meta too; both ids are
100
+ // recorded so ingest's session-id verification accepts either binding.
101
+ if (typeof p.forked_from_id === 'string')
102
+ sessionIds.add(p.forked_from_id);
103
+ return { base, blocks: [{ kind: 'meta', text: '' }] };
104
+ }
105
+ if (outerType === 'response_item')
106
+ return { base, blocks: mapResponseItem(p) };
107
+ if (outerType === 'event_msg') {
108
+ if (p.type === 'agent_message')
109
+ base.role = 'assistant';
110
+ return { base, blocks: mapEventMsg(p) };
111
+ }
112
+ if (outerType === 'turn_context')
113
+ return { base, blocks: [{ kind: 'meta', text: '' }] };
114
+ return { base, blocks: [{ kind: 'unknown', text: '' }] };
115
+ }
116
+ /** Parse a Codex rollout JSONL L0 buffer into ordered, masked, byte-addressed events. */
117
+ export function parseCodexTranscript(buf) {
118
+ return walkJsonl(buf, mapLine);
119
+ }
120
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/transcripts/adapters/codex.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,kFAAkF;AAClF,4EAA4E;AAC5E,oCAAoC;AACpC,EAAE;AACF,gFAAgF;AAChF,2EAA2E;AAC3E,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF,2DAA2D;AAC3D,EAAE;AACF,+EAA+E;AAC/E,gFAAgF;AAChF,6EAA6E;AAC7E,uEAAuE;AACvE,gEAAgE;AAChE,6EAA6E;AAC7E,6EAA6E;AAC7E,iFAAiF;AACjF,qEAAqE;AACrE,4DAA4D;AAC5D,gFAAgF;AAChF,uEAAuE;AACvE,0EAA0E;AAC1E,EAAE;AACF,gFAAgF;AAChF,8BAA8B;AAC9B,EAAE;AACF,8EAA8E;AAC9E,+EAA+E;AAE/E,OAAO,EACL,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,GAEnE,MAAM,YAAY,CAAC;AAEpB,iEAAiE;AACjE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CAAC;AAC3F,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,sBAAsB,EAAE,yBAAyB,EAAE,yBAAyB,CAAC,CAAC,CAAC;AAElH,SAAS,UAAU,CAAC,CAAM;IACxB,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB;QAAE,OAAO,YAAY,CAAC;IACtD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,CAAM;IAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IAEjB,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACpC,yEAAyE;QACzE,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAG,0CAA0C;IACnF,CAAC;IACD,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC;QACtB,2EAA2E;QAC3E,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACnH,CAAC;IACD,IAAI,CAAC,KAAK,iBAAiB,EAAE,CAAC;QAC5B,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;IACzG,CAAC;IACD,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC9G,CAAC;IACD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,WAAW,CAAC,CAAM;IACzB,2EAA2E;IAC3E,4DAA4D;IAC5D,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QAC/B,OAAO,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnH,CAAC;IACD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,OAAO,CAAC,GAAQ,EAAE,UAAuB;IAChD,MAAM,CAAC,GAAQ,GAAG,CAAC,OAAO,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAE7D,MAAM,IAAI,GAAc;QACtB,oEAAoE;QACpE,yEAAyE;QACzE,UAAU,EAAE,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS;QAC5E,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;QAChD,oEAAoE;QACpE,SAAS,EAAE,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;QAC3D,UAAU,EAAE,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;QAC5D,WAAW,EAAE,KAAK;QAClB,QAAQ,EAAE,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;QAClE,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;KAClC,CAAC;IAEF,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;QACjC,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ;YAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnD,yEAAyE;QACzE,uEAAuE;QACvE,IAAI,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ;YAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;IACxD,CAAC;IACD,IAAI,SAAS,KAAK,eAAe;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe;YAAE,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1C,CAAC;IACD,IAAI,SAAS,KAAK,cAAc;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;IAExF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,OAAO,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type ParseResult } from './jsonl.js';
2
+ /** Parse a Gemini CLI chat JSONL L0 buffer into ordered, masked, byte-addressed events. */
3
+ export declare function parseGeminiTranscript(buf: Buffer): ParseResult;
4
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/transcripts/adapters/gemini.ts"],"names":[],"mappings":"AAuBA,OAAO,EAEkD,KAAK,WAAW,EACxE,MAAM,YAAY,CAAC;AA8FpB,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAI9D"}
@@ -0,0 +1,124 @@
1
+ // Gemini CLI chat adapter (VERSION-3 item 6, v3.2).
2
+ //
3
+ // Gemini writes ~/.gemini/tmp/<project>/chats/session-<ts>-<id>.jsonl. Line 1 is
4
+ // a header `{sessionId, projectHash, startTime, lastUpdated, kind}`; the rest are
5
+ // records `{id, timestamp, type, ...}` with type user | gemini | info | error,
6
+ // interleaved with `{"$set":{...}}` header patches and re-written header lines.
7
+ //
8
+ // THE FORMAT IS AN APPEND-ONLY LOG OF REVISIONS, NOT OF MESSAGES. As a turn
9
+ // streams, Gemini appends a NEW line carrying the SAME `id` with the message
10
+ // grown a little further — content, then content + thoughts, then content +
11
+ // thoughts + toolCalls. Measured on a real session: 202 id-bearing records for
12
+ // 79 distinct ids (65 ids revised more than once), and in 65/65 cases the text
13
+ // only ever GREW — later revisions are strict supersets of earlier ones.
14
+ //
15
+ // Indexing every revision would inflate a Gemini session's index ~2.5x with
16
+ // partial duplicates of its own messages and let a half-streamed sentence
17
+ // outrank the finished one. So the last revision of each id stays searchable and
18
+ // its earlier revisions are demoted to `meta`: still stored, still ordered, still
19
+ // byte-addressable back into L0 — just not in the search index.
20
+ //
21
+ // Header/`$set` lines are meta. `info`/`error` are UI notices (e.g. "Request
22
+ // cancelled."), not conversation, so they are meta too.
23
+ import { walkJsonl, normalizeTs, contentText, digestArgs, TOOL_DIGEST_CHARS, } from './jsonl.js';
24
+ /** A `gemini` record's toolCalls[] entry → one tool_call + one tool_result. */
25
+ function toolBlocks(calls) {
26
+ if (!Array.isArray(calls))
27
+ return [];
28
+ const out = [];
29
+ for (const c of calls) {
30
+ if (!c || typeof c !== 'object')
31
+ continue;
32
+ const name = typeof c.name === 'string' ? c.name : 'tool';
33
+ out.push({ kind: 'tool_call', text: digestArgs(name, c.args), toolName: name });
34
+ if (c.result !== undefined || typeof c.resultDisplay === 'string') {
35
+ const text = typeof c.resultDisplay === 'string' && c.resultDisplay
36
+ ? c.resultDisplay
37
+ : contentText(c.result, ' ');
38
+ out.push({ kind: 'tool_result', text: text.slice(0, TOOL_DIGEST_CHARS), toolName: name });
39
+ }
40
+ }
41
+ return out;
42
+ }
43
+ function mapLine(obj, sessionIds) {
44
+ // Header lines (the first one and every later rewrite) carry the session id.
45
+ if (typeof obj.sessionId === 'string' && typeof obj.startTime === 'string') {
46
+ sessionIds.add(obj.sessionId);
47
+ return {
48
+ base: {
49
+ sourceType: 'header', role: null, eventUuid: null, parentUuid: null, isSidechain: false,
50
+ tsSource: typeof obj.lastUpdated === 'string' ? obj.lastUpdated : null,
51
+ tsUtc: normalizeTs(obj.lastUpdated ?? obj.startTime),
52
+ },
53
+ blocks: [{ kind: 'meta', text: '' }],
54
+ };
55
+ }
56
+ const type = typeof obj.type === 'string' ? obj.type : null;
57
+ const base = {
58
+ sourceType: type ?? (obj.$set ? '$set' : null),
59
+ role: type === 'gemini' ? 'assistant' : type === 'user' ? 'user' : null,
60
+ // The record id is the supersession key; keeping it in event_uuid is both
61
+ // the native identifier AND what supersede() below reads.
62
+ eventUuid: typeof obj.id === 'string' ? obj.id : null,
63
+ parentUuid: null,
64
+ isSidechain: false,
65
+ tsSource: typeof obj.timestamp === 'string' ? obj.timestamp : null,
66
+ tsUtc: normalizeTs(obj.timestamp),
67
+ };
68
+ if (type === 'user')
69
+ return { base, blocks: [{ kind: 'user_message', text: contentText(obj.content) }] };
70
+ if (type === 'gemini') {
71
+ const blocks = [];
72
+ if (Array.isArray(obj.thoughts) && obj.thoughts.length) {
73
+ const text = obj.thoughts
74
+ .map(t => [t?.subject, t?.description].filter(x => typeof x === 'string').join(': '))
75
+ .filter(Boolean).join('\n');
76
+ if (text)
77
+ blocks.push({ kind: 'reasoning', text });
78
+ }
79
+ const content = contentText(obj.content);
80
+ if (content)
81
+ blocks.push({ kind: 'assistant_message', text: content });
82
+ blocks.push(...toolBlocks(obj.toolCalls));
83
+ // An empty streaming placeholder still owes the line an ordered event.
84
+ if (blocks.length === 0)
85
+ blocks.push({ kind: 'assistant_message', text: '' });
86
+ return { base, blocks };
87
+ }
88
+ if (type === 'info' || type === 'error' || obj.$set)
89
+ return { base, blocks: [{ kind: 'meta', text: '' }] };
90
+ return { base, blocks: [{ kind: 'unknown', text: '' }] };
91
+ }
92
+ /**
93
+ * Demote every revision of a record except its last to `meta`, so a message that
94
+ * was appended five times is indexed once. Keyed on (event_uuid, line_index): the
95
+ * several blocks a single line produces share a line and are all kept.
96
+ */
97
+ function supersede(events) {
98
+ const lastLine = new Map();
99
+ for (const e of events) {
100
+ if (!e.eventUuid)
101
+ continue;
102
+ const seen = lastLine.get(e.eventUuid);
103
+ if (seen === undefined || e.lineIndex > seen)
104
+ lastLine.set(e.eventUuid, e.lineIndex);
105
+ }
106
+ let demoted = 0;
107
+ for (const e of events) {
108
+ if (!e.eventUuid || e.kind === 'meta' || e.kind === 'unknown')
109
+ continue;
110
+ if (e.lineIndex < (lastLine.get(e.eventUuid) ?? e.lineIndex)) {
111
+ e.kind = 'meta';
112
+ e.text = '';
113
+ demoted++;
114
+ }
115
+ }
116
+ return demoted;
117
+ }
118
+ /** Parse a Gemini CLI chat JSONL L0 buffer into ordered, masked, byte-addressed events. */
119
+ export function parseGeminiTranscript(buf) {
120
+ const result = walkJsonl(buf, mapLine);
121
+ supersede(result.events);
122
+ return result;
123
+ }
124
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/transcripts/adapters/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { parseClaudeTranscript } from './claude.js';
2
+ import { parseCodexTranscript } from './codex.js';
3
+ import { parseGeminiTranscript } from './gemini.js';
4
+ import type { ParseResult } from './jsonl.js';
5
+ export type { NormalizedEvent, ParseResult } from './jsonl.js';
6
+ export { parseClaudeTranscript, parseCodexTranscript, parseGeminiTranscript };
7
+ /** Host CLIs Veto can capture transcripts from. */
8
+ export declare const TRANSCRIPT_SOURCES: readonly ["claude", "codex", "gemini"];
9
+ export type TranscriptSource = (typeof TRANSCRIPT_SOURCES)[number];
10
+ export declare function isTranscriptSource(s: string): s is TranscriptSource;
11
+ /** Recorded on the archive row so a later reader knows what the bytes are. */
12
+ export declare const FORMAT_HINTS: Record<TranscriptSource, string>;
13
+ export declare function formatHint(source: string): string;
14
+ /** Parse an L0 buffer with the parser that owns `source`. */
15
+ export declare function parseTranscript(source: string, buf: Buffer): ParseResult;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transcripts/adapters/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,CAAC;AAE9E,mDAAmD;AACnD,eAAO,MAAM,kBAAkB,wCAAyC,CAAC;AACzE,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAEnE;AAED,8EAA8E;AAC9E,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAIzD,CAAC;AAEF,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD;AAQD,6DAA6D;AAC7D,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CAGxE"}
@@ -0,0 +1,36 @@
1
+ // Adapter registry — one place that knows which parser owns which source.
2
+ //
3
+ // `archives.source` is the routing key, so a row captured from Codex is always
4
+ // re-derived by the Codex parser even if the ingest that reads it runs inside a
5
+ // different host CLI. An unrecognized source falls back to the Claude parser
6
+ // rather than failing: a mis-tagged archive still gets ordered, masked,
7
+ // byte-addressed events (mostly kind='unknown'), which the drift canaries catch.
8
+ import { parseClaudeTranscript } from './claude.js';
9
+ import { parseCodexTranscript } from './codex.js';
10
+ import { parseGeminiTranscript } from './gemini.js';
11
+ export { parseClaudeTranscript, parseCodexTranscript, parseGeminiTranscript };
12
+ /** Host CLIs Veto can capture transcripts from. */
13
+ export const TRANSCRIPT_SOURCES = ['claude', 'codex', 'gemini'];
14
+ export function isTranscriptSource(s) {
15
+ return TRANSCRIPT_SOURCES.includes(s);
16
+ }
17
+ /** Recorded on the archive row so a later reader knows what the bytes are. */
18
+ export const FORMAT_HINTS = {
19
+ claude: 'claude-jsonl',
20
+ codex: 'codex-rollout-jsonl',
21
+ gemini: 'gemini-chat-jsonl',
22
+ };
23
+ export function formatHint(source) {
24
+ return isTranscriptSource(source) ? FORMAT_HINTS[source] : source;
25
+ }
26
+ const PARSERS = {
27
+ claude: parseClaudeTranscript,
28
+ codex: parseCodexTranscript,
29
+ gemini: parseGeminiTranscript,
30
+ };
31
+ /** Parse an L0 buffer with the parser that owns `source`. */
32
+ export function parseTranscript(source, buf) {
33
+ const parse = isTranscriptSource(source) ? PARSERS[source] : parseClaudeTranscript;
34
+ return parse(buf);
35
+ }
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transcripts/adapters/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,EAAE;AACF,+EAA+E;AAC/E,gFAAgF;AAChF,6EAA6E;AAC7E,wEAAwE;AACxE,iFAAiF;AAEjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAIpD,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,CAAC;AAE9E,mDAAmD;AACnD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAC;AAGzE,MAAM,UAAU,kBAAkB,CAAC,CAAS;IAC1C,OAAQ,kBAAwC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAqC;IAC5D,MAAM,EAAE,cAAc;IACtB,KAAK,EAAE,qBAAqB;IAC5B,MAAM,EAAE,mBAAmB;CAC5B,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACpE,CAAC;AAED,MAAM,OAAO,GAA2D;IACtE,MAAM,EAAE,qBAAqB;IAC7B,KAAK,EAAE,oBAAoB;IAC3B,MAAM,EAAE,qBAAqB;CAC9B,CAAC;AAEF,6DAA6D;AAC7D,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,GAAW;IACzD,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC;IACnF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1,67 @@
1
+ import type { EventKind } from '../schema.js';
2
+ export type NormalizedEvent = {
3
+ seq: number;
4
+ lineIndex: number;
5
+ blockIndex: number;
6
+ kind: EventKind;
7
+ sourceType: string | null;
8
+ role: string | null;
9
+ toolName: string | null;
10
+ text: string;
11
+ secretCount: number;
12
+ eventUuid: string | null;
13
+ parentUuid: string | null;
14
+ isSidechain: boolean;
15
+ tsSource: string | null;
16
+ tsUtc: string | null;
17
+ rawOffset: number;
18
+ rawLength: number;
19
+ };
20
+ export type ParseResult = {
21
+ events: NormalizedEvent[];
22
+ sessionIds: Set<string>;
23
+ secretsRedacted: number;
24
+ };
25
+ export declare const MAX_LINE_BYTES: number;
26
+ export declare const MAX_TEXT_CHARS = 100000;
27
+ export declare const TOOL_DIGEST_CHARS = 500;
28
+ export type Obj = Record<string, any>;
29
+ /** The identity fields shared by every event derived from one source line. */
30
+ export type EventBase = {
31
+ sourceType: string | null;
32
+ role: string | null;
33
+ eventUuid: string | null;
34
+ parentUuid: string | null;
35
+ isSidechain: boolean;
36
+ tsSource: string | null;
37
+ tsUtc: string | null;
38
+ };
39
+ /** One conversational unit within a line. `text` is masked by the walker. */
40
+ export type Block = {
41
+ kind: EventKind;
42
+ text: string;
43
+ toolName?: string | null;
44
+ /** Index of the originating block in the source line; defaults to position. */
45
+ blockIndex?: number;
46
+ };
47
+ export type MappedLine = {
48
+ base: EventBase;
49
+ blocks: Block[];
50
+ };
51
+ /**
52
+ * Turns one parsed JSON line into its identity + blocks. Returning zero blocks is
53
+ * allowed; the walker still records an ordered placeholder so seq never gaps.
54
+ */
55
+ export type LineMapper = (obj: Obj, sessionIds: Set<string>) => MappedLine;
56
+ export declare function normalizeTs(ts: unknown): string | null;
57
+ /** `name {json args}` — the shape pyramid.ts's FILE_RE / COMMAND_RE read facts out of. */
58
+ export declare function digestArgs(name: string, args: unknown): string;
59
+ /** Collapse a Claude/Gemini-style content array (or plain string) to text. */
60
+ export declare function contentText(content: unknown, sep?: string): string;
61
+ export declare const EMPTY_BASE: EventBase;
62
+ /**
63
+ * Walk an L0 JSONL buffer, delegating each parsed line to `mapLine`.
64
+ * Byte-addressed, order-preserving and drift-safe; never throws on bad input.
65
+ */
66
+ export declare function walkJsonl(buf: Buffer, mapLine: LineMapper): ParseResult;
67
+ //# sourceMappingURL=jsonl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl.d.ts","sourceRoot":"","sources":["../../../src/transcripts/adapters/jsonl.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAIF,eAAO,MAAM,cAAc,QAAkB,CAAC;AAC9C,eAAO,MAAM,cAAc,SAAU,CAAC;AACtC,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAGrC,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEtC,8EAA8E;AAC9E,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,6EAA6E;AAC7E,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,KAAK,EAAE,CAAA;CAAE,CAAC;AAE9D;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,UAAU,CAAC;AAE3E,wBAAgB,WAAW,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAItD;AAED,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAK9D;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,SAAK,GAAG,MAAM,CAW9D;AAED,eAAO,MAAM,UAAU,EAAE,SAGxB,CAAC;AA2BF;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,WAAW,CA4CvE"}
@@ -0,0 +1,138 @@
1
+ // Shared JSONL line-walker for every transcript adapter (VERSION-3 item 6).
2
+ //
3
+ // All three host CLIs write line-delimited JSON, and the parts that MUST behave
4
+ // identically across them are exactly the parts that are easy to get subtly
5
+ // wrong per-adapter:
6
+ // • raw_offset/raw_length are byte offsets into the UNCOMPRESSED L0 buffer —
7
+ // expand.ts slices L0 with them, so an off-by-one here is a wrong quote;
8
+ // • seq is dense and monotonic across the whole file (the TOC, segments and
9
+ // from_seq/to_seq expansion all assume no gaps);
10
+ // • nothing is ever dropped — an oversized or malformed line still produces an
11
+ // ordered event, so format drift degrades instead of losing data;
12
+ // • text is ALWAYS masked before it leaves the adapter.
13
+ //
14
+ // An adapter therefore describes each line declaratively — an identity `base`
15
+ // plus the blocks that line contains — and the walk, the guards, the masking and
16
+ // the bookkeeping live here once.
17
+ import { mask } from '../mask.js';
18
+ // Lines above this are recorded but not JSON-parsed (guards against a crafted
19
+ // giant line). Individual event text is also capped.
20
+ export const MAX_LINE_BYTES = 4 * 1024 * 1024;
21
+ export const MAX_TEXT_CHARS = 100_000;
22
+ export const TOOL_DIGEST_CHARS = 500;
23
+ export function normalizeTs(ts) {
24
+ if (typeof ts !== 'string')
25
+ return null;
26
+ const d = Date.parse(ts);
27
+ return Number.isNaN(d) ? null : new Date(d).toISOString();
28
+ }
29
+ /** `name {json args}` — the shape pyramid.ts's FILE_RE / COMMAND_RE read facts out of. */
30
+ export function digestArgs(name, args) {
31
+ let input = '';
32
+ if (typeof args === 'string')
33
+ input = args;
34
+ else {
35
+ try {
36
+ input = JSON.stringify(args ?? {});
37
+ }
38
+ catch {
39
+ input = '';
40
+ }
41
+ }
42
+ return `${name} ${input}`.slice(0, TOOL_DIGEST_CHARS);
43
+ }
44
+ /** Collapse a Claude/Gemini-style content array (or plain string) to text. */
45
+ export function contentText(content, sep = '') {
46
+ if (typeof content === 'string')
47
+ return content;
48
+ if (Array.isArray(content)) {
49
+ return content
50
+ .map((x) => (x && typeof x === 'object' && typeof x.text === 'string' ? x.text : ''))
51
+ .join(sep);
52
+ }
53
+ if (content && typeof content === 'object') {
54
+ try {
55
+ return JSON.stringify(content);
56
+ }
57
+ catch {
58
+ return '';
59
+ }
60
+ }
61
+ return '';
62
+ }
63
+ export const EMPTY_BASE = {
64
+ sourceType: null, role: null, eventUuid: null, parentUuid: null,
65
+ isSidechain: false, tsSource: null, tsUtc: null,
66
+ };
67
+ function emit(out, base, blocks, lineIndex, rawOffset, rawLength) {
68
+ blocks.forEach((b, i) => {
69
+ const m = mask((b.text ?? '').slice(0, MAX_TEXT_CHARS));
70
+ out.push({
71
+ ...base,
72
+ seq: 0,
73
+ lineIndex,
74
+ blockIndex: b.blockIndex ?? i,
75
+ kind: b.kind,
76
+ toolName: b.toolName ?? null,
77
+ text: m.text,
78
+ secretCount: m.count,
79
+ rawOffset,
80
+ rawLength,
81
+ });
82
+ });
83
+ }
84
+ /**
85
+ * Walk an L0 JSONL buffer, delegating each parsed line to `mapLine`.
86
+ * Byte-addressed, order-preserving and drift-safe; never throws on bad input.
87
+ */
88
+ export function walkJsonl(buf, mapLine) {
89
+ const events = [];
90
+ const sessionIds = new Set();
91
+ let secretsRedacted = 0;
92
+ let seq = 0;
93
+ let lineIndex = 0;
94
+ let pos = 0;
95
+ const len = buf.length;
96
+ while (pos < len) {
97
+ let nl = buf.indexOf(0x0a, pos);
98
+ if (nl === -1)
99
+ nl = len;
100
+ const start = pos;
101
+ const end = nl; // exclusive; excludes the newline
102
+ const rawLength = end - start;
103
+ pos = nl + 1;
104
+ const li = lineIndex++;
105
+ if (rawLength === 0)
106
+ continue; // blank line
107
+ const emitted = [];
108
+ if (rawLength > MAX_LINE_BYTES) {
109
+ emit(emitted, { ...EMPTY_BASE, sourceType: '(oversized)' }, [{ kind: 'unknown', text: '' }], li, start, rawLength);
110
+ }
111
+ else {
112
+ const lineStr = buf.toString('utf8', start, end);
113
+ let obj = null;
114
+ try {
115
+ obj = JSON.parse(lineStr);
116
+ }
117
+ catch {
118
+ obj = null;
119
+ }
120
+ if (!obj || typeof obj !== 'object') {
121
+ emit(emitted, { ...EMPTY_BASE, sourceType: '(unparsed)' }, [{ kind: 'unknown', text: '' }], li, start, rawLength);
122
+ }
123
+ else {
124
+ const mapped = mapLine(obj, sessionIds);
125
+ // Never drop a line: a mapper that produced nothing still owes one event.
126
+ const blocks = mapped.blocks.length > 0 ? mapped.blocks : [{ kind: 'unknown', text: '' }];
127
+ emit(emitted, mapped.base, blocks, li, start, rawLength);
128
+ }
129
+ }
130
+ for (const e of emitted) {
131
+ e.seq = seq++;
132
+ secretsRedacted += e.secretCount;
133
+ events.push(e);
134
+ }
135
+ }
136
+ return { events, sessionIds, secretsRedacted };
137
+ }
138
+ //# sourceMappingURL=jsonl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl.js","sourceRoot":"","sources":["../../../src/transcripts/adapters/jsonl.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/transcripts/archive.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C,eAAO,MAAM,gBAAgB,QAAoB,CAAC;AAElD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;AAE3E,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,wBAAgB,UAAU,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,SAAW,GAAG,UAAU,GAAG,IAAI,CAKxF;AAcD,wBAAsB,cAAc,CAAC,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAsEtF"}
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/transcripts/archive.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C,eAAO,MAAM,gBAAgB,QAAoB,CAAC;AAElD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;AAE3E,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,wBAAgB,UAAU,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,SAAW,GAAG,UAAU,GAAG,IAAI,CAKxF;AAcD,wBAAsB,cAAc,CAAC,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAsEtF"}
@@ -16,6 +16,7 @@ import { join } from 'node:path';
16
16
  import { archiveDir, getTranscriptsDb, transcriptsAvailable } from './store.js';
17
17
  import { getSessionMapping, latestMappingForProject } from './mapping.js';
18
18
  import { normalizeProjectDir } from '../memory/local.js';
19
+ import { formatHint as formatHintFor } from './adapters/index.js';
19
20
  // Above this raw size we skip capture with a warning rather than gzip a monster
20
21
  // transcript on the save path. 128 MB is already an enormous single session.
21
22
  export const MAX_SOURCE_BYTES = 128 * 1024 * 1024;
@@ -74,7 +75,7 @@ export async function captureSession(opts = {}) {
74
75
  const db = getTranscriptsDb();
75
76
  const now = new Date().toISOString();
76
77
  const proj = opts.projectDir ? normalizeProjectDir(opts.projectDir) : mapping.project_dir;
77
- const formatHint = source === 'claude' ? 'claude-jsonl' : source;
78
+ const formatHint = formatHintFor(source);
78
79
  const id = existing?.id ?? randomUUID();
79
80
  if (existing) {
80
81
  // Content changed (grew): overwrite the row, reset the index watermark AND
@@ -1 +1 @@
1
- {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/transcripts/archive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/transcripts/archive.ts"],"names":[],"mappings":"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"}