@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,153 @@
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 { setTimeout as delay } from "node:timers/promises";
9
+ import { DexServiceError, LongPollTimeoutError } from "@superdurable/dex";
10
+ /** Default long-poll duration of one `AgentEvents` read: 10 seconds. */
11
+ export const defaultAgentEventPollTimeoutMs = 10_000;
12
+ /** Long poll of the read that checks a resume token before a response commits to status 200. */
13
+ export const resumeTokenProbeTimeoutMs = 1_000;
14
+ const grpcInvalidArgument = 3;
15
+ const grpcFailedPrecondition = 9;
16
+ const turnStartSearchPageSize = 500;
17
+ const turnStartSearchPageLimit = 20;
18
+ const turnIdPattern = /^turn-(\d+)$/;
19
+ /** Validates a long-poll duration; Dex Stream reads take whole seconds. */
20
+ export function requireAgentEventPollTimeoutMs(pollTimeoutMs) {
21
+ const timeoutMs = pollTimeoutMs ?? defaultAgentEventPollTimeoutMs;
22
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1_000 || timeoutMs % 1_000 !== 0) {
23
+ throw new RangeError("pollTimeoutMs must be a positive whole number of seconds, in milliseconds");
24
+ }
25
+ return timeoutMs;
26
+ }
27
+ /**
28
+ * Reads the next `AgentEvents` message, or `undefined` when the long poll ends without one.
29
+ * A disabled Stream Store holds no events, so the read waits as an empty poll would.
30
+ */
31
+ export async function readNextAgentEvent(client, flow, flowId, eventResumeToken, pollTimeoutMs) {
32
+ try {
33
+ return await client.readStream(flowId, flow.agentEvents, eventResumeToken, pollTimeoutMs);
34
+ }
35
+ catch (error) {
36
+ if (error instanceof LongPollTimeoutError) {
37
+ return undefined;
38
+ }
39
+ if (isStreamStoreDisabledError(error)) {
40
+ await delay(Math.min(pollTimeoutMs, resumeTokenProbeTimeoutMs));
41
+ return undefined;
42
+ }
43
+ throw error;
44
+ }
45
+ }
46
+ /** Reports whether Dex rejected a Stream resume token, such as one of another session. */
47
+ export function isStreamResumeTokenRejectedError(error) {
48
+ return error instanceof DexServiceError && Number(error.code) === grpcInvalidArgument;
49
+ }
50
+ /** Reports whether a Stream call failed because the Server's Stream Store is disabled. */
51
+ export function isStreamStoreDisabledError(error) {
52
+ return error instanceof DexServiceError && Number(error.code) === grpcFailedPrecondition;
53
+ }
54
+ /** Reads once with a short long poll to learn whether Dex accepts a resume token. */
55
+ export async function probeAgentEventResumeToken(client, flow, flowId, eventResumeToken) {
56
+ try {
57
+ const firstMessage = await readNextAgentEvent(client, flow, flowId, eventResumeToken, resumeTokenProbeTimeoutMs);
58
+ return { isAccepted: true, firstMessage };
59
+ }
60
+ catch (error) {
61
+ if (isStreamResumeTokenRejectedError(error)) {
62
+ return { isAccepted: false };
63
+ }
64
+ throw error;
65
+ }
66
+ }
67
+ /** Returns the resume token of the newest retained event, or `""` when the Stream holds none. */
68
+ export async function readAgentEventsTailResumeToken(client, flow, flowId) {
69
+ try {
70
+ const page = await client.listStreamMessages(flowId, flow.agentEvents, 1);
71
+ return page.messages[0]?.resumeToken ?? "";
72
+ }
73
+ catch (error) {
74
+ if (isStreamStoreDisabledError(error)) {
75
+ return "";
76
+ }
77
+ throw error;
78
+ }
79
+ }
80
+ /**
81
+ * Finds the position just before a turn's first retained event.
82
+ *
83
+ * @returns The resume token whose next event is the turn's `turn_started`, or the turn's oldest retained
84
+ * event; `""` when that event is the oldest retained one; `undefined` when the Stream holds no event of
85
+ * the turn or the search reached its page limit.
86
+ */
87
+ export async function findAgentEventResumeTokenBeforeTurn(client, flow, flowId, turnId) {
88
+ try {
89
+ return await searchAgentEventResumeTokenBeforeTurn(client, flow, flowId, turnId);
90
+ }
91
+ catch (error) {
92
+ if (isStreamStoreDisabledError(error)) {
93
+ return undefined;
94
+ }
95
+ throw error;
96
+ }
97
+ }
98
+ async function searchAgentEventResumeTokenBeforeTurn(client, flow, flowId, turnId) {
99
+ const turnNumber = parseTurnNumber(turnId);
100
+ let hasTurnEvent = false;
101
+ let pageToken = "";
102
+ for (let pageIndex = 0; pageIndex < turnStartSearchPageLimit; pageIndex += 1) {
103
+ const page = await client.listStreamMessages(flowId, flow.agentEvents, turnStartSearchPageSize, pageToken);
104
+ for (const [index, message] of page.messages.entries()) {
105
+ const event = message.value;
106
+ if (event.turnId === turnId) {
107
+ hasTurnEvent = true;
108
+ if (event.type !== "turn_started") {
109
+ continue;
110
+ }
111
+ }
112
+ else if (!isEarlierTurn(event.turnId, turnNumber)) {
113
+ continue;
114
+ }
115
+ // The events of the turn are all newer than this message, or this message is turn_started.
116
+ const olderMessage = event.turnId === turnId ? page.messages[index + 1] : message;
117
+ if (olderMessage !== undefined) {
118
+ return hasTurnEvent ? olderMessage.resumeToken : undefined;
119
+ }
120
+ return readResumeTokenOlderThanPage(client, flow, flowId, page.nextPageToken);
121
+ }
122
+ if (page.nextPageToken === "") {
123
+ return hasTurnEvent ? "" : undefined;
124
+ }
125
+ pageToken = page.nextPageToken;
126
+ }
127
+ return undefined;
128
+ }
129
+ /** Returns the number `n` of a `turn-<n>` turn ID, or `undefined` for another format. */
130
+ export function parseTurnNumber(turnId) {
131
+ const match = turnIdPattern.exec(turnId);
132
+ return match?.[1] === undefined ? undefined : Number(match[1]);
133
+ }
134
+ /** Returns the Step type of a `StepType-Number` Step execution ID, or `""` when it has no number. */
135
+ export function readStepType(stepExecutionId) {
136
+ const separatorIndex = stepExecutionId.lastIndexOf("-");
137
+ return separatorIndex <= 0 ? "" : stepExecutionId.slice(0, separatorIndex);
138
+ }
139
+ async function readResumeTokenOlderThanPage(client, flow, flowId, nextPageToken) {
140
+ if (nextPageToken === "") {
141
+ return "";
142
+ }
143
+ const olderPage = await client.listStreamMessages(flowId, flow.agentEvents, 1, nextPageToken);
144
+ return olderPage.messages[0]?.resumeToken ?? "";
145
+ }
146
+ function isEarlierTurn(turnId, turnNumber) {
147
+ if (turnId === null || turnNumber === undefined) {
148
+ return false;
149
+ }
150
+ const otherTurnNumber = parseTurnNumber(turnId);
151
+ return otherTurnNumber !== undefined && otherTurnNumber < turnNumber;
152
+ }
153
+ //# sourceMappingURL=agent-event-stream-positions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-event-stream-positions.js","sourceRoot":"","sources":["../../../src/ui-stream/agent-event-stream-positions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { type Client } from "@superdurable/dex";
2
+ import type { AgentFrameworkRunner, DeferredToolOutcome } from "../agent-framework-runner.js";
3
+ import type { AgentSessionFlow } from "../agent-session-flow.js";
4
+ import type { AgentState, AgentToolCallRecord } from "../agent-session-values.js";
5
+ /** Reads committed session state for the UI streams; Attribute reads need no running Worker. */
6
+ export declare class AgentSessionRecordReader {
7
+ private readonly client;
8
+ private readonly flow;
9
+ private readonly flowId;
10
+ constructor(client: Client, flow: AgentSessionFlow<AgentFrameworkRunner<DeferredToolOutcome>>, flowId: string);
11
+ readAgentState(): Promise<AgentState | undefined>;
12
+ /**
13
+ * Waits until a turn's end committed, because its end event reaches the Stream before the commit.
14
+ * @returns `true` once the turn is no longer active; `false` after 3 seconds without that commit.
15
+ */
16
+ waitForTurnToEnd(turnId: string): Promise<boolean>;
17
+ /**
18
+ * Reads the IDs of the tool calls whose approval `resolve_interrupt` still accepts.
19
+ * @returns The tool call IDs of the pending `tool_approval` interrupts.
20
+ */
21
+ readPendingApprovalToolCallIds(): Promise<ReadonlySet<string>>;
22
+ isFlowRunning(): Promise<boolean>;
23
+ /**
24
+ * Reads what the session holds about one tool call of a turn.
25
+ *
26
+ * Events reach the Stream before their Step commits, so it polls the record until `isReady` holds, for
27
+ * up to 3 seconds. A turn that ended deleted its records; then it reads the turn's stored messages.
28
+ * @returns The record when it exists, plus the tool name, arguments, and stored result text from the
29
+ * record or the stored messages; each is `undefined` when neither holds it.
30
+ */
31
+ readToolCallDetails(turnId: string, toolCallId: string, isReady: (toolCall: AgentToolCallRecord) => boolean): Promise<ToolCallDetails>;
32
+ private waitForToolCall;
33
+ /**
34
+ * Waits up to 3 seconds for a tool call record to be committed, because events precede their commit.
35
+ * @returns The record, or `undefined` when it never appeared or the turn is no longer active.
36
+ */
37
+ readCommittedToolCall(turnId: string, toolCallId: string): Promise<AgentToolCallRecord | undefined>;
38
+ /**
39
+ * Reads one tool call record once, without waiting for a commit.
40
+ * @returns The record when it exists and belongs to `turnId`, otherwise `undefined`.
41
+ */
42
+ readToolCall(turnId: string, toolCallId: string): Promise<AgentToolCallRecord | undefined>;
43
+ /**
44
+ * Reads the stored tool results among the last 200 stored messages of any turn.
45
+ * @returns The results in sequence order, each with its turn, tool call ID, and the text the model saw.
46
+ */
47
+ readRecentStoredToolResults(): Promise<readonly StoredToolResult[]>;
48
+ /** Finds a tool call's stored request and result messages, newest pages first, within its turn. */
49
+ private readStoredToolMessages;
50
+ /**
51
+ * Reads stored messages with sequences in `[startSequence, endSequence)`, in sequence order, from the
52
+ * `AgentMessages` window and the `AgentMessageChunks` instances that `AgentMessageIndex` names. A message
53
+ * that retention deleted reads as `undefined`. A commit between the index read and the instance reads moves
54
+ * messages, so the read repeats with the new index.
55
+ * @returns The messages and the sequence of the oldest stored message.
56
+ * @throws Error when the index keeps changing for every attempt, or a stored message is missing.
57
+ */
58
+ private readStoredMessages;
59
+ }
60
+ /** What the session holds about one tool call; see {@link AgentSessionRecordReader.readToolCallDetails}. */
61
+ export interface ToolCallDetails {
62
+ readonly record: AgentToolCallRecord | undefined;
63
+ readonly toolName: string | undefined;
64
+ readonly toolArguments: string | undefined;
65
+ readonly storedToolOutput: string | undefined;
66
+ }
67
+ /** One stored tool result; see {@link AgentSessionRecordReader.readRecentStoredToolResults}. */
68
+ export interface StoredToolResult {
69
+ readonly turnId: string;
70
+ readonly toolCallId: string;
71
+ readonly toolOutput: string;
72
+ }
@@ -0,0 +1,241 @@
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 { setTimeout as delay } from "node:timers/promises";
9
+ import { FlowNotFoundError } from "@superdurable/dex";
10
+ import { messageSequenceKey } from "../agent-session-persistence.js";
11
+ import { findMessageChunkRange } from "../agent-session-transitions.js";
12
+ import { parseTurnNumber } from "./agent-event-stream-positions.js";
13
+ const committedRecordWaitMs = 3_000;
14
+ const committedRecordPollIntervalMs = 25;
15
+ const storedMessagePageSize = 50;
16
+ const recentStoredMessageCount = 200;
17
+ const maximumStoredMessageReadAttempts = 3;
18
+ /** Reads committed session state for the UI streams; Attribute reads need no running Worker. */
19
+ export class AgentSessionRecordReader {
20
+ client;
21
+ flow;
22
+ flowId;
23
+ constructor(client, flow, flowId) {
24
+ this.client = client;
25
+ this.flow = flow;
26
+ this.flowId = flowId;
27
+ }
28
+ async readAgentState() {
29
+ const [state] = await this.client.getAttributes(this.flowId, this.flow.agentState);
30
+ return state;
31
+ }
32
+ /**
33
+ * Waits until a turn's end committed, because its end event reaches the Stream before the commit.
34
+ * @returns `true` once the turn is no longer active; `false` after 3 seconds without that commit.
35
+ */
36
+ async waitForTurnToEnd(turnId) {
37
+ const deadline = Date.now() + committedRecordWaitMs;
38
+ for (;;) {
39
+ const state = await this.readAgentState();
40
+ if (state?.activeTurnId !== turnId) {
41
+ return true;
42
+ }
43
+ if (Date.now() >= deadline) {
44
+ return false;
45
+ }
46
+ await delay(committedRecordPollIntervalMs);
47
+ }
48
+ }
49
+ /**
50
+ * Reads the IDs of the tool calls whose approval `resolve_interrupt` still accepts.
51
+ * @returns The tool call IDs of the pending `tool_approval` interrupts.
52
+ */
53
+ async readPendingApprovalToolCallIds() {
54
+ const [interrupts] = await this.client.getAttributes(this.flowId, this.flow.pendingInterrupts);
55
+ return new Set((interrupts ?? [])
56
+ .filter((interrupt) => interrupt.kind === "tool_approval")
57
+ .map((interrupt) => interrupt.toolCallId));
58
+ }
59
+ async isFlowRunning() {
60
+ try {
61
+ return (await this.client.describeFlow(this.flowId)).status === "running";
62
+ }
63
+ catch (error) {
64
+ if (error instanceof FlowNotFoundError) {
65
+ return false;
66
+ }
67
+ throw error;
68
+ }
69
+ }
70
+ /**
71
+ * Reads what the session holds about one tool call of a turn.
72
+ *
73
+ * Events reach the Stream before their Step commits, so it polls the record until `isReady` holds, for
74
+ * up to 3 seconds. A turn that ended deleted its records; then it reads the turn's stored messages.
75
+ * @returns The record when it exists, plus the tool name, arguments, and stored result text from the
76
+ * record or the stored messages; each is `undefined` when neither holds it.
77
+ */
78
+ async readToolCallDetails(turnId, toolCallId, isReady) {
79
+ const record = await this.waitForToolCall(turnId, toolCallId, isReady);
80
+ if (record !== undefined) {
81
+ return { record, toolName: record.toolName, toolArguments: record.arguments, storedToolOutput: undefined };
82
+ }
83
+ const storedMessages = await this.readStoredToolMessages(turnId, toolCallId);
84
+ return {
85
+ record: undefined,
86
+ toolName: storedMessages.toolCall?.toolName ?? storedMessages.toolResult?.toolName ?? undefined,
87
+ toolArguments: storedMessages.toolCall?.toolArguments ?? undefined,
88
+ storedToolOutput: storedMessages.toolResult?.toolOutput ?? undefined,
89
+ };
90
+ }
91
+ async waitForToolCall(turnId, toolCallId, isReady) {
92
+ const deadline = Date.now() + committedRecordWaitMs;
93
+ for (;;) {
94
+ const [record] = await this.client.getAttributes(this.flowId, this.flow.agentToolCalls.instance(toolCallId));
95
+ const turnRecord = record?.turnId === turnId ? record : undefined;
96
+ if ((turnRecord !== undefined && isReady(turnRecord)) || Date.now() >= deadline) {
97
+ return turnRecord;
98
+ }
99
+ if (turnRecord === undefined && (await this.readAgentState())?.activeTurnId !== turnId) {
100
+ return undefined;
101
+ }
102
+ await delay(committedRecordPollIntervalMs);
103
+ }
104
+ }
105
+ /**
106
+ * Waits up to 3 seconds for a tool call record to be committed, because events precede their commit.
107
+ * @returns The record, or `undefined` when it never appeared or the turn is no longer active.
108
+ */
109
+ async readCommittedToolCall(turnId, toolCallId) {
110
+ return this.waitForToolCall(turnId, toolCallId, () => true);
111
+ }
112
+ /**
113
+ * Reads one tool call record once, without waiting for a commit.
114
+ * @returns The record when it exists and belongs to `turnId`, otherwise `undefined`.
115
+ */
116
+ async readToolCall(turnId, toolCallId) {
117
+ const [record] = await this.client.getAttributes(this.flowId, this.flow.agentToolCalls.instance(toolCallId));
118
+ return record?.turnId === turnId ? record : undefined;
119
+ }
120
+ /**
121
+ * Reads the stored tool results among the last 200 stored messages of any turn.
122
+ * @returns The results in sequence order, each with its turn, tool call ID, and the text the model saw.
123
+ */
124
+ async readRecentStoredToolResults() {
125
+ const state = await this.readAgentState();
126
+ const endSequence = state?.nextMessageSequence ?? 1;
127
+ const startSequence = Math.max(1, endSequence - recentStoredMessageCount);
128
+ if (startSequence >= endSequence) {
129
+ return [];
130
+ }
131
+ const results = [];
132
+ for (const message of (await this.readStoredMessages(startSequence, endSequence)).messages) {
133
+ const toolOutput = message?.toolOutput ?? message?.text;
134
+ if (message?.role === "tool" && message.toolCallId !== null && toolOutput != null) {
135
+ results.push({ turnId: message.turnId, toolCallId: message.toolCallId, toolOutput });
136
+ }
137
+ }
138
+ return results;
139
+ }
140
+ /** Finds a tool call's stored request and result messages, newest pages first, within its turn. */
141
+ async readStoredToolMessages(turnId, toolCallId) {
142
+ const state = await this.readAgentState();
143
+ const turnNumber = parseTurnNumber(turnId);
144
+ const found = {};
145
+ let endSequence = state?.nextMessageSequence ?? 1;
146
+ let firstSequence = 1;
147
+ while (endSequence > firstSequence) {
148
+ const startSequence = Math.max(firstSequence, endSequence - storedMessagePageSize);
149
+ const page = await this.readStoredMessages(startSequence, endSequence);
150
+ const messages = page.messages;
151
+ firstSequence = page.firstSequence;
152
+ let hasEarlierTurn = false;
153
+ for (const message of messages) {
154
+ if (message === undefined) {
155
+ continue;
156
+ }
157
+ if (message.turnId !== turnId) {
158
+ hasEarlierTurn ||= (parseTurnNumber(message.turnId) ?? 0) < (turnNumber ?? 0);
159
+ continue;
160
+ }
161
+ if (message.toolCallId === toolCallId) {
162
+ if (message.role === "tool") {
163
+ found.toolResult = message;
164
+ }
165
+ else {
166
+ found.toolCall = message;
167
+ }
168
+ }
169
+ }
170
+ if (hasEarlierTurn || (found.toolCall !== undefined && found.toolResult !== undefined)) {
171
+ return found;
172
+ }
173
+ endSequence = startSequence;
174
+ }
175
+ return found;
176
+ }
177
+ /**
178
+ * Reads stored messages with sequences in `[startSequence, endSequence)`, in sequence order, from the
179
+ * `AgentMessages` window and the `AgentMessageChunks` instances that `AgentMessageIndex` names. A message
180
+ * that retention deleted reads as `undefined`. A commit between the index read and the instance reads moves
181
+ * messages, so the read repeats with the new index.
182
+ * @returns The messages and the sequence of the oldest stored message.
183
+ * @throws Error when the index keeps changing for every attempt, or a stored message is missing.
184
+ */
185
+ async readStoredMessages(startSequence, endSequence) {
186
+ let [index] = await this.client.getAttributes(this.flowId, this.flow.agentMessageIndex);
187
+ for (let attempt = 1;; attempt += 1) {
188
+ const firstSequence = index?.firstSequence ?? 1;
189
+ const chunkStarts = new Set();
190
+ const windowSequences = [];
191
+ for (let sequence = Math.max(firstSequence, startSequence); sequence < endSequence; sequence += 1) {
192
+ const range = index === undefined ? undefined : findMessageChunkRange(index, sequence);
193
+ if (range === undefined) {
194
+ windowSequences.push(sequence);
195
+ }
196
+ else {
197
+ chunkStarts.add(range.firstSequence);
198
+ }
199
+ }
200
+ const chunkReads = [...chunkStarts].map((chunkStart) => this.flow.agentMessageChunks.instance(messageSequenceKey(chunkStart)));
201
+ const windowReads = windowSequences.map((sequence) => this.flow.agentMessages.instance(messageSequenceKey(sequence)));
202
+ const values = (await this.client.getAttributes(this.flowId, ...[this.flow.agentMessageIndex, ...chunkReads, ...windowReads]));
203
+ const readIndex = values[0];
204
+ // A rollover or retention between the two reads moved messages, so read again with the new index.
205
+ if (!isSameMessageLayout(index, readIndex)) {
206
+ if (attempt >= maximumStoredMessageReadAttempts) {
207
+ throw new Error(`the stored messages of session ${this.flowId} moved during ${maximumStoredMessageReadAttempts} reads`);
208
+ }
209
+ index = readIndex;
210
+ continue;
211
+ }
212
+ const bySequence = new Map();
213
+ for (const value of values.slice(1, 1 + chunkReads.length)) {
214
+ for (const message of value?.messages ?? []) {
215
+ bySequence.set(message.sequence, message);
216
+ }
217
+ }
218
+ for (const [offset, value] of values.slice(1 + chunkReads.length).entries()) {
219
+ const sequence = windowSequences[offset];
220
+ if (sequence !== undefined && value !== undefined) {
221
+ bySequence.set(sequence, value);
222
+ }
223
+ }
224
+ const messages = [];
225
+ for (let sequence = startSequence; sequence < endSequence; sequence += 1) {
226
+ const message = bySequence.get(sequence);
227
+ if (message === undefined && sequence >= firstSequence) {
228
+ throw new Error(`session ${this.flowId} has no stored message ${sequence}`);
229
+ }
230
+ messages.push(message);
231
+ }
232
+ return { messages, firstSequence };
233
+ }
234
+ }
235
+ }
236
+ function isSameMessageLayout(left, right) {
237
+ return (left?.firstSequence === right?.firstSequence &&
238
+ left?.windowFirstSequence === right?.windowFirstSequence &&
239
+ left?.chunks.length === right?.chunks.length);
240
+ }
241
+ //# sourceMappingURL=agent-session-record-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-session-record-reader.js","sourceRoot":"","sources":["../../../src/ui-stream/agent-session-record-reader.ts"],"names":[],"mappings":"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"}