trellis-hgl-core 0.6.0-beta.18

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 (202) 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 +106 -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 +44 -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 +64 -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 +203 -0
  79. package/dist/channel/internal/store/events.d.ts.map +1 -0
  80. package/dist/channel/internal/store/events.js +185 -0
  81. package/dist/channel/internal/store/events.js.map +1 -0
  82. package/dist/channel/internal/store/filter.d.ts +22 -0
  83. package/dist/channel/internal/store/filter.d.ts.map +1 -0
  84. package/dist/channel/internal/store/filter.js +78 -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 +43 -0
  95. package/dist/channel/internal/store/paths.d.ts.map +1 -0
  96. package/dist/channel/internal/store/paths.js +233 -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 +49 -0
  115. package/dist/channel/internal/store/worker-state.d.ts.map +1 -0
  116. package/dist/channel/internal/store/worker-state.js +207 -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 +252 -0
  125. package/dist/mem/adapters/claude.js.map +1 -0
  126. package/dist/mem/adapters/codex.d.ts +35 -0
  127. package/dist/mem/adapters/codex.d.ts.map +1 -0
  128. package/dist/mem/adapters/codex.js +222 -0
  129. package/dist/mem/adapters/codex.js.map +1 -0
  130. package/dist/mem/adapters/opencode.d.ts +19 -0
  131. package/dist/mem/adapters/opencode.d.ts.map +1 -0
  132. package/dist/mem/adapters/opencode.js +25 -0
  133. package/dist/mem/adapters/opencode.js.map +1 -0
  134. package/dist/mem/context.d.ts +23 -0
  135. package/dist/mem/context.d.ts.map +1 -0
  136. package/dist/mem/context.js +118 -0
  137. package/dist/mem/context.js.map +1 -0
  138. package/dist/mem/dialogue.d.ts +17 -0
  139. package/dist/mem/dialogue.d.ts.map +1 -0
  140. package/dist/mem/dialogue.js +51 -0
  141. package/dist/mem/dialogue.js.map +1 -0
  142. package/dist/mem/filter.d.ts +31 -0
  143. package/dist/mem/filter.d.ts.map +1 -0
  144. package/dist/mem/filter.js +70 -0
  145. package/dist/mem/filter.js.map +1 -0
  146. package/dist/mem/index.d.ts +18 -0
  147. package/dist/mem/index.d.ts.map +1 -0
  148. package/dist/mem/index.js +17 -0
  149. package/dist/mem/index.js.map +1 -0
  150. package/dist/mem/internal/jsonl.d.ts +35 -0
  151. package/dist/mem/internal/jsonl.d.ts.map +1 -0
  152. package/dist/mem/internal/jsonl.js +125 -0
  153. package/dist/mem/internal/jsonl.js.map +1 -0
  154. package/dist/mem/internal/paths.d.ts +18 -0
  155. package/dist/mem/internal/paths.d.ts.map +1 -0
  156. package/dist/mem/internal/paths.js +51 -0
  157. package/dist/mem/internal/paths.js.map +1 -0
  158. package/dist/mem/phase.d.ts +45 -0
  159. package/dist/mem/phase.d.ts.map +1 -0
  160. package/dist/mem/phase.js +220 -0
  161. package/dist/mem/phase.js.map +1 -0
  162. package/dist/mem/projects.d.ts +13 -0
  163. package/dist/mem/projects.d.ts.map +1 -0
  164. package/dist/mem/projects.js +37 -0
  165. package/dist/mem/projects.js.map +1 -0
  166. package/dist/mem/search.d.ts +32 -0
  167. package/dist/mem/search.d.ts.map +1 -0
  168. package/dist/mem/search.js +125 -0
  169. package/dist/mem/search.js.map +1 -0
  170. package/dist/mem/sessions.d.ts +37 -0
  171. package/dist/mem/sessions.d.ts.map +1 -0
  172. package/dist/mem/sessions.js +270 -0
  173. package/dist/mem/sessions.js.map +1 -0
  174. package/dist/mem/types.d.ts +176 -0
  175. package/dist/mem/types.d.ts.map +1 -0
  176. package/dist/mem/types.js +10 -0
  177. package/dist/mem/types.js.map +1 -0
  178. package/dist/task/index.d.ts +9 -0
  179. package/dist/task/index.d.ts.map +1 -0
  180. package/dist/task/index.js +9 -0
  181. package/dist/task/index.js.map +1 -0
  182. package/dist/task/paths.d.ts +37 -0
  183. package/dist/task/paths.d.ts.map +1 -0
  184. package/dist/task/paths.js +49 -0
  185. package/dist/task/paths.js.map +1 -0
  186. package/dist/task/phase.d.ts +27 -0
  187. package/dist/task/phase.d.ts.map +1 -0
  188. package/dist/task/phase.js +24 -0
  189. package/dist/task/phase.js.map +1 -0
  190. package/dist/task/records.d.ts +39 -0
  191. package/dist/task/records.d.ts.map +1 -0
  192. package/dist/task/records.js +89 -0
  193. package/dist/task/records.js.map +1 -0
  194. package/dist/task/schema.d.ts +77 -0
  195. package/dist/task/schema.d.ts.map +1 -0
  196. package/dist/task/schema.js +220 -0
  197. package/dist/task/schema.js.map +1 -0
  198. package/dist/testing/index.d.ts +2 -0
  199. package/dist/testing/index.d.ts.map +1 -0
  200. package/dist/testing/index.js +4 -0
  201. package/dist/testing/index.js.map +1 -0
  202. package/package.json +78 -0
@@ -0,0 +1,207 @@
1
+ import { matchesInboxPolicy, DEFAULT_INBOX_POLICY } from "./inbox.js";
2
+ const TERMINAL_LIFECYCLES = new Set([
3
+ "done",
4
+ "error",
5
+ "killed",
6
+ "crashed",
7
+ ]);
8
+ function strField(ev, key) {
9
+ const v = ev[key];
10
+ return typeof v === "string" ? v : undefined;
11
+ }
12
+ function numField(ev, key) {
13
+ const v = ev[key];
14
+ return typeof v === "number" ? v : undefined;
15
+ }
16
+ /**
17
+ * Resolve the worker id an event refers to, and whether the event kind
18
+ * is allowed to *create* a worker entry (only `spawned` and clearly
19
+ * worker-identified terminal events can — this avoids phantom workers
20
+ * from plain `by` aliases).
21
+ */
22
+ function identifyWorker(ev) {
23
+ switch (ev.kind) {
24
+ case "spawned": {
25
+ const id = strField(ev, "as");
26
+ return id ? { id, canCreate: true } : null;
27
+ }
28
+ case "turn_started":
29
+ case "turn_finished":
30
+ case "interrupt_requested":
31
+ case "interrupted": {
32
+ const id = strField(ev, "worker");
33
+ return id ? { id, canCreate: false } : null;
34
+ }
35
+ case "killed": {
36
+ const explicit = strField(ev, "worker") ?? strField(ev, "as");
37
+ if (explicit)
38
+ return { id: explicit, canCreate: true };
39
+ const by = ev.by;
40
+ if (by.startsWith("supervisor:")) {
41
+ return { id: by.slice("supervisor:".length), canCreate: true };
42
+ }
43
+ return { id: by, canCreate: false };
44
+ }
45
+ case "done":
46
+ case "error": {
47
+ const explicit = strField(ev, "worker") ?? strField(ev, "as");
48
+ if (explicit)
49
+ return { id: explicit, canCreate: true };
50
+ const by = ev.by;
51
+ if (by.startsWith("supervisor:")) {
52
+ return { id: by.slice("supervisor:".length), canCreate: true };
53
+ }
54
+ return { id: by, canCreate: false };
55
+ }
56
+ default:
57
+ return null;
58
+ }
59
+ }
60
+ function blankWorker(id, ev) {
61
+ return {
62
+ workerId: id,
63
+ lifecycle: "running",
64
+ terminal: false,
65
+ activity: "idle",
66
+ pendingMessageCount: 0,
67
+ inboxPolicy: DEFAULT_INBOX_POLICY,
68
+ updatedAt: ev.ts,
69
+ lastSeq: ev.seq,
70
+ consumedInputSeq: 0,
71
+ };
72
+ }
73
+ /**
74
+ * Project durable channel events into the worker registry. Pure — only
75
+ * the event log feeds the projection (no pid files, no inbox cursors).
76
+ */
77
+ export function reduceWorkerRegistry(events, channel) {
78
+ const acc = new Map();
79
+ for (const ev of events) {
80
+ const ident = identifyWorker(ev);
81
+ if (!ident)
82
+ continue;
83
+ let w = acc.get(ident.id);
84
+ if (!w) {
85
+ if (!ident.canCreate)
86
+ continue;
87
+ w = blankWorker(ident.id, ev);
88
+ acc.set(ident.id, w);
89
+ }
90
+ w.updatedAt = ev.ts;
91
+ w.lastSeq = ev.seq;
92
+ switch (ev.kind) {
93
+ case "spawned": {
94
+ w.lifecycle = "running";
95
+ w.terminal = false;
96
+ w.activity = "idle";
97
+ delete w.activeTurnId;
98
+ delete w.activeTurnStartedAt;
99
+ delete w.exitCode;
100
+ delete w.signal;
101
+ delete w.reason;
102
+ delete w.error;
103
+ w.spawnedAt = ev.ts;
104
+ w.startedBy = ev.by;
105
+ w.provider = strField(ev, "provider") ?? w.provider;
106
+ w.agent = strField(ev, "agent") ?? w.agent;
107
+ w.inboxPolicy =
108
+ strField(ev, "inboxPolicy") ??
109
+ w.inboxPolicy;
110
+ break;
111
+ }
112
+ case "turn_started": {
113
+ w.activity = "mid-turn";
114
+ w.activeTurnId = strField(ev, "turnId");
115
+ w.activeTurnStartedAt = ev.ts;
116
+ const inputSeq = numField(ev, "inputSeq");
117
+ if (inputSeq !== undefined && inputSeq > w.consumedInputSeq) {
118
+ w.consumedInputSeq = inputSeq;
119
+ }
120
+ break;
121
+ }
122
+ case "turn_finished": {
123
+ w.activity = "idle";
124
+ delete w.activeTurnId;
125
+ delete w.activeTurnStartedAt;
126
+ break;
127
+ }
128
+ case "interrupted": {
129
+ // An interrupt aborts the active turn.
130
+ w.activity = "idle";
131
+ delete w.activeTurnId;
132
+ delete w.activeTurnStartedAt;
133
+ break;
134
+ }
135
+ case "interrupt_requested":
136
+ // Durable intent only — no lifecycle/activity change.
137
+ break;
138
+ case "done": {
139
+ w.activity = "idle";
140
+ delete w.activeTurnId;
141
+ delete w.activeTurnStartedAt;
142
+ if (ev.synthesized === true) {
143
+ w.lifecycle = "done";
144
+ w.terminal = true;
145
+ w.exitCode = numField(ev, "exit_code") ?? w.exitCode;
146
+ }
147
+ break;
148
+ }
149
+ case "error": {
150
+ w.activity = "idle";
151
+ delete w.activeTurnId;
152
+ delete w.activeTurnStartedAt;
153
+ w.error = strField(ev, "message") ?? w.error;
154
+ if (ev.synthesized === true ||
155
+ ev.by.startsWith("supervisor:")) {
156
+ w.lifecycle = "error";
157
+ w.terminal = true;
158
+ w.exitCode = numField(ev, "exit_code") ?? w.exitCode;
159
+ w.signal = strField(ev, "exit_signal") ?? w.signal;
160
+ }
161
+ break;
162
+ }
163
+ case "killed": {
164
+ const reason = strField(ev, "reason");
165
+ w.lifecycle = reason === "crash" ? "crashed" : "killed";
166
+ w.terminal = true;
167
+ w.activity = "idle";
168
+ delete w.activeTurnId;
169
+ delete w.activeTurnStartedAt;
170
+ w.reason = reason ?? w.reason;
171
+ w.signal = strField(ev, "signal") ?? w.signal;
172
+ break;
173
+ }
174
+ default:
175
+ break;
176
+ }
177
+ }
178
+ // Second pass: pending message count from durable events only.
179
+ for (const w of acc.values()) {
180
+ if (w.terminal) {
181
+ w.pendingMessageCount = 0;
182
+ continue;
183
+ }
184
+ let pending = 0;
185
+ for (const ev of events) {
186
+ if (ev.seq <= w.consumedInputSeq)
187
+ continue;
188
+ if (matchesInboxPolicy(ev, w.workerId, w.inboxPolicy))
189
+ pending++;
190
+ }
191
+ w.pendingMessageCount = pending;
192
+ }
193
+ const workers = [];
194
+ for (const w of acc.values()) {
195
+ const { consumedInputSeq: _drop, ...state } = w;
196
+ void _drop;
197
+ if (channel)
198
+ state.channel = channel;
199
+ workers.push(state);
200
+ }
201
+ workers.sort((a, b) => a.workerId.localeCompare(b.workerId));
202
+ return { workers };
203
+ }
204
+ export function isTerminalLifecycle(lifecycle) {
205
+ return TERMINAL_LIFECYCLES.has(lifecycle);
206
+ }
207
+ //# sourceMappingURL=worker-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-state.js","sourceRoot":"","sources":["../../../../src/channel/internal/store/worker-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./channel/index.js";
2
+ export * from "./task/index.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ // Root barrel — re-exports the channel and task public APIs so callers
2
+ // can `import { ... } from "@mindfoldhq/trellis-core"`. Sub-path
3
+ // imports (`@mindfoldhq/trellis-core/channel`, `/task`) remain the
4
+ // recommended form for tree-shake-friendly consumption.
5
+ export * from "./channel/index.js";
6
+ export * from "./task/index.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,iEAAiE;AACjE,mEAAmE;AACnE,wDAAwD;AAExD,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Persisted Claude Code session reader.
3
+ *
4
+ * Layout: `~/.claude/projects/<sanitized-cwd>/<sessionId>.jsonl`, with an
5
+ * optional `<projectDir>/sessions-index.json` providing cwd / created / title.
6
+ */
7
+ import type { DialogueTurn, MemFilter, MemSessionInfo, SearchHit, TaskPyEvent } from "../types.js";
8
+ export declare function claudeListSessions(f: MemFilter): MemSessionInfo[];
9
+ export declare function claudeExtractDialogue(s: MemSessionInfo): DialogueTurn[];
10
+ export declare function claudeSearch(s: MemSessionInfo, kw: string): SearchHit;
11
+ /**
12
+ * Single-pass scan of a Claude JSONL file that produces both the cleaned
13
+ * dialogue turns (semantically identical to {@link claudeExtractDialogue}) and
14
+ * the list of `task.py create|start` Bash tool_use events with their
15
+ * `turnIndex`. Compaction resets both `turns` AND `events` — pre-compact event
16
+ * indices stop pointing at real turns once history is collapsed.
17
+ */
18
+ export declare function collectClaudeTurnsAndEvents(s: MemSessionInfo): {
19
+ turns: DialogueTurn[];
20
+ events: TaskPyEvent[];
21
+ };
22
+ //# sourceMappingURL=claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../src/mem/adapters/claude.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,cAAc,EACd,SAAS,EACT,WAAW,EACZ,MAAM,aAAa,CAAC;AAkErB,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,SAAS,GAAG,cAAc,EAAE,CA+DjE;AAID,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,cAAc,GAAG,YAAY,EAAE,CAuDvE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAErE;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,CAAC,EAAE,cAAc,GAAG;IAC9D,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CA6EA"}
@@ -0,0 +1,252 @@
1
+ /**
2
+ * Persisted Claude Code session reader.
3
+ *
4
+ * Layout: `~/.claude/projects/<sanitized-cwd>/<sessionId>.jsonl`, with an
5
+ * optional `<projectDir>/sessions-index.json` providing cwd / created / title.
6
+ */
7
+ import * as fs from "node:fs";
8
+ import * as path from "node:path";
9
+ import { stripInjectionTags, isBootstrapTurn } from "../dialogue.js";
10
+ import { inRangeOverlap, sameProject } from "../filter.js";
11
+ import { findInJsonl, readJsonFile, readJsonl, readJsonlFirst, } from "../internal/jsonl.js";
12
+ import { CLAUDE_PROJECTS, claudeProjectDirFromCwd } from "../internal/paths.js";
13
+ import { parseTaskPyCommandsAll } from "../phase.js";
14
+ import { searchInDialogue } from "../search.js";
15
+ function resolveScopedClaudeProjectDirs(cwd) {
16
+ const direct = claudeProjectDirFromCwd(cwd);
17
+ const fallback = new Set();
18
+ if (fs.existsSync(direct))
19
+ fallback.add(direct);
20
+ if (!fs.existsSync(CLAUDE_PROJECTS))
21
+ return [...fallback];
22
+ for (const dir of fs.readdirSync(CLAUDE_PROJECTS, { withFileTypes: true })) {
23
+ if (!dir.isDirectory())
24
+ continue;
25
+ const dirPath = path.join(CLAUDE_PROJECTS, dir.name);
26
+ let entries;
27
+ try {
28
+ entries = fs.readdirSync(dirPath, { withFileTypes: true });
29
+ }
30
+ catch {
31
+ continue;
32
+ }
33
+ const file = entries.find((entry) => entry.isFile() && entry.name.endsWith(".jsonl"));
34
+ if (!file)
35
+ continue;
36
+ const evt = findInJsonl(path.join(dirPath, file.name), (o) => typeof o.cwd === "string", 20);
37
+ if (sameProject(evt?.cwd, cwd))
38
+ fallback.add(dirPath);
39
+ }
40
+ return [...fallback];
41
+ }
42
+ // ---------- list ----------
43
+ export function claudeListSessions(f) {
44
+ if (!fs.existsSync(CLAUDE_PROJECTS))
45
+ return [];
46
+ const out = [];
47
+ const projectDirs = f.cwd
48
+ ? resolveScopedClaudeProjectDirs(f.cwd)
49
+ : fs.readdirSync(CLAUDE_PROJECTS).map((d) => path.join(CLAUDE_PROJECTS, d));
50
+ for (const dir of projectDirs) {
51
+ let entries;
52
+ try {
53
+ entries = fs.readdirSync(dir, { withFileTypes: true });
54
+ }
55
+ catch {
56
+ continue;
57
+ }
58
+ const indexFile = path.join(dir, "sessions-index.json");
59
+ const index = readJsonFile(indexFile);
60
+ const indexById = new Map();
61
+ for (const e of Array.isArray(index?.entries) ? index.entries : []) {
62
+ if (typeof e.id === "string")
63
+ indexById.set(e.id, e);
64
+ }
65
+ for (const e of entries) {
66
+ if (!e.isFile() || !e.name.endsWith(".jsonl"))
67
+ continue;
68
+ const filePath = path.join(dir, e.name);
69
+ const id = e.name.replace(/\.jsonl$/, "");
70
+ const idx = indexById.get(id);
71
+ let cwd = idx?.cwd;
72
+ let created = idx?.created;
73
+ const title = idx?.title;
74
+ if (!cwd || !created) {
75
+ const evt = findInJsonl(filePath, (o) => typeof o.cwd === "string", 100);
76
+ cwd = cwd ?? evt?.cwd;
77
+ created =
78
+ created ??
79
+ evt?.timestamp ??
80
+ readJsonlFirst(filePath)?.timestamp;
81
+ }
82
+ const stat = fs.statSync(filePath);
83
+ const updated = stat.mtime.toISOString();
84
+ // Interval overlap: cross-day sessions that started before --since but
85
+ // were still active inside the window must survive.
86
+ if (!inRangeOverlap(created, updated, f))
87
+ continue;
88
+ if (f.cwd && cwd && !sameProject(cwd, f.cwd))
89
+ continue;
90
+ out.push({
91
+ platform: "claude",
92
+ id,
93
+ title,
94
+ cwd,
95
+ created,
96
+ updated,
97
+ filePath,
98
+ });
99
+ }
100
+ }
101
+ return out;
102
+ }
103
+ // ---------- extract ----------
104
+ export function claudeExtractDialogue(s) {
105
+ // - user: type=="user" + role=="user" + content is a string
106
+ // - assistant: type=="assistant" + role=="assistant", keep only `text` blocks
107
+ // - thinking / tool_use blocks dropped entirely; injection tags stripped
108
+ // - compaction: an `isCompactSummary` user event resets prior turns and
109
+ // replaces them with a single synthetic [compact summary] turn
110
+ let turns = [];
111
+ readJsonl(s.filePath, (obj) => {
112
+ const t = obj.type;
113
+ const msg = obj.message;
114
+ if (!msg)
115
+ return;
116
+ const content = msg.content;
117
+ if (t === "user" && obj.isCompactSummary === true) {
118
+ let summary = "";
119
+ if (typeof content === "string") {
120
+ summary = stripInjectionTags(content);
121
+ }
122
+ else if (Array.isArray(content)) {
123
+ const parts = [];
124
+ for (const block of content) {
125
+ if (block.type === "text" && typeof block.text === "string") {
126
+ const cleaned = stripInjectionTags(block.text);
127
+ if (cleaned)
128
+ parts.push(cleaned);
129
+ }
130
+ }
131
+ summary = parts.join("\n\n");
132
+ }
133
+ turns = summary
134
+ ? [{ role: "user", text: `[compact summary]\n${summary}` }]
135
+ : [];
136
+ return;
137
+ }
138
+ if (t === "user" && msg.role === "user") {
139
+ if (typeof content === "string") {
140
+ const text = stripInjectionTags(content);
141
+ if (text && !isBootstrapTurn(text, content.length)) {
142
+ turns.push({ role: "user", text });
143
+ }
144
+ }
145
+ }
146
+ else if (t === "assistant" &&
147
+ msg.role === "assistant" &&
148
+ Array.isArray(content)) {
149
+ const parts = [];
150
+ for (const block of content) {
151
+ if (block.type === "text" && typeof block.text === "string") {
152
+ const cleaned = stripInjectionTags(block.text);
153
+ if (cleaned)
154
+ parts.push(cleaned);
155
+ }
156
+ }
157
+ if (parts.length)
158
+ turns.push({ role: "assistant", text: parts.join("\n\n") });
159
+ }
160
+ });
161
+ return turns;
162
+ }
163
+ export function claudeSearch(s, kw) {
164
+ return searchInDialogue(claudeExtractDialogue(s), kw);
165
+ }
166
+ /**
167
+ * Single-pass scan of a Claude JSONL file that produces both the cleaned
168
+ * dialogue turns (semantically identical to {@link claudeExtractDialogue}) and
169
+ * the list of `task.py create|start` Bash tool_use events with their
170
+ * `turnIndex`. Compaction resets both `turns` AND `events` — pre-compact event
171
+ * indices stop pointing at real turns once history is collapsed.
172
+ */
173
+ export function collectClaudeTurnsAndEvents(s) {
174
+ let turns = [];
175
+ let events = [];
176
+ readJsonl(s.filePath, (obj) => {
177
+ const t = obj.type;
178
+ const msg = obj.message;
179
+ if (!msg)
180
+ return;
181
+ const content = msg.content;
182
+ if (t === "user" && obj.isCompactSummary === true) {
183
+ let summary = "";
184
+ if (typeof content === "string") {
185
+ summary = stripInjectionTags(content);
186
+ }
187
+ else if (Array.isArray(content)) {
188
+ const parts = [];
189
+ for (const block of content) {
190
+ if (block.type === "text" && typeof block.text === "string") {
191
+ const cleaned = stripInjectionTags(block.text);
192
+ if (cleaned)
193
+ parts.push(cleaned);
194
+ }
195
+ }
196
+ summary = parts.join("\n\n");
197
+ }
198
+ turns = summary
199
+ ? [{ role: "user", text: `[compact summary]\n${summary}` }]
200
+ : [];
201
+ events = [];
202
+ return;
203
+ }
204
+ if (t === "user" && msg.role === "user") {
205
+ if (typeof content === "string") {
206
+ const text = stripInjectionTags(content);
207
+ if (text && !isBootstrapTurn(text, content.length)) {
208
+ turns.push({ role: "user", text });
209
+ }
210
+ }
211
+ return;
212
+ }
213
+ if (t === "assistant" &&
214
+ msg.role === "assistant" &&
215
+ Array.isArray(content)) {
216
+ const parts = [];
217
+ for (const block of content) {
218
+ if (block.type === "text" && typeof block.text === "string") {
219
+ const cleaned = stripInjectionTags(block.text);
220
+ if (cleaned)
221
+ parts.push(cleaned);
222
+ }
223
+ else if (block.type === "tool_use") {
224
+ if (block.name !== "Bash")
225
+ continue;
226
+ const inp = block.input;
227
+ if (!inp || typeof inp !== "object")
228
+ continue;
229
+ const command = inp.command;
230
+ if (typeof command !== "string")
231
+ continue;
232
+ const parsedAll = parseTaskPyCommandsAll(command);
233
+ for (const parsed of parsedAll) {
234
+ const ev = {
235
+ action: parsed.action,
236
+ timestamp: obj.timestamp ?? "",
237
+ turnIndex: turns.length,
238
+ ...(parsed.action === "create"
239
+ ? { slug: parsed.slug }
240
+ : { taskDir: parsed.taskDir }),
241
+ };
242
+ events.push(ev);
243
+ }
244
+ }
245
+ }
246
+ if (parts.length)
247
+ turns.push({ role: "assistant", text: parts.join("\n\n") });
248
+ }
249
+ });
250
+ return { turns, events };
251
+ }
252
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/mem/adapters/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Persisted Codex session reader.
3
+ *
4
+ * Layout: `~/.codex/sessions/**\/rollout-<ts>-<id>.jsonl`. Metadata is read
5
+ * from the first event's `payload`; the filename timestamp is a fallback
6
+ * `created`.
7
+ */
8
+ import type { DialogueTurn, MemFilter, MemSessionInfo, SearchHit, TaskPyEvent } from "../types.js";
9
+ /**
10
+ * Recover the shell command string from a Codex `function_call` event's
11
+ * `arguments` field. Codex versions vary in how they encode it:
12
+ *
13
+ * - a raw shell string
14
+ * - a stringified JSON object with `cmd` / `command` (string) or
15
+ * `argv` (string[] — joined with spaces)
16
+ * - a raw object with the same `cmd` / `command` / `argv` shape
17
+ *
18
+ * Returns `undefined` when no command can be recovered.
19
+ */
20
+ export declare function commandFromCodexArguments(argsRaw: unknown): string | undefined;
21
+ export declare function codexListSessions(f: MemFilter): MemSessionInfo[];
22
+ export declare function codexExtractDialogue(s: MemSessionInfo): DialogueTurn[];
23
+ export declare function codexSearch(s: MemSessionInfo, kw: string): SearchHit;
24
+ /**
25
+ * Codex twin of `collectClaudeTurnsAndEvents`. Single pass over the rollout
26
+ * file; emits both the cleaned dialogue turns and the list of
27
+ * `task.py create|start` invocations found inside `function_call` events whose
28
+ * `name === "exec_command"` (or `"shell"`). Compaction resets both `turns` and
29
+ * `events`.
30
+ */
31
+ export declare function collectCodexTurnsAndEvents(s: MemSessionInfo): {
32
+ turns: DialogueTurn[];
33
+ events: TaskPyEvent[];
34
+ };
35
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/mem/adapters/codex.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,OAAO,KAAK,EAEV,YAAY,EACZ,SAAS,EACT,cAAc,EACd,SAAS,EACT,WAAW,EACZ,MAAM,aAAa,CAAC;AAoCrB;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAgC9E;AAID,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,SAAS,GAAG,cAAc,EAAE,CAmChE;AAwBD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,cAAc,GAAG,YAAY,EAAE,CA8BtE;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAEpE;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,cAAc,GAAG;IAC7D,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAoDA"}