@blulotus/trellis-core 0.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.
Files changed (218) hide show
  1. package/LICENSE +235 -0
  2. package/dist/channel/api/assert.d.ts +3 -0
  3. package/dist/channel/api/assert.d.ts.map +1 -0
  4. package/dist/channel/api/assert.js +11 -0
  5. package/dist/channel/api/assert.js.map +1 -0
  6. package/dist/channel/api/context.d.ts +21 -0
  7. package/dist/channel/api/context.d.ts.map +1 -0
  8. package/dist/channel/api/context.js +99 -0
  9. package/dist/channel/api/context.js.map +1 -0
  10. package/dist/channel/api/create.d.ts +9 -0
  11. package/dist/channel/api/create.d.ts.map +1 -0
  12. package/dist/channel/api/create.js +104 -0
  13. package/dist/channel/api/create.js.map +1 -0
  14. package/dist/channel/api/inbox.d.ts +51 -0
  15. package/dist/channel/api/inbox.d.ts.map +1 -0
  16. package/dist/channel/api/inbox.js +176 -0
  17. package/dist/channel/api/inbox.js.map +1 -0
  18. package/dist/channel/api/interrupt.d.ts +31 -0
  19. package/dist/channel/api/interrupt.d.ts.map +1 -0
  20. package/dist/channel/api/interrupt.js +102 -0
  21. package/dist/channel/api/interrupt.js.map +1 -0
  22. package/dist/channel/api/post-thread.d.ts +14 -0
  23. package/dist/channel/api/post-thread.d.ts.map +1 -0
  24. package/dist/channel/api/post-thread.js +109 -0
  25. package/dist/channel/api/post-thread.js.map +1 -0
  26. package/dist/channel/api/read.d.ts +17 -0
  27. package/dist/channel/api/read.d.ts.map +1 -0
  28. package/dist/channel/api/read.js +44 -0
  29. package/dist/channel/api/read.js.map +1 -0
  30. package/dist/channel/api/resolve.d.ts +21 -0
  31. package/dist/channel/api/resolve.d.ts.map +1 -0
  32. package/dist/channel/api/resolve.js +28 -0
  33. package/dist/channel/api/resolve.js.map +1 -0
  34. package/dist/channel/api/runtime.d.ts +70 -0
  35. package/dist/channel/api/runtime.d.ts.map +1 -0
  36. package/dist/channel/api/runtime.js +11 -0
  37. package/dist/channel/api/runtime.js.map +1 -0
  38. package/dist/channel/api/send.d.ts +4 -0
  39. package/dist/channel/api/send.d.ts.map +1 -0
  40. package/dist/channel/api/send.js +52 -0
  41. package/dist/channel/api/send.js.map +1 -0
  42. package/dist/channel/api/spawn.d.ts +13 -0
  43. package/dist/channel/api/spawn.d.ts.map +1 -0
  44. package/dist/channel/api/spawn.js +54 -0
  45. package/dist/channel/api/spawn.js.map +1 -0
  46. package/dist/channel/api/title.d.ts +5 -0
  47. package/dist/channel/api/title.d.ts.map +1 -0
  48. package/dist/channel/api/title.js +40 -0
  49. package/dist/channel/api/title.js.map +1 -0
  50. package/dist/channel/api/types.d.ts +65 -0
  51. package/dist/channel/api/types.d.ts.map +1 -0
  52. package/dist/channel/api/types.js +2 -0
  53. package/dist/channel/api/types.js.map +1 -0
  54. package/dist/channel/api/watch-channels.d.ts +40 -0
  55. package/dist/channel/api/watch-channels.d.ts.map +1 -0
  56. package/dist/channel/api/watch-channels.js +143 -0
  57. package/dist/channel/api/watch-channels.js.map +1 -0
  58. package/dist/channel/api/watch.d.ts +11 -0
  59. package/dist/channel/api/watch.d.ts.map +1 -0
  60. package/dist/channel/api/watch.js +17 -0
  61. package/dist/channel/api/watch.js.map +1 -0
  62. package/dist/channel/api/workers.d.ts +69 -0
  63. package/dist/channel/api/workers.d.ts.map +1 -0
  64. package/dist/channel/api/workers.js +145 -0
  65. package/dist/channel/api/workers.js.map +1 -0
  66. package/dist/channel/index.d.ts +38 -0
  67. package/dist/channel/index.d.ts.map +1 -0
  68. package/dist/channel/index.js +23 -0
  69. package/dist/channel/index.js.map +1 -0
  70. package/dist/channel/internal/store/channel-metadata.d.ts +23 -0
  71. package/dist/channel/internal/store/channel-metadata.d.ts.map +1 -0
  72. package/dist/channel/internal/store/channel-metadata.js +94 -0
  73. package/dist/channel/internal/store/channel-metadata.js.map +1 -0
  74. package/dist/channel/internal/store/delivery.d.ts +27 -0
  75. package/dist/channel/internal/store/delivery.d.ts.map +1 -0
  76. package/dist/channel/internal/store/delivery.js +37 -0
  77. package/dist/channel/internal/store/delivery.js.map +1 -0
  78. package/dist/channel/internal/store/events.d.ts +215 -0
  79. package/dist/channel/internal/store/events.d.ts.map +1 -0
  80. package/dist/channel/internal/store/events.js +206 -0
  81. package/dist/channel/internal/store/events.js.map +1 -0
  82. package/dist/channel/internal/store/filter.d.ts +21 -0
  83. package/dist/channel/internal/store/filter.d.ts.map +1 -0
  84. package/dist/channel/internal/store/filter.js +75 -0
  85. package/dist/channel/internal/store/filter.js.map +1 -0
  86. package/dist/channel/internal/store/inbox.d.ts +17 -0
  87. package/dist/channel/internal/store/inbox.d.ts.map +1 -0
  88. package/dist/channel/internal/store/inbox.js +30 -0
  89. package/dist/channel/internal/store/inbox.js.map +1 -0
  90. package/dist/channel/internal/store/lock.d.ts +17 -0
  91. package/dist/channel/internal/store/lock.d.ts.map +1 -0
  92. package/dist/channel/internal/store/lock.js +88 -0
  93. package/dist/channel/internal/store/lock.js.map +1 -0
  94. package/dist/channel/internal/store/paths.d.ts +57 -0
  95. package/dist/channel/internal/store/paths.d.ts.map +1 -0
  96. package/dist/channel/internal/store/paths.js +264 -0
  97. package/dist/channel/internal/store/paths.js.map +1 -0
  98. package/dist/channel/internal/store/schema.d.ts +77 -0
  99. package/dist/channel/internal/store/schema.d.ts.map +1 -0
  100. package/dist/channel/internal/store/schema.js +127 -0
  101. package/dist/channel/internal/store/schema.js.map +1 -0
  102. package/dist/channel/internal/store/seq.d.ts +12 -0
  103. package/dist/channel/internal/store/seq.d.ts.map +1 -0
  104. package/dist/channel/internal/store/seq.js +133 -0
  105. package/dist/channel/internal/store/seq.js.map +1 -0
  106. package/dist/channel/internal/store/thread-state.d.ts +37 -0
  107. package/dist/channel/internal/store/thread-state.d.ts.map +1 -0
  108. package/dist/channel/internal/store/thread-state.js +206 -0
  109. package/dist/channel/internal/store/thread-state.js.map +1 -0
  110. package/dist/channel/internal/store/watch.d.ts +10 -0
  111. package/dist/channel/internal/store/watch.d.ts.map +1 -0
  112. package/dist/channel/internal/store/watch.js +122 -0
  113. package/dist/channel/internal/store/watch.js.map +1 -0
  114. package/dist/channel/internal/store/worker-state.d.ts +56 -0
  115. package/dist/channel/internal/store/worker-state.d.ts.map +1 -0
  116. package/dist/channel/internal/store/worker-state.js +220 -0
  117. package/dist/channel/internal/store/worker-state.js.map +1 -0
  118. package/dist/index.d.ts +3 -0
  119. package/dist/index.d.ts.map +1 -0
  120. package/dist/index.js +7 -0
  121. package/dist/index.js.map +1 -0
  122. package/dist/mem/adapters/claude.d.ts +22 -0
  123. package/dist/mem/adapters/claude.d.ts.map +1 -0
  124. package/dist/mem/adapters/claude.js +209 -0
  125. package/dist/mem/adapters/claude.js.map +1 -0
  126. package/dist/mem/adapters/codex.d.ts +55 -0
  127. package/dist/mem/adapters/codex.d.ts.map +1 -0
  128. package/dist/mem/adapters/codex.js +344 -0
  129. package/dist/mem/adapters/codex.js.map +1 -0
  130. package/dist/mem/adapters/grok.d.ts +41 -0
  131. package/dist/mem/adapters/grok.d.ts.map +1 -0
  132. package/dist/mem/adapters/grok.js +202 -0
  133. package/dist/mem/adapters/grok.js.map +1 -0
  134. package/dist/mem/adapters/opencode.d.ts +19 -0
  135. package/dist/mem/adapters/opencode.d.ts.map +1 -0
  136. package/dist/mem/adapters/opencode.js +25 -0
  137. package/dist/mem/adapters/opencode.js.map +1 -0
  138. package/dist/mem/adapters/pi.d.ts +24 -0
  139. package/dist/mem/adapters/pi.d.ts.map +1 -0
  140. package/dist/mem/adapters/pi.js +290 -0
  141. package/dist/mem/adapters/pi.js.map +1 -0
  142. package/dist/mem/adapters/zcode.d.ts +76 -0
  143. package/dist/mem/adapters/zcode.d.ts.map +1 -0
  144. package/dist/mem/adapters/zcode.js +434 -0
  145. package/dist/mem/adapters/zcode.js.map +1 -0
  146. package/dist/mem/context.d.ts +23 -0
  147. package/dist/mem/context.d.ts.map +1 -0
  148. package/dist/mem/context.js +120 -0
  149. package/dist/mem/context.js.map +1 -0
  150. package/dist/mem/dialogue.d.ts +32 -0
  151. package/dist/mem/dialogue.d.ts.map +1 -0
  152. package/dist/mem/dialogue.js +0 -0
  153. package/dist/mem/dialogue.js.map +1 -0
  154. package/dist/mem/filter.d.ts +31 -0
  155. package/dist/mem/filter.d.ts.map +1 -0
  156. package/dist/mem/filter.js +66 -0
  157. package/dist/mem/filter.js.map +1 -0
  158. package/dist/mem/index.d.ts +18 -0
  159. package/dist/mem/index.d.ts.map +1 -0
  160. package/dist/mem/index.js +17 -0
  161. package/dist/mem/index.js.map +1 -0
  162. package/dist/mem/internal/jsonl.d.ts +35 -0
  163. package/dist/mem/internal/jsonl.d.ts.map +1 -0
  164. package/dist/mem/internal/jsonl.js +125 -0
  165. package/dist/mem/internal/jsonl.js.map +1 -0
  166. package/dist/mem/internal/paths.d.ts +38 -0
  167. package/dist/mem/internal/paths.d.ts.map +1 -0
  168. package/dist/mem/internal/paths.js +126 -0
  169. package/dist/mem/internal/paths.js.map +1 -0
  170. package/dist/mem/internal/sqlite-readonly.d.ts +77 -0
  171. package/dist/mem/internal/sqlite-readonly.d.ts.map +1 -0
  172. package/dist/mem/internal/sqlite-readonly.js +797 -0
  173. package/dist/mem/internal/sqlite-readonly.js.map +1 -0
  174. package/dist/mem/phase.d.ts +45 -0
  175. package/dist/mem/phase.d.ts.map +1 -0
  176. package/dist/mem/phase.js +220 -0
  177. package/dist/mem/phase.js.map +1 -0
  178. package/dist/mem/projects.d.ts +13 -0
  179. package/dist/mem/projects.d.ts.map +1 -0
  180. package/dist/mem/projects.js +47 -0
  181. package/dist/mem/projects.js.map +1 -0
  182. package/dist/mem/search.d.ts +39 -0
  183. package/dist/mem/search.d.ts.map +1 -0
  184. package/dist/mem/search.js +133 -0
  185. package/dist/mem/search.js.map +1 -0
  186. package/dist/mem/sessions.d.ts +38 -0
  187. package/dist/mem/sessions.d.ts.map +1 -0
  188. package/dist/mem/sessions.js +313 -0
  189. package/dist/mem/sessions.js.map +1 -0
  190. package/dist/mem/types.d.ts +188 -0
  191. package/dist/mem/types.d.ts.map +1 -0
  192. package/dist/mem/types.js +10 -0
  193. package/dist/mem/types.js.map +1 -0
  194. package/dist/task/index.d.ts +9 -0
  195. package/dist/task/index.d.ts.map +1 -0
  196. package/dist/task/index.js +9 -0
  197. package/dist/task/index.js.map +1 -0
  198. package/dist/task/paths.d.ts +37 -0
  199. package/dist/task/paths.d.ts.map +1 -0
  200. package/dist/task/paths.js +49 -0
  201. package/dist/task/paths.js.map +1 -0
  202. package/dist/task/phase.d.ts +27 -0
  203. package/dist/task/phase.d.ts.map +1 -0
  204. package/dist/task/phase.js +24 -0
  205. package/dist/task/phase.js.map +1 -0
  206. package/dist/task/records.d.ts +39 -0
  207. package/dist/task/records.d.ts.map +1 -0
  208. package/dist/task/records.js +89 -0
  209. package/dist/task/records.js.map +1 -0
  210. package/dist/task/schema.d.ts +77 -0
  211. package/dist/task/schema.d.ts.map +1 -0
  212. package/dist/task/schema.js +220 -0
  213. package/dist/task/schema.js.map +1 -0
  214. package/dist/testing/index.d.ts +2 -0
  215. package/dist/testing/index.d.ts.map +1 -0
  216. package/dist/testing/index.js +4 -0
  217. package/dist/testing/index.js.map +1 -0
  218. package/package.json +77 -0
@@ -0,0 +1,344 @@
1
+ /**
2
+ * Persisted Codex session reader.
3
+ *
4
+ * Layout: `~/.codex/sessions/**\/rollout-<ts>-<id>.jsonl`. Metadata is read
5
+ * from the first event's `payload`; the filename timestamp is a fallback
6
+ * `created`.
7
+ *
8
+ * Compaction: a top-level `compacted` event marks where Codex cut its own
9
+ * context. Its `payload.replacement_history` is NOT a summary — measured over
10
+ * 1865 local rollouts it is a verbatim retained slice of the conversation
11
+ * (268k `message/user` items, 3 `message/assistant`). In a resumed session it
12
+ * is the only place the earlier conversation exists at all. So the boundary is
13
+ * marked, the already-collected turns are kept, and `replacement_history` is
14
+ * merged in with occurrence-counted dedupe — turns already in the pool are not
15
+ * re-added, turns only Codex retained are recovered.
16
+ *
17
+ * Multi-agent: `response_item` / `agent_message` events carry
18
+ * `Message Type: NEW_TASK | MESSAGE | FINAL_ANSWER` envelopes. Only
19
+ * `FINAL_ANSWER` has a plaintext payload; `NEW_TASK` / `MESSAGE` payloads are
20
+ * `encrypted_content` and cannot be read back, which is reported rather than
21
+ * papered over. `event_msg` / `agent_message` is a byte-identical duplicate of
22
+ * the following `response_item` / `message` / `assistant` and stays excluded.
23
+ */
24
+ import * as fs from "node:fs";
25
+ import * as path from "node:path";
26
+ import { compactionBoundaryTurn, stripInjectionTags, isBootstrapTurn, turnKey, } from "../dialogue.js";
27
+ import { inRangeOverlap, sameProject } from "../filter.js";
28
+ import { readJsonl, readJsonlFirst } from "../internal/jsonl.js";
29
+ import { CODEX_SESSIONS, walkDir } from "../internal/paths.js";
30
+ import { parseTaskPyCommandsAll } from "../phase.js";
31
+ import { searchInDialogue } from "../search.js";
32
+ function parseDialogueRole(v) {
33
+ return v === "user" || v === "assistant" ? v : undefined;
34
+ }
35
+ /**
36
+ * Recover the shell command string from a Codex `function_call` event's
37
+ * `arguments` field. Codex versions vary in how they encode it:
38
+ *
39
+ * - a raw shell string
40
+ * - a stringified JSON object with `cmd` / `command` (string) or
41
+ * `argv` (string[] — joined with spaces)
42
+ * - a raw object with the same `cmd` / `command` / `argv` shape
43
+ *
44
+ * Returns `undefined` when no command can be recovered.
45
+ */
46
+ export function commandFromCodexArguments(argsRaw) {
47
+ const fromObject = (obj) => {
48
+ const cmd = obj.cmd;
49
+ if (typeof cmd === "string")
50
+ return cmd;
51
+ const command = obj.command;
52
+ if (typeof command === "string")
53
+ return command;
54
+ const argv = obj.argv;
55
+ if (Array.isArray(argv)) {
56
+ const parts = argv.filter((a) => typeof a === "string");
57
+ if (parts.length)
58
+ return parts.join(" ");
59
+ }
60
+ return undefined;
61
+ };
62
+ if (typeof argsRaw === "string") {
63
+ try {
64
+ const parsed = JSON.parse(argsRaw);
65
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
66
+ return fromObject(parsed);
67
+ }
68
+ }
69
+ catch {
70
+ // Not JSON — some Codex versions inline the raw shell string.
71
+ return argsRaw;
72
+ }
73
+ return undefined;
74
+ }
75
+ if (argsRaw && typeof argsRaw === "object" && !Array.isArray(argsRaw)) {
76
+ return fromObject(argsRaw);
77
+ }
78
+ return undefined;
79
+ }
80
+ // ---------- list ----------
81
+ export function codexListSessions(f) {
82
+ if (!fs.existsSync(CODEX_SESSIONS))
83
+ return [];
84
+ const out = [];
85
+ for (const file of walkDir(CODEX_SESSIONS)) {
86
+ if (!file.endsWith(".jsonl"))
87
+ continue;
88
+ const base = path.basename(file, ".jsonl");
89
+ const m = base.match(/^rollout-(\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2})-(.+)$/);
90
+ const tsFromName = m?.[1]
91
+ ? new Date(m[1].replace(/T(\d{2})-(\d{2})-(\d{2})/, "T$1:$2:$3") + "Z").toISOString()
92
+ : undefined;
93
+ const first = readJsonlFirst(file);
94
+ const meta = first?.payload;
95
+ const id = meta?.id ?? m?.[2] ?? base;
96
+ const cwd = meta?.cwd;
97
+ const created = first?.timestamp ?? tsFromName ?? "";
98
+ if (f.cwd && !sameProject(cwd, f.cwd))
99
+ continue;
100
+ const updated = fs.statSync(file).mtime.toISOString();
101
+ if (!inRangeOverlap(created, updated, f))
102
+ continue;
103
+ out.push({
104
+ platform: "codex",
105
+ id,
106
+ cwd,
107
+ created,
108
+ updated,
109
+ filePath: file,
110
+ });
111
+ }
112
+ return out;
113
+ }
114
+ // ---------- extract ----------
115
+ function buildTurnFromMessage(role, parts) {
116
+ const collected = [];
117
+ let totalRaw = 0;
118
+ for (const c of parts ?? []) {
119
+ const txt = c.text;
120
+ if (typeof txt !== "string")
121
+ continue;
122
+ if (c.type !== "input_text" && c.type !== "output_text")
123
+ continue;
124
+ totalRaw += txt.length;
125
+ const cleaned = stripInjectionTags(txt);
126
+ if (cleaned)
127
+ collected.push(cleaned);
128
+ }
129
+ if (!collected.length)
130
+ return null;
131
+ const merged = collected.join("\n\n");
132
+ if (isBootstrapTurn(merged, totalRaw))
133
+ return null;
134
+ return { role, text: merged };
135
+ }
136
+ /**
137
+ * Turn pool with occurrence-counted dedupe.
138
+ *
139
+ * A plain `Set` of texts would be wrong: `ok` / `继续` are sent dozens of times
140
+ * in one real session and each is its own turn. Counting occurrences means a
141
+ * `replacement_history` copy of a turn already in the pool is skipped exactly
142
+ * once per copy, and genuine repeats survive.
143
+ */
144
+ class CodexTurnPool {
145
+ turns = [];
146
+ counts = new Map();
147
+ push(turn) {
148
+ this.turns.push(turn);
149
+ this.bump(turn);
150
+ }
151
+ get length() {
152
+ return this.turns.length;
153
+ }
154
+ toArray() {
155
+ return this.turns;
156
+ }
157
+ bump(turn) {
158
+ if (turn.kind === "marker")
159
+ return;
160
+ const k = turnKey(turn);
161
+ this.counts.set(k, (this.counts.get(k) ?? 0) + 1);
162
+ }
163
+ /**
164
+ * Merge the dialogue Codex retained across a compaction. Anything already in
165
+ * the pool is dropped; the rest is inserted ahead of the collected turns,
166
+ * because retained history is chronologically the prefix of what this file
167
+ * shows. Returns the recovered turns so the caller can shift event indices.
168
+ *
169
+ * On a second or later compaction, "ahead of everything" also puts recovered
170
+ * turns ahead of the earlier boundary marker, which is only an approximation
171
+ * of where they belong. Measured over the 365 local rollouts with two or more
172
+ * compactions: 32 items are recovered that late and all 32 are re-injected
173
+ * AGENTS.md / plugin preamble, not dialogue. Revisit if that ever changes.
174
+ */
175
+ absorbRetainedHistory(items) {
176
+ const consumed = new Map();
177
+ const recovered = [];
178
+ for (const item of items) {
179
+ if (item.type !== "message")
180
+ continue;
181
+ const role = parseDialogueRole(item.role);
182
+ if (!role)
183
+ continue;
184
+ const turn = buildTurnFromMessage(role, item.content);
185
+ if (!turn)
186
+ continue;
187
+ const k = turnKey(turn);
188
+ const alreadyInPool = this.counts.get(k) ?? 0;
189
+ const used = consumed.get(k) ?? 0;
190
+ if (used < alreadyInPool) {
191
+ consumed.set(k, used + 1);
192
+ continue;
193
+ }
194
+ recovered.push(turn);
195
+ consumed.set(k, used + 1);
196
+ }
197
+ if (recovered.length > 0) {
198
+ this.turns = [...recovered, ...this.turns];
199
+ for (const turn of recovered)
200
+ this.bump(turn);
201
+ }
202
+ return recovered;
203
+ }
204
+ }
205
+ /** Inter-agent envelope header, e.g. `Message Type: FINAL_ANSWER`. */
206
+ const AGENT_ENVELOPE_KIND = /^Message Type:\s*(\S+)/;
207
+ /**
208
+ * Parse a `response_item` / `agent_message` envelope. The `input_text` part is
209
+ * always the header (`Message Type` / `Task name` / `Sender` / `Payload:`); the
210
+ * payload follows `Payload:` when it is plaintext, and sits in a sibling
211
+ * `encrypted_content` part when it is not.
212
+ */
213
+ function parseCodexAgentEnvelope(parts) {
214
+ let header = "";
215
+ let encrypted = false;
216
+ for (const part of parts ?? []) {
217
+ if (part.type === "encrypted_content") {
218
+ encrypted = true;
219
+ continue;
220
+ }
221
+ if (part.type !== "input_text" && part.type !== "output_text")
222
+ continue;
223
+ if (typeof part.text === "string")
224
+ header += part.text;
225
+ }
226
+ if (!header)
227
+ return null;
228
+ const kind = AGENT_ENVELOPE_KIND.exec(header)?.[1];
229
+ if (!kind)
230
+ return null;
231
+ const marker = header.indexOf("Payload:");
232
+ const body = marker === -1 ? "" : header.slice(marker + "Payload:".length);
233
+ return { kind, body: body.trim(), encrypted };
234
+ }
235
+ /**
236
+ * A `FINAL_ANSWER` travels sub-agent → parent, so from the reading session's
237
+ * point of view it is assistant output; every other envelope is an instruction
238
+ * flowing towards an agent, i.e. the user side.
239
+ */
240
+ function agentEnvelopeRole(kind) {
241
+ return kind === "FINAL_ANSWER" ? "assistant" : "user";
242
+ }
243
+ const WARN_ENCRYPTED_INTER_AGENT = "codex-inter-agent-encrypted";
244
+ const WARN_COMPACTION_LOSSY = "codex-compaction-assistant-dropped";
245
+ function pushWarningOnce(warnings, code, message) {
246
+ if (!warnings)
247
+ return;
248
+ if (warnings.some((w) => w.code === code))
249
+ return;
250
+ warnings.push({ code, message });
251
+ }
252
+ export function codexExtractDialogue(s, warnings) {
253
+ return collectCodexTurnsAndEvents(s, warnings).turns;
254
+ }
255
+ export function codexSearch(s, kw) {
256
+ // No warnings sink: search fans out over the whole corpus and a per-session
257
+ // notice would be printed thousands of times.
258
+ return searchInDialogue(codexExtractDialogue(s), kw);
259
+ }
260
+ /**
261
+ * Codex twin of `collectClaudeTurnsAndEvents`. Single pass over the rollout
262
+ * file; emits both the cleaned dialogue turns and the list of
263
+ * `task.py create|start` invocations found inside `function_call` events whose
264
+ * `name === "exec_command"` (or `"shell"`).
265
+ *
266
+ * Compaction keeps everything: collected turns stay, retained history is merged
267
+ * ahead of them, and a boundary marker records the cut. Event `turnIndex`es
268
+ * recorded before a compaction are shifted by the number of recovered turns so
269
+ * brainstorm windows keep pointing at the same conversation.
270
+ */
271
+ export function collectCodexTurnsAndEvents(s, warnings) {
272
+ const pool = new CodexTurnPool();
273
+ const events = [];
274
+ let encryptedInterAgent = 0;
275
+ readJsonl(s.filePath, (obj) => {
276
+ if (obj.type === "compacted") {
277
+ const rh = obj.payload?.replacement_history;
278
+ const recovered = Array.isArray(rh) ? pool.absorbRetainedHistory(rh) : [];
279
+ if (recovered.length > 0) {
280
+ for (const ev of events)
281
+ ev.turnIndex += recovered.length;
282
+ if (!recovered.some((t) => t.role === "assistant")) {
283
+ pushWarningOnce(warnings, WARN_COMPACTION_LOSSY, `session ${s.id}: recovered ${recovered.length} pre-compaction turn(s) from Codex's retained history, but it retains user messages only — assistant replies from before the boundary are not in this file.`);
284
+ }
285
+ }
286
+ pool.push(compactionBoundaryTurn(recovered.length > 0
287
+ ? `context compacted here; ${recovered.length} earlier turn(s) recovered from the platform's retained history`
288
+ : `context compacted here; the platform's retained history added nothing beyond the turns above`));
289
+ return;
290
+ }
291
+ const p = obj.payload;
292
+ if (!p)
293
+ return;
294
+ if (p.type === "agent_message" && obj.type === "response_item") {
295
+ const envelope = parseCodexAgentEnvelope(p.content);
296
+ if (!envelope)
297
+ return;
298
+ if (!envelope.body) {
299
+ if (envelope.encrypted)
300
+ encryptedInterAgent++;
301
+ return;
302
+ }
303
+ const cleaned = stripInjectionTags(envelope.body);
304
+ if (!cleaned)
305
+ return;
306
+ pool.push({ role: agentEnvelopeRole(envelope.kind), text: cleaned });
307
+ return;
308
+ }
309
+ if (p.type === "function_call") {
310
+ const fnName = p.name;
311
+ if (fnName !== "exec_command" && fnName !== "shell")
312
+ return;
313
+ const cmd = commandFromCodexArguments(p.arguments);
314
+ if (!cmd)
315
+ return;
316
+ const parsedAll = parseTaskPyCommandsAll(cmd);
317
+ for (const parsed of parsedAll) {
318
+ const ev = {
319
+ action: parsed.action,
320
+ timestamp: obj.timestamp ?? "",
321
+ turnIndex: pool.length,
322
+ ...(parsed.action === "create"
323
+ ? { slug: parsed.slug }
324
+ : { taskDir: parsed.taskDir }),
325
+ };
326
+ events.push(ev);
327
+ }
328
+ return;
329
+ }
330
+ if (p.type !== "message")
331
+ return;
332
+ const role = parseDialogueRole(p.role);
333
+ if (!role)
334
+ return;
335
+ const turn = buildTurnFromMessage(role, p.content);
336
+ if (turn)
337
+ pool.push(turn);
338
+ });
339
+ if (encryptedInterAgent > 0) {
340
+ pushWarningOnce(warnings, WARN_ENCRYPTED_INTER_AGENT, `session ${s.id}: ${encryptedInterAgent} inter-agent message payload(s) are stored encrypted by Codex and cannot be read back — the instructions driving this multi-agent run are not recoverable from the rollout.`);
341
+ }
342
+ return { turns: pool.toArray(), events };
343
+ }
344
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/mem/adapters/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Persisted Grok CLI session reader.
3
+ *
4
+ * Layout: `~/.grok/sessions/<url-encoded-cwd>/<session-id>/chat_history.jsonl`,
5
+ * with per-session metadata in the sibling `summary.json` (`info.id`,
6
+ * `info.cwd`, `session_summary`, `created_at`, `updated_at`).
7
+ *
8
+ * No database. The sibling `session_search.sqlite` is Grok's own search index
9
+ * and is deliberately ignored — the OpenCode reader was reverted in
10
+ * 0.6.0-beta.4 because a native SQLite dependency broke Windows installs, and
11
+ * nothing here needs one.
12
+ *
13
+ * Event shape — top-level `type`:
14
+ * user dialogue, unless it carries `synthetic_reason` (injected
15
+ * reminders, project instructions, background-task notices)
16
+ * assistant dialogue; `content` is a plain string
17
+ * reasoning dropped (encrypted chain-of-thought)
18
+ * tool_result dropped
19
+ * system dropped (system prompt)
20
+ * backend_tool_call dropped
21
+ *
22
+ * Compaction: Grok injects a `synthetic_reason: "compaction_meta"` user event
23
+ * and starts the file from the compacted state. The turns before it are NOT in
24
+ * `chat_history.jsonl`, and the sibling `compaction_checkpoints/*.json` holds
25
+ * the post-compaction seed rather than the lost history — so this adapter marks
26
+ * the boundary and warns instead of pretending the session is whole.
27
+ */
28
+ import type { DialogueTurn, MemFilter, MemSessionInfo, MemWarning, SearchHit, TaskPyEvent } from "../types.js";
29
+ export declare function grokListSessions(f: MemFilter): MemSessionInfo[];
30
+ export declare function grokExtractDialogue(s: MemSessionInfo, warnings?: MemWarning[]): DialogueTurn[];
31
+ export declare function grokSearch(s: MemSessionInfo, kw: string): SearchHit;
32
+ /**
33
+ * Single pass over `chat_history.jsonl`: cleaned dialogue turns plus the
34
+ * `task.py create|start` invocations found in `run_terminal_command` tool
35
+ * calls, which is what `--phase` slicing needs.
36
+ */
37
+ export declare function collectGrokTurnsAndEvents(s: MemSessionInfo, warnings?: MemWarning[]): {
38
+ turns: DialogueTurn[];
39
+ events: TaskPyEvent[];
40
+ };
41
+ //# sourceMappingURL=grok.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grok.d.ts","sourceRoot":"","sources":["../../../src/mem/adapters/grok.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAeH,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,cAAc,EACd,UAAU,EACV,SAAS,EACT,WAAW,EACZ,MAAM,aAAa,CAAC;AA0ErB,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,GAAG,cAAc,EAAE,CAoC/D;AAuBD,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,cAAc,EACjB,QAAQ,CAAC,EAAE,UAAU,EAAE,GACtB,YAAY,EAAE,CAEhB;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAGnE;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,CAAC,EAAE,cAAc,EACjB,QAAQ,CAAC,EAAE,UAAU,EAAE,GACtB;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,CA6DlD"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Persisted Grok CLI session reader.
3
+ *
4
+ * Layout: `~/.grok/sessions/<url-encoded-cwd>/<session-id>/chat_history.jsonl`,
5
+ * with per-session metadata in the sibling `summary.json` (`info.id`,
6
+ * `info.cwd`, `session_summary`, `created_at`, `updated_at`).
7
+ *
8
+ * No database. The sibling `session_search.sqlite` is Grok's own search index
9
+ * and is deliberately ignored — the OpenCode reader was reverted in
10
+ * 0.6.0-beta.4 because a native SQLite dependency broke Windows installs, and
11
+ * nothing here needs one.
12
+ *
13
+ * Event shape — top-level `type`:
14
+ * user dialogue, unless it carries `synthetic_reason` (injected
15
+ * reminders, project instructions, background-task notices)
16
+ * assistant dialogue; `content` is a plain string
17
+ * reasoning dropped (encrypted chain-of-thought)
18
+ * tool_result dropped
19
+ * system dropped (system prompt)
20
+ * backend_tool_call dropped
21
+ *
22
+ * Compaction: Grok injects a `synthetic_reason: "compaction_meta"` user event
23
+ * and starts the file from the compacted state. The turns before it are NOT in
24
+ * `chat_history.jsonl`, and the sibling `compaction_checkpoints/*.json` holds
25
+ * the post-compaction seed rather than the lost history — so this adapter marks
26
+ * the boundary and warns instead of pretending the session is whole.
27
+ */
28
+ import * as fs from "node:fs";
29
+ import * as path from "node:path";
30
+ import { compactionBoundaryTurn, stripInjectionTags, isBootstrapTurn, } from "../dialogue.js";
31
+ import { inRangeOverlap, sameProject } from "../filter.js";
32
+ import { readJsonFile, readJsonl } from "../internal/jsonl.js";
33
+ import { GROK_SESSIONS, grokCwdFromProjectDir } from "../internal/paths.js";
34
+ import { parseTaskPyCommandsAll } from "../phase.js";
35
+ import { searchInDialogue } from "../search.js";
36
+ // Grok encodes tool-call `arguments` exactly like Codex does — a JSON string
37
+ // carrying `command` — so the same defensive recovery applies.
38
+ import { commandFromCodexArguments } from "./codex.js";
39
+ const CHAT_HISTORY = "chat_history.jsonl";
40
+ const COMPACTION_META = "compaction_meta";
41
+ const WARN_COMPACTION_UNRECOVERABLE = "grok-compaction-unrecoverable";
42
+ // ---------- list ----------
43
+ /** Yield `<projectDir>/<sessionDir>` pairs that contain a chat history. */
44
+ function* grokSessionDirs(f) {
45
+ if (!fs.existsSync(GROK_SESSIONS))
46
+ return;
47
+ let projects;
48
+ try {
49
+ projects = fs.readdirSync(GROK_SESSIONS, { withFileTypes: true });
50
+ }
51
+ catch {
52
+ return;
53
+ }
54
+ for (const project of projects) {
55
+ if (!project.isDirectory())
56
+ continue;
57
+ // Fast path: the dir name is the cwd, so an out-of-scope project can be
58
+ // skipped without touching its sessions.
59
+ if (f.cwd) {
60
+ const cwd = grokCwdFromProjectDir(project.name);
61
+ if (!sameProject(cwd, f.cwd))
62
+ continue;
63
+ }
64
+ const projectDir = path.join(GROK_SESSIONS, project.name);
65
+ let sessions;
66
+ try {
67
+ sessions = fs.readdirSync(projectDir, { withFileTypes: true });
68
+ }
69
+ catch {
70
+ continue;
71
+ }
72
+ for (const session of sessions) {
73
+ if (!session.isDirectory())
74
+ continue;
75
+ const sessionDir = path.join(projectDir, session.name);
76
+ if (!fs.existsSync(path.join(sessionDir, CHAT_HISTORY)))
77
+ continue;
78
+ yield { projectDir, sessionDir };
79
+ }
80
+ }
81
+ }
82
+ export function grokListSessions(f) {
83
+ const out = [];
84
+ for (const { projectDir, sessionDir } of grokSessionDirs(f)) {
85
+ const filePath = path.join(sessionDir, CHAT_HISTORY);
86
+ const summary = readJsonFile(path.join(sessionDir, "summary.json"));
87
+ const id = summary?.info?.id ?? path.basename(sessionDir);
88
+ const cwd = summary?.info?.cwd ?? grokCwdFromProjectDir(path.basename(projectDir));
89
+ if (f.cwd && !sameProject(cwd, f.cwd))
90
+ continue;
91
+ const created = summary?.created_at;
92
+ let updated = summary?.updated_at;
93
+ if (!updated) {
94
+ try {
95
+ updated = fs.statSync(filePath).mtime.toISOString();
96
+ }
97
+ catch {
98
+ updated = undefined;
99
+ }
100
+ }
101
+ if (!inRangeOverlap(created, updated, f))
102
+ continue;
103
+ const title = summary?.session_summary?.trim() ?? "";
104
+ out.push({
105
+ platform: "grok",
106
+ id,
107
+ title: title || undefined,
108
+ cwd,
109
+ created,
110
+ updated,
111
+ filePath,
112
+ });
113
+ }
114
+ return out;
115
+ }
116
+ // ---------- extract ----------
117
+ function grokText(content) {
118
+ if (typeof content === "string") {
119
+ return { text: stripInjectionTags(content), rawLength: content.length };
120
+ }
121
+ if (!Array.isArray(content))
122
+ return { text: "", rawLength: 0 };
123
+ const parts = [];
124
+ let rawLength = 0;
125
+ for (const block of content) {
126
+ if (block.type !== "text" || typeof block.text !== "string")
127
+ continue;
128
+ rawLength += block.text.length;
129
+ const cleaned = stripInjectionTags(block.text);
130
+ if (cleaned)
131
+ parts.push(cleaned);
132
+ }
133
+ return { text: parts.join("\n\n"), rawLength };
134
+ }
135
+ export function grokExtractDialogue(s, warnings) {
136
+ return collectGrokTurnsAndEvents(s, warnings).turns;
137
+ }
138
+ export function grokSearch(s, kw) {
139
+ // No warnings sink on the search path — it fans out over the whole corpus.
140
+ return searchInDialogue(grokExtractDialogue(s), kw);
141
+ }
142
+ /**
143
+ * Single pass over `chat_history.jsonl`: cleaned dialogue turns plus the
144
+ * `task.py create|start` invocations found in `run_terminal_command` tool
145
+ * calls, which is what `--phase` slicing needs.
146
+ */
147
+ export function collectGrokTurnsAndEvents(s, warnings) {
148
+ const turns = [];
149
+ const events = [];
150
+ let compactions = 0;
151
+ readJsonl(s.filePath, (obj) => {
152
+ if (obj.type === "user") {
153
+ const reason = obj.synthetic_reason;
154
+ if (reason === COMPACTION_META) {
155
+ compactions++;
156
+ const { text } = grokText(obj.content);
157
+ turns.push(compactionBoundaryTurn("context compacted here; Grok starts this file from the compacted state, so earlier turns are not in it", text));
158
+ return;
159
+ }
160
+ // Every other `synthetic_reason` is an injected reminder or a background
161
+ // task notice, not something the user said.
162
+ if (reason !== undefined)
163
+ return;
164
+ const { text, rawLength } = grokText(obj.content);
165
+ if (text && !isBootstrapTurn(text, rawLength))
166
+ turns.push({ role: "user", text });
167
+ return;
168
+ }
169
+ if (obj.type !== "assistant")
170
+ return;
171
+ for (const call of obj.tool_calls ?? []) {
172
+ if (call.name !== "run_terminal_command")
173
+ continue;
174
+ const cmd = commandFromCodexArguments(call.arguments);
175
+ if (!cmd)
176
+ continue;
177
+ for (const parsed of parseTaskPyCommandsAll(cmd)) {
178
+ events.push({
179
+ action: parsed.action,
180
+ timestamp: "",
181
+ turnIndex: turns.length,
182
+ ...(parsed.action === "create"
183
+ ? { slug: parsed.slug }
184
+ : { taskDir: parsed.taskDir }),
185
+ });
186
+ }
187
+ }
188
+ const { text } = grokText(obj.content);
189
+ if (text)
190
+ turns.push({ role: "assistant", text });
191
+ });
192
+ if (compactions > 0 && warnings) {
193
+ const archive = path.join(path.dirname(s.filePath), "compaction");
194
+ warnings.push({
195
+ code: WARN_COMPACTION_UNRECOVERABLE,
196
+ message: `session ${s.id}: compacted ${compactions} time(s); the turns before each boundary are not in chat_history.jsonl and cannot be recovered as dialogue. ` +
197
+ `Grok keeps a rendered transcript at ${archive}/ if you need to read them.`,
198
+ });
199
+ }
200
+ return { turns, events };
201
+ }
202
+ //# sourceMappingURL=grok.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grok.js","sourceRoot":"","sources":["../../../src/mem/adapters/grok.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * OpenCode session reader — currently a degraded no-op.
3
+ *
4
+ * OpenCode 1.2+ moved to a SQLite store at
5
+ * `~/.local/share/opencode/opencode.db`. The previous SQLite reader required a
6
+ * native dependency (`better-sqlite3`) whose prebuilt-tarball + node-gyp
7
+ * fallback chain broke `npm install` on Windows + restricted networks, so it
8
+ * was reverted. These adapter functions are kept (dispatch / phase slicing
9
+ * rely on them) but degraded to silent no-ops.
10
+ *
11
+ * The "OpenCode reader unavailable" warning is a presentation concern owned by
12
+ * the CLI — core never prints. Re-enabled in a future release once a
13
+ * non-native backend ships.
14
+ */
15
+ import type { DialogueTurn, MemFilter, MemSessionInfo, SearchHit } from "../types.js";
16
+ export declare function opencodeListSessions(_f: MemFilter): MemSessionInfo[];
17
+ export declare function opencodeExtractDialogue(_s: MemSessionInfo): DialogueTurn[];
18
+ export declare function opencodeSearch(kw: string): SearchHit;
19
+ //# sourceMappingURL=opencode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/mem/adapters/opencode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,cAAc,EACd,SAAS,EACV,MAAM,aAAa,CAAC;AAErB,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,SAAS,GAAG,cAAc,EAAE,CAEpE;AAED,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,cAAc,GAAG,YAAY,EAAE,CAE1E;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAEpD"}