@superdurable/dex-agents 0.0.0-stage → 0.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 (171) hide show
  1. package/LICENSE +105 -0
  2. package/README.md +1981 -2
  3. package/dist/src/agent-built-in-tools.d.ts +81 -0
  4. package/dist/src/agent-built-in-tools.js +246 -0
  5. package/dist/src/agent-built-in-tools.js.map +1 -0
  6. package/dist/src/agent-context-compaction.d.ts +108 -0
  7. package/dist/src/agent-context-compaction.js +39 -0
  8. package/dist/src/agent-context-compaction.js.map +1 -0
  9. package/dist/src/agent-event-writer.d.ts +26 -0
  10. package/dist/src/agent-event-writer.js +110 -0
  11. package/dist/src/agent-event-writer.js.map +1 -0
  12. package/dist/src/agent-framework-runner.d.ts +808 -0
  13. package/dist/src/agent-framework-runner.js +82 -0
  14. package/dist/src/agent-framework-runner.js.map +1 -0
  15. package/dist/src/agent-plans.d.ts +48 -0
  16. package/dist/src/agent-plans.js +86 -0
  17. package/dist/src/agent-plans.js.map +1 -0
  18. package/dist/src/agent-session-cancellation-steps.d.ts +28 -0
  19. package/dist/src/agent-session-cancellation-steps.js +154 -0
  20. package/dist/src/agent-session-cancellation-steps.js.map +1 -0
  21. package/dist/src/agent-session-codecs.d.ts +105 -0
  22. package/dist/src/agent-session-codecs.js +689 -0
  23. package/dist/src/agent-session-codecs.js.map +1 -0
  24. package/dist/src/agent-session-flow.d.ts +416 -0
  25. package/dist/src/agent-session-flow.js +623 -0
  26. package/dist/src/agent-session-flow.js.map +1 -0
  27. package/dist/src/agent-session-persistence.d.ts +133 -0
  28. package/dist/src/agent-session-persistence.js +74 -0
  29. package/dist/src/agent-session-persistence.js.map +1 -0
  30. package/dist/src/agent-session-settings.d.ts +58 -0
  31. package/dist/src/agent-session-settings.js +81 -0
  32. package/dist/src/agent-session-settings.js.map +1 -0
  33. package/dist/src/agent-session-step-options.d.ts +27 -0
  34. package/dist/src/agent-session-step-options.js +39 -0
  35. package/dist/src/agent-session-step-options.js.map +1 -0
  36. package/dist/src/agent-session-step-types.d.ts +20 -0
  37. package/dist/src/agent-session-step-types.js +28 -0
  38. package/dist/src/agent-session-step-types.js.map +1 -0
  39. package/dist/src/agent-session-steps.d.ts +179 -0
  40. package/dist/src/agent-session-steps.js +1272 -0
  41. package/dist/src/agent-session-steps.js.map +1 -0
  42. package/dist/src/agent-session-tracer.d.ts +61 -0
  43. package/dist/src/agent-session-tracer.js +608 -0
  44. package/dist/src/agent-session-tracer.js.map +1 -0
  45. package/dist/src/agent-session-transitions.d.ts +224 -0
  46. package/dist/src/agent-session-transitions.js +850 -0
  47. package/dist/src/agent-session-transitions.js.map +1 -0
  48. package/dist/src/agent-session-values.d.ts +998 -0
  49. package/dist/src/agent-session-values.js +162 -0
  50. package/dist/src/agent-session-values.js.map +1 -0
  51. package/dist/src/agent-session-wait-steps.d.ts +53 -0
  52. package/dist/src/agent-session-wait-steps.js +389 -0
  53. package/dist/src/agent-session-wait-steps.js.map +1 -0
  54. package/dist/src/agent-tracing-options.d.ts +107 -0
  55. package/dist/src/agent-tracing-options.js +20 -0
  56. package/dist/src/agent-tracing-options.js.map +1 -0
  57. package/dist/src/ai-sdk/ai-sdk-model-client.d.ts +40 -0
  58. package/dist/src/ai-sdk/ai-sdk-model-client.js +235 -0
  59. package/dist/src/ai-sdk/ai-sdk-model-client.js.map +1 -0
  60. package/dist/src/ai-sdk/index.d.ts +1 -0
  61. package/dist/src/ai-sdk/index.js +9 -0
  62. package/dist/src/ai-sdk/index.js.map +1 -0
  63. package/dist/src/index.d.ts +10 -0
  64. package/dist/src/index.js +17 -0
  65. package/dist/src/index.js.map +1 -0
  66. package/dist/src/mcp/index.d.ts +3 -0
  67. package/dist/src/mcp/index.js +10 -0
  68. package/dist/src/mcp/index.js.map +1 -0
  69. package/dist/src/mcp/mcp-resource-and-prompt-tools.d.ts +29 -0
  70. package/dist/src/mcp/mcp-resource-and-prompt-tools.js +185 -0
  71. package/dist/src/mcp/mcp-resource-and-prompt-tools.js.map +1 -0
  72. package/dist/src/mcp/mcp-server-config.d.ts +86 -0
  73. package/dist/src/mcp/mcp-server-config.js +38 -0
  74. package/dist/src/mcp/mcp-server-config.js.map +1 -0
  75. package/dist/src/mcp/mcp-tool-source.d.ts +470 -0
  76. package/dist/src/mcp/mcp-tool-source.js +1204 -0
  77. package/dist/src/mcp/mcp-tool-source.js.map +1 -0
  78. package/dist/src/stepwise/agent-definition.d.ts +158 -0
  79. package/dist/src/stepwise/agent-definition.js +9 -0
  80. package/dist/src/stepwise/agent-definition.js.map +1 -0
  81. package/dist/src/stepwise/function-tool.d.ts +130 -0
  82. package/dist/src/stepwise/function-tool.js +75 -0
  83. package/dist/src/stepwise/function-tool.js.map +1 -0
  84. package/dist/src/stepwise/index.d.ts +7 -0
  85. package/dist/src/stepwise/index.js +12 -0
  86. package/dist/src/stepwise/index.js.map +1 -0
  87. package/dist/src/stepwise/json-schema-validation.d.ts +9 -0
  88. package/dist/src/stepwise/json-schema-validation.js +141 -0
  89. package/dist/src/stepwise/json-schema-validation.js.map +1 -0
  90. package/dist/src/stepwise/model-client.d.ts +194 -0
  91. package/dist/src/stepwise/model-client.js +9 -0
  92. package/dist/src/stepwise/model-client.js.map +1 -0
  93. package/dist/src/stepwise/scripted-model-client.d.ts +99 -0
  94. package/dist/src/stepwise/scripted-model-client.js +156 -0
  95. package/dist/src/stepwise/scripted-model-client.js.map +1 -0
  96. package/dist/src/stepwise/stepwise-agent-runner.d.ts +189 -0
  97. package/dist/src/stepwise/stepwise-agent-runner.js +804 -0
  98. package/dist/src/stepwise/stepwise-agent-runner.js.map +1 -0
  99. package/dist/src/stepwise/stepwise-agent-session-flow.d.ts +35 -0
  100. package/dist/src/stepwise/stepwise-agent-session-flow.js +56 -0
  101. package/dist/src/stepwise/stepwise-agent-session-flow.js.map +1 -0
  102. package/dist/src/stepwise/stepwise-input-items.d.ts +12 -0
  103. package/dist/src/stepwise/stepwise-input-items.js +172 -0
  104. package/dist/src/stepwise/stepwise-input-items.js.map +1 -0
  105. package/dist/src/stepwise/tool-source.d.ts +103 -0
  106. package/dist/src/stepwise/tool-source.js +9 -0
  107. package/dist/src/stepwise/tool-source.js.map +1 -0
  108. package/dist/src/testing/agent-session-test-client.d.ts +205 -0
  109. package/dist/src/testing/agent-session-test-client.js +290 -0
  110. package/dist/src/testing/agent-session-test-client.js.map +1 -0
  111. package/dist/src/testing/agent-test-environment.d.ts +52 -0
  112. package/dist/src/testing/agent-test-environment.js +86 -0
  113. package/dist/src/testing/agent-test-environment.js.map +1 -0
  114. package/dist/src/testing/agent-worker-process.d.ts +91 -0
  115. package/dist/src/testing/agent-worker-process.js +150 -0
  116. package/dist/src/testing/agent-worker-process.js.map +1 -0
  117. package/dist/src/testing/child-process-group.d.ts +33 -0
  118. package/dist/src/testing/child-process-group.js +164 -0
  119. package/dist/src/testing/child-process-group.js.map +1 -0
  120. package/dist/src/testing/coordination.d.ts +99 -0
  121. package/dist/src/testing/coordination.js +155 -0
  122. package/dist/src/testing/coordination.js.map +1 -0
  123. package/dist/src/testing/index.d.ts +8 -0
  124. package/dist/src/testing/index.js +16 -0
  125. package/dist/src/testing/index.js.map +1 -0
  126. package/dist/src/testing/polling.d.ts +31 -0
  127. package/dist/src/testing/polling.js +51 -0
  128. package/dist/src/testing/polling.js.map +1 -0
  129. package/dist/src/testing/private-dex-engine.d.ts +101 -0
  130. package/dist/src/testing/private-dex-engine.js +223 -0
  131. package/dist/src/testing/private-dex-engine.js.map +1 -0
  132. package/dist/src/testing/scripted-model-client.d.ts +1 -0
  133. package/dist/src/testing/scripted-model-client.js +10 -0
  134. package/dist/src/testing/scripted-model-client.js.map +1 -0
  135. package/dist/src/testing/step-history.d.ts +40 -0
  136. package/dist/src/testing/step-history.js +59 -0
  137. package/dist/src/testing/step-history.js.map +1 -0
  138. package/dist/src/ui-stream/agent-event-json.d.ts +30 -0
  139. package/dist/src/ui-stream/agent-event-json.js +64 -0
  140. package/dist/src/ui-stream/agent-event-json.js.map +1 -0
  141. package/dist/src/ui-stream/agent-event-sse.d.ts +154 -0
  142. package/dist/src/ui-stream/agent-event-sse.js +159 -0
  143. package/dist/src/ui-stream/agent-event-sse.js.map +1 -0
  144. package/dist/src/ui-stream/agent-event-stream-positions.d.ts +42 -0
  145. package/dist/src/ui-stream/agent-event-stream-positions.js +153 -0
  146. package/dist/src/ui-stream/agent-event-stream-positions.js.map +1 -0
  147. package/dist/src/ui-stream/agent-session-record-reader.d.ts +72 -0
  148. package/dist/src/ui-stream/agent-session-record-reader.js +241 -0
  149. package/dist/src/ui-stream/agent-session-record-reader.js.map +1 -0
  150. package/dist/src/ui-stream/agent-ui-message-stream-responses.d.ts +219 -0
  151. package/dist/src/ui-stream/agent-ui-message-stream-responses.js +440 -0
  152. package/dist/src/ui-stream/agent-ui-message-stream-responses.js.map +1 -0
  153. package/dist/src/ui-stream/agent-ui-message-stream.d.ts +138 -0
  154. package/dist/src/ui-stream/agent-ui-message-stream.js +681 -0
  155. package/dist/src/ui-stream/agent-ui-message-stream.js.map +1 -0
  156. package/dist/src/ui-stream/agent-ui-message-types.d.ts +238 -0
  157. package/dist/src/ui-stream/agent-ui-message-types.js +57 -0
  158. package/dist/src/ui-stream/agent-ui-message-types.js.map +1 -0
  159. package/dist/src/ui-stream/agent-ui-messages.d.ts +66 -0
  160. package/dist/src/ui-stream/agent-ui-messages.js +220 -0
  161. package/dist/src/ui-stream/agent-ui-messages.js.map +1 -0
  162. package/dist/src/ui-stream/agent-ui-stream-cursor.d.ts +64 -0
  163. package/dist/src/ui-stream/agent-ui-stream-cursor.js +186 -0
  164. package/dist/src/ui-stream/agent-ui-stream-cursor.js.map +1 -0
  165. package/dist/src/ui-stream/index.d.ts +14 -0
  166. package/dist/src/ui-stream/index.js +22 -0
  167. package/dist/src/ui-stream/index.js.map +1 -0
  168. package/dist/src/ui-stream/server-sent-event-responses.d.ts +6 -0
  169. package/dist/src/ui-stream/server-sent-event-responses.js +34 -0
  170. package/dist/src/ui-stream/server-sent-event-responses.js.map +1 -0
  171. package/package.json +86 -4
@@ -0,0 +1,162 @@
1
+ // Copyright (c) 2026 Super Durable, Inc.
2
+ //
3
+ // Licensed under the Sustainable Use License 1.0.
4
+ // You may not use this file except in compliance with the License.
5
+ // See the LICENSE file in the repository root.
6
+ //
7
+ // SPDX-License-Identifier: LicenseRef-Sustainable-Use-1.0
8
+ /**
9
+ * Returns usage with every counter at zero.
10
+ *
11
+ * @returns A new {@link AgentUsage} whose counters are all `0`.
12
+ */
13
+ export function emptyAgentUsage() {
14
+ return {
15
+ modelCalls: 0,
16
+ inputTokens: 0,
17
+ outputTokens: 0,
18
+ cachedInputTokens: 0,
19
+ reasoningTokens: 0,
20
+ };
21
+ }
22
+ /**
23
+ * Adds two usage values counter by counter.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * let usage = emptyAgentUsage();
28
+ * usage = addAgentUsage(usage, { ...emptyAgentUsage(), modelCalls: 1, inputTokens: 120, outputTokens: 30 });
29
+ * ```
30
+ * @param left - First usage value.
31
+ * @param right - Second usage value.
32
+ * @returns A new {@link AgentUsage} holding the sums; neither input is changed.
33
+ */
34
+ export function addAgentUsage(left, right) {
35
+ return {
36
+ modelCalls: left.modelCalls + right.modelCalls,
37
+ inputTokens: left.inputTokens + right.inputTokens,
38
+ outputTokens: left.outputTokens + right.outputTokens,
39
+ cachedInputTokens: left.cachedInputTokens + right.cachedInputTokens,
40
+ reasoningTokens: left.reasoningTokens + right.reasoningTokens,
41
+ };
42
+ }
43
+ /**
44
+ * Reports whether a tool call status is final.
45
+ *
46
+ * @param status - Status to classify.
47
+ * @returns `true` for `rejected`, `succeeded`, `failed`, and `outcome_unknown`; `false` for
48
+ * `awaiting_approval`, `approved`, and every {@link AgentToolCallWaitingStatus}.
49
+ */
50
+ export function isFinalToolCallStatus(status) {
51
+ return (status === "rejected" || status === "succeeded" || status === "failed" || status === "outcome_unknown");
52
+ }
53
+ /** Tool result text the model sees for an `outcome_unknown` call; the same text as the Python core. */
54
+ export const outcomeUnknownToolResult = "The tool call's outcome is unknown: it stopped without returning a result, so it may " +
55
+ "or may not have taken effect. It will not be retried automatically.";
56
+ /** First line of the note `RecordTurnFailure` stores after a failed turn ran tools. */
57
+ export const turnFailureNoteHeader = "[Dex] The previous turn failed after these tool calls ran:";
58
+ /** Last line of that note. */
59
+ export const turnFailureNoteFooter = "Do not repeat these tool calls unless the user asks again.";
60
+ /** Tool result text the model sees for a rejection without a message; the same text as the Python core. */
61
+ export const defaultRejectionToolResult = "The user rejected this tool call.";
62
+ /** Rejection message recorded when an approval deadline passes. */
63
+ export const approvalDeadlinePassed = "approval deadline passed";
64
+ /** Rejection message recorded when a question's deadline passes. */
65
+ export const questionDeadlinePassed = "question deadline passed";
66
+ /** Tool result text the model sees when the user declines a question without a message, or with an empty one. */
67
+ export const defaultQuestionDeclinedToolResult = "The user declined to answer.";
68
+ /** First line of the note `ApplyTurnControl` stores after a steered turn ran tools. */
69
+ export const turnSteeredNoteHeader = "[Dex] The user steered the conversation after these tool calls ran:";
70
+ /** First line of the note `ApplyTurnControl` stores after a cancelled turn ran tools. */
71
+ export const turnCancelledNoteHeader = "[Dex] The user stopped the previous turn after these tool calls ran:";
72
+ /** Model-visible result of a tool call that steering abandoned before it started; the same text as the Python core. */
73
+ export const toolCallCancelledBySteeringResult = '{"status":"cancelled","reason":"superseded_by_steered_user_message"}';
74
+ /** Model-visible result of a tool call that `cancel_turn` abandoned before it started. */
75
+ export const toolCallCancelledByTurnCancellationResult = '{"status":"cancelled","reason":"turn_cancelled_by_user"}';
76
+ /**
77
+ * Error recorded when a tool returns {@link ToolTaskStarted} to a runner without
78
+ * {@link AgentFrameworkRunner.pollToolTask}. The Python core names its method `poll_tool_task`.
79
+ */
80
+ export const missingToolTaskPoller = "the tool started a task, but the runner does not implement pollToolTask";
81
+ /** Error recorded when a {@link ToolTaskStarted} has a blank `taskId`; the same text as the Python core. */
82
+ export const blankToolTaskId = "the tool started a task without a task ID";
83
+ /** Error recorded when a task's poll interval is not a number; the same text as the Python core. */
84
+ export const invalidToolTaskPollInterval = "the tool task's poll interval is not a number";
85
+ /** Error of an `outcome_unknown` record whose task `cancel_turn` abandoned; the same text as the Python core. */
86
+ export const toolTaskAbandonedError = "the turn was cancelled while the tool's task was running; the task may have taken effect";
87
+ /**
88
+ * Start of the `error` of a `failed` record whose tool Step certainly never ran the tool; the same text as the
89
+ * Python core.
90
+ */
91
+ export const toolCallNotRunErrorPrefix = "the tool did not run, so it is safe to call again";
92
+ /**
93
+ * Returns the note text that tells the model what a failed turn already did.
94
+ *
95
+ * `RecordTurnFailure` stores this note through {@link AgentFrameworkRunner.buildUserMessage} when a
96
+ * failed turn has final tool call records, as the failed turn's last message, so the next turn's model
97
+ * does not repeat a write. The text matches the Python core's `build_turn_failure_note`:
98
+ *
99
+ * ```text
100
+ * [Dex] The previous turn failed after these tool calls ran:
101
+ * - charge {"amount": 5} -> succeeded: charged 5
102
+ * Do not repeat these tool calls unless the user asks again.
103
+ * ```
104
+ *
105
+ * @param toolCalls - Final records of the failed turn; they are listed in `deferralOrder`.
106
+ * @returns {@link turnFailureNoteHeader}, one `- <toolName> <arguments> -> <status>: <outcome>` line
107
+ * per record, with the outcome from {@link describeToolCallOutcome}, and {@link turnFailureNoteFooter},
108
+ * joined with newlines.
109
+ * @throws {TypeError} When a record is not final.
110
+ */
111
+ export function buildTurnFailureNote(toolCalls) {
112
+ return buildToolCallNote(turnFailureNoteHeader, toolCalls);
113
+ }
114
+ /** Returns a note in the turn-failure note's line format with another first line. */
115
+ export function buildToolCallNote(header, toolCalls) {
116
+ const lines = [header];
117
+ for (const toolCall of [...toolCalls].sort((left, right) => left.deferralOrder - right.deferralOrder)) {
118
+ const outcome = describeToolCallOutcome(toolCall);
119
+ lines.push(`- ${toolCall.toolName} ${toolCall.arguments} -> ${toolCall.status}: ${outcome}`);
120
+ }
121
+ lines.push(turnFailureNoteFooter);
122
+ return lines.join("\n");
123
+ }
124
+ /**
125
+ * Returns the tool result text a runner shows the model for a final tool call record.
126
+ *
127
+ * Use it when resuming a framework whose tool result must be text. A runner whose framework has a
128
+ * native rejection, such as a rejection message argument, may pass `rejectionMessage` there instead.
129
+ * The texts match the Python core's `describe_tool_call_outcome`.
130
+ *
131
+ * @example
132
+ * ```ts
133
+ * const record = turn.recordedToolCall(pendingCallId);
134
+ * if (record !== undefined && isFinalToolCallStatus(record.status)) {
135
+ * frameworkToolResult = describeToolCallOutcome(record);
136
+ * }
137
+ * ```
138
+ * @param toolCall - Record whose status is final.
139
+ * @returns The output for `succeeded`; `The tool call failed: <error>` for `failed`; the rejection
140
+ * message, or {@link defaultRejectionToolResult}, for `rejected`; {@link outcomeUnknownToolResult}
141
+ * for `outcome_unknown`.
142
+ * @throws {TypeError} When the record status is not final.
143
+ */
144
+ export function describeToolCallOutcome(toolCall) {
145
+ switch (toolCall.status) {
146
+ case "succeeded":
147
+ return toolCall.output ?? "";
148
+ case "failed":
149
+ return `The tool call failed: ${toolCall.error ?? "unknown error"}`;
150
+ case "rejected":
151
+ return toolCall.rejectionMessage ?? defaultRejectionToolResult;
152
+ case "outcome_unknown":
153
+ return outcomeUnknownToolResult;
154
+ case "awaiting_approval":
155
+ case "approved":
156
+ case "awaiting_answer":
157
+ case "waiting_for_timer":
158
+ case "waiting_for_task":
159
+ throw new TypeError(`tool call ${toolCall.toolCallId} has no final outcome yet`);
160
+ }
161
+ }
162
+ //# sourceMappingURL=agent-session-values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-session-values.js","sourceRoot":"","sources":["../../src/agent-session-values.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { Wait, type AsyncContext, type Context, type Step, type StepDecision, type StepOptions } from "@superdurable/dex";
2
+ import { type AgentSessionTransitions } from "./agent-session-transitions.js";
3
+ /**
4
+ * Waits for the answer to one question: an `ask_user` call, or a tool's {@link ToolInputRequested}.
5
+ *
6
+ * `RunModel` raises an `ask_user` question in its own commit. A tool Step runs unlocked, so it only
7
+ * records its question, and this Step's first Execute raises it under the `PendingInterrupts` lock.
8
+ */
9
+ export declare class AwaitQuestionAnswerStep implements Step<string> {
10
+ private readonly transitions;
11
+ readonly inputCodec: import("@superdurable/dex").Codec<string>;
12
+ constructor(transitions: AgentSessionTransitions);
13
+ getStepType(): string;
14
+ getStepOptions(): StepOptions;
15
+ waitFor(context: Context, toolCallId: string): Wait;
16
+ execute(context: Context, toolCallId: string): StepDecision;
17
+ /**
18
+ * A tool question's `<id>-input-<n>` is taken when another call's interrupt is pending under it or a
19
+ * record has that key, as in the Python core.
20
+ */
21
+ private isInterruptIdOwnedByAnotherCall;
22
+ /** A tool's question waits to be raised when it is neither pending nor answered. */
23
+ private isToolQuestionUnraised;
24
+ private raiseToolQuestion;
25
+ private resolveQuestion;
26
+ /** Hands a started task's question back to it; its result, not `rejected`, ends the call. */
27
+ private returnQuestionToTask;
28
+ }
29
+ /**
30
+ * Polls one tool's remote task after its poll interval, until the task finishes.
31
+ *
32
+ * A tool Step that received {@link ToolTaskStarted} moves here. Each execution waits on a Timer, calls
33
+ * the runner's `pollToolTask` once, and records the result, asks the task's question, or moves to itself.
34
+ */
35
+ export declare class PollToolTaskStep implements Step<string> {
36
+ private readonly transitions;
37
+ readonly inputCodec: import("@superdurable/dex").Codec<string>;
38
+ constructor(transitions: AgentSessionTransitions);
39
+ getStepType(): string;
40
+ getStepOptions(): StepOptions;
41
+ waitFor(context: Context, toolCallId: string): Wait;
42
+ execute(context: AsyncContext, toolCallId: string): Promise<StepDecision>;
43
+ }
44
+ /** Waits on a Dex Timer for one `durable_wait` call, then records its result. */
45
+ export declare class AwaitTimerStep implements Step<string> {
46
+ private readonly transitions;
47
+ readonly inputCodec: import("@superdurable/dex").Codec<string>;
48
+ constructor(transitions: AgentSessionTransitions);
49
+ getStepType(): string;
50
+ getStepOptions(): StepOptions;
51
+ waitFor(context: Context, toolCallId: string): Wait;
52
+ execute(context: Context, toolCallId: string): StepDecision;
53
+ }
@@ -0,0 +1,389 @@
1
+ // Copyright (c) 2026 Super Durable, Inc.
2
+ //
3
+ // Licensed under the Sustainable Use License 1.0.
4
+ // You may not use this file except in compliance with the License.
5
+ // See the LICENSE file in the repository root.
6
+ //
7
+ // SPDX-License-Identifier: LicenseRef-Sustainable-Use-1.0
8
+ import { Timer, Wait, deadEnd, goToMany, stringCodec, } from "@superdurable/dex";
9
+ import { buildDurableWaitCompletedOutput, buildQuestionAnsweredOutput } from "./agent-built-in-tools.js";
10
+ import { ToolExecutionError, } from "./agent-framework-runner.js";
11
+ import { cancelWaitingToolCall, isToolInputRequested, noPendingToolQuestion, questionAnswerMovement, questionInterruptId, recordToolInputRequest, recordToolTaskDefect, toolStepMovement, toolStepOptions, toolTaskPollIntervalSeconds, toolTaskPollMovement, } from "./agent-session-steps.js";
12
+ import { agentSessionStepTypes, cancelledToolCall, finishTurnCancellationMovement, isCancellableByTurnControl, toolStepTypeForEffect, } from "./agent-session-transitions.js";
13
+ import { defaultQuestionDeclinedToolResult, invalidToolTaskPollInterval, isFinalToolCallStatus, missingToolTaskPoller, questionDeadlinePassed, } from "./agent-session-values.js";
14
+ /**
15
+ * Waits for the answer to one question: an `ask_user` call, or a tool's {@link ToolInputRequested}.
16
+ *
17
+ * `RunModel` raises an `ask_user` question in its own commit. A tool Step runs unlocked, so it only
18
+ * records its question, and this Step's first Execute raises it under the `PendingInterrupts` lock.
19
+ */
20
+ export class AwaitQuestionAnswerStep {
21
+ transitions;
22
+ inputCodec = stringCodec;
23
+ constructor(transitions) {
24
+ this.transitions = transitions;
25
+ }
26
+ getStepType() {
27
+ return agentSessionStepTypes.awaitQuestionAnswer;
28
+ }
29
+ getStepOptions() {
30
+ return toolStepOptions(this.transitions.persistence, agentSessionStepTypes.awaitQuestionAnswer);
31
+ }
32
+ waitFor(context, toolCallId) {
33
+ const transitions = this.transitions;
34
+ const toolCall = transitions.readToolCall(context, toolCallId);
35
+ const interruptId = questionInterruptId(toolCall);
36
+ if (this.isInterruptIdOwnedByAnotherCall(context, toolCall, interruptId)) {
37
+ // Never wait on the other call's answers; Execute fails this call at once.
38
+ return Wait.until(Timer.byDuration(0));
39
+ }
40
+ const conditions = [
41
+ transitions.persistence.toolCallCancellations.forOne(toolCallId),
42
+ transitions.persistence.interruptResolutions.forOne(interruptId),
43
+ ];
44
+ // After answer_question removed the interrupt, its deadline no longer applies.
45
+ const interrupt = transitions
46
+ .readPendingInterrupts(context)
47
+ .find((pendingInterrupt) => pendingInterrupt.interruptId === interruptId);
48
+ if (interrupt?.deadline != null) {
49
+ // Dex Timers take whole seconds; rounding up can only fire late, never early.
50
+ const remainingMs = Math.max(0, Date.parse(interrupt.deadline) - Date.now());
51
+ conditions.push(Timer.byDuration(Math.ceil(remainingMs / 1_000) * 1_000));
52
+ }
53
+ else if (this.isToolQuestionUnraised(context, toolCall, interruptId)) {
54
+ // Execute holds the PendingInterrupts lock, so it raises the tool's question at once.
55
+ conditions.push(Timer.byDuration(0));
56
+ }
57
+ return Wait.anyOf(...conditions);
58
+ }
59
+ execute(context, toolCallId) {
60
+ const transitions = this.transitions;
61
+ const persistence = transitions.persistence;
62
+ const toolCall = transitions.readToolCall(context, toolCallId);
63
+ if (toolCall.status !== "awaiting_answer") {
64
+ return deadEnd();
65
+ }
66
+ const interruptId = questionInterruptId(toolCall);
67
+ if (this.isInterruptIdOwnedByAnotherCall(context, toolCall, interruptId)) {
68
+ const error = `the tool's question cannot use interrupt ID ${interruptId}, which another tool call of this turn uses`;
69
+ transitions.finishToolCall(context,
70
+ // A started task may have taken effect, so its call is recorded by effect.
71
+ (toolCall.taskId ?? null) !== null
72
+ ? recordToolTaskDefect(toolCall, error)
73
+ : { ...toolCall, status: "failed", error, ...noPendingToolQuestion });
74
+ return deadEnd();
75
+ }
76
+ if (context.channelResults(persistence.toolCallCancellations, toolCallId).length > 0) {
77
+ return cancelWaitingToolCall(transitions, context, toolCall, { interruptId, kind: "question" }, questionAnswerMovement(persistence, toolCall));
78
+ }
79
+ const [resolution] = context.channelResults(persistence.interruptResolutions, interruptId);
80
+ if (resolution !== undefined) {
81
+ return this.resolveQuestion(context, toolCall, interruptId, resolution);
82
+ }
83
+ if (!context.hasTimerFired()) {
84
+ throw new Error(`the question wait for ${interruptId} completed without an answer`);
85
+ }
86
+ if (this.isToolQuestionUnraised(context, toolCall, interruptId)) {
87
+ if (transitions.isTurnCancelled(context, toolCall.turnId) && (toolCall.taskId ?? null) !== null) {
88
+ // cancel_turn abandons a started task instead of asking its question.
89
+ return goToMany(finishTurnCancellationMovement(toolCall.turnId));
90
+ }
91
+ const reason = transitions.readTurnControlReason(context, toolCall.turnId);
92
+ if (reason !== null && isCancellableByTurnControl(toolCall)) {
93
+ // The turn is steered or cancelled, so the tool's question is never asked.
94
+ transitions.finishToolCall(context, cancelledToolCall(toolCall, reason));
95
+ return deadEnd();
96
+ }
97
+ this.raiseToolQuestion(context, toolCall, interruptId);
98
+ return goToMany(questionAnswerMovement(persistence, toolCall));
99
+ }
100
+ const pendingInterrupts = transitions.readPendingInterrupts(context);
101
+ const interrupt = pendingInterrupts.find((pending) => pending.interruptId === interruptId);
102
+ // An early Timer, or an answer that the next wait consumes.
103
+ if (interrupt?.deadline == null || Date.parse(interrupt.deadline) > Date.now()) {
104
+ return goToMany(questionAnswerMovement(persistence, toolCall));
105
+ }
106
+ persistence.pendingInterrupts.set(context, pendingInterrupts.filter((pending) => pending.interruptId !== interruptId));
107
+ return this.resolveQuestion(context, toolCall, interruptId, { approved: false, rejectionMessage: questionDeadlinePassed, answer: null }, true);
108
+ }
109
+ /**
110
+ * A tool question's `<id>-input-<n>` is taken when another call's interrupt is pending under it or a
111
+ * record has that key, as in the Python core.
112
+ */
113
+ isInterruptIdOwnedByAnotherCall(context, toolCall, interruptId) {
114
+ if (toolCall.status !== "awaiting_answer" || toolCall.inputQuestion === null) {
115
+ return false;
116
+ }
117
+ const transitions = this.transitions;
118
+ const pending = transitions.readPendingInterrupts(context).find((interrupt) => interrupt.interruptId === interruptId);
119
+ if (pending !== undefined && pending.toolCallId !== toolCall.toolCallId) {
120
+ return true;
121
+ }
122
+ return transitions.persistence.agentToolCalls.get(context, interruptId) !== undefined;
123
+ }
124
+ /** A tool's question waits to be raised when it is neither pending nor answered. */
125
+ isToolQuestionUnraised(context, toolCall, interruptId) {
126
+ const transitions = this.transitions;
127
+ return (toolCall.status === "awaiting_answer" &&
128
+ toolCall.inputQuestion !== null &&
129
+ !transitions.readPendingInterrupts(context).some((pending) => pending.interruptId === interruptId) &&
130
+ context.channelSize(transitions.persistence.interruptResolutions, interruptId) === 0);
131
+ }
132
+ raiseToolQuestion(context, toolCall, interruptId) {
133
+ const transitions = this.transitions;
134
+ const createdAt = new Date();
135
+ const deadlineMs = transitions.config.interruptDeadlineMs;
136
+ const interrupt = {
137
+ interruptId,
138
+ kind: "question",
139
+ toolCallId: toolCall.toolCallId,
140
+ toolName: toolCall.toolName,
141
+ arguments: toolCall.arguments,
142
+ createdAt: createdAt.toISOString(),
143
+ deadline: deadlineMs === undefined ? null : new Date(createdAt.getTime() + deadlineMs).toISOString(),
144
+ question: toolCall.inputQuestion,
145
+ choices: [...toolCall.inputChoices],
146
+ allowsFreeText: toolCall.inputAllowsFreeText,
147
+ };
148
+ transitions.persistence.pendingInterrupts.set(context, [...transitions.readPendingInterrupts(context), interrupt]);
149
+ transitions.writeEvents(context, toolCall.turnId, (events) => transitions.writeInterruptRaised(events, interrupt));
150
+ }
151
+ resolveQuestion(context, toolCall, interruptId, resolution, isDeadlinePassed = false) {
152
+ const transitions = this.transitions;
153
+ const answer = resolution.answer ?? null;
154
+ const isAnswered = resolution.approved && answer !== null;
155
+ transitions.writeInterruptResolved(context, toolCall.turnId, {
156
+ interruptId,
157
+ kind: "question",
158
+ isApproved: resolution.approved,
159
+ isAnswered,
160
+ rejectionMessage: resolution.rejectionMessage,
161
+ });
162
+ if ((toolCall.taskId ?? null) !== null && toolCall.inputQuestion !== null) {
163
+ return this.returnQuestionToTask(context, toolCall, interruptId, resolution, isDeadlinePassed);
164
+ }
165
+ if (!isAnswered || answer === null) {
166
+ transitions.finishToolCall(context, {
167
+ ...toolCall,
168
+ status: "rejected",
169
+ rejectionMessage: declineText(resolution.rejectionMessage),
170
+ cancellationReason: null,
171
+ ...noPendingToolQuestion,
172
+ });
173
+ return deadEnd();
174
+ }
175
+ if (toolCall.inputQuestion === null) {
176
+ transitions.finishToolCall(context, {
177
+ ...toolCall,
178
+ status: "succeeded",
179
+ output: buildQuestionAnsweredOutput(answer),
180
+ cancellationReason: null,
181
+ });
182
+ return deadEnd();
183
+ }
184
+ transitions.writeToolCall(context, {
185
+ ...toolCall,
186
+ status: "approved",
187
+ inputAnswers: [
188
+ ...toolCall.inputAnswers,
189
+ { interruptId, question: toolCall.inputQuestion, answer, resolution: "answered" },
190
+ ],
191
+ cancellationReason: null,
192
+ ...noPendingToolQuestion,
193
+ });
194
+ return goToMany(toolStepMovement(transitions.persistence, toolStepTypeForEffect(toolCall.effect), toolCall.toolCallId));
195
+ }
196
+ /** Hands a started task's question back to it; its result, not `rejected`, ends the call. */
197
+ returnQuestionToTask(context, toolCall, interruptId, resolution, isDeadlinePassed) {
198
+ const answer = resolution.answer ?? null;
199
+ const resolved = resolution.approved && answer !== null
200
+ ? { interruptId, question: toolCall.inputQuestion ?? "", answer, resolution: "answered" }
201
+ : isDeadlinePassed
202
+ ? { interruptId, question: toolCall.inputQuestion ?? "", answer: questionDeadlinePassed, resolution: "deadline_passed" }
203
+ : {
204
+ interruptId,
205
+ question: toolCall.inputQuestion ?? "",
206
+ answer: declineText(resolution.rejectionMessage),
207
+ resolution: "declined",
208
+ };
209
+ const waiting = {
210
+ ...toolCall,
211
+ status: "waiting_for_task",
212
+ inputAnswers: [...toolCall.inputAnswers, resolved],
213
+ taskAnswerPending: true,
214
+ cancellationReason: null,
215
+ ...noPendingToolQuestion,
216
+ };
217
+ this.transitions.writeToolCall(context, waiting);
218
+ return goToMany(toolTaskPollMovement(this.transitions.persistence, waiting));
219
+ }
220
+ }
221
+ /**
222
+ * Polls one tool's remote task after its poll interval, until the task finishes.
223
+ *
224
+ * A tool Step that received {@link ToolTaskStarted} moves here. Each execution waits on a Timer, calls
225
+ * the runner's `pollToolTask` once, and records the result, asks the task's question, or moves to itself.
226
+ */
227
+ export class PollToolTaskStep {
228
+ transitions;
229
+ inputCodec = stringCodec;
230
+ constructor(transitions) {
231
+ this.transitions = transitions;
232
+ }
233
+ getStepType() {
234
+ return agentSessionStepTypes.pollToolTask;
235
+ }
236
+ getStepOptions() {
237
+ return toolStepOptions(this.transitions.persistence, agentSessionStepTypes.pollToolTask);
238
+ }
239
+ waitFor(context, toolCallId) {
240
+ const toolCall = this.transitions.readToolCall(context, toolCallId);
241
+ // A resolved question, or a cancelled turn, reaches the task at once.
242
+ const intervalSeconds = toolCall.taskAnswerPending === true || this.transitions.isTurnCancelled(context, toolCall.turnId)
243
+ ? 0
244
+ : (toolCall.taskPollIntervalSeconds ?? 1);
245
+ return Wait.until(Timer.byDuration(intervalSeconds * 1_000));
246
+ }
247
+ async execute(context, toolCallId) {
248
+ const transitions = this.transitions;
249
+ const toolCall = transitions.readToolCall(context, toolCallId);
250
+ if (isFinalToolCallStatus(toolCall.status)) {
251
+ return deadEnd();
252
+ }
253
+ if (toolCall.status !== "waiting_for_task" || (toolCall.taskId ?? null) === null) {
254
+ throw new Error(`tool call ${toolCallId} is not waiting for a task`);
255
+ }
256
+ if (transitions.isTurnCancelled(context, toolCall.turnId)) {
257
+ // This poll started after cancel_turn committed, so it abandons the task instead.
258
+ return goToMany(finishTurnCancellationMovement(toolCall.turnId));
259
+ }
260
+ const pollToolTask = transitions.runner.pollToolTask;
261
+ const events = transitions.createEventWriter(context, toolCall.turnId);
262
+ try {
263
+ if (pollToolTask === undefined) {
264
+ // A Worker whose runner lost the method; the task may still run.
265
+ transitions.finishToolCall(context, recordToolTaskDefect(toolCall, missingToolTaskPoller), events);
266
+ return deadEnd();
267
+ }
268
+ const poll = {
269
+ flowId: context.flowId,
270
+ toolCall,
271
+ idempotencyKey: `${context.flowId}/${toolCall.turnId}/${toolCall.toolCallId}`,
272
+ attempt: context.attempt,
273
+ inputAnswers: toolCall.inputAnswers,
274
+ pendingAnswer: toolCall.taskAnswerPending ? (toolCall.inputAnswers.at(-1) ?? null) : null,
275
+ events,
276
+ cancellationSignal: context.cancellationSignal,
277
+ deadline: context.deadline,
278
+ heartbeat: () => transitions.recordHeartbeat(context),
279
+ };
280
+ const polled = await transitions.tracer.traceToolCall(context, this.getStepType(), toolCall, async (pollSpan) => {
281
+ let outcome;
282
+ try {
283
+ outcome = await transitions.runWithHeartbeats(context, () => pollToolTask.call(transitions.runner, poll));
284
+ }
285
+ catch (error) {
286
+ if (!(error instanceof ToolExecutionError)) {
287
+ throw error;
288
+ }
289
+ const failed = { ...toolCall, status: "failed", error: error.message };
290
+ pollSpan.recordFinished(failed);
291
+ return failed;
292
+ }
293
+ const record = recordToolTaskPoll(toolCall, outcome);
294
+ pollSpan.recordFinished(record);
295
+ return record;
296
+ });
297
+ if (isFinalToolCallStatus(polled.status)) {
298
+ transitions.finishToolCall(context, polled, events);
299
+ return deadEnd();
300
+ }
301
+ if (polled.status === "awaiting_answer") {
302
+ // This Step runs unlocked, so it leaves PendingInterrupts to AwaitQuestionAnswer.
303
+ transitions.writeToolCall(context, polled);
304
+ return goToMany(questionAnswerMovement(transitions.persistence, polled));
305
+ }
306
+ if (polled.taskPollIntervalSeconds !== toolCall.taskPollIntervalSeconds ||
307
+ polled.taskAnswerPending !== (toolCall.taskAnswerPending ?? false) ||
308
+ polled.inputContinuation !== toolCall.inputContinuation) {
309
+ transitions.writeToolCall(context, polled);
310
+ }
311
+ return goToMany(toolTaskPollMovement(transitions.persistence, polled));
312
+ }
313
+ finally {
314
+ events.close();
315
+ }
316
+ }
317
+ }
318
+ /** Returns the record after one poll: final, awaiting an answer, or still waiting. */
319
+ function recordToolTaskPoll(toolCall, outcome) {
320
+ const polled = { ...toolCall, taskAnswerPending: false };
321
+ if (isToolTaskPending(outcome)) {
322
+ const pollIntervalSeconds = toolTaskPollIntervalSeconds(outcome.pollIntervalSeconds);
323
+ // The runner decides what the next poll needs to know, such as an answer not taken yet.
324
+ return pollIntervalSeconds === null
325
+ ? recordToolTaskDefect(toolCall, invalidToolTaskPollInterval)
326
+ : { ...polled, taskPollIntervalSeconds: pollIntervalSeconds, inputContinuation: outcome.continuation ?? null };
327
+ }
328
+ if (isToolInputRequested(outcome)) {
329
+ const asked = recordToolInputRequest(polled, outcome);
330
+ return isFinalToolCallStatus(asked.status) ? recordToolTaskDefect(toolCall, asked.error ?? "") : asked;
331
+ }
332
+ if (typeof outcome?.output !== "string") {
333
+ throw new TypeError("pollToolTask must return a ToolExecutionResult, a ToolInputRequested, or a ToolTaskPending");
334
+ }
335
+ return { ...polled, status: "succeeded", output: outcome.output };
336
+ }
337
+ /** Returns the text the model sees for a declined question; an empty message reads as none, as in Python. */
338
+ function declineText(rejectionMessage) {
339
+ return rejectionMessage === null || rejectionMessage === "" ? defaultQuestionDeclinedToolResult : rejectionMessage;
340
+ }
341
+ function isToolTaskPending(outcome) {
342
+ return outcome?.kind === "tool_task_pending";
343
+ }
344
+ /** Waits on a Dex Timer for one `durable_wait` call, then records its result. */
345
+ export class AwaitTimerStep {
346
+ transitions;
347
+ inputCodec = stringCodec;
348
+ constructor(transitions) {
349
+ this.transitions = transitions;
350
+ }
351
+ getStepType() {
352
+ return agentSessionStepTypes.awaitTimer;
353
+ }
354
+ getStepOptions() {
355
+ return toolStepOptions(this.transitions.persistence, agentSessionStepTypes.awaitTimer);
356
+ }
357
+ waitFor(context, toolCallId) {
358
+ const toolCall = this.transitions.readToolCall(context, toolCallId);
359
+ if (toolCall.waitUntil === null) {
360
+ throw new Error(`durable_wait call ${toolCallId} has no wait_until`);
361
+ }
362
+ // Dex Timers take whole seconds; rounding up can only fire late, never early.
363
+ const remainingMs = Math.max(0, Date.parse(toolCall.waitUntil) - Date.now());
364
+ return Wait.anyOf(Timer.byDuration(Math.ceil(remainingMs / 1_000) * 1_000), this.transitions.persistence.toolCallCancellations.forOne(toolCallId));
365
+ }
366
+ execute(context, toolCallId) {
367
+ const transitions = this.transitions;
368
+ const toolCall = transitions.readToolCall(context, toolCallId);
369
+ if (toolCall.status !== "waiting_for_timer") {
370
+ return deadEnd();
371
+ }
372
+ if (!context.hasTimerFired()) {
373
+ if (context.channelResults(transitions.persistence.toolCallCancellations, toolCallId).length === 0) {
374
+ throw new Error(`the durable wait ${toolCallId} completed without its Timer`);
375
+ }
376
+ return cancelWaitingToolCall(transitions, context, toolCall, null, toolStepMovement(transitions.persistence, agentSessionStepTypes.awaitTimer, toolCallId));
377
+ }
378
+ // The Timer is the authority: it never fires early, and skipping it ends the wait.
379
+ // RunModel validated these arguments, so a later maxDurableWaitMs cannot fail a started wait.
380
+ const { duration_seconds: waitedSeconds, reason } = JSON.parse(toolCall.arguments);
381
+ transitions.finishToolCall(context, {
382
+ ...toolCall,
383
+ status: "succeeded",
384
+ output: buildDurableWaitCompletedOutput(Math.trunc(waitedSeconds), reason),
385
+ });
386
+ return deadEnd();
387
+ }
388
+ }
389
+ //# sourceMappingURL=agent-session-wait-steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-session-wait-steps.js","sourceRoot":"","sources":["../../src/agent-session-wait-steps.ts"],"names":[],"mappings":"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"}