@arnilo/prism 0.3.2 → 0.5.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 (208) hide show
  1. package/CHANGELOG.md +50 -1
  2. package/README.md +42 -62
  3. package/dist/agent-run-lifecycle.js +4 -0
  4. package/dist/agent-run-state.d.ts +5 -2
  5. package/dist/agent-run-state.js +18 -8
  6. package/dist/agent-session/session/assemble.d.ts +6 -0
  7. package/dist/agent-session/session/assemble.js +391 -0
  8. package/dist/agent-session/session/persist.d.ts +28 -0
  9. package/dist/agent-session/session/persist.js +166 -0
  10. package/dist/agent-session/session/provider-round.d.ts +6 -0
  11. package/dist/agent-session/session/provider-round.js +231 -0
  12. package/dist/agent-session/session/tool-round.d.ts +31 -0
  13. package/dist/agent-session/session/tool-round.js +473 -0
  14. package/dist/agent-session/session/types.d.ts +115 -0
  15. package/dist/agent-session/session/types.js +5 -0
  16. package/dist/agent-session/session.d.ts +54 -41
  17. package/dist/agent-session/session.js +23 -1132
  18. package/dist/capture.d.ts +63 -0
  19. package/dist/capture.js +67 -0
  20. package/dist/cli-dev.d.ts +29 -0
  21. package/dist/cli-dev.js +52 -0
  22. package/dist/cli-init.d.ts +34 -3
  23. package/dist/cli-init.js +192 -24
  24. package/dist/cli-runner.d.ts +6 -2
  25. package/dist/cli-runner.js +57 -10
  26. package/dist/content.d.ts +3 -3
  27. package/dist/content.js +3 -1
  28. package/dist/contracts-core/agent.d.ts +8 -0
  29. package/dist/contracts-core/batch.d.ts +97 -0
  30. package/dist/contracts-core/batch.js +65 -0
  31. package/dist/contracts-core/content.d.ts +72 -1
  32. package/dist/contracts-core/embeddings.d.ts +30 -0
  33. package/dist/contracts-core/embeddings.js +17 -0
  34. package/dist/contracts-core/images.d.ts +60 -0
  35. package/dist/contracts-core/images.js +17 -0
  36. package/dist/contracts-core/moderation.d.ts +46 -0
  37. package/dist/contracts-core/moderation.js +34 -0
  38. package/dist/contracts-core/speech.d.ts +39 -0
  39. package/dist/contracts-core/speech.js +17 -0
  40. package/dist/contracts-core/transcription.d.ts +48 -0
  41. package/dist/contracts-core/transcription.js +17 -0
  42. package/dist/contracts-core/video.d.ts +61 -0
  43. package/dist/contracts-core/video.js +17 -0
  44. package/dist/contracts-core.d.ts +7 -0
  45. package/dist/contracts-core.js +7 -0
  46. package/dist/contracts-protocol.d.ts +18 -0
  47. package/dist/contracts-run-state.d.ts +1 -2
  48. package/dist/index.d.ts +7 -3
  49. package/dist/index.js +5 -3
  50. package/dist/input.d.ts +8 -0
  51. package/dist/input.js +4 -0
  52. package/dist/node/agent-definitions.d.ts +1 -8
  53. package/dist/node/agent-definitions.js +0 -34
  54. package/dist/node/settings.d.ts +0 -1
  55. package/dist/node/settings.js +0 -5
  56. package/dist/pinned-fetch.js +29 -3
  57. package/dist/provider-events.js +3 -4
  58. package/dist/providers/media.d.ts +1 -2
  59. package/dist/providers/media.js +1 -4
  60. package/dist/rpc.d.ts +1 -1
  61. package/dist/rpc.js +4 -4
  62. package/dist/testing/persistence-schema.d.ts +1 -1
  63. package/dist/testing/persistence-schema.js +32 -28
  64. package/dist/testing/provider-conformance.d.ts +114 -5
  65. package/dist/testing/provider-conformance.js +342 -0
  66. package/dist/testing/tool-conformance.d.ts +25 -0
  67. package/dist/testing/tool-conformance.js +128 -1
  68. package/dist/testing/tool-effect-store-conformance.d.ts +0 -1
  69. package/dist/testing/tool-effect-store-conformance.js +0 -3
  70. package/dist/thinking.d.ts +48 -9
  71. package/dist/thinking.js +134 -8
  72. package/dist/tool-search.d.ts +76 -0
  73. package/dist/tool-search.js +199 -0
  74. package/docs/0.1.0-readiness.md +3 -3
  75. package/docs/a2a.md +2 -2
  76. package/docs/acp-agent.md +1 -1
  77. package/docs/acp.md +3 -3
  78. package/docs/ag-ui-adoption.md +1 -1
  79. package/docs/ag-ui.md +1 -2
  80. package/docs/agent-definitions.md +1 -1
  81. package/docs/agent-events.md +5 -5
  82. package/docs/agent-identity.md +13 -2
  83. package/docs/audit-export.md +3 -3
  84. package/docs/batch-jobs.md +120 -0
  85. package/docs/browser-automation.md +5 -5
  86. package/docs/caveman.md +2 -2
  87. package/docs/cli-rpc.md +43 -9
  88. package/docs/coding-agent-tools.md +19 -19
  89. package/docs/coding-review-and-diagnostics.md +2 -2
  90. package/docs/coding-security.md +5 -5
  91. package/docs/coding-tools.md +82 -0
  92. package/docs/coding-workspaces.md +2 -2
  93. package/docs/compaction-and-retry.md +2 -2
  94. package/docs/compaction-llm.md +4 -4
  95. package/docs/compaction-observational-memory.md +3 -3
  96. package/docs/computer-use-linux.md +13 -2
  97. package/docs/context-and-skills.md +3 -1
  98. package/docs/conversations.md +4 -4
  99. package/docs/core.md +85 -0
  100. package/docs/credential-storage.md +12 -8
  101. package/docs/credentials-and-redaction.md +1 -1
  102. package/docs/data-classification.md +1 -1
  103. package/docs/database-persistence.md +7 -3
  104. package/docs/dev-inspector.md +103 -0
  105. package/docs/device-adapters.md +2 -2
  106. package/docs/diagrams.md +247 -0
  107. package/docs/document-reader.md +6 -6
  108. package/docs/documents.md +214 -0
  109. package/docs/embeddings.md +112 -0
  110. package/docs/enterprise-postgres-state.md +7 -7
  111. package/docs/evaluations.md +41 -7
  112. package/docs/extensions.md +3 -3
  113. package/docs/forge-integration.md +3 -3
  114. package/docs/graft.md +5 -5
  115. package/docs/guardrails.md +2 -2
  116. package/docs/host-security.md +16 -15
  117. package/docs/image-generation.md +129 -0
  118. package/docs/impeccable.md +7 -5
  119. package/docs/index.md +84 -46
  120. package/docs/indexed-code-search.md +2 -2
  121. package/docs/language-intelligence.md +4 -4
  122. package/docs/live-testing.md +126 -0
  123. package/docs/mcp-tools.md +44 -13
  124. package/docs/middleware-hooks.md +1 -1
  125. package/docs/migrate-to-0.4.md +312 -0
  126. package/docs/migrate-to-0.5.md +122 -0
  127. package/docs/migration.md +51 -1
  128. package/docs/model-registry.md +38 -0
  129. package/docs/model-routing.md +6 -6
  130. package/docs/moderation.md +117 -0
  131. package/docs/multi-agent-patterns.md +177 -0
  132. package/docs/multimodal-content.md +27 -3
  133. package/docs/obscura.md +12 -12
  134. package/docs/observability.md +32 -7
  135. package/docs/openapi-tools.md +14 -4
  136. package/docs/operations.md +11 -0
  137. package/docs/performance.md +30 -10
  138. package/docs/persistence-credentials-multimodality-primitives.md +7 -7
  139. package/docs/policy-and-audit.md +18 -8
  140. package/docs/ponytail.md +3 -3
  141. package/docs/postgres-persistence.md +5 -5
  142. package/docs/process-sessions.md +2 -2
  143. package/docs/prompt-registry.md +106 -0
  144. package/docs/provider-caching.md +36 -32
  145. package/docs/provider-conformance.md +24 -2
  146. package/docs/provider-packages.md +58 -22
  147. package/docs/provider-primitives.md +5 -5
  148. package/docs/provider-request-policies.md +1 -1
  149. package/docs/providers/ai-sdk.md +18 -6
  150. package/docs/providers/alibaba.md +10 -6
  151. package/docs/providers/anthropic.md +10 -6
  152. package/docs/providers/azure.md +20 -4
  153. package/docs/providers/bedrock.md +18 -3
  154. package/docs/providers/clinepass.md +7 -3
  155. package/docs/providers/commandcode.md +253 -0
  156. package/docs/providers/deepseek.md +7 -3
  157. package/docs/providers/google.md +8 -4
  158. package/docs/providers/hyper.md +284 -0
  159. package/docs/providers/kimi.md +7 -3
  160. package/docs/providers/neuralwatt.md +12 -8
  161. package/docs/providers/ollama.md +18 -3
  162. package/docs/providers/openai-compatible.md +5 -1
  163. package/docs/providers/openai.md +9 -5
  164. package/docs/providers/opencode-go.md +8 -4
  165. package/docs/providers/openrouter.md +8 -4
  166. package/docs/providers/vertex.md +21 -5
  167. package/docs/providers/xai.md +7 -3
  168. package/docs/providers/zai.md +7 -3
  169. package/docs/rag.md +31 -9
  170. package/docs/release-and-install.md +181 -76
  171. package/docs/resource-loading.md +1 -1
  172. package/docs/runs-and-usage.md +28 -3
  173. package/docs/server.md +94 -5
  174. package/docs/settings-auth-trust-security.md +7 -5
  175. package/docs/sheets.md +229 -0
  176. package/docs/speech.md +126 -0
  177. package/docs/sqlite-persistence.md +4 -4
  178. package/docs/supervisors.md +4 -3
  179. package/docs/thinking-and-reasoning.md +93 -60
  180. package/docs/tool-conformance.md +28 -3
  181. package/docs/tool-execution-primitives.md +8 -8
  182. package/docs/tools.md +32 -5
  183. package/docs/web-tools.md +3 -3
  184. package/docs/wiki.md +7 -7
  185. package/docs/work-artifacts-and-review.md +17 -6
  186. package/docs/work-connectors.md +4 -4
  187. package/docs/work-tools.md +5 -5
  188. package/docs/workflow-orchestration-primitives.md +35 -11
  189. package/docs/workflows.md +74 -13
  190. package/docs/working-and-semantic-memory.md +53 -5
  191. package/package.json +14 -31
  192. package/templates/README.md +23 -0
  193. package/templates/deep-research/README.md.tmpl +47 -0
  194. package/templates/deep-research/env.example.tmpl +12 -0
  195. package/templates/deep-research/gitignore.tmpl +7 -0
  196. package/templates/deep-research/manifest.json +12 -0
  197. package/templates/deep-research/package.json.tmpl +23 -0
  198. package/templates/deep-research/src/agent.ts.tmpl +81 -0
  199. package/templates/deep-research/src/index.ts.tmpl +53 -0
  200. package/templates/deep-research/src/tests/research.test.ts.tmpl +114 -0
  201. package/templates/deep-research/src/tools.ts.tmpl +86 -0
  202. package/templates/deep-research/src/types.ts.tmpl +45 -0
  203. package/templates/deep-research/src/workflow.ts.tmpl +156 -0
  204. package/templates/deep-research/tsconfig.json.tmpl +15 -0
  205. package/templates/init/manifest.json +5 -0
  206. package/templates/init/package.json.tmpl +2 -1
  207. package/templates/init/providers.json +40 -24
  208. package/docs/antigravity-agent.md +0 -207
@@ -0,0 +1,231 @@
1
+ /** Provider-round phase of runInternal (plan 059). */
2
+ import { assertGuardrailsAllowed, GuardrailError, runGuardrails } from "../../guardrails.js";
3
+ import { createProviderTurnMetadata, readProviderHttpStatus } from "../../observability.js";
4
+ import { providerToolCallDeltaContent } from "../../provider-events.js";
5
+ import { errorToErrorInfo, redactRunLedgerRecord, redactSecrets } from "../../redaction.js";
6
+ import { createDefaultRetryPolicy, waitForRetry } from "../../retry.js";
7
+ import { bridgeAbort, errorFromInfo, isSteerSoftInterrupt, jsonBytes, mergeRetry, ProviderTurnFailure, providerContent, randomId, reconstructMissingToolCalls, SteerSoftInterrupt, throwIfAborted, } from "../helpers.js";
8
+ /**
9
+ * Plan 062: price usage through the host's {@link CostCatalog} when the provider
10
+ * did not report a cost itself. Stale/unknown quotes, catalog failures, or
11
+ * non-`per_million_tokens` units degrade to usage-only (cost untouched).
12
+ */
13
+ async function withCatalogCost(catalog, model, usage, signal) {
14
+ if (!catalog || usage.cost !== undefined)
15
+ return usage;
16
+ try {
17
+ const quote = await catalog.get(model.model, { signal });
18
+ if (!quote || (quote.unit !== undefined && quote.unit !== "per_million_tokens"))
19
+ return usage;
20
+ const cost = ((usage.inputTokens ?? 0) * (quote.input ?? 0) +
21
+ (usage.outputTokens ?? 0) * (quote.output ?? 0) +
22
+ (usage.cacheReadTokens ?? 0) * (quote.cacheRead ?? 0) +
23
+ (usage.cacheWriteTokens ?? 0) * (quote.cacheWrite ?? 0)) /
24
+ 1_000_000;
25
+ if (!Number.isFinite(cost) || cost <= 0)
26
+ return usage;
27
+ return { ...usage, cost, ...(quote.currency !== undefined ? { currency: quote.currency } : {}) };
28
+ }
29
+ catch {
30
+ return usage; // catalog failure degrades to usage-only
31
+ }
32
+ }
33
+ export async function recordProviderUsage(ctx, turnUsage, turn, attempt) {
34
+ const { session, limits, runUsage, runId } = ctx;
35
+ const usage = turnUsage
36
+ ? await withCatalogCost(session.agent.config.costCatalog, ctx.model, turnUsage, ctx.controller.signal)
37
+ : undefined;
38
+ limits.recordUsage(usage);
39
+ if (!usage)
40
+ return;
41
+ runUsage.add(usage);
42
+ if (!session.activeLedger)
43
+ return;
44
+ const usageRecord = {
45
+ id: randomId("usage"),
46
+ sessionId: session.id,
47
+ runId,
48
+ scope: "provider_turn",
49
+ turn,
50
+ attempt,
51
+ usage,
52
+ recordedAt: new Date().toISOString(),
53
+ ...session.activeOwnership,
54
+ };
55
+ await session.activeLedger.appendUsage(redactRunLedgerRecord(usageRecord, session.activeRedactor));
56
+ }
57
+ export async function generateWithRetry(session, request, runId, options, signal, requestSecrets = [], turn = 1, recordUsage) {
58
+ const retry = mergeRetry(session.agent.config.retry, options.retry);
59
+ const secrets = [...requestSecrets, ...(retry?.secrets ?? [])];
60
+ const policy = retry?.policy ?? (retry ? createDefaultRetryPolicy(retry) : undefined);
61
+ for (let attempt = 1;; attempt += 1) {
62
+ try {
63
+ return await generateProviderTurn(session, request, runId, signal, secrets, turn, attempt, recordUsage);
64
+ }
65
+ catch (error) {
66
+ if (error instanceof GuardrailError || isSteerSoftInterrupt(error))
67
+ throw error;
68
+ const failure = error instanceof ProviderTurnFailure ? error : undefined;
69
+ const info = failure ? redactSecrets(failure.info, secrets) : errorToErrorInfo(error, secrets);
70
+ if (!policy || failure?.observable)
71
+ throw errorFromInfo(info);
72
+ const context = { sessionId: session.id, runId, attempt, error: info, metadata: retry?.metadata, signal };
73
+ let decision = await policy.decide(context);
74
+ const payload = (await session.agent.config.middleware?.run("retry", { context, decision })) ?? {
75
+ context,
76
+ decision,
77
+ };
78
+ decision = payload.decision;
79
+ if (!decision.retry)
80
+ throw errorFromInfo(info);
81
+ const delayMs = decision.delayMs ?? 0;
82
+ session.emit({ type: "retry_scheduled", sessionId: session.id, runId, attempt, delayMs, error: info });
83
+ await waitForRetry(decision, signal);
84
+ }
85
+ }
86
+ }
87
+ export async function generateProviderTurn(session, request, runId, signal, secrets = [], turn = 1, attempt = 1, recordUsage) {
88
+ session.activeLimits.charge("maxProviderAttempts");
89
+ session.activeLimits.charge("maxRequestBytes", jsonBytes(request));
90
+ const startedAt = performance.now();
91
+ const providerId = session.activeProvider?.id ?? request.model.provider;
92
+ const buildMetadata = (extra = {}) => createProviderTurnMetadata(request, providerId, { attempt, ...extra });
93
+ session.emit({
94
+ type: "provider_turn_started",
95
+ sessionId: session.id,
96
+ runId,
97
+ turn,
98
+ metadata: buildMetadata(),
99
+ });
100
+ const content = [];
101
+ const calls = [];
102
+ const toolDeltas = [];
103
+ let messageId;
104
+ let started = false;
105
+ let usage;
106
+ let usageRecorded = false;
107
+ const bufferedOutput = [];
108
+ const bufferOutput = Boolean(session.activeGuardrails?.output?.length || session.activeLimitOutputBuffer);
109
+ const emitOutput = (event) => {
110
+ if (bufferOutput)
111
+ bufferedOutput.push(event);
112
+ else
113
+ session.emit(event);
114
+ };
115
+ const recordTurnUsage = async () => {
116
+ if (usageRecorded)
117
+ return;
118
+ usageRecorded = true;
119
+ await recordUsage?.(usage, turn, attempt);
120
+ };
121
+ const turnAbort = new AbortController();
122
+ const cleanupTurn = bridgeAbort(signal, turnAbort);
123
+ session.activeProviderTurnAbort = turnAbort;
124
+ if (session.pendingSoftInterrupt) {
125
+ session.pendingSoftInterrupt = false;
126
+ turnAbort.abort(new SteerSoftInterrupt());
127
+ }
128
+ const turnRequest = { ...request, signal: turnAbort.signal };
129
+ try {
130
+ throwIfAborted(turnAbort.signal);
131
+ for await (const event of session.activeProvider.generate(turnRequest)) {
132
+ throwIfAborted(turnAbort.signal);
133
+ session.activeLimits.charge("maxResponseBytes", jsonBytes(event));
134
+ if (event.type === "error")
135
+ throw new ProviderTurnFailure(event.error, started);
136
+ if (event.type === "usage")
137
+ usage = event.usage;
138
+ if (event.type === "done") {
139
+ usage = event.usage ?? usage;
140
+ break;
141
+ }
142
+ if (event.type === "message_start") {
143
+ started = true;
144
+ messageId = event.messageId;
145
+ emitOutput({ type: "message_started", sessionId: session.id, runId, message: { id: messageId, role: "assistant", content: [] } });
146
+ continue;
147
+ }
148
+ if (event.type === "content_delta" || event.type === "tool_call" || event.type === "tool_call_delta") {
149
+ if (!started) {
150
+ started = true;
151
+ emitOutput({ type: "message_started", sessionId: session.id, runId, message: { role: "assistant", content: [] } });
152
+ }
153
+ if (event.type === "tool_call_delta") {
154
+ toolDeltas.push(event);
155
+ emitOutput({ type: "message_delta", sessionId: session.id, runId, content: providerToolCallDeltaContent(event) });
156
+ continue;
157
+ }
158
+ const block = providerContent(event);
159
+ content.push(block);
160
+ if (block.type === "tool_call")
161
+ calls.push(block);
162
+ emitOutput({ type: "message_delta", sessionId: session.id, runId, content: block });
163
+ }
164
+ }
165
+ for (const call of reconstructMissingToolCalls(toolDeltas, calls)) {
166
+ content.push(call);
167
+ calls.push(call);
168
+ emitOutput({ type: "message_delta", sessionId: session.id, runId, content: call });
169
+ }
170
+ await recordTurnUsage();
171
+ if (session.activeGuardrails?.output?.length) {
172
+ assertGuardrailsAllowed(await runGuardrails({
173
+ stage: "output",
174
+ guardrails: session.activeGuardrails,
175
+ value: { content, calls, messageId, started, usage },
176
+ context: { sessionId: session.id, runId, metadata: session.activeMetadata ?? {}, signal: turnAbort.signal },
177
+ redactor: session.activeRedactor,
178
+ emit: (event) => session.emit(event),
179
+ }));
180
+ }
181
+ if (bufferOutput)
182
+ for (const event of bufferedOutput)
183
+ session.emit(event);
184
+ const latencyMs = Math.round(performance.now() - startedAt);
185
+ session.emit({
186
+ type: "provider_turn_finished",
187
+ sessionId: session.id,
188
+ runId,
189
+ turn,
190
+ metadata: buildMetadata({ latencyMs }),
191
+ usage,
192
+ });
193
+ return { content, calls, messageId, started, usage };
194
+ }
195
+ catch (error) {
196
+ if (isSteerSoftInterrupt(error) || isSteerSoftInterrupt(turnAbort.signal.reason)) {
197
+ await recordTurnUsage();
198
+ const latencyMs = Math.round(performance.now() - startedAt);
199
+ session.emit({
200
+ type: "provider_turn_finished",
201
+ sessionId: session.id,
202
+ runId,
203
+ turn,
204
+ metadata: buildMetadata({ latencyMs }),
205
+ usage,
206
+ });
207
+ throw new SteerSoftInterrupt();
208
+ }
209
+ const latencyMs = Math.round(performance.now() - startedAt);
210
+ const info = error instanceof ProviderTurnFailure ? redactSecrets(error.info, secrets) : errorToErrorInfo(error, secrets);
211
+ await recordTurnUsage();
212
+ session.emit({
213
+ type: "provider_turn_finished",
214
+ sessionId: session.id,
215
+ runId,
216
+ turn,
217
+ metadata: buildMetadata({ latencyMs, httpStatus: readProviderHttpStatus(info) }),
218
+ usage,
219
+ error: info,
220
+ });
221
+ if (error instanceof GuardrailError || error instanceof ProviderTurnFailure)
222
+ throw error;
223
+ throw new ProviderTurnFailure(info, started);
224
+ }
225
+ finally {
226
+ cleanupTurn();
227
+ if (session.activeProviderTurnAbort === turnAbort)
228
+ session.activeProviderTurnAbort = undefined;
229
+ }
230
+ }
231
+ //# sourceMappingURL=provider-round.js.map
@@ -0,0 +1,31 @@
1
+ /** Tool-round phase of runInternal (plan 059). */
2
+ import type { AgentRunRef, LoopContext, NestedRunRef, PendingDecision, ResumeNestedRun, StickyDecision, ToolCallContent, ToolRegistry, ToolResult, Usage } from "../../contracts.js";
3
+ import { AgentDelegationSuspendedError } from "../../contracts.js";
4
+ import type { RoundContext, SessionHost } from "./types.js";
5
+ export declare function matchNestedSticky(session: SessionHost, decision: PendingDecision): StickyDecision | undefined;
6
+ export declare function matchStickyDecision(session: SessionHost, call: ToolCallContent, registry: ToolRegistry): StickyDecision | undefined;
7
+ export declare function buildPendingDecision(session: SessionHost, call: ToolCallContent, approvalId: string, registry: ToolRegistry, runId: string, metadata: Readonly<Record<string, unknown>>, signal: AbortSignal): PendingDecision;
8
+ export declare function applyNestedRun(session: SessionHost, input: {
9
+ ref: AgentRunRef;
10
+ toolCall: ToolCallContent;
11
+ path: readonly string[];
12
+ pending: readonly PendingDecision[];
13
+ hook?: ResumeNestedRun;
14
+ }): Promise<{
15
+ toolResult: ToolResult;
16
+ } | {
17
+ entry: NestedRunRef;
18
+ pending: PendingDecision[];
19
+ }>;
20
+ export declare function suspendGatedRound(ctx: RoundContext): Promise<void>;
21
+ export declare function suspendNested(ctx: RoundContext, nested: {
22
+ entry: NestedRunRef;
23
+ toolCall: ToolCallContent;
24
+ pending: PendingDecision[];
25
+ }): Promise<never>;
26
+ export declare function replayToolResult(ctx: RoundContext, result: ToolResult): Promise<void>;
27
+ export declare function handleNestedSignal(ctx: RoundContext, error: AgentDelegationSuspendedError): Promise<void>;
28
+ export declare function bindChargeToolRound(ctx: RoundContext): LoopContext["chargeToolRound"];
29
+ export declare function bindDispatchToolCall(ctx: RoundContext): LoopContext["dispatchToolCall"];
30
+ export declare function replayDurableNestedAndPending(ctx: RoundContext): Promise<void>;
31
+ export declare function runLoopUntilSettled(ctx: RoundContext): Promise<Usage | undefined>;