@claudexor/orchestrator 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.
Files changed (173) hide show
  1. package/dist/attemptFinalize.d.ts +14 -11
  2. package/dist/attemptFinalize.d.ts.map +1 -1
  3. package/dist/attemptFinalize.js +41 -14
  4. package/dist/attemptFinalize.js.map +1 -1
  5. package/dist/attemptTelemetry.d.ts +16 -20
  6. package/dist/attemptTelemetry.d.ts.map +1 -1
  7. package/dist/attemptTelemetry.js +38 -70
  8. package/dist/attemptTelemetry.js.map +1 -1
  9. package/dist/attemptUsageCost.d.ts +47 -0
  10. package/dist/attemptUsageCost.d.ts.map +1 -0
  11. package/dist/attemptUsageCost.js +191 -0
  12. package/dist/attemptUsageCost.js.map +1 -0
  13. package/dist/budgetFailure.d.ts +3 -1
  14. package/dist/budgetFailure.d.ts.map +1 -1
  15. package/dist/budgetFailure.js.map +1 -1
  16. package/dist/candidateEvidence.d.ts +5 -0
  17. package/dist/candidateEvidence.d.ts.map +1 -1
  18. package/dist/candidateEvidence.js +3 -1
  19. package/dist/candidateEvidence.js.map +1 -1
  20. package/dist/candidateOutputs.d.ts +19 -0
  21. package/dist/candidateOutputs.d.ts.map +1 -1
  22. package/dist/candidateOutputs.js +201 -67
  23. package/dist/candidateOutputs.js.map +1 -1
  24. package/dist/credential-profile-rotation.d.ts +145 -0
  25. package/dist/credential-profile-rotation.d.ts.map +1 -0
  26. package/dist/credential-profile-rotation.js +315 -0
  27. package/dist/credential-profile-rotation.js.map +1 -0
  28. package/dist/credential-profiles.d.ts +35 -134
  29. package/dist/credential-profiles.d.ts.map +1 -1
  30. package/dist/credential-profiles.js +73 -295
  31. package/dist/credential-profiles.js.map +1 -1
  32. package/dist/decisionBudget.d.ts +43 -0
  33. package/dist/decisionBudget.d.ts.map +1 -0
  34. package/dist/decisionBudget.js +84 -0
  35. package/dist/decisionBudget.js.map +1 -0
  36. package/dist/decisionTerminalReconciliation.d.ts +18 -0
  37. package/dist/decisionTerminalReconciliation.d.ts.map +1 -0
  38. package/dist/decisionTerminalReconciliation.js +26 -0
  39. package/dist/decisionTerminalReconciliation.js.map +1 -0
  40. package/dist/deepScanReducer.d.ts +14 -44
  41. package/dist/deepScanReducer.d.ts.map +1 -1
  42. package/dist/deepScanReducer.js +240 -128
  43. package/dist/deepScanReducer.js.map +1 -1
  44. package/dist/delegation-parent-activation.d.ts +6 -0
  45. package/dist/delegation-parent-activation.d.ts.map +1 -0
  46. package/dist/delegation-parent-activation.js +13 -0
  47. package/dist/delegation-parent-activation.js.map +1 -0
  48. package/dist/delegationBudgetAuthority.d.ts +30 -0
  49. package/dist/delegationBudgetAuthority.d.ts.map +1 -0
  50. package/dist/delegationBudgetAuthority.js +157 -0
  51. package/dist/delegationBudgetAuthority.js.map +1 -0
  52. package/dist/delegationFailure.d.ts +58 -0
  53. package/dist/delegationFailure.d.ts.map +1 -0
  54. package/dist/delegationFailure.js +184 -0
  55. package/dist/delegationFailure.js.map +1 -0
  56. package/dist/delegationToolEvidence.d.ts +20 -0
  57. package/dist/delegationToolEvidence.d.ts.map +1 -0
  58. package/dist/delegationToolEvidence.js +46 -0
  59. package/dist/delegationToolEvidence.js.map +1 -0
  60. package/dist/git-precondition.d.ts +11 -0
  61. package/dist/git-precondition.d.ts.map +1 -0
  62. package/dist/git-precondition.js +69 -0
  63. package/dist/git-precondition.js.map +1 -0
  64. package/dist/index.d.ts +3 -1
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +3 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/interaction.d.ts +14 -6
  69. package/dist/interaction.d.ts.map +1 -1
  70. package/dist/interaction.js +106 -19
  71. package/dist/interaction.js.map +1 -1
  72. package/dist/orchestrator.d.ts +62 -115
  73. package/dist/orchestrator.d.ts.map +1 -1
  74. package/dist/orchestrator.js +671 -965
  75. package/dist/orchestrator.js.map +1 -1
  76. package/dist/plan-prompt.d.ts +3 -0
  77. package/dist/plan-prompt.d.ts.map +1 -0
  78. package/dist/plan-prompt.js +28 -0
  79. package/dist/plan-prompt.js.map +1 -0
  80. package/dist/planBrief.d.ts +27 -0
  81. package/dist/planBrief.d.ts.map +1 -0
  82. package/dist/planBrief.js +42 -0
  83. package/dist/planBrief.js.map +1 -0
  84. package/dist/planRun.d.ts +4 -3
  85. package/dist/planRun.d.ts.map +1 -1
  86. package/dist/planRun.js +33 -33
  87. package/dist/planRun.js.map +1 -1
  88. package/dist/plannerAttempt.d.ts +64 -0
  89. package/dist/plannerAttempt.d.ts.map +1 -0
  90. package/dist/plannerAttempt.js +235 -0
  91. package/dist/plannerAttempt.js.map +1 -0
  92. package/dist/policyFindings.js.map +1 -1
  93. package/dist/requestRequirements.d.ts +45 -1
  94. package/dist/requestRequirements.d.ts.map +1 -1
  95. package/dist/requestRequirements.js +158 -11
  96. package/dist/requestRequirements.js.map +1 -1
  97. package/dist/reviewerPanel.js.map +1 -1
  98. package/dist/root-ledger.d.ts +13 -0
  99. package/dist/root-ledger.d.ts.map +1 -0
  100. package/dist/root-ledger.js +21 -0
  101. package/dist/root-ledger.js.map +1 -0
  102. package/dist/routing-failure.d.ts +6 -0
  103. package/dist/routing-failure.d.ts.map +1 -0
  104. package/dist/routing-failure.js +12 -0
  105. package/dist/routing-failure.js.map +1 -0
  106. package/dist/run-bounded.d.ts +3 -0
  107. package/dist/run-bounded.d.ts.map +1 -0
  108. package/dist/run-bounded.js +23 -0
  109. package/dist/run-bounded.js.map +1 -0
  110. package/dist/run-input-resolution.d.ts +10 -0
  111. package/dist/run-input-resolution.d.ts.map +1 -0
  112. package/dist/run-input-resolution.js +88 -0
  113. package/dist/run-input-resolution.js.map +1 -0
  114. package/dist/runEventLog.d.ts +48 -0
  115. package/dist/runEventLog.d.ts.map +1 -0
  116. package/dist/runEventLog.js +63 -0
  117. package/dist/runEventLog.js.map +1 -0
  118. package/dist/runFacts.d.ts +23 -0
  119. package/dist/runFacts.d.ts.map +1 -0
  120. package/dist/runFacts.js +179 -0
  121. package/dist/runFacts.js.map +1 -0
  122. package/dist/runFactsBuilder.d.ts +5 -0
  123. package/dist/runFactsBuilder.d.ts.map +1 -0
  124. package/dist/runFactsBuilder.js +412 -0
  125. package/dist/runFactsBuilder.js.map +1 -0
  126. package/dist/runFactsDeliverable.d.ts +13 -0
  127. package/dist/runFactsDeliverable.d.ts.map +1 -0
  128. package/dist/runFactsDeliverable.js +94 -0
  129. package/dist/runFactsDeliverable.js.map +1 -0
  130. package/dist/runFactsPresentation.d.ts +7 -0
  131. package/dist/runFactsPresentation.d.ts.map +1 -0
  132. package/dist/runFactsPresentation.js +113 -0
  133. package/dist/runFactsPresentation.js.map +1 -0
  134. package/dist/runFactsReview.d.ts +7 -0
  135. package/dist/runFactsReview.d.ts.map +1 -0
  136. package/dist/runFactsReview.js +63 -0
  137. package/dist/runFactsReview.js.map +1 -0
  138. package/dist/runSupport.d.ts +17 -15
  139. package/dist/runSupport.d.ts.map +1 -1
  140. package/dist/runSupport.js +16 -0
  141. package/dist/runSupport.js.map +1 -1
  142. package/dist/runTelemetryWriter.d.ts +5 -2
  143. package/dist/runTelemetryWriter.d.ts.map +1 -1
  144. package/dist/runTelemetryWriter.js +72 -1
  145. package/dist/runTelemetryWriter.js.map +1 -1
  146. package/dist/runTerminalContext.d.ts +31 -0
  147. package/dist/runTerminalContext.d.ts.map +1 -0
  148. package/dist/runTerminalContext.js +12 -0
  149. package/dist/runTerminalContext.js.map +1 -0
  150. package/dist/runTerminalResults.d.ts +55 -0
  151. package/dist/runTerminalResults.d.ts.map +1 -0
  152. package/dist/runTerminalResults.js +134 -0
  153. package/dist/runTerminalResults.js.map +1 -0
  154. package/dist/runTerminals.d.ts +8 -57
  155. package/dist/runTerminals.d.ts.map +1 -1
  156. package/dist/runTerminals.js +423 -135
  157. package/dist/runTerminals.js.map +1 -1
  158. package/dist/secretDiff.d.ts +32 -0
  159. package/dist/secretDiff.d.ts.map +1 -0
  160. package/dist/secretDiff.js +140 -0
  161. package/dist/secretDiff.js.map +1 -0
  162. package/dist/structuredOutput.d.ts.map +1 -1
  163. package/dist/structuredOutput.js.map +1 -1
  164. package/dist/task-contract-builder.d.ts +35 -0
  165. package/dist/task-contract-builder.d.ts.map +1 -0
  166. package/dist/task-contract-builder.js +114 -0
  167. package/dist/task-contract-builder.js.map +1 -0
  168. package/dist/terminalOutcome.d.ts +22 -0
  169. package/dist/terminalOutcome.d.ts.map +1 -0
  170. package/dist/terminalOutcome.js +39 -0
  171. package/dist/terminalOutcome.js.map +1 -0
  172. package/dist/transientClassify.js.map +1 -1
  173. package/package.json +17 -17
@@ -0,0 +1,69 @@
1
+ import { join } from "node:path";
2
+ import { makeOutcomeFacts } from "@claudexor/schema";
3
+ import { noProjectRepoRoot } from "@claudexor/util";
4
+ import { ensureGitRepository, GitCapabilityError, GitInitializationError, } from "@claudexor/workspace";
5
+ import { writeFailure } from "./runTerminalResults.js";
6
+ import { safeErrorMessage } from "./runSupport.js";
7
+ const NO_PROJECT_ROOT = noProjectRepoRoot();
8
+ /** Establish the write-mode Git boundary and own its typed terminal failure. */
9
+ export async function ensureWriteModeGitBoundary(repoRoot, log, store, paths, runId, mode, ensureRepository = ensureGitRepository) {
10
+ if (repoRoot === NO_PROJECT_ROOT)
11
+ return null;
12
+ try {
13
+ const result = await ensureRepository(repoRoot);
14
+ if (result.initialized || result.baselineCommitted) {
15
+ log.emit("project.git.initialized", {
16
+ repo_root: repoRoot,
17
+ initialized: result.initialized,
18
+ baseline_committed: result.baselineCommitted,
19
+ gitignore_seeded: result.gitignoreSeeded,
20
+ head_sha: result.headSha,
21
+ });
22
+ }
23
+ return null;
24
+ }
25
+ catch (error) {
26
+ const message = safeErrorMessage(error);
27
+ const prerequisite = error instanceof GitCapabilityError;
28
+ if (error instanceof GitInitializationError) {
29
+ log.emit("project.git.initialized", {
30
+ repo_root: repoRoot,
31
+ initialized: error.progress.initialized,
32
+ baseline_committed: error.progress.baselineCommitted,
33
+ gitignore_seeded: error.progress.gitignoreSeeded,
34
+ head_sha: error.progress.headSha,
35
+ partial: true,
36
+ failed_stage: error.progress.failedStage,
37
+ });
38
+ }
39
+ // This boundary runs before a harness is admitted. Capability, filesystem,
40
+ // and repository-initialization failures are all workspace failures; none
41
+ // is evidence that a provider process failed.
42
+ const reason = "workspace_unavailable";
43
+ writeFailure(store, paths, {
44
+ phase: "workspace",
45
+ category: "project",
46
+ safeMessage: message,
47
+ runDir: paths.root,
48
+ nextActions: prerequisite
49
+ ? [error.capability.remediation ?? "Install Git and retry", "Retry the run"]
50
+ : [
51
+ "Check the project folder permissions",
52
+ "Initialize git manually (git init)",
53
+ "Retry the run",
54
+ ],
55
+ });
56
+ store.writeText(join(paths.finalDir, "summary.md"), `# Run ${runId} (${mode})\n\n- Lifecycle: failed\n- Phase: workspace\n\n${message}\n`);
57
+ log.emit("output.ready", { kind: "summary", path: "final/summary.md", state: "diagnostic" });
58
+ log.emit("run.failed", {
59
+ lifecycle: "failed",
60
+ facts: makeOutcomeFacts("failed", { reason }),
61
+ reason,
62
+ phase: "workspace",
63
+ error: message,
64
+ failure_ref: "final/failure.yaml",
65
+ });
66
+ return { message, reason };
67
+ }
68
+ }
69
+ //# sourceMappingURL=git-precondition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-precondition.js","sourceRoot":"","sources":["../src/git-precondition.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export * from "./orchestrator.js";
2
2
  export * from "./requestRequirements.js";
3
- export { nextUpIdentity } from "./credential-profiles.js";
3
+ export * from "./delegationBudgetAuthority.js";
4
+ export * from "./routing-failure.js";
5
+ export { defaultCredentialRoute, effectiveAuthPreference, nextUpIdentity, probeCredentialProfileStatus, profileStatusAdmits, } from "./credential-profiles.js";
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,cAAc,EACd,4BAA4B,EAC5B,mBAAmB,GACpB,MAAM,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,6 @@
1
1
  export * from "./orchestrator.js";
2
2
  export * from "./requestRequirements.js";
3
- export { nextUpIdentity } from "./credential-profiles.js";
3
+ export * from "./delegationBudgetAuthority.js";
4
+ export * from "./routing-failure.js";
5
+ export { defaultCredentialRoute, effectiveAuthPreference, nextUpIdentity, probeCredentialProfileStatus, profileStatusAdmits, } from "./credential-profiles.js";
4
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,cAAc,EACd,4BAA4B,EAC5B,mBAAmB,GACpB,MAAM,0BAA0B,CAAC"}
@@ -1,22 +1,30 @@
1
1
  /**
2
2
  * Per-attempt interaction channel. Emits the typed lifecycle events
3
3
  * (`interaction.requested` / `interaction.answered` / `interaction.timeout`)
4
- * around the caller-provided answer surface, enforcing the wait budget so a
5
- * run can never hang forever on an unanswered question. Undefined when the
6
- * caller provides no surface the adapter then runs non-interactive.
4
+ * around the caller-provided answer surface. The wait policy is finite or has
5
+ * automatic expiry disabled; answers, cancellation, terminal cleanup, and
6
+ * registry release still end either form. Undefined when the caller provides
7
+ * no surface — the adapter then runs non-interactive.
7
8
  *
8
9
  * Capability gate: the channel is OFFERED only to routes whose manifest
9
10
  * declares `interactive` — a non-interactive harness never gets a surface it
10
11
  * cannot raise questions through.
11
12
  */
12
13
  import type { InteractionChannel } from "@claudexor/core";
13
- import type { InteractionAnswerSet } from "@claudexor/schema";
14
+ import type { InteractionHandlerResult } from "@claudexor/schema";
14
15
  import type { EventLog } from "@claudexor/event-log";
15
16
  import type { PendingInteractionContext } from "./orchestrator.js";
16
17
  export interface InteractionChannelWiring {
17
- onInteraction?: (ctx: PendingInteractionContext) => Promise<InteractionAnswerSet | null>;
18
- interactionTimeoutMs?: number;
18
+ onInteraction?: (ctx: PendingInteractionContext) => Promise<InteractionHandlerResult>;
19
+ interactionTimeoutMs?: number | null;
19
20
  signal?: AbortSignal;
20
21
  }
22
+ export type InteractionTimeoutPolicy = {
23
+ kind: "finite";
24
+ timeoutMs: number;
25
+ } | {
26
+ kind: "disabled";
27
+ };
28
+ export declare function resolveInteractionTimeoutPolicy(configured: number | null | undefined, defaultTimeoutMs: number): InteractionTimeoutPolicy;
21
29
  export declare function interactionChannelFor(input: InteractionChannelWiring, log: EventLog, runId: string, taskId: string, attemptId: string, harnessId: string, supportsInteractive: boolean, defaultTimeoutMs: number): InteractionChannel | undefined;
22
30
  //# sourceMappingURL=interaction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interaction.d.ts","sourceRoot":"","sources":["../src/interaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAsB,MAAM,mBAAmB,CAAC;AAClF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAEnE,MAAM,WAAW,wBAAwB;IACvC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IACzF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,wBAAwB,EAC/B,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE,OAAO,EAC5B,gBAAgB,EAAE,MAAM,GACvB,kBAAkB,GAAG,SAAS,CA4GhC"}
1
+ {"version":3,"file":"interaction.d.ts","sourceRoot":"","sources":["../src/interaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAGV,wBAAwB,EAEzB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAEnE,MAAM,WAAW,wBAAwB;IACvC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACtF,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,MAAM,wBAAwB,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAEpG,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACrC,gBAAgB,EAAE,MAAM,GACvB,wBAAwB,CAU1B;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,wBAAwB,EAC/B,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE,OAAO,EAC5B,gBAAgB,EAAE,MAAM,GACvB,kBAAkB,GAAG,SAAS,CAgKhC"}
@@ -1,20 +1,37 @@
1
+ import { INTERACTION_TIMEOUT_MAX_MS } from "@claudexor/schema";
1
2
  import { nowIso } from "@claudexor/util";
3
+ export function resolveInteractionTimeoutPolicy(configured, defaultTimeoutMs) {
4
+ const value = configured === undefined ? defaultTimeoutMs : configured;
5
+ if (value === null)
6
+ return { kind: "disabled" };
7
+ if (!Number.isSafeInteger(value) || value <= 0) {
8
+ throw new Error("interaction timeout must be a positive safe integer or null");
9
+ }
10
+ if (value > INTERACTION_TIMEOUT_MAX_MS) {
11
+ throw new Error("interaction timeout exceeds the supported maximum");
12
+ }
13
+ return { kind: "finite", timeoutMs: value };
14
+ }
2
15
  export function interactionChannelFor(input, log, runId, taskId, attemptId, harnessId, supportsInteractive, defaultTimeoutMs) {
3
16
  if (!supportsInteractive)
4
17
  return undefined;
5
18
  const handler = input.onInteraction;
6
19
  if (!handler)
7
20
  return undefined;
8
- const timeoutMs = input.interactionTimeoutMs ?? defaultTimeoutMs;
21
+ const timeoutPolicy = resolveInteractionTimeoutPolicy(input.interactionTimeoutMs, defaultTimeoutMs);
9
22
  // Waiting on a human is legitimate stream silence: the inactivity watchdog
10
23
  // consults this count and re-arms instead of killing the "wedged" harness.
11
24
  let pending = 0;
25
+ let suspensionVersion = 0;
12
26
  return {
13
27
  pendingCount: () => pending,
28
+ suspensionVersion: () => suspensionVersion,
14
29
  request: async (request) => {
15
30
  const requestedAt = nowIso();
16
- const timeoutAt = new Date(Date.now() + timeoutMs).toISOString();
31
+ const deadlineAtMs = timeoutPolicy.kind === "finite" ? finiteDeadline(timeoutPolicy.timeoutMs) : null;
32
+ const timeoutAt = deadlineAtMs === null ? null : new Date(deadlineAtMs).toISOString();
17
33
  pending += 1;
34
+ suspensionVersion += 1;
18
35
  try {
19
36
  // Invoke the answer surface BEFORE announcing the event: handlers
20
37
  // register the pending question synchronously (daemon
@@ -49,31 +66,57 @@ export function interactionChannelFor(input, log, runId, taskId, attemptId, harn
49
66
  requested_at: requestedAt,
50
67
  timeout_at: timeoutAt,
51
68
  });
52
- let timer;
69
+ let cancelTimer;
53
70
  let onAbort;
54
71
  const startedWaiting = Date.now();
55
- const answers = await Promise.race([
56
- answersPromise,
57
- new Promise((resolve) => {
58
- timer = setTimeout(() => resolve(null), timeoutMs);
59
- timer.unref?.();
60
- }),
72
+ const waits = [
73
+ answersPromise.then((result) => ({ kind: "handler", result })),
61
74
  // A cancelled run must release the interaction wait IMMEDIATELY —
62
- // the abort already kills the harness process, and sitting out the
63
- // remaining timeout would park a dead run in waiting_on_user.
75
+ // the abort already kills the harness process, and neither a finite
76
+ // nor disabled-expiry policy may park a dead run in waiting_on_user.
64
77
  new Promise((resolve) => {
65
78
  if (!input.signal)
66
79
  return;
67
80
  if (input.signal.aborted)
68
- return resolve(null);
69
- onAbort = () => resolve(null);
81
+ return resolve({ kind: "abort" });
82
+ onAbort = () => resolve({ kind: "abort" });
70
83
  input.signal.addEventListener("abort", onAbort, { once: true });
71
84
  }),
72
- ]);
73
- if (timer)
74
- clearTimeout(timer);
85
+ ];
86
+ if (deadlineAtMs !== null) {
87
+ waits.push(new Promise((resolve) => {
88
+ cancelTimer = scheduleSafeDeadline(deadlineAtMs, () => resolve({ kind: "timeout" }));
89
+ }));
90
+ }
91
+ const result = await Promise.race(waits);
92
+ cancelTimer?.();
75
93
  if (onAbort)
76
94
  input.signal?.removeEventListener("abort", onAbort);
95
+ // Run cancellation has its own terminal event and is not an expired
96
+ // answer window. Emitting interaction.timeout here makes downstream
97
+ // surfaces briefly claim a benign timeout before the cancellation
98
+ // truth arrives.
99
+ if (result.kind === "abort") {
100
+ // Preserve late-answer honesty without fabricating an expiry. The
101
+ // registry may still deliver an answer racing the run cancellation;
102
+ // disclose that it was discarded for the actual terminal cause.
103
+ void answersPromise
104
+ .then((late) => {
105
+ if (late && !isInteractionHandlerRelease(late) && late.answers.length > 0) {
106
+ log.emit("interaction.answer_discarded", {
107
+ interaction_id: request.interaction_id,
108
+ attempt_id: attemptId,
109
+ harness_id: harnessId,
110
+ answer_count: late.answers.length,
111
+ reason: "run_cancelled",
112
+ });
113
+ }
114
+ })
115
+ .catch(() => undefined);
116
+ return null;
117
+ }
118
+ const handlerResult = result.kind === "handler" ? result.result : null;
119
+ const answers = isInteractionHandlerRelease(handlerResult) ? null : handlerResult;
77
120
  if (answers && answers.answers.length > 0) {
78
121
  log.emit("interaction.answered", {
79
122
  interaction_id: request.interaction_id,
@@ -83,24 +126,32 @@ export function interactionChannelFor(input, log, runId, taskId, attemptId, harn
83
126
  });
84
127
  return answers;
85
128
  }
129
+ // An untyped external null or a terminal/restart registry release is a
130
+ // decline, not an automatic expiry. The daemon tags only its own
131
+ // finite expiry so that race can retain exact provenance.
132
+ if (result.kind === "handler" &&
133
+ (!isInteractionHandlerRelease(handlerResult) ||
134
+ handlerResult.reason !== "timeout" ||
135
+ deadlineAtMs === null)) {
136
+ return null;
137
+ }
86
138
  log.emit("interaction.timeout", {
87
139
  interaction_id: request.interaction_id,
88
140
  attempt_id: attemptId,
89
141
  harness_id: harnessId,
90
142
  waited_ms: Date.now() - startedWaiting,
91
- ...(input.signal?.aborted ? { reason: "cancelled" } : {}),
92
143
  });
93
144
  // Late-answer honesty: the run already declined this
94
145
  // interaction; an answer arriving AFTER the timeout must be visibly
95
146
  // DISCARDED, not silently swallowed (the user typed it in good faith).
96
147
  void answersPromise.then((late) => {
97
- if (late && late.answers.length > 0) {
148
+ if (late && !isInteractionHandlerRelease(late) && late.answers.length > 0) {
98
149
  log.emit("interaction.answer_discarded", {
99
150
  interaction_id: request.interaction_id,
100
151
  attempt_id: attemptId,
101
152
  harness_id: harnessId,
102
153
  answer_count: late.answers.length,
103
- reason: input.signal?.aborted ? "run_cancelled" : "timed_out",
154
+ reason: "timed_out",
104
155
  });
105
156
  }
106
157
  });
@@ -110,8 +161,44 @@ export function interactionChannelFor(input, log, runId, taskId, attemptId, harn
110
161
  // ALWAYS release the suspension: a synchronous handler throw or a
111
162
  // log.emit failure must not leave the watchdog suspended forever.
112
163
  pending -= 1;
164
+ suspensionVersion += 1;
113
165
  }
114
166
  },
115
167
  };
116
168
  }
169
+ const MAX_TIMER_DELAY_MS = 2_147_483_647;
170
+ const MAX_DATE_MS = 8_640_000_000_000_000;
171
+ function finiteDeadline(timeoutMs) {
172
+ const deadline = Date.now() + timeoutMs;
173
+ if (!Number.isSafeInteger(deadline) || deadline > MAX_DATE_MS) {
174
+ throw new Error("interaction timeout is too large to represent as a deadline");
175
+ }
176
+ return deadline;
177
+ }
178
+ /** Node clamps one setTimeout above 2^31-1 ms to ~1 ms. Re-arm in bounded
179
+ * chunks so a large valid finite policy cannot expire immediately. */
180
+ function scheduleSafeDeadline(deadline, fire) {
181
+ let timer;
182
+ let cancelled = false;
183
+ const arm = () => {
184
+ if (cancelled)
185
+ return;
186
+ const remaining = deadline - Date.now();
187
+ if (remaining <= 0) {
188
+ fire();
189
+ return;
190
+ }
191
+ timer = setTimeout(arm, Math.min(remaining, MAX_TIMER_DELAY_MS));
192
+ timer.unref?.();
193
+ };
194
+ arm();
195
+ return () => {
196
+ cancelled = true;
197
+ if (timer)
198
+ clearTimeout(timer);
199
+ };
200
+ }
201
+ function isInteractionHandlerRelease(result) {
202
+ return result !== null && "kind" in result && result.kind === "released";
203
+ }
117
204
  //# sourceMappingURL=interaction.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"interaction.js","sourceRoot":"","sources":["../src/interaction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interaction.js","sourceRoot":"","sources":["../src/interaction.ts"],"names":[],"mappings":"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"}