@claudexor/daemon 3.20.1 → 3.23.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-errors.d.ts +9 -0
- package/dist/client-errors.d.ts.map +1 -0
- package/dist/client-errors.js +15 -0
- package/dist/client-errors.js.map +1 -0
- package/dist/client.d.ts +3 -5
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +21 -13
- package/dist/client.js.map +1 -1
- package/dist/command-activity.d.ts +14 -0
- package/dist/command-activity.d.ts.map +1 -0
- package/dist/command-activity.js +16 -0
- package/dist/command-activity.js.map +1 -0
- package/dist/command-list-projection.d.ts +8 -0
- package/dist/command-list-projection.d.ts.map +1 -0
- package/dist/command-list-projection.js +43 -0
- package/dist/command-list-projection.js.map +1 -0
- package/dist/command-list-select.d.ts +8 -0
- package/dist/command-list-select.d.ts.map +1 -0
- package/dist/command-list-select.js +127 -0
- package/dist/command-list-select.js.map +1 -0
- package/dist/command-retention.d.ts +3 -18
- package/dist/command-retention.d.ts.map +1 -1
- package/dist/command-retention.js +24 -40
- package/dist/command-retention.js.map +1 -1
- package/dist/command-scope-roots.d.ts +6 -0
- package/dist/command-scope-roots.d.ts.map +1 -1
- package/dist/command-scope-roots.js +13 -0
- package/dist/command-scope-roots.js.map +1 -1
- package/dist/command-store.d.ts +2 -5
- package/dist/command-store.d.ts.map +1 -1
- package/dist/command-store.js +4 -5
- package/dist/command-store.js.map +1 -1
- package/dist/continuation-admission.d.ts +11 -0
- package/dist/continuation-admission.d.ts.map +1 -0
- package/dist/continuation-admission.js +16 -0
- package/dist/continuation-admission.js.map +1 -0
- package/dist/credential-unusable-ledger.d.ts +3 -8
- package/dist/credential-unusable-ledger.d.ts.map +1 -1
- package/dist/credential-unusable-ledger.js +5 -8
- package/dist/credential-unusable-ledger.js.map +1 -1
- package/dist/daemon-health.d.ts +13 -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/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/journal-fold-policy.d.ts.map +1 -1
- package/dist/journal-fold-policy.js +12 -1
- package/dist/journal-fold-policy.js.map +1 -1
- package/dist/memory-facts.d.ts +5 -0
- package/dist/memory-facts.d.ts.map +1 -0
- package/dist/memory-facts.js +23 -0
- package/dist/memory-facts.js.map +1 -0
- package/dist/project-partition-preparation.d.ts +8 -1
- package/dist/project-partition-preparation.d.ts.map +1 -1
- package/dist/project-partition-preparation.js +41 -3
- package/dist/project-partition-preparation.js.map +1 -1
- package/dist/project-partitions.d.ts +5 -0
- package/dist/project-partitions.d.ts.map +1 -1
- package/dist/project-partitions.js +7 -0
- package/dist/project-partitions.js.map +1 -1
- package/dist/project-remove.d.ts.map +1 -1
- package/dist/project-remove.js +2 -4
- package/dist/project-remove.js.map +1 -1
- package/dist/quota-poll-lanes.d.ts +25 -7
- package/dist/quota-poll-lanes.d.ts.map +1 -1
- package/dist/quota-poll-lanes.js +90 -16
- package/dist/quota-poll-lanes.js.map +1 -1
- package/dist/quota-poll-pacer.d.ts +33 -36
- package/dist/quota-poll-pacer.d.ts.map +1 -1
- package/dist/quota-poll-pacer.js +115 -63
- package/dist/quota-poll-pacer.js.map +1 -1
- package/dist/quota-registry-support.d.ts +74 -0
- package/dist/quota-registry-support.d.ts.map +1 -1
- package/dist/quota-registry-support.js +153 -1
- package/dist/quota-registry-support.js.map +1 -1
- package/dist/quota-registry.d.ts +26 -4
- package/dist/quota-registry.d.ts.map +1 -1
- package/dist/quota-registry.js +60 -76
- package/dist/quota-registry.js.map +1 -1
- package/dist/rpc-problem.d.ts +10 -0
- package/dist/rpc-problem.d.ts.map +1 -0
- package/dist/rpc-problem.js +22 -0
- package/dist/rpc-problem.js.map +1 -0
- package/dist/runless-turn-recovery.d.ts +30 -0
- package/dist/runless-turn-recovery.d.ts.map +1 -0
- package/dist/runless-turn-recovery.js +38 -0
- package/dist/runless-turn-recovery.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +12 -24
- package/dist/server.js.map +1 -1
- package/dist/terminal-authority.d.ts +1 -0
- package/dist/terminal-authority.d.ts.map +1 -1
- package/dist/thread-store-support.d.ts +13 -2
- package/dist/thread-store-support.d.ts.map +1 -1
- package/dist/thread-store-support.js +48 -3
- package/dist/thread-store-support.js.map +1 -1
- package/dist/thread-worktree-state.d.ts.map +1 -1
- package/dist/thread-worktree-state.js +5 -0
- package/dist/thread-worktree-state.js.map +1 -1
- package/dist/threads.d.ts +5 -1
- package/dist/threads.d.ts.map +1 -1
- package/dist/threads.js +18 -33
- package/dist/threads.js.map +1 -1
- package/package.json +6 -5
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Only failures of the local RPC transport carry this retryable 503 type.
|
|
2
|
+
* A lost answer does not establish whether a mutation was accepted. */
|
|
3
|
+
export declare class DaemonTransportError extends Error {
|
|
4
|
+
readonly status = 503;
|
|
5
|
+
readonly retryable = true;
|
|
6
|
+
readonly code: "daemon_busy" | "daemon_unavailable";
|
|
7
|
+
constructor(method: string, reason: "timeout" | "unavailable", cause?: unknown);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=client-errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-errors.d.ts","sourceRoot":"","sources":["../src/client-errors.ts"],"names":[],"mappings":"AAAA;uEACuE;AACvE,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,MAAM,OAAO;IACtB,QAAQ,CAAC,SAAS,QAAQ;IAC1B,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,oBAAoB,CAAC;IAEpD,YAAY,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,aAAa,EAAE,KAAK,CAAC,EAAE,OAAO,EAS7E;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Only failures of the local RPC transport carry this retryable 503 type.
|
|
2
|
+
* A lost answer does not establish whether a mutation was accepted. */
|
|
3
|
+
export class DaemonTransportError extends Error {
|
|
4
|
+
status = 503;
|
|
5
|
+
retryable = true;
|
|
6
|
+
code;
|
|
7
|
+
constructor(method, reason, cause) {
|
|
8
|
+
super(reason === "timeout"
|
|
9
|
+
? `daemon RPC timeout (${method})`
|
|
10
|
+
: `daemon RPC unavailable (${method})`, { cause });
|
|
11
|
+
this.name = "DaemonTransportError";
|
|
12
|
+
this.code = reason === "timeout" ? "daemon_busy" : "daemon_unavailable";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=client-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-errors.js","sourceRoot":"","sources":["../src/client-errors.ts"],"names":[],"mappings":"AAAA;uEACuE;AACvE,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACpC,MAAM,GAAG,GAAG,CAAC;IACb,SAAS,GAAG,IAAI,CAAC;IACjB,IAAI,CAAuC;IAEpD,YAAY,MAAc,EAAE,MAAiC,EAAE,KAAe;QAC5E,KAAK,CACH,MAAM,KAAK,SAAS;YAClB,CAAC,CAAC,uBAAuB,MAAM,GAAG;YAClC,CAAC,CAAC,2BAA2B,MAAM,GAAG,EACxC,EAAE,KAAK,EAAE,CACV,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAC1E,CAAC;CACF"}
|
package/dist/client.d.ts
CHANGED
|
@@ -58,11 +58,9 @@ export declare class DaemonClient {
|
|
|
58
58
|
startedAt?: string;
|
|
59
59
|
finishedAt?: string;
|
|
60
60
|
} | null>;
|
|
61
|
-
/**
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
* list, so a caller must still apply its own selection to the result. */
|
|
65
|
-
list(query?: CommandListQuery): Promise<{
|
|
61
|
+
/** Required addressed read; collection answers contain summary facts only. */
|
|
62
|
+
list(query: CommandListQuery): Promise<{
|
|
63
|
+
promptPreview?: string;
|
|
66
64
|
id: string;
|
|
67
65
|
state: string;
|
|
68
66
|
params?: unknown;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI5E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEzE,8DAA8D;AAC9D,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFxB,YACmB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EAC5B;IAEJ,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAkE9D;IAED,MAAM,qBAEL;IACD,OAAO,CACL,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE;QACP,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;KACf;YAEiB,MAAM;eAAS,MAAM;gBAAU,OAAO;OAO9D;IACD,MAAM,CAAC,EAAE,EAAE,MAAM;YAET,MAAM;eACH,MAAM;iBACJ,OAAO;gBACR,MAAM;iBACL,MAAM;iBACN,MAAM;iBACN,OAAO;gBACR,MAAM;oBACF,MAAM;sBACJ,MAAM;yBACH,OAAO;+BACD,MAAM,EAAE;uBAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oBAC1B,MAAM;oBACN,MAAM;qBACL,MAAM;OAEtB;IACD,YAAY,CACV,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE;QACP,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B;YAzBK,MAAM;eACH,MAAM;iBACJ,OAAO;gBACR,MAAM;iBACL,MAAM;iBACN,MAAM;iBACN,OAAO;gBACR,MAAM;oBACF,MAAM;sBACJ,MAAM;yBACH,OAAO;+BACD,MAAM,EAAE;uBAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oBAC1B,MAAM;oBACN,MAAM;qBACL,MAAM;cAmBtB;IACD,8EAA8E;IAC9E,IAAI,CAAC,KAAK,EAAE,gBAAgB;wBAGN,MAAM;YAClB,MAAM;eACH,MAAM;iBACJ,OAAO;gBACR,MAAM;iBACL,MAAM;iBACN,MAAM;gBACP,MAAM;oBACF,MAAM;sBACJ,MAAM;yBACH,OAAO;+BACD,MAAM,EAAE;uBAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oBAC1B,MAAM;oBACN,MAAM;qBACL,MAAM;SAGxB;IACD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,gBAAgB,oBAE/C;IACD,qBAAqB,CAAC,KAAK,EAAE,MAAM;eACP,MAAM;gBAAU,OAAO;OAClD;IACD,QAAQ,qBAEP;IACD,6BAA6B,CAAC,cAAc,EAAE,wBAAwB;YAC7C,IAAI;gBAAU,IAAI;qBAAe,IAAI;OAI7D;CACF"}
|
package/dist/client.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DaemonTransportError } from "./client-errors.js";
|
|
1
2
|
import { connect } from "node:net";
|
|
2
3
|
import { randomUUID } from "node:crypto";
|
|
3
4
|
import { createInterface } from "node:readline";
|
|
@@ -26,22 +27,26 @@ export class DaemonClient {
|
|
|
26
27
|
};
|
|
27
28
|
// A socket that accepts but never replies must not hang the caller
|
|
28
29
|
// (`daemon status`) forever — fail loudly after a bounded wait.
|
|
29
|
-
const timer = setTimeout(() => finish(() => reject(new
|
|
30
|
+
const timer = setTimeout(() => finish(() => reject(new DaemonTransportError(method, "timeout"))), 10_000);
|
|
30
31
|
timer.unref?.();
|
|
31
32
|
// Attach the error handler first so connect failures (ENOENT/ECONNREFUSED)
|
|
32
33
|
// never become an unhandled 'error' event.
|
|
33
|
-
sock.on("error", (err) => finish(() => reject(err)));
|
|
34
|
-
sock.on("close", () => finish(() => reject(new
|
|
34
|
+
sock.on("error", (err) => finish(() => reject(new DaemonTransportError(method, "unavailable", err))));
|
|
35
|
+
sock.on("close", () => finish(() => reject(new DaemonTransportError(method, "unavailable"))));
|
|
35
36
|
rl = createInterface({ input: sock });
|
|
36
|
-
rl.on("error", (err) => finish(() => reject(err))); // readline re-emits input 'error'
|
|
37
|
+
rl.on("error", (err) => finish(() => reject(new DaemonTransportError(method, "unavailable", err)))); // readline re-emits input 'error'
|
|
37
38
|
sock.on("connect", () => {
|
|
38
39
|
sock.write(JSON.stringify({ id, method, params, token: this.token }) + "\n");
|
|
39
40
|
});
|
|
40
41
|
rl.on("line", (line) => {
|
|
41
42
|
try {
|
|
42
43
|
const msg = JSON.parse(line);
|
|
43
|
-
if (msg
|
|
44
|
-
|
|
44
|
+
if (!msg ||
|
|
45
|
+
typeof msg !== "object" ||
|
|
46
|
+
msg.id !== id ||
|
|
47
|
+
(msg.error ? typeof msg.error.message !== "string" : !("result" in msg))) {
|
|
48
|
+
throw new Error("invalid daemon RPC response");
|
|
49
|
+
}
|
|
45
50
|
if (msg.error) {
|
|
46
51
|
const error = Object.assign(new Error(msg.error.message), {
|
|
47
52
|
...(typeof msg.error.code === "string" ? { code: msg.error.code } : {}),
|
|
@@ -49,14 +54,20 @@ export class DaemonClient {
|
|
|
49
54
|
...(typeof msg.error.retryable === "boolean"
|
|
50
55
|
? { retryable: msg.error.retryable }
|
|
51
56
|
: {}),
|
|
57
|
+
...(msg.error.context && typeof msg.error.context === "object"
|
|
58
|
+
? { context: msg.error.context }
|
|
59
|
+
: {}),
|
|
60
|
+
...(Array.isArray(msg.error.requiredActions)
|
|
61
|
+
? { requiredActions: msg.error.requiredActions }
|
|
62
|
+
: {}),
|
|
52
63
|
});
|
|
53
64
|
finish(() => reject(error));
|
|
54
65
|
}
|
|
55
66
|
else
|
|
56
67
|
finish(() => resolve(msg.result));
|
|
57
68
|
}
|
|
58
|
-
catch {
|
|
59
|
-
|
|
69
|
+
catch (error) {
|
|
70
|
+
finish(() => reject(new DaemonTransportError(method, "unavailable", error)));
|
|
60
71
|
}
|
|
61
72
|
});
|
|
62
73
|
});
|
|
@@ -85,12 +96,9 @@ export class DaemonClient {
|
|
|
85
96
|
idempotencyRequest: options.idempotencyRequest,
|
|
86
97
|
});
|
|
87
98
|
}
|
|
88
|
-
/**
|
|
89
|
-
* daemon selects before it projects. Omit it for the whole retained product
|
|
90
|
-
* list. An engine older than the query ignores it and answers with the full
|
|
91
|
-
* list, so a caller must still apply its own selection to the result. */
|
|
99
|
+
/** Required addressed read; collection answers contain summary facts only. */
|
|
92
100
|
list(query) {
|
|
93
|
-
return this.call("claudexor.list",
|
|
101
|
+
return this.call("claudexor.list", { query });
|
|
94
102
|
}
|
|
95
103
|
cancel(id, reasonCode) {
|
|
96
104
|
return this.call("claudexor.cancel", reasonCode ? { id, reason_code: reasonCode } : { id });
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { JobRecord } from "./job-record.js";
|
|
2
|
+
/** In-process project-removal/retention facts. No self-RPC, prompt copy or
|
|
3
|
+
* public redaction; include the global AND every healthy project partition.
|
|
4
|
+
* Project removal reads `scope`; the retention trash fence reads `threadId`. */
|
|
5
|
+
export declare function commandActivityRecords(records: readonly JobRecord[]): {
|
|
6
|
+
runId: string | undefined;
|
|
7
|
+
state: "cancelled" | "failed" | "interrupted" | "queued" | "running" | "succeeded";
|
|
8
|
+
finishedAt: string | undefined;
|
|
9
|
+
params: {
|
|
10
|
+
scope: unknown;
|
|
11
|
+
threadId: unknown;
|
|
12
|
+
};
|
|
13
|
+
}[];
|
|
14
|
+
//# sourceMappingURL=command-activity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-activity.d.ts","sourceRoot":"","sources":["../src/command-activity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;gFAEgF;AAChF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE;;;;;QAOpD,KAAK;QAAiB,QAAQ;;IAG7C"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { productCommandRecords } from "./command-retention.js";
|
|
2
|
+
/** In-process project-removal/retention facts. No self-RPC, prompt copy or
|
|
3
|
+
* public redaction; include the global AND every healthy project partition.
|
|
4
|
+
* Project removal reads `scope`; the retention trash fence reads `threadId`. */
|
|
5
|
+
export function commandActivityRecords(records) {
|
|
6
|
+
return productCommandRecords(records).map((record) => {
|
|
7
|
+
const params = record.params;
|
|
8
|
+
return {
|
|
9
|
+
runId: record.runId,
|
|
10
|
+
state: record.state,
|
|
11
|
+
finishedAt: record.finishedAt,
|
|
12
|
+
params: { scope: params?.scope, threadId: params?.threadId },
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=command-activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-activity.js","sourceRoot":"","sources":["../src/command-activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAG/D;;gFAEgF;AAChF,MAAM,UAAU,sBAAsB,CAAC,OAA6B;IAClE,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAwD,CAAC;QAC/E,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE;SAC7D,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type JobRecord } from "./job-record.js";
|
|
2
|
+
/** Collections carry only the request facts their consumers use, never full
|
|
3
|
+
* params/results. Keep the historical redacted 240-character HTTP preview. */
|
|
4
|
+
export declare function compactCommandRecord(record: JobRecord): JobRecord & {
|
|
5
|
+
promptPreview?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function publicCommandList(records: readonly JobRecord[], rawQuery: unknown): JobRecord[];
|
|
8
|
+
//# sourceMappingURL=command-list-projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-list-projection.d.ts","sourceRoot":"","sources":["../src/command-list-projection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIlE;8EAC8E;AAC9E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,CA8B9F;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,GAAG,SAAS,EAAE,CAK/F"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { COMMAND_SUMMARY_PARAM_KEYS } from "@claudexor/schema";
|
|
2
|
+
import { redactSecrets } from "@claudexor/util";
|
|
3
|
+
import { publicJobRecord } from "./job-record.js";
|
|
4
|
+
import { selectProductCommands } from "./command-retention.js";
|
|
5
|
+
import { parseCommandListQuery } from "./command-list-select.js";
|
|
6
|
+
/** Collections carry only the request facts their consumers use, never full
|
|
7
|
+
* params/results. Keep the historical redacted 240-character HTTP preview. */
|
|
8
|
+
export function compactCommandRecord(record) {
|
|
9
|
+
const source = record.params && typeof record.params === "object"
|
|
10
|
+
? record.params
|
|
11
|
+
: {};
|
|
12
|
+
const params = {};
|
|
13
|
+
for (const key of COMMAND_SUMMARY_PARAM_KEYS) {
|
|
14
|
+
if (source[key] !== undefined)
|
|
15
|
+
params[key] = source[key];
|
|
16
|
+
}
|
|
17
|
+
const prompt = typeof source.prompt === "string" ? redactSecrets(source.prompt) : undefined;
|
|
18
|
+
return publicJobRecord({
|
|
19
|
+
id: record.id,
|
|
20
|
+
state: record.state,
|
|
21
|
+
createdAt: record.createdAt,
|
|
22
|
+
runId: record.runId,
|
|
23
|
+
taskId: record.taskId,
|
|
24
|
+
runDir: record.runDir,
|
|
25
|
+
startedAt: record.startedAt,
|
|
26
|
+
finishedAt: record.finishedAt,
|
|
27
|
+
error: record.error,
|
|
28
|
+
errorCode: record.errorCode,
|
|
29
|
+
errorStatus: record.errorStatus,
|
|
30
|
+
errorRetryable: record.errorRetryable,
|
|
31
|
+
errorRequiredActions: record.errorRequiredActions,
|
|
32
|
+
errorContext: record.errorContext,
|
|
33
|
+
params,
|
|
34
|
+
...(prompt === undefined
|
|
35
|
+
? {}
|
|
36
|
+
: { promptPreview: prompt.length > 240 ? `${prompt.slice(0, 240)}...` : prompt }),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
export function publicCommandList(records, rawQuery) {
|
|
40
|
+
const query = parseCommandListQuery(rawQuery);
|
|
41
|
+
return selectProductCommands(records, query).map("id" in query || "turnId" in query ? publicJobRecord : compactCommandRecord);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=command-list-projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-list-projection.js","sourceRoot":"","sources":["../src/command-list-projection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAA6B,MAAM,mBAAmB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAkB,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE;8EAC8E;AAC9E,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,MAAM,GACV,MAAM,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;QAChD,CAAC,CAAE,MAAM,CAAC,MAAkC;QAC5C,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,0BAA0B,EAAE,CAAC;QAC7C,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS;YAAG,MAAkC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACxF,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5F,OAAO,eAAe,CAAC;QACrB,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;QACjD,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,MAAM;QACN,GAAG,CAAC,MAAM,KAAK,SAAS;YACtB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KACpF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAA6B,EAAE,QAAiB;IAChF,MAAM,KAAK,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAC9C,OAAO,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,GAAG,CAC9C,IAAI,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,oBAAoB,CAC5E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CommandListQuery } from "@claudexor/schema";
|
|
2
|
+
import type { JobRecord } from "./job-record.js";
|
|
3
|
+
/** Parse at the RPC boundary before scanning anything, including empty history. */
|
|
4
|
+
export declare function parseCommandListQuery(query: unknown): CommandListQuery;
|
|
5
|
+
/** Select BEFORE redaction/copy/serialization. O(N) shallow reference scans
|
|
6
|
+
* are intentional; no unrelated prompt or result body is visited. */
|
|
7
|
+
export declare function selectCommandRecords(records: readonly JobRecord[], query: CommandListQuery): JobRecord[];
|
|
8
|
+
//# sourceMappingURL=command-list-select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-list-select.d.ts","sourceRoot":"","sources":["../src/command-list-select.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAKjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAQtE;AAmFD;qEACqE;AACrE,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,SAAS,SAAS,EAAE,EAC7B,KAAK,EAAE,gBAAgB,GACtB,SAAS,EAAE,CAiCb"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { CommandListQuery, continuedRunOf, delegatedParentOf, directDelegatedChildrenFromRecords, selectRunListPage, } from "@claudexor/schema";
|
|
2
|
+
/** Parse at the RPC boundary before scanning anything, including empty history. */
|
|
3
|
+
export function parseCommandListQuery(query) {
|
|
4
|
+
const parsed = CommandListQuery.safeParse(query);
|
|
5
|
+
if (parsed.success)
|
|
6
|
+
return parsed.data;
|
|
7
|
+
throw Object.assign(new Error("a command list query must name an addressed selector"), {
|
|
8
|
+
code: query == null ? "list_query_required" : "invalid_command_list_query",
|
|
9
|
+
status: 400,
|
|
10
|
+
retryable: false,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function param(record, key) {
|
|
14
|
+
return record.params && typeof record.params === "object"
|
|
15
|
+
? record.params[key]
|
|
16
|
+
: undefined;
|
|
17
|
+
}
|
|
18
|
+
/** Reference-only graph scan. Preserve original record order for admission's
|
|
19
|
+
* first-successor rule, including old aliases, rejected successors and cycles. */
|
|
20
|
+
function continuationChain(records, from) {
|
|
21
|
+
const predecessor = records.find((record) => record.id === from || record.runId === from);
|
|
22
|
+
if (!predecessor)
|
|
23
|
+
return [];
|
|
24
|
+
const children = new Map();
|
|
25
|
+
for (const record of records) {
|
|
26
|
+
const parent = continuedRunOf(record.params);
|
|
27
|
+
if (parent === null)
|
|
28
|
+
continue;
|
|
29
|
+
const siblings = children.get(parent) ?? [];
|
|
30
|
+
siblings.push(record);
|
|
31
|
+
children.set(parent, siblings);
|
|
32
|
+
}
|
|
33
|
+
const selected = new Set([predecessor]);
|
|
34
|
+
const pending = [predecessor];
|
|
35
|
+
for (let i = 0; i < pending.length; i++) {
|
|
36
|
+
const record = pending[i];
|
|
37
|
+
for (const id of [record.id, ...(record.runId ? [record.runId] : [])]) {
|
|
38
|
+
for (const child of children.get(id) ?? []) {
|
|
39
|
+
if (selected.has(child))
|
|
40
|
+
continue;
|
|
41
|
+
selected.add(child);
|
|
42
|
+
pending.push(child);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return records.filter((record) => selected.has(record));
|
|
47
|
+
}
|
|
48
|
+
/** Transitive Delegate cancellation remains uncapped and cycle-safe. */
|
|
49
|
+
function delegatedDescendants(records, from) {
|
|
50
|
+
const children = new Map();
|
|
51
|
+
for (const record of records) {
|
|
52
|
+
const parent = delegatedParentOf(record.params);
|
|
53
|
+
if (parent === null)
|
|
54
|
+
continue;
|
|
55
|
+
const siblings = children.get(parent) ?? [];
|
|
56
|
+
siblings.push(record);
|
|
57
|
+
children.set(parent, siblings);
|
|
58
|
+
}
|
|
59
|
+
const out = [];
|
|
60
|
+
const seen = new Set([from]);
|
|
61
|
+
const queue = [from];
|
|
62
|
+
for (let i = 0; i < queue.length; i++) {
|
|
63
|
+
for (const child of children.get(queue[i]) ?? []) {
|
|
64
|
+
const id = child.runId ?? child.id;
|
|
65
|
+
if (seen.has(id))
|
|
66
|
+
continue;
|
|
67
|
+
seen.add(id);
|
|
68
|
+
out.push(child);
|
|
69
|
+
queue.push(id);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
/** Turn cards also disclose direct Delegate children, whose commands need not
|
|
75
|
+
* carry their parent's threadId. Select those references without widening the
|
|
76
|
+
* read to unrelated history. Active-only fences need only the thread members. */
|
|
77
|
+
function threadRecords(records, ids, activeOnly = false) {
|
|
78
|
+
const members = records.filter((r) => {
|
|
79
|
+
const threadId = param(r, "threadId");
|
|
80
|
+
return (typeof threadId === "string" &&
|
|
81
|
+
ids.has(threadId) &&
|
|
82
|
+
(!activeOnly || r.state === "queued" || r.state === "running"));
|
|
83
|
+
});
|
|
84
|
+
if (activeOnly)
|
|
85
|
+
return members;
|
|
86
|
+
const memberSet = new Set(members);
|
|
87
|
+
const parents = new Set(members.map((r) => r.runId ?? r.id));
|
|
88
|
+
return records.filter((r) => memberSet.has(r) || parents.has(delegatedParentOf(r.params) ?? ""));
|
|
89
|
+
}
|
|
90
|
+
/** Select BEFORE redaction/copy/serialization. O(N) shallow reference scans
|
|
91
|
+
* are intentional; no unrelated prompt or result body is visited. */
|
|
92
|
+
export function selectCommandRecords(records, query) {
|
|
93
|
+
if ("id" in query) {
|
|
94
|
+
const record = records.find((r) => r.id === query.id || r.runId === query.id);
|
|
95
|
+
return record ? [record] : [];
|
|
96
|
+
}
|
|
97
|
+
if ("turnId" in query) {
|
|
98
|
+
const last = records
|
|
99
|
+
.filter((r) => param(r, "turnId") === query.turnId)
|
|
100
|
+
.sort((a, b) => String(a.createdAt ?? "").localeCompare(String(b.createdAt ?? "")))
|
|
101
|
+
.at(-1);
|
|
102
|
+
return last ? [last] : [];
|
|
103
|
+
}
|
|
104
|
+
if ("ids" in query) {
|
|
105
|
+
const ids = new Set(query.ids);
|
|
106
|
+
return records.filter((r) => ids.has(r.id) || (!!r.runId && ids.has(r.runId)));
|
|
107
|
+
}
|
|
108
|
+
if ("delegatedFromRunId" in query)
|
|
109
|
+
return directDelegatedChildrenFromRecords(query.delegatedFromRunId, records);
|
|
110
|
+
if ("continuationChainOf" in query)
|
|
111
|
+
return continuationChain(records, query.continuationChainOf);
|
|
112
|
+
if ("delegatedDescendantsOf" in query)
|
|
113
|
+
return delegatedDescendants(records, query.delegatedDescendantsOf);
|
|
114
|
+
if ("page" in query)
|
|
115
|
+
return selectRunListPage(records, { ...query.page, limit: query.page.limit + 1 }).page;
|
|
116
|
+
if ("threadIds" in query) {
|
|
117
|
+
const ids = new Set(query.threadIds);
|
|
118
|
+
return threadRecords(records, ids);
|
|
119
|
+
}
|
|
120
|
+
const active = query.activeOnly
|
|
121
|
+
? records.filter((r) => r.state === "queued" || r.state === "running")
|
|
122
|
+
: records;
|
|
123
|
+
return "threadId" in query
|
|
124
|
+
? threadRecords(records, new Set([query.threadId]), query.activeOnly)
|
|
125
|
+
: [...active];
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=command-list-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-list-select.js","sourceRoot":"","sources":["../src/command-list-select.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +1,12 @@
|
|
|
1
1
|
import type { JobRecord } from "./server.js";
|
|
2
2
|
export declare function productCommandRecords(records: readonly JobRecord[]): JobRecord[];
|
|
3
|
-
/**
|
|
4
|
-
|
|
5
|
-
* projection runs.
|
|
6
|
-
*
|
|
7
|
-
* `publicJobRecord` recursively walks and redacts a record's params, so a
|
|
8
|
-
* caller that wants ONE run (or one parent's direct children) must not pay for
|
|
9
|
-
* every retained prompt in the partition: selection here is a reference and
|
|
10
|
-
* metadata scan (`id`/`runId` equality, one shallow `delegatedFromRunId` read,
|
|
11
|
-
* an O(M log M) sort over the matching children only), and the unselected
|
|
12
|
-
* records are never traversed or serialized at all. An unqualified query keeps
|
|
13
|
-
* the historical whole-list answer.
|
|
14
|
-
*
|
|
15
|
-
* An addressed miss is an EMPTY selection. The caller owns the distinction
|
|
16
|
-
* between "this run is not retained" and "the daemon could not answer": a
|
|
17
|
-
* transport failure throws and must never be read as an empty list.
|
|
18
|
-
*/
|
|
19
|
-
export declare function selectProductCommands(records: readonly JobRecord[], query?: unknown): JobRecord[];
|
|
3
|
+
/** Addressed selection is shared by socket reads and in-process consumers. */
|
|
4
|
+
export declare function selectProductCommands(records: readonly JobRecord[], query: unknown): JobRecord[];
|
|
20
5
|
/** Cap on the serialized `params` bytes retained across terminal product
|
|
21
6
|
* commands (journal sprint owner decision D3, release 1). Prompts stay inline
|
|
22
7
|
* in the command journal, so once their sum passes this bound the OLDEST
|
|
23
8
|
* terminal product commands are pruned regardless of age; the 500/30-day rule
|
|
24
|
-
* is unchanged. Model-operation receipts
|
|
9
|
+
* is unchanged. Model-operation receipts, needs-decision and continuation references are exempt;
|
|
25
10
|
* delivery commands (`delivery-*`, which carry a copy of the applied run's
|
|
26
11
|
* params) keep their own age/cap policy and neither count nor get pruned here. */
|
|
27
12
|
export declare const MAX_RETAINED_COMMAND_PARAMS_BYTES: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-retention.d.ts","sourceRoot":"","sources":["../src/command-retention.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"command-retention.d.ts","sourceRoot":"","sources":["../src/command-retention.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,EAAE,CAEhF;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,EAAE,CAGhG;AAwCD;;;;;;kFAMkF;AAClF,eAAO,MAAM,iCAAiC,QAAoB,CAAC;AAEnE;;;gFAGgF;AAChF,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,SAAS,SAAS,EAAE,EAC7B,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,cAAc,SAAoC,GACjD,MAAM,EAAE,CA4CV"}
|
|
@@ -1,44 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { parseCommandListQuery, selectCommandRecords } from "./command-list-select.js";
|
|
2
|
+
import { retainedEnvelopeOfRun } from "@claudexor/workspace";
|
|
3
|
+
import { continuedRunOf, isModelOperation } from "@claudexor/schema";
|
|
2
4
|
export function productCommandRecords(records) {
|
|
3
5
|
return records.filter((record) => !isDeliveryCommand(record) && !isModelOperation(record.params));
|
|
4
6
|
}
|
|
5
|
-
/**
|
|
6
|
-
* The retained product commands a caller ADDRESSED, chosen before any public
|
|
7
|
-
* projection runs.
|
|
8
|
-
*
|
|
9
|
-
* `publicJobRecord` recursively walks and redacts a record's params, so a
|
|
10
|
-
* caller that wants ONE run (or one parent's direct children) must not pay for
|
|
11
|
-
* every retained prompt in the partition: selection here is a reference and
|
|
12
|
-
* metadata scan (`id`/`runId` equality, one shallow `delegatedFromRunId` read,
|
|
13
|
-
* an O(M log M) sort over the matching children only), and the unselected
|
|
14
|
-
* records are never traversed or serialized at all. An unqualified query keeps
|
|
15
|
-
* the historical whole-list answer.
|
|
16
|
-
*
|
|
17
|
-
* An addressed miss is an EMPTY selection. The caller owns the distinction
|
|
18
|
-
* between "this run is not retained" and "the daemon could not answer": a
|
|
19
|
-
* transport failure throws and must never be read as an empty list.
|
|
20
|
-
*/
|
|
7
|
+
/** Addressed selection is shared by socket reads and in-process consumers. */
|
|
21
8
|
export function selectProductCommands(records, query) {
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
if (id !== undefined) {
|
|
25
|
-
const addressed = product.find((record) => record.id === id || record.runId === id);
|
|
26
|
-
return addressed ? [addressed] : [];
|
|
27
|
-
}
|
|
28
|
-
if (delegatedFromRunId !== undefined) {
|
|
29
|
-
return directDelegatedChildrenFromRecords(delegatedFromRunId, product);
|
|
30
|
-
}
|
|
31
|
-
return product;
|
|
32
|
-
}
|
|
33
|
-
/** Wire boundary for the addressed read: an unusable query fails loudly rather
|
|
34
|
-
* than degrading into a silent full scan the caller did not ask for. */
|
|
35
|
-
function parseCommandListQuery(query) {
|
|
36
|
-
if (query === undefined || query === null)
|
|
37
|
-
return {};
|
|
38
|
-
const parsed = CommandListQuery.safeParse(query);
|
|
39
|
-
if (parsed.success)
|
|
40
|
-
return parsed.data;
|
|
41
|
-
throw Object.assign(new Error("a command list query addresses either one id or one Delegate parent"), { code: "invalid_command_list_query", status: 400 });
|
|
9
|
+
const addressed = parseCommandListQuery(query);
|
|
10
|
+
return selectCommandRecords(productCommandRecords(records), addressed);
|
|
42
11
|
}
|
|
43
12
|
/** Delivery commands persist the full run params of the apply they serve;
|
|
44
13
|
* they keep their existing age/cap retention and are outside the byte budget. */
|
|
@@ -57,11 +26,24 @@ function isNeedsDecision(record) {
|
|
|
57
26
|
return false;
|
|
58
27
|
return facts.review === "blocked" || facts.checks === "failed";
|
|
59
28
|
}
|
|
29
|
+
/** Pure exemptions: keep custody addressable and claims while their predecessor is retained.
|
|
30
|
+
* The input is the current kept set; if a predecessor is removed in this pass,
|
|
31
|
+
* its successor becomes eligible on the next pass. No lifetime is invented. */
|
|
32
|
+
function continuationExemptions(records) {
|
|
33
|
+
const identities = new Set(records.flatMap((record) => [record.id, ...(record.runId ? [record.runId] : [])]));
|
|
34
|
+
return new Set(records
|
|
35
|
+
.filter((record) => {
|
|
36
|
+
const predecessor = continuedRunOf(record.params);
|
|
37
|
+
return ((predecessor !== null && identities.has(predecessor)) ||
|
|
38
|
+
!!(record.runDir && record.runId && retainedEnvelopeOfRun(record.runDir, record.runId)));
|
|
39
|
+
})
|
|
40
|
+
.map((record) => record.id));
|
|
41
|
+
}
|
|
60
42
|
/** Cap on the serialized `params` bytes retained across terminal product
|
|
61
43
|
* commands (journal sprint owner decision D3, release 1). Prompts stay inline
|
|
62
44
|
* in the command journal, so once their sum passes this bound the OLDEST
|
|
63
45
|
* terminal product commands are pruned regardless of age; the 500/30-day rule
|
|
64
|
-
* is unchanged. Model-operation receipts
|
|
46
|
+
* is unchanged. Model-operation receipts, needs-decision and continuation references are exempt;
|
|
65
47
|
* delivery commands (`delivery-*`, which carry a copy of the applied run's
|
|
66
48
|
* params) keep their own age/cap policy and neither count nor get pruned here. */
|
|
67
49
|
export const MAX_RETAINED_COMMAND_PARAMS_BYTES = 256 * 1024 * 1024;
|
|
@@ -77,10 +59,12 @@ export function prunableCommandIds(records, cap, retentionMs, now, maxParamsByte
|
|
|
77
59
|
.filter((record) => !isModelOperation(record.params) && !["running", "queued"].includes(record.state))
|
|
78
60
|
.sort((a, b) => (a.createdAt < b.createdAt ? -1 : 1));
|
|
79
61
|
const pruned = new Set();
|
|
62
|
+
const continuation = continuationExemptions(records);
|
|
63
|
+
const exempt = (record) => isNeedsDecision(record) || continuation.has(record.id);
|
|
80
64
|
if (terminal.length > cap) {
|
|
81
65
|
for (const record of terminal
|
|
82
66
|
.filter((record) => {
|
|
83
|
-
if (
|
|
67
|
+
if (exempt(record))
|
|
84
68
|
return false;
|
|
85
69
|
const settledAt = Date.parse(record.finishedAt ?? "");
|
|
86
70
|
return Number.isFinite(settledAt) && now - settledAt >= retentionMs;
|
|
@@ -97,7 +81,7 @@ export function prunableCommandIds(records, cap, retentionMs, now, maxParamsByte
|
|
|
97
81
|
let bytes = 0;
|
|
98
82
|
const sizes = new Map();
|
|
99
83
|
for (const record of terminal) {
|
|
100
|
-
if (pruned.has(record.id) ||
|
|
84
|
+
if (pruned.has(record.id) || exempt(record) || isDeliveryCommand(record))
|
|
101
85
|
continue;
|
|
102
86
|
const size = paramsBytes(record);
|
|
103
87
|
sizes.set(record.id, size);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-retention.js","sourceRoot":"","sources":["../src/command-retention.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"command-retention.js","sourceRoot":"","sources":["../src/command-retention.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,4 +4,10 @@
|
|
|
4
4
|
export declare function commandScopeRoots(records: Iterable<{
|
|
5
5
|
params?: unknown;
|
|
6
6
|
} | undefined>): string[];
|
|
7
|
+
/** Caller-owned execution roots a delegated command recorded. Crash GC reaches
|
|
8
|
+
* only Claudexor's own runtime scratch under them (envelopes), never the
|
|
9
|
+
* caller's tree or its Git refs. */
|
|
10
|
+
export declare function commandExecutionRoots(records: Iterable<{
|
|
11
|
+
params?: unknown;
|
|
12
|
+
} | undefined>): string[];
|
|
7
13
|
//# sourceMappingURL=command-scope-roots.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-scope-roots.d.ts","sourceRoot":"","sources":["../src/command-scope-roots.ts"],"names":[],"mappings":"AAAA;;2DAE2D;AAC3D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC,GAAG,MAAM,EAAE,CAQ/F"}
|
|
1
|
+
{"version":3,"file":"command-scope-roots.d.ts","sourceRoot":"","sources":["../src/command-scope-roots.ts"],"names":[],"mappings":"AAAA;;2DAE2D;AAC3D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC,GAAG,MAAM,EAAE,CAQ/F;AAED;;oCAEoC;AACpC,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,QAAQ,CAAC;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC,GAClD,MAAM,EAAE,CAQV"}
|