@claudexor/orchestrator 3.0.4 → 3.1.1
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 +200 -0
- package/dist/attemptFinalize.d.ts.map +1 -0
- package/dist/attemptFinalize.js +412 -0
- package/dist/attemptFinalize.js.map +1 -0
- package/dist/attemptTelemetry.d.ts +88 -7
- package/dist/attemptTelemetry.d.ts.map +1 -1
- package/dist/attemptTelemetry.js +276 -14
- package/dist/attemptTelemetry.js.map +1 -1
- package/dist/budgetFailure.d.ts +70 -0
- package/dist/budgetFailure.d.ts.map +1 -0
- package/dist/budgetFailure.js +114 -0
- package/dist/budgetFailure.js.map +1 -0
- package/dist/candidateEvidence.d.ts +55 -1
- package/dist/candidateEvidence.d.ts.map +1 -1
- package/dist/candidateEvidence.js +72 -0
- package/dist/candidateEvidence.js.map +1 -1
- package/dist/continuation.d.ts +77 -0
- package/dist/continuation.d.ts.map +1 -0
- package/dist/continuation.js +92 -0
- package/dist/continuation.js.map +1 -0
- package/dist/deepScanReducer.d.ts +148 -0
- package/dist/deepScanReducer.d.ts.map +1 -0
- package/dist/deepScanReducer.js +348 -0
- package/dist/deepScanReducer.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/harnessFailure.d.ts +27 -0
- package/dist/harnessFailure.d.ts.map +1 -0
- package/dist/harnessFailure.js +61 -0
- package/dist/harnessFailure.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/orchestrator.d.ts +103 -16
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +1245 -327
- package/dist/orchestrator.js.map +1 -1
- package/dist/planQuestions.d.ts.map +1 -1
- package/dist/planQuestions.js +105 -50
- package/dist/planQuestions.js.map +1 -1
- package/dist/planRun.d.ts +15 -7
- package/dist/planRun.d.ts.map +1 -1
- package/dist/planRun.js +88 -42
- package/dist/planRun.js.map +1 -1
- package/dist/planTerminal.d.ts +36 -0
- package/dist/planTerminal.d.ts.map +1 -0
- package/dist/planTerminal.js +63 -0
- package/dist/planTerminal.js.map +1 -0
- 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/runSupport.d.ts +67 -2
- package/dist/runSupport.d.ts.map +1 -1
- package/dist/runSupport.js +86 -6
- package/dist/runSupport.js.map +1 -1
- package/dist/runTelemetryWriter.d.ts +6 -1
- package/dist/runTelemetryWriter.d.ts.map +1 -1
- package/dist/runTelemetryWriter.js +2 -0
- package/dist/runTelemetryWriter.js.map +1 -1
- package/dist/runTerminals.d.ts +15 -4
- package/dist/runTerminals.d.ts.map +1 -1
- package/dist/runTerminals.js +16 -1
- package/dist/runTerminals.js.map +1 -1
- package/dist/structuredOutput.d.ts +27 -0
- package/dist/structuredOutput.d.ts.map +1 -1
- package/dist/structuredOutput.js +65 -7
- package/dist/structuredOutput.js.map +1 -1
- package/dist/transientClassify.d.ts +59 -0
- package/dist/transientClassify.d.ts.map +1 -0
- package/dist/transientClassify.js +109 -0
- package/dist/transientClassify.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,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a classified category admits a bounded stream retry. Only failures
|
|
3
|
+
* the adapter DISCLOSED mid-stream as recoverable (a typed transient or a rate
|
|
4
|
+
* limit) are retried — retrying replays the work with a fresh session. Auth /
|
|
5
|
+
* capability / config are deterministic refusals. A process crash and an
|
|
6
|
+
* inactivity-watchdog give-up are NOT auto-retried here (the watchdog exists to
|
|
7
|
+
* STOP a wedged stream; a crashed child is settled, not replayed): they are
|
|
8
|
+
* still classified and disclosed, but the run terminates on them.
|
|
9
|
+
*/
|
|
10
|
+
const CATEGORY_RETRYABLE = {
|
|
11
|
+
timeout: true,
|
|
12
|
+
rate_limited: true,
|
|
13
|
+
unknown_harness_error: true,
|
|
14
|
+
process_crash: false,
|
|
15
|
+
auth_failed: false,
|
|
16
|
+
capability_refused: false,
|
|
17
|
+
config_error: false,
|
|
18
|
+
};
|
|
19
|
+
function observation(category, extra = {}) {
|
|
20
|
+
return {
|
|
21
|
+
kind: extra.kind ?? "unknown",
|
|
22
|
+
category,
|
|
23
|
+
retryable: CATEGORY_RETRYABLE[category],
|
|
24
|
+
retryDelayMs: extra.retryDelayMs ?? null,
|
|
25
|
+
httpStatus: extra.httpStatus ?? null,
|
|
26
|
+
signal: extra.signal ?? null,
|
|
27
|
+
adapterCode: extra.adapterCode ?? null,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** A typed `transient` signal: a `timeout` kind is the timeout category; every
|
|
31
|
+
* other adapter-declared transient is a generic retryable harness error. */
|
|
32
|
+
export function classifyTransientSignal(t) {
|
|
33
|
+
const category = t.kind === "timeout" ? "timeout" : "unknown_harness_error";
|
|
34
|
+
return observation(category, { kind: t.kind, retryDelayMs: t.retry_delay_ms ?? null });
|
|
35
|
+
}
|
|
36
|
+
/** A typed `rate_limit` signal is a first-class transient category (not only a
|
|
37
|
+
* W5.4 rotation signal). */
|
|
38
|
+
export function classifyRateLimit(retryDelayMs) {
|
|
39
|
+
return observation("rate_limited", { retryDelayMs });
|
|
40
|
+
}
|
|
41
|
+
/** Map the vendor's typed `status.error_category` onto the taxonomy. Only the
|
|
42
|
+
* deterministic FAILURE classes are surfaced here; rate limits arrive via the
|
|
43
|
+
* dedicated `rate_limit` signal, and transient/overload retries the vendor
|
|
44
|
+
* drives itself are not our failures (returns null → not recorded). */
|
|
45
|
+
export function classifyStatusError(ec, retryDelayMs) {
|
|
46
|
+
let category;
|
|
47
|
+
switch (ec) {
|
|
48
|
+
case "authentication_failed":
|
|
49
|
+
category = "auth_failed";
|
|
50
|
+
break;
|
|
51
|
+
case "oauth_org_not_allowed":
|
|
52
|
+
case "model_not_found":
|
|
53
|
+
category = "capability_refused";
|
|
54
|
+
break;
|
|
55
|
+
case "billing_error":
|
|
56
|
+
case "invalid_request":
|
|
57
|
+
case "max_output_tokens":
|
|
58
|
+
category = "config_error";
|
|
59
|
+
break;
|
|
60
|
+
default:
|
|
61
|
+
// rate_limit/overloaded/server_error/unknown: not surfaced from status.
|
|
62
|
+
category = null;
|
|
63
|
+
}
|
|
64
|
+
if (!category)
|
|
65
|
+
return null;
|
|
66
|
+
return observation(category, { retryDelayMs, adapterCode: ec });
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Classify a process crash from the run loop's TYPED `completed` payload
|
|
70
|
+
* (never prose): a spawn failure is a config/environment error (retrying
|
|
71
|
+
* replays the same missing binary/bad config); a non-aborted signal kill or
|
|
72
|
+
* non-zero exit is a settled crash. An aborted completion (our watchdog/cancel)
|
|
73
|
+
* is never a crash. Returns null when the completion carries no crash evidence.
|
|
74
|
+
*/
|
|
75
|
+
export function classifyCompletedCrash(payload) {
|
|
76
|
+
if (!payload || payload["aborted"])
|
|
77
|
+
return null;
|
|
78
|
+
const spawnFailed = payload["spawn_failed"] === true;
|
|
79
|
+
const signal = typeof payload["exit_signal"] === "string" ? payload["exit_signal"] : null;
|
|
80
|
+
const exitCode = typeof payload["exit_code"] === "number" ? payload["exit_code"] : null;
|
|
81
|
+
if (spawnFailed) {
|
|
82
|
+
return observation("config_error", { signal, adapterCode: "spawn_failed" });
|
|
83
|
+
}
|
|
84
|
+
if (signal !== null || (exitCode !== null && exitCode !== 0)) {
|
|
85
|
+
return observation("process_crash", {
|
|
86
|
+
signal,
|
|
87
|
+
adapterCode: exitCode !== null ? `exit_${exitCode}` : null,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Classify an adapter/stream throw. The inactivity watchdog surfaces a typed
|
|
94
|
+
* `HarnessInactivityTimeoutError` (timeout); every other throw is a process
|
|
95
|
+
* crash. A THROWN failure is a give-up, not a mid-stream recoverable transient:
|
|
96
|
+
* the watchdog already aborted a wedged stream and a crashed child is settled,
|
|
97
|
+
* so it is classified and disclosed but never auto-retried here (preserving the
|
|
98
|
+
* pre-#31 terminate-on-throw behavior). Never parses prose — `errorName` is the
|
|
99
|
+
* constructor name.
|
|
100
|
+
*/
|
|
101
|
+
export function classifyAdapterThrow(opts) {
|
|
102
|
+
const isTimeout = opts.errorName === "HarnessInactivityTimeoutError";
|
|
103
|
+
const base = observation(isTimeout ? "timeout" : "process_crash", {
|
|
104
|
+
kind: isTimeout ? "timeout" : "unknown",
|
|
105
|
+
signal: opts.signal ?? null,
|
|
106
|
+
});
|
|
107
|
+
return { ...base, retryable: false };
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=transientClassify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transientClassify.js","sourceRoot":"","sources":["../src/transientClassify.ts"],"names":[],"mappings":"AA4BA;;;;;;;;GAQG;AACH,MAAM,kBAAkB,GAA4C;IAClE,OAAO,EAAE,IAAI;IACb,YAAY,EAAE,IAAI;IAClB,qBAAqB,EAAE,IAAI;IAC3B,aAAa,EAAE,KAAK;IACpB,WAAW,EAAE,KAAK;IAClB,kBAAkB,EAAE,KAAK;IACzB,YAAY,EAAE,KAAK;CACpB,CAAC;AAEF,SAAS,WAAW,CAClB,QAAgC,EAChC,QAA8E,EAAE;IAEhF,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,SAAS;QAC7B,QAAQ;QACR,SAAS,EAAE,kBAAkB,CAAC,QAAQ,CAAC;QACvC,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,IAAI;QACxC,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI;QACpC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;QAC5B,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;KACvC,CAAC;AACJ,CAAC;AAED;4EAC4E;AAC5E,MAAM,UAAU,uBAAuB,CACrC,CAAyC;IAEzC,MAAM,QAAQ,GACZ,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,uBAAuB,CAAC;IAC7D,OAAO,WAAW,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,cAAc,IAAI,IAAI,EAAE,CAAC,CAAC;AACzF,CAAC;AAED;4BAC4B;AAC5B,MAAM,UAAU,iBAAiB,CAAC,YAA2B;IAC3D,OAAO,WAAW,CAAC,cAAc,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;AACvD,CAAC;AAED;;;uEAGuE;AACvE,MAAM,UAAU,mBAAmB,CACjC,EAAsE,EACtE,YAA2B;IAE3B,IAAI,QAAuC,CAAC;IAC5C,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,uBAAuB;YAC1B,QAAQ,GAAG,aAAa,CAAC;YACzB,MAAM;QACR,KAAK,uBAAuB,CAAC;QAC7B,KAAK,iBAAiB;YACpB,QAAQ,GAAG,oBAAoB,CAAC;YAChC,MAAM;QACR,KAAK,eAAe,CAAC;QACrB,KAAK,iBAAiB,CAAC;QACvB,KAAK,mBAAmB;YACtB,QAAQ,GAAG,cAAc,CAAC;YAC1B,MAAM;QACR;YACE,wEAAwE;YACxE,QAAQ,GAAG,IAAI,CAAC;IACpB,CAAC;IACD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,OAAO,WAAW,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;AAClE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAA4C;IAE5C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACrD,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1F,MAAM,QAAQ,GAAG,OAAO,OAAO,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxF,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,WAAW,CAAC,eAAe,EAAE;YAClC,MAAM;YACN,WAAW,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI;SAC3D,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAGpC;IACC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,KAAK,+BAA+B,CAAC;IACrE,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,EAAE;QAChE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QACvC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;KAC5B,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ModeKind } from "@claudexor/schema";
|
|
2
|
+
/** Refuse restriction policies that a live-tree write cannot contain. */
|
|
3
|
+
export declare function assertWriteIsolation(input: {
|
|
4
|
+
mode: ModeKind;
|
|
5
|
+
protectedPaths: readonly string[];
|
|
6
|
+
denyPaths?: readonly string[];
|
|
7
|
+
inPlace?: boolean;
|
|
8
|
+
repoRoot: string;
|
|
9
|
+
executionRoot: string;
|
|
10
|
+
}): void;
|
|
11
|
+
//# sourceMappingURL=write-isolation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-isolation.d.ts","sourceRoot":"","sources":["../src/write-isolation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlD,yEAAyE;AACzE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,IAAI,EAAE,QAAQ,CAAC;IACf,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,IAAI,CAcP"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { canonicalProjectRoot } from "@claudexor/util";
|
|
2
|
+
/** Refuse restriction policies that a live-tree write cannot contain. */
|
|
3
|
+
export function assertWriteIsolation(input) {
|
|
4
|
+
const liveProject = input.inPlace === true &&
|
|
5
|
+
canonicalProjectRoot(input.executionRoot) === canonicalProjectRoot(input.repoRoot);
|
|
6
|
+
if (input.mode === "agent" && input.protectedPaths.length > 0 && liveProject) {
|
|
7
|
+
throw new Error("project protected_paths require an isolated execution root before an agent run can mutate files; use an isolated thread or drop --in-place");
|
|
8
|
+
}
|
|
9
|
+
if ((input.denyPaths?.length ?? 0) > 0 && input.inPlace === true) {
|
|
10
|
+
throw new Error("denyPaths requires an isolated/envelope run: the post-diff policy gate blocks a violating patch before delivery, which an in-place run cannot guarantee; drop --deny-path or run isolated");
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=write-isolation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-isolation.js","sourceRoot":"","sources":["../src/write-isolation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,yEAAyE;AACzE,MAAM,UAAU,oBAAoB,CAAC,KAOpC;IACC,MAAM,WAAW,GACf,KAAK,CAAC,OAAO,KAAK,IAAI;QACtB,oBAAoB,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrF,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,EAAE,CAAC;QAC7E,MAAM,IAAI,KAAK,CACb,4IAA4I,CAC7I,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CACb,2LAA2L,CAC5L,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@claudexor/orchestrator",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Hub that composes all subsystems and implements the three canonical intents (ask, plan, agent) with their strategy flags (ask deep-scan, plan solo/council, agent best-of-N race, attempt caps, until-clean, create, delegate).",
|
|
6
6
|
"type": "module",
|
|
@@ -17,24 +17,24 @@
|
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"ajv": "^8.20.0",
|
|
20
|
-
"@claudexor/
|
|
21
|
-
"@claudexor/
|
|
22
|
-
"@claudexor/
|
|
23
|
-
"@claudexor/
|
|
24
|
-
"@claudexor/
|
|
25
|
-
"@claudexor/core": "3.
|
|
26
|
-
"@claudexor/delivery": "3.
|
|
27
|
-
"@claudexor/event-log": "3.
|
|
28
|
-
"@claudexor/gateway": "3.
|
|
29
|
-
"@claudexor/
|
|
30
|
-
"@claudexor/
|
|
31
|
-
"@claudexor/schema": "3.
|
|
32
|
-
"@claudexor/synthesis": "3.
|
|
33
|
-
"@claudexor/
|
|
34
|
-
"@claudexor/
|
|
20
|
+
"@claudexor/artifact-store": "3.1.1",
|
|
21
|
+
"@claudexor/arbitration": "3.1.1",
|
|
22
|
+
"@claudexor/budget": "3.1.1",
|
|
23
|
+
"@claudexor/config": "3.1.1",
|
|
24
|
+
"@claudexor/context": "3.1.1",
|
|
25
|
+
"@claudexor/core": "3.1.1",
|
|
26
|
+
"@claudexor/delivery": "3.1.1",
|
|
27
|
+
"@claudexor/event-log": "3.1.1",
|
|
28
|
+
"@claudexor/gateway": "3.1.1",
|
|
29
|
+
"@claudexor/policy": "3.1.1",
|
|
30
|
+
"@claudexor/review": "3.1.1",
|
|
31
|
+
"@claudexor/schema": "3.1.1",
|
|
32
|
+
"@claudexor/synthesis": "3.1.1",
|
|
33
|
+
"@claudexor/util": "3.1.1",
|
|
34
|
+
"@claudexor/workspace": "3.1.1"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@claudexor/harness-fake": "3.
|
|
37
|
+
"@claudexor/harness-fake": "3.1.1"
|
|
38
38
|
},
|
|
39
39
|
"repository": {
|
|
40
40
|
"type": "git",
|