@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,434 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zcode.js","sourceRoot":"","sources":["../../../src/mem/adapters/zcode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Dialogue-window context extraction: resolve a session, optionally merge
3
+ * sub-agent children, then select a token-budgeted window of turns around the
4
+ * top hits.
5
+ */
6
+ import type { DialogueTurn, MemContextResult, MemContextTurn, ReadMemContextOptions } from "./types.js";
7
+ interface SelectedContext {
8
+ turns: MemContextTurn[];
9
+ totalHitTurns: number;
10
+ budgetUsed: number;
11
+ }
12
+ /**
13
+ * Pure selection: rank turns against `grep` (user-role first, then hit
14
+ * density), take the top `nTurns`, expand each by `around` turns of context,
15
+ * then emit turns within `maxChars` — head-truncating any single turn that
16
+ * exceeds half the budget. With no `grep`, returns the first `nTurns` turns.
17
+ */
18
+ export declare function selectContextTurns(turns: readonly DialogueTurn[], grep: string | undefined, nTurns: number, around: number, maxChars: number): SelectedContext;
19
+ /** Drill into a single session: top-N hit turns plus surrounding context,
20
+ * char-budgeted. With no `grep`, returns the session opening. */
21
+ export declare function readMemContext(options: ReadMemContextOptions): MemContextResult;
22
+ export {};
23
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/mem/context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,KAAK,EAEV,YAAY,EACZ,gBAAgB,EAChB,cAAc,EAEd,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAEpB,UAAU,eAAe;IACvB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,eAAe,CAoEjB;AAED;iEACiE;AACjE,wBAAgB,cAAc,CAC5B,OAAO,EAAE,qBAAqB,GAC7B,gBAAgB,CAoClB"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Dialogue-window context extraction: resolve a session, optionally merge
3
+ * sub-agent children, then select a token-budgeted window of turns around the
4
+ * top hits.
5
+ */
6
+ import { buildChildIndex, extractDialogue, findSessionById, listAll, MemSessionNotFoundError, resolveFilter, WIDE_LIMIT, } from "./sessions.js";
7
+ /**
8
+ * Pure selection: rank turns against `grep` (user-role first, then hit
9
+ * density), take the top `nTurns`, expand each by `around` turns of context,
10
+ * then emit turns within `maxChars` — head-truncating any single turn that
11
+ * exceeds half the budget. With no `grep`, returns the first `nTurns` turns.
12
+ */
13
+ export function selectContextTurns(turns, grep, nTurns, around, maxChars) {
14
+ let hitIndices = [];
15
+ let totalHitTurns = 0;
16
+ if (grep) {
17
+ const tokens = grep.toLowerCase().split(/\s+/).filter(Boolean);
18
+ const matchCount = (text) => {
19
+ const hay = text.toLowerCase();
20
+ if (!tokens.every((tok) => hay.includes(tok)))
21
+ return 0;
22
+ let n = 0;
23
+ for (const tok of tokens) {
24
+ let from = 0;
25
+ while (true) {
26
+ const idx = hay.indexOf(tok, from);
27
+ if (idx === -1)
28
+ break;
29
+ n++;
30
+ from = idx + tok.length;
31
+ }
32
+ }
33
+ return n;
34
+ };
35
+ const ranked = [];
36
+ for (let i = 0; i < turns.length; i++) {
37
+ const turn = turns[i];
38
+ if (!turn)
39
+ continue;
40
+ const h = tokens.length === 0 ? 0 : matchCount(turn.text);
41
+ if (h > 0)
42
+ ranked.push({ idx: i, role: turn.role, hits: h });
43
+ }
44
+ totalHitTurns = ranked.length;
45
+ ranked.sort((a, b) => {
46
+ if (a.role !== b.role)
47
+ return a.role === "user" ? -1 : 1;
48
+ if (b.hits !== a.hits)
49
+ return b.hits - a.hits;
50
+ return a.idx - b.idx;
51
+ });
52
+ hitIndices = ranked.slice(0, nTurns).map((r) => r.idx);
53
+ }
54
+ else {
55
+ for (let i = 0; i < Math.min(nTurns, turns.length); i++)
56
+ hitIndices.push(i);
57
+ }
58
+ // Expand each hit by `around` turns on either side; dedupe via Set.
59
+ const display = new Set();
60
+ for (const idx of hitIndices) {
61
+ for (let j = Math.max(0, idx - around); j <= Math.min(turns.length - 1, idx + around); j++) {
62
+ display.add(j);
63
+ }
64
+ }
65
+ const ordered = [...display].sort((a, b) => a - b);
66
+ const hitSet = new Set(hitIndices);
67
+ const out = [];
68
+ let used = 0;
69
+ for (const i of ordered) {
70
+ const t = turns[i];
71
+ if (!t)
72
+ continue;
73
+ let text = t.text;
74
+ const cap = Math.floor(maxChars / 2);
75
+ if (text.length > cap)
76
+ text = text.slice(0, cap) + `\n…[+${t.text.length - cap} chars]`;
77
+ if (used + text.length > maxChars && out.length > 0)
78
+ break;
79
+ out.push({ idx: i, role: t.role, text, isHit: hitSet.has(i) });
80
+ used += text.length;
81
+ }
82
+ return { turns: out, totalHitTurns, budgetUsed: used };
83
+ }
84
+ /** Drill into a single session: top-N hit turns plus surrounding context,
85
+ * char-budgeted. With no `grep`, returns the session opening. */
86
+ export function readMemContext(options) {
87
+ const f = resolveFilter(options.filter);
88
+ const warnings = [];
89
+ const s = findSessionById(options.sessionId, f, warnings);
90
+ if (!s)
91
+ throw new MemSessionNotFoundError(options.sessionId, warnings);
92
+ const grep = typeof options.grep === "string" ? options.grep : undefined;
93
+ const nTurns = options.turns ?? 3;
94
+ const around = options.around ?? 1;
95
+ const maxChars = options.maxChars ?? 6000;
96
+ let turns = extractDialogue(s, warnings);
97
+ let mergedChildren = 0;
98
+ if (options.includeChildren === true) {
99
+ const all = listAll({ ...f, cwd: undefined, limit: WIDE_LIMIT }, warnings);
100
+ const childIndex = buildChildIndex(all);
101
+ const kids = childIndex.get(s.id) ?? [];
102
+ mergedChildren = kids.length;
103
+ for (const c of kids) {
104
+ turns = [...turns, ...extractDialogue(c, warnings)];
105
+ }
106
+ }
107
+ const selected = selectContextTurns(turns, grep, nTurns, around, maxChars);
108
+ return {
109
+ session: s,
110
+ query: grep,
111
+ totalTurns: turns.length,
112
+ totalHitTurns: selected.totalHitTurns,
113
+ mergedChildren,
114
+ budgetUsed: selected.budgetUsed,
115
+ maxChars,
116
+ turns: selected.turns,
117
+ warnings,
118
+ };
119
+ }
120
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/mem/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Dialogue cleaning: injection-tag stripping, bootstrap-turn detection, and the
3
+ * compaction-boundary marker shared by every adapter.
4
+ *
5
+ * The cleaning pipeline is what makes plain `String.prototype.includes`
6
+ * relevance ranking viable — without it, Trellis / platform injection tags
7
+ * would dominate every search hit.
8
+ */
9
+ import type { DialogueTurn } from "./types.js";
10
+ /** True if this turn is a platform bootstrap injection (AGENTS.md preamble,
11
+ * pure INSTRUCTIONS block, etc.) and should be dropped wholesale rather than
12
+ * partially cleaned. Evaluated AFTER {@link stripInjectionTags}, against the
13
+ * raw `originalLength` so the size threshold is computed on the input. */
14
+ export declare function isBootstrapTurn(cleaned: string, originalLength: number): boolean;
15
+ /** Case-insensitive removal of every `<tag>...</tag>` block in
16
+ * `INJECTION_TAGS`, plus AGENTS.md preamble. Collapses runs of 3+ newlines to
17
+ * a paragraph break and trims. */
18
+ export declare function stripInjectionTags(text: string): string;
19
+ /** Opening of every compaction-boundary marker turn. Stable so callers (and
20
+ * tests) can recognise a boundary without depending on the detail wording. */
21
+ export declare const COMPACT_BOUNDARY_PREFIX = "[compaction boundary]";
22
+ /**
23
+ * Build the marker turn an adapter emits where the platform compacted its
24
+ * context. `detail` states what happened to the turns before this point;
25
+ * `summary` is the platform's own summary / retained-history text, kept as
26
+ * marker content because it records what the model thought mattered — but never
27
+ * counted as dialogue (see {@link DialogueTurn.kind}).
28
+ */
29
+ export declare function compactionBoundaryTurn(detail: string, summary?: string): DialogueTurn;
30
+ /** Dedupe key for a dialogue turn: role plus exact cleaned text. */
31
+ export declare function turnKey(turn: DialogueTurn): string;
32
+ //# sourceMappingURL=dialogue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogue.d.ts","sourceRoot":"","sources":["../../src/mem/dialogue.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAuB/C;;;0EAG0E;AAC1E,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACrB,OAAO,CAIT;AAED;;kCAEkC;AAClC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAcvD;AAED;8EAC8E;AAC9E,eAAO,MAAM,uBAAuB,0BAA0B,CAAC;AAE/D;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,YAAY,CASd;AAED,oEAAoE;AACpE,wBAAgB,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAElD"}
Binary file
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogue.js","sourceRoot":"","sources":["../../src/mem/dialogue.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,cAAc,GAAsB;IACxC,iBAAiB;IACjB,aAAa;IACb,OAAO;IACP,eAAe;IACf,UAAU;IACV,gBAAgB;IAChB,YAAY;IACZ,cAAc;IACd,cAAc;IACd,iBAAiB;IACjB,cAAc;IACd,sBAAsB;IACtB,sBAAsB;IACtB,0BAA0B;IAC1B,oBAAoB;IACpB,qBAAqB;IACrB,sBAAsB;IACtB,mBAAmB;CACpB,CAAC;AAEF;;;0EAG0E;AAC1E,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,cAAsB;IAEtB,IAAI,OAAO,CAAC,UAAU,CAAC,8BAA8B,CAAC;QAAE,OAAO,IAAI,CAAC;IACpE,IAAI,cAAc,GAAG,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3E,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;kCAEkC;AAClC,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QAC3D,GAAG,GAAG,GAAG,CAAC,OAAO,CACf,IAAI,MAAM,CAAC,IAAI,OAAO,qBAAqB,OAAO,GAAG,EAAE,IAAI,CAAC,EAC5D,EAAE,CACH,CAAC;IACJ,CAAC;IACD,GAAG,GAAG,GAAG,CAAC,OAAO,CACf,2DAA2D,EAC3D,EAAE,CACH,CAAC;IACF,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/C,CAAC;AAED;8EAC8E;AAC9E,MAAM,CAAC,MAAM,uBAAuB,GAAG,uBAAuB,CAAC;AAE/D;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAc,EACd,OAAgB;IAEhB,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;IAC7B,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,IAAI;YACR,CAAC,CAAC,GAAG,uBAAuB,IAAI,MAAM,OAAO,IAAI,EAAE;YACnD,CAAC,CAAC,GAAG,uBAAuB,IAAI,MAAM,EAAE;QAC1C,IAAI,EAAE,QAAQ;KACf,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,OAAO,CAAC,IAAkB;IACxC,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AACrC,CAAC"}