@claudexor/daemon 5.0.2 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +56 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/deferred-message-owner.d.ts +4 -0
- package/dist/deferred-message-owner.d.ts.map +1 -1
- package/dist/deferred-messages.d.ts +22 -1
- package/dist/deferred-messages.d.ts.map +1 -1
- package/dist/deferred-messages.js +50 -15
- package/dist/deferred-messages.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/interactions.d.ts.map +1 -1
- package/dist/interactions.js +29 -7
- package/dist/interactions.js.map +1 -1
- package/dist/model-operation-execution.d.ts +10 -0
- package/dist/model-operation-execution.d.ts.map +1 -1
- package/dist/model-operation-execution.js +12 -5
- package/dist/model-operation-execution.js.map +1 -1
- package/dist/model-operations.d.ts +1 -0
- package/dist/model-operations.d.ts.map +1 -1
- package/dist/model-operations.js +20 -10
- package/dist/model-operations.js.map +1 -1
- package/dist/quota-registry-support.d.ts.map +1 -1
- package/dist/quota-registry-support.js +14 -9
- package/dist/quota-registry-support.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js.map +1 -1
- package/dist/store/blob-files.d.ts +2 -2
- package/dist/store/blob-files.d.ts.map +1 -1
- package/dist/store/blob-files.js +1 -0
- package/dist/store/blob-files.js.map +1 -1
- package/dist/store/command-prune.d.ts.map +1 -1
- package/dist/store/command-prune.js +4 -0
- package/dist/store/command-prune.js.map +1 -1
- package/dist/store/commands.d.ts +7 -2
- package/dist/store/commands.d.ts.map +1 -1
- package/dist/store/commands.js +38 -11
- package/dist/store/commands.js.map +1 -1
- package/dist/store/deferred-message-rows.d.ts +10 -0
- package/dist/store/deferred-message-rows.d.ts.map +1 -1
- package/dist/store/deferred-message-rows.js +28 -1
- package/dist/store/deferred-message-rows.js.map +1 -1
- package/dist/store/deferred-messages.d.ts +10 -3
- package/dist/store/deferred-messages.d.ts.map +1 -1
- package/dist/store/deferred-messages.js +45 -9
- package/dist/store/deferred-messages.js.map +1 -1
- package/dist/store/external-files.d.ts +17 -0
- package/dist/store/external-files.d.ts.map +1 -1
- package/dist/store/external-files.js +54 -0
- package/dist/store/external-files.js.map +1 -1
- package/dist/store/idempotency.d.ts +1 -1
- package/dist/store/idempotency.d.ts.map +1 -1
- package/dist/store/idempotency.js +2 -1
- package/dist/store/idempotency.js.map +1 -1
- package/dist/store/libuv-pool.d.ts +25 -0
- package/dist/store/libuv-pool.d.ts.map +1 -0
- package/dist/store/libuv-pool.js +96 -0
- package/dist/store/libuv-pool.js.map +1 -0
- package/dist/store/maintenance-worker.d.ts.map +1 -1
- package/dist/store/maintenance-worker.js +45 -0
- package/dist/store/maintenance-worker.js.map +1 -1
- package/dist/store/maintenance.d.ts +28 -2
- package/dist/store/maintenance.d.ts.map +1 -1
- package/dist/store/maintenance.js +36 -6
- package/dist/store/maintenance.js.map +1 -1
- package/dist/store/project-router.d.ts +107 -1
- package/dist/store/project-router.d.ts.map +1 -1
- package/dist/store/project-router.js +30 -0
- package/dist/store/project-router.js.map +1 -1
- package/dist/store/publish-blob.d.ts.map +1 -1
- package/dist/store/publish-blob.js +36 -14
- package/dist/store/publish-blob.js.map +1 -1
- package/dist/store/purge-files.d.ts +11 -2
- package/dist/store/purge-files.d.ts.map +1 -1
- package/dist/store/purge-files.js +34 -7
- package/dist/store/purge-files.js.map +1 -1
- package/dist/store/resource-release.d.ts +15 -0
- package/dist/store/resource-release.d.ts.map +1 -0
- package/dist/store/resource-release.js +56 -0
- package/dist/store/resource-release.js.map +1 -0
- package/dist/store/resource-rows.d.ts +2 -0
- package/dist/store/resource-rows.d.ts.map +1 -1
- package/dist/store/resource-rows.js.map +1 -1
- package/dist/store/resource-uses.d.ts +84 -0
- package/dist/store/resource-uses.d.ts.map +1 -0
- package/dist/store/resource-uses.js +129 -0
- package/dist/store/resource-uses.js.map +1 -0
- package/dist/store/resources.d.ts +16 -2
- package/dist/store/resources.d.ts.map +1 -1
- package/dist/store/resources.js +42 -3
- package/dist/store/resources.js.map +1 -1
- package/dist/store/retention-changes.d.ts +8 -2
- package/dist/store/retention-changes.d.ts.map +1 -1
- package/dist/store/retention-changes.js +24 -11
- package/dist/store/retention-changes.js.map +1 -1
- package/dist/store/retention-generations.d.ts +7 -2
- package/dist/store/retention-generations.d.ts.map +1 -1
- package/dist/store/retention-generations.js +71 -26
- package/dist/store/retention-generations.js.map +1 -1
- package/dist/store/retention-reference-reader.d.ts +26 -1
- package/dist/store/retention-reference-reader.d.ts.map +1 -1
- package/dist/store/retention-reference-reader.js +31 -7
- package/dist/store/retention-reference-reader.js.map +1 -1
- package/dist/store/retention-references.d.ts +5 -0
- package/dist/store/retention-references.d.ts.map +1 -1
- package/dist/store/retention-references.js +35 -6
- package/dist/store/retention-references.js.map +1 -1
- package/dist/store/schema.d.ts +2 -2
- package/dist/store/schema.d.ts.map +1 -1
- package/dist/store/schema.js +17 -2
- package/dist/store/schema.js.map +1 -1
- package/dist/store/sql-command-router.d.ts +10 -1
- package/dist/store/sql-command-router.d.ts.map +1 -1
- package/dist/store/sql-command-router.js +10 -1
- package/dist/store/sql-command-router.js.map +1 -1
- package/dist/store/sql-daemon-services.d.ts.map +1 -1
- package/dist/store/sql-daemon-services.js +9 -8
- package/dist/store/sql-daemon-services.js.map +1 -1
- package/dist/store/sql-validation.d.ts.map +1 -1
- package/dist/store/sql-validation.js +1 -0
- package/dist/store/sql-validation.js.map +1 -1
- package/dist/store/terminal-files.d.ts +6 -3
- package/dist/store/terminal-files.d.ts.map +1 -1
- package/dist/store/terminal-files.js +6 -38
- package/dist/store/terminal-files.js.map +1 -1
- package/dist/store/thread-closure.d.ts +62 -0
- package/dist/store/thread-closure.d.ts.map +1 -0
- package/dist/store/thread-closure.js +290 -0
- package/dist/store/thread-closure.js.map +1 -0
- package/dist/store/thread-retirement.d.ts +29 -0
- package/dist/store/thread-retirement.d.ts.map +1 -0
- package/dist/store/thread-retirement.js +123 -0
- package/dist/store/thread-retirement.js.map +1 -0
- package/dist/store/threads.d.ts.map +1 -1
- package/dist/store/threads.js +6 -1
- package/dist/store/threads.js.map +1 -1
- package/dist/store/upload-imports.d.ts.map +1 -1
- package/dist/store/upload-imports.js +16 -3
- package/dist/store/upload-imports.js.map +1 -1
- package/dist/store/uploads.d.ts +13 -2
- package/dist/store/uploads.d.ts.map +1 -1
- package/dist/store/uploads.js +76 -30
- package/dist/store/uploads.js.map +1 -1
- package/dist/store-contracts.d.ts +25 -2
- package/dist/store-contracts.d.ts.map +1 -1
- package/dist/terminal-authority.d.ts +1 -1
- package/dist/thread-lifecycle.d.ts +3 -1
- package/dist/thread-lifecycle.d.ts.map +1 -1
- package/dist/thread-lifecycle.js +2 -2
- package/dist/thread-lifecycle.js.map +1 -1
- package/dist/writer-lease.d.ts.map +1 -1
- package/dist/writer-lease.js +6 -3
- package/dist/writer-lease.js.map +1 -1
- package/package.json +5 -5
|
@@ -27,11 +27,15 @@ function observe(store, listener) {
|
|
|
27
27
|
let listeners = observers.get(store);
|
|
28
28
|
if (!listeners) {
|
|
29
29
|
const targets = new Set();
|
|
30
|
-
store.db.function("disk_retention_changed", (table, id,
|
|
30
|
+
store.db.function("disk_retention_changed", (table, id, root) => {
|
|
31
31
|
// Node 24.15 truncates TEXT at NUL; interaction keys must arrive as bytes.
|
|
32
32
|
const decodedId = Buffer.from(id).toString("utf8");
|
|
33
33
|
for (const target of targets)
|
|
34
|
-
target({
|
|
34
|
+
target({
|
|
35
|
+
table: table,
|
|
36
|
+
id: decodedId,
|
|
37
|
+
roots: new Set(root === null ? [] : [Buffer.from(root).toString("utf8")]),
|
|
38
|
+
});
|
|
35
39
|
return null;
|
|
36
40
|
});
|
|
37
41
|
for (const [table, fields] of Object.entries(columns)) {
|
|
@@ -47,7 +51,7 @@ function observe(store, listener) {
|
|
|
47
51
|
const rows = operation === "UPDATE" ? ["OLD", "NEW"] : [operation === "DELETE" ? "OLD" : "NEW"];
|
|
48
52
|
store.exec(`CREATE TEMP TRIGGER disk_retention_${table}_${operation}
|
|
49
53
|
AFTER ${operation} ON main.${table} ${changed} BEGIN
|
|
50
|
-
${rows.map((row) => `SELECT disk_retention_changed('${table}',CAST(${row}.${key} AS BLOB)
|
|
54
|
+
${rows.map((row) => `SELECT disk_retention_changed('${table}',CAST(${row}.${key} AS BLOB),${table === "project" ? `CAST(${row}.root AS BLOB)` : "NULL"});`).join("\n")}
|
|
51
55
|
END`);
|
|
52
56
|
}
|
|
53
57
|
}
|
|
@@ -58,15 +62,19 @@ function observe(store, listener) {
|
|
|
58
62
|
return () => void listeners.delete(listener);
|
|
59
63
|
}
|
|
60
64
|
/** Subscribe BEFORE the cooperative read. Drain changed row identities only;
|
|
61
|
-
* quota/event traffic and unrelated metadata never restart the full inventory.
|
|
65
|
+
* quota/event traffic and unrelated metadata never restart the full inventory.
|
|
66
|
+
* Project and partition changes reach the reader like every other owner row: it
|
|
67
|
+
* defers the affected namespaces or, only when rows were never inventoried,
|
|
68
|
+
* holds the whole pass (`hold`). A change that cannot be read holds it too. */
|
|
62
69
|
export function retentionChanges(store) {
|
|
63
70
|
const pending = new Map();
|
|
64
71
|
let closed = false;
|
|
65
|
-
let
|
|
72
|
+
let held = null;
|
|
66
73
|
const stop = observe(store, (change) => {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
74
|
+
const key = `${change.table}:${change.id}`;
|
|
75
|
+
for (const root of pending.get(key)?.roots ?? [])
|
|
76
|
+
change.roots.add(root);
|
|
77
|
+
pending.set(key, change);
|
|
70
78
|
});
|
|
71
79
|
const readOne = (key, read) => {
|
|
72
80
|
const change = pending.get(key);
|
|
@@ -77,11 +85,16 @@ export function retentionChanges(store) {
|
|
|
77
85
|
read(change);
|
|
78
86
|
}
|
|
79
87
|
catch (error) {
|
|
80
|
-
|
|
88
|
+
held ??= String(error);
|
|
81
89
|
throw error;
|
|
82
90
|
}
|
|
83
91
|
};
|
|
84
92
|
return {
|
|
93
|
+
/** Why the whole pass holds, once a change named a reason. */
|
|
94
|
+
hold(reason) {
|
|
95
|
+
held ??= reason;
|
|
96
|
+
},
|
|
97
|
+
held: () => held,
|
|
85
98
|
async refresh(read, signal) {
|
|
86
99
|
// Capture a finite batch; newly arriving work is handled by the final
|
|
87
100
|
// synchronous check or the next cooperative refresh.
|
|
@@ -92,7 +105,7 @@ export function retentionChanges(store) {
|
|
|
92
105
|
}
|
|
93
106
|
},
|
|
94
107
|
current(read) {
|
|
95
|
-
if (closed ||
|
|
108
|
+
if (closed || held)
|
|
96
109
|
return false;
|
|
97
110
|
// Same physical read budget as a SQL inventory page. An exceptional
|
|
98
111
|
// burst stays for the next cooperative pass, never a long admission lock.
|
|
@@ -100,7 +113,7 @@ export function retentionChanges(store) {
|
|
|
100
113
|
return false;
|
|
101
114
|
for (const key of pending.keys())
|
|
102
115
|
readOne(key, read);
|
|
103
|
-
return !
|
|
116
|
+
return !held;
|
|
104
117
|
},
|
|
105
118
|
close() {
|
|
106
119
|
closed = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retention-changes.js","sourceRoot":"","sources":["../../src/store/retention-changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxE,6EAA6E;AAC7E,6EAA6E;AAC7E,kEAAkE;AAClE,MAAM,OAAO,GAAG;IACd,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC;IAC/B,IAAI,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC;IACjC,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC;IAClD,OAAO,EAAE;QACP,IAAI;QACJ,MAAM;QACN,QAAQ;QACR,SAAS;QACT,OAAO;QACP,aAAa;QACb,eAAe;QACf,YAAY;KACb;IACD,WAAW,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC;IACtC,gBAAgB,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,OAAO,CAAC;IAClF,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC;IACvD,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC;IACjD,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;CAC1B,CAAC;AAIX,MAAM,SAAS,GAAG,IAAI,OAAO,EAA8B,CAAC;AAE5D,SAAS,OAAO,CAAC,KAAkB,EAAE,QAAkB;IACrD,IAAI,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,IAAI,GAAG,EAAY,CAAC;QACpC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,wBAAwB,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"retention-changes.js","sourceRoot":"","sources":["../../src/store/retention-changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxE,6EAA6E;AAC7E,6EAA6E;AAC7E,kEAAkE;AAClE,MAAM,OAAO,GAAG;IACd,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC;IAC/B,IAAI,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC;IACjC,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC;IAClD,OAAO,EAAE;QACP,IAAI;QACJ,MAAM;QACN,QAAQ;QACR,SAAS;QACT,OAAO;QACP,aAAa;QACb,eAAe;QACf,YAAY;KACb;IACD,WAAW,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC;IACtC,gBAAgB,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,OAAO,CAAC;IAClF,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC;IACvD,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC;IACjD,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;CAC1B,CAAC;AAIX,MAAM,SAAS,GAAG,IAAI,OAAO,EAA8B,CAAC;AAE5D,SAAS,OAAO,CAAC,KAAkB,EAAE,QAAkB;IACrD,IAAI,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,IAAI,GAAG,EAAY,CAAC;QACpC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,wBAAwB,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;YAC9D,2EAA2E;YAC3E,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,EAAgB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACjE,KAAK,MAAM,MAAM,IAAI,OAAO;gBAC1B,MAAM,CAAC;oBACL,KAAK,EAAE,KAAc;oBACrB,EAAE,EAAE,SAAS;oBACb,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAkB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;iBACxF,CAAC,CAAC;YACL,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACtD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACtB,KAAK,MAAM,SAAS,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAU,EAAE,CAAC;gBAChE,oEAAoE;gBACpE,oEAAoE;gBACpE,IAAI,KAAK,KAAK,MAAM,IAAI,SAAS,KAAK,QAAQ;oBAAE,SAAS;gBACzD,MAAM,OAAO,GACX,SAAS,KAAK,QAAQ;oBACpB,CAAC,CAAC,QAAQ,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,eAAe,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;oBAClF,CAAC,CAAC,EAAE,CAAC;gBACT,MAAM,IAAI,GACR,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACrF,KAAK,CAAC,IAAI,CAAC,sCAAsC,KAAK,IAAI,SAAS;kBACzD,SAAS,YAAY,KAAK,IAAI,OAAO;YAC3C,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,kCAAkC,KAAK,UAAU,GAAG,IAAI,GAAG,aAAa,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,GAAG,gBAAgB,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;cAClK,CAAC,CAAC;YACV,CAAC;QACH,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9B,SAAS,GAAG,OAAO,CAAC;IACtB,CAAC;IACD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE,CAAC,KAAK,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED;;;;+EAI+E;AAC/E,MAAM,UAAU,gBAAgB,CAAC,KAAkB;IACjD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,IAAI,EAAE;YAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,IAA8B,EAAE,EAAE;QAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;YACvB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IACF,OAAO;QACL,8DAA8D;QAC9D,IAAI,CAAC,MAAc;YACjB,IAAI,KAAK,MAAM,CAAC;QAClB,CAAC;QACD,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI;QAChB,KAAK,CAAC,OAAO,CAAC,IAA8B,EAAE,MAAoB;YAChE,sEAAsE;YACtE,qDAAqD;YACrD,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBACtC,MAAM,EAAE,cAAc,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACnB,MAAM,gBAAgB,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,OAAO,CAAC,IAA8B;YACpC,IAAI,MAAM,IAAI,IAAI;gBAAE,OAAO,KAAK,CAAC;YACjC,oEAAoE;YACpE,0EAA0E;YAC1E,IAAI,OAAO,CAAC,IAAI,GAAG,GAAG;gBAAE,OAAO,KAAK,CAAC;YACrC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE;gBAAE,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC;QACf,CAAC;QACD,KAAK;YACH,MAAM,GAAG,IAAI,CAAC;YACd,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,EAAE,CAAC;QACT,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import type { EngineStore } from "./store.js";
|
|
2
2
|
/** Quarantine completes recovery: those rows are evidence, never live owners.
|
|
3
3
|
* Archived generations remain restorable owners. Unknown/pending states cannot
|
|
4
|
-
* prove absence and hold run retirement install-wide.
|
|
4
|
+
* prove absence and hold run retirement install-wide. A partition created after
|
|
5
|
+
* the snapshot (a late registration's fresh generation) is read on demand; its
|
|
6
|
+
* rows were all written after the change observer subscribed, so they reach the
|
|
7
|
+
* pass through its queue. */
|
|
5
8
|
export declare function retentionGenerations(store: EngineStore): {
|
|
6
9
|
retained: (pid: number) => boolean;
|
|
10
|
+
changed: (pid: number) => string | null;
|
|
11
|
+
refreshProject: (id?: string) => void;
|
|
7
12
|
registeredProjectRoots: Set<string>;
|
|
8
13
|
archivedProjectRoots: Set<string>;
|
|
9
14
|
protectedProjectRoots: Set<string>;
|
|
@@ -13,6 +18,6 @@ export declare function retentionGenerations(store: EngineStore): {
|
|
|
13
18
|
count: number;
|
|
14
19
|
example: string;
|
|
15
20
|
}[];
|
|
16
|
-
blocked: string | undefined;
|
|
21
|
+
readonly blocked: string | undefined;
|
|
17
22
|
};
|
|
18
23
|
//# sourceMappingURL=retention-generations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retention-generations.d.ts","sourceRoot":"","sources":["../../src/store/retention-generations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"retention-generations.d.ts","sourceRoot":"","sources":["../../src/store/retention-generations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAc9C;;;;;6BAK6B;AAC7B,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW;oBAa9B,MAAM;mBAeP,MAAM,KAAG,MAAM,GAAG,IAAI;0BAoDf,MAAM;;;;;;;;;;;EAoCpC"}
|
|
@@ -1,22 +1,56 @@
|
|
|
1
|
+
const PARTITIONS = `SELECT q.id,q.name,q.status,q.project_id,p.root,g.status AS registry_status
|
|
2
|
+
FROM partition q LEFT JOIN project p ON p.id=q.project_id LEFT JOIN partition g ON g.id=p.pid`;
|
|
1
3
|
/** Quarantine completes recovery: those rows are evidence, never live owners.
|
|
2
4
|
* Archived generations remain restorable owners. Unknown/pending states cannot
|
|
3
|
-
* prove absence and hold run retirement install-wide.
|
|
5
|
+
* prove absence and hold run retirement install-wide. A partition created after
|
|
6
|
+
* the snapshot (a late registration's fresh generation) is read on demand; its
|
|
7
|
+
* rows were all written after the change observer subscribed, so they reach the
|
|
8
|
+
* pass through its queue. */
|
|
4
9
|
export function retentionGenerations(store) {
|
|
5
|
-
const rows = store
|
|
6
|
-
.prepare(`SELECT q.id,q.name,q.status,q.project_id,p.root,g.status AS registry_status FROM partition q
|
|
7
|
-
LEFT JOIN project p ON p.id=q.project_id LEFT JOIN partition g ON g.id=p.pid`)
|
|
8
|
-
.all();
|
|
10
|
+
const rows = store.prepare(PARTITIONS).all();
|
|
9
11
|
const known = new Map(rows.map((row) => [row.id, row]));
|
|
12
|
+
const read = (pid) => store.prepare(`${PARTITIONS} WHERE q.id=?`).get(pid);
|
|
10
13
|
// A completed global quarantine also retires its project descendants. Their
|
|
11
14
|
// own ready/archived/pending bits are historical, not an independent owner.
|
|
12
15
|
const retired = (row) => row.status === "quarantined" || row.registry_status === "quarantined";
|
|
16
|
+
const owns = (row) => !retired(row) &&
|
|
17
|
+
(!row.project_id || row.registry_status === "ready" || row.registry_status === "archived") &&
|
|
18
|
+
(row.status === "ready" || row.status === "archived");
|
|
13
19
|
const retained = (pid) => {
|
|
14
|
-
|
|
20
|
+
let row = known.get(pid);
|
|
21
|
+
if (!row) {
|
|
22
|
+
row = read(pid);
|
|
23
|
+
if (row) {
|
|
24
|
+
known.set(pid, row);
|
|
25
|
+
observe(row);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
15
28
|
if (!row)
|
|
16
29
|
throw new Error(`retention owner names missing partition ${pid}`);
|
|
17
|
-
return (
|
|
18
|
-
|
|
19
|
-
|
|
30
|
+
return owns(row);
|
|
31
|
+
};
|
|
32
|
+
/** A partition row changed during the pass. A generation the pass excluded that
|
|
33
|
+
* now owns rows was never inventoried: the reason holds the whole pass. Growth
|
|
34
|
+
* of protection, and a fresh partition, need nothing more. */
|
|
35
|
+
const changed = (pid) => {
|
|
36
|
+
const before = known.get(pid);
|
|
37
|
+
const after = read(pid);
|
|
38
|
+
if (!after)
|
|
39
|
+
return null;
|
|
40
|
+
observe(after);
|
|
41
|
+
if (blocked)
|
|
42
|
+
return blocked;
|
|
43
|
+
if (!before) {
|
|
44
|
+
known.set(pid, after);
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
if (!owns(before) && owns(after))
|
|
48
|
+
return `partition ${after.name} (${pid}) became a retained owner during inventory`;
|
|
49
|
+
// A registry's status decides many generations at once: none is rechecked alone.
|
|
50
|
+
if (before.status !== after.status &&
|
|
51
|
+
store.prepare("SELECT 1 FROM project WHERE pid=? LIMIT 1").get(pid))
|
|
52
|
+
return `registry partition ${after.name} (${pid}) changed during inventory`;
|
|
53
|
+
return null;
|
|
20
54
|
};
|
|
21
55
|
const registered = store
|
|
22
56
|
.prepare(`SELECT p.root,p.status FROM project p
|
|
@@ -33,39 +67,50 @@ export function retentionGenerations(store) {
|
|
|
33
67
|
const errors = [];
|
|
34
68
|
const holds = [];
|
|
35
69
|
let blocked;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
70
|
+
const recoveryHolds = new Set();
|
|
71
|
+
const observe = (row) => {
|
|
72
|
+
if (owns(row) || retired(row) || recoveryHolds.has(row.id))
|
|
73
|
+
return;
|
|
74
|
+
recoveryHolds.add(row.id);
|
|
39
75
|
const reason = `partition ${row.name} (${row.id}, ${row.status}) awaits journal recovery`;
|
|
40
|
-
// Scope roots do not bound dependencies: a continuation may name any namespace.
|
|
41
76
|
blocked ??= reason;
|
|
42
77
|
errors.push(`all namespaces kept: ${reason}`);
|
|
43
78
|
holds.push({ class: "recovery_pending", count: 1, example: reason });
|
|
44
|
-
}
|
|
79
|
+
};
|
|
80
|
+
for (const row of rows)
|
|
81
|
+
observe(row);
|
|
45
82
|
const bindingHolds = new Set();
|
|
46
|
-
|
|
47
|
-
|
|
83
|
+
const refreshProject = (id) => {
|
|
84
|
+
for (const row of store
|
|
85
|
+
.prepare(`SELECT p.root,p.current_pid FROM project p
|
|
48
86
|
JOIN partition g ON g.id=p.pid LEFT JOIN partition q ON q.id=p.current_pid
|
|
49
87
|
WHERE g.status IN ('ready','archived') AND
|
|
50
88
|
((p.current_pid IS NOT NULL AND q.id IS NULL) OR
|
|
51
|
-
(p.status='active' AND p.current_pid IS NULL))`)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
89
|
+
(p.status='active' AND p.current_pid IS NULL))${id === undefined ? "" : " AND p.id=?"}`)
|
|
90
|
+
.all(...(id === undefined ? [] : [id]))) {
|
|
91
|
+
const reason = row.current_pid === null ? "unbound_active_registration" : "missing_partition";
|
|
92
|
+
const holdKey = `${reason}\0${row.root}`;
|
|
93
|
+
if (bindingHolds.has(holdKey))
|
|
94
|
+
continue;
|
|
56
95
|
holds.push({ class: reason, count: 1, example: row.root });
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
96
|
+
bindingHolds.add(holdKey);
|
|
97
|
+
protectedProjectRoots.add(row.root);
|
|
98
|
+
errors.push(`namespace ${row.root} kept: ${reason} (${row.current_pid ?? "NULL"})`);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
refreshProject();
|
|
61
102
|
return {
|
|
62
103
|
retained,
|
|
104
|
+
changed,
|
|
105
|
+
refreshProject,
|
|
63
106
|
registeredProjectRoots,
|
|
64
107
|
archivedProjectRoots,
|
|
65
108
|
protectedProjectRoots,
|
|
66
109
|
errors,
|
|
67
110
|
holds,
|
|
68
|
-
blocked
|
|
111
|
+
get blocked() {
|
|
112
|
+
return blocked;
|
|
113
|
+
},
|
|
69
114
|
};
|
|
70
115
|
}
|
|
71
116
|
//# sourceMappingURL=retention-generations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retention-generations.js","sourceRoot":"","sources":["../../src/store/retention-generations.ts"],"names":[],"mappings":"AAGA
|
|
1
|
+
{"version":3,"file":"retention-generations.js","sourceRoot":"","sources":["../../src/store/retention-generations.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,10 +24,19 @@ export declare class RetentionReferenceReader {
|
|
|
24
24
|
readonly runs: Set<string>;
|
|
25
25
|
readonly sessions: Map<string, Set<string>>;
|
|
26
26
|
readonly roots: Set<string>;
|
|
27
|
-
|
|
27
|
+
/** Lane directories are named by globally unique thread id, independent of
|
|
28
|
+
* the project spelling that happened to produce their runtime namespace. */
|
|
29
|
+
readonly laneThreadIds: Set<string>;
|
|
28
30
|
constructor(store: EngineStore, ignored: ReadonlySet<string>, retained: (pid: number) => boolean);
|
|
29
31
|
add: (id: string | null | undefined) => void;
|
|
30
32
|
thread(row: ThreadRow): Thread | undefined;
|
|
33
|
+
/** A purge obligation still open owns its lane: only the purge owner removes
|
|
34
|
+
* it, after rechecking what a conditional retirement accepted; the orphan
|
|
35
|
+
* sweep must not delete those bytes first. */
|
|
36
|
+
private purgedLane;
|
|
37
|
+
/** Add lane owners from a quarantined partition without decoding its body.
|
|
38
|
+
* Quarantine is precisely the state in which the body may be malformed. */
|
|
39
|
+
addQuarantinedLaneThreadIds(pid?: number): void;
|
|
31
40
|
turn(row: TurnRow, owner?: {
|
|
32
41
|
schema_version: 2;
|
|
33
42
|
id: string;
|
|
@@ -58,6 +67,14 @@ export declare class RetentionReferenceReader {
|
|
|
58
67
|
trashed_at: string | null;
|
|
59
68
|
purge_after: string | null;
|
|
60
69
|
pre_trash_state: "active" | "closed" | null;
|
|
70
|
+
retirement?: {
|
|
71
|
+
operationId: string;
|
|
72
|
+
exportId: string;
|
|
73
|
+
closureDigest: string;
|
|
74
|
+
contentDigest: string;
|
|
75
|
+
laneDigest: string;
|
|
76
|
+
acceptedAt: string;
|
|
77
|
+
} | undefined;
|
|
61
78
|
} | undefined): void;
|
|
62
79
|
session(row: SessionRow, owner?: {
|
|
63
80
|
schema_version: 2;
|
|
@@ -89,6 +106,14 @@ export declare class RetentionReferenceReader {
|
|
|
89
106
|
trashed_at: string | null;
|
|
90
107
|
purge_after: string | null;
|
|
91
108
|
pre_trash_state: "active" | "closed" | null;
|
|
109
|
+
retirement?: {
|
|
110
|
+
operationId: string;
|
|
111
|
+
exportId: string;
|
|
112
|
+
closureDigest: string;
|
|
113
|
+
contentDigest: string;
|
|
114
|
+
laneDigest: string;
|
|
115
|
+
acceptedAt: string;
|
|
116
|
+
} | undefined;
|
|
92
117
|
} | undefined): void;
|
|
93
118
|
refresh(table: "thread" | "turn" | "session" | "interaction", id: string): void;
|
|
94
119
|
private read;
|
|
@@ -1 +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;
|
|
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;AAChE,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;IASjC,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAV3B,QAAQ,CAAC,IAAI,cAAqB;IAClC,QAAQ,CAAC,QAAQ,2BAAkC;IACnD,QAAQ,CAAC,KAAK,cAAqB;IACnC;gFAC4E;IAC5E,QAAQ,CAAC,aAAa,cAAqB;IAE3C,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,CAiBzC;IAED;;kDAE8C;IAC9C,OAAO,CAAC,UAAU;IAUlB;+EAC2E;IAC3E,2BAA2B,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAU9C;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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Session, Thread, ThreadTurn } from "@claudexor/schema";
|
|
2
|
-
import { noProjectRepoRoot } from "@claudexor/util";
|
|
3
2
|
import { decodeBody } from "./thread-rows.js";
|
|
4
3
|
const RetainedTurn = ThreadTurn.omit({ prompt: true });
|
|
5
4
|
/** One typed reader for the initial inventory AND changed-owner rechecks.
|
|
@@ -11,7 +10,9 @@ export class RetentionReferenceReader {
|
|
|
11
10
|
runs = new Set();
|
|
12
11
|
sessions = new Map();
|
|
13
12
|
roots = new Set();
|
|
14
|
-
|
|
13
|
+
/** Lane directories are named by globally unique thread id, independent of
|
|
14
|
+
* the project spelling that happened to produce their runtime namespace. */
|
|
15
|
+
laneThreadIds = new Set();
|
|
15
16
|
constructor(store, ignored, retained) {
|
|
16
17
|
this.store = store;
|
|
17
18
|
this.ignored = ignored;
|
|
@@ -22,23 +23,46 @@ export class RetentionReferenceReader {
|
|
|
22
23
|
this.runs.add(id);
|
|
23
24
|
};
|
|
24
25
|
thread(row) {
|
|
25
|
-
if (
|
|
26
|
+
if (row.state === "purged") {
|
|
27
|
+
this.purgedLane(row);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (!this.retained(row.pid))
|
|
26
31
|
return;
|
|
27
32
|
const thread = this.read("thread", row, () => Thread.parse(decodeBody(row)));
|
|
28
33
|
if (thread.state !== row.state || thread.id !== row.id)
|
|
29
34
|
throw new Error(`thread ${row.id} in partition ${row.pid}: retention state or identity disagrees`);
|
|
30
35
|
if (thread.repo)
|
|
31
36
|
this.roots.add(thread.repo.root);
|
|
32
|
-
|
|
33
|
-
const lanes = this.lanes.get(root) ?? new Set();
|
|
34
|
-
lanes.add(thread.id);
|
|
35
|
-
this.lanes.set(root, lanes);
|
|
37
|
+
this.laneThreadIds.add(thread.id);
|
|
36
38
|
if (this.ignored.has(thread.id) && thread.state === "trashed")
|
|
37
39
|
return;
|
|
38
40
|
thread.run_ids.forEach(this.add);
|
|
39
41
|
this.add(thread.head_run_id);
|
|
40
42
|
return thread;
|
|
41
43
|
}
|
|
44
|
+
/** A purge obligation still open owns its lane: only the purge owner removes
|
|
45
|
+
* it, after rechecking what a conditional retirement accepted; the orphan
|
|
46
|
+
* sweep must not delete those bytes first. */
|
|
47
|
+
purgedLane(row) {
|
|
48
|
+
if (!this.store
|
|
49
|
+
.prepare("SELECT 1 FROM effect_obligation WHERE kind='purge_fs' AND key=?")
|
|
50
|
+
.get(row.id))
|
|
51
|
+
return;
|
|
52
|
+
this.laneThreadIds.add(row.id);
|
|
53
|
+
}
|
|
54
|
+
/** Add lane owners from a quarantined partition without decoding its body.
|
|
55
|
+
* Quarantine is precisely the state in which the body may be malformed. */
|
|
56
|
+
addQuarantinedLaneThreadIds(pid) {
|
|
57
|
+
const rows = this.store
|
|
58
|
+
.prepare(`SELECT t.id FROM thread t JOIN partition q ON q.id=t.pid
|
|
59
|
+
LEFT JOIN project p ON p.id=q.project_id LEFT JOIN partition g ON g.id=p.pid
|
|
60
|
+
WHERE t.state<>'purged' AND (q.status='quarantined' OR g.status='quarantined')
|
|
61
|
+
${pid === undefined ? "" : "AND (q.id=? OR p.pid=?)"}`)
|
|
62
|
+
.all(...(pid === undefined ? [] : [pid, pid]));
|
|
63
|
+
for (const row of rows)
|
|
64
|
+
this.laneThreadIds.add(row.id);
|
|
65
|
+
}
|
|
42
66
|
turn(row, owner = this.owner(row.thread_id)) {
|
|
43
67
|
if (!this.retained(row.pid) || !owner)
|
|
44
68
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retention-reference-reader.js","sourceRoot":"","sources":["../../src/store/retention-reference-reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"retention-reference-reader.js","sourceRoot":"","sources":["../../src/store/retention-reference-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,8 @@ export interface DiskRetentionReferences {
|
|
|
6
6
|
/** Cooperatively absorb changed owners, then synchronously recheck before expiry. */
|
|
7
7
|
refresh?: () => Promise<void>;
|
|
8
8
|
recheck?: () => boolean;
|
|
9
|
+
/** Latched changed-owner cause when the proof is no longer current. */
|
|
10
|
+
held?: () => string | null;
|
|
9
11
|
/** Native callers absorb the same changed owners before per-file rechecks. */
|
|
10
12
|
nativeCurrent?: () => boolean;
|
|
11
13
|
/** Pass-local ownership, refreshed synchronously at each lane sweep boundary. */
|
|
@@ -14,6 +16,9 @@ export interface DiskRetentionReferences {
|
|
|
14
16
|
nativeWatchRunDirs?: ReadonlySet<string>;
|
|
15
17
|
nativeReferenceError?: () => string | null;
|
|
16
18
|
hasActiveCommands?: () => boolean;
|
|
19
|
+
/** Runtime namespaces whose registration (root, status, generation) changed during
|
|
20
|
+
* the pass: their keep-last and ownership are unknown until a fresh pass (#503). */
|
|
21
|
+
deferredRuntimes?: () => ReadonlySet<string>;
|
|
17
22
|
/** Caller releases the observation after all deletions, including error paths. */
|
|
18
23
|
close?: () => void;
|
|
19
24
|
/** Recovery holds are receipt facts; completed quarantine is not a hold. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retention-references.d.ts","sourceRoot":"","sources":["../../src/store/retention-references.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"retention-references.d.ts","sourceRoot":"","sources":["../../src/store/retention-references.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAU9C,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,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC3B,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;wFACoF;IACpF,gBAAgB,CAAC,EAAE,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7C,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,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,CA2IlC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Thread } from "@claudexor/schema";
|
|
2
2
|
import { setImmediate as yieldToAdmission } from "node:timers/promises";
|
|
3
3
|
import { access } from "node:fs/promises";
|
|
4
|
+
import { projectRuntimeDir } from "@claudexor/util";
|
|
4
5
|
import { decodeBody } from "./thread-rows.js";
|
|
5
6
|
import { isServedPid } from "./generations.js";
|
|
6
7
|
import { retentionPages } from "./retention-pages.js";
|
|
@@ -57,10 +58,24 @@ export async function diskRetentionReferences(store, ignoreThreadIds = new Set()
|
|
|
57
58
|
const version = changes.get().n;
|
|
58
59
|
const isCurrent = () => changes.get().n === version;
|
|
59
60
|
const generations = retentionGenerations(store);
|
|
61
|
+
// The observer retains every spelling through queued relinks and deletion.
|
|
62
|
+
const deferred = new Set();
|
|
63
|
+
const runtimeByRoot = new Map();
|
|
64
|
+
const deferRoots = (changedRoots) => {
|
|
65
|
+
for (const root of changedRoots) {
|
|
66
|
+
let runtime = runtimeByRoot.get(root);
|
|
67
|
+
if (!runtime) {
|
|
68
|
+
runtime = projectRuntimeDir(root);
|
|
69
|
+
runtimeByRoot.set(root, runtime);
|
|
70
|
+
}
|
|
71
|
+
deferred.add(runtime);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
60
74
|
const { registeredProjectRoots, archivedProjectRoots, protectedProjectRoots, errors, blocked } = generations;
|
|
61
75
|
const roots = new Set([...registeredProjectRoots, ...protectedProjectRoots]);
|
|
62
76
|
const retained = blocked ? () => false : generations.retained;
|
|
63
77
|
const reader = new RetentionReferenceReader(store, ignoreThreadIds, retained);
|
|
78
|
+
reader.addQuarantinedLaneThreadIds();
|
|
64
79
|
for await (const rows of retentionPages(store, "thread", "id,pid,state,body", signal)) {
|
|
65
80
|
for (const row of rows) {
|
|
66
81
|
await yieldToAdmission();
|
|
@@ -88,7 +103,7 @@ export async function diskRetentionReferences(store, ignoreThreadIds = new Set()
|
|
|
88
103
|
reader.add(row.run_id);
|
|
89
104
|
const refreshDraft = await deferredRetentionReferences(store, retained, (id) => reader.add(id), signal);
|
|
90
105
|
const commands = await commandRetentionReferences(store, retained, reader.runs, signal);
|
|
91
|
-
const readChange = ({ table, id, }) => {
|
|
106
|
+
const readChange = ({ table, id, roots: changedRoots, }) => {
|
|
92
107
|
if (table === "command")
|
|
93
108
|
commands.refresh(id);
|
|
94
109
|
else if (table === "deferred_message")
|
|
@@ -100,10 +115,20 @@ export async function diskRetentionReferences(store, ignoreThreadIds = new Set()
|
|
|
100
115
|
if (owner)
|
|
101
116
|
throw new Error(`immutable retention command ${owner.id} in partition ${owner.pid}: params blob ${id} changed during inventory`);
|
|
102
117
|
}
|
|
103
|
-
else if (table
|
|
118
|
+
else if (table === "project") {
|
|
119
|
+
deferRoots(changedRoots);
|
|
120
|
+
generations.refreshProject(id);
|
|
121
|
+
}
|
|
122
|
+
else if (table === "partition") {
|
|
123
|
+
const reason = generations.changed(Number(id));
|
|
124
|
+
if (reason)
|
|
125
|
+
changesObserved.hold(reason);
|
|
126
|
+
reader.addQuarantinedLaneThreadIds(Number(id));
|
|
127
|
+
}
|
|
128
|
+
else
|
|
104
129
|
reader.refresh(table, id);
|
|
105
130
|
};
|
|
106
|
-
const recheck = () => changesObserved.current(readChange);
|
|
131
|
+
const recheck = () => changesObserved.current(readChange) && !generations.blocked;
|
|
107
132
|
const refresh = () => changesObserved.refresh(readChange, signal);
|
|
108
133
|
await refresh();
|
|
109
134
|
for (const root of reader.roots)
|
|
@@ -112,18 +137,22 @@ export async function diskRetentionReferences(store, ignoreThreadIds = new Set()
|
|
|
112
137
|
isCurrent,
|
|
113
138
|
refresh,
|
|
114
139
|
recheck,
|
|
140
|
+
held: changesObserved.held,
|
|
115
141
|
nativeCurrent: recheck,
|
|
116
|
-
laneThreadIds: (
|
|
142
|
+
laneThreadIds: () => {
|
|
117
143
|
if (!recheck())
|
|
118
144
|
throw new Error("lane ownership changed; a fresh retention pass must resume");
|
|
119
|
-
return reader.
|
|
145
|
+
return reader.laneThreadIds;
|
|
120
146
|
},
|
|
121
147
|
nativeRunDirs: commands.nativeRunDirs,
|
|
122
148
|
nativeWatchRunDirs: commands.nativeWatchRunDirs,
|
|
123
149
|
nativeReferenceError: commands.nativeReferenceError,
|
|
124
150
|
hasActiveCommands: commands.hasActiveCommands,
|
|
151
|
+
deferredRuntimes: () => deferred,
|
|
125
152
|
close: changesObserved.close,
|
|
126
|
-
blocked
|
|
153
|
+
get blocked() {
|
|
154
|
+
return generations.blocked;
|
|
155
|
+
},
|
|
127
156
|
errors,
|
|
128
157
|
holds: generations.holds,
|
|
129
158
|
projectRoots: [...roots],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retention-references.js","sourceRoot":"","sources":["../../src/store/retention-references.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAe,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"retention-references.js","sourceRoot":"","sources":["../../src/store/retention-references.ts"],"names":[],"mappings":"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"}
|