@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.
- package/dist/command-rpc.d.ts.map +1 -1
- package/dist/command-rpc.js +6 -1
- package/dist/command-rpc.js.map +1 -1
- package/dist/continuation-admission.d.ts +1 -1
- package/dist/continuation-admission.d.ts.map +1 -1
- package/dist/continuation-admission.js +33 -2
- package/dist/continuation-admission.js.map +1 -1
- package/dist/daemon-health.d.ts +25 -0
- package/dist/daemon-health.d.ts.map +1 -1
- package/dist/daemon-health.js +2 -0
- package/dist/daemon-health.js.map +1 -1
- package/dist/delivery-command.d.ts +1 -1
- package/dist/delivery-command.d.ts.map +1 -1
- package/dist/delivery-command.js +10 -1
- package/dist/delivery-command.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/loop-facts.d.ts.map +1 -1
- package/dist/loop-facts.js +2 -0
- package/dist/loop-facts.js.map +1 -1
- package/dist/projects.d.ts.map +1 -1
- package/dist/projects.js +10 -1
- package/dist/projects.js.map +1 -1
- package/dist/run-file-admission.d.ts +6 -0
- package/dist/run-file-admission.d.ts.map +1 -0
- package/dist/run-file-admission.js +17 -0
- package/dist/run-file-admission.js.map +1 -0
- package/dist/store/external-files.d.ts.map +1 -1
- package/dist/store/external-files.js +30 -27
- package/dist/store/external-files.js.map +1 -1
- package/dist/store/project-router.d.ts +32 -0
- package/dist/store/project-router.d.ts.map +1 -1
- package/dist/store/project-router.js +7 -0
- package/dist/store/project-router.js.map +1 -1
- package/dist/store/publish-blob.d.ts +2 -1
- package/dist/store/publish-blob.d.ts.map +1 -1
- package/dist/store/publish-blob.js +6 -2
- package/dist/store/publish-blob.js.map +1 -1
- package/dist/store/resources.d.ts.map +1 -1
- package/dist/store/resources.js +4 -4
- package/dist/store/resources.js.map +1 -1
- package/dist/store/retention-changes.d.ts +26 -0
- package/dist/store/retention-changes.d.ts.map +1 -0
- package/dist/store/retention-changes.js +109 -0
- package/dist/store/retention-changes.js.map +1 -0
- package/dist/store/retention-command-references.d.ts +15 -0
- package/dist/store/retention-command-references.d.ts.map +1 -0
- package/dist/store/retention-command-references.js +133 -0
- package/dist/store/retention-command-references.js.map +1 -0
- package/dist/store/retention-generations.d.ts +13 -0
- package/dist/store/retention-generations.d.ts.map +1 -0
- package/dist/store/retention-generations.js +60 -0
- package/dist/store/retention-generations.js.map +1 -0
- package/dist/store/retention-pages.d.ts +6 -0
- package/dist/store/retention-pages.d.ts.map +1 -0
- package/dist/store/retention-pages.js +19 -0
- package/dist/store/retention-pages.js.map +1 -0
- package/dist/store/retention-reference-reader.d.ts +98 -0
- package/dist/store/retention-reference-reader.d.ts.map +1 -0
- package/dist/store/retention-reference-reader.js +110 -0
- package/dist/store/retention-reference-reader.js.map +1 -0
- package/dist/store/retention-references.d.ts +42 -0
- package/dist/store/retention-references.d.ts.map +1 -0
- package/dist/store/retention-references.js +138 -0
- package/dist/store/retention-references.js.map +1 -0
- package/dist/store/sql-command-router.d.ts.map +1 -1
- package/dist/store/sql-command-router.js +7 -1
- package/dist/store/sql-command-router.js.map +1 -1
- package/dist/store/store.d.ts +4 -0
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +21 -3
- package/dist/store/store.js.map +1 -1
- package/dist/store/upload-binding-retention.d.ts +1 -1
- package/dist/store/upload-binding-retention.d.ts.map +1 -1
- package/dist/store/upload-binding-retention.js +39 -5
- package/dist/store/upload-binding-retention.js.map +1 -1
- package/dist/store/uploads.d.ts +2 -1
- package/dist/store/uploads.d.ts.map +1 -1
- package/dist/store/uploads.js +4 -2
- package/dist/store/uploads.js.map +1 -1
- package/dist/store-contracts.d.ts +3 -0
- package/dist/store-contracts.d.ts.map +1 -1
- 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":"
|
|
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;
|
|
1
|
+
{"version":3,"file":"sql-command-router.js","sourceRoot":"","sources":["../../src/store/sql-command-router.ts"],"names":[],"mappings":"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"}
|
package/dist/store/store.d.ts
CHANGED
|
@@ -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":"
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"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"}
|
package/dist/store/store.js
CHANGED
|
@@ -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
|
-
|
|
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;
|