@claudexor/daemon 1.0.0 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/client.d.ts +29 -1
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +24 -4
  4. package/dist/client.js.map +1 -1
  5. package/dist/command-authority.d.ts +11 -0
  6. package/dist/command-authority.d.ts.map +1 -0
  7. package/dist/command-authority.js +15 -0
  8. package/dist/command-authority.js.map +1 -0
  9. package/dist/command-retention.d.ts +5 -0
  10. package/dist/command-retention.d.ts.map +1 -0
  11. package/dist/command-retention.js +18 -0
  12. package/dist/command-retention.js.map +1 -0
  13. package/dist/command-store.d.ts +41 -0
  14. package/dist/command-store.d.ts.map +1 -0
  15. package/dist/command-store.js +197 -0
  16. package/dist/command-store.js.map +1 -0
  17. package/dist/events.d.ts +2 -3
  18. package/dist/events.d.ts.map +1 -1
  19. package/dist/events.js +2 -3
  20. package/dist/events.js.map +1 -1
  21. package/dist/index.d.ts +13 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +13 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/interactions.d.ts +32 -22
  26. package/dist/interactions.d.ts.map +1 -1
  27. package/dist/interactions.js +183 -56
  28. package/dist/interactions.js.map +1 -1
  29. package/dist/journal-events.d.ts +4 -0
  30. package/dist/journal-events.d.ts.map +1 -0
  31. package/dist/journal-events.js +23 -0
  32. package/dist/journal-events.js.map +1 -0
  33. package/dist/journal-manager.d.ts +72 -0
  34. package/dist/journal-manager.d.ts.map +1 -0
  35. package/dist/journal-manager.js +463 -0
  36. package/dist/journal-manager.js.map +1 -0
  37. package/dist/journal-projection.d.ts +11 -0
  38. package/dist/journal-projection.d.ts.map +1 -0
  39. package/dist/journal-projection.js +2 -0
  40. package/dist/journal-projection.js.map +1 -0
  41. package/dist/journal-recovery-files.d.ts +27 -0
  42. package/dist/journal-recovery-files.d.ts.map +1 -0
  43. package/dist/journal-recovery-files.js +209 -0
  44. package/dist/journal-recovery-files.js.map +1 -0
  45. package/dist/operator-decisions.d.ts +30 -0
  46. package/dist/operator-decisions.d.ts.map +1 -0
  47. package/dist/operator-decisions.js +137 -0
  48. package/dist/operator-decisions.js.map +1 -0
  49. package/dist/project-partitions.d.ts +167 -0
  50. package/dist/project-partitions.d.ts.map +1 -0
  51. package/dist/project-partitions.js +365 -0
  52. package/dist/project-partitions.js.map +1 -0
  53. package/dist/projects.d.ts +29 -0
  54. package/dist/projects.d.ts.map +1 -0
  55. package/dist/projects.js +180 -0
  56. package/dist/projects.js.map +1 -0
  57. package/dist/quota-registry.d.ts +75 -0
  58. package/dist/quota-registry.d.ts.map +1 -0
  59. package/dist/quota-registry.js +208 -0
  60. package/dist/quota-registry.js.map +1 -0
  61. package/dist/resource-store.d.ts +22 -0
  62. package/dist/resource-store.d.ts.map +1 -0
  63. package/dist/resource-store.js +272 -0
  64. package/dist/resource-store.js.map +1 -0
  65. package/dist/run-events.d.ts +15 -0
  66. package/dist/run-events.d.ts.map +1 -0
  67. package/dist/run-events.js +29 -0
  68. package/dist/run-events.js.map +1 -0
  69. package/dist/server.d.ts +33 -33
  70. package/dist/server.d.ts.map +1 -1
  71. package/dist/server.js +231 -238
  72. package/dist/server.js.map +1 -1
  73. package/dist/spec-sessions.d.ts +72 -0
  74. package/dist/spec-sessions.d.ts.map +1 -0
  75. package/dist/spec-sessions.js +301 -0
  76. package/dist/spec-sessions.js.map +1 -0
  77. package/dist/terminate.d.ts +52 -0
  78. package/dist/terminate.d.ts.map +1 -0
  79. package/dist/terminate.js +111 -0
  80. package/dist/terminate.js.map +1 -0
  81. package/dist/thread-head-ping.d.ts +35 -0
  82. package/dist/thread-head-ping.d.ts.map +1 -0
  83. package/dist/thread-head-ping.js +67 -0
  84. package/dist/thread-head-ping.js.map +1 -0
  85. package/dist/thread-lifecycle.d.ts +5 -0
  86. package/dist/thread-lifecycle.d.ts.map +1 -0
  87. package/dist/thread-lifecycle.js +57 -0
  88. package/dist/thread-lifecycle.js.map +1 -0
  89. package/dist/thread-store-support.d.ts +37 -0
  90. package/dist/thread-store-support.d.ts.map +1 -0
  91. package/dist/thread-store-support.js +94 -0
  92. package/dist/thread-store-support.js.map +1 -0
  93. package/dist/threads.d.ts +59 -13
  94. package/dist/threads.d.ts.map +1 -1
  95. package/dist/threads.js +254 -141
  96. package/dist/threads.js.map +1 -1
  97. package/dist/token.d.ts +13 -4
  98. package/dist/token.d.ts.map +1 -1
  99. package/dist/token.js +134 -29
  100. package/dist/token.js.map +1 -1
  101. package/dist/writer-lease.d.ts +21 -0
  102. package/dist/writer-lease.d.ts.map +1 -0
  103. package/dist/writer-lease.js +94 -0
  104. package/dist/writer-lease.js.map +1 -0
  105. package/package.json +5 -4
@@ -0,0 +1,365 @@
1
+ import { hashJson, newId, nowIso } from "@claudexor/util";
2
+ import { commandProjection } from "./command-store.js";
3
+ import { JournalManager } from "./journal-manager.js";
4
+ import { interactionProjection } from "./interactions.js";
5
+ import { operatorDecisionProjection, } from "./operator-decisions.js";
6
+ import { runEventProjection } from "./run-events.js";
7
+ import { specSessionProjection } from "./spec-sessions.js";
8
+ import { threadProjection, } from "./threads.js";
9
+ export class ProjectPartitions {
10
+ rootDir;
11
+ projects;
12
+ globalCommands;
13
+ globalInteractions;
14
+ globalDecisions;
15
+ globalRunEvents;
16
+ globalThreads;
17
+ headPing;
18
+ partitions = new Map();
19
+ constructor(rootDir, projects, globalCommands, globalInteractions, globalDecisions, globalRunEvents, globalThreads,
20
+ /** Global-partition `thread.head.updated` sink, threaded into every project ThreadStore. */
21
+ headPing) {
22
+ this.rootDir = rootDir;
23
+ this.projects = projects;
24
+ this.globalCommands = globalCommands;
25
+ this.globalInteractions = globalInteractions;
26
+ this.globalDecisions = globalDecisions;
27
+ this.globalRunEvents = globalRunEvents;
28
+ this.globalThreads = globalThreads;
29
+ this.headPing = headPing;
30
+ this.sync();
31
+ }
32
+ all() {
33
+ return [
34
+ this.globalCommands.current(),
35
+ ...this.healthy().map((entry) => entry.commands.current()),
36
+ ];
37
+ }
38
+ interactionStores() {
39
+ return [
40
+ this.globalInteractions.current(),
41
+ ...this.healthy().map((entry) => entry.interactions.current()),
42
+ ];
43
+ }
44
+ interactionsForRequest(params) {
45
+ const commandStore = this.forRequest(params);
46
+ if (commandStore === this.globalCommands.current())
47
+ return this.globalInteractions.current();
48
+ const entry = this.healthy().find((candidate) => candidate.commands.current() === commandStore);
49
+ if (!entry)
50
+ throw new Error("command partition has no interaction authority");
51
+ return entry.interactions.current();
52
+ }
53
+ operatorDecision(params, runId) {
54
+ return this.decisionStoreForRequest(params).get(runId);
55
+ }
56
+ recordOperatorDecision(params, decision, idempotency) {
57
+ return this.decisionStoreForRequest(params).record(decision, idempotency);
58
+ }
59
+ recordRunEvent(params, event) {
60
+ return this.runEventStoreForRequest(params).record(event);
61
+ }
62
+ specsForRequest(params) {
63
+ const input = record(params);
64
+ const scope = record(input.scope);
65
+ if (scope.kind !== "project")
66
+ throw Object.assign(new Error("spec sessions require a project"), { status: 400 });
67
+ return this.partitionForRoot(stringField(scope, "root")).specs.current();
68
+ }
69
+ specStoreForSession(id) {
70
+ return this.healthy()
71
+ .map((entry) => entry.specs.current())
72
+ .find((store) => store.get(id));
73
+ }
74
+ listSpecSessions() {
75
+ return this.healthy().flatMap((entry) => entry.specs.current().list());
76
+ }
77
+ forRequest(params) {
78
+ const input = record(params);
79
+ const threadId = stringField(input, "threadId");
80
+ if (threadId) {
81
+ const store = this.threadStoreForThread(threadId);
82
+ if (store)
83
+ return this.commandStoreForThreadStore(store);
84
+ }
85
+ const scope = record(input.scope);
86
+ if (scope.kind !== "project")
87
+ return this.globalCommands.current();
88
+ const root = stringField(scope, "root");
89
+ return this.partitionForRoot(root).commands.current();
90
+ }
91
+ findById(id) {
92
+ return this.all().find((store) => store.get(id));
93
+ }
94
+ beginDelivery(params, input) {
95
+ const store = this.forRequest(params);
96
+ const accepted = store.accept({
97
+ id: newId("delivery"),
98
+ params,
99
+ idempotencyKey: input.key,
100
+ clientId: input.client,
101
+ operation: `delivery.${input.operation}`,
102
+ idempotencyParams: input.request,
103
+ });
104
+ const record = accepted.reused
105
+ ? accepted.record
106
+ : store.update(accepted.record.id, { state: "running", startedAt: nowIso() });
107
+ return { ...record, reused: accepted.reused };
108
+ }
109
+ completeDelivery(id, result) {
110
+ const store = this.findById(id);
111
+ if (!store)
112
+ throw new Error(`delivery authority lost command ${id}`);
113
+ store.update(id, { state: "succeeded", result, finishedAt: nowIso() });
114
+ }
115
+ failDelivery(id, error) {
116
+ const store = this.findById(id);
117
+ if (!store)
118
+ throw new Error(`delivery authority lost command ${id}`);
119
+ const value = error && typeof error === "object" ? error : {};
120
+ store.update(id, {
121
+ state: "failed",
122
+ error: error instanceof Error ? error.message : String(error),
123
+ errorCode: typeof value["code"] === "string" ? value["code"] : undefined,
124
+ result: {
125
+ status: typeof value["status"] === "number" ? value["status"] : 500,
126
+ code: typeof value["code"] === "string" ? value["code"] : null,
127
+ },
128
+ finishedAt: nowIso(),
129
+ });
130
+ }
131
+ registerProject(input) {
132
+ const project = this.projects.current().register(input);
133
+ this.ensure(project.id);
134
+ return project;
135
+ }
136
+ relinkProject(id, root) {
137
+ const project = this.projects.current().relink(id, root);
138
+ this.ensure(id).threads.current().relinkProjectRoot(project.root);
139
+ return project;
140
+ }
141
+ journal(partition) {
142
+ if (!partition.startsWith("project:"))
143
+ throw unknownPartition(partition);
144
+ const id = partition.slice("project:".length);
145
+ if (!id || !this.projects.current().get(id))
146
+ throw unknownPartition(partition);
147
+ return this.ensure(id).manager;
148
+ }
149
+ createThread(input) {
150
+ if (input.repoRoot && !this.projects.current().findByRoot(input.repoRoot)) {
151
+ this.registerProject({
152
+ root: input.repoRoot,
153
+ idempotencyKey: `thread-auto-register-${hashJson(input.repoRoot)}`,
154
+ clientId: "thread-create",
155
+ });
156
+ }
157
+ return this.threadStoreForRoot(input.repoRoot).createThread(input);
158
+ }
159
+ listThreads() {
160
+ // Each store sorts ITS threads by recency, but the stores concatenate —
161
+ // without a merge-sort a fresh project thread lands below every global
162
+ // one (dogfood: the fresh thread sank to the bottom). One global recency order.
163
+ return this.threadStores()
164
+ .flatMap((store) => store.listThreads())
165
+ .sort((a, b) => (a.updated_at < b.updated_at ? 1 : a.updated_at > b.updated_at ? -1 : 0));
166
+ }
167
+ getThread(id) {
168
+ return this.threadStoreForThread(id)?.getThread(id);
169
+ }
170
+ turnsFor(id) {
171
+ return this.threadStoreForThread(id)?.turnsFor(id) ?? [];
172
+ }
173
+ sessionsForThread(id) {
174
+ return this.threadStoreForThread(id)?.sessionsForThread(id) ?? [];
175
+ }
176
+ createTurn(id, prompt, input = {}) {
177
+ return this.requireThreadStore(id).createTurn(id, prompt, input);
178
+ }
179
+ updateThread(id, patch) {
180
+ return this.requireThreadStore(id).updateThread(id, patch);
181
+ }
182
+ trashThread(id) {
183
+ return this.requireThreadStore(id).trashThread(id);
184
+ }
185
+ restoreThread(id) {
186
+ return this.requireThreadStore(id).restoreThread(id);
187
+ }
188
+ purgeThread(id) {
189
+ return this.requireThreadStore(id).purgeThread(id);
190
+ }
191
+ setThreadWorktree(id, path, baseSha, deliveredThroughRunId) {
192
+ this.requireThreadStore(id).setThreadWorktree(id, path, baseSha, deliveredThroughRunId);
193
+ }
194
+ assertKnownIds(threadId, turnId) {
195
+ const id = typeof threadId === "string" && threadId ? threadId : undefined;
196
+ const turn = typeof turnId === "string" && turnId ? turnId : undefined;
197
+ const store = id
198
+ ? this.requireThreadStore(id)
199
+ : turn
200
+ ? this.requireTurnStore(turn)
201
+ : this.globalThreads.current();
202
+ return store.assertKnownIds(threadId, turnId);
203
+ }
204
+ getTurn(id) {
205
+ return this.threadStoreForTurn(id)?.getTurn(id);
206
+ }
207
+ bindTurnRun(id, runId) {
208
+ this.requireTurnStore(id).bindTurnRun(id, runId);
209
+ }
210
+ setTurnEnqueueError(id, message, code = null, retryable = true) {
211
+ this.requireTurnStore(id).setTurnEnqueueError(id, message, code, retryable);
212
+ }
213
+ resumeMap(id, profileId = null) {
214
+ return this.requireThreadStore(id).resumeMap(id, profileId);
215
+ }
216
+ recordSession(id, harnessId, nativeSessionId, observedModel, profileId = null) {
217
+ this.requireThreadStore(id).recordSession(id, harnessId, nativeSessionId, observedModel, profileId);
218
+ }
219
+ /**
220
+ * Run-terminal invalidation (the W12 path with no store mutation to ride):
221
+ * a terminal changes the thread's presented state (needs-me, outcome), so
222
+ * the daemon pings the owning store's head directly.
223
+ */
224
+ pingThreadHead(id) {
225
+ this.threadStoreForThread(id)?.pingHead(id);
226
+ }
227
+ close() {
228
+ for (const entry of this.partitions.values())
229
+ entry.manager.close();
230
+ this.partitions.clear();
231
+ }
232
+ sync() {
233
+ const ids = new Set(this.projects
234
+ .current()
235
+ .list()
236
+ .map((project) => project.id));
237
+ for (const id of ids)
238
+ this.ensure(id);
239
+ for (const [id, entry] of this.partitions) {
240
+ if (ids.has(id))
241
+ continue;
242
+ entry.manager.close();
243
+ this.partitions.delete(id);
244
+ }
245
+ }
246
+ ensure(projectId) {
247
+ const existing = this.partitions.get(projectId);
248
+ if (existing)
249
+ return existing;
250
+ const manager = new JournalManager(this.rootDir, { partition: `project:${projectId}` });
251
+ const commands = manager.registerProjection(commandProjection());
252
+ const interactions = manager.registerProjection(interactionProjection());
253
+ const decisions = manager.registerProjection(operatorDecisionProjection());
254
+ const runEvents = manager.registerProjection(runEventProjection());
255
+ const specs = manager.registerProjection(specSessionProjection());
256
+ const threads = manager.registerProjection(threadProjection(this.headPing));
257
+ manager.start();
258
+ const entry = { manager, commands, interactions, decisions, runEvents, specs, threads };
259
+ this.partitions.set(projectId, entry);
260
+ return entry;
261
+ }
262
+ healthy() {
263
+ this.sync();
264
+ return [...this.partitions.values()].filter((entry) => entry.manager.ready());
265
+ }
266
+ /**
267
+ * Canonical roots whose partition journal is READY — the set whose thread
268
+ * lineage / job records are trustworthy. Retention (W3.6) fails CLOSED on a
269
+ * quarantined partition: its runs are protected, never GC'd against an empty
270
+ * reference set (a non-ready partition contributes nothing to listThreads,
271
+ * so its referenced runs would otherwise look unreferenced).
272
+ */
273
+ healthyProjectRoots() {
274
+ this.sync();
275
+ const registry = this.projects.current();
276
+ const roots = [];
277
+ for (const [id, entry] of this.partitions) {
278
+ if (!entry.manager.ready())
279
+ continue;
280
+ const root = registry.get(id)?.root;
281
+ if (root)
282
+ roots.push(root);
283
+ }
284
+ return roots;
285
+ }
286
+ partitionForRoot(root) {
287
+ const project = this.projects.current().findByRoot(root);
288
+ if (!project) {
289
+ throw Object.assign(new Error(`project is not registered: ${root}`), {
290
+ code: "project_not_registered",
291
+ status: 404,
292
+ });
293
+ }
294
+ return this.ensure(project.id);
295
+ }
296
+ threadStores() {
297
+ return [
298
+ this.globalThreads.current(),
299
+ ...this.healthy().map((entry) => entry.threads.current()),
300
+ ];
301
+ }
302
+ threadStoreForRoot(root) {
303
+ return root ? this.partitionForRoot(root).threads.current() : this.globalThreads.current();
304
+ }
305
+ threadStoreForThread(id) {
306
+ return this.threadStores().find((store) => store.getThread(id));
307
+ }
308
+ threadStoreForTurn(id) {
309
+ return this.threadStores().find((store) => store.getTurn(id));
310
+ }
311
+ requireThreadStore(id) {
312
+ const store = this.threadStoreForThread(id);
313
+ if (!store)
314
+ throw Object.assign(new Error(`no such thread: ${id}`), { status: 404 });
315
+ return store;
316
+ }
317
+ requireTurnStore(id) {
318
+ const store = this.threadStoreForTurn(id);
319
+ if (!store)
320
+ throw Object.assign(new Error(`no such turn: ${id}`), { status: 404 });
321
+ return store;
322
+ }
323
+ commandStoreForThreadStore(store) {
324
+ if (store === this.globalThreads.current())
325
+ return this.globalCommands.current();
326
+ const entry = this.healthy().find((candidate) => candidate.threads.current() === store);
327
+ if (!entry)
328
+ throw new Error("thread partition has no command authority");
329
+ return entry.commands.current();
330
+ }
331
+ decisionStoreForRequest(params) {
332
+ const commands = this.forRequest(params);
333
+ if (commands === this.globalCommands.current())
334
+ return this.globalDecisions.current();
335
+ const entry = this.healthy().find((candidate) => candidate.commands.current() === commands);
336
+ if (!entry)
337
+ throw new Error("command partition has no operator-decision authority");
338
+ return entry.decisions.current();
339
+ }
340
+ runEventStoreForRequest(params) {
341
+ const commands = this.forRequest(params);
342
+ if (commands === this.globalCommands.current())
343
+ return this.globalRunEvents.current();
344
+ const entry = this.healthy().find((candidate) => candidate.commands.current() === commands);
345
+ if (!entry)
346
+ throw new Error("command partition has no run-event authority");
347
+ return entry.runEvents.current();
348
+ }
349
+ }
350
+ function record(value) {
351
+ return value && typeof value === "object" && !Array.isArray(value)
352
+ ? value
353
+ : {};
354
+ }
355
+ function stringField(value, key) {
356
+ const field = value[key];
357
+ return typeof field === "string" ? field : "";
358
+ }
359
+ function unknownPartition(partition) {
360
+ return Object.assign(new Error(`no such journal partition: ${partition}`), {
361
+ code: "journal_partition_not_found",
362
+ status: 404,
363
+ });
364
+ }
365
+ //# sourceMappingURL=project-partitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-partitions.js","sourceRoot":"","sources":["../src/project-partitions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { DurableJournal } from "@claudexor/journal";
2
+ import { type Project } from "@claudexor/schema";
3
+ /** Global-journal authority for the deliberately empty v2 project registry. */
4
+ export declare class ProjectStore {
5
+ private readonly journal;
6
+ private readonly projects;
7
+ private readonly projectIdByRoot;
8
+ private readonly registrationByKey;
9
+ constructor(journal: DurableJournal);
10
+ list(): Project[];
11
+ get(id: string): Project | undefined;
12
+ findByRoot(root: string): Project | undefined;
13
+ register(input: {
14
+ root: string;
15
+ idempotencyKey: string;
16
+ clientId: string;
17
+ }): Project;
18
+ relink(id: string, rootInput: string): Project;
19
+ validateProjection(): void;
20
+ private replay;
21
+ private commit;
22
+ private apply;
23
+ }
24
+ export declare function projectProjection(): {
25
+ name: string;
26
+ create: (journal: DurableJournal) => ProjectStore;
27
+ validate: (store: ProjectStore) => void;
28
+ };
29
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../src/projects.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAA4C,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAiB3F,+EAA+E;AAC/E,qBAAa,YAAY;IAQX,OAAO,CAAC,QAAQ,CAAC,OAAO;IAPpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;IAC7D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAG9B;gBAEyB,OAAO,EAAE,cAAc;IAIpD,IAAI,IAAI,OAAO,EAAE;IAIjB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIpC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAK7C,QAAQ,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;IAoCpF,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAiB9C,kBAAkB,IAAI,IAAI;IAY1B,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,KAAK;CAmBd;AAED,wBAAgB,iBAAiB;;sBAGX,cAAc;sBACd,YAAY;EAEjC"}
@@ -0,0 +1,180 @@
1
+ import { lstatSync, realpathSync } from "node:fs";
2
+ import { isAbsolute } from "node:path";
3
+ import { Project as ProjectSchema, SCHEMA_VERSION } from "@claudexor/schema";
4
+ import { hashJson, newId, nowIso } from "@claudexor/util";
5
+ const REGISTERED = "project.registered";
6
+ const RELINKED = "project.relinked";
7
+ /** Global-journal authority for the deliberately empty v2 project registry. */
8
+ export class ProjectStore {
9
+ journal;
10
+ projects = new Map();
11
+ projectIdByRoot = new Map();
12
+ registrationByKey = new Map();
13
+ constructor(journal) {
14
+ this.journal = journal;
15
+ this.replay();
16
+ }
17
+ list() {
18
+ return [...this.projects.values()].sort((a, b) => a.created_at.localeCompare(b.created_at));
19
+ }
20
+ get(id) {
21
+ return this.projects.get(id);
22
+ }
23
+ findByRoot(root) {
24
+ const id = this.projectIdByRoot.get(canonicalRoot(root));
25
+ return id ? this.projects.get(id) : undefined;
26
+ }
27
+ register(input) {
28
+ validateKey(input.idempotencyKey);
29
+ const root = canonicalRoot(input.root);
30
+ const keyDigest = hashJson({
31
+ client: input.clientId,
32
+ partition: "global",
33
+ operation: "project.register",
34
+ key: input.idempotencyKey,
35
+ });
36
+ const requestDigest = hashJson({ root });
37
+ const prior = this.registrationByKey.get(keyDigest);
38
+ if (prior) {
39
+ if (prior.requestDigest !== requestDigest)
40
+ throw conflict();
41
+ const project = this.projects.get(prior.projectId);
42
+ if (!project)
43
+ throw new Error("project registration points to a missing project");
44
+ return project;
45
+ }
46
+ const existingId = this.projectIdByRoot.get(root);
47
+ const existing = existingId ? this.projects.get(existingId) : undefined;
48
+ const now = nowIso();
49
+ const project = existing ??
50
+ ProjectSchema.parse({
51
+ schema_version: SCHEMA_VERSION,
52
+ id: newId("prj"),
53
+ root,
54
+ created_at: now,
55
+ updated_at: now,
56
+ });
57
+ this.commit(REGISTERED, {
58
+ project,
59
+ registration: { keyDigest, requestDigest, projectId: project.id },
60
+ });
61
+ return project;
62
+ }
63
+ relink(id, rootInput) {
64
+ const current = this.projects.get(id);
65
+ if (!current)
66
+ throw Object.assign(new Error(`no such project: ${id}`), { status: 404 });
67
+ const root = canonicalRoot(rootInput);
68
+ const owner = this.projectIdByRoot.get(root);
69
+ if (owner && owner !== id) {
70
+ throw Object.assign(new Error(`project root is already registered to ${owner}`), {
71
+ code: "project_root_conflict",
72
+ status: 409,
73
+ });
74
+ }
75
+ if (root === current.root)
76
+ return current;
77
+ const project = ProjectSchema.parse({ ...current, root, updated_at: nowIso() });
78
+ this.commit(RELINKED, { project });
79
+ return project;
80
+ }
81
+ validateProjection() {
82
+ for (const project of this.projects.values())
83
+ ProjectSchema.parse(project);
84
+ if (this.projectIdByRoot.size !== this.projects.size) {
85
+ throw new Error("project registry contains duplicate roots");
86
+ }
87
+ for (const binding of this.registrationByKey.values()) {
88
+ if (!this.projects.has(binding.projectId)) {
89
+ throw new Error("project registration idempotency index is dangling");
90
+ }
91
+ }
92
+ }
93
+ replay() {
94
+ for (const record of this.journal.records()) {
95
+ if (record.type !== REGISTERED && record.type !== RELINKED)
96
+ continue;
97
+ this.apply(parseMutation(record.payload));
98
+ }
99
+ this.validateProjection();
100
+ }
101
+ commit(type, mutation) {
102
+ const parsed = parseMutation(mutation);
103
+ this.journal.append(type, parsed);
104
+ this.apply(parsed);
105
+ }
106
+ apply(mutation) {
107
+ const previous = this.projects.get(mutation.project.id);
108
+ if (previous && previous.root !== mutation.project.root)
109
+ this.projectIdByRoot.delete(previous.root);
110
+ const rootOwner = this.projectIdByRoot.get(mutation.project.root);
111
+ if (rootOwner && rootOwner !== mutation.project.id) {
112
+ throw new Error("conflicting project root history");
113
+ }
114
+ this.projects.set(mutation.project.id, mutation.project);
115
+ this.projectIdByRoot.set(mutation.project.root, mutation.project.id);
116
+ if (mutation.registration) {
117
+ const { keyDigest, requestDigest, projectId } = mutation.registration;
118
+ const prior = this.registrationByKey.get(keyDigest);
119
+ if (prior && (prior.requestDigest !== requestDigest || prior.projectId !== projectId)) {
120
+ throw new Error("conflicting project registration history");
121
+ }
122
+ this.registrationByKey.set(keyDigest, { requestDigest, projectId });
123
+ }
124
+ }
125
+ }
126
+ export function projectProjection() {
127
+ return {
128
+ name: "projects",
129
+ create: (journal) => new ProjectStore(journal),
130
+ validate: (store) => store.validateProjection(),
131
+ };
132
+ }
133
+ function canonicalRoot(input) {
134
+ if (!isAbsolute(input))
135
+ throw Object.assign(new Error("project root must be absolute"), { status: 400 });
136
+ let root;
137
+ try {
138
+ root = realpathSync(input);
139
+ }
140
+ catch {
141
+ throw Object.assign(new Error(`project root does not exist: ${input}`), { status: 400 });
142
+ }
143
+ if (!lstatSync(root).isDirectory()) {
144
+ throw Object.assign(new Error(`project root is not a directory: ${input}`), { status: 400 });
145
+ }
146
+ return root;
147
+ }
148
+ function parseMutation(value) {
149
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
150
+ throw new Error("invalid project mutation");
151
+ }
152
+ const input = value;
153
+ const registration = input.registration;
154
+ if (registration !== undefined &&
155
+ (!registration ||
156
+ typeof registration.keyDigest !== "string" ||
157
+ typeof registration.requestDigest !== "string" ||
158
+ typeof registration.projectId !== "string")) {
159
+ throw new Error("invalid project registration binding");
160
+ }
161
+ return {
162
+ project: ProjectSchema.parse(input.project),
163
+ ...(registration ? { registration: { ...registration } } : {}),
164
+ };
165
+ }
166
+ function validateKey(key) {
167
+ if (!key || key.length > 256) {
168
+ throw Object.assign(new Error("Idempotency-Key must contain 1-256 characters"), {
169
+ code: "invalid_idempotency_key",
170
+ status: 400,
171
+ });
172
+ }
173
+ }
174
+ function conflict() {
175
+ return Object.assign(new Error("idempotency key was already used with a different request"), {
176
+ code: "idempotency_conflict",
177
+ status: 409,
178
+ });
179
+ }
180
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../src/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,cAAc,EAAgB,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAa1D,MAAM,UAAU,GAAG,oBAAoB,CAAC;AACxC,MAAM,QAAQ,GAAG,kBAAkB,CAAC;AAEpC,+EAA+E;AAC/E,MAAM,OAAO,YAAY;IAQM;IAPZ,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IACtC,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,iBAAiB,GAAG,IAAI,GAAG,EAGzC,CAAC;IAEJ,YAA6B,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;QAClD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAC9F,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChD,CAAC;IAED,QAAQ,CAAC,KAAiE;QACxE,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,QAAQ,CAAC;YACzB,MAAM,EAAE,KAAK,CAAC,QAAQ;YACtB,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,kBAAkB;YAC7B,GAAG,EAAE,KAAK,CAAC,cAAc;SAC1B,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,CAAC,aAAa,KAAK,aAAa;gBAAE,MAAM,QAAQ,EAAE,CAAC;YAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACnD,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;YAClF,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;QACrB,MAAM,OAAO,GACX,QAAQ;YACR,aAAa,CAAC,KAAK,CAAC;gBAClB,cAAc,EAAE,cAAc;gBAC9B,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC;gBAChB,IAAI;gBACJ,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,GAAG;aAChB,CAAC,CAAC;QACL,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;YACtB,OAAO;YACP,YAAY,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE;SAClE,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,SAAiB;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO;YAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACxF,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,KAAK,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC1B,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,yCAAyC,KAAK,EAAE,CAAC,EAAE;gBAC/E,IAAI,EAAE,uBAAuB;gBAC7B,MAAM,EAAE,GAAG;aACZ,CAAC,CAAC;QACL,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,CAAC,IAAI;YAAE,OAAO,OAAO,CAAC;QAC1C,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACnC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,kBAAkB;QAChB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YAAE,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3E,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAEO,MAAM;QACZ,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5C,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YACrE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAEO,MAAM,CAAC,IAAyC,EAAE,QAAyB;QACjF,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,QAAyB;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxD,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,OAAO,CAAC,IAAI;YACrD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClE,IAAI,SAAS,IAAI,SAAS,KAAK,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrE,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC1B,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC,YAAY,CAAC;YACtE,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACpD,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,aAAa,KAAK,aAAa,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE,CAAC;gBACtF,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC9D,CAAC;YACD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,CAAC,OAAuB,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC;QAC9D,QAAQ,EAAE,CAAC,KAAmB,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB,EAAE;KAC9D,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACpB,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACnF,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACnC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,KAAK,GAAG,KAAwB,CAAC;IACvC,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;IACxC,IACE,YAAY,KAAK,SAAS;QAC1B,CAAC,CAAC,YAAY;YACZ,OAAO,YAAY,CAAC,SAAS,KAAK,QAAQ;YAC1C,OAAO,YAAY,CAAC,aAAa,KAAK,QAAQ;YAC9C,OAAO,YAAY,CAAC,SAAS,KAAK,QAAQ,CAAC,EAC7C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO;QACL,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;QAC3C,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,GAAG,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAC7B,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,+CAA+C,CAAC,EAAE;YAC9E,IAAI,EAAE,yBAAyB;YAC/B,MAAM,EAAE,GAAG;SACZ,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,2DAA2D,CAAC,EAAE;QAC3F,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,GAAG;KACZ,CAAC,CAAC;AACL,CAAC"}