@blulotus/trellis-core 0.7.0 → 0.7.2

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 (40) hide show
  1. package/dist/mem/context.js +2 -2
  2. package/dist/mem/context.js.map +1 -1
  3. package/dist/mem/index.d.ts +1 -2
  4. package/dist/mem/index.d.ts.map +1 -1
  5. package/dist/mem/index.js +1 -2
  6. package/dist/mem/index.js.map +1 -1
  7. package/dist/mem/internal/paths.d.ts +0 -19
  8. package/dist/mem/internal/paths.d.ts.map +1 -1
  9. package/dist/mem/internal/paths.js +0 -79
  10. package/dist/mem/internal/paths.js.map +1 -1
  11. package/dist/mem/projects.d.ts.map +1 -1
  12. package/dist/mem/projects.js +1 -5
  13. package/dist/mem/projects.js.map +1 -1
  14. package/dist/mem/sessions.d.ts +6 -6
  15. package/dist/mem/sessions.d.ts.map +1 -1
  16. package/dist/mem/sessions.js +29 -81
  17. package/dist/mem/sessions.js.map +1 -1
  18. package/dist/mem/types.d.ts +2 -2
  19. package/dist/mem/types.d.ts.map +1 -1
  20. package/package.json +1 -1
  21. package/dist/mem/adapters/grok.d.ts +0 -41
  22. package/dist/mem/adapters/grok.d.ts.map +0 -1
  23. package/dist/mem/adapters/grok.js +0 -202
  24. package/dist/mem/adapters/grok.js.map +0 -1
  25. package/dist/mem/adapters/opencode.d.ts +0 -19
  26. package/dist/mem/adapters/opencode.d.ts.map +0 -1
  27. package/dist/mem/adapters/opencode.js +0 -25
  28. package/dist/mem/adapters/opencode.js.map +0 -1
  29. package/dist/mem/adapters/pi.d.ts +0 -24
  30. package/dist/mem/adapters/pi.d.ts.map +0 -1
  31. package/dist/mem/adapters/pi.js +0 -290
  32. package/dist/mem/adapters/pi.js.map +0 -1
  33. package/dist/mem/adapters/zcode.d.ts +0 -76
  34. package/dist/mem/adapters/zcode.d.ts.map +0 -1
  35. package/dist/mem/adapters/zcode.js +0 -434
  36. package/dist/mem/adapters/zcode.js.map +0 -1
  37. package/dist/mem/internal/sqlite-readonly.d.ts +0 -77
  38. package/dist/mem/internal/sqlite-readonly.d.ts.map +0 -1
  39. package/dist/mem/internal/sqlite-readonly.js +0 -797
  40. package/dist/mem/internal/sqlite-readonly.js.map +0 -1
@@ -1,76 +0,0 @@
1
- /**
2
- * ZCode (Zhipu) persisted-session reader.
3
- *
4
- * ZCode stores sessions in a SQLite database at `~/.zcode/cli/db/db.sqlite`
5
- * (WAL mode). The three tables this adapter reads are:
6
- *
7
- * - `session` — id / title / directory (workspace cwd) / time_created /
8
- * time_updated / task_type
9
- * - `message` — id / session_id / time_created / data (JSON: {role, ...})
10
- * - `part` — message_id / time_created / data (JSON: {type, text|tool, ...})
11
- * plus compaction markers that replace earlier dialogue with
12
- * a summary message.
13
- *
14
- * The older `~/.zcode/v2/sessions/*.json` layout is abandoned by current ZCode,
15
- * and `~/.zcode/cli/rollout/*.jsonl` is a non-persistent model-IO stream that
16
- * gets cleaned up periodically — neither is read here. SQLite is the single
17
- * complete source of truth (see `docs-hlaia/06-...` for the investigation).
18
- *
19
- * SQLite access is via the zero-dependency parser in `internal/sqlite-readonly.ts`
20
- * — `better-sqlite3` was rejected because its native build chain broke npm
21
- * install on Windows for the OpenCode adapter.
22
- */
23
- import type { DialogueTurn, MemFilter, MemSessionInfo, MemWarning, SearchHit, TaskPyEvent } from "../types.js";
24
- interface ZcodeTextPart {
25
- type?: string;
26
- text?: string;
27
- }
28
- interface ZcodeToolPart {
29
- type?: string;
30
- tool?: string;
31
- state?: {
32
- input?: {
33
- command?: string;
34
- };
35
- };
36
- }
37
- export declare function prepareZcodeSessionStore(dbPath: string, warnings: MemWarning[]): void;
38
- export declare function releaseZcodeSessionStore(): void;
39
- export declare function zcodeListSessions(f: MemFilter, warnings?: MemWarning[]): MemSessionInfo[];
40
- /**
41
- * Build cleaned dialogue turns from a session's messages + parts. Each message
42
- * is one turn; its text is the concatenation of its `text`-typed parts after
43
- * injection-tag stripping. Messages with no surviving text are dropped.
44
- */
45
- export declare function zcodeExtractDialogue(s: MemSessionInfo, warnings?: MemWarning[]): DialogueTurn[];
46
- export declare function zcodeSearch(s: MemSessionInfo, kw: string, warnings?: MemWarning[]): SearchHit;
47
- /**
48
- * Single pass over messages + parts. Emits both the cleaned dialogue turns and
49
- * the list of `task.py create|start` invocations found in `Bash` tool parts
50
- * (`{type:"tool", tool:"Bash", state:{input:{command:"..."}}}`). `turnIndex`
51
- * for each event is the turn count at the time the tool ran.
52
- *
53
- * Compaction: ZCode writes a summary message with a `compaction` part carrying
54
- * `tail_start_id` / `compactBoundary`. The summarized messages remain in the
55
- * database, so they stay in the turn pool and the summary message becomes a
56
- * boundary marker — `task.py` boundaries from before a compaction keep pointing
57
- * at turns that are still there.
58
- *
59
- * turnIndex note (differs slightly from claude/codex): in ZCode a message's
60
- * text parts and tool parts are siblings within one message. This loop pushes
61
- * the message's text turn *before* recording its tool events, so a tool event
62
- * on message M has turnIndex = (turns including M's text). claude/codex
63
- * instead record the event before pushing the text, so their turnIndex is one
64
- * less. Both are internally self-consistent for brainstorm-window slicing
65
- * (create and start use the same convention within a platform), so phase
66
- * boundaries compute correctly. The ZCode ordering reflects real time order
67
- * (the assistant writes, then the tool runs). Do not "align" this without also
68
- * adjusting the test expectations.
69
- */
70
- export declare function collectZcodeTurnsAndEvents(s: MemSessionInfo, warnings?: MemWarning[]): {
71
- turns: DialogueTurn[];
72
- events: TaskPyEvent[];
73
- };
74
- /** Re-exported so callers needing loose shapes can import from one place. */
75
- export type { ZcodeTextPart, ZcodeToolPart };
76
- //# sourceMappingURL=zcode.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"zcode.d.ts","sourceRoot":"","sources":["../../../src/mem/adapters/zcode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAmBH,OAAO,KAAK,EAEV,YAAY,EACZ,SAAS,EACT,cAAc,EACd,UAAU,EACV,SAAS,EACT,WAAW,EACZ,MAAM,aAAa,CAAC;AAQrB,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CAC1C;AAkND,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,UAAU,EAAE,GACrB,IAAI,CAEN;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AA2ID,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,SAAS,EACZ,QAAQ,GAAE,UAAU,EAAO,GAC1B,cAAc,EAAE,CA4DlB;AAUD;;;;GAIG;AACH,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;AAID;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,0BAA0B,CACxC,CAAC,EAAE,cAAc,EACjB,QAAQ,GAAE,UAAU,EAAO,GAC1B;IACD,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAyCA;AAED,6EAA6E;AAC7E,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC"}
@@ -1,434 +0,0 @@
1
- /**
2
- * ZCode (Zhipu) persisted-session reader.
3
- *
4
- * ZCode stores sessions in a SQLite database at `~/.zcode/cli/db/db.sqlite`
5
- * (WAL mode). The three tables this adapter reads are:
6
- *
7
- * - `session` — id / title / directory (workspace cwd) / time_created /
8
- * time_updated / task_type
9
- * - `message` — id / session_id / time_created / data (JSON: {role, ...})
10
- * - `part` — message_id / time_created / data (JSON: {type, text|tool, ...})
11
- * plus compaction markers that replace earlier dialogue with
12
- * a summary message.
13
- *
14
- * The older `~/.zcode/v2/sessions/*.json` layout is abandoned by current ZCode,
15
- * and `~/.zcode/cli/rollout/*.jsonl` is a non-persistent model-IO stream that
16
- * gets cleaned up periodically — neither is read here. SQLite is the single
17
- * complete source of truth (see `docs-hlaia/06-...` for the investigation).
18
- *
19
- * SQLite access is via the zero-dependency parser in `internal/sqlite-readonly.ts`
20
- * — `better-sqlite3` was rejected because its native build chain broke npm
21
- * install on Windows for the OpenCode adapter.
22
- */
23
- import * as fs from "node:fs";
24
- import { compactionBoundaryTurn, stripInjectionTags, isBootstrapTurn, } from "../dialogue.js";
25
- import { inRangeOverlap, sameProject } from "../filter.js";
26
- import { openSqliteReadOnly, SqliteParseError, SqliteSnapshotUnstableError, } from "../internal/sqlite-readonly.js";
27
- import { ZCODE_DB } from "../internal/paths.js";
28
- import { parseTaskPyCommandsAll } from "../phase.js";
29
- import { searchInDialogue } from "../search.js";
30
- function parseDialogueRole(v) {
31
- return v === "user" || v === "assistant" ? v : undefined;
32
- }
33
- /** Safely parse the JSON stored in a `data` column. Returns null on failure. */
34
- function parseDataJson(raw) {
35
- if (typeof raw !== "string")
36
- return null;
37
- try {
38
- const v = JSON.parse(raw);
39
- return v && typeof v === "object" && !Array.isArray(v)
40
- ? v
41
- : null;
42
- }
43
- catch {
44
- return null;
45
- }
46
- }
47
- const ZCODE_DB_UNREADABLE_WARNING_CODE = "zcode-db-unreadable";
48
- const ZCODE_DB_SNAPSHOT_UNSTABLE_WARNING_CODE = "zcode-db-snapshot-unstable";
49
- function emptySessionStore() {
50
- return { messagesBySession: new Map(), partsByMsg: new Map() };
51
- }
52
- function pushDbWarning(warnings, dbPath, error) {
53
- const isSnapshotUnstable = error instanceof SqliteSnapshotUnstableError;
54
- const code = isSnapshotUnstable
55
- ? ZCODE_DB_SNAPSHOT_UNSTABLE_WARNING_CODE
56
- : ZCODE_DB_UNREADABLE_WARNING_CODE;
57
- if (warnings.some((warning) => warning.code === code))
58
- return;
59
- warnings.push({
60
- code,
61
- message: isSnapshotUnstable
62
- ? `ZCode 正在写入,请重试。 (${dbPath})`
63
- : `cannot read ZCode session database (${dbPath}): ${error.message}`,
64
- });
65
- }
66
- function requireTables(db, names) {
67
- const available = new Set(db.listTables().map((table) => table.name));
68
- const missing = names.filter((name) => !available.has(name));
69
- if (missing.length > 0) {
70
- throw new SqliteParseError(`ZCode database schema is missing table(s): ${missing.join(", ")}`);
71
- }
72
- }
73
- function requireTableColumns(db, tableName, names) {
74
- const table = db.listTables().find((item) => item.name === tableName);
75
- if (!table) {
76
- throw new SqliteParseError(`ZCode database schema is missing table: ${tableName}`);
77
- }
78
- const missing = names.filter((name) => {
79
- const pattern = new RegExp(`(?:\\(|,)\\s*["\`\\[]?${name}(?:["\`\\]]|\\b)`, "i");
80
- return !pattern.test(table.sql);
81
- });
82
- if (missing.length > 0) {
83
- throw new SqliteParseError(`ZCode table ${tableName} is missing column(s): ${missing.join(", ")}`);
84
- }
85
- }
86
- function requireRowColumns(rows, tableName, names) {
87
- const first = rows[0];
88
- if (!first)
89
- return;
90
- const missing = names.filter((name) => !(name in first));
91
- if (missing.length > 0) {
92
- throw new SqliteParseError(`ZCode table ${tableName} is missing column(s): ${missing.join(", ")}`);
93
- }
94
- }
95
- function buildSessionStore(allMessages, allParts) {
96
- const messagesBySession = new Map();
97
- for (const row of allMessages) {
98
- const sessionId = typeof row.session_id === "string" ? row.session_id : "";
99
- if (!sessionId)
100
- continue;
101
- const data = parseDataJson(row.data);
102
- const role = parseDialogueRole(data?.role);
103
- if (!role)
104
- continue;
105
- const tc = typeof row.time_created === "number" ? row.time_created : 0;
106
- const id = typeof row.id === "string" ? row.id : "";
107
- if (!id)
108
- continue;
109
- const list = messagesBySession.get(sessionId) ?? [];
110
- list.push({ id, time_created: tc, role });
111
- messagesBySession.set(sessionId, list);
112
- }
113
- for (const list of messagesBySession.values()) {
114
- list.sort((a, b) => a.time_created - b.time_created);
115
- }
116
- const partsByMsg = new Map();
117
- for (const row of allParts) {
118
- const msgId = typeof row.message_id === "string" ? row.message_id : "";
119
- if (!msgId)
120
- continue;
121
- const data = parseDataJson(row.data);
122
- if (!data)
123
- continue;
124
- const tc = typeof row.time_created === "number" ? row.time_created : 0;
125
- const list = partsByMsg.get(msgId) ?? [];
126
- list.push({ message_id: msgId, time_created: tc, data });
127
- partsByMsg.set(msgId, list);
128
- }
129
- for (const list of partsByMsg.values()) {
130
- list.sort((a, b) => a.time_created - b.time_created);
131
- }
132
- return { messagesBySession, partsByMsg };
133
- }
134
- /** Search-scoped whole-db store. It is explicitly prepared/released by the
135
- * orchestrator; one-session extract/context calls never populate it. */
136
- let preparedStore = null;
137
- /** Load a full-db search store for `dbPath`. Returns a degraded empty store
138
- * when the db is missing/corrupt so callers never crash. */
139
- function loadSessionStore(dbPath, warnings) {
140
- if (!fs.existsSync(dbPath))
141
- return emptySessionStore();
142
- let allMessages;
143
- let allParts;
144
- try {
145
- const db = openSqliteReadOnly(dbPath);
146
- try {
147
- requireTables(db, ["message", "part"]);
148
- requireTableColumns(db, "message", ["id", "session_id", "data"]);
149
- requireTableColumns(db, "part", ["message_id", "data"]);
150
- allMessages = db.scanTable("message");
151
- allParts = db.scanTable("part");
152
- requireRowColumns(allMessages, "message", ["id", "session_id", "data"]);
153
- requireRowColumns(allParts, "part", ["message_id", "data"]);
154
- }
155
- finally {
156
- db.close();
157
- }
158
- }
159
- catch (e) {
160
- if (e instanceof SqliteParseError) {
161
- pushDbWarning(warnings, dbPath, e);
162
- return emptySessionStore();
163
- }
164
- throw e;
165
- }
166
- return buildSessionStore(allMessages, allParts);
167
- }
168
- export function prepareZcodeSessionStore(dbPath, warnings) {
169
- preparedStore = { dbPath, store: loadSessionStore(dbPath, warnings) };
170
- }
171
- export function releaseZcodeSessionStore() {
172
- preparedStore = null;
173
- }
174
- /** Read one session with row filtering unless a search-scoped whole-db store
175
- * has been prepared by the orchestrator. */
176
- function readSessionMessages(dbPath, sessionId, warnings) {
177
- if (preparedStore?.dbPath === dbPath) {
178
- return {
179
- messages: preparedStore.store.messagesBySession.get(sessionId) ?? [],
180
- partsByMsg: preparedStore.store.partsByMsg,
181
- };
182
- }
183
- if (!fs.existsSync(dbPath))
184
- return { messages: [], partsByMsg: new Map() };
185
- let store;
186
- try {
187
- const db = openSqliteReadOnly(dbPath);
188
- try {
189
- requireTables(db, ["message", "part"]);
190
- requireTableColumns(db, "message", ["id", "session_id", "data"]);
191
- requireTableColumns(db, "part", ["message_id", "data"]);
192
- const messages = db.scanTable("message", (row) => row.session_id === sessionId);
193
- const messageIds = new Set(messages
194
- .map((row) => row.id)
195
- .filter((id) => typeof id === "string"));
196
- const parts = db.scanTable("part", (row) => typeof row.message_id === "string" && messageIds.has(row.message_id));
197
- requireRowColumns(messages, "message", ["id", "session_id", "data"]);
198
- requireRowColumns(parts, "part", ["message_id", "data"]);
199
- store = buildSessionStore(messages, parts);
200
- }
201
- finally {
202
- db.close();
203
- }
204
- }
205
- catch (error) {
206
- if (error instanceof SqliteParseError) {
207
- pushDbWarning(warnings, dbPath, error);
208
- return { messages: [], partsByMsg: new Map() };
209
- }
210
- throw error;
211
- }
212
- return {
213
- messages: store.messagesBySession.get(sessionId) ?? [],
214
- partsByMsg: store.partsByMsg,
215
- };
216
- }
217
- function isRecord(value) {
218
- return value !== null && typeof value === "object" && !Array.isArray(value);
219
- }
220
- function isCompactionSummaryPart(data) {
221
- return (data.type === "compaction" &&
222
- (typeof data.tail_start_id === "string" || isRecord(data.compactBoundary)));
223
- }
224
- function compactionMarkerSummaryId(data) {
225
- return data.type === "compaction" &&
226
- data.replace === true &&
227
- typeof data.summaryMessageId === "string"
228
- ? data.summaryMessageId
229
- : undefined;
230
- }
231
- /**
232
- * ZCode compaction writes two markers:
233
- * - an assistant marker with `replace: true` and `summaryMessageId`
234
- * - a summary message carrying text plus a `compaction` part with
235
- * `tail_start_id` / `compactBoundary`
236
- *
237
- * Those say where ZCode cut its own context. The summarized messages are still
238
- * rows in the same database, so extraction keeps them and renders each summary
239
- * message as a boundary marker in place.
240
- */
241
- function compactSummaryMessageIds(messages, partsByMsg) {
242
- const summaryIds = new Set();
243
- const markerSummaryIds = new Set();
244
- for (const msg of messages) {
245
- if (markerSummaryIds.has(msg.id))
246
- summaryIds.add(msg.id);
247
- for (const part of partsByMsg.get(msg.id) ?? []) {
248
- const markerSummaryId = compactionMarkerSummaryId(part.data);
249
- if (markerSummaryId)
250
- markerSummaryIds.add(markerSummaryId);
251
- if (isCompactionSummaryPart(part.data)) {
252
- summaryIds.add(msg.id);
253
- break;
254
- }
255
- }
256
- }
257
- return summaryIds;
258
- }
259
- function buildTextTurn(msg, parts, compactSummaryIds) {
260
- const collected = [];
261
- let totalRaw = 0;
262
- for (const part of parts) {
263
- const pd = part.data;
264
- if (pd.type !== "text")
265
- continue;
266
- const txt = typeof pd.text === "string" ? pd.text : "";
267
- if (!txt)
268
- continue;
269
- totalRaw += txt.length;
270
- collected.push(stripInjectionTags(txt));
271
- }
272
- if (!collected.length)
273
- return null;
274
- const merged = collected.join("\n\n");
275
- if (compactSummaryIds.has(msg.id)) {
276
- return compactionBoundaryTurn("context compacted here; the turns above are still in the ZCode database", merged);
277
- }
278
- if (isBootstrapTurn(merged, totalRaw))
279
- return null;
280
- return merged.trim() ? { role: msg.role, text: merged } : null;
281
- }
282
- // ---------- list ----------
283
- export function zcodeListSessions(f, warnings = []) {
284
- if (!fs.existsSync(ZCODE_DB))
285
- return [];
286
- let rows;
287
- try {
288
- const db = openSqliteReadOnly(ZCODE_DB);
289
- try {
290
- requireTables(db, ["session"]);
291
- requireTableColumns(db, "session", [
292
- "id",
293
- "directory",
294
- "time_created",
295
- "time_updated",
296
- ]);
297
- rows = db.scanTable("session");
298
- requireRowColumns(rows, "session", [
299
- "id",
300
- "directory",
301
- "time_created",
302
- "time_updated",
303
- ]);
304
- }
305
- finally {
306
- db.close();
307
- }
308
- }
309
- catch (e) {
310
- if (e instanceof SqliteParseError) {
311
- pushDbWarning(warnings, ZCODE_DB, e);
312
- return [];
313
- }
314
- throw e;
315
- }
316
- const out = [];
317
- for (const row of rows) {
318
- // `subagent_child` sessions are sub-agent conversations (Explore/research
319
- // dispatches). Exclude them from the default list — they are noise for
320
- // daily-review workflows, which care about the user's interactive sessions.
321
- // They are excluded across list/search/extract; relax this filter if a
322
- // future workflow needs to inspect sub-agent runs.
323
- const taskType = typeof row.task_type === "string" ? row.task_type : "";
324
- if (taskType === "subagent_child")
325
- continue;
326
- const directory = typeof row.directory === "string" ? row.directory : undefined;
327
- if (f.cwd && !sameProject(directory, f.cwd))
328
- continue;
329
- const created = toIso(row.time_created);
330
- const updated = toIso(row.time_updated) ?? created;
331
- if (!inRangeOverlap(created, updated, f))
332
- continue;
333
- out.push({
334
- platform: "zcode",
335
- id: typeof row.id === "string" ? row.id : "",
336
- title: typeof row.title === "string" ? row.title : undefined,
337
- cwd: directory,
338
- created,
339
- updated,
340
- filePath: ZCODE_DB,
341
- });
342
- }
343
- return out;
344
- }
345
- function toIso(epochMs) {
346
- return typeof epochMs === "number" && epochMs > 0
347
- ? new Date(epochMs).toISOString()
348
- : undefined;
349
- }
350
- // ---------- extract ----------
351
- /**
352
- * Build cleaned dialogue turns from a session's messages + parts. Each message
353
- * is one turn; its text is the concatenation of its `text`-typed parts after
354
- * injection-tag stripping. Messages with no surviving text are dropped.
355
- */
356
- export function zcodeExtractDialogue(s, warnings = []) {
357
- const { messages, partsByMsg } = readSessionMessages(s.filePath, s.id, warnings);
358
- const summaryIds = compactSummaryMessageIds(messages, partsByMsg);
359
- const turns = [];
360
- for (const msg of messages) {
361
- const parts = partsByMsg.get(msg.id) ?? [];
362
- const turn = buildTextTurn(msg, parts, summaryIds);
363
- if (turn)
364
- turns.push(turn);
365
- }
366
- return turns;
367
- }
368
- export function zcodeSearch(s, kw, warnings = []) {
369
- return searchInDialogue(zcodeExtractDialogue(s, warnings), kw);
370
- }
371
- // ---------- phase slicing (task.py boundary detection) ----------
372
- /**
373
- * Single pass over messages + parts. Emits both the cleaned dialogue turns and
374
- * the list of `task.py create|start` invocations found in `Bash` tool parts
375
- * (`{type:"tool", tool:"Bash", state:{input:{command:"..."}}}`). `turnIndex`
376
- * for each event is the turn count at the time the tool ran.
377
- *
378
- * Compaction: ZCode writes a summary message with a `compaction` part carrying
379
- * `tail_start_id` / `compactBoundary`. The summarized messages remain in the
380
- * database, so they stay in the turn pool and the summary message becomes a
381
- * boundary marker — `task.py` boundaries from before a compaction keep pointing
382
- * at turns that are still there.
383
- *
384
- * turnIndex note (differs slightly from claude/codex): in ZCode a message's
385
- * text parts and tool parts are siblings within one message. This loop pushes
386
- * the message's text turn *before* recording its tool events, so a tool event
387
- * on message M has turnIndex = (turns including M's text). claude/codex
388
- * instead record the event before pushing the text, so their turnIndex is one
389
- * less. Both are internally self-consistent for brainstorm-window slicing
390
- * (create and start use the same convention within a platform), so phase
391
- * boundaries compute correctly. The ZCode ordering reflects real time order
392
- * (the assistant writes, then the tool runs). Do not "align" this without also
393
- * adjusting the test expectations.
394
- */
395
- export function collectZcodeTurnsAndEvents(s, warnings = []) {
396
- const { messages, partsByMsg } = readSessionMessages(s.filePath, s.id, warnings);
397
- const summaryIds = compactSummaryMessageIds(messages, partsByMsg);
398
- const turns = [];
399
- const events = [];
400
- for (const msg of messages) {
401
- const parts = partsByMsg.get(msg.id) ?? [];
402
- // First emit any text the message produced (so turnIndex reflects turns
403
- // accumulated so far before tool events are recorded).
404
- const turn = buildTextTurn(msg, parts, summaryIds);
405
- if (turn)
406
- turns.push(turn);
407
- // Then scan for Bash tool parts carrying task.py commands.
408
- for (const part of parts) {
409
- const pd = part.data;
410
- if (pd.type !== "tool")
411
- continue;
412
- if (pd.tool !== "Bash" && pd.tool !== "bash")
413
- continue;
414
- const cmd = pd.state?.input?.command;
415
- if (typeof cmd !== "string" || !cmd)
416
- continue;
417
- const parsedAll = parseTaskPyCommandsAll(cmd);
418
- const ts = toIso(part.time_created) ?? "";
419
- for (const parsed of parsedAll) {
420
- const ev = {
421
- action: parsed.action,
422
- timestamp: ts,
423
- turnIndex: turns.length,
424
- ...(parsed.action === "create"
425
- ? { slug: parsed.slug }
426
- : { taskDir: parsed.taskDir }),
427
- };
428
- events.push(ev);
429
- }
430
- }
431
- }
432
- return { turns, events };
433
- }
434
- //# sourceMappingURL=zcode.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"zcode.js","sourceRoot":"","sources":["../../../src/mem/adapters/zcode.ts"],"names":[],"mappings":"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"}
@@ -1,77 +0,0 @@
1
- /**
2
- * Zero-dependency read-only SQLite file parser.
3
- *
4
- * `@blulotus/trellis-core` is intentionally free of runtime dependencies —
5
- * `better-sqlite3` was tried for the OpenCode adapter and reverted because its
6
- * native build chain broke `npm install` on Windows + restricted networks. This
7
- * parser is the minimum viable reader needed by the ZCode `mem` adapter: list
8
- * tables, full-scan one table, return rows as `{ [columnName]: value }`. It is
9
- * NOT a SQL engine: no WHERE pushdown, no index lookup, no writes.
10
- *
11
- * Scope:
12
- * - Database header (page size, db size, text encoding, WAL flag)
13
- * - Table b-tree leaf (0x0d) + interior (0x05) traversal
14
- * - Record decode for TEXT / INTEGER / NULL / float64 / BLOB(serial only)
15
- * - Overflow page chains (long TEXT rows like ZCode `message.data`)
16
- * - WAL replay: stable main/WAL snapshot, WAL-index `mxFrame` end mark, and
17
- * cumulative header/frame checksum verification.
18
- *
19
- * Out of scope:
20
- * - WITHOUT ROWID tables (return [] — their rows live in index b-trees,
21
- * which this parser doesn't walk). ZCode's tables are normal rowid tables.
22
- *
23
- * Format references:
24
- * - https://www.sqlite.org/fileformat2.html
25
- * - https://www.sqlite.org/walformat.html
26
- *
27
- * All multi-byte integers are big-endian (SQLite's native byte order).
28
- */
29
- /** One row from `scanTable`, keyed by column name. Values are decoded JS
30
- * primitives. NULL → null, INTEGER → number, TEXT → string, BLOB →
31
- * Uint8Array, float → number. Columns are keyed by the CREATE TABLE column
32
- * order; if the column-name parse failed, keys fall back to `col0`, `col1`... */
33
- export type SqliteRow = Record<string, unknown>;
34
- export interface SqliteTableInfo {
35
- name: string;
36
- rootPgno: number;
37
- /** The raw `CREATE TABLE` SQL (used to recover column names). */
38
- sql: string;
39
- }
40
- export interface SqliteReadOnly {
41
- /** List user tables (type='table') from sqlite_master. */
42
- listTables(): SqliteTableInfo[];
43
- /** Full-scan a table by name, yielding rows. Returns [] when the table is
44
- * missing. Throws `SqliteParseError` on structural corruption. */
45
- scanTable(tableName: string, predicate?: (row: SqliteRow) => boolean): SqliteRow[];
46
- /** The db file path this reader was opened against. */
47
- readonly dbPath: string;
48
- close(): void;
49
- }
50
- /** Thrown when the SQLite file is structurally invalid. Adapters are expected
51
- * to catch this and degrade to an empty result rather than crash the CLI. */
52
- export declare class SqliteParseError extends Error {
53
- readonly cause?: unknown | undefined;
54
- constructor(message: string, cause?: unknown | undefined);
55
- }
56
- /**
57
- * Thrown when the database files do not remain stable across all snapshot
58
- * capture attempts. This is deliberately distinct from a malformed database:
59
- * callers must not parse a snapshot whose consistency they could not verify.
60
- */
61
- export declare class SqliteSnapshotUnstableError extends SqliteParseError {
62
- constructor(mainPath: string);
63
- }
64
- /**
65
- * Open a SQLite database file for read-only access. Automatically loads the
66
- * sibling `<db>-wal` file when present so active WAL-mode databases (e.g.
67
- * ZCode's running store) return their latest committed data.
68
- *
69
- * Throws `SqliteParseError` if `mainPath` is not a SQLite file or is too
70
- * corrupted to read the header. Adapters should catch and degrade.
71
- */
72
- export declare function openSqliteReadOnly(mainPath: string): SqliteReadOnly;
73
- /** Convenience: open + scan + close in one call. Returns [] on any parse error
74
- * or missing table, never throws. Useful for adapters that already decided to
75
- * degrade silently. */
76
- export declare function scanTableSafe(mainPath: string, tableName: string): SqliteRow[];
77
- //# sourceMappingURL=sqlite-readonly.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sqlite-readonly.d.ts","sourceRoot":"","sources":["../../../src/mem/internal/sqlite-readonly.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAMH;;;iFAGiF;AACjF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,UAAU,IAAI,eAAe,EAAE,CAAC;IAChC;sEACkE;IAClE,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,OAAO,GACtC,SAAS,EAAE,CAAC;IACf,uDAAuD;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,KAAK,IAAI,IAAI,CAAC;CACf;AAID;6EAC6E;AAC7E,qBAAa,gBAAiB,SAAQ,KAAK;IAGvC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;gBADxB,OAAO,EAAE,MAAM,EACN,KAAK,CAAC,EAAE,OAAO,YAAA;CAK3B;AAED;;;;GAIG;AACH,qBAAa,2BAA4B,SAAQ,gBAAgB;gBACnD,QAAQ,EAAE,MAAM;CAM7B;AAyxBD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CA2HnE;AAED;;uBAEuB;AACvB,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,SAAS,EAAE,CAWb"}