@claudexor/daemon 5.0.1 → 5.1.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 (185) hide show
  1. package/dist/client.d.ts +56 -0
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/command-store.d.ts +2 -0
  4. package/dist/command-store.d.ts.map +1 -1
  5. package/dist/command-store.js.map +1 -1
  6. package/dist/deferred-message-owner.d.ts +14 -1
  7. package/dist/deferred-message-owner.d.ts.map +1 -1
  8. package/dist/deferred-messages.d.ts +22 -1
  9. package/dist/deferred-messages.d.ts.map +1 -1
  10. package/dist/deferred-messages.js +60 -18
  11. package/dist/deferred-messages.js.map +1 -1
  12. package/dist/enqueue-command.d.ts +19 -4
  13. package/dist/enqueue-command.d.ts.map +1 -1
  14. package/dist/enqueue-command.js +72 -8
  15. package/dist/enqueue-command.js.map +1 -1
  16. package/dist/index.d.ts +2 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +1 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/interactions.d.ts.map +1 -1
  21. package/dist/interactions.js +29 -7
  22. package/dist/interactions.js.map +1 -1
  23. package/dist/job-record.d.ts.map +1 -1
  24. package/dist/job-record.js +4 -3
  25. package/dist/job-record.js.map +1 -1
  26. package/dist/job-settlement.d.ts +3 -1
  27. package/dist/job-settlement.d.ts.map +1 -1
  28. package/dist/job-settlement.js +13 -0
  29. package/dist/job-settlement.js.map +1 -1
  30. package/dist/model-operation-execution.d.ts +10 -0
  31. package/dist/model-operation-execution.d.ts.map +1 -1
  32. package/dist/model-operation-execution.js +12 -5
  33. package/dist/model-operation-execution.js.map +1 -1
  34. package/dist/model-operations.d.ts +1 -0
  35. package/dist/model-operations.d.ts.map +1 -1
  36. package/dist/model-operations.js +20 -10
  37. package/dist/model-operations.js.map +1 -1
  38. package/dist/quota-registry-support.d.ts.map +1 -1
  39. package/dist/quota-registry-support.js +14 -9
  40. package/dist/quota-registry-support.js.map +1 -1
  41. package/dist/server.d.ts +2 -3
  42. package/dist/server.d.ts.map +1 -1
  43. package/dist/server.js +12 -38
  44. package/dist/server.js.map +1 -1
  45. package/dist/store/blob-files.d.ts +17 -6
  46. package/dist/store/blob-files.d.ts.map +1 -1
  47. package/dist/store/blob-files.js +29 -5
  48. package/dist/store/blob-files.js.map +1 -1
  49. package/dist/store/command-prune.d.ts.map +1 -1
  50. package/dist/store/command-prune.js +4 -0
  51. package/dist/store/command-prune.js.map +1 -1
  52. package/dist/store/commands.d.ts +29 -2
  53. package/dist/store/commands.d.ts.map +1 -1
  54. package/dist/store/commands.js +136 -26
  55. package/dist/store/commands.js.map +1 -1
  56. package/dist/store/deferred-message-rows.d.ts +10 -0
  57. package/dist/store/deferred-message-rows.d.ts.map +1 -1
  58. package/dist/store/deferred-message-rows.js +28 -1
  59. package/dist/store/deferred-message-rows.js.map +1 -1
  60. package/dist/store/deferred-messages.d.ts +19 -5
  61. package/dist/store/deferred-messages.d.ts.map +1 -1
  62. package/dist/store/deferred-messages.js +93 -30
  63. package/dist/store/deferred-messages.js.map +1 -1
  64. package/dist/store/event-store.d.ts +2 -0
  65. package/dist/store/event-store.d.ts.map +1 -1
  66. package/dist/store/event-store.js +3 -1
  67. package/dist/store/event-store.js.map +1 -1
  68. package/dist/store/external-files.d.ts +57 -2
  69. package/dist/store/external-files.d.ts.map +1 -1
  70. package/dist/store/external-files.js +178 -3
  71. package/dist/store/external-files.js.map +1 -1
  72. package/dist/store/idempotency.d.ts +1 -1
  73. package/dist/store/idempotency.d.ts.map +1 -1
  74. package/dist/store/idempotency.js +2 -1
  75. package/dist/store/idempotency.js.map +1 -1
  76. package/dist/store/import-context.js +1 -1
  77. package/dist/store/import-context.js.map +1 -1
  78. package/dist/store/libuv-pool.d.ts +25 -0
  79. package/dist/store/libuv-pool.d.ts.map +1 -0
  80. package/dist/store/libuv-pool.js +96 -0
  81. package/dist/store/libuv-pool.js.map +1 -0
  82. package/dist/store/maintenance-worker.d.ts.map +1 -1
  83. package/dist/store/maintenance-worker.js +45 -0
  84. package/dist/store/maintenance-worker.js.map +1 -1
  85. package/dist/store/maintenance.d.ts +28 -2
  86. package/dist/store/maintenance.d.ts.map +1 -1
  87. package/dist/store/maintenance.js +36 -6
  88. package/dist/store/maintenance.js.map +1 -1
  89. package/dist/store/project-router.d.ts +108 -1
  90. package/dist/store/project-router.d.ts.map +1 -1
  91. package/dist/store/project-router.js +38 -0
  92. package/dist/store/project-router.js.map +1 -1
  93. package/dist/store/publish-blob.d.ts.map +1 -1
  94. package/dist/store/publish-blob.js +36 -14
  95. package/dist/store/publish-blob.js.map +1 -1
  96. package/dist/store/purge-files.d.ts +11 -2
  97. package/dist/store/purge-files.d.ts.map +1 -1
  98. package/dist/store/purge-files.js +34 -7
  99. package/dist/store/purge-files.js.map +1 -1
  100. package/dist/store/resource-release.d.ts +15 -0
  101. package/dist/store/resource-release.d.ts.map +1 -0
  102. package/dist/store/resource-release.js +56 -0
  103. package/dist/store/resource-release.js.map +1 -0
  104. package/dist/store/resource-rows.d.ts +2 -0
  105. package/dist/store/resource-rows.d.ts.map +1 -1
  106. package/dist/store/resource-rows.js.map +1 -1
  107. package/dist/store/resource-uses.d.ts +84 -0
  108. package/dist/store/resource-uses.d.ts.map +1 -0
  109. package/dist/store/resource-uses.js +129 -0
  110. package/dist/store/resource-uses.js.map +1 -0
  111. package/dist/store/resources.d.ts +16 -2
  112. package/dist/store/resources.d.ts.map +1 -1
  113. package/dist/store/resources.js +42 -3
  114. package/dist/store/resources.js.map +1 -1
  115. package/dist/store/retention-changes.d.ts +8 -2
  116. package/dist/store/retention-changes.d.ts.map +1 -1
  117. package/dist/store/retention-changes.js +24 -11
  118. package/dist/store/retention-changes.js.map +1 -1
  119. package/dist/store/retention-generations.d.ts +7 -2
  120. package/dist/store/retention-generations.d.ts.map +1 -1
  121. package/dist/store/retention-generations.js +71 -26
  122. package/dist/store/retention-generations.js.map +1 -1
  123. package/dist/store/retention-reference-reader.d.ts +26 -1
  124. package/dist/store/retention-reference-reader.d.ts.map +1 -1
  125. package/dist/store/retention-reference-reader.js +31 -7
  126. package/dist/store/retention-reference-reader.js.map +1 -1
  127. package/dist/store/retention-references.d.ts +5 -0
  128. package/dist/store/retention-references.d.ts.map +1 -1
  129. package/dist/store/retention-references.js +35 -6
  130. package/dist/store/retention-references.js.map +1 -1
  131. package/dist/store/schema.d.ts +2 -2
  132. package/dist/store/schema.d.ts.map +1 -1
  133. package/dist/store/schema.js +17 -2
  134. package/dist/store/schema.js.map +1 -1
  135. package/dist/store/sql-command-router.d.ts +12 -1
  136. package/dist/store/sql-command-router.d.ts.map +1 -1
  137. package/dist/store/sql-command-router.js +19 -1
  138. package/dist/store/sql-command-router.js.map +1 -1
  139. package/dist/store/sql-daemon-services.d.ts.map +1 -1
  140. package/dist/store/sql-daemon-services.js +9 -8
  141. package/dist/store/sql-daemon-services.js.map +1 -1
  142. package/dist/store/sql-validation.d.ts.map +1 -1
  143. package/dist/store/sql-validation.js +1 -0
  144. package/dist/store/sql-validation.js.map +1 -1
  145. package/dist/store/store.d.ts +9 -0
  146. package/dist/store/store.d.ts.map +1 -1
  147. package/dist/store/store.js +19 -0
  148. package/dist/store/store.js.map +1 -1
  149. package/dist/store/terminal-files.d.ts +24 -2
  150. package/dist/store/terminal-files.d.ts.map +1 -1
  151. package/dist/store/terminal-files.js +153 -31
  152. package/dist/store/terminal-files.js.map +1 -1
  153. package/dist/store/thread-closure.d.ts +62 -0
  154. package/dist/store/thread-closure.d.ts.map +1 -0
  155. package/dist/store/thread-closure.js +290 -0
  156. package/dist/store/thread-closure.js.map +1 -0
  157. package/dist/store/thread-retirement.d.ts +29 -0
  158. package/dist/store/thread-retirement.d.ts.map +1 -0
  159. package/dist/store/thread-retirement.js +123 -0
  160. package/dist/store/thread-retirement.js.map +1 -0
  161. package/dist/store/threads.d.ts +2 -0
  162. package/dist/store/threads.d.ts.map +1 -1
  163. package/dist/store/threads.js +10 -1
  164. package/dist/store/threads.js.map +1 -1
  165. package/dist/store/upload-imports.d.ts.map +1 -1
  166. package/dist/store/upload-imports.js +16 -3
  167. package/dist/store/upload-imports.js.map +1 -1
  168. package/dist/store/uploads.d.ts +13 -2
  169. package/dist/store/uploads.d.ts.map +1 -1
  170. package/dist/store/uploads.js +76 -30
  171. package/dist/store/uploads.js.map +1 -1
  172. package/dist/store-contracts.d.ts +32 -2
  173. package/dist/store-contracts.d.ts.map +1 -1
  174. package/dist/terminal-authority.d.ts +9 -1
  175. package/dist/terminal-authority.d.ts.map +1 -1
  176. package/dist/terminal-authority.js +32 -0
  177. package/dist/terminal-authority.js.map +1 -1
  178. package/dist/thread-lifecycle.d.ts +3 -1
  179. package/dist/thread-lifecycle.d.ts.map +1 -1
  180. package/dist/thread-lifecycle.js +2 -2
  181. package/dist/thread-lifecycle.js.map +1 -1
  182. package/dist/writer-lease.d.ts.map +1 -1
  183. package/dist/writer-lease.js +6 -3
  184. package/dist/writer-lease.js.map +1 -1
  185. package/package.json +5 -5
@@ -0,0 +1,290 @@
1
+ import { createHash } from "node:crypto";
2
+ import { commandRow, hydrateCommand } from "./command-rows.js";
3
+ import { isServedPid } from "./generations.js";
4
+ import { decodeBody, hydrateTurn } from "./thread-rows.js";
5
+ import { deferredMessageDetail } from "./deferred-message-rows.js";
6
+ const COLUMNS = `id,pid,operation,client_id,state,run_id,task_id,run_dir,thread_id,turn_id,delegated_from,
7
+ continue_from,scope_root,created_at,started_at,finished_at,summary,params_sha,result_sha,error,kind,live,
8
+ needs_decision,response_state,response_expires_at,request_resource_id,response_resource_id,task_group_id`;
9
+ const bytesHex = (value) => value ? createHash("sha256").update(value).digest("hex") : null;
10
+ /** A document's path segment: never a separator, never a dot-only name. */
11
+ const segment = (value) => encodeURIComponent(value).replace(/^\.+/, (dots) => "%2E".repeat(dots.length));
12
+ function refsOf(thread, turns) {
13
+ const refs = new Set([
14
+ ...thread.run_ids,
15
+ ...(thread.head_run_id ? [thread.head_run_id] : []),
16
+ ]);
17
+ for (const turn of turns) {
18
+ const body = decodeBody(turn);
19
+ if (turn.run_id)
20
+ refs.add(turn.run_id);
21
+ for (const key of ["parent_run_id", "answers_plan_run_id", "plan_run_id"]) {
22
+ const value = body[key];
23
+ if (typeof value === "string" && value)
24
+ refs.add(value);
25
+ }
26
+ }
27
+ return [...refs];
28
+ }
29
+ /** The thread row alone and its store: one addressed read, for answers that
30
+ * need no closure. Like the closure, it answers for a purged thread too. */
31
+ export function readClosureThread(store, threadId) {
32
+ const row = store.prepare("SELECT body FROM thread WHERE id=?").get(threadId);
33
+ return row ? { storeId: store.storeId ?? "", thread: decodeBody(row) } : null;
34
+ }
35
+ /** Throws nothing for a retained thread; a missing thread returns null. */
36
+ export function readThreadClosure(store, threadId) {
37
+ const threadRow = store
38
+ .prepare("SELECT pid,state,head_revision,body FROM thread WHERE id=?")
39
+ .get(threadId);
40
+ if (!threadRow)
41
+ return null;
42
+ const thread = decodeBody(threadRow);
43
+ const turnRows = store
44
+ .prepare("SELECT id,ordinal,run_id,prompt_sha,body FROM turn WHERE thread_id=? ORDER BY ordinal")
45
+ .all(threadId);
46
+ const commands = new Map();
47
+ const pending = [];
48
+ const add = (rows) => {
49
+ for (const row of rows)
50
+ if (!commands.has(row.id)) {
51
+ commands.set(row.id, row);
52
+ pending.push(row);
53
+ }
54
+ };
55
+ const byThread = store.prepare(`SELECT ${COLUMNS} FROM command WHERE thread_id=?`);
56
+ const byAddress = store.prepare(`SELECT ${COLUMNS} FROM command WHERE id=?1 OR run_id=?1`);
57
+ const byEdge = store.prepare(`SELECT ${COLUMNS} FROM command WHERE continue_from=?1 OR delegated_from=?1`);
58
+ add(byThread.all(threadId));
59
+ const holds = [];
60
+ for (const ref of refsOf(thread, turnRows)) {
61
+ const rows = byAddress.all(ref);
62
+ if (rows.length === 0)
63
+ holds.push({
64
+ code: "command_record_not_retained",
65
+ subject: ref,
66
+ message: `run ${ref} is named by the thread but its command record is not retained`,
67
+ });
68
+ add(rows);
69
+ }
70
+ for (let next = pending.shift(); next; next = pending.shift()) {
71
+ for (const address of new Set([next.id, next.run_id].filter((v) => !!v)))
72
+ add(byEdge.all(address));
73
+ for (const edge of [next.continue_from, next.delegated_from])
74
+ if (edge) {
75
+ const rows = byAddress.all(edge);
76
+ if (rows.length === 0)
77
+ holds.push({
78
+ code: "command_record_not_retained",
79
+ subject: edge,
80
+ message: `command ${next.id} links to ${edge}, whose record is not retained`,
81
+ });
82
+ add(rows);
83
+ }
84
+ }
85
+ const ordered = [...commands.values()].sort((a, b) => (a.id < b.id ? -1 : 1));
86
+ const hash = createHash("sha256");
87
+ const note = (...values) => void hash.update(`${JSON.stringify(values)}\n`);
88
+ const documents = [{ key: "thread", path: "sql/thread.json" }];
89
+ note("store", store.storeId ?? null);
90
+ note("thread", threadId, threadRow.pid, threadRow.head_revision, bytesHex(threadRow.body));
91
+ for (const turn of turnRows) {
92
+ note("turn", turn.id, turn.ordinal, turn.run_id, turn.prompt_sha, bytesHex(turn.body));
93
+ documents.push({
94
+ key: `turn:${turn.id}`,
95
+ path: `sql/turns/${String(turn.ordinal).padStart(6, "0")}-${segment(turn.id)}.json`,
96
+ });
97
+ const body = decodeBody(turn);
98
+ if (!turn.run_id && !body["enqueue_error"])
99
+ holds.push({
100
+ code: "closure_not_quiescent",
101
+ subject: turn.id,
102
+ message: `turn ${turn.id} has no run and no recorded refusal; its start is still pending`,
103
+ });
104
+ }
105
+ const lanes = store
106
+ .prepare("SELECT id,body FROM session WHERE thread_id=? ORDER BY id")
107
+ .all(threadId);
108
+ for (const row of lanes) {
109
+ note("session", row.id, bytesHex(row.body));
110
+ documents.push({ key: `session:${row.id}`, path: `sql/sessions/${segment(row.id)}.json` });
111
+ }
112
+ const checkpoints = store
113
+ .prepare("SELECT harness_id,profile_id,turn_id,body FROM lane_checkpoint WHERE thread_id=? ORDER BY harness_id,profile_id")
114
+ .all(threadId);
115
+ for (const row of checkpoints) {
116
+ note("checkpoint", row.harness_id, row.profile_id, row.turn_id, bytesHex(row.body));
117
+ documents.push({
118
+ key: `checkpoint:${row.harness_id}\0${row.profile_id}`,
119
+ path: `sql/checkpoints/${segment(row.harness_id)}-${segment(row.profile_id || "default")}.json`,
120
+ });
121
+ }
122
+ const decisions = store.prepare("SELECT body FROM operator_decision WHERE run_id=?");
123
+ const terminals = store.prepare("SELECT event FROM run_terminal WHERE run_id=?");
124
+ // Node truncates TEXT at NUL; the key is runId\0interactionId.
125
+ const interactions = store.prepare("SELECT CAST(id AS BLOB) AS id,state,request,resolution FROM interaction WHERE run_id=?");
126
+ const drafts = store.prepare("SELECT * FROM deferred_message WHERE predecessor_job_id=?1 OR successor_job_id=?1");
127
+ const pendingFiles = store.prepare("SELECT 1 FROM effect_obligation WHERE kind='terminal_files' AND key=? AND state='pending'");
128
+ const seenDrafts = new Set();
129
+ for (const row of ordered) {
130
+ note("command", row.id, row.pid, row.operation, row.state, row.kind, row.live, row.run_id, row.run_dir, row.thread_id, row.turn_id, row.continue_from, row.delegated_from, row.finished_at, row.needs_decision, row.params_sha, row.result_sha, bytesHex(row.summary), bytesHex(row.error));
131
+ documents.push({ key: `command:${row.id}`, path: `sql/commands/${segment(row.id)}.json` });
132
+ const label = row.run_id ?? row.id;
133
+ if (row.state === "queued" || row.state === "running")
134
+ holds.push({
135
+ code: "closure_not_quiescent",
136
+ subject: label,
137
+ message: `${row.kind} command ${label} is still ${row.state}`,
138
+ });
139
+ if (row.needs_decision)
140
+ holds.push({
141
+ code: "closure_awaiting_decision",
142
+ subject: label,
143
+ message: `run ${label} is waiting for an operator decision`,
144
+ });
145
+ if (!isServedPid(store, row.pid))
146
+ holds.push({
147
+ code: "closure_partition_unavailable",
148
+ subject: label,
149
+ message: `run ${label} lives in a partition this engine does not serve`,
150
+ });
151
+ for (const draft of drafts.all(row.id)) {
152
+ if (seenDrafts.has(draft.id))
153
+ continue;
154
+ seenDrafts.add(draft.id);
155
+ note("deferred", draft.id, draft.state, draft.revision, draft.body_sha, draft.successor_job_id, draft.dispatched_revision, bytesHex(draft.hold));
156
+ documents.push({
157
+ key: `deferred:${draft.id}`,
158
+ path: `sql/deferred/${segment(draft.id)}.json`,
159
+ });
160
+ if (draft.state === "waiting" || draft.state === "held")
161
+ holds.push({
162
+ code: "closure_not_quiescent",
163
+ subject: draft.id,
164
+ message: `deferred message ${draft.id} is ${draft.state}`,
165
+ });
166
+ }
167
+ if (!row.run_id)
168
+ continue;
169
+ if (pendingFiles.get(row.run_id))
170
+ holds.push({
171
+ code: "closure_not_quiescent",
172
+ subject: row.run_id,
173
+ message: `run ${row.run_id} is terminal but its final files are not yet written`,
174
+ });
175
+ const decision = decisions.get(row.run_id);
176
+ if (decision) {
177
+ note("decision", row.run_id, bytesHex(decision.body));
178
+ documents.push({
179
+ key: `decision:${row.run_id}`,
180
+ path: `sql/decisions/${segment(row.run_id)}.json`,
181
+ });
182
+ }
183
+ const terminal = terminals.get(row.run_id);
184
+ if (terminal) {
185
+ note("terminal", row.run_id, bytesHex(terminal.event));
186
+ documents.push({
187
+ key: `terminal:${row.run_id}`,
188
+ path: `sql/terminals/${segment(row.run_id)}.json`,
189
+ });
190
+ }
191
+ const asked = interactions.all(row.run_id);
192
+ for (const interaction of asked) {
193
+ const id = Buffer.from(interaction.id).toString("utf8");
194
+ note("interaction", id, interaction.state, bytesHex(interaction.request), bytesHex(interaction.resolution));
195
+ documents.push({
196
+ key: `interaction:${id}`,
197
+ path: `sql/interactions/${segment(id)}.json`,
198
+ });
199
+ if (interaction.state === "pending")
200
+ holds.push({
201
+ code: "closure_not_quiescent",
202
+ subject: row.run_id,
203
+ message: `run ${row.run_id} has a pending interaction`,
204
+ });
205
+ }
206
+ }
207
+ return {
208
+ storeId: store.storeId ?? "",
209
+ thread,
210
+ headRevision: threadRow.head_revision,
211
+ digest: `sha256:${hash.digest("hex")}`,
212
+ turns: turnRows.map((row) => ({
213
+ turnId: row.id,
214
+ ordinal: row.ordinal,
215
+ runId: row.run_id,
216
+ promptSha256: row.prompt_sha,
217
+ })),
218
+ commands: ordered.map((row) => ({
219
+ jobId: row.id,
220
+ runId: row.run_id,
221
+ state: row.state,
222
+ kind: row.kind,
223
+ threadId: row.thread_id,
224
+ turnId: row.turn_id,
225
+ continueFrom: row.continue_from,
226
+ delegatedFrom: row.delegated_from,
227
+ runDir: row.run_dir,
228
+ })),
229
+ documents,
230
+ holds,
231
+ };
232
+ }
233
+ function rowDocument(store, blobs, threadId, key) {
234
+ const body = (sql, ...args) => {
235
+ const row = store.prepare(sql).get(...args);
236
+ return row ? decodeBody(row) : undefined;
237
+ };
238
+ const colon = key.indexOf(":");
239
+ const kind = colon < 0 ? key : key.slice(0, colon);
240
+ const id = colon < 0 ? "" : key.slice(colon + 1);
241
+ switch (kind) {
242
+ case "thread":
243
+ return body("SELECT body FROM thread WHERE id=?", threadId);
244
+ case "turn": {
245
+ const row = store.prepare("SELECT body,prompt_sha FROM turn WHERE id=?").get(id);
246
+ return row ? hydrateTurn(row, blobs) : undefined;
247
+ }
248
+ case "session":
249
+ return body("SELECT body FROM session WHERE id=?", id);
250
+ case "checkpoint": {
251
+ const [harness, profile] = id.split("\0");
252
+ return body("SELECT body FROM lane_checkpoint WHERE thread_id=? AND harness_id=? AND profile_id=?", threadId, harness, profile);
253
+ }
254
+ case "command": {
255
+ const row = commandRow(store, id);
256
+ return row ? hydrateCommand(row, blobs) : undefined;
257
+ }
258
+ case "decision":
259
+ return body("SELECT body FROM operator_decision WHERE run_id=?", id);
260
+ case "terminal": {
261
+ const row = store.prepare("SELECT event FROM run_terminal WHERE run_id=?").get(id);
262
+ return row ? JSON.parse(Buffer.from(row.event).toString("utf8")) : undefined;
263
+ }
264
+ case "interaction": {
265
+ const row = store
266
+ .prepare("SELECT state,request,resolution FROM interaction WHERE id=?")
267
+ .get(id);
268
+ if (!row)
269
+ return undefined;
270
+ const parse = (value) => JSON.parse(Buffer.from(value).toString("utf8"));
271
+ return {
272
+ state: row.state,
273
+ request: parse(row.request),
274
+ resolution: row.resolution ? parse(row.resolution) : null,
275
+ };
276
+ }
277
+ case "deferred": {
278
+ const row = store.prepare("SELECT * FROM deferred_message WHERE id=?").get(id);
279
+ return row ? deferredMessageDetail(store, blobs, row) : undefined;
280
+ }
281
+ default:
282
+ return undefined;
283
+ }
284
+ }
285
+ /** The exact bytes of one closure document; a vanished row is null, never empty. */
286
+ export function readThreadClosureDocument(store, blobs, threadId, key) {
287
+ const value = rowDocument(store, blobs, threadId, key);
288
+ return value === undefined ? null : Buffer.from(`${JSON.stringify(value, null, 2)}\n`);
289
+ }
290
+ //# sourceMappingURL=thread-closure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-closure.js","sourceRoot":"","sources":["../../src/store/thread-closure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { ThreadRetirementOperation, type Thread, type ThreadExportDigestEntry, type ThreadRetireRequest } from "@claudexor/schema";
2
+ import { type MutationContext, type SqlWriteContext } from "./mutation.js";
3
+ import type { Obligations } from "./obligations.js";
4
+ import type { SqlThreadStore } from "./threads.js";
5
+ /** A definite answer: bound to its operation, so it can never later accept. */
6
+ export interface RetirementRefusal {
7
+ code: string;
8
+ message: string;
9
+ error(): Error;
10
+ }
11
+ export declare function retirementRefusal(code: string, message: string): RetirementRefusal;
12
+ export declare function retirementOutcome(sql: Pick<SqlWriteContext, "prepare">, pid: number, threadId: string, operationId: string): ThreadRetirementOperation | null;
13
+ /** First writer wins, in the transaction of its decision; a replay keeps it. */
14
+ export declare function bindRetirementOutcome(tx: MutationContext, pid: number, threadId: string, operationId: string, refusal: RetirementRefusal | null, outcome?: "accepted" | "abandoned"): ThreadRetirementOperation;
15
+ /** An open purge obligation is open cleanup; its reason names the last failure. */
16
+ export declare function readThreadCleanup(obligations: Pick<Obligations, "get">, threadId: string): {
17
+ reason: string | null;
18
+ } | null;
19
+ /**
20
+ * The one conditional acceptance: active, closed or trashed goes straight to
21
+ * purged, atomically with its cleanup obligation and the operation's bound
22
+ * outcome, only while the exact closure is finished and still the one the caller
23
+ * exported. The check runs inside the same transaction as the decision, so any
24
+ * admission that committed first is seen and any later one finds a purged thread.
25
+ * Nothing here deletes bytes: the purge owner does, under the obligation this
26
+ * writes, and deletes only lane entries whose bytes these accepted entries hold.
27
+ */
28
+ export declare function acceptRetirement(threads: Pick<SqlThreadStore, "store" | "generation" | "getThread" | "prepare" | "applyInTx">, obligations: Pick<Obligations, "create">, id: string, request: ThreadRetireRequest, acceptedLane: readonly ThreadExportDigestEntry[]): Thread;
29
+ //# sourceMappingURL=thread-retirement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-retirement.d.ts","sourceRoot":"","sources":["../../src/store/thread-retirement.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,yBAAyB,EACzB,KAAK,MAAM,EACX,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,IAAI,KAAK,CAAC;CAChB;AAWD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAalF;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,EACrC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,yBAAyB,GAAG,IAAI,CAGlC;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,eAAe,EACnB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,iBAAiB,GAAG,IAAI,EACjC,OAAO,GAAE,UAAU,GAAG,WAAyB,GAC9C,yBAAyB,CAmB3B;AAED,mFAAmF;AACnF,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EACrC,QAAQ,EAAE,MAAM,GACf;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAIlC;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS,GAAG,WAAW,CAAC,EAC7F,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,EACxC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,SAAS,uBAAuB,EAAE,GAC/C,MAAM,CAwDR"}
@@ -0,0 +1,123 @@
1
+ import { hashJson, safeProblemMessage } from "@claudexor/util";
2
+ import { Thread as ThreadSchema, ThreadRetirementOperation, } from "@claudexor/schema";
3
+ import { reduceThreadLifecycle } from "../thread-lifecycle.js";
4
+ import { bindIdempotencyInTx, lookupIdempotency } from "./idempotency.js";
5
+ import { requireTransaction, runMutation, } from "./mutation.js";
6
+ import { readThreadClosure } from "./thread-closure.js";
7
+ const OPERATION = "thread.retire";
8
+ /** The key names the operation alone: abandon and retire share its one outcome. */
9
+ const keyOf = (pid, threadId, operationId) => ({
10
+ owner: "thread_retire",
11
+ pid,
12
+ keyDigest: hashJson({ threadId, operationId }),
13
+ });
14
+ const REQUEST_DIGEST = hashJson({ operation: OPERATION });
15
+ export function retirementRefusal(code, message) {
16
+ const safe = safeProblemMessage(message);
17
+ return {
18
+ code,
19
+ message: safe,
20
+ error: () => Object.assign(new Error(safe), {
21
+ code,
22
+ status: code === "thread_purged" ? 410 : 409,
23
+ retryable: false,
24
+ context: { settled: true },
25
+ }),
26
+ };
27
+ }
28
+ export function retirementOutcome(sql, pid, threadId, operationId) {
29
+ const binding = lookupIdempotency(sql, keyOf(pid, threadId, operationId), REQUEST_DIGEST);
30
+ return binding ? ThreadRetirementOperation.parse(binding.result) : null;
31
+ }
32
+ /** First writer wins, in the transaction of its decision; a replay keeps it. */
33
+ export function bindRetirementOutcome(tx, pid, threadId, operationId, refusal, outcome = "abandoned") {
34
+ requireTransaction(tx);
35
+ const settledAt = tx.now().toISOString();
36
+ const result = ThreadRetirementOperation.parse({
37
+ operationId,
38
+ outcome: refusal ? "refused" : outcome,
39
+ code: refusal?.code ?? null,
40
+ message: refusal?.message ?? null,
41
+ settledAt,
42
+ });
43
+ const bound = bindIdempotencyInTx(tx, {
44
+ ...keyOf(pid, threadId, operationId),
45
+ operation: OPERATION,
46
+ requestDigest: REQUEST_DIGEST,
47
+ targetId: threadId,
48
+ createdAt: settledAt,
49
+ result,
50
+ });
51
+ return ThreadRetirementOperation.parse(bound.result);
52
+ }
53
+ /** An open purge obligation is open cleanup; its reason names the last failure. */
54
+ export function readThreadCleanup(obligations, threadId) {
55
+ const row = obligations.get("purge_fs", threadId);
56
+ if (!row)
57
+ return null;
58
+ return { reason: row.payload.lastError ?? null };
59
+ }
60
+ /**
61
+ * The one conditional acceptance: active, closed or trashed goes straight to
62
+ * purged, atomically with its cleanup obligation and the operation's bound
63
+ * outcome, only while the exact closure is finished and still the one the caller
64
+ * exported. The check runs inside the same transaction as the decision, so any
65
+ * admission that committed first is seen and any later one finds a purged thread.
66
+ * Nothing here deletes bytes: the purge owner does, under the obligation this
67
+ * writes, and deletes only lane entries whose bytes these accepted entries hold.
68
+ */
69
+ export function acceptRetirement(threads, obligations, id, request, acceptedLane) {
70
+ const { store, generation } = threads;
71
+ const thread = threads.getThread(id);
72
+ if (!thread)
73
+ throw Object.assign(new Error(`no such thread: ${id}`), { status: 404 });
74
+ if (thread.state === "purged")
75
+ throw new Error(`thread ${id} is already purged`);
76
+ const next = ThreadSchema.parse({
77
+ ...reduceThreadLifecycle(thread, "retire"),
78
+ retirement: {
79
+ operationId: request.operationId,
80
+ exportId: request.exportId,
81
+ closureDigest: request.closureDigest,
82
+ contentDigest: request.contentDigest,
83
+ laneDigest: request.laneDigest,
84
+ acceptedAt: store.now().toISOString(),
85
+ },
86
+ });
87
+ const prepared = threads.prepare({ threads: [next] });
88
+ const refusal = runMutation(store, (tx) => {
89
+ // First writer wins here too: an operation already refused or abandoned keeps
90
+ // that outcome, and this request is answered by it without evaluating anything.
91
+ const bound = retirementOutcome(tx, generation.pid, id, request.operationId);
92
+ if (bound)
93
+ return retirementRefusal(bound.outcome === "abandoned"
94
+ ? "thread_retirement_abandoned"
95
+ : (bound.code ?? "thread_retirement_conflict"), bound.message ?? `operation ${request.operationId} was already ${bound.outcome}`);
96
+ const closure = readThreadClosure(store, id);
97
+ const blocked = closure?.holds[0];
98
+ const refused = blocked
99
+ ? retirementRefusal(blocked.code === "closure_not_quiescent" || blocked.code === "closure_awaiting_decision"
100
+ ? "thread_busy"
101
+ : "thread_export_incomplete", blocked.message)
102
+ : closure?.digest !== request.closureDigest
103
+ ? retirementRefusal("thread_export_stale", "the closure changed since this export")
104
+ : null;
105
+ if (refused) {
106
+ bindRetirementOutcome(tx, generation.pid, id, request.operationId, refused);
107
+ return refused;
108
+ }
109
+ // The shared reducer also ends the retired history's managed attachment holds.
110
+ threads.applyInTx(tx, prepared);
111
+ bindRetirementOutcome(tx, generation.pid, id, request.operationId, null, "accepted");
112
+ obligations.create("purge_fs", id, generation.pid, {
113
+ thread,
114
+ retirement: next.retirement,
115
+ acceptedLane,
116
+ });
117
+ return null;
118
+ });
119
+ if (refusal)
120
+ throw refusal.error();
121
+ return next;
122
+ }
123
+ //# sourceMappingURL=thread-retirement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-retirement.js","sourceRoot":"","sources":["../../src/store/thread-retirement.ts"],"names":[],"mappings":"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"}
@@ -55,6 +55,8 @@ export declare class SqlThreadStore {
55
55
  sessionId: string;
56
56
  profileId: string | null;
57
57
  }>;
58
+ /** Off the request thread, before `createTurn`: write a large prompt body it will own. */
59
+ stageTurnPrompt(prompt: string): Promise<void>;
58
60
  createTurn(threadId: string, prompt: string, input?: CreateTurnInput): ThreadTurn;
59
61
  findTurnByIdempotency(threadId: string, input: NonNullable<CreateTurnInput["idempotency"]>): ThreadTurn | undefined;
60
62
  /** Bind a started run to its turn and advance the thread head (runner-owned). */
@@ -1 +1 @@
1
- {"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../src/store/threads.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../src/store/threads.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import { reduceThreadLifecycle } from "../thread-lifecycle.js";
5
5
  import { deriveThreadTitle } from "../thread-title.js";
6
6
  import { threadCreationIdempotency, turnRunConflict, turnIdempotency, buildNewThread, mergeThreadPatch, } from "../thread-store-support.js";
7
7
  import { threadWorktreeMutation } from "../thread-worktree-state.js";
8
+ import { syncThreadResourceUsesInTx } from "./resource-uses.js";
8
9
  import { appendPreparedEventInTx, prepareEvent } from "./event-store.js";
9
10
  import { globalGeneration, isServedPid, requireServedGeneration } from "./generations.js";
10
11
  import { lookupIdempotency } from "./idempotency.js";
@@ -61,6 +62,7 @@ export class SqlThreadStore {
61
62
  ]);
62
63
  for (const id of touched)
63
64
  this.pingHeadInTx(tx, id);
65
+ syncThreadResourceUsesInTx(tx, prepared.mutation, this);
64
66
  }
65
67
  commit(mutation, purge) {
66
68
  const prepared = this.prepare(mutation);
@@ -142,7 +144,10 @@ export class SqlThreadStore {
142
144
  // An imported purged conversation may still have filesystem leftovers.
143
145
  // Repeating purge preserves its revision and accepted creation bindings.
144
146
  if (!this.store.prepare("SELECT 1 FROM effect_obligation WHERE kind='purge_fs' AND key=?").get(id)) {
145
- runMutation(this.store, () => this.obligations.create("purge_fs", id, this.generation.pid, { thread }));
147
+ // A retired thread's accepted inventory cleared with its cleanup, so nothing
148
+ // that reappeared since was exported: this cleanup holds every such byte.
149
+ const held = thread.retirement ? { retirement: thread.retirement, acceptedLane: [] } : {};
150
+ runMutation(this.store, () => this.obligations.create("purge_fs", id, this.generation.pid, { thread, ...held }));
146
151
  }
147
152
  return thread;
148
153
  }
@@ -231,6 +236,10 @@ export class SqlThreadStore {
231
236
  resumeMap(threadId, profileId = null) {
232
237
  return resumeMapFrom(this.sessionsForThread(threadId), threadId, profileId);
233
238
  }
239
+ /** Off the request thread, before `createTurn`: write a large prompt body it will own. */
240
+ async stageTurnPrompt(prompt) {
241
+ await this.blobs.stageBody(Buffer.from(prompt));
242
+ }
234
243
  createTurn(threadId, prompt, input = {}) {
235
244
  const idempotency = turnIdempotency(this.generation.name, threadId, input.idempotency);
236
245
  if (idempotency) {