@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.
Files changed (83) hide show
  1. package/dist/attemptFinalize.d.ts +200 -0
  2. package/dist/attemptFinalize.d.ts.map +1 -0
  3. package/dist/attemptFinalize.js +412 -0
  4. package/dist/attemptFinalize.js.map +1 -0
  5. package/dist/attemptTelemetry.d.ts +88 -7
  6. package/dist/attemptTelemetry.d.ts.map +1 -1
  7. package/dist/attemptTelemetry.js +276 -14
  8. package/dist/attemptTelemetry.js.map +1 -1
  9. package/dist/budgetFailure.d.ts +70 -0
  10. package/dist/budgetFailure.d.ts.map +1 -0
  11. package/dist/budgetFailure.js +114 -0
  12. package/dist/budgetFailure.js.map +1 -0
  13. package/dist/candidateEvidence.d.ts +55 -1
  14. package/dist/candidateEvidence.d.ts.map +1 -1
  15. package/dist/candidateEvidence.js +72 -0
  16. package/dist/candidateEvidence.js.map +1 -1
  17. package/dist/continuation.d.ts +77 -0
  18. package/dist/continuation.d.ts.map +1 -0
  19. package/dist/continuation.js +92 -0
  20. package/dist/continuation.js.map +1 -0
  21. package/dist/deepScanReducer.d.ts +148 -0
  22. package/dist/deepScanReducer.d.ts.map +1 -0
  23. package/dist/deepScanReducer.js +348 -0
  24. package/dist/deepScanReducer.js.map +1 -0
  25. package/dist/effortGovernance.d.ts +49 -0
  26. package/dist/effortGovernance.d.ts.map +1 -0
  27. package/dist/effortGovernance.js +35 -0
  28. package/dist/effortGovernance.js.map +1 -0
  29. package/dist/harnessFailure.d.ts +27 -0
  30. package/dist/harnessFailure.d.ts.map +1 -0
  31. package/dist/harnessFailure.js +61 -0
  32. package/dist/harnessFailure.js.map +1 -0
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js.map +1 -1
  36. package/dist/orchestrator.d.ts +103 -16
  37. package/dist/orchestrator.d.ts.map +1 -1
  38. package/dist/orchestrator.js +1245 -327
  39. package/dist/orchestrator.js.map +1 -1
  40. package/dist/planQuestions.d.ts.map +1 -1
  41. package/dist/planQuestions.js +105 -50
  42. package/dist/planQuestions.js.map +1 -1
  43. package/dist/planRun.d.ts +15 -7
  44. package/dist/planRun.d.ts.map +1 -1
  45. package/dist/planRun.js +88 -42
  46. package/dist/planRun.js.map +1 -1
  47. package/dist/planTerminal.d.ts +36 -0
  48. package/dist/planTerminal.d.ts.map +1 -0
  49. package/dist/planTerminal.js +63 -0
  50. package/dist/planTerminal.js.map +1 -0
  51. package/dist/reviewerPanel.d.ts +4 -0
  52. package/dist/reviewerPanel.d.ts.map +1 -1
  53. package/dist/reviewerPanel.js +54 -9
  54. package/dist/reviewerPanel.js.map +1 -1
  55. package/dist/revisePrompt.d.ts +17 -0
  56. package/dist/revisePrompt.d.ts.map +1 -0
  57. package/dist/revisePrompt.js +15 -0
  58. package/dist/revisePrompt.js.map +1 -0
  59. package/dist/runSupport.d.ts +67 -2
  60. package/dist/runSupport.d.ts.map +1 -1
  61. package/dist/runSupport.js +86 -6
  62. package/dist/runSupport.js.map +1 -1
  63. package/dist/runTelemetryWriter.d.ts +6 -1
  64. package/dist/runTelemetryWriter.d.ts.map +1 -1
  65. package/dist/runTelemetryWriter.js +2 -0
  66. package/dist/runTelemetryWriter.js.map +1 -1
  67. package/dist/runTerminals.d.ts +15 -4
  68. package/dist/runTerminals.d.ts.map +1 -1
  69. package/dist/runTerminals.js +16 -1
  70. package/dist/runTerminals.js.map +1 -1
  71. package/dist/structuredOutput.d.ts +27 -0
  72. package/dist/structuredOutput.d.ts.map +1 -1
  73. package/dist/structuredOutput.js +65 -7
  74. package/dist/structuredOutput.js.map +1 -1
  75. package/dist/transientClassify.d.ts +59 -0
  76. package/dist/transientClassify.d.ts.map +1 -0
  77. package/dist/transientClassify.js +109 -0
  78. package/dist/transientClassify.js.map +1 -0
  79. package/dist/write-isolation.d.ts +11 -0
  80. package/dist/write-isolation.d.ts.map +1 -0
  81. package/dist/write-isolation.js +13 -0
  82. package/dist/write-isolation.js.map +1 -0
  83. 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":"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"}
@@ -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.0.4",
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/arbitration": "3.0.4",
21
- "@claudexor/budget": "3.0.4",
22
- "@claudexor/config": "3.0.4",
23
- "@claudexor/context": "3.0.4",
24
- "@claudexor/artifact-store": "3.0.4",
25
- "@claudexor/core": "3.0.4",
26
- "@claudexor/delivery": "3.0.4",
27
- "@claudexor/event-log": "3.0.4",
28
- "@claudexor/gateway": "3.0.4",
29
- "@claudexor/review": "3.0.4",
30
- "@claudexor/policy": "3.0.4",
31
- "@claudexor/schema": "3.0.4",
32
- "@claudexor/synthesis": "3.0.4",
33
- "@claudexor/workspace": "3.0.4",
34
- "@claudexor/util": "3.0.4"
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.0.4"
37
+ "@claudexor/harness-fake": "3.1.1"
38
38
  },
39
39
  "repository": {
40
40
  "type": "git",