@claudexor/daemon 4.3.1 → 4.4.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 (84) hide show
  1. package/dist/command-rpc.d.ts.map +1 -1
  2. package/dist/command-rpc.js +6 -1
  3. package/dist/command-rpc.js.map +1 -1
  4. package/dist/continuation-admission.d.ts +1 -1
  5. package/dist/continuation-admission.d.ts.map +1 -1
  6. package/dist/continuation-admission.js +33 -2
  7. package/dist/continuation-admission.js.map +1 -1
  8. package/dist/daemon-health.d.ts +25 -0
  9. package/dist/daemon-health.d.ts.map +1 -1
  10. package/dist/daemon-health.js +2 -0
  11. package/dist/daemon-health.js.map +1 -1
  12. package/dist/delivery-command.d.ts +1 -1
  13. package/dist/delivery-command.d.ts.map +1 -1
  14. package/dist/delivery-command.js +10 -1
  15. package/dist/delivery-command.js.map +1 -1
  16. package/dist/index.d.ts +1 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js.map +1 -1
  19. package/dist/loop-facts.d.ts.map +1 -1
  20. package/dist/loop-facts.js +2 -0
  21. package/dist/loop-facts.js.map +1 -1
  22. package/dist/projects.d.ts.map +1 -1
  23. package/dist/projects.js +10 -1
  24. package/dist/projects.js.map +1 -1
  25. package/dist/run-file-admission.d.ts +6 -0
  26. package/dist/run-file-admission.d.ts.map +1 -0
  27. package/dist/run-file-admission.js +17 -0
  28. package/dist/run-file-admission.js.map +1 -0
  29. package/dist/store/external-files.d.ts.map +1 -1
  30. package/dist/store/external-files.js +30 -27
  31. package/dist/store/external-files.js.map +1 -1
  32. package/dist/store/project-router.d.ts +32 -0
  33. package/dist/store/project-router.d.ts.map +1 -1
  34. package/dist/store/project-router.js +7 -0
  35. package/dist/store/project-router.js.map +1 -1
  36. package/dist/store/publish-blob.d.ts +2 -1
  37. package/dist/store/publish-blob.d.ts.map +1 -1
  38. package/dist/store/publish-blob.js +6 -2
  39. package/dist/store/publish-blob.js.map +1 -1
  40. package/dist/store/resources.d.ts.map +1 -1
  41. package/dist/store/resources.js +4 -4
  42. package/dist/store/resources.js.map +1 -1
  43. package/dist/store/retention-changes.d.ts +26 -0
  44. package/dist/store/retention-changes.d.ts.map +1 -0
  45. package/dist/store/retention-changes.js +109 -0
  46. package/dist/store/retention-changes.js.map +1 -0
  47. package/dist/store/retention-command-references.d.ts +15 -0
  48. package/dist/store/retention-command-references.d.ts.map +1 -0
  49. package/dist/store/retention-command-references.js +133 -0
  50. package/dist/store/retention-command-references.js.map +1 -0
  51. package/dist/store/retention-generations.d.ts +13 -0
  52. package/dist/store/retention-generations.d.ts.map +1 -0
  53. package/dist/store/retention-generations.js +60 -0
  54. package/dist/store/retention-generations.js.map +1 -0
  55. package/dist/store/retention-pages.d.ts +6 -0
  56. package/dist/store/retention-pages.d.ts.map +1 -0
  57. package/dist/store/retention-pages.js +19 -0
  58. package/dist/store/retention-pages.js.map +1 -0
  59. package/dist/store/retention-reference-reader.d.ts +98 -0
  60. package/dist/store/retention-reference-reader.d.ts.map +1 -0
  61. package/dist/store/retention-reference-reader.js +110 -0
  62. package/dist/store/retention-reference-reader.js.map +1 -0
  63. package/dist/store/retention-references.d.ts +42 -0
  64. package/dist/store/retention-references.d.ts.map +1 -0
  65. package/dist/store/retention-references.js +138 -0
  66. package/dist/store/retention-references.js.map +1 -0
  67. package/dist/store/sql-command-router.d.ts.map +1 -1
  68. package/dist/store/sql-command-router.js +7 -1
  69. package/dist/store/sql-command-router.js.map +1 -1
  70. package/dist/store/store.d.ts +4 -0
  71. package/dist/store/store.d.ts.map +1 -1
  72. package/dist/store/store.js +21 -3
  73. package/dist/store/store.js.map +1 -1
  74. package/dist/store/upload-binding-retention.d.ts +1 -1
  75. package/dist/store/upload-binding-retention.d.ts.map +1 -1
  76. package/dist/store/upload-binding-retention.js +39 -5
  77. package/dist/store/upload-binding-retention.js.map +1 -1
  78. package/dist/store/uploads.d.ts +2 -1
  79. package/dist/store/uploads.d.ts.map +1 -1
  80. package/dist/store/uploads.js +4 -2
  81. package/dist/store/uploads.js.map +1 -1
  82. package/dist/store-contracts.d.ts +3 -0
  83. package/dist/store-contracts.d.ts.map +1 -1
  84. package/package.json +5 -5
@@ -0,0 +1,19 @@
1
+ import { setImmediate as yieldToAdmission } from "node:timers/promises";
2
+ /** Bound each synchronous SQLite read, without holding a cursor/transaction
3
+ * across admission. Filter after paging so a sparse predicate cannot turn one
4
+ * page into an unbounded scan. This is an I/O batch, not a retention policy. */
5
+ export async function* retentionPages(store, table, columns, signal) {
6
+ const page = store.prepare(`SELECT rowid AS retention_rowid,${columns} FROM ${table} NOT INDEXED
7
+ WHERE rowid>? ORDER BY rowid LIMIT 100`);
8
+ let after = 0;
9
+ for (;;) {
10
+ signal?.throwIfAborted();
11
+ const rows = page.all(after);
12
+ if (!rows.length)
13
+ return;
14
+ yield rows;
15
+ after = rows[rows.length - 1].retention_rowid;
16
+ await yieldToAdmission();
17
+ }
18
+ }
19
+ //# sourceMappingURL=retention-pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retention-pages.js","sourceRoot":"","sources":["../../src/store/retention-pages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxE;;gFAEgF;AAChF,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,cAAc,CACnC,KAAkB,EAClB,KAA2B,EAC3B,OAAe,EACf,MAAoB;IAEpB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CACxB,mCAAmC,OAAO,SAAS,KAAK;4CAChB,CACzC,CAAC;IACF,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,SAAS,CAAC;QACR,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAA2C,CAAC;QACvE,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,MAAM,IAAI,CAAC;QACX,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,eAAe,CAAC;QAC/C,MAAM,gBAAgB,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC"}
@@ -0,0 +1,98 @@
1
+ import { Thread } from "@claudexor/schema";
2
+ import type { EngineStore } from "./store.js";
3
+ type Body = {
4
+ id: string;
5
+ pid: number;
6
+ body: Uint8Array;
7
+ };
8
+ type ThreadRow = Body & {
9
+ state: string;
10
+ };
11
+ type SessionRow = Body & {
12
+ harness_id: string;
13
+ thread_id: string;
14
+ };
15
+ type TurnRow = Body & {
16
+ thread_id: string;
17
+ };
18
+ /** One typed reader for the initial inventory AND changed-owner rechecks.
19
+ * Protection only grows during a pass; release is recognized by the next pass. */
20
+ export declare class RetentionReferenceReader {
21
+ private readonly store;
22
+ private readonly ignored;
23
+ private readonly retained;
24
+ readonly runs: Set<string>;
25
+ readonly sessions: Map<string, Set<string>>;
26
+ readonly roots: Set<string>;
27
+ readonly lanes: Map<string, Set<string>>;
28
+ constructor(store: EngineStore, ignored: ReadonlySet<string>, retained: (pid: number) => boolean);
29
+ add: (id: string | null | undefined) => void;
30
+ thread(row: ThreadRow): Thread | undefined;
31
+ turn(row: TurnRow, owner?: {
32
+ schema_version: 2;
33
+ id: string;
34
+ created_at: string;
35
+ updated_at: string;
36
+ repo: {
37
+ root: string;
38
+ base_ref: string;
39
+ } | null;
40
+ title: string | null;
41
+ folder: string | null;
42
+ mode: "agent" | "ask" | "plan";
43
+ auth_preference: "api_key" | "auto" | "subscription";
44
+ access: "external_sandbox_full" | "full" | "inherit_native" | "readonly" | "workspace_write" | null;
45
+ credential_profile_id: string | null;
46
+ primary_harness: string | null;
47
+ eligible_harnesses: string[];
48
+ workspace: {
49
+ mode: "delegated" | "in_place" | "isolated";
50
+ worktree_path: string | null;
51
+ base_sha: string | null;
52
+ delivered_through_run_id: string | null;
53
+ workspace_root: string | null;
54
+ };
55
+ run_ids: string[];
56
+ head_run_id: string | null;
57
+ state: "active" | "closed" | "purged" | "trashed";
58
+ trashed_at: string | null;
59
+ purge_after: string | null;
60
+ pre_trash_state: "active" | "closed" | null;
61
+ } | undefined): void;
62
+ session(row: SessionRow, owner?: {
63
+ schema_version: 2;
64
+ id: string;
65
+ created_at: string;
66
+ updated_at: string;
67
+ repo: {
68
+ root: string;
69
+ base_ref: string;
70
+ } | null;
71
+ title: string | null;
72
+ folder: string | null;
73
+ mode: "agent" | "ask" | "plan";
74
+ auth_preference: "api_key" | "auto" | "subscription";
75
+ access: "external_sandbox_full" | "full" | "inherit_native" | "readonly" | "workspace_write" | null;
76
+ credential_profile_id: string | null;
77
+ primary_harness: string | null;
78
+ eligible_harnesses: string[];
79
+ workspace: {
80
+ mode: "delegated" | "in_place" | "isolated";
81
+ worktree_path: string | null;
82
+ base_sha: string | null;
83
+ delivered_through_run_id: string | null;
84
+ workspace_root: string | null;
85
+ };
86
+ run_ids: string[];
87
+ head_run_id: string | null;
88
+ state: "active" | "closed" | "purged" | "trashed";
89
+ trashed_at: string | null;
90
+ purge_after: string | null;
91
+ pre_trash_state: "active" | "closed" | null;
92
+ } | undefined): void;
93
+ refresh(table: "thread" | "turn" | "session" | "interaction", id: string): void;
94
+ private read;
95
+ private owner;
96
+ }
97
+ export {};
98
+ //# sourceMappingURL=retention-reference-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retention-reference-reader.d.ts","sourceRoot":"","sources":["../../src/store/retention-reference-reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAc,MAAM,mBAAmB,CAAC;AAEhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,KAAK,IAAI,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAC1D,KAAK,SAAS,GAAG,IAAI,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1C,KAAK,UAAU,GAAG,IAAI,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AACnE,KAAK,OAAO,GAAG,IAAI,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5C;kFACkF;AAClF,qBAAa,wBAAwB;IAOjC,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAR3B,QAAQ,CAAC,IAAI,cAAqB;IAClC,QAAQ,CAAC,QAAQ,2BAAkC;IACnD,QAAQ,CAAC,KAAK,cAAqB;IACnC,QAAQ,CAAC,KAAK,2BAAkC;IAEhD,YACmB,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,EAC5B,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,EACjD;IAEJ,GAAG,OAAQ,MAAM,GAAG,IAAI,GAAG,SAAS,UAElC;IAEF,MAAM,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAgBzC;IAED,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAA4B,GAAG,IAAI,CAM1D;IAED,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAA4B,GAAG,IAAI,CAchE;IAED,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAmB9E;IAED,OAAO,CAAC,IAAI;IAUZ,OAAO,CAAC,KAAK;CASd"}
@@ -0,0 +1,110 @@
1
+ import { Session, Thread, ThreadTurn } from "@claudexor/schema";
2
+ import { noProjectRepoRoot } from "@claudexor/util";
3
+ import { decodeBody } from "./thread-rows.js";
4
+ const RetainedTurn = ThreadTurn.omit({ prompt: true });
5
+ /** One typed reader for the initial inventory AND changed-owner rechecks.
6
+ * Protection only grows during a pass; release is recognized by the next pass. */
7
+ export class RetentionReferenceReader {
8
+ store;
9
+ ignored;
10
+ retained;
11
+ runs = new Set();
12
+ sessions = new Map();
13
+ roots = new Set();
14
+ lanes = new Map();
15
+ constructor(store, ignored, retained) {
16
+ this.store = store;
17
+ this.ignored = ignored;
18
+ this.retained = retained;
19
+ }
20
+ add = (id) => {
21
+ if (id)
22
+ this.runs.add(id);
23
+ };
24
+ thread(row) {
25
+ if (!this.retained(row.pid) || row.state === "purged")
26
+ return;
27
+ const thread = this.read("thread", row, () => Thread.parse(decodeBody(row)));
28
+ if (thread.state !== row.state || thread.id !== row.id)
29
+ throw new Error(`thread ${row.id} in partition ${row.pid}: retention state or identity disagrees`);
30
+ if (thread.repo)
31
+ this.roots.add(thread.repo.root);
32
+ const root = thread.repo?.root ?? noProjectRepoRoot();
33
+ const lanes = this.lanes.get(root) ?? new Set();
34
+ lanes.add(thread.id);
35
+ this.lanes.set(root, lanes);
36
+ if (this.ignored.has(thread.id) && thread.state === "trashed")
37
+ return;
38
+ thread.run_ids.forEach(this.add);
39
+ this.add(thread.head_run_id);
40
+ return thread;
41
+ }
42
+ turn(row, owner = this.owner(row.thread_id)) {
43
+ if (!this.retained(row.pid) || !owner)
44
+ return;
45
+ const turn = this.read("turn", row, () => RetainedTurn.parse(decodeBody(row)));
46
+ if (turn.thread_id !== owner.id || turn.id !== row.id)
47
+ throw new Error(`turn ${row.id} in partition ${row.pid}: retention owner disagrees`);
48
+ [turn.run_id, turn.parent_run_id, turn.answers_plan_run_id, turn.plan_run_id].forEach(this.add);
49
+ }
50
+ session(row, owner = this.owner(row.thread_id)) {
51
+ if (!this.retained(row.pid) || !owner)
52
+ return;
53
+ const session = this.read("session", row, () => Session.parse(decodeBody(row)));
54
+ if (session.thread_id !== owner.id ||
55
+ session.harness_id !== row.harness_id ||
56
+ session.id !== row.id)
57
+ throw new Error(`session ${row.id} in partition ${row.pid}: retention owner disagrees`);
58
+ if (session.native_session_id) {
59
+ const ids = this.sessions.get(session.harness_id) ?? new Set();
60
+ ids.add(session.native_session_id);
61
+ this.sessions.set(session.harness_id, ids);
62
+ }
63
+ }
64
+ refresh(table, id) {
65
+ if (table === "interaction") {
66
+ const row = this.store
67
+ .prepare("SELECT pid,run_id FROM interaction WHERE id=? AND state='pending'")
68
+ .get(id);
69
+ if (row && this.retained(row.pid))
70
+ this.add(row.run_id);
71
+ }
72
+ else if (table === "thread") {
73
+ this.owner(id);
74
+ }
75
+ else if (table === "turn") {
76
+ const row = this.store
77
+ .prepare("SELECT id,pid,thread_id,body FROM turn WHERE id=?")
78
+ .get(id);
79
+ if (row)
80
+ this.turn(row);
81
+ }
82
+ else {
83
+ const row = this.store
84
+ .prepare("SELECT id,pid,thread_id,harness_id,body FROM session WHERE id=?")
85
+ .get(id);
86
+ if (row)
87
+ this.session(row);
88
+ }
89
+ }
90
+ read(table, row, read) {
91
+ try {
92
+ return read();
93
+ }
94
+ catch (error) {
95
+ throw new Error(`retention ${table} ${row.id} in partition ${row.pid}: ${String(error)}`, {
96
+ cause: error,
97
+ });
98
+ }
99
+ }
100
+ owner(id) {
101
+ const row = this.store.prepare("SELECT id,pid,state,body FROM thread WHERE id=?").get(id);
102
+ if (!row)
103
+ return;
104
+ const thread = this.thread(row);
105
+ if (thread && thread.id !== id)
106
+ throw new Error(`thread ${id} in partition ${row.pid}: retention owner disagrees`);
107
+ return thread;
108
+ }
109
+ }
110
+ //# sourceMappingURL=retention-reference-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retention-reference-reader.js","sourceRoot":"","sources":["../../src/store/retention-reference-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { Thread } from "@claudexor/schema";
2
+ import type { EngineStore } from "./store.js";
3
+ export interface DiskRetentionReferences {
4
+ /** Legacy exact inventory witness; current retirement rechecks changed owners. */
5
+ isCurrent: () => boolean;
6
+ /** Cooperatively absorb changed owners, then synchronously recheck before expiry. */
7
+ refresh?: () => Promise<void>;
8
+ recheck?: () => boolean;
9
+ /** Native callers absorb the same changed owners before per-file rechecks. */
10
+ nativeCurrent?: () => boolean;
11
+ /** Pass-local ownership, refreshed synchronously at each lane sweep boundary. */
12
+ laneThreadIds?: (root: string) => Set<string>;
13
+ nativeRunDirs?: ReadonlySet<string>;
14
+ nativeWatchRunDirs?: ReadonlySet<string>;
15
+ nativeReferenceError?: () => string | null;
16
+ hasActiveCommands?: () => boolean;
17
+ /** Caller releases the observation after all deletions, including error paths. */
18
+ close?: () => void;
19
+ /** Recovery holds are receipt facts; completed quarantine is not a hold. */
20
+ blocked?: string;
21
+ errors?: string[];
22
+ projectRoots: string[];
23
+ /** Retained active/archived registrations; thread root names alone are not ownership. */
24
+ registeredProjectRoots: Set<string>;
25
+ /** Archived-only registrations need an extant root to own recent history. */
26
+ archivedProjectRoots?: Set<string>;
27
+ protectedProjectRoots: Set<string>;
28
+ referencedRunIds: Set<string>;
29
+ nativeSessions: Map<string, Set<string>>;
30
+ records: Array<{
31
+ runId: string;
32
+ state: string;
33
+ finishedAt?: string;
34
+ }>;
35
+ }
36
+ /** Maintenance's served thread listing, including unfinished purges. Unlike
37
+ * public synchronous listing it does not stat every registered project root. */
38
+ export declare function diskRetentionThreads(store: EngineStore, signal?: AbortSignal): Promise<Thread[]>;
39
+ /** Retirement reads all retained generations, including archived projects. Public
40
+ * listing/admission remains served-generation-only. Any unreadable reference throws. */
41
+ export declare function diskRetentionReferences(store: EngineStore, ignoreThreadIds?: ReadonlySet<string>, signal?: AbortSignal): Promise<DiskRetentionReferences>;
42
+ //# sourceMappingURL=retention-references.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retention-references.d.ts","sourceRoot":"","sources":["../../src/store/retention-references.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAS9C,MAAM,WAAW,uBAAuB;IACtC,kFAAkF;IAClF,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC;IACxB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC;IAC9B,iFAAiF;IACjF,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9C,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,oBAAoB,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC3C,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC;IAClC,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,yFAAyF;IACzF,sBAAsB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,6EAA6E;IAC7E,oBAAoB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,qBAAqB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvE;AAED;gFACgF;AAChF,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,WAAW,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,EAAE,CAAC,CA8CnB;AAED;wFACwF;AACxF,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,WAAW,EAClB,eAAe,GAAE,WAAW,CAAC,MAAM,CAAa,EAChD,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,uBAAuB,CAAC,CAyGlC"}
@@ -0,0 +1,138 @@
1
+ import { Thread } from "@claudexor/schema";
2
+ import { setImmediate as yieldToAdmission } from "node:timers/promises";
3
+ import { access } from "node:fs/promises";
4
+ import { decodeBody } from "./thread-rows.js";
5
+ import { isServedPid } from "./generations.js";
6
+ import { retentionPages } from "./retention-pages.js";
7
+ import { retentionChanges } from "./retention-changes.js";
8
+ import { RetentionReferenceReader } from "./retention-reference-reader.js";
9
+ import { commandRetentionReferences } from "./retention-command-references.js";
10
+ import { retentionGenerations } from "./retention-generations.js";
11
+ /** Maintenance's served thread listing, including unfinished purges. Unlike
12
+ * public synchronous listing it does not stat every registered project root. */
13
+ export async function diskRetentionThreads(store, signal) {
14
+ const result = [];
15
+ const served = new Map();
16
+ const roots = new Map(store
17
+ .prepare(`SELECT current_pid AS pid,root FROM project WHERE status='active'
18
+ AND pid=CAST((SELECT value FROM meta WHERE key='global_pid') AS INTEGER)`)
19
+ .all().map((row) => [row.pid, row.root]));
20
+ for await (const rows of retentionPages(store, "thread", "id,pid,body", signal)) {
21
+ for (const row of rows) {
22
+ await yieldToAdmission();
23
+ signal?.throwIfAborted();
24
+ if (!served.has(row.pid))
25
+ served.set(row.pid, isServedPid(store, row.pid));
26
+ if (!served.get(row.pid))
27
+ continue;
28
+ let thread;
29
+ try {
30
+ thread = Thread.parse(decodeBody(row));
31
+ }
32
+ catch (error) {
33
+ throw new Error(`retention thread ${row.id} in partition ${row.pid}: ${String(error)}`, {
34
+ cause: error,
35
+ });
36
+ }
37
+ const root = roots.get(row.pid);
38
+ if (thread.state !== "purged" &&
39
+ root &&
40
+ !(await access(root).then(() => true, () => false)))
41
+ continue;
42
+ result.push(thread);
43
+ }
44
+ }
45
+ return result;
46
+ }
47
+ /** Retirement reads all retained generations, including archived projects. Public
48
+ * listing/admission remains served-generation-only. Any unreadable reference throws. */
49
+ export async function diskRetentionReferences(store, ignoreThreadIds = new Set(), signal) {
50
+ const changesObserved = retentionChanges(store);
51
+ try {
52
+ // Keep the legacy exact witness for callers without incremental rechecks.
53
+ // Run/native proofs reread changed owners; lane sweeping reads live IDs.
54
+ // No cursor survives a yield.
55
+ const changes = store.prepare("SELECT total_changes() AS n");
56
+ const version = changes.get().n;
57
+ const isCurrent = () => changes.get().n === version;
58
+ const generations = retentionGenerations(store);
59
+ const { registeredProjectRoots, archivedProjectRoots, protectedProjectRoots, errors, blocked } = generations;
60
+ const roots = new Set([...registeredProjectRoots, ...protectedProjectRoots]);
61
+ const retained = blocked ? () => false : generations.retained;
62
+ const reader = new RetentionReferenceReader(store, ignoreThreadIds, retained);
63
+ for await (const rows of retentionPages(store, "thread", "id,pid,state,body", signal)) {
64
+ for (const row of rows) {
65
+ await yieldToAdmission();
66
+ signal?.throwIfAborted();
67
+ const thread = reader.thread(row);
68
+ if (!thread)
69
+ continue;
70
+ for (const sessionRow of store
71
+ .prepare("SELECT id,pid,thread_id,harness_id,body FROM session WHERE thread_id=?")
72
+ .all(thread.id))
73
+ reader.session(sessionRow, thread);
74
+ for (const turnRow of store
75
+ .prepare("SELECT id,pid,thread_id,body FROM turn WHERE thread_id=?")
76
+ .all(thread.id)) {
77
+ await yieldToAdmission();
78
+ signal?.throwIfAborted();
79
+ reader.turn(turnRow, thread);
80
+ }
81
+ }
82
+ }
83
+ for (const row of store
84
+ .prepare("SELECT pid,run_id FROM interaction WHERE state='pending'")
85
+ .all())
86
+ if (retained(row.pid))
87
+ reader.add(row.run_id);
88
+ const commands = await commandRetentionReferences(store, retained, reader.runs, signal);
89
+ const readChange = ({ table, id, }) => {
90
+ if (table === "command")
91
+ commands.refresh(id);
92
+ else if (table === "blob") {
93
+ const owner = store
94
+ .prepare("SELECT c.id,c.pid FROM command c JOIN partition q ON q.id=c.pid WHERE params_sha=? AND q.status IN ('ready','archived') LIMIT 1")
95
+ .get(id);
96
+ if (owner)
97
+ throw new Error(`immutable retention command ${owner.id} in partition ${owner.pid}: params blob ${id} changed during inventory`);
98
+ }
99
+ else if (table !== "project" && table !== "partition")
100
+ reader.refresh(table, id);
101
+ };
102
+ const recheck = () => changesObserved.current(readChange);
103
+ const refresh = () => changesObserved.refresh(readChange, signal);
104
+ await refresh();
105
+ for (const root of reader.roots)
106
+ roots.add(root);
107
+ return {
108
+ isCurrent,
109
+ refresh,
110
+ recheck,
111
+ nativeCurrent: recheck,
112
+ laneThreadIds: (root) => {
113
+ if (!recheck())
114
+ throw new Error("lane ownership changed; a fresh retention pass must resume");
115
+ return reader.lanes.get(root) ?? new Set();
116
+ },
117
+ nativeRunDirs: commands.nativeRunDirs,
118
+ nativeWatchRunDirs: commands.nativeWatchRunDirs,
119
+ nativeReferenceError: commands.nativeReferenceError,
120
+ hasActiveCommands: commands.hasActiveCommands,
121
+ close: changesObserved.close,
122
+ blocked,
123
+ errors,
124
+ projectRoots: [...roots],
125
+ registeredProjectRoots,
126
+ archivedProjectRoots,
127
+ protectedProjectRoots,
128
+ referencedRunIds: reader.runs,
129
+ records: commands.records,
130
+ nativeSessions: reader.sessions,
131
+ };
132
+ }
133
+ catch (error) {
134
+ changesObserved.close();
135
+ throw error;
136
+ }
137
+ }
138
+ //# sourceMappingURL=retention-references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retention-references.js","sourceRoot":"","sources":["../../src/store/retention-references.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sql-command-router.d.ts","sourceRoot":"","sources":["../../src/store/sql-command-router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sql-command-router.d.ts","sourceRoot":"","sources":["../../src/store/sql-command-router.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { isJournaledRunEvent } from "../journaled-run-events.js";
2
+ import { assertUnexpiredRunFiles } from "../run-file-admission.js";
2
3
  import { beginDeliveryCommand, completeDeliveryCommand, failDeliveryCommand, } from "../delivery-command.js";
3
4
  import { SqlCommandQueries } from "./command-queries.js";
4
5
  import { SqlCommandStore } from "./commands.js";
@@ -80,7 +81,12 @@ export class SqlCommandRouter extends SqlProjectRouter {
80
81
  return owner.persistTerminal(jobId, event, telemetry);
81
82
  }
82
83
  beginDelivery(params, input) {
83
- return beginDeliveryCommand(this.forRequest(params), params, input);
84
+ return beginDeliveryCommand(this.forRequest(params), params, input, () => {
85
+ const request = input.request;
86
+ for (const id of [request?.runId, ...(Array.isArray(request?.runIds) ? request.runIds : [])])
87
+ if (typeof id === "string")
88
+ assertUnexpiredRunFiles(this.queries.select({ ids: [id] })[0]);
89
+ });
84
90
  }
85
91
  completeDelivery(id, result) {
86
92
  completeDeliveryCommand(this.findById(id), id, result);
@@ -1 +1 @@
1
- {"version":3,"file":"sql-command-router.js","sourceRoot":"","sources":["../../src/store/sql-command-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,aAAa,EAA4B,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnD;4DAC4D;AAC5D,MAAM,OAAO,gBACX,SAAQ,gBAAgB;IAML,WAAW;IAHrB,OAAO,CAAoB;IACpC,YACE,QAAyB,EACR,WAIhB;QAED,KAAK,CAAC,QAAQ,CAAC,CAAC;2BANC,WAAW;QAO5B,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnE,CAAC;IAED,YAAY,CAAC,UAA+B;QAC1C,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE;YACtE,GAAG,IAAI,CAAC,WAAW;YACnB,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC;SACtD,CAAC,CAAC;IACL,CAAC;IACD,OAAO;QACL,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,UAAU,CAAC,MAAe;QACxB,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,QAAQ,CAAC,EAAU;QACjB,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACjD,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,CAAC;IACD,YAAY,CAAC,GAAW,EAAE,WAAmB,EAAE,GAAW;QACxD,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,CAAC,UAA+D;QACpE,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACzE,CAAC;IACD,sBAAsB,CAAC,MAAe;QACpC,OAAO,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7F,CAAC;IACD,kBAAkB,CAAC,KAAa;QAC9B,uEAAuE;QACvE,uEAAuE;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK;aACpB,OAAO,CAAC,qDAAqD,CAAC;aAC9D,GAAG,CAAC,KAAK,CAA2B,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QACjE,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnE,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/F,CAAC;IACO,SAAS,CAAC,MAAe;QAC/B,OAAO,IAAI,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClG,CAAC;IACD,gBAAgB,CAAC,MAAe,EAAE,KAAa;QAC7C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IACD,iCAAiC,CAC/B,MAAe,EACf,KAAa,EACb,KAAwD;QAExD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC;IACD,sBAAsB,CACpB,MAAe,EACf,QAAgC,EAChC,KAAyD;QAEzD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;IACD,cAAc,CAAC,MAAe,EAAE,KAAe;QAC7C,IAAI,mBAAmB,CAAC,KAAK,CAAC;YAC5B,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrF,oEAAoE;QACpE,4EAA4E;QAC5E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,eAAe,CAAC,KAAa,EAAE,KAAe,EAAE,SAA8B;QAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;QACxE,OAAO,KAAK,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACxD,CAAC;IACD,aAAa,CACX,MAAe,EACf,KAA2E;QAE3E,OAAO,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC;IACD,gBAAgB,CAAC,EAAU,EAAE,MAAe;QAC1C,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;IACD,YAAY,CAAC,EAAU,EAAE,KAAc;QACrC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;CACF"}
1
+ {"version":3,"file":"sql-command-router.js","sourceRoot":"","sources":["../../src/store/sql-command-router.ts"],"names":[],"mappings":"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"}
@@ -39,6 +39,8 @@ export interface StoreFacts {
39
39
  failures: number;
40
40
  last_ms: number | null;
41
41
  max_ms: number | null;
42
+ p50_ms: number | null;
43
+ p99_ms: number | null;
42
44
  };
43
45
  obligations_open: number | null;
44
46
  integrity: "pending" | "ok" | "failed";
@@ -57,6 +59,7 @@ export type SyncedListener = (generation: number, report: FlusherPassReport) =>
57
59
  */
58
60
  export declare class EngineStore {
59
61
  private readonly options;
62
+ readonly storeId: string | undefined;
60
63
  readonly paths: EngineStorePaths;
61
64
  readonly runtime: EngineRuntime;
62
65
  /** One owner-change history for every file helper using this connection. */
@@ -70,6 +73,7 @@ export declare class EngineStore {
70
73
  private readonly monotonicNow;
71
74
  private busyWaits;
72
75
  /** Constant-space COMMIT timing; only `facts()` reads it. */
76
+ private readonly commitLatency;
73
77
  private readonly commits;
74
78
  private integrityState;
75
79
  private closed;
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { LatencyHistogram, processTiming } from "@claudexor/util";
1
2
  import { mkdirSync } from "node:fs";
2
3
  import { join } from "node:path";
3
4
  import { isBusyFailure, mapStoreError, StoreCorruptError, StoreError } from "./errors.js";
@@ -18,6 +19,7 @@ import { observeStatement } from "./statement-observer.js";
18
19
  */
19
20
  export class EngineStore {
20
21
  options;
22
+ storeId;
21
23
  paths;
22
24
  runtime;
23
25
  /** One owner-change history for every file helper using this connection. */
@@ -31,6 +33,7 @@ export class EngineStore {
31
33
  monotonicNow;
32
34
  busyWaits = 0;
33
35
  /** Constant-space COMMIT timing; only `facts()` reads it. */
36
+ commitLatency = new LatencyHistogram();
34
37
  commits = {
35
38
  attempts: 0,
36
39
  failures: 0,
@@ -40,8 +43,9 @@ export class EngineStore {
40
43
  integrityState = "pending";
41
44
  closed = false;
42
45
  closing = null;
43
- constructor(runtime, paths, connection, options) {
46
+ constructor(runtime, paths, connection, options, storeId) {
44
47
  this.options = options;
48
+ this.storeId = storeId;
45
49
  this.runtime = runtime;
46
50
  this.paths = paths;
47
51
  this.connection = connection;
@@ -78,18 +82,21 @@ export class EngineStore {
78
82
  const connection = new runtime.sqlite.DatabaseSync(paths.database, {
79
83
  timeout: MAIN_CONNECTION_PRAGMAS["busy_timeout"],
80
84
  });
85
+ let identity;
81
86
  try {
82
87
  // Identity first: a foreign or unknown file is refused before the
83
88
  // journal-mode or any other write touches it.
84
89
  ensureSchemaIdentityOrThrow(connection);
85
90
  applyPragmas(connection, MAIN_CONNECTION_PRAGMAS);
86
91
  ensureSchema(connection, options.now);
92
+ // The durable UUID belongs to this database, never to a process or path.
93
+ identity = connection.prepare("SELECT value FROM meta WHERE key='store_id'").get();
87
94
  }
88
95
  catch (error) {
89
96
  connection.close();
90
97
  throw mapStoreError(error, "opening the engine store");
91
98
  }
92
- const store = new EngineStore(runtime, paths, connection, options);
99
+ const store = new EngineStore(runtime, paths, connection, options, identity?.value);
93
100
  await store.flusher.start();
94
101
  return store;
95
102
  }
@@ -139,7 +146,14 @@ export class EngineStore {
139
146
  if (this.connection.isTransaction) {
140
147
  throw new StoreError("store_transaction_nested", 500, false, "engine store transactions do not nest");
141
148
  }
142
- this.exec("BEGIN IMMEDIATE");
149
+ // Waiting for the writer lock here is the request thread's own synchronous time.
150
+ const beginStarted = this.monotonicNow();
151
+ try {
152
+ this.exec("BEGIN IMMEDIATE");
153
+ }
154
+ finally {
155
+ processTiming.recordSync("store.begin_immediate", this.monotonicNow() - beginStarted);
156
+ }
143
157
  let committed = false;
144
158
  try {
145
159
  const result = fn();
@@ -229,6 +243,8 @@ export class EngineStore {
229
243
  wal_bytes: flusher.last_pass?.wal_bytes ?? null,
230
244
  busy_waits: this.busyWaits,
231
245
  commit: {
246
+ p50_ms: this.commitLatency.facts().p50Ms,
247
+ p99_ms: this.commitLatency.facts().p99Ms,
232
248
  attempts: this.commits.attempts,
233
249
  failures: this.commits.failures,
234
250
  last_ms: microsecondMs(this.commits.lastMs),
@@ -303,6 +319,8 @@ export class EngineStore {
303
319
  }
304
320
  }
305
321
  recordCommit(elapsedMs, failed) {
322
+ this.commitLatency.record(elapsedMs);
323
+ processTiming.recordSync("store.commit", elapsedMs);
306
324
  this.commits.attempts += 1;
307
325
  if (failed)
308
326
  this.commits.failures += 1;