@claudexor/orchestrator 3.1.0 → 3.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/attemptFinalize.d.ts +38 -0
- package/dist/attemptFinalize.d.ts.map +1 -1
- package/dist/attemptFinalize.js +44 -0
- package/dist/attemptFinalize.js.map +1 -1
- package/dist/attemptTelemetry.d.ts +9 -20
- package/dist/attemptTelemetry.d.ts.map +1 -1
- package/dist/attemptTelemetry.js +36 -69
- package/dist/attemptTelemetry.js.map +1 -1
- package/dist/attemptUsageCost.d.ts +31 -0
- package/dist/attemptUsageCost.d.ts.map +1 -0
- package/dist/attemptUsageCost.js +181 -0
- package/dist/attemptUsageCost.js.map +1 -0
- package/dist/budgetFailure.d.ts +3 -1
- package/dist/budgetFailure.d.ts.map +1 -1
- package/dist/budgetFailure.js.map +1 -1
- package/dist/candidateEvidence.d.ts +5 -0
- package/dist/candidateEvidence.d.ts.map +1 -1
- package/dist/candidateEvidence.js +3 -1
- package/dist/candidateEvidence.js.map +1 -1
- package/dist/candidateOutputs.d.ts +19 -0
- package/dist/candidateOutputs.d.ts.map +1 -1
- package/dist/candidateOutputs.js +201 -67
- package/dist/candidateOutputs.js.map +1 -1
- package/dist/decisionBudget.d.ts +43 -0
- package/dist/decisionBudget.d.ts.map +1 -0
- package/dist/decisionBudget.js +84 -0
- package/dist/decisionBudget.js.map +1 -0
- package/dist/decisionTerminalReconciliation.d.ts +18 -0
- package/dist/decisionTerminalReconciliation.d.ts.map +1 -0
- package/dist/decisionTerminalReconciliation.js +26 -0
- package/dist/decisionTerminalReconciliation.js.map +1 -0
- package/dist/deepScanReducer.d.ts.map +1 -1
- package/dist/deepScanReducer.js +1 -5
- package/dist/deepScanReducer.js.map +1 -1
- package/dist/delegation-parent-activation.d.ts +6 -0
- package/dist/delegation-parent-activation.d.ts.map +1 -0
- package/dist/delegation-parent-activation.js +13 -0
- package/dist/delegation-parent-activation.js.map +1 -0
- package/dist/delegationBudgetAuthority.d.ts +30 -0
- package/dist/delegationBudgetAuthority.d.ts.map +1 -0
- package/dist/delegationBudgetAuthority.js +157 -0
- package/dist/delegationBudgetAuthority.js.map +1 -0
- package/dist/delegationFailure.d.ts +58 -0
- package/dist/delegationFailure.d.ts.map +1 -0
- package/dist/delegationFailure.js +184 -0
- package/dist/delegationFailure.js.map +1 -0
- package/dist/delegationToolEvidence.d.ts +20 -0
- package/dist/delegationToolEvidence.d.ts.map +1 -0
- package/dist/delegationToolEvidence.js +46 -0
- package/dist/delegationToolEvidence.js.map +1 -0
- package/dist/effortGovernance.d.ts +49 -0
- package/dist/effortGovernance.d.ts.map +1 -0
- package/dist/effortGovernance.js +35 -0
- package/dist/effortGovernance.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/orchestrator.d.ts +29 -38
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +294 -392
- package/dist/orchestrator.js.map +1 -1
- package/dist/plan-prompt.d.ts +3 -0
- package/dist/plan-prompt.d.ts.map +1 -0
- package/dist/plan-prompt.js +28 -0
- package/dist/plan-prompt.js.map +1 -0
- package/dist/requestRequirements.d.ts +17 -0
- package/dist/requestRequirements.d.ts.map +1 -1
- package/dist/requestRequirements.js +69 -1
- package/dist/requestRequirements.js.map +1 -1
- package/dist/reviewerPanel.d.ts +4 -0
- package/dist/reviewerPanel.d.ts.map +1 -1
- package/dist/reviewerPanel.js +54 -9
- package/dist/reviewerPanel.js.map +1 -1
- package/dist/revisePrompt.d.ts +17 -0
- package/dist/revisePrompt.d.ts.map +1 -0
- package/dist/revisePrompt.js +15 -0
- package/dist/revisePrompt.js.map +1 -0
- package/dist/root-ledger.d.ts +13 -0
- package/dist/root-ledger.d.ts.map +1 -0
- package/dist/root-ledger.js +19 -0
- package/dist/root-ledger.js.map +1 -0
- package/dist/routing-failure.d.ts +6 -0
- package/dist/routing-failure.d.ts.map +1 -0
- package/dist/routing-failure.js +12 -0
- package/dist/routing-failure.js.map +1 -0
- package/dist/run-bounded.d.ts +3 -0
- package/dist/run-bounded.d.ts.map +1 -0
- package/dist/run-bounded.js +17 -0
- package/dist/run-bounded.js.map +1 -0
- package/dist/run-input-resolution.d.ts +10 -0
- package/dist/run-input-resolution.d.ts.map +1 -0
- package/dist/run-input-resolution.js +70 -0
- package/dist/run-input-resolution.js.map +1 -0
- package/dist/runSupport.d.ts +17 -0
- package/dist/runSupport.d.ts.map +1 -1
- package/dist/runSupport.js +26 -0
- package/dist/runSupport.js.map +1 -1
- package/dist/runTelemetryWriter.d.ts +5 -2
- package/dist/runTelemetryWriter.d.ts.map +1 -1
- package/dist/runTelemetryWriter.js +72 -1
- package/dist/runTelemetryWriter.js.map +1 -1
- package/dist/runTerminals.d.ts +34 -7
- package/dist/runTerminals.d.ts.map +1 -1
- package/dist/runTerminals.js +215 -24
- package/dist/runTerminals.js.map +1 -1
- package/dist/secretDiff.d.ts +29 -0
- package/dist/secretDiff.d.ts.map +1 -0
- package/dist/secretDiff.js +133 -0
- package/dist/secretDiff.js.map +1 -0
- package/dist/terminalOutcome.d.ts +22 -0
- package/dist/terminalOutcome.d.ts.map +1 -0
- package/dist/terminalOutcome.js +39 -0
- package/dist/terminalOutcome.js.map +1 -0
- package/dist/write-isolation.d.ts +11 -0
- package/dist/write-isolation.d.ts.map +1 -0
- package/dist/write-isolation.js +13 -0
- package/dist/write-isolation.js.map +1 -0
- package/package.json +17 -17
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { BudgetLedger } from "@claudexor/budget";
|
|
2
|
+
import type { EventLog } from "@claudexor/event-log";
|
|
3
|
+
import type { DelegationBudgetAuthority } from "./delegationBudgetAuthority.js";
|
|
4
|
+
import type { RoutedAdapter, RunInput } from "./orchestrator.js";
|
|
5
|
+
export declare function activateDelegationParent(authority: DelegationBudgetAuthority | undefined, input: RunInput, runId: string, ledger: BudgetLedger, routes: readonly RoutedAdapter[], log: EventLog): void;
|
|
6
|
+
//# sourceMappingURL=delegation-parent-activation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegation-parent-activation.d.ts","sourceRoot":"","sources":["../src/delegation-parent-activation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEjE,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,yBAAyB,GAAG,SAAS,EAChD,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,GAAG,EAAE,QAAQ,GACZ,IAAI,CAWN"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function activateDelegationParent(authority, input, runId, ledger, routes, log) {
|
|
2
|
+
if (input.delegate !== true || !routes.some((route) => route.delegationRequirement.effective))
|
|
3
|
+
return;
|
|
4
|
+
if (!authority) {
|
|
5
|
+
throw Object.assign(new Error("effective Delegate requires daemon-lifetime budget authority"), {
|
|
6
|
+
code: "delegation_budget_authority_unavailable",
|
|
7
|
+
status: 503,
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
authority.registerParent(runId, ledger);
|
|
11
|
+
log.deferTerminal();
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=delegation-parent-activation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegation-parent-activation.js","sourceRoot":"","sources":["../src/delegation-parent-activation.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,wBAAwB,CACtC,SAAgD,EAChD,KAAe,EACf,KAAa,EACb,MAAoB,EACpB,MAAgC,EAChC,GAAa;IAEb,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,SAAS,CAAC;QAC3F,OAAO;IACT,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,8DAA8D,CAAC,EAAE;YAC7F,IAAI,EAAE,yCAAyC;YAC/C,MAAM,EAAE,GAAG;SACZ,CAAC,CAAC;IACL,CAAC;IACD,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxC,GAAG,CAAC,aAAa,EAAE,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { BudgetLedger } from "@claudexor/budget";
|
|
2
|
+
export interface DelegationBudgetAuthorityOptions {
|
|
3
|
+
/** Daemon-owned cancellation by admission/job id. Bound once at the
|
|
4
|
+
* composition root so the budget registry never owns process control. */
|
|
5
|
+
cancelAdmission?: (admissionId: string) => void | Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Daemon-lifetime financial registry for active Delegate families. It is
|
|
9
|
+
* intentionally narrow: no grants or general identity framework, only one
|
|
10
|
+
* live parent ledger, its monotonic child count, and task-scoped child views.
|
|
11
|
+
*/
|
|
12
|
+
export declare class DelegationBudgetAuthority {
|
|
13
|
+
private readonly options;
|
|
14
|
+
private readonly parents;
|
|
15
|
+
private readonly childParents;
|
|
16
|
+
constructor(options?: DelegationBudgetAuthorityOptions);
|
|
17
|
+
registerParent(runId: string, ledger: BudgetLedger): void;
|
|
18
|
+
hasParent(runId: string): boolean;
|
|
19
|
+
assertCanAdmitChild(parentRunId: string): void;
|
|
20
|
+
noteChildAccepted(parentRunId: string, admissionId: string): void;
|
|
21
|
+
cancelAcceptedChild(parentRunId: string, admissionId: string): void;
|
|
22
|
+
attachChild(parentRunId: string, admissionId: string, childRunId: string, taskId: string, onCashSettled?: (cashSpendUsd: number, valuationUsd: number, cashEstimated: boolean, valuationKnowledge: "exact" | "estimated" | "unknown") => void): BudgetLedger;
|
|
23
|
+
beginParentClose(parentRunId: string): void;
|
|
24
|
+
waitForChildren(parentRunId: string, timeoutMs?: number): Promise<void>;
|
|
25
|
+
releaseRun(runId: string): void;
|
|
26
|
+
acceptedChildCount(parentRunId: string): number;
|
|
27
|
+
private isDrained;
|
|
28
|
+
private notifyIfDrained;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=delegationBudgetAuthority.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegationBudgetAuthority.d.ts","sourceRoot":"","sources":["../src/delegationBudgetAuthority.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAajD,MAAM,WAAW,gCAAgC;IAC/C;6EACyE;IACzE,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAED;;;;GAIG;AACH,qBAAa,yBAAyB;IAIxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAC9D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;gBAE7B,OAAO,GAAE,gCAAqC;IAE3E,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI;IAkBzD,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIjC,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAkB9C,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAOjE,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAMnE,WAAW,CACT,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,CACd,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,OAAO,EACtB,kBAAkB,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,KAClD,IAAI,GACR,YAAY;IAqBf,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAKrC,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAkD7E,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAqB/B,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAI/C,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,eAAe;CAIxB"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { MAX_DELEGATED_CHILDREN } from "@claudexor/schema";
|
|
2
|
+
/**
|
|
3
|
+
* Daemon-lifetime financial registry for active Delegate families. It is
|
|
4
|
+
* intentionally narrow: no grants or general identity framework, only one
|
|
5
|
+
* live parent ledger, its monotonic child count, and task-scoped child views.
|
|
6
|
+
*/
|
|
7
|
+
export class DelegationBudgetAuthority {
|
|
8
|
+
options;
|
|
9
|
+
parents = new Map();
|
|
10
|
+
childParents = new Map();
|
|
11
|
+
constructor(options = {}) {
|
|
12
|
+
this.options = options;
|
|
13
|
+
}
|
|
14
|
+
registerParent(runId, ledger) {
|
|
15
|
+
if (this.parents.has(runId)) {
|
|
16
|
+
throw Object.assign(new Error(`Delegate budget authority already exists for ${runId}`), {
|
|
17
|
+
code: "delegation_budget_parent_duplicate",
|
|
18
|
+
status: 409,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
this.parents.set(runId, {
|
|
22
|
+
ledger,
|
|
23
|
+
accepting: true,
|
|
24
|
+
acceptedChildren: 0,
|
|
25
|
+
pendingAdmissions: new Set(),
|
|
26
|
+
children: new Map(),
|
|
27
|
+
waiters: new Set(),
|
|
28
|
+
cancellationStarted: false,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
hasParent(runId) {
|
|
32
|
+
return this.parents.has(runId);
|
|
33
|
+
}
|
|
34
|
+
assertCanAdmitChild(parentRunId) {
|
|
35
|
+
const parent = this.parents.get(parentRunId);
|
|
36
|
+
if (!parent || !parent.accepting) {
|
|
37
|
+
throw Object.assign(new Error(`no live effective Delegate budget authority for parent ${parentRunId}`), { code: "delegation_budget_parent_unavailable", status: 409 });
|
|
38
|
+
}
|
|
39
|
+
if (parent.acceptedChildren >= MAX_DELEGATED_CHILDREN) {
|
|
40
|
+
throw Object.assign(new Error(`delegation sub-run cap reached (${parent.acceptedChildren}/${MAX_DELEGATED_CHILDREN}) for parent ${parentRunId}`), { code: "delegation_subrun_cap", status: 409 });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
noteChildAccepted(parentRunId, admissionId) {
|
|
44
|
+
this.assertCanAdmitChild(parentRunId);
|
|
45
|
+
const parent = this.parents.get(parentRunId);
|
|
46
|
+
parent.acceptedChildren += 1;
|
|
47
|
+
parent.pendingAdmissions.add(admissionId);
|
|
48
|
+
}
|
|
49
|
+
cancelAcceptedChild(parentRunId, admissionId) {
|
|
50
|
+
const parent = this.parents.get(parentRunId);
|
|
51
|
+
if (!parent?.pendingAdmissions.delete(admissionId))
|
|
52
|
+
return;
|
|
53
|
+
this.notifyIfDrained(parent);
|
|
54
|
+
}
|
|
55
|
+
attachChild(parentRunId, admissionId, childRunId, taskId, onCashSettled) {
|
|
56
|
+
const parent = this.parents.get(parentRunId);
|
|
57
|
+
if (!parent || !parent.pendingAdmissions.has(admissionId)) {
|
|
58
|
+
throw Object.assign(new Error(`delegated child ${childRunId} has no admitted parent budget authority`), { code: "delegation_budget_parent_unavailable", status: 409 });
|
|
59
|
+
}
|
|
60
|
+
if (this.childParents.has(childRunId)) {
|
|
61
|
+
throw Object.assign(new Error(`delegated child ${childRunId} is already attached`), {
|
|
62
|
+
code: "delegation_budget_child_duplicate",
|
|
63
|
+
status: 409,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
parent.pendingAdmissions.delete(admissionId);
|
|
67
|
+
const ledger = parent.ledger.scopedToTask(taskId, onCashSettled);
|
|
68
|
+
parent.children.set(childRunId, { ledger, admissionId });
|
|
69
|
+
this.childParents.set(childRunId, parentRunId);
|
|
70
|
+
return ledger;
|
|
71
|
+
}
|
|
72
|
+
beginParentClose(parentRunId) {
|
|
73
|
+
const parent = this.parents.get(parentRunId);
|
|
74
|
+
if (parent)
|
|
75
|
+
parent.accepting = false;
|
|
76
|
+
}
|
|
77
|
+
async waitForChildren(parentRunId, timeoutMs = 30_000) {
|
|
78
|
+
const parent = this.parents.get(parentRunId);
|
|
79
|
+
if (!parent || this.isDrained(parent))
|
|
80
|
+
return;
|
|
81
|
+
if (!parent.cancellationStarted && this.options.cancelAdmission) {
|
|
82
|
+
parent.cancellationStarted = true;
|
|
83
|
+
const admissionIds = new Set([
|
|
84
|
+
...parent.pendingAdmissions,
|
|
85
|
+
...[...parent.children.values()].map((child) => child.admissionId),
|
|
86
|
+
]);
|
|
87
|
+
await Promise.allSettled([...admissionIds].map((admissionId) => Promise.resolve().then(() => this.options.cancelAdmission(admissionId))));
|
|
88
|
+
if (this.isDrained(parent))
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
await new Promise((resolve, reject) => {
|
|
92
|
+
const done = () => {
|
|
93
|
+
clearTimeout(timer);
|
|
94
|
+
parent.waiters.delete(done);
|
|
95
|
+
resolve();
|
|
96
|
+
};
|
|
97
|
+
const timer = setTimeout(() => {
|
|
98
|
+
parent.waiters.delete(done);
|
|
99
|
+
// The daemon already signalled every admission above. If a broken
|
|
100
|
+
// injected runner ignores abort, fence its scoped financial mutations
|
|
101
|
+
// BEFORE the parent failure terminal is allowed to flush: it can no
|
|
102
|
+
// longer emit parent-family cash or retain a hold. Production Delegate
|
|
103
|
+
// lanes are narrower: Claude/Codex run through core spawnProcess, whose
|
|
104
|
+
// abort path sends the cooperative signal, escalates to SIGKILL after
|
|
105
|
+
// 1s, bounds tree reaping, and then completes the generator with typed
|
|
106
|
+
// termination_unconfirmed at worst. Their daemon jobs therefore settle
|
|
107
|
+
// well inside this 30s bound. This timeout is a typed broken-runner
|
|
108
|
+
// fail-safe, not a claim that an arbitrary injected runner is dead.
|
|
109
|
+
for (const child of parent.children.values())
|
|
110
|
+
child.ledger.releaseTask();
|
|
111
|
+
reject(Object.assign(new Error(`timed out waiting for ${parent.children.size + parent.pendingAdmissions.size} delegated child run(s) of ${parentRunId}`), { code: "delegation_child_drain_timeout", status: 503 }));
|
|
112
|
+
}, timeoutMs);
|
|
113
|
+
timer.unref?.();
|
|
114
|
+
parent.waiters.add(done);
|
|
115
|
+
if (this.isDrained(parent))
|
|
116
|
+
done();
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
releaseRun(runId) {
|
|
120
|
+
const parentRunId = this.childParents.get(runId);
|
|
121
|
+
if (parentRunId) {
|
|
122
|
+
const parent = this.parents.get(parentRunId);
|
|
123
|
+
const child = parent?.children.get(runId);
|
|
124
|
+
child?.ledger.releaseTask();
|
|
125
|
+
parent?.children.delete(runId);
|
|
126
|
+
this.childParents.delete(runId);
|
|
127
|
+
if (parent)
|
|
128
|
+
this.notifyIfDrained(parent);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const parent = this.parents.get(runId);
|
|
132
|
+
if (!parent)
|
|
133
|
+
return;
|
|
134
|
+
parent.accepting = false;
|
|
135
|
+
parent.pendingAdmissions.clear();
|
|
136
|
+
for (const child of parent.children.values())
|
|
137
|
+
child.ledger.releaseTask();
|
|
138
|
+
for (const childRunId of parent.children.keys())
|
|
139
|
+
this.childParents.delete(childRunId);
|
|
140
|
+
for (const waiter of [...parent.waiters])
|
|
141
|
+
waiter();
|
|
142
|
+
this.parents.delete(runId);
|
|
143
|
+
}
|
|
144
|
+
acceptedChildCount(parentRunId) {
|
|
145
|
+
return this.parents.get(parentRunId)?.acceptedChildren ?? 0;
|
|
146
|
+
}
|
|
147
|
+
isDrained(parent) {
|
|
148
|
+
return parent.children.size === 0 && parent.pendingAdmissions.size === 0;
|
|
149
|
+
}
|
|
150
|
+
notifyIfDrained(parent) {
|
|
151
|
+
if (!this.isDrained(parent))
|
|
152
|
+
return;
|
|
153
|
+
for (const waiter of [...parent.waiters])
|
|
154
|
+
waiter();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=delegationBudgetAuthority.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegationBudgetAuthority.js","sourceRoot":"","sources":["../src/delegationBudgetAuthority.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { ArtifactStore, type RunPaths } from "@claudexor/artifact-store";
|
|
2
|
+
import { EventLog } from "@claudexor/event-log";
|
|
3
|
+
import { type ModeKind } from "@claudexor/schema";
|
|
4
|
+
import type { AttemptTelemetry } from "./attemptTelemetry.js";
|
|
5
|
+
import type { CandidateRun } from "./candidateEvidence.js";
|
|
6
|
+
export type DelegationFailureKind = "startup" | "runtime";
|
|
7
|
+
/** One owner for the post-injection failure boundary shared by race,
|
|
8
|
+
* convergence, and attempt finalization. Runtime takes precedence if corrupt
|
|
9
|
+
* evidence ever reports both facts. */
|
|
10
|
+
export declare function delegationFailureKind(t: AttemptTelemetry): DelegationFailureKind | null;
|
|
11
|
+
export declare function delegationFailureError(t: AttemptTelemetry): string | null;
|
|
12
|
+
export declare function candidateFailureKind(run: CandidateRun): DelegationFailureKind | "artifact_security" | null;
|
|
13
|
+
/** Race-level precedence: an unrecovered injected-belt failure dominates all
|
|
14
|
+
* siblings; a safely discarded isolated secret candidate is merely ineligible,
|
|
15
|
+
* while an in-place refusal remains terminal because cleanup may be required. */
|
|
16
|
+
export declare function dominantRaceCandidateFailure(runs: CandidateRun[]): CandidateRun | undefined;
|
|
17
|
+
/** Build the terminal cause/provenance without duplicating the race and
|
|
18
|
+
* convergence messages or raw-attempt links. */
|
|
19
|
+
export declare function delegationFailureTerminal(run: CandidateRun, lane: "race" | "convergence"): {
|
|
20
|
+
phase: string;
|
|
21
|
+
error: Error;
|
|
22
|
+
metadata: {
|
|
23
|
+
category: "harness_error";
|
|
24
|
+
harnessId: string;
|
|
25
|
+
attemptId: string;
|
|
26
|
+
rawDetailRef: string;
|
|
27
|
+
nextActions: string[];
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
export declare function candidateFailureTerminal(run: CandidateRun, lane: "race" | "convergence"): {
|
|
31
|
+
phase: string;
|
|
32
|
+
error: Error;
|
|
33
|
+
metadata: {
|
|
34
|
+
category: "harness_error";
|
|
35
|
+
harnessId: string;
|
|
36
|
+
attemptId: string;
|
|
37
|
+
rawDetailRef: string;
|
|
38
|
+
nextActions: string[];
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
/** An explicitly in-place harness may have changed the live tree before a
|
|
42
|
+
* required Delegate failure becomes terminal. Persist those unavoidable bytes
|
|
43
|
+
* as blocked and revertable; envelope runs stay diagnostic-only. */
|
|
44
|
+
export declare function persistFailedInPlaceWorkProduct(input: {
|
|
45
|
+
live: boolean;
|
|
46
|
+
run: CandidateRun;
|
|
47
|
+
store: ArtifactStore;
|
|
48
|
+
log: EventLog;
|
|
49
|
+
paths: RunPaths;
|
|
50
|
+
execRoot: string;
|
|
51
|
+
preTurnSha: string | null;
|
|
52
|
+
postTurnSha?: string | null;
|
|
53
|
+
taskId: string;
|
|
54
|
+
mode: ModeKind;
|
|
55
|
+
kind: "patch" | "new_repo";
|
|
56
|
+
attempts?: number;
|
|
57
|
+
}): Promise<void>;
|
|
58
|
+
//# sourceMappingURL=delegationFailure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegationFailure.d.ts","sourceRoot":"","sources":["../src/delegationFailure.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,KAAK,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAI3D,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,SAAS,CAAC;AAE1D;;uCAEuC;AACvC,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,gBAAgB,GAAG,qBAAqB,GAAG,IAAI,CAIvF;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAOzE;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,YAAY,GAChB,qBAAqB,GAAG,mBAAmB,GAAG,IAAI,CAIpD;AAED;;iFAEiF;AACjF,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,YAAY,GAAG,SAAS,CAK3F;AAED;gDACgD;AAChD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa;;;;;;;;;;EA2BxF;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa;;;;;;;;;;EAgCvF;AAED;;oEAEoE;AACpE,wBAAsB,+BAA+B,CAAC,KAAK,EAAE;IAC3D,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,YAAY,CAAC;IAClB,KAAK,EAAE,aAAa,CAAC;IACrB,GAAG,EAAE,QAAQ,CAAC;IACd,KAAK,EAAE,QAAQ,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,OAAO,GAAG,UAAU,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFhB"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { makeOutcomeFacts } from "@claudexor/schema";
|
|
3
|
+
import { containsSecretLikeToken, newId, sha256 } from "@claudexor/util";
|
|
4
|
+
import { createRevertAnchorOrNull, snapshotTree } from "@claudexor/workspace";
|
|
5
|
+
import { delegationBeltToolFailure, delegationBeltUnavailable } from "./delegationToolEvidence.js";
|
|
6
|
+
import { secretDiffNextActions } from "./secretDiff.js";
|
|
7
|
+
/** One owner for the post-injection failure boundary shared by race,
|
|
8
|
+
* convergence, and attempt finalization. Runtime takes precedence if corrupt
|
|
9
|
+
* evidence ever reports both facts. */
|
|
10
|
+
export function delegationFailureKind(t) {
|
|
11
|
+
if (delegationBeltToolFailure(t))
|
|
12
|
+
return "runtime";
|
|
13
|
+
if (delegationBeltUnavailable(t))
|
|
14
|
+
return "startup";
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
export function delegationFailureError(t) {
|
|
18
|
+
const kind = delegationFailureKind(t);
|
|
19
|
+
return kind === "runtime"
|
|
20
|
+
? "delegation belt tool failed after injection"
|
|
21
|
+
: kind === "startup"
|
|
22
|
+
? "delegation belt failed to start after injection"
|
|
23
|
+
: null;
|
|
24
|
+
}
|
|
25
|
+
export function candidateFailureKind(run) {
|
|
26
|
+
return (delegationFailureKind(run.telemetry) ?? (run.secretDiffRefusal ? "artifact_security" : null));
|
|
27
|
+
}
|
|
28
|
+
/** Race-level precedence: an unrecovered injected-belt failure dominates all
|
|
29
|
+
* siblings; a safely discarded isolated secret candidate is merely ineligible,
|
|
30
|
+
* while an in-place refusal remains terminal because cleanup may be required. */
|
|
31
|
+
export function dominantRaceCandidateFailure(runs) {
|
|
32
|
+
return (runs.find((run) => delegationFailureKind(run.telemetry)) ??
|
|
33
|
+
runs.find((run) => run.secretDiffRefusal && run.secretDiffRefusal.disposition !== "discarded"));
|
|
34
|
+
}
|
|
35
|
+
/** Build the terminal cause/provenance without duplicating the race and
|
|
36
|
+
* convergence messages or raw-attempt links. */
|
|
37
|
+
export function delegationFailureTerminal(run, lane) {
|
|
38
|
+
const kind = delegationFailureKind(run.telemetry);
|
|
39
|
+
if (!kind)
|
|
40
|
+
throw new Error("delegation failure terminal requested for a healthy attempt");
|
|
41
|
+
const runtime = kind === "runtime";
|
|
42
|
+
const message = runtime
|
|
43
|
+
? lane === "race"
|
|
44
|
+
? `Delegate belt tool failed in ${run.harnessId}; no deliverable or native fallback may replace the failed injected operation`
|
|
45
|
+
: `Delegate belt tool failed in ${run.harnessId}; convergence cannot review, repair, or continue after an unrecovered injected operation fails`
|
|
46
|
+
: lane === "race"
|
|
47
|
+
? `Delegate startup failed in ${run.harnessId}; no degraded sibling may replace an injected failed belt`
|
|
48
|
+
: `Delegate startup failed in ${run.harnessId}; convergence cannot repair or continue after an injected belt fails`;
|
|
49
|
+
return {
|
|
50
|
+
phase: runtime ? "delegation_runtime" : "delegation_startup",
|
|
51
|
+
error: new Error(message),
|
|
52
|
+
metadata: {
|
|
53
|
+
category: "harness_error",
|
|
54
|
+
harnessId: run.harnessId,
|
|
55
|
+
attemptId: run.attemptId,
|
|
56
|
+
rawDetailRef: `attempts/${run.attemptId}/attempt.yaml`,
|
|
57
|
+
nextActions: [
|
|
58
|
+
`Inspect attempts/${run.attemptId}/attempt.yaml`,
|
|
59
|
+
runtime
|
|
60
|
+
? "Repair the failed Delegate belt operation, then retry the run"
|
|
61
|
+
: "Repair the required Delegate belt startup, then retry the run",
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export function candidateFailureTerminal(run, lane) {
|
|
67
|
+
const delegation = delegationFailureKind(run.telemetry);
|
|
68
|
+
if (delegation) {
|
|
69
|
+
const terminal = delegationFailureTerminal(run, lane);
|
|
70
|
+
return run.secretDiffRefusal
|
|
71
|
+
? {
|
|
72
|
+
...terminal,
|
|
73
|
+
metadata: {
|
|
74
|
+
...terminal.metadata,
|
|
75
|
+
nextActions: [
|
|
76
|
+
...secretDiffNextActions(run.secretDiffRefusal),
|
|
77
|
+
...terminal.metadata.nextActions,
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
}
|
|
81
|
+
: terminal;
|
|
82
|
+
}
|
|
83
|
+
if (!run.secretDiffRefusal)
|
|
84
|
+
throw new Error("candidate failure terminal requested without cause");
|
|
85
|
+
return {
|
|
86
|
+
phase: "artifact_security",
|
|
87
|
+
error: new Error(run.errors[0] ?? "candidate patch diff was refused by the secret fence"),
|
|
88
|
+
metadata: {
|
|
89
|
+
category: "harness_error",
|
|
90
|
+
harnessId: run.harnessId,
|
|
91
|
+
attemptId: run.attemptId,
|
|
92
|
+
rawDetailRef: `attempts/${run.attemptId}/attempt.yaml`,
|
|
93
|
+
nextActions: run.secretDiffRefusal.disposition === "manual_cleanup"
|
|
94
|
+
? ["Remove the secret-bearing in-place bytes manually", "Retry the run"]
|
|
95
|
+
: ["Retry the run without writing secret material"],
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** An explicitly in-place harness may have changed the live tree before a
|
|
100
|
+
* required Delegate failure becomes terminal. Persist those unavoidable bytes
|
|
101
|
+
* as blocked and revertable; envelope runs stay diagnostic-only. */
|
|
102
|
+
export async function persistFailedInPlaceWorkProduct(input) {
|
|
103
|
+
if (!input.live || (!input.run.diff.trim() && !input.run.secretDiffRefusal))
|
|
104
|
+
return;
|
|
105
|
+
const secretRefusal = input.run.secretDiffRefusal;
|
|
106
|
+
if (secretRefusal) {
|
|
107
|
+
const facts = makeOutcomeFacts("failed", {
|
|
108
|
+
reason: "harness_failed",
|
|
109
|
+
noChanges: secretRefusal.disposition !== "manual_cleanup",
|
|
110
|
+
});
|
|
111
|
+
const manualCleanup = secretRefusal.disposition === "manual_cleanup";
|
|
112
|
+
input.store.writeYaml(join(input.paths.finalDir, "work_product.yaml"), {
|
|
113
|
+
id: newId("wp"),
|
|
114
|
+
kind: input.kind,
|
|
115
|
+
source_task_id: input.taskId,
|
|
116
|
+
producer_attempt_id: input.run.attemptId,
|
|
117
|
+
meta: {
|
|
118
|
+
harness_id: input.run.harnessId,
|
|
119
|
+
result_kind: "none",
|
|
120
|
+
mode: input.mode,
|
|
121
|
+
...(input.attempts !== undefined ? { attempts: input.attempts } : {}),
|
|
122
|
+
lifecycle: facts.lifecycle,
|
|
123
|
+
outcome_facts: facts,
|
|
124
|
+
review_verified: false,
|
|
125
|
+
secret_diff_refused: true,
|
|
126
|
+
secret_recovery: secretRefusal.disposition,
|
|
127
|
+
recovery_detail: secretRefusal.detail,
|
|
128
|
+
adopted: manualCleanup,
|
|
129
|
+
apply_state: manualCleanup ? "applied_review_blocked" : "reverted",
|
|
130
|
+
pre_turn_sha: input.preTurnSha,
|
|
131
|
+
post_turn_sha: null,
|
|
132
|
+
revert_anchor_id: null,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
input.log.emit("work_product.emitted", {
|
|
136
|
+
winner: input.run.attemptId,
|
|
137
|
+
apply_state: manualCleanup ? "applied_review_blocked" : "reverted",
|
|
138
|
+
secret_diff_refused: true,
|
|
139
|
+
manual_cleanup_required: manualCleanup,
|
|
140
|
+
});
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (containsSecretLikeToken(input.run.diff)) {
|
|
144
|
+
throw new Error("failed in-place patch diff contains secret-like token; refusing artifact");
|
|
145
|
+
}
|
|
146
|
+
let postTurnSha = input.postTurnSha;
|
|
147
|
+
if (postTurnSha === undefined) {
|
|
148
|
+
try {
|
|
149
|
+
postTurnSha = await snapshotTree(input.execRoot);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
postTurnSha = null;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const revertAnchorId = await createRevertAnchorOrNull(input.execRoot, input.preTurnSha, postTurnSha);
|
|
156
|
+
const facts = makeOutcomeFacts("failed", { reason: "harness_failed", noChanges: false });
|
|
157
|
+
input.store.writeText(join(input.paths.finalDir, "patch.diff"), input.run.diff);
|
|
158
|
+
input.store.writeYaml(join(input.paths.finalDir, "work_product.yaml"), {
|
|
159
|
+
id: newId("wp"),
|
|
160
|
+
kind: input.kind,
|
|
161
|
+
source_task_id: input.taskId,
|
|
162
|
+
producer_attempt_id: input.run.attemptId,
|
|
163
|
+
meta: {
|
|
164
|
+
harness_id: input.run.harnessId,
|
|
165
|
+
result_kind: "patch",
|
|
166
|
+
mode: input.mode,
|
|
167
|
+
...(input.attempts !== undefined ? { attempts: input.attempts } : {}),
|
|
168
|
+
lifecycle: facts.lifecycle,
|
|
169
|
+
outcome_facts: facts,
|
|
170
|
+
review_verified: false,
|
|
171
|
+
patch_sha256: sha256(input.run.diff),
|
|
172
|
+
adopted: true,
|
|
173
|
+
apply_state: "applied_review_blocked",
|
|
174
|
+
pre_turn_sha: input.preTurnSha,
|
|
175
|
+
post_turn_sha: postTurnSha,
|
|
176
|
+
revert_anchor_id: revertAnchorId,
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
input.log.emit("work_product.emitted", {
|
|
180
|
+
winner: input.run.attemptId,
|
|
181
|
+
apply_state: "applied_review_blocked",
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=delegationFailure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegationFailure.js","sourceRoot":"","sources":["../src/delegationFailure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { HarnessEvent } from "@claudexor/schema";
|
|
2
|
+
import type { AttemptTelemetry } from "./attemptTelemetry.js";
|
|
3
|
+
/** The required belt server failed after injection. A ready/pending-but-unused
|
|
4
|
+
* belt is not unavailable; the harness remains free to solve the turn itself. */
|
|
5
|
+
export declare function delegationBeltUnavailable(t: AttemptTelemetry): boolean;
|
|
6
|
+
/** An exact injected belt operation failed and has not recovered through the
|
|
7
|
+
* same invocation success (matching non-null use id, with tool+kind+target as
|
|
8
|
+
* the compatibility fallback). INV-030 makes this a required-capability hard
|
|
9
|
+
* failure while reusing INV-043's recovery key; it does not rewrite the
|
|
10
|
+
* startup-only `delegation_belt.failed` receipt or the run-level `used` fact. */
|
|
11
|
+
export declare function delegationBeltToolFailure(t: AttemptTelemetry): boolean;
|
|
12
|
+
/** Record a non-error terminal shape that is nevertheless failure for the
|
|
13
|
+
* required belt. The caller has already proven this is the exact belt tool. */
|
|
14
|
+
export declare function recordDelegationBeltResultFailure(t: AttemptTelemetry, tool: NonNullable<HarnessEvent["tool"]>, summary: string): void;
|
|
15
|
+
/** Exact adapter-neutral belt evidence. Claude namespaces the normalized tool
|
|
16
|
+
* name as `mcp__server__tool`; Codex keeps the native tool name and records the
|
|
17
|
+
* server boundary in `target` as `server:tool`. Delimiters are mandatory so a
|
|
18
|
+
* similarly-prefixed foreign server cannot satisfy Delegate used=true. */
|
|
19
|
+
export declare function isDelegationBeltTool(tool: HarnessEvent["tool"] | undefined, serverName: string): boolean;
|
|
20
|
+
//# sourceMappingURL=delegationToolEvidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegationToolEvidence.d.ts","sourceRoot":"","sources":["../src/delegationToolEvidence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;iFACiF;AACjF,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAEtE;AAED;;;;iFAIiF;AACjF,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAgBtE;AAED;+EAC+E;AAC/E,wBAAgB,iCAAiC,CAC/C,CAAC,EAAE,gBAAgB,EACnB,IAAI,EAAE,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EACvC,OAAO,EAAE,MAAM,GACd,IAAI,CASN;AAED;;;0EAG0E;AAC1E,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,SAAS,EACtC,UAAU,EAAE,MAAM,GACjB,OAAO,CAMT"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** The required belt server failed after injection. A ready/pending-but-unused
|
|
2
|
+
* belt is not unavailable; the harness remains free to solve the turn itself. */
|
|
3
|
+
export function delegationBeltUnavailable(t) {
|
|
4
|
+
return t.delegationBelt.requested && t.delegationBelt.failed;
|
|
5
|
+
}
|
|
6
|
+
/** An exact injected belt operation failed and has not recovered through the
|
|
7
|
+
* same invocation success (matching non-null use id, with tool+kind+target as
|
|
8
|
+
* the compatibility fallback). INV-030 makes this a required-capability hard
|
|
9
|
+
* failure while reusing INV-043's recovery key; it does not rewrite the
|
|
10
|
+
* startup-only `delegation_belt.failed` receipt or the run-level `used` fact. */
|
|
11
|
+
export function delegationBeltToolFailure(t) {
|
|
12
|
+
if (!t.delegationBelt.requested)
|
|
13
|
+
return false;
|
|
14
|
+
const serverName = t.delegationBelt.serverName;
|
|
15
|
+
if (!serverName)
|
|
16
|
+
return false;
|
|
17
|
+
return t.toolErrors.some((error) => !error.recovered &&
|
|
18
|
+
isDelegationBeltTool({
|
|
19
|
+
name: error.tool,
|
|
20
|
+
kind: error.kind,
|
|
21
|
+
...(error.target !== null ? { target: error.target } : {}),
|
|
22
|
+
}, serverName));
|
|
23
|
+
}
|
|
24
|
+
/** Record a non-error terminal shape that is nevertheless failure for the
|
|
25
|
+
* required belt. The caller has already proven this is the exact belt tool. */
|
|
26
|
+
export function recordDelegationBeltResultFailure(t, tool, summary) {
|
|
27
|
+
t.toolErrors.push({
|
|
28
|
+
tool: tool.name,
|
|
29
|
+
kind: tool.kind,
|
|
30
|
+
target: tool.target ?? null,
|
|
31
|
+
summary,
|
|
32
|
+
toolUseId: tool.use_id ?? null,
|
|
33
|
+
recovered: false,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/** Exact adapter-neutral belt evidence. Claude namespaces the normalized tool
|
|
37
|
+
* name as `mcp__server__tool`; Codex keeps the native tool name and records the
|
|
38
|
+
* server boundary in `target` as `server:tool`. Delimiters are mandatory so a
|
|
39
|
+
* similarly-prefixed foreign server cannot satisfy Delegate used=true. */
|
|
40
|
+
export function isDelegationBeltTool(tool, serverName) {
|
|
41
|
+
if (!tool || tool.kind !== "mcp")
|
|
42
|
+
return false;
|
|
43
|
+
return (tool.name.startsWith(`mcp__${serverName}__`) ||
|
|
44
|
+
(typeof tool.target === "string" && tool.target.startsWith(`${serverName}:`)));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=delegationToolEvidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegationToolEvidence.js","sourceRoot":"","sources":["../src/delegationToolEvidence.ts"],"names":[],"mappings":"AAGA;iFACiF;AACjF,MAAM,UAAU,yBAAyB,CAAC,CAAmB;IAC3D,OAAO,CAAC,CAAC,cAAc,CAAC,SAAS,IAAI,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC;AAC/D,CAAC;AAED;;;;iFAIiF;AACjF,MAAM,UAAU,yBAAyB,CAAC,CAAmB;IAC3D,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC9C,MAAM,UAAU,GAAG,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC;IAC/C,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAC9B,OAAO,CAAC,CAAC,UAAU,CAAC,IAAI,CACtB,CAAC,KAAK,EAAE,EAAE,CACR,CAAC,KAAK,CAAC,SAAS;QAChB,oBAAoB,CAClB;YACE,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3D,EACD,UAAU,CACX,CACJ,CAAC;AACJ,CAAC;AAED;+EAC+E;AAC/E,MAAM,UAAU,iCAAiC,CAC/C,CAAmB,EACnB,IAAuC,EACvC,OAAe;IAEf,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QAChB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;QAC3B,OAAO;QACP,SAAS,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;QAC9B,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC;AACL,CAAC;AAED;;;0EAG0E;AAC1E,MAAM,UAAU,oBAAoB,CAClC,IAAsC,EACtC,UAAkB;IAElB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAC/C,OAAO,CACL,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,UAAU,IAAI,CAAC;QAC5C,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC,CAC9E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run-preflight effort gate (INV-105), the effort analog of `modelGovernance`.
|
|
3
|
+
*
|
|
4
|
+
* This gate DISCLOSES, it does not clamp. It answers exactly one question:
|
|
5
|
+
* does the harness's merged advertised ladder (`capabilities.effort_levels`,
|
|
6
|
+
* the positional merge of its models' vendor-ordered lists) know this level at
|
|
7
|
+
* all? A level the merged ladder has never seen is disclosed as ignored — the
|
|
8
|
+
* adapter would otherwise just omit the flag and the user would never learn
|
|
9
|
+
* their level went nowhere. A level the ladder DOES know rides through
|
|
10
|
+
* VERBATIM and is resolved by the adapter.
|
|
11
|
+
*
|
|
12
|
+
* Why the clamp lives downstream and not here: the manifest is discovered
|
|
13
|
+
* ONCE, against the DEFAULT native harness home (`discover()` takes no
|
|
14
|
+
* arguments), so its ladders describe the DEFAULT account's catalog. Codex
|
|
15
|
+
* advertises its ladders per ACCOUNT — every credential profile and API-key
|
|
16
|
+
* route gets its own `CODEX_HOME`, and `model/list` answers for whoever that
|
|
17
|
+
* home is logged into. Clamping here would therefore hold a profile-scoped run
|
|
18
|
+
* to another account's ceiling. The adapter re-resolves against the catalog
|
|
19
|
+
* for the env the child will ACTUALLY run in (`codexEffortsForEnv`), so it is
|
|
20
|
+
* the only layer entitled to clamp — and clamping is only ever a move INSIDE
|
|
21
|
+
* the vendor's own order, which only the adapter's resolved catalog carries.
|
|
22
|
+
*
|
|
23
|
+
* The membership test runs against the harness-wide merged ladder rather than
|
|
24
|
+
* the per-model narrowing, because the ladder is the broadest and least
|
|
25
|
+
* account-specific signal the manifest carries: a level any of the harness's
|
|
26
|
+
* models advertises is in it, so this gate cannot reject a level merely
|
|
27
|
+
* because the routed model's copy happens not to list it.
|
|
28
|
+
*/
|
|
29
|
+
import type { EffortHint } from "@claudexor/schema";
|
|
30
|
+
export interface EffortGovernedRoute {
|
|
31
|
+
id: string;
|
|
32
|
+
/** Harness-wide merged advertised ladder; empty = effort is not a tunable surface. */
|
|
33
|
+
effortLevels: readonly EffortHint[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The effort this route should FORWARD, plus any disclosure text.
|
|
37
|
+
* `effort: null` means "send no flag" — either nothing was asked for, or what
|
|
38
|
+
* was asked for could not be honored anywhere and is disclosed instead.
|
|
39
|
+
*
|
|
40
|
+
* A returned level is the RAW request, deliberately un-clamped: it is the
|
|
41
|
+
* adapter's `effort_hint`, and every adapter that consumes it resolves through
|
|
42
|
+
* the shared normalizer against its own profile-resolved advertised set
|
|
43
|
+
* (`normalizeEffort` in harness-claude, `codexEffortFor` in harness-codex).
|
|
44
|
+
*/
|
|
45
|
+
export declare function governRouteEffort(requested: EffortHint | null, route: EffortGovernedRoute): {
|
|
46
|
+
effort: EffortHint | null;
|
|
47
|
+
ignored: string | null;
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=effortGovernance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effortGovernance.d.ts","sourceRoot":"","sources":["../src/effortGovernance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,sFAAsF;IACtF,YAAY,EAAE,SAAS,UAAU,EAAE,CAAC;CACrC;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,UAAU,GAAG,IAAI,EAC5B,KAAK,EAAE,mBAAmB,GACzB;IAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAuBvD"}
|