@pennixrv/trellis-core 0.6.45 → 0.7.0-beta.10

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 (54) hide show
  1. package/dist/mem/adapters/claude.d.ts +1 -1
  2. package/dist/mem/adapters/claude.js +1 -1
  3. package/dist/mem/adapters/codex.d.ts +1 -1
  4. package/dist/mem/adapters/codex.js +1 -1
  5. package/dist/mem/adapters/devin.d.ts +50 -0
  6. package/dist/mem/adapters/devin.d.ts.map +1 -0
  7. package/dist/mem/adapters/devin.js +383 -0
  8. package/dist/mem/adapters/devin.js.map +1 -0
  9. package/dist/mem/adapters/grok.d.ts +1 -1
  10. package/dist/mem/adapters/grok.js +1 -1
  11. package/dist/mem/adapters/opencode.d.ts.map +1 -1
  12. package/dist/mem/adapters/opencode.js +35 -139
  13. package/dist/mem/adapters/opencode.js.map +1 -1
  14. package/dist/mem/adapters/zcode.d.ts +1 -1
  15. package/dist/mem/adapters/zcode.d.ts.map +1 -1
  16. package/dist/mem/adapters/zcode.js +55 -141
  17. package/dist/mem/adapters/zcode.js.map +1 -1
  18. package/dist/mem/index.d.ts +1 -0
  19. package/dist/mem/index.d.ts.map +1 -1
  20. package/dist/mem/index.js +1 -0
  21. package/dist/mem/index.js.map +1 -1
  22. package/dist/mem/internal/paths.d.ts +22 -0
  23. package/dist/mem/internal/paths.d.ts.map +1 -1
  24. package/dist/mem/internal/paths.js +45 -0
  25. package/dist/mem/internal/paths.js.map +1 -1
  26. package/dist/mem/internal/sqlite-adapter.d.ts +46 -0
  27. package/dist/mem/internal/sqlite-adapter.d.ts.map +1 -0
  28. package/dist/mem/internal/sqlite-adapter.js +116 -0
  29. package/dist/mem/internal/sqlite-adapter.js.map +1 -0
  30. package/dist/mem/internal/sqlite-readonly.d.ts +3 -0
  31. package/dist/mem/internal/sqlite-readonly.d.ts.map +1 -1
  32. package/dist/mem/internal/sqlite-readonly.js +159 -60
  33. package/dist/mem/internal/sqlite-readonly.js.map +1 -1
  34. package/dist/mem/phase.d.ts +4 -4
  35. package/dist/mem/phase.d.ts.map +1 -1
  36. package/dist/mem/phase.js +26 -23
  37. package/dist/mem/phase.js.map +1 -1
  38. package/dist/mem/platforms.d.ts +20 -0
  39. package/dist/mem/platforms.d.ts.map +1 -0
  40. package/dist/mem/platforms.js +72 -0
  41. package/dist/mem/platforms.js.map +1 -0
  42. package/dist/mem/projects.d.ts +1 -1
  43. package/dist/mem/projects.d.ts.map +1 -1
  44. package/dist/mem/projects.js +5 -8
  45. package/dist/mem/projects.js.map +1 -1
  46. package/dist/mem/sessions.d.ts +3 -3
  47. package/dist/mem/sessions.d.ts.map +1 -1
  48. package/dist/mem/sessions.js +41 -79
  49. package/dist/mem/sessions.js.map +1 -1
  50. package/dist/mem/types.d.ts +5 -4
  51. package/dist/mem/types.d.ts.map +1 -1
  52. package/dist/mem/types.js +9 -1
  53. package/dist/mem/types.js.map +1 -1
  54. package/package.json +1 -1
@@ -11,7 +11,7 @@ export declare function claudeSearch(s: MemSessionInfo, kw: string): SearchHit;
11
11
  /**
12
12
  * Single-pass scan of a Claude JSONL file that produces both the cleaned
13
13
  * dialogue turns (semantically identical to {@link claudeExtractDialogue}) and
14
- * the list of `task.py create|start` Bash tool_use events with their
14
+ * the list of `task.py create|replan|start` Bash tool_use events with their
15
15
  * `turnIndex`. Compaction keeps both `turns` and `events` — the turns those
16
16
  * indices point at are still in the pool.
17
17
  */
@@ -141,7 +141,7 @@ export function claudeSearch(s, kw) {
141
141
  /**
142
142
  * Single-pass scan of a Claude JSONL file that produces both the cleaned
143
143
  * dialogue turns (semantically identical to {@link claudeExtractDialogue}) and
144
- * the list of `task.py create|start` Bash tool_use events with their
144
+ * the list of `task.py create|replan|start` Bash tool_use events with their
145
145
  * `turnIndex`. Compaction keeps both `turns` and `events` — the turns those
146
146
  * indices point at are still in the pool.
147
147
  */
@@ -40,7 +40,7 @@ export declare function codexSearch(s: MemSessionInfo, kw: string): SearchHit;
40
40
  /**
41
41
  * Codex twin of `collectClaudeTurnsAndEvents`. Single pass over the rollout
42
42
  * file; emits both the cleaned dialogue turns and the list of
43
- * `task.py create|start` invocations found inside `function_call` events whose
43
+ * `task.py create|replan|start` invocations found inside `function_call` events whose
44
44
  * `name === "exec_command"` (or `"shell"`).
45
45
  *
46
46
  * Compaction keeps everything: collected turns stay, retained history is merged
@@ -260,7 +260,7 @@ export function codexSearch(s, kw) {
260
260
  /**
261
261
  * Codex twin of `collectClaudeTurnsAndEvents`. Single pass over the rollout
262
262
  * file; emits both the cleaned dialogue turns and the list of
263
- * `task.py create|start` invocations found inside `function_call` events whose
263
+ * `task.py create|replan|start` invocations found inside `function_call` events whose
264
264
  * `name === "exec_command"` (or `"shell"`).
265
265
  *
266
266
  * Compaction keeps everything: collected turns stay, retained history is merged
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Cognition Devin CLI persisted-session reader.
3
+ *
4
+ * Devin CLI (the terminal agent at `~/.local/bin/devin`, not Devin Desktop /
5
+ * Cascade and not Factory Droid) stores sessions in a WAL-mode SQLite
6
+ * database at `$XDG_DATA_HOME/devin/cli/sessions.db` (see
7
+ * `internal/paths.ts:devinCliDbPath`). Two tables this adapter reads,
8
+ * confirmed against a live Cognition store:
9
+ *
10
+ * - `sessions` — id / working_directory (cwd) / created_at /
11
+ * last_activity_at (Unix seconds) / title / main_chain_id /
12
+ * hidden (`/rm-session` soft-delete)
13
+ * - `message_nodes` — session_id / node_id / parent_node_id / chat_message
14
+ * (JSON) / created_at. This is a forest, not a list: walk
15
+ * parent pointers from `main_chain_id` to drop fork/revert
16
+ * side branches.
17
+ *
18
+ * `chat_message` JSON: `{role, content: string, tool_calls?, thinking?,
19
+ * metadata}`. Roles are `user` / `assistant` / `tool` / `system`. Real
20
+ * user turns have `metadata.is_user_input === true`. Compaction is a
21
+ * `system` node whose `metadata.extensions["devin-rs/summary"]` is set.
22
+ * `exec` tool_calls feed `task.py` phase slicing.
23
+ *
24
+ * SQLite access is via the zero-dependency parser in
25
+ * `internal/sqlite-readonly.ts`. A live store is hundreds of MB of TEXT;
26
+ * `scanTable`'s predicate is used as a visitor that keeps only slim records
27
+ * and always returns false, so the raw JSON is never retained. No native
28
+ * module, WASM blob, system `sqlite3`, or `better-sqlite3` may come back
29
+ * with this adapter.
30
+ *
31
+ * Everything here is read-only: the database is snapshotted and parsed,
32
+ * never opened for write, locked, checkpointed, or copied over.
33
+ */
34
+ import type { DialogueTurn, MemFilter, MemSessionInfo, MemWarning, SearchHit, TaskPyEvent } from "../types.js";
35
+ export declare function prepareDevinSessionStore(dbPath: string, warnings?: MemWarning[]): void;
36
+ export declare function releaseDevinSessionStore(): void;
37
+ export declare function devinListSessions(f: MemFilter, warnings?: MemWarning[]): MemSessionInfo[];
38
+ /**
39
+ * Single pass over the main chain: cleaned dialogue plus `task.py`
40
+ * create/replan/start events from assistant `exec` tool_calls. `turnIndex` is the
41
+ * turn count *before* this node's own text is pushed (Claude/Codex
42
+ * convention: the tool ran as part of producing the next assistant turn).
43
+ */
44
+ export declare function collectDevinTurnsAndEvents(s: MemSessionInfo, warnings?: MemWarning[]): {
45
+ turns: DialogueTurn[];
46
+ events: TaskPyEvent[];
47
+ };
48
+ export declare function devinExtractDialogue(s: MemSessionInfo, warnings?: MemWarning[]): DialogueTurn[];
49
+ export declare function devinSearch(s: MemSessionInfo, kw: string, warnings?: MemWarning[]): SearchHit;
50
+ //# sourceMappingURL=devin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devin.d.ts","sourceRoot":"","sources":["../../../src/mem/adapters/devin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAqBH,OAAO,KAAK,EAEV,YAAY,EACZ,SAAS,EACT,cAAc,EACd,UAAU,EACV,SAAS,EACT,WAAW,EACZ,MAAM,aAAa,CAAC;AA2OrB,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,UAAU,EAAO,GAC1B,IAAI,CAEN;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AA4DD,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,SAAS,EACZ,QAAQ,GAAE,UAAU,EAAO,GAC1B,cAAc,EAAE,CAqDlB;AAoBD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,CAAC,EAAE,cAAc,EACjB,QAAQ,GAAE,UAAU,EAAO,GAC1B;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,CAmClD;AAED,wBAAgB,oBAAoB,CAClC,CAAC,EAAE,cAAc,EACjB,QAAQ,GAAE,UAAU,EAAO,GAC1B,YAAY,EAAE,CAEhB;AAED,wBAAgB,WAAW,CACzB,CAAC,EAAE,cAAc,EACjB,EAAE,EAAE,MAAM,EACV,QAAQ,GAAE,UAAU,EAAO,GAC1B,SAAS,CAEX"}
@@ -0,0 +1,383 @@
1
+ /**
2
+ * Cognition Devin CLI persisted-session reader.
3
+ *
4
+ * Devin CLI (the terminal agent at `~/.local/bin/devin`, not Devin Desktop /
5
+ * Cascade and not Factory Droid) stores sessions in a WAL-mode SQLite
6
+ * database at `$XDG_DATA_HOME/devin/cli/sessions.db` (see
7
+ * `internal/paths.ts:devinCliDbPath`). Two tables this adapter reads,
8
+ * confirmed against a live Cognition store:
9
+ *
10
+ * - `sessions` — id / working_directory (cwd) / created_at /
11
+ * last_activity_at (Unix seconds) / title / main_chain_id /
12
+ * hidden (`/rm-session` soft-delete)
13
+ * - `message_nodes` — session_id / node_id / parent_node_id / chat_message
14
+ * (JSON) / created_at. This is a forest, not a list: walk
15
+ * parent pointers from `main_chain_id` to drop fork/revert
16
+ * side branches.
17
+ *
18
+ * `chat_message` JSON: `{role, content: string, tool_calls?, thinking?,
19
+ * metadata}`. Roles are `user` / `assistant` / `tool` / `system`. Real
20
+ * user turns have `metadata.is_user_input === true`. Compaction is a
21
+ * `system` node whose `metadata.extensions["devin-rs/summary"]` is set.
22
+ * `exec` tool_calls feed `task.py` phase slicing.
23
+ *
24
+ * SQLite access is via the zero-dependency parser in
25
+ * `internal/sqlite-readonly.ts`. A live store is hundreds of MB of TEXT;
26
+ * `scanTable`'s predicate is used as a visitor that keeps only slim records
27
+ * and always returns false, so the raw JSON is never retained. No native
28
+ * module, WASM blob, system `sqlite3`, or `better-sqlite3` may come back
29
+ * with this adapter.
30
+ *
31
+ * Everything here is read-only: the database is snapshotted and parsed,
32
+ * never opened for write, locked, checkpointed, or copied over.
33
+ */
34
+ import { compactionBoundaryTurn, stripInjectionTags, isBootstrapTurn, } from "../dialogue.js";
35
+ import { inRangeOverlap, sameProject } from "../filter.js";
36
+ import { devinCliDbPath } from "../internal/paths.js";
37
+ import { createSqlitePreparedStore, findTable, requireColumns, requireRowColumns, scanAndDiscard, withSqliteDb, } from "../internal/sqlite-adapter.js";
38
+ import { parseTaskPyCommandsAll } from "../phase.js";
39
+ import { searchInDialogue } from "../search.js";
40
+ // ---------- loose external shapes ----------
41
+ function isRecord(value) {
42
+ return value !== null && typeof value === "object" && !Array.isArray(value);
43
+ }
44
+ function parseDataJson(raw) {
45
+ if (typeof raw !== "string")
46
+ return null;
47
+ try {
48
+ const v = JSON.parse(raw);
49
+ return isRecord(v) ? v : null;
50
+ }
51
+ catch {
52
+ return null;
53
+ }
54
+ }
55
+ function asFiniteNumber(v) {
56
+ return typeof v === "number" && Number.isFinite(v) ? v : undefined;
57
+ }
58
+ function parseDialogueRole(v) {
59
+ return v === "user" || v === "assistant" ? v : undefined;
60
+ }
61
+ function isSummaryMessage(msg) {
62
+ const md = msg.metadata;
63
+ if (!isRecord(md))
64
+ return false;
65
+ const ext = md.extensions;
66
+ return isRecord(ext) && "devin-rs/summary" in ext;
67
+ }
68
+ function isUserInput(msg) {
69
+ const md = msg.metadata;
70
+ return isRecord(md) && md.is_user_input === true;
71
+ }
72
+ /** Pull `exec` shell commands from an assistant `tool_calls` array. */
73
+ function execCommandsFrom(msg) {
74
+ const calls = msg.tool_calls;
75
+ if (!Array.isArray(calls))
76
+ return [];
77
+ const out = [];
78
+ for (const call of calls) {
79
+ if (!isRecord(call) || call.name !== "exec")
80
+ continue;
81
+ const args = call.arguments;
82
+ const obj = typeof args === "string"
83
+ ? parseDataJson(args)
84
+ : isRecord(args)
85
+ ? args
86
+ : null;
87
+ if (!obj)
88
+ continue;
89
+ const cmd = obj.command;
90
+ if (typeof cmd === "string" && cmd)
91
+ out.push(cmd);
92
+ }
93
+ return out;
94
+ }
95
+ // ---------- schema contract ----------
96
+ const SESSION_TABLE = "sessions";
97
+ const NODE_TABLE = "message_nodes";
98
+ const SQLITE_WARNINGS = {
99
+ unreadableCode: "devin-db-unreadable",
100
+ snapshotUnstableCode: "devin-db-snapshot-unstable",
101
+ schemaUnsupportedCode: "devin-db-schema-unsupported",
102
+ writingMessage: (dbPath) => `Devin CLI is writing to its session database; retry in a moment (${dbPath})`,
103
+ unreadableMessage: (dbPath, error) => `cannot read Devin CLI session database (${dbPath}): ${error.message}`,
104
+ unsupportedMessage: (dbPath, error) => `unsupported Devin CLI session schema (${dbPath}): ${error.message}`,
105
+ };
106
+ const MAIN_CHAIN_MISSING_WARNING_CODE = "devin-main-chain-missing";
107
+ function emptySessionStore() {
108
+ return { bundles: new Map() };
109
+ }
110
+ function bundleOf(store, sessionId) {
111
+ const existing = store.bundles.get(sessionId);
112
+ if (existing)
113
+ return existing;
114
+ const created = { nodes: [] };
115
+ store.bundles.set(sessionId, created);
116
+ return created;
117
+ }
118
+ function slimFromChatMessage(nodeId, parentNodeId, createdAt, raw) {
119
+ const msg = parseDataJson(raw);
120
+ if (!msg) {
121
+ return { nodeId, parentNodeId, createdAt };
122
+ }
123
+ if (isSummaryMessage(msg)) {
124
+ const text = typeof msg.content === "string" ? msg.content : "";
125
+ return { nodeId, parentNodeId, createdAt, isSummary: true, text };
126
+ }
127
+ const role = parseDialogueRole(msg.role);
128
+ if (role === "user") {
129
+ if (!isUserInput(msg))
130
+ return { nodeId, parentNodeId, createdAt };
131
+ const text = typeof msg.content === "string" ? msg.content : "";
132
+ return { nodeId, parentNodeId, createdAt, role, text };
133
+ }
134
+ if (role === "assistant") {
135
+ const text = typeof msg.content === "string" ? msg.content : "";
136
+ const execCommands = execCommandsFrom(msg);
137
+ return {
138
+ nodeId,
139
+ parentNodeId,
140
+ createdAt,
141
+ role,
142
+ text,
143
+ ...(execCommands.length > 0 ? { execCommands } : {}),
144
+ };
145
+ }
146
+ return { nodeId, parentNodeId, createdAt };
147
+ }
148
+ /**
149
+ * Parse message_nodes inside the scan visitor and never retain a raw row. A
150
+ * live `chat_message` column is ~200 MB of TEXT; holding it next to the
151
+ * parsed copies is what blew RSS on the Cursor adapter.
152
+ */
153
+ function scanMessageNodes(db, sessionId, store) {
154
+ const table = findTable(db, NODE_TABLE);
155
+ requireColumns(table, [
156
+ "session_id",
157
+ "node_id",
158
+ "parent_node_id",
159
+ "chat_message",
160
+ ]);
161
+ let checkedRowShape = false;
162
+ scanAndDiscard(db, NODE_TABLE, (row) => {
163
+ if (!checkedRowShape) {
164
+ checkedRowShape = true;
165
+ requireRowColumns(row, NODE_TABLE, [
166
+ "session_id",
167
+ "node_id",
168
+ "parent_node_id",
169
+ "chat_message",
170
+ ]);
171
+ }
172
+ const sid = typeof row.session_id === "string" ? row.session_id : "";
173
+ if (!sid)
174
+ return;
175
+ if (sessionId !== undefined && sid !== sessionId)
176
+ return;
177
+ const nodeId = asFiniteNumber(row.node_id);
178
+ if (nodeId === undefined)
179
+ return;
180
+ const parentRaw = row.parent_node_id;
181
+ const parentNodeId = parentRaw === null || parentRaw === undefined
182
+ ? null
183
+ : (asFiniteNumber(parentRaw) ?? null);
184
+ const createdAt = asFiniteNumber(row.created_at) ?? 0;
185
+ const bundle = bundleOf(store, sid);
186
+ bundle.nodes.push(slimFromChatMessage(nodeId, parentNodeId, createdAt, row.chat_message));
187
+ });
188
+ }
189
+ function attachMainChainIds(db, store) {
190
+ const table = findTable(db, SESSION_TABLE);
191
+ requireColumns(table, ["id", "main_chain_id"]);
192
+ scanAndDiscard(db, SESSION_TABLE, (row) => {
193
+ const id = typeof row.id === "string" ? row.id : "";
194
+ if (!id)
195
+ return;
196
+ const bundle = store.bundles.get(id);
197
+ if (bundle)
198
+ bundle.mainChainId = asFiniteNumber(row.main_chain_id);
199
+ });
200
+ }
201
+ function loadStore(dbPath, warnings, sessionId) {
202
+ return withSqliteDb(dbPath, warnings, SQLITE_WARNINGS, emptySessionStore(), (db) => {
203
+ const store = emptySessionStore();
204
+ scanMessageNodes(db, sessionId, store);
205
+ attachMainChainIds(db, store);
206
+ return store;
207
+ });
208
+ }
209
+ const preparedStore = createSqlitePreparedStore();
210
+ export function prepareDevinSessionStore(dbPath, warnings = []) {
211
+ preparedStore.prepare(dbPath, () => loadStore(dbPath, warnings));
212
+ }
213
+ export function releaseDevinSessionStore() {
214
+ preparedStore.release();
215
+ }
216
+ function readSessionBundle(dbPath, sessionId, warnings) {
217
+ const prepared = preparedStore.get(dbPath);
218
+ if (prepared) {
219
+ return prepared.bundles.get(sessionId) ?? { nodes: [] };
220
+ }
221
+ return loadStore(dbPath, warnings, sessionId).bundles.get(sessionId) ?? {
222
+ nodes: [],
223
+ };
224
+ }
225
+ /**
226
+ * Follow `parent_node_id` from `main_chain_id` back to the root, then reverse
227
+ * so the result is chronological. Missing / unknown tip is not guessed via
228
+ * max(node_id) — that is often an abandoned fork.
229
+ */
230
+ function walkMainChain(bundle) {
231
+ const { nodes } = bundle;
232
+ if (nodes.length === 0)
233
+ return [];
234
+ const byId = new Map();
235
+ for (const node of nodes)
236
+ byId.set(node.nodeId, node);
237
+ const tip = bundle.mainChainId;
238
+ if (tip === undefined || !byId.has(tip))
239
+ return "missing-tip";
240
+ const chain = [];
241
+ const seen = new Set();
242
+ let cur = byId.get(tip);
243
+ while (cur && !seen.has(cur.nodeId)) {
244
+ seen.add(cur.nodeId);
245
+ chain.push(cur);
246
+ if (cur.parentNodeId === null)
247
+ break;
248
+ cur = byId.get(cur.parentNodeId);
249
+ }
250
+ chain.reverse();
251
+ return chain;
252
+ }
253
+ // ---------- timestamps ----------
254
+ /** Largest absolute time value an ECMAScript Date can represent. */
255
+ const MAX_TIME_VALUE = 8.64e15;
256
+ /** Epoch values below this are treated as Unix seconds (Devin's unit);
257
+ * larger values are already milliseconds. */
258
+ const UNIX_SECONDS_CUTOFF = 1e12;
259
+ function toIsoUnix(epoch) {
260
+ if (typeof epoch !== "number" || !Number.isFinite(epoch))
261
+ return undefined;
262
+ if (epoch <= 0)
263
+ return undefined;
264
+ const ms = epoch < UNIX_SECONDS_CUTOFF ? epoch * 1000 : epoch;
265
+ if (ms > MAX_TIME_VALUE)
266
+ return undefined;
267
+ return new Date(ms).toISOString();
268
+ }
269
+ // ---------- list ----------
270
+ export function devinListSessions(f, warnings = []) {
271
+ const dbPath = devinCliDbPath();
272
+ if (dbPath === undefined)
273
+ return [];
274
+ const rows = withSqliteDb(dbPath, warnings, SQLITE_WARNINGS, null, (db) => {
275
+ const table = findTable(db, SESSION_TABLE);
276
+ requireColumns(table, ["id", "working_directory", "created_at"]);
277
+ const scanned = db.scanTable(SESSION_TABLE);
278
+ if (scanned[0]) {
279
+ requireRowColumns(scanned[0], SESSION_TABLE, [
280
+ "id",
281
+ "working_directory",
282
+ "created_at",
283
+ ]);
284
+ }
285
+ return scanned;
286
+ });
287
+ if (!rows)
288
+ return [];
289
+ const out = [];
290
+ for (const row of rows) {
291
+ const id = typeof row.id === "string" ? row.id : "";
292
+ if (!id)
293
+ continue;
294
+ const hidden = asFiniteNumber(row.hidden);
295
+ if (hidden !== undefined && hidden !== 0)
296
+ continue;
297
+ const directory = typeof row.working_directory === "string"
298
+ ? row.working_directory
299
+ : undefined;
300
+ if (f.cwd && !sameProject(directory, f.cwd))
301
+ continue;
302
+ const created = toIsoUnix(row.created_at);
303
+ const updated = toIsoUnix(row.last_activity_at) ?? created;
304
+ if (!inRangeOverlap(created, updated, f))
305
+ continue;
306
+ out.push({
307
+ platform: "devin",
308
+ id,
309
+ title: typeof row.title === "string" ? row.title : undefined,
310
+ cwd: directory,
311
+ created,
312
+ updated,
313
+ filePath: dbPath,
314
+ });
315
+ }
316
+ return out;
317
+ }
318
+ // ---------- extract / search / phase ----------
319
+ function buildTurn(node) {
320
+ if (node.isSummary) {
321
+ return compactionBoundaryTurn("context compacted here; the turns above are still in the Devin CLI database", node.text);
322
+ }
323
+ if (!node.role)
324
+ return null;
325
+ const raw = node.text ?? "";
326
+ if (!raw)
327
+ return null;
328
+ const cleaned = stripInjectionTags(raw);
329
+ if (!cleaned)
330
+ return null;
331
+ if (node.role === "user" && isBootstrapTurn(cleaned, raw.length))
332
+ return null;
333
+ return { role: node.role, text: cleaned };
334
+ }
335
+ /**
336
+ * Single pass over the main chain: cleaned dialogue plus `task.py`
337
+ * create/replan/start events from assistant `exec` tool_calls. `turnIndex` is the
338
+ * turn count *before* this node's own text is pushed (Claude/Codex
339
+ * convention: the tool ran as part of producing the next assistant turn).
340
+ */
341
+ export function collectDevinTurnsAndEvents(s, warnings = []) {
342
+ const bundle = readSessionBundle(s.filePath, s.id, warnings);
343
+ const chain = walkMainChain(bundle);
344
+ if (chain === "missing-tip") {
345
+ if (!warnings.some((w) => w.code === MAIN_CHAIN_MISSING_WARNING_CODE)) {
346
+ warnings.push({
347
+ code: MAIN_CHAIN_MISSING_WARNING_CODE,
348
+ message: `Devin CLI session ${s.id} has no usable main_chain_id; refusing to walk a fork (${s.filePath})`,
349
+ });
350
+ }
351
+ return { turns: [], events: [] };
352
+ }
353
+ const turns = [];
354
+ const events = [];
355
+ for (const node of chain) {
356
+ if (node.execCommands) {
357
+ const ts = toIsoUnix(node.createdAt) ?? "";
358
+ for (const cmd of node.execCommands) {
359
+ for (const parsed of parseTaskPyCommandsAll(cmd)) {
360
+ events.push({
361
+ action: parsed.action,
362
+ timestamp: ts,
363
+ turnIndex: turns.length,
364
+ ...(parsed.action === "create"
365
+ ? { slug: parsed.slug }
366
+ : { taskDir: parsed.taskDir }),
367
+ });
368
+ }
369
+ }
370
+ }
371
+ const turn = buildTurn(node);
372
+ if (turn)
373
+ turns.push(turn);
374
+ }
375
+ return { turns, events };
376
+ }
377
+ export function devinExtractDialogue(s, warnings = []) {
378
+ return collectDevinTurnsAndEvents(s, warnings).turns;
379
+ }
380
+ export function devinSearch(s, kw, warnings = []) {
381
+ return searchInDialogue(devinExtractDialogue(s, warnings), kw);
382
+ }
383
+ //# sourceMappingURL=devin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devin.js","sourceRoot":"","sources":["../../../src/mem/adapters/devin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,yBAAyB,EACzB,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,YAAY,GAEb,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAWhD,8CAA8C;AAE9C,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,aAAa,CAAC,GAAY;IACjC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,CAAC,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,CAAU;IAChC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACrE,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAU;IACnC,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED,SAAS,gBAAgB,CAAC,GAA4B;IACpD,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC;IACxB,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IAChC,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC;IAC1B,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,kBAAkB,IAAI,GAAG,CAAC;AACpD,CAAC;AAED,SAAS,WAAW,CAAC,GAA4B;IAC/C,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC;IACxB,OAAO,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,aAAa,KAAK,IAAI,CAAC;AACnD,CAAC;AAED,uEAAuE;AACvE,SAAS,gBAAgB,CAAC,GAA4B;IACpD,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC;IAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5B,MAAM,GAAG,GAAG,OAAO,IAAI,KAAK,QAAQ;YAClC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;YACrB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACd,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,IAAI,CAAC;QACX,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC;QACxB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,wCAAwC;AAExC,MAAM,aAAa,GAAG,UAAU,CAAC;AACjC,MAAM,UAAU,GAAG,eAAe,CAAC;AAEnC,MAAM,eAAe,GAAsB;IACzC,cAAc,EAAE,qBAAqB;IACrC,oBAAoB,EAAE,4BAA4B;IAClD,qBAAqB,EAAE,6BAA6B;IACpD,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CACzB,oEAAoE,MAAM,GAAG;IAC/E,iBAAiB,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACnC,2CAA2C,MAAM,MAAM,KAAK,CAAC,OAAO,EAAE;IACxE,kBAAkB,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACpC,yCAAyC,MAAM,MAAM,KAAK,CAAC,OAAO,EAAE;CACvE,CAAC;AAEF,MAAM,+BAA+B,GAAG,0BAA0B,CAAC;AA6BnE,SAAS,iBAAiB;IACxB,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,QAAQ,CACf,KAAwB,EACxB,SAAiB;IAEjB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,OAAO,GAAkB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC7C,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAAc,EACd,YAA2B,EAC3B,SAAiB,EACjB,GAAY;IAEZ,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;IAC7C,CAAC;IACD,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACpE,CAAC;IACD,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;QAClE,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACzD,CAAC;IACD,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO;YACL,MAAM;YACN,YAAY;YACZ,SAAS;YACT,IAAI;YACJ,IAAI;YACJ,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrD,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CACvB,EAAkB,EAClB,SAA6B,EAC7B,KAAwB;IAExB,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACxC,cAAc,CAAC,KAAK,EAAE;QACpB,YAAY;QACZ,SAAS;QACT,gBAAgB;QAChB,cAAc;KACf,CAAC,CAAC;IACH,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,cAAc,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE;QACrC,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,eAAe,GAAG,IAAI,CAAC;YACvB,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE;gBACjC,YAAY;gBACZ,SAAS;gBACT,gBAAgB;gBAChB,cAAc;aACf,CAAC,CAAC;QACL,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,SAAS,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO;QAEzD,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO;QACjC,MAAM,SAAS,GAAG,GAAG,CAAC,cAAc,CAAC;QACrC,MAAM,YAAY,GAChB,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS;YAC3C,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,IAAI,CACf,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,CAAC,YAAY,CAAC,CACvE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,EAAkB,EAAE,KAAwB;IACtE,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IAC3C,cAAc,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;IAC/C,cAAc,CAAC,EAAE,EAAE,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE;QACxC,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,MAAM;YAAE,MAAM,CAAC,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAChB,MAAc,EACd,QAAsB,EACtB,SAAkB;IAElB,OAAO,YAAY,CACjB,MAAM,EACN,QAAQ,EACR,eAAe,EACf,iBAAiB,EAAE,EACnB,CAAC,EAAE,EAAE,EAAE;QACL,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC;QAClC,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACvC,kBAAkB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAAG,yBAAyB,EAAqB,CAAC;AAErE,MAAM,UAAU,wBAAwB,CACtC,MAAc,EACd,WAAyB,EAAE;IAE3B,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,aAAa,CAAC,OAAO,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,iBAAiB,CACxB,MAAc,EACd,SAAiB,EACjB,QAAsB;IAEtB,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI;QACtE,KAAK,EAAE,EAAE;KACV,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,MAAqB;IAC1C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAoB,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC;IAC/B,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,aAAa,CAAC;IAE9D,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,GAAG,GAAyB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9C,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,IAAI,GAAG,CAAC,YAAY,KAAK,IAAI;YAAE,MAAM;QACrC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACnC,CAAC;IACD,KAAK,CAAC,OAAO,EAAE,CAAC;IAChB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,mCAAmC;AAEnC,oEAAoE;AACpE,MAAM,cAAc,GAAG,OAAO,CAAC;AAC/B;6CAC6C;AAC7C,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3E,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACjC,MAAM,EAAE,GAAG,KAAK,GAAG,mBAAmB,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9D,IAAI,EAAE,GAAG,cAAc;QAAE,OAAO,SAAS,CAAC;IAC1C,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC;AAED,6BAA6B;AAE7B,MAAM,UAAU,iBAAiB,CAC/B,CAAY,EACZ,WAAyB,EAAE;IAE3B,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,IAAI,GAAG,YAAY,CACvB,MAAM,EACN,QAAQ,EACR,eAAe,EACf,IAA0B,EAC1B,CAAC,EAAE,EAAE,EAAE;QACL,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QAC3C,cAAc,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,mBAAmB,EAAE,YAAY,CAAC,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACf,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE;gBAC3C,IAAI;gBACJ,mBAAmB;gBACnB,YAAY;aACb,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CACF,CAAC;IACF,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,EAAE;YAAE,SAAS;QAClB,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,CAAC;YAAE,SAAS;QAEnD,MAAM,SAAS,GACb,OAAO,GAAG,CAAC,iBAAiB,KAAK,QAAQ;YACvC,CAAC,CAAC,GAAG,CAAC,iBAAiB;YACvB,CAAC,CAAC,SAAS,CAAC;QAChB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC;YAAE,SAAS;QAEtD,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC;QAC3D,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAAE,SAAS;QAEnD,GAAG,CAAC,IAAI,CAAC;YACP,QAAQ,EAAE,OAAO;YACjB,EAAE;YACF,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YAC5D,GAAG,EAAE,SAAS;YACd,OAAO;YACP,OAAO;YACP,QAAQ,EAAE,MAAM;SACjB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iDAAiD;AAEjD,SAAS,SAAS,CAAC,IAAc;IAC/B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,OAAO,sBAAsB,CAC3B,6EAA6E,EAC7E,IAAI,CAAC,IAAI,CACV,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9E,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CACxC,CAAiB,EACjB,WAAyB,EAAE;IAE3B,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,+BAA+B,CAAC,EAAE,CAAC;YACtE,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,+BAA+B;gBACrC,OAAO,EAAE,qBAAqB,CAAC,CAAC,EAAE,0DAA0D,CAAC,CAAC,QAAQ,GAAG;aAC1G,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC;IACD,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAC3C,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpC,KAAK,MAAM,MAAM,IAAI,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC;oBACjD,MAAM,CAAC,IAAI,CAAC;wBACV,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,SAAS,EAAE,EAAE;wBACb,SAAS,EAAE,KAAK,CAAC,MAAM;wBACvB,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ;4BAC5B,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;4BACvB,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;qBACjC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,CAAiB,EACjB,WAAyB,EAAE;IAE3B,OAAO,0BAA0B,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,CAAiB,EACjB,EAAU,EACV,WAAyB,EAAE;IAE3B,OAAO,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;AACjE,CAAC"}
@@ -31,7 +31,7 @@ export declare function grokExtractDialogue(s: MemSessionInfo, warnings?: MemWar
31
31
  export declare function grokSearch(s: MemSessionInfo, kw: string): SearchHit;
32
32
  /**
33
33
  * Single pass over `chat_history.jsonl`: cleaned dialogue turns plus the
34
- * `task.py create|start` invocations found in `run_terminal_command` tool
34
+ * `task.py create|replan|start` invocations found in `run_terminal_command` tool
35
35
  * calls, which is what `--phase` slicing needs.
36
36
  */
37
37
  export declare function collectGrokTurnsAndEvents(s: MemSessionInfo, warnings?: MemWarning[]): {
@@ -141,7 +141,7 @@ export function grokSearch(s, kw) {
141
141
  }
142
142
  /**
143
143
  * Single pass over `chat_history.jsonl`: cleaned dialogue turns plus the
144
- * `task.py create|start` invocations found in `run_terminal_command` tool
144
+ * `task.py create|replan|start` invocations found in `run_terminal_command` tool
145
145
  * calls, which is what `--phase` slicing needs.
146
146
  */
147
147
  export function collectGrokTurnsAndEvents(s, warnings) {
@@ -1 +1 @@
1
- {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/mem/adapters/opencode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAmBH,OAAO,KAAK,EAEV,YAAY,EACZ,SAAS,EACT,cAAc,EACd,UAAU,EACV,SAAS,EACV,MAAM,aAAa,CAAC;AA6RrB,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,UAAU,EAAO,GAC1B,IAAI,CAiBN;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AA2ID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,CAAC,EAAE,SAAS,EACZ,QAAQ,GAAE,UAAU,EAAO,GAC1B,cAAc,EAAE,CA2DlB;AAID,wBAAgB,uBAAuB,CACrC,CAAC,EAAE,cAAc,EACjB,QAAQ,GAAE,UAAU,EAAO,GAC1B,YAAY,EAAE,CAahB;AAED,wBAAgB,cAAc,CAC5B,CAAC,EAAE,cAAc,EACjB,EAAE,EAAE,MAAM,EACV,QAAQ,GAAE,UAAU,EAAO,GAC1B,SAAS,CAEX"}
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/mem/adapters/opencode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAuBH,OAAO,KAAK,EAEV,YAAY,EACZ,SAAS,EACT,cAAc,EACd,UAAU,EACV,SAAS,EACV,MAAM,aAAa,CAAC;AAiNrB,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,UAAU,EAAO,GAC1B,IAAI,CAEN;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AA8HD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,CAAC,EAAE,SAAS,EACZ,QAAQ,GAAE,UAAU,EAAO,GAC1B,cAAc,EAAE,CAyDlB;AAID,wBAAgB,uBAAuB,CACrC,CAAC,EAAE,cAAc,EACjB,QAAQ,GAAE,UAAU,EAAO,GAC1B,YAAY,EAAE,CAahB;AAED,wBAAgB,cAAc,CAC5B,CAAC,EAAE,cAAc,EACjB,EAAE,EAAE,MAAM,EACV,QAAQ,GAAE,UAAU,EAAO,GAC1B,SAAS,CAEX"}