@claudexor/daemon 3.1.1 → 3.2.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/README.md +1 -1
- package/dist/client.d.ts +21 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +10 -0
- package/dist/client.js.map +1 -1
- package/dist/command-rpc.d.ts +19 -0
- package/dist/command-rpc.d.ts.map +1 -0
- package/dist/command-rpc.js +20 -0
- package/dist/command-rpc.js.map +1 -0
- package/dist/command-store.d.ts +9 -0
- package/dist/command-store.d.ts.map +1 -1
- package/dist/command-store.js +322 -0
- package/dist/command-store.js.map +1 -1
- package/dist/daemon-shutdown-rpc.d.ts +27 -0
- package/dist/daemon-shutdown-rpc.d.ts.map +1 -0
- package/dist/daemon-shutdown-rpc.js +110 -0
- package/dist/daemon-shutdown-rpc.js.map +1 -0
- package/dist/delegation-admission.d.ts +12 -0
- package/dist/delegation-admission.d.ts.map +1 -0
- package/dist/delegation-admission.js +47 -0
- package/dist/delegation-admission.js.map +1 -0
- package/dist/delivery-command.d.ts +28 -0
- package/dist/delivery-command.d.ts.map +1 -0
- package/dist/delivery-command.js +37 -0
- package/dist/delivery-command.js.map +1 -0
- package/dist/events.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/interactions.d.ts +3 -3
- package/dist/interactions.d.ts.map +1 -1
- package/dist/interactions.js +15 -4
- package/dist/interactions.js.map +1 -1
- package/dist/job-record.d.ts +25 -0
- package/dist/job-record.d.ts.map +1 -0
- package/dist/job-record.js +62 -0
- package/dist/job-record.js.map +1 -0
- package/dist/job-settlement.d.ts +16 -0
- package/dist/job-settlement.d.ts.map +1 -0
- package/dist/job-settlement.js +56 -0
- package/dist/job-settlement.js.map +1 -0
- package/dist/journal-manager.d.ts +5 -5
- package/dist/journal-manager.d.ts.map +1 -1
- package/dist/journal-manager.js.map +1 -1
- package/dist/journal-recovery-files.d.ts +1 -1
- package/dist/operator-decisions.d.ts +10 -1
- package/dist/operator-decisions.d.ts.map +1 -1
- package/dist/operator-decisions.js +18 -10
- package/dist/operator-decisions.js.map +1 -1
- package/dist/project-partitions.d.ts +18 -10
- package/dist/project-partitions.d.ts.map +1 -1
- package/dist/project-partitions.js +13 -34
- package/dist/project-partitions.js.map +1 -1
- package/dist/projects.d.ts.map +1 -1
- package/dist/projects.js.map +1 -1
- package/dist/quota-registry.d.ts +62 -13
- package/dist/quota-registry.d.ts.map +1 -1
- package/dist/quota-registry.js +92 -9
- package/dist/quota-registry.js.map +1 -1
- package/dist/resource-store.d.ts.map +1 -1
- package/dist/run-events.d.ts.map +1 -1
- package/dist/run-events.js.map +1 -1
- package/dist/server.d.ts +28 -48
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +126 -154
- package/dist/server.js.map +1 -1
- package/dist/socket-probe.d.ts +3 -0
- package/dist/socket-probe.d.ts.map +1 -0
- package/dist/socket-probe.js +15 -0
- package/dist/socket-probe.js.map +1 -0
- package/dist/terminal-authority.d.ts +39 -0
- package/dist/terminal-authority.d.ts.map +1 -0
- package/dist/terminal-authority.js +58 -0
- package/dist/terminal-authority.js.map +1 -0
- package/dist/terminate.d.ts +14 -0
- package/dist/terminate.d.ts.map +1 -1
- package/dist/terminate.js +13 -1
- package/dist/terminate.js.map +1 -1
- package/dist/thread-head-ping.d.ts.map +1 -1
- package/dist/thread-head-ping.js.map +1 -1
- package/dist/thread-store-support.d.ts +7 -0
- package/dist/thread-store-support.d.ts.map +1 -1
- package/dist/thread-store-support.js +22 -0
- package/dist/thread-store-support.js.map +1 -1
- package/dist/threads.d.ts +6 -15
- package/dist/threads.d.ts.map +1 -1
- package/dist/threads.js +23 -37
- package/dist/threads.js.map +1 -1
- package/dist/writer-lease.d.ts +4 -0
- package/dist/writer-lease.d.ts.map +1 -1
- package/dist/writer-lease.js +1 -0
- package/dist/writer-lease.js.map +1 -1
- package/package.json +7 -6
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { DaemonLeaseOwner } from "./writer-lease.js";
|
|
2
|
+
export interface RuntimeReplacementIdentity {
|
|
3
|
+
version: string;
|
|
4
|
+
buildSha: string;
|
|
5
|
+
}
|
|
6
|
+
export interface RuntimeReplacementTarget extends RuntimeReplacementIdentity {
|
|
7
|
+
leaseOwner: Pick<DaemonLeaseOwner, "pid" | "token">;
|
|
8
|
+
}
|
|
9
|
+
/** Exact serving authority configured into one daemon closure. */
|
|
10
|
+
export interface RuntimeReplacementAuthority {
|
|
11
|
+
runtimeIdentity?: RuntimeReplacementIdentity;
|
|
12
|
+
runtimeLeaseOwner?: Pick<DaemonLeaseOwner, "pid" | "token">;
|
|
13
|
+
}
|
|
14
|
+
export type DaemonShutdownRpcReceipt = {
|
|
15
|
+
ok: true;
|
|
16
|
+
fenced?: true;
|
|
17
|
+
targetBound?: true;
|
|
18
|
+
};
|
|
19
|
+
export declare function replacementRefusal(error: unknown): boolean;
|
|
20
|
+
/** Socket shutdown protocol owner. Ordinary operator shutdown stays delayed and
|
|
21
|
+
* forceful. Runtime replacement instead runs one synchronous activity check and
|
|
22
|
+
* composition callback; that callback must check setup then enter the shared
|
|
23
|
+
* shutdown state machine before returning its promise. */
|
|
24
|
+
export declare function dispatchShutdownRpc(method: string, params: unknown, transientActivity: number, readRecords: () => Iterable<{
|
|
25
|
+
state: string;
|
|
26
|
+
}>, requestOperatorShutdown: () => Promise<void>, requestRuntimeReplacement?: () => Promise<void>, configuredRuntimeIdentity?: RuntimeReplacementIdentity, configuredLeaseOwner?: Pick<DaemonLeaseOwner, "pid" | "token">): DaemonShutdownRpcReceipt | null;
|
|
27
|
+
//# sourceMappingURL=daemon-shutdown-rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-shutdown-rpc.d.ts","sourceRoot":"","sources":["../src/daemon-shutdown-rpc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAyB,SAAQ,0BAA0B;IAC1E,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC;CACrD;AAED,kEAAkE;AAClE,MAAM,WAAW,2BAA2B;IAC1C,eAAe,CAAC,EAAE,0BAA0B,CAAC;IAC7C,iBAAiB,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC;CAC7D;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB,CAAC;AAyCF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAI1D;AAED;;;0DAG0D;AAC1D,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,EACf,iBAAiB,EAAE,MAAM,EACzB,WAAW,EAAE,MAAM,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAC9C,uBAAuB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAC5C,yBAAyB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAC/C,yBAAyB,CAAC,EAAE,0BAA0B,EACtD,oBAAoB,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,OAAO,CAAC,GAC7D,wBAAwB,GAAG,IAAI,CAkEjC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
function activityUnknown(message) {
|
|
2
|
+
return Object.assign(new Error(message), {
|
|
3
|
+
code: "runtime_activity_unknown",
|
|
4
|
+
status: 503,
|
|
5
|
+
retryable: true,
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
function exactIdentity(value) {
|
|
9
|
+
if (!value || typeof value !== "object")
|
|
10
|
+
return null;
|
|
11
|
+
const candidate = value;
|
|
12
|
+
if (typeof candidate.version !== "string" ||
|
|
13
|
+
candidate.version.length === 0 ||
|
|
14
|
+
typeof candidate.buildSha !== "string" ||
|
|
15
|
+
!/^[0-9a-f]{40}$/.test(candidate.buildSha)) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return { version: candidate.version, buildSha: candidate.buildSha };
|
|
19
|
+
}
|
|
20
|
+
function exactTarget(value) {
|
|
21
|
+
const identity = exactIdentity(value);
|
|
22
|
+
if (!identity || !value || typeof value !== "object")
|
|
23
|
+
return null;
|
|
24
|
+
const leaseOwner = value.leaseOwner;
|
|
25
|
+
if (!leaseOwner || typeof leaseOwner !== "object")
|
|
26
|
+
return null;
|
|
27
|
+
const candidate = leaseOwner;
|
|
28
|
+
if (!Number.isSafeInteger(candidate.pid) ||
|
|
29
|
+
Number(candidate.pid) <= 0 ||
|
|
30
|
+
typeof candidate.token !== "string" ||
|
|
31
|
+
candidate.token.length === 0) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
return { ...identity, leaseOwner: { pid: Number(candidate.pid), token: candidate.token } };
|
|
35
|
+
}
|
|
36
|
+
export function replacementRefusal(error) {
|
|
37
|
+
if (!error || typeof error !== "object" || !("code" in error))
|
|
38
|
+
return false;
|
|
39
|
+
const code = error.code;
|
|
40
|
+
return code === "runtime_replacement_busy" || code === "runtime_activity_unknown";
|
|
41
|
+
}
|
|
42
|
+
/** Socket shutdown protocol owner. Ordinary operator shutdown stays delayed and
|
|
43
|
+
* forceful. Runtime replacement instead runs one synchronous activity check and
|
|
44
|
+
* composition callback; that callback must check setup then enter the shared
|
|
45
|
+
* shutdown state machine before returning its promise. */
|
|
46
|
+
export function dispatchShutdownRpc(method, params, transientActivity, readRecords, requestOperatorShutdown, requestRuntimeReplacement, configuredRuntimeIdentity, configuredLeaseOwner) {
|
|
47
|
+
if (method === "claudexor.shutdown") {
|
|
48
|
+
setTimeout(() => {
|
|
49
|
+
void requestOperatorShutdown().catch(() => {
|
|
50
|
+
// Fail closed: the process and ownership lease remain alive. The
|
|
51
|
+
// composition root records the detailed failure in its private log.
|
|
52
|
+
});
|
|
53
|
+
}, 10);
|
|
54
|
+
return { ok: true };
|
|
55
|
+
}
|
|
56
|
+
if (method !== "claudexor.shutdownForRuntimeReplacement")
|
|
57
|
+
return null;
|
|
58
|
+
// Bind replacement admission to the exact runtime the caller observed. This
|
|
59
|
+
// comparison shares the same synchronous event-loop turn as the activity
|
|
60
|
+
// check and admission fence below, so a stale handshake can never stop a
|
|
61
|
+
// different serving closure. Missing/unstamped authority fails closed.
|
|
62
|
+
const expected = exactTarget(params);
|
|
63
|
+
const configured = exactIdentity(configuredRuntimeIdentity);
|
|
64
|
+
if (!expected ||
|
|
65
|
+
!configured ||
|
|
66
|
+
!configuredLeaseOwner ||
|
|
67
|
+
expected.version !== configured.version ||
|
|
68
|
+
expected.buildSha !== configured.buildSha ||
|
|
69
|
+
expected.leaseOwner.pid !== configuredLeaseOwner.pid ||
|
|
70
|
+
expected.leaseOwner.token !== configuredLeaseOwner.token) {
|
|
71
|
+
throw activityUnknown("runtime replacement serving process identity could not be proven");
|
|
72
|
+
}
|
|
73
|
+
let busy;
|
|
74
|
+
try {
|
|
75
|
+
busy =
|
|
76
|
+
transientActivity > 0 ||
|
|
77
|
+
[...readRecords()].some((record) => record.state === "queued" || record.state === "running");
|
|
78
|
+
}
|
|
79
|
+
catch (cause) {
|
|
80
|
+
throw Object.assign(new Error("runtime replacement could not prove daemon activity state"), {
|
|
81
|
+
code: "runtime_activity_unknown",
|
|
82
|
+
status: 503,
|
|
83
|
+
retryable: true,
|
|
84
|
+
cause,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
if (busy) {
|
|
88
|
+
throw Object.assign(new Error("runtime replacement is deferred while daemon work is active"), {
|
|
89
|
+
code: "runtime_replacement_busy",
|
|
90
|
+
status: 409,
|
|
91
|
+
retryable: true,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (!requestRuntimeReplacement) {
|
|
95
|
+
throw Object.assign(new Error("runtime replacement admission authority is unavailable"), {
|
|
96
|
+
code: "runtime_activity_unknown",
|
|
97
|
+
status: 503,
|
|
98
|
+
retryable: true,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
// No await or timer separates the daemon activity check from this callback.
|
|
102
|
+
// Its synchronous prefix checks setup and fences setup/control/run admission.
|
|
103
|
+
const operation = requestRuntimeReplacement();
|
|
104
|
+
void operation.catch(() => {
|
|
105
|
+
// An accepted stop may close the response socket. The caller proves the
|
|
106
|
+
// pinned daemon's termination rather than trusting response delivery.
|
|
107
|
+
});
|
|
108
|
+
return { ok: true, fenced: true, targetBound: true };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=daemon-shutdown-rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-shutdown-rpc.js","sourceRoot":"","sources":["../src/daemon-shutdown-rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { JobRecord } from "./server.js";
|
|
2
|
+
export interface DelegationAdmissionAuthority {
|
|
3
|
+
assertCanAdmitChild(parentRunId: string): void;
|
|
4
|
+
noteChildAccepted(parentRunId: string, admissionId: string): void;
|
|
5
|
+
cancelAcceptedChild(parentRunId: string, admissionId: string): void;
|
|
6
|
+
beginParentClose(parentRunId: string): void;
|
|
7
|
+
}
|
|
8
|
+
export declare function delegatedParentOf(request: unknown): string | null;
|
|
9
|
+
export declare function isDelegatedChildRecord(record: JobRecord): boolean;
|
|
10
|
+
/** Pure lineage half of daemon-atomic Delegate admission. */
|
|
11
|
+
export declare function admitDelegatedRequest(request: unknown, operation: string | undefined, records: readonly JobRecord[], authority?: Pick<DelegationAdmissionAuthority, "assertCanAdmitChild">): unknown;
|
|
12
|
+
//# sourceMappingURL=delegation-admission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegation-admission.d.ts","sourceRoot":"","sources":["../src/delegation-admission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,4BAA4B;IAC3C,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAClE,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpE,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIjE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAEjE;AAED,6DAA6D;AAC7D,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,EAAE,SAAS,SAAS,EAAE,EAC7B,SAAS,CAAC,EAAE,IAAI,CAAC,4BAA4B,EAAE,qBAAqB,CAAC,GACpE,OAAO,CAmCT"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export function delegatedParentOf(request) {
|
|
2
|
+
if (!request || typeof request !== "object" || Array.isArray(request))
|
|
3
|
+
return null;
|
|
4
|
+
const value = request["delegatedFromRunId"];
|
|
5
|
+
return typeof value === "string" && value ? value : null;
|
|
6
|
+
}
|
|
7
|
+
export function isDelegatedChildRecord(record) {
|
|
8
|
+
return delegatedParentOf(record.params) !== null;
|
|
9
|
+
}
|
|
10
|
+
/** Pure lineage half of daemon-atomic Delegate admission. */
|
|
11
|
+
export function admitDelegatedRequest(request, operation, records, authority) {
|
|
12
|
+
const delegatedFrom = delegatedParentOf(request);
|
|
13
|
+
if (!delegatedFrom)
|
|
14
|
+
return request;
|
|
15
|
+
const params = request;
|
|
16
|
+
if (operation !== "delegated-run" || params["parentRunId"] !== delegatedFrom) {
|
|
17
|
+
throw Object.assign(new Error("delegation lineage is reserved for the scoped belt"), {
|
|
18
|
+
code: "delegation_lineage_forbidden",
|
|
19
|
+
status: 403,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
if (params["delegate"] === true) {
|
|
23
|
+
throw Object.assign(new Error("delegated children cannot enable Delegate"), {
|
|
24
|
+
code: "delegation_depth_forbidden",
|
|
25
|
+
status: 403,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
const parent = records.find((record) => record.runId === delegatedFrom);
|
|
29
|
+
const parentParams = parent?.params && typeof parent.params === "object" && !Array.isArray(parent.params)
|
|
30
|
+
? parent.params
|
|
31
|
+
: null;
|
|
32
|
+
if (!parent || parent.state !== "running" || parentParams?.["delegate"] !== true) {
|
|
33
|
+
throw Object.assign(new Error(`no running Delegate parent run ${delegatedFrom}`), {
|
|
34
|
+
code: "delegation_parent_invalid",
|
|
35
|
+
status: 403,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
if (!authority) {
|
|
39
|
+
throw Object.assign(new Error(`no Delegate budget authority for parent ${delegatedFrom}`), {
|
|
40
|
+
code: "delegation_budget_parent_unavailable",
|
|
41
|
+
status: 409,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
authority.assertCanAdmitChild(delegatedFrom);
|
|
45
|
+
return request;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=delegation-admission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegation-admission.js","sourceRoot":"","sources":["../src/delegation-admission.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACnF,MAAM,KAAK,GAAI,OAAmC,CAAC,oBAAoB,CAAC,CAAC;IACzE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,OAAO,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;AACnD,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,qBAAqB,CACnC,OAAgB,EAChB,SAA6B,EAC7B,OAA6B,EAC7B,SAAqE;IAErE,MAAM,aAAa,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,aAAa;QAAE,OAAO,OAAO,CAAC;IACnC,MAAM,MAAM,GAAG,OAAkC,CAAC;IAClD,IAAI,SAAS,KAAK,eAAe,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,aAAa,EAAE,CAAC;QAC7E,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oDAAoD,CAAC,EAAE;YACnF,IAAI,EAAE,8BAA8B;YACpC,MAAM,EAAE,GAAG;SACZ,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC;QAChC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,2CAA2C,CAAC,EAAE;YAC1E,IAAI,EAAE,4BAA4B;YAClC,MAAM,EAAE,GAAG;SACZ,CAAC,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,aAAa,CAAC,CAAC;IACxE,MAAM,YAAY,GAChB,MAAM,EAAE,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;QAClF,CAAC,CAAE,MAAM,CAAC,MAAkC;QAC5C,CAAC,CAAC,IAAI,CAAC;IACX,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,YAAY,EAAE,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC;QACjF,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kCAAkC,aAAa,EAAE,CAAC,EAAE;YAChF,IAAI,EAAE,2BAA2B;YACjC,MAAM,EAAE,GAAG;SACZ,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,2CAA2C,aAAa,EAAE,CAAC,EAAE;YACzF,IAAI,EAAE,sCAAsC;YAC5C,MAAM,EAAE,GAAG;SACZ,CAAC,CAAC;IACL,CAAC;IACD,SAAS,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { CommandStore } from "./command-store.js";
|
|
2
|
+
export declare function beginDeliveryCommand(store: CommandStore, params: unknown, input: {
|
|
3
|
+
key: string;
|
|
4
|
+
client: string;
|
|
5
|
+
operation: string;
|
|
6
|
+
request: unknown;
|
|
7
|
+
}): {
|
|
8
|
+
id: string;
|
|
9
|
+
state: import("./job-record.js").JobState;
|
|
10
|
+
params: unknown;
|
|
11
|
+
result?: unknown;
|
|
12
|
+
error?: string;
|
|
13
|
+
errorCode?: string;
|
|
14
|
+
errorStatus?: number;
|
|
15
|
+
errorRetryable?: boolean;
|
|
16
|
+
errorRequiredActions?: string[];
|
|
17
|
+
errorContext?: Record<string, unknown>;
|
|
18
|
+
createdAt: string;
|
|
19
|
+
runId?: string;
|
|
20
|
+
taskId?: string;
|
|
21
|
+
runDir?: string;
|
|
22
|
+
startedAt?: string;
|
|
23
|
+
finishedAt?: string;
|
|
24
|
+
reused: boolean;
|
|
25
|
+
};
|
|
26
|
+
export declare function completeDeliveryCommand(store: CommandStore | undefined, id: string, result: unknown): void;
|
|
27
|
+
export declare function failDeliveryCommand(store: CommandStore | undefined, id: string, error: unknown): void;
|
|
28
|
+
//# sourceMappingURL=delivery-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-command.d.ts","sourceRoot":"","sources":["../src/delivery-command.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,OAAO,EACf,KAAK,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE;;;;;;;;;;;;;;;;;;EAc5E;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,OAAO,GACd,IAAI,CAGN;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,GACb,IAAI,CAcN"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { newId, nowIso, safeProblemMessage } from "@claudexor/util";
|
|
2
|
+
export function beginDeliveryCommand(store, params, input) {
|
|
3
|
+
const accepted = store.accept({
|
|
4
|
+
id: newId("delivery"),
|
|
5
|
+
params,
|
|
6
|
+
idempotencyKey: input.key,
|
|
7
|
+
clientId: input.client,
|
|
8
|
+
operation: `delivery.${input.operation}`,
|
|
9
|
+
idempotencyParams: input.request,
|
|
10
|
+
});
|
|
11
|
+
const record = accepted.reused
|
|
12
|
+
? accepted.record
|
|
13
|
+
: store.update(accepted.record.id, { state: "running", startedAt: nowIso() });
|
|
14
|
+
return { ...record, reused: accepted.reused };
|
|
15
|
+
}
|
|
16
|
+
export function completeDeliveryCommand(store, id, result) {
|
|
17
|
+
if (!store)
|
|
18
|
+
throw new Error(`delivery authority lost command ${id}`);
|
|
19
|
+
store.update(id, { state: "succeeded", result, finishedAt: nowIso() });
|
|
20
|
+
}
|
|
21
|
+
export function failDeliveryCommand(store, id, error) {
|
|
22
|
+
if (!store)
|
|
23
|
+
throw new Error(`delivery authority lost command ${id}`);
|
|
24
|
+
const value = error && typeof error === "object" ? error : {};
|
|
25
|
+
store.update(id, {
|
|
26
|
+
state: "failed",
|
|
27
|
+
// This command store is the durable journal authority; redact before append.
|
|
28
|
+
error: safeProblemMessage(error),
|
|
29
|
+
errorCode: typeof value["code"] === "string" ? value["code"] : undefined,
|
|
30
|
+
result: {
|
|
31
|
+
status: typeof value["status"] === "number" ? value["status"] : 500,
|
|
32
|
+
code: typeof value["code"] === "string" ? value["code"] : null,
|
|
33
|
+
},
|
|
34
|
+
finishedAt: nowIso(),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=delivery-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-command.js","sourceRoot":"","sources":["../src/delivery-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGpE,MAAM,UAAU,oBAAoB,CAClC,KAAmB,EACnB,MAAe,EACf,KAA2E;IAE3E,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,EAAE,EAAE,KAAK,CAAC,UAAU,CAAC;QACrB,MAAM;QACN,cAAc,EAAE,KAAK,CAAC,GAAG;QACzB,QAAQ,EAAE,KAAK,CAAC,MAAM;QACtB,SAAS,EAAE,YAAY,KAAK,CAAC,SAAS,EAAE;QACxC,iBAAiB,EAAE,KAAK,CAAC,OAAO;KACjC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM;QAC5B,CAAC,CAAC,QAAQ,CAAC,MAAM;QACjB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAChF,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,KAA+B,EAC/B,EAAU,EACV,MAAe;IAEf,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,EAAE,EAAE,CAAC,CAAC;IACrE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,KAA+B,EAC/B,EAAU,EACV,KAAc;IAEd,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAE,KAAiC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3F,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE;QACf,KAAK,EAAE,QAAQ;QACf,6EAA6E;QAC7E,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC;QAChC,SAAS,EAAE,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QACxE,MAAM,EAAE;YACN,MAAM,EAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG;YACnE,IAAI,EAAE,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;SAC/D;QACD,UAAU,EAAE,MAAM,EAAE;KACrB,CAAC,CAAC;AACL,CAAC"}
|
package/dist/events.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAEzD;;;;;GAKG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IAEzD,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAEzD;;;;;GAKG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IAEzD,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAQ7B;IAED,SAAS,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,IAAI,CAKhD;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export * from "./token.js";
|
|
2
2
|
export * from "./server.js";
|
|
3
|
+
export * from "./delegation-admission.js";
|
|
3
4
|
export * from "./writer-lease.js";
|
|
4
5
|
export * from "./terminate.js";
|
|
5
6
|
export * from "./client.js";
|
|
7
|
+
export * from "./daemon-shutdown-rpc.js";
|
|
6
8
|
export * from "./events.js";
|
|
7
9
|
export * from "./interactions.js";
|
|
8
10
|
export * from "./operator-decisions.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export * from "./token.js";
|
|
2
2
|
export * from "./server.js";
|
|
3
|
+
export * from "./delegation-admission.js";
|
|
3
4
|
export * from "./writer-lease.js";
|
|
4
5
|
export * from "./terminate.js";
|
|
5
6
|
export * from "./client.js";
|
|
7
|
+
export * from "./daemon-shutdown-rpc.js";
|
|
6
8
|
export * from "./events.js";
|
|
7
9
|
export * from "./interactions.js";
|
|
8
10
|
export * from "./operator-decisions.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC"}
|
package/dist/interactions.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DurableJournal } from "@claudexor/journal";
|
|
2
|
-
import type { ControlPendingInteraction, InteractionAnswerSet, InteractionRequest } from "@claudexor/schema";
|
|
2
|
+
import type { ControlPendingInteraction, InteractionAnswerSet, InteractionHandlerRelease, InteractionRequest } from "@claudexor/schema";
|
|
3
3
|
/** Structural twin of the orchestrator's PendingInteractionContext. */
|
|
4
4
|
export interface InteractionContext {
|
|
5
5
|
runId: string;
|
|
@@ -8,7 +8,7 @@ export interface InteractionContext {
|
|
|
8
8
|
harnessId: string;
|
|
9
9
|
request: InteractionRequest;
|
|
10
10
|
requestedAt: string;
|
|
11
|
-
timeoutAt: string;
|
|
11
|
+
timeoutAt: string | null;
|
|
12
12
|
}
|
|
13
13
|
export type InteractionAnswerStatus = "delivered" | "not_found" | "already_resolved" | "rejected";
|
|
14
14
|
export type InteractionTerminal = "answered" | "timeout" | "run_terminal" | "interrupted";
|
|
@@ -37,7 +37,7 @@ export declare class InteractionRegistry {
|
|
|
37
37
|
forRequest(params: unknown): InteractionStore;
|
|
38
38
|
all(): InteractionStore[];
|
|
39
39
|
});
|
|
40
|
-
register(ctx: InteractionContext, params: unknown): Promise<InteractionAnswerSet |
|
|
40
|
+
register(ctx: InteractionContext, params: unknown): Promise<InteractionAnswerSet | InteractionHandlerRelease>;
|
|
41
41
|
answer(runId: string, interactionId: string, rawAnswers: unknown): {
|
|
42
42
|
status: InteractionAnswerStatus;
|
|
43
43
|
message?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactions.d.ts","sourceRoot":"","sources":["../src/interactions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EACV,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAM3B,uEAAuE;AACvE,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"interactions.d.ts","sourceRoot":"","sources":["../src/interactions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EACV,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAM3B,uEAAuE;AACvE,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,MAAM,uBAAuB,GAAG,WAAW,GAAG,WAAW,GAAG,kBAAkB,GAAG,UAAU,CAAC;AAClG,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,SAAS,GAAG,cAAc,GAAG,aAAa,CAAC;AAW1F,oEAAoE;AACpE,qBAAa,gBAAgB;IAIf,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgD;IACxE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAE9C,YAA6B,OAAO,EAAE,cAAc,EAGnD;IAED,OAAO,CAAC,GAAG,EAAE,kBAAkB,GAAG,yBAAyB,CAkB1D;IAED,OAAO,CACL,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,mBAAmB,GAC5B,UAAU,GAAG,WAAW,GAAG,kBAAkB,CAM/C;IAED,UAAU,CACR,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,CAAC,mBAAmB,EAAE,cAAc,GAAG,aAAa,CAAC,GACrE,MAAM,EAAE,CAIV;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAI/E;IAED,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,yBAAyB,EAAE,CAExD;IAED,kBAAkB,IAAI,IAAI,CAKzB;IAED,OAAO,CAAC,MAAM;IAgBd,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,eAAe;CAOxB;AAQD,2EAA2E;AAC3E,qBAAa,mBAAmB;IAI5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgC;IAErD,YACmB,MAAM,EAAE;QACvB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,CAAC;QAC9C,GAAG,IAAI,gBAAgB,EAAE,CAAC;KAC3B,EACC;IAEJ,QAAQ,CACN,GAAG,EAAE,kBAAkB,EACvB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,oBAAoB,GAAG,yBAAyB,CAAC,CAc3D;IAED,MAAM,CACJ,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,OAAO,GAClB;QAAE,MAAM,EAAE,uBAAuB,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAsBvD;IAED,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAO9B;IAED,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,yBAAyB,EAAE,CAGxD;IAED,OAAO,CAAC,KAAK;CAYd;AASD,wBAAgB,qBAAqB;IAEjC,IAAI;IACJ,MAAM,YAAY,cAAc;IAChC,QAAQ,UAAU,gBAAgB;EAErC"}
|
package/dist/interactions.js
CHANGED
|
@@ -112,13 +112,16 @@ export class InteractionRegistry {
|
|
|
112
112
|
}
|
|
113
113
|
register(ctx, params) {
|
|
114
114
|
this.prune();
|
|
115
|
+
// Validate before the durable request append: a malformed internal
|
|
116
|
+
// deadline must not leave an unanswerable journal row without a live owner.
|
|
117
|
+
const expiresAtMs = parseExpiry(ctx.timeoutAt);
|
|
115
118
|
const store = this.stores.forRequest(params);
|
|
116
119
|
store.request(ctx);
|
|
117
120
|
return new Promise((resolve) => {
|
|
118
121
|
this.live.set(interactionKey(ctx.runId, ctx.request.interaction_id), {
|
|
119
122
|
store,
|
|
120
123
|
resolve,
|
|
121
|
-
expiresAtMs
|
|
124
|
+
expiresAtMs,
|
|
122
125
|
});
|
|
123
126
|
});
|
|
124
127
|
}
|
|
@@ -153,7 +156,7 @@ export class InteractionRegistry {
|
|
|
153
156
|
if (!key.startsWith(`${runId}\u0000`))
|
|
154
157
|
continue;
|
|
155
158
|
this.live.delete(key);
|
|
156
|
-
entry.resolve(
|
|
159
|
+
entry.resolve({ kind: "released", reason: "run_terminal" });
|
|
157
160
|
}
|
|
158
161
|
}
|
|
159
162
|
pendingForRun(runId) {
|
|
@@ -163,17 +166,25 @@ export class InteractionRegistry {
|
|
|
163
166
|
prune() {
|
|
164
167
|
const now = Date.now();
|
|
165
168
|
for (const [key, entry] of this.live) {
|
|
166
|
-
if (entry.expiresAtMs > now)
|
|
169
|
+
if (entry.expiresAtMs === null || entry.expiresAtMs > now)
|
|
167
170
|
continue;
|
|
168
171
|
const split = key.indexOf("\u0000");
|
|
169
172
|
const runId = key.slice(0, split);
|
|
170
173
|
const interactionId = key.slice(split + 1);
|
|
171
174
|
entry.store.resolve(runId, interactionId, "timeout");
|
|
172
175
|
this.live.delete(key);
|
|
173
|
-
entry.resolve(
|
|
176
|
+
entry.resolve({ kind: "released", reason: "timeout" });
|
|
174
177
|
}
|
|
175
178
|
}
|
|
176
179
|
}
|
|
180
|
+
function parseExpiry(timeoutAt) {
|
|
181
|
+
if (timeoutAt === null)
|
|
182
|
+
return null;
|
|
183
|
+
const value = Date.parse(timeoutAt);
|
|
184
|
+
if (!Number.isFinite(value))
|
|
185
|
+
throw new Error("invalid interaction timeoutAt");
|
|
186
|
+
return value;
|
|
187
|
+
}
|
|
177
188
|
export function interactionProjection() {
|
|
178
189
|
return {
|
|
179
190
|
name: "interactions",
|
package/dist/interactions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactions.js","sourceRoot":"","sources":["../src/interactions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interactions.js","sourceRoot":"","sources":["../src/interactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare const JOB_STATES: readonly ["queued", "running", "succeeded", "failed", "cancelled", "interrupted"];
|
|
2
|
+
export type JobState = (typeof JOB_STATES)[number];
|
|
3
|
+
export interface JobRecord {
|
|
4
|
+
id: string;
|
|
5
|
+
state: JobState;
|
|
6
|
+
params: unknown;
|
|
7
|
+
result?: unknown;
|
|
8
|
+
error?: string;
|
|
9
|
+
errorCode?: string;
|
|
10
|
+
errorStatus?: number;
|
|
11
|
+
errorRetryable?: boolean;
|
|
12
|
+
errorRequiredActions?: string[];
|
|
13
|
+
errorContext?: Record<string, unknown>;
|
|
14
|
+
createdAt: string;
|
|
15
|
+
runId?: string;
|
|
16
|
+
taskId?: string;
|
|
17
|
+
runDir?: string;
|
|
18
|
+
startedAt?: string;
|
|
19
|
+
finishedAt?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function jobStateFromResult(result: unknown, aborted: boolean): JobState;
|
|
22
|
+
export declare function resultReason(result: unknown): string | null;
|
|
23
|
+
export declare function resultSummary(result: unknown): string | null;
|
|
24
|
+
export declare function publicJobRecord(record: JobRecord): JobRecord;
|
|
25
|
+
//# sourceMappingURL=job-record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-record.d.ts","sourceRoot":"","sources":["../src/job-record.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,YACrB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,QAAQ,EACR,WAAW,EACX,aAAa,CACL,CAAC;AACX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,QAAQ,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,QAAQ,CAe9E;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAG3D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAG5D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAU5D"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { redactSecrets, safeProblemContext, safeProblemRequiredActions } from "@claudexor/util";
|
|
2
|
+
export const JOB_STATES = [
|
|
3
|
+
"queued",
|
|
4
|
+
"running",
|
|
5
|
+
"succeeded",
|
|
6
|
+
"failed",
|
|
7
|
+
"cancelled",
|
|
8
|
+
"interrupted",
|
|
9
|
+
];
|
|
10
|
+
export function jobStateFromResult(result, aborted) {
|
|
11
|
+
// The engine's synchronous terminal commit is the cutoff. A recognizable
|
|
12
|
+
// lifecycle already reflects any abort present at that boundary, while a
|
|
13
|
+
// later abort must not rewrite the durable result.
|
|
14
|
+
const lifecycle = resultString(result, "lifecycle");
|
|
15
|
+
if (lifecycle === "succeeded" ||
|
|
16
|
+
lifecycle === "failed" ||
|
|
17
|
+
lifecycle === "cancelled" ||
|
|
18
|
+
lifecycle === "interrupted") {
|
|
19
|
+
return lifecycle;
|
|
20
|
+
}
|
|
21
|
+
// Preserve the daemon's fail-closed fallback for a malformed runner result.
|
|
22
|
+
return aborted ? "cancelled" : "failed";
|
|
23
|
+
}
|
|
24
|
+
export function resultReason(result) {
|
|
25
|
+
if (!result || typeof result !== "object" || Array.isArray(result))
|
|
26
|
+
return null;
|
|
27
|
+
return resultString(result["facts"], "reason");
|
|
28
|
+
}
|
|
29
|
+
export function resultSummary(result) {
|
|
30
|
+
const summary = resultString(result, "summary");
|
|
31
|
+
return summary === null ? null : redactSecrets(summary);
|
|
32
|
+
}
|
|
33
|
+
export function publicJobRecord(record) {
|
|
34
|
+
return {
|
|
35
|
+
...record,
|
|
36
|
+
error: record.error ? redactSecrets(record.error) : undefined,
|
|
37
|
+
...(record.errorRequiredActions
|
|
38
|
+
? { errorRequiredActions: safeProblemRequiredActions(record.errorRequiredActions) }
|
|
39
|
+
: {}),
|
|
40
|
+
...(record.errorContext ? { errorContext: safeProblemContext(record.errorContext) } : {}),
|
|
41
|
+
params: redactParams(record.params),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function resultString(result, key) {
|
|
45
|
+
if (!result || typeof result !== "object" || Array.isArray(result))
|
|
46
|
+
return null;
|
|
47
|
+
const value = result[key];
|
|
48
|
+
return typeof value === "string" ? value : null;
|
|
49
|
+
}
|
|
50
|
+
function redactParams(value) {
|
|
51
|
+
if (typeof value === "string")
|
|
52
|
+
return redactSecrets(value);
|
|
53
|
+
if (Array.isArray(value))
|
|
54
|
+
return value.map(redactParams);
|
|
55
|
+
if (!value || typeof value !== "object")
|
|
56
|
+
return value;
|
|
57
|
+
return Object.fromEntries(Object.entries(value).map(([key, child]) => [
|
|
58
|
+
key,
|
|
59
|
+
key === "prompt" && typeof child === "string" ? redactSecrets(child) : redactParams(child),
|
|
60
|
+
]));
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=job-record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-record.js","sourceRoot":"","sources":["../src/job-record.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type CommandAuthority } from "./command-authority.js";
|
|
2
|
+
import type { JobRecord } from "./job-record.js";
|
|
3
|
+
interface JobErrorSettlement {
|
|
4
|
+
thrown: unknown;
|
|
5
|
+
record: JobRecord;
|
|
6
|
+
aborted: boolean;
|
|
7
|
+
commands: CommandAuthority;
|
|
8
|
+
update: (record: JobRecord, patch: Partial<JobRecord>) => JobRecord;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Settle a runner throw without allowing local terminal-finalization failures
|
|
12
|
+
* to overwrite a terminal event already accepted by durable authority.
|
|
13
|
+
*/
|
|
14
|
+
export declare function settleJobError({ thrown, record, aborted, commands, update, }: JobErrorSettlement): JobRecord;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=job-settlement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-settlement.d.ts","sourceRoot":"","sources":["../src/job-settlement.ts"],"names":[],"mappings":"AAMA,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,UAAU,kBAAkB;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC;CACrE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,MAAM,EACN,OAAO,EACP,QAAQ,EACR,MAAM,GACP,EAAE,kBAAkB,GAAG,SAAS,CA8ChC"}
|