@claudexor/daemon 1.0.1 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +29 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +24 -4
- package/dist/client.js.map +1 -1
- package/dist/command-authority.d.ts +11 -0
- package/dist/command-authority.d.ts.map +1 -0
- package/dist/command-authority.js +15 -0
- package/dist/command-authority.js.map +1 -0
- package/dist/command-retention.d.ts +5 -0
- package/dist/command-retention.d.ts.map +1 -0
- package/dist/command-retention.js +18 -0
- package/dist/command-retention.js.map +1 -0
- package/dist/command-store.d.ts +41 -0
- package/dist/command-store.d.ts.map +1 -0
- package/dist/command-store.js +197 -0
- package/dist/command-store.js.map +1 -0
- package/dist/events.d.ts +2 -3
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +2 -3
- package/dist/events.js.map +1 -1
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/interactions.d.ts +32 -22
- package/dist/interactions.d.ts.map +1 -1
- package/dist/interactions.js +183 -56
- package/dist/interactions.js.map +1 -1
- package/dist/journal-events.d.ts +4 -0
- package/dist/journal-events.d.ts.map +1 -0
- package/dist/journal-events.js +23 -0
- package/dist/journal-events.js.map +1 -0
- package/dist/journal-manager.d.ts +72 -0
- package/dist/journal-manager.d.ts.map +1 -0
- package/dist/journal-manager.js +463 -0
- package/dist/journal-manager.js.map +1 -0
- package/dist/journal-projection.d.ts +11 -0
- package/dist/journal-projection.d.ts.map +1 -0
- package/dist/journal-projection.js +2 -0
- package/dist/journal-projection.js.map +1 -0
- package/dist/journal-recovery-files.d.ts +27 -0
- package/dist/journal-recovery-files.d.ts.map +1 -0
- package/dist/journal-recovery-files.js +209 -0
- package/dist/journal-recovery-files.js.map +1 -0
- package/dist/operator-decisions.d.ts +30 -0
- package/dist/operator-decisions.d.ts.map +1 -0
- package/dist/operator-decisions.js +137 -0
- package/dist/operator-decisions.js.map +1 -0
- package/dist/project-partitions.d.ts +167 -0
- package/dist/project-partitions.d.ts.map +1 -0
- package/dist/project-partitions.js +365 -0
- package/dist/project-partitions.js.map +1 -0
- package/dist/projects.d.ts +29 -0
- package/dist/projects.d.ts.map +1 -0
- package/dist/projects.js +180 -0
- package/dist/projects.js.map +1 -0
- package/dist/quota-registry.d.ts +75 -0
- package/dist/quota-registry.d.ts.map +1 -0
- package/dist/quota-registry.js +208 -0
- package/dist/quota-registry.js.map +1 -0
- package/dist/resource-store.d.ts +22 -0
- package/dist/resource-store.d.ts.map +1 -0
- package/dist/resource-store.js +272 -0
- package/dist/resource-store.js.map +1 -0
- package/dist/run-events.d.ts +15 -0
- package/dist/run-events.d.ts.map +1 -0
- package/dist/run-events.js +29 -0
- package/dist/run-events.js.map +1 -0
- package/dist/server.d.ts +33 -33
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +231 -238
- package/dist/server.js.map +1 -1
- package/dist/spec-sessions.d.ts +72 -0
- package/dist/spec-sessions.d.ts.map +1 -0
- package/dist/spec-sessions.js +301 -0
- package/dist/spec-sessions.js.map +1 -0
- package/dist/terminate.d.ts +52 -0
- package/dist/terminate.d.ts.map +1 -0
- package/dist/terminate.js +111 -0
- package/dist/terminate.js.map +1 -0
- package/dist/thread-head-ping.d.ts +35 -0
- package/dist/thread-head-ping.d.ts.map +1 -0
- package/dist/thread-head-ping.js +67 -0
- package/dist/thread-head-ping.js.map +1 -0
- package/dist/thread-lifecycle.d.ts +5 -0
- package/dist/thread-lifecycle.d.ts.map +1 -0
- package/dist/thread-lifecycle.js +57 -0
- package/dist/thread-lifecycle.js.map +1 -0
- package/dist/thread-store-support.d.ts +37 -0
- package/dist/thread-store-support.d.ts.map +1 -0
- package/dist/thread-store-support.js +94 -0
- package/dist/thread-store-support.js.map +1 -0
- package/dist/threads.d.ts +59 -13
- package/dist/threads.d.ts.map +1 -1
- package/dist/threads.js +254 -141
- package/dist/threads.js.map +1 -1
- package/dist/token.d.ts +13 -4
- package/dist/token.d.ts.map +1 -1
- package/dist/token.js +134 -29
- package/dist/token.js.map +1 -1
- package/dist/writer-lease.d.ts +21 -0
- package/dist/writer-lease.d.ts.map +1 -0
- package/dist/writer-lease.js +94 -0
- package/dist/writer-lease.js.map +1 -0
- package/package.json +5 -4
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { RunEvent } from "@claudexor/schema";
|
|
2
|
+
const RECORDED = "run.event";
|
|
3
|
+
/** Writes typed run events into their owning global/project journal partition. */
|
|
4
|
+
export class RunEventStore {
|
|
5
|
+
journal;
|
|
6
|
+
constructor(journal) {
|
|
7
|
+
this.journal = journal;
|
|
8
|
+
this.validateProjection();
|
|
9
|
+
}
|
|
10
|
+
record(value) {
|
|
11
|
+
const event = RunEvent.parse(value);
|
|
12
|
+
this.journal.append(RECORDED, event);
|
|
13
|
+
return event;
|
|
14
|
+
}
|
|
15
|
+
validateProjection() {
|
|
16
|
+
for (const entry of this.journal.records()) {
|
|
17
|
+
if (entry.type === RECORDED)
|
|
18
|
+
RunEvent.parse(entry.payload);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function runEventProjection() {
|
|
23
|
+
return {
|
|
24
|
+
name: "run-events",
|
|
25
|
+
create: (journal) => new RunEventStore(journal),
|
|
26
|
+
validate: (store) => store.validateProjection(),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=run-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-events.js","sourceRoot":"","sources":["../src/run-events.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAkC,MAAM,mBAAmB,CAAC;AAE7E,MAAM,QAAQ,GAAG,WAAW,CAAC;AAE7B,kFAAkF;AAClF,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;QAClD,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,KAAoB;QACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kBAAkB;QAChB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,CAAC,OAAuB,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC;QAC/D,QAAQ,EAAE,CAAC,KAAoB,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB,EAAE;KAC/D,CAAC;AACJ,CAAC"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import { type CommandAuthority } from "./command-authority.js";
|
|
2
2
|
export interface RunContext {
|
|
3
3
|
signal: AbortSignal;
|
|
4
|
-
/** Called by the runner once the run id/dir are known (lets a client tail events.jsonl). */
|
|
5
4
|
onRunStart: (info: {
|
|
6
5
|
runId: string;
|
|
7
6
|
taskId: string;
|
|
@@ -13,24 +12,28 @@ export interface DaemonOptions {
|
|
|
13
12
|
socketPath: string;
|
|
14
13
|
token: string;
|
|
15
14
|
runner: RunnerFn;
|
|
16
|
-
/** Max concurrently-running jobs (parallel projects/runs). Default 4. */
|
|
17
15
|
maxConcurrent?: number;
|
|
18
|
-
|
|
19
|
-
persistPath?: string;
|
|
20
|
-
/** Max retained terminal jobs (older ones are pruned to bound memory/disk). Default 500. */
|
|
16
|
+
commands: CommandAuthority;
|
|
21
17
|
maxHistory?: number;
|
|
18
|
+
idempotencyRetentionMs?: number;
|
|
19
|
+
now?: () => Date;
|
|
22
20
|
/** Called when a job reaches a terminal state (any path) with its runId —
|
|
23
21
|
* used to drop pending interactions so a dead run never advertises
|
|
24
22
|
* waiting_on_user. */
|
|
25
|
-
onRunTerminal?: (runId: string) => void;
|
|
23
|
+
onRunTerminal?: (runId: string, threadId?: string) => void;
|
|
26
24
|
/** Called when a job that carried a pre-created thread turn (params.turnId)
|
|
27
25
|
* settles failure-shaped WITHOUT ever binding a run — i.e. the refusal
|
|
28
26
|
* happened before the run materialized (trust gate, preflight validation).
|
|
29
27
|
* The observer persists the reason on the turn so it is never a silent
|
|
30
28
|
* orphan bubble. `code` is the typed throw's machine code (null if none). */
|
|
31
29
|
onTurnEnqueueFailed?: (turnId: string, error: string, code: string | null) => void;
|
|
30
|
+
/** Composition-root shutdown hook. When present, RPC shutdown must drain
|
|
31
|
+
* every daemon-owned subsystem, not only this socket queue. */
|
|
32
|
+
onShutdownRequested?: () => Promise<void>;
|
|
33
|
+
/** Test-only barriers around command authority acquisition. */
|
|
34
|
+
startupBarrier?: (barrier: "before_registry_load" | "after_registry_load") => void | Promise<void>;
|
|
32
35
|
}
|
|
33
|
-
export declare const JOB_STATES: readonly ["queued", "running", "blocked", "succeeded", "no_op", "ungated", "review_not_run", "failed", "cancelled", "
|
|
36
|
+
export declare const JOB_STATES: readonly ["queued", "running", "blocked", "succeeded", "no_op", "ungated", "review_not_run", "failed", "cancelled", "interrupted_unknown", "cost_unverifiable", "exhausted_overshoot", "exhausted", "not_converged", "stuck_no_progress"];
|
|
34
37
|
export type JobState = (typeof JOB_STATES)[number];
|
|
35
38
|
export interface JobRecord {
|
|
36
39
|
id: string;
|
|
@@ -42,33 +45,41 @@ export interface JobRecord {
|
|
|
42
45
|
* trust_full_access_required) — lets surfaces key remedies on the CODE,
|
|
43
46
|
* never on substring-matching the human message. */
|
|
44
47
|
errorCode?: string;
|
|
48
|
+
/** HTTP status carried by a typed throw (400-599). Refusal semantics are
|
|
49
|
+
* born AT THE THROW (trust=403, requirements=400, journal recovery=503) —
|
|
50
|
+
* a bare errno-style `code` without a status is an infra failure and must
|
|
51
|
+
* not masquerade as a client-actionable 4xx. */
|
|
52
|
+
errorStatus?: number;
|
|
45
53
|
createdAt: string;
|
|
46
|
-
/** Surfaced as soon as the run starts so a client can tail
|
|
54
|
+
/** Surfaced as soon as the run starts so a client can tail the external run's events.jsonl. */
|
|
47
55
|
runId?: string;
|
|
48
56
|
taskId?: string;
|
|
49
57
|
runDir?: string;
|
|
50
58
|
startedAt?: string;
|
|
51
59
|
finishedAt?: string;
|
|
52
60
|
}
|
|
53
|
-
/**
|
|
54
|
-
* Local daemon: Unix-socket JSON-RPC with token auth + a bounded-concurrency
|
|
55
|
-
* worker pool (up to maxConcurrent jobs in parallel) backed by an optional
|
|
56
|
-
* durable, atomically-written job registry. It does NOT contain a second
|
|
57
|
-
* scheduler — it calls the injected runner (the same Orchestrator the CLI uses).
|
|
58
|
-
*/
|
|
61
|
+
/** Unix-socket worker pool; scheduling stays in the injected Orchestrator. */
|
|
59
62
|
export declare class DaemonServer {
|
|
60
63
|
private readonly opts;
|
|
61
64
|
private server?;
|
|
65
|
+
private readonly sockets;
|
|
62
66
|
private readonly queue;
|
|
63
|
-
private readonly records;
|
|
64
67
|
private readonly cancelled;
|
|
65
68
|
private readonly controllers;
|
|
69
|
+
private readonly activeTasks;
|
|
70
|
+
private readonly taskFailures;
|
|
66
71
|
private active;
|
|
67
72
|
private readonly startedAt;
|
|
68
|
-
private
|
|
73
|
+
private stopping;
|
|
74
|
+
private startPromise?;
|
|
75
|
+
private stopPromise?;
|
|
76
|
+
private resolveShutdown;
|
|
77
|
+
private readonly shutdownPromise;
|
|
69
78
|
constructor(opts: DaemonOptions);
|
|
70
79
|
start(): Promise<void>;
|
|
80
|
+
private startOnce;
|
|
71
81
|
stop(): Promise<void>;
|
|
82
|
+
private stopOnce;
|
|
72
83
|
/** Resolves when the daemon is shut down via RPC. */
|
|
73
84
|
waitForShutdown(): Promise<void>;
|
|
74
85
|
private onConnection;
|
|
@@ -76,22 +87,12 @@ export declare class DaemonServer {
|
|
|
76
87
|
private handle;
|
|
77
88
|
private dispatch;
|
|
78
89
|
private get maxConcurrent();
|
|
79
|
-
|
|
80
|
-
* Best-effort durable persistence of the job registry. Writes atomically
|
|
81
|
-
* (temp file + rename) so a crash mid-write cannot corrupt/drop the registry.
|
|
82
|
-
* The raw run `result` is intentionally NOT persisted: canonical output lives
|
|
83
|
-
* in .claudexor/runs (redacted), and result.summary can contain raw model text —
|
|
84
|
-
* keeping it out of jobs.json upholds the redaction-at-persistence invariant.
|
|
85
|
-
*/
|
|
86
|
-
private persist;
|
|
87
|
-
/** Bound memory/disk: prune the oldest terminal jobs beyond maxHistory.
|
|
88
|
-
* `blocked` runs are NEVER pruned — they are the needs-human inbox awaiting an
|
|
89
|
-
* operator decision; dropping one would silently lose a pending action. */
|
|
90
|
+
private stoppingError;
|
|
90
91
|
private pruneHistory;
|
|
91
|
-
|
|
92
|
-
private
|
|
93
|
-
|
|
94
|
-
private
|
|
92
|
+
private acceptCommand;
|
|
93
|
+
private allRecords;
|
|
94
|
+
private getRecord;
|
|
95
|
+
private updateRecord;
|
|
95
96
|
private threadIdOf;
|
|
96
97
|
/**
|
|
97
98
|
* Schedule queued jobs up to the concurrency limit (non-blocking).
|
|
@@ -106,7 +107,6 @@ export declare class DaemonServer {
|
|
|
106
107
|
private drain;
|
|
107
108
|
private runJob;
|
|
108
109
|
}
|
|
109
|
-
/** True when something is actively accepting connections on the socket path. */
|
|
110
110
|
/** Is a daemon already listening on this socket? Exported so the claudexord
|
|
111
111
|
* entrypoint can refuse BEFORE running crash GC — a second daemon must never
|
|
112
112
|
* reap the live daemon's children or sweep envelopes its jobs still own. */
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|