@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.
- package/dist/attemptFinalize.d.ts +14 -11
- package/dist/attemptFinalize.d.ts.map +1 -1
- package/dist/attemptFinalize.js +41 -14
- package/dist/attemptFinalize.js.map +1 -1
- package/dist/attemptTelemetry.d.ts +16 -20
- package/dist/attemptTelemetry.d.ts.map +1 -1
- package/dist/attemptTelemetry.js +38 -70
- package/dist/attemptTelemetry.js.map +1 -1
- package/dist/attemptUsageCost.d.ts +47 -0
- package/dist/attemptUsageCost.d.ts.map +1 -0
- package/dist/attemptUsageCost.js +191 -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/credential-profile-rotation.d.ts +145 -0
- package/dist/credential-profile-rotation.d.ts.map +1 -0
- package/dist/credential-profile-rotation.js +315 -0
- package/dist/credential-profile-rotation.js.map +1 -0
- package/dist/credential-profiles.d.ts +35 -134
- package/dist/credential-profiles.d.ts.map +1 -1
- package/dist/credential-profiles.js +73 -295
- package/dist/credential-profiles.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 +14 -44
- package/dist/deepScanReducer.d.ts.map +1 -1
- package/dist/deepScanReducer.js +240 -128
- 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/git-precondition.d.ts +11 -0
- package/dist/git-precondition.d.ts.map +1 -0
- package/dist/git-precondition.js +69 -0
- package/dist/git-precondition.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +14 -6
- package/dist/interaction.d.ts.map +1 -1
- package/dist/interaction.js +106 -19
- package/dist/interaction.js.map +1 -1
- package/dist/orchestrator.d.ts +62 -115
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +671 -965
- 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/planBrief.d.ts +27 -0
- package/dist/planBrief.d.ts.map +1 -0
- package/dist/planBrief.js +42 -0
- package/dist/planBrief.js.map +1 -0
- package/dist/planRun.d.ts +4 -3
- package/dist/planRun.d.ts.map +1 -1
- package/dist/planRun.js +33 -33
- package/dist/planRun.js.map +1 -1
- package/dist/plannerAttempt.d.ts +64 -0
- package/dist/plannerAttempt.d.ts.map +1 -0
- package/dist/plannerAttempt.js +235 -0
- package/dist/plannerAttempt.js.map +1 -0
- package/dist/policyFindings.js.map +1 -1
- package/dist/requestRequirements.d.ts +45 -1
- package/dist/requestRequirements.d.ts.map +1 -1
- package/dist/requestRequirements.js +158 -11
- package/dist/requestRequirements.js.map +1 -1
- package/dist/reviewerPanel.js.map +1 -1
- package/dist/root-ledger.d.ts +13 -0
- package/dist/root-ledger.d.ts.map +1 -0
- package/dist/root-ledger.js +21 -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 +23 -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 +88 -0
- package/dist/run-input-resolution.js.map +1 -0
- package/dist/runEventLog.d.ts +48 -0
- package/dist/runEventLog.d.ts.map +1 -0
- package/dist/runEventLog.js +63 -0
- package/dist/runEventLog.js.map +1 -0
- package/dist/runFacts.d.ts +23 -0
- package/dist/runFacts.d.ts.map +1 -0
- package/dist/runFacts.js +179 -0
- package/dist/runFacts.js.map +1 -0
- package/dist/runFactsBuilder.d.ts +5 -0
- package/dist/runFactsBuilder.d.ts.map +1 -0
- package/dist/runFactsBuilder.js +412 -0
- package/dist/runFactsBuilder.js.map +1 -0
- package/dist/runFactsDeliverable.d.ts +13 -0
- package/dist/runFactsDeliverable.d.ts.map +1 -0
- package/dist/runFactsDeliverable.js +94 -0
- package/dist/runFactsDeliverable.js.map +1 -0
- package/dist/runFactsPresentation.d.ts +7 -0
- package/dist/runFactsPresentation.d.ts.map +1 -0
- package/dist/runFactsPresentation.js +113 -0
- package/dist/runFactsPresentation.js.map +1 -0
- package/dist/runFactsReview.d.ts +7 -0
- package/dist/runFactsReview.d.ts.map +1 -0
- package/dist/runFactsReview.js +63 -0
- package/dist/runFactsReview.js.map +1 -0
- package/dist/runSupport.d.ts +17 -15
- package/dist/runSupport.d.ts.map +1 -1
- package/dist/runSupport.js +16 -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/runTerminalContext.d.ts +31 -0
- package/dist/runTerminalContext.d.ts.map +1 -0
- package/dist/runTerminalContext.js +12 -0
- package/dist/runTerminalContext.js.map +1 -0
- package/dist/runTerminalResults.d.ts +55 -0
- package/dist/runTerminalResults.d.ts.map +1 -0
- package/dist/runTerminalResults.js +134 -0
- package/dist/runTerminalResults.js.map +1 -0
- package/dist/runTerminals.d.ts +8 -57
- package/dist/runTerminals.d.ts.map +1 -1
- package/dist/runTerminals.js +423 -135
- package/dist/runTerminals.js.map +1 -1
- package/dist/secretDiff.d.ts +32 -0
- package/dist/secretDiff.d.ts.map +1 -0
- package/dist/secretDiff.js +140 -0
- package/dist/secretDiff.js.map +1 -0
- package/dist/structuredOutput.d.ts.map +1 -1
- package/dist/structuredOutput.js.map +1 -1
- package/dist/task-contract-builder.d.ts +35 -0
- package/dist/task-contract-builder.d.ts.map +1 -0
- package/dist/task-contract-builder.js +114 -0
- package/dist/task-contract-builder.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/transientClassify.js.map +1 -1
- 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
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,OAAO,
|
|
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
|
|
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,
|
|
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"}
|
package/dist/interaction.d.ts
CHANGED
|
@@ -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
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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 {
|
|
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<
|
|
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
|
|
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"}
|
package/dist/interaction.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
69
|
+
let cancelTimer;
|
|
53
70
|
let onAbort;
|
|
54
71
|
const startedWaiting = Date.now();
|
|
55
|
-
const
|
|
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
|
|
63
|
-
//
|
|
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(
|
|
69
|
-
onAbort = () => resolve(
|
|
81
|
+
return resolve({ kind: "abort" });
|
|
82
|
+
onAbort = () => resolve({ kind: "abort" });
|
|
70
83
|
input.signal.addEventListener("abort", onAbort, { once: true });
|
|
71
84
|
}),
|
|
72
|
-
]
|
|
73
|
-
if (
|
|
74
|
-
|
|
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:
|
|
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
|
package/dist/interaction.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interaction.js","sourceRoot":"","sources":["../src/interaction.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interaction.js","sourceRoot":"","sources":["../src/interaction.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAWzC,MAAM,UAAU,+BAA+B,CAC7C,UAAqC,EACrC,gBAAwB;IAExB,MAAM,KAAK,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC;IACvE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,KAAK,GAAG,0BAA0B,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAA+B,EAC/B,GAAa,EACb,KAAa,EACb,MAAc,EACd,SAAiB,EACjB,SAAiB,EACjB,mBAA4B,EAC5B,gBAAwB;IAExB,IAAI,CAAC,mBAAmB;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC;IACpC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,aAAa,GAAG,+BAA+B,CACnD,KAAK,CAAC,oBAAoB,EAC1B,gBAAgB,CACjB,CAAC;IACF,2EAA2E;IAC3E,2EAA2E;IAC3E,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,OAAO;QACL,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO;QAC3B,iBAAiB,EAAE,GAAG,EAAE,CAAC,iBAAiB;QAC1C,OAAO,EAAE,KAAK,EAAE,OAA2B,EAAwC,EAAE;YACnF,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC;YAC7B,MAAM,YAAY,GAChB,aAAa,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACnF,MAAM,SAAS,GAAG,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;YACtF,OAAO,IAAI,CAAC,CAAC;YACb,iBAAiB,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC;gBACH,kEAAkE;gBAClE,sDAAsD;gBACtD,yDAAyD;gBACzD,wEAAwE;gBACxE,uEAAuE;gBACvE,+DAA+D;gBAC/D,yEAAyE;gBACzE,oEAAoE;gBACpE,uEAAuE;gBACvE,IAAI,cAAiD,CAAC;gBACtD,IAAI,CAAC;oBACH,cAAc,GAAG,OAAO,CAAC,OAAO,CAC9B,OAAO,CAAC;wBACN,KAAK;wBACL,MAAM;wBACN,SAAS;wBACT,SAAS;wBACT,OAAO;wBACP,WAAW;wBACX,SAAS;qBACV,CAAC,CACH,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBACtB,CAAC;gBAAC,MAAM,CAAC;oBACP,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACzC,CAAC;gBACD,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE;oBAChC,cAAc,EAAE,OAAO,CAAC,cAAc;oBACtC,UAAU,EAAE,SAAS;oBACrB,UAAU,EAAE,SAAS;oBACrB,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,YAAY,EAAE,WAAW;oBACzB,UAAU,EAAE,SAAS;iBACtB,CAAC,CAAC;gBACH,IAAI,WAAqC,CAAC;gBAC1C,IAAI,OAAiC,CAAC;gBACtC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAKlC,MAAM,KAAK,GAA0B;oBACnC,cAAc,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC9D,kEAAkE;oBAClE,oEAAoE;oBACpE,qEAAqE;oBACrE,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,EAAE;wBAClC,IAAI,CAAC,KAAK,CAAC,MAAM;4BAAE,OAAO;wBAC1B,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO;4BAAE,OAAO,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;wBAC5D,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;wBAC3C,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;oBAClE,CAAC,CAAC;iBACH,CAAC;gBACF,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;oBAC1B,KAAK,CAAC,IAAI,CACR,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,EAAE;wBAClC,WAAW,GAAG,oBAAoB,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;oBACvF,CAAC,CAAC,CACH,CAAC;gBACJ,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACzC,WAAW,EAAE,EAAE,CAAC;gBAChB,IAAI,OAAO;oBAAE,KAAK,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACjE,oEAAoE;gBACpE,oEAAoE;gBACpE,kEAAkE;gBAClE,iBAAiB;gBACjB,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC5B,kEAAkE;oBAClE,oEAAoE;oBACpE,gEAAgE;oBAChE,KAAK,cAAc;yBAChB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;wBACb,IAAI,IAAI,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC1E,GAAG,CAAC,IAAI,CAAC,8BAA8B,EAAE;gCACvC,cAAc,EAAE,OAAO,CAAC,cAAc;gCACtC,UAAU,EAAE,SAAS;gCACrB,UAAU,EAAE,SAAS;gCACrB,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;gCACjC,MAAM,EAAE,eAAe;6BACxB,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC,CAAC;yBACD,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;oBAC1B,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;gBACvE,MAAM,OAAO,GAAG,2BAA2B,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC;gBAClF,IAAI,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1C,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE;wBAC/B,cAAc,EAAE,OAAO,CAAC,cAAc;wBACtC,UAAU,EAAE,SAAS;wBACrB,UAAU,EAAE,SAAS;wBACrB,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;qBACrC,CAAC,CAAC;oBACH,OAAO,OAAO,CAAC;gBACjB,CAAC;gBACD,uEAAuE;gBACvE,iEAAiE;gBACjE,0DAA0D;gBAC1D,IACE,MAAM,CAAC,IAAI,KAAK,SAAS;oBACzB,CAAC,CAAC,2BAA2B,CAAC,aAAa,CAAC;wBAC1C,aAAa,CAAC,MAAM,KAAK,SAAS;wBAClC,YAAY,KAAK,IAAI,CAAC,EACxB,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE;oBAC9B,cAAc,EAAE,OAAO,CAAC,cAAc;oBACtC,UAAU,EAAE,SAAS;oBACrB,UAAU,EAAE,SAAS;oBACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc;iBACvC,CAAC,CAAC;gBACH,qDAAqD;gBACrD,oEAAoE;gBACpE,uEAAuE;gBACvE,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;oBAChC,IAAI,IAAI,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC1E,GAAG,CAAC,IAAI,CAAC,8BAA8B,EAAE;4BACvC,cAAc,EAAE,OAAO,CAAC,cAAc;4BACtC,UAAU,EAAE,SAAS;4BACrB,UAAU,EAAE,SAAS;4BACrB,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;4BACjC,MAAM,EAAE,WAAW;yBACpB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;YACd,CAAC;oBAAS,CAAC;gBACT,kEAAkE;gBAClE,kEAAkE;gBAClE,OAAO,IAAI,CAAC,CAAC;gBACb,iBAAiB,IAAI,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,kBAAkB,GAAG,aAAa,CAAC;AACzC,MAAM,WAAW,GAAG,qBAAqB,CAAC;AAE1C,SAAS,cAAc,CAAC,SAAiB;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;sEACsE;AACtE,SAAS,oBAAoB,CAAC,QAAgB,EAAE,IAAgB;IAC9D,IAAI,KAAiC,CAAC;IACtC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,MAAM,GAAG,GAAG,GAAG,EAAE;QACf,IAAI,SAAS;YAAE,OAAO;QACtB,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACjE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAClB,CAAC,CAAC;IACF,GAAG,EAAE,CAAC;IACN,OAAO,GAAG,EAAE;QACV,SAAS,GAAG,IAAI,CAAC;QACjB,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAClC,MAAgC;IAEhC,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC;AAC3E,CAAC"}
|