@yolk-sdk/agent 0.1.0-canary.21 → 0.1.0-canary.23

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 (39) hide show
  1. package/README.md +36 -8
  2. package/dist/loop/run.d.mts.map +1 -1
  3. package/dist/loop/run.mjs +38 -19
  4. package/dist/loop/run.mjs.map +1 -1
  5. package/dist/protocol/content.d.mts +2 -1
  6. package/dist/protocol/content.d.mts.map +1 -1
  7. package/dist/protocol/content.mjs +8 -1
  8. package/dist/protocol/content.mjs.map +1 -1
  9. package/dist/protocol/index.d.mts +3 -3
  10. package/dist/protocol/index.d.mts.map +1 -1
  11. package/dist/protocol/index.mjs +3 -3
  12. package/dist/protocol/message.d.mts +20 -1
  13. package/dist/protocol/message.d.mts.map +1 -1
  14. package/dist/protocol/message.mjs +59 -1
  15. package/dist/protocol/message.mjs.map +1 -1
  16. package/dist/providers/anthropic/claude-provider.d.mts +6 -0
  17. package/dist/providers/anthropic/claude-provider.d.mts.map +1 -1
  18. package/dist/providers/anthropic/claude-provider.mjs +47 -24
  19. package/dist/providers/anthropic/claude-provider.mjs.map +1 -1
  20. package/dist/providers/openai/codex-provider.d.mts.map +1 -1
  21. package/dist/providers/openai/codex-provider.mjs +4 -2
  22. package/dist/providers/openai/codex-provider.mjs.map +1 -1
  23. package/dist/providers/openai/provider.d.mts.map +1 -1
  24. package/dist/providers/openai/provider.mjs +4 -2
  25. package/dist/providers/openai/provider.mjs.map +1 -1
  26. package/dist/providers/transcript.d.mts +9 -0
  27. package/dist/providers/transcript.d.mts.map +1 -0
  28. package/dist/providers/transcript.mjs +17 -0
  29. package/dist/providers/transcript.mjs.map +1 -0
  30. package/package.json +1 -1
  31. package/src/loop/run.ts +56 -17
  32. package/src/protocol/content.ts +11 -0
  33. package/src/protocol/index.ts +10 -1
  34. package/src/protocol/message.ts +127 -0
  35. package/src/providers/anthropic/claude-provider.ts +78 -34
  36. package/src/providers/openai/codex-provider.ts +4 -1
  37. package/src/providers/openai/provider.ts +4 -2
  38. package/src/providers/transcript.ts +24 -0
  39. package/src/tools/README.md +3 -2
package/README.md CHANGED
@@ -27,11 +27,11 @@ Canary APIs are unstable. Keep all `@yolk-sdk/*` packages on the same version.
27
27
  | `@yolk-sdk/agent/tools` | Tool module registry, `makeTool`, task/question tool contracts |
28
28
  | `@yolk-sdk/agent/react` | Headless React chat hook, reducer, selectors, and render model |
29
29
  | `@yolk-sdk/agent/oauth` | Provider-neutral OAuth token and broker contracts |
30
- | `@yolk-sdk/agent/providers/openai` | OpenAI/Codex OAuth and provider mechanics |
30
+ | `@yolk-sdk/agent/providers/openai` | OpenAI/Codex OAuth and broker helpers |
31
31
  | `@yolk-sdk/agent/providers/openai/codex` | OpenAI Codex request and auth helpers |
32
32
  | `@yolk-sdk/agent/providers/openai/codex-provider` | Codex LLM provider factory |
33
33
  | `@yolk-sdk/agent/providers/openai/provider` | OpenAI-compatible LLM provider factory |
34
- | `@yolk-sdk/agent/providers/anthropic` | Anthropic/Claude OAuth and provider mechanics |
34
+ | `@yolk-sdk/agent/providers/anthropic` | Anthropic/Claude OAuth and broker helpers |
35
35
  | `@yolk-sdk/agent/providers/anthropic/claude` | Claude request and auth helpers |
36
36
  | `@yolk-sdk/agent/providers/anthropic/claude-provider` | Claude LLM provider factory |
37
37
  | `@yolk-sdk/agent/skillset` | Portable skill and slash-command parsing/catalogs |
@@ -41,11 +41,14 @@ Canary APIs are unstable. Keep all `@yolk-sdk/*` packages on the same version.
41
41
 
42
42
  ```ts
43
43
  import {
44
+ danglingHostToolCalls,
44
45
  hitlResponseEvent,
45
46
  makeSubagentRunId,
46
47
  ProviderErrorInfo,
47
48
  questionResponseStructuredContent,
48
- UserMessage
49
+ repairDanglingHostToolCalls,
50
+ UserMessage,
51
+ validateNoDanglingHostToolCalls
49
52
  } from '@yolk-sdk/agent/protocol'
50
53
  import { run } from '@yolk-sdk/agent/loop'
51
54
  import { runRuntime } from '@yolk-sdk/agent/runtime'
@@ -145,9 +148,24 @@ const ContextLayer = makeWindowCompactionTransformer({
145
148
  - `AudioPart` with `InlineBase64`, `Url`, or host-owned `Ref` source
146
149
 
147
150
  Build sources with `inlineBase64AttachmentSource`, `urlAttachmentSource`, or
148
- `refAttachmentSource`. Providers require inline/resolved media before lowering. Use inline base64
149
- for simple apps, or persist `Ref` values and call `resolveContentAttachmentSources` at your storage
150
- boundary before provider execution. Host apps own upload, auth, retention, and ref hydration policy.
151
+ `refAttachmentSource`. Providers can pass through supported media URLs: OpenAI Chat, OpenAI Codex,
152
+ and Anthropic support image URLs; Anthropic also supports PDF URLs. Use inline base64 for simple apps,
153
+ durable URLs for app-owned uploads, or persist `Ref` values and call
154
+ `resolveContentAttachmentSources` at your storage boundary before provider execution. Host apps own
155
+ upload, auth, retention, URL durability, and ref hydration policy.
156
+
157
+ ```ts
158
+ import { ImagePart, UserMessage, urlAttachmentSource } from '@yolk-sdk/agent/protocol'
159
+
160
+ const message = UserMessage.make({
161
+ content: [
162
+ ImagePart.make({
163
+ source: urlAttachmentSource('https://cdn.example.com/image.webp'),
164
+ mimeType: 'image/webp'
165
+ })
166
+ ]
167
+ })
168
+ ```
151
169
 
152
170
  For text files, use `documentPartFromText`, `inferTextDocumentMimeType`, and the client helper
153
171
  `documentPartFromTextFile` to create UTF-8 inline `DocumentPart` values without trusting filename
@@ -189,6 +207,14 @@ Annotations must be JSON-compatible. Use stable app-owned keys, preferably `snak
189
207
  strings for dates inside annotations. Never put secrets, credentials, private ids, auth state, or
190
208
  hidden policy in annotations, author, or timestamps; providers may send them to models.
191
209
 
210
+ ## Transcript invariants
211
+
212
+ Every assistant host tool call must be followed by a matching `ToolResultMessage` before the next
213
+ non-tool message/provider request. Use `validateNoDanglingHostToolCalls` for preflight checks,
214
+ `danglingHostToolCalls` for diagnostics, and `repairDanglingHostToolCalls` only when loading older
215
+ persisted transcripts that already have gaps. Built-in providers reject dangling host tool calls
216
+ before vendor lowering with a non-retryable validation error.
217
+
192
218
  ## Human-in-the-loop
193
219
 
194
220
  HITL is protocol-level, not UI-level:
@@ -232,13 +258,15 @@ data. `makeTool` converts these failures into `ToolResult.isError = true` so the
232
258
  see the message and continue. The result includes structured content with `type`, `tool`,
233
259
  `reason`, `message`, and optional `details` for UI/runtime handling.
234
260
 
235
- Use `ToolError` for fatal runtime/tool infrastructure failures: broken wiring, auth/config
236
- defects, storage failures, or implementation bugs.
261
+ Thrown `ToolError`s become model-visible failed tool results plus `ToolExecutionError` events,
262
+ so keep messages safe and non-secret. Reserve stream failure for provider/runtime defects,
263
+ aborts, and implementation bugs outside typed tool execution.
237
264
 
238
265
  ## Host responsibilities
239
266
 
240
267
  - Choose models/providers and map provider streams into protocol events.
241
268
  - Persist sessions, transcripts, and append logs.
269
+ - Persist/return one `ToolResultMessage` for every host tool call, including `isError` failures.
242
270
  - Persist terminal provider failures and clear active run ids where applicable.
243
271
  - Provide tools, approval policy, auth, storage, and observability.
244
272
  - Compact context and decide memory/search policy.
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.mts","names":[],"sources":["../../src/loop/run.ts"],"mappings":";;;;;;;;;KAoEY,cAAA;AAAA,KAEA,SAAA;EAAA,SACD,QAAA,EAAU,aAAA,CAAc,YAAA;EAAA,SACxB,YAAA;EAAA,SACA,KAAA,EAAO,aAAA,CAAc,OAAA;EAAA,SACrB,aAAA,GAAgB,aAAA,CAAc,YAAA;EAAA,SAC9B,KAAA;EAAA,SACA,eAAA,GAAkB,oBAAA;EAAA,SAClB,YAAA,GAAe,sBAAA;AAAA;AAAA,KAGd,eAAA,GAAkB,SAAS;EAAA,SAC5B,IAAI;AAAA;AAAA,KAGH,eAAA;EAAA,SACD,KAAA,EAAO,aAAA,CAAc,QAAA;EAAA,SACrB,KAAA,GAAQ,aAAA,CAAc,OAAA;EAAA,SACtB,aAAA,GAAgB,aAAA,CAAc,YAAA;EAAA,SAC9B,KAAA;EAAA,SACA,eAAA,GAAkB,aAAA,CAAc,YAAA;EAAA,SAChC,IAAA;EAAA,SACA,KAAA,GAAQ,UAAA;AAAA;AAAA,cA4iCN,YAAA,GACX,MAAA,EAAQ,eAAA,KACP,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,cAAA,EAAgB,kBAAA,GAAqB,WAAA,GAAc,UAAA;AAAA,cAuBnE,YAAA,GACX,MAAA,EAAQ,eAAA,KACP,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,cAAA,EAAgB,UAAA,GAAa,YAAA;AAAA,cA6C7C,GAAA,GACX,MAAA,EAAQ,SAAA,KACP,MAAA,CAAO,MAAA,CACR,UAAA,EACA,cAAA,EACA,kBAAA,GAAqB,WAAA,GAAc,UAAA,GAAa,YAAA"}
1
+ {"version":3,"file":"run.d.mts","names":[],"sources":["../../src/loop/run.ts"],"mappings":";;;;;;;;;KAoEY,cAAA;AAAA,KAEA,SAAA;EAAA,SACD,QAAA,EAAU,aAAA,CAAc,YAAA;EAAA,SACxB,YAAA;EAAA,SACA,KAAA,EAAO,aAAA,CAAc,OAAA;EAAA,SACrB,aAAA,GAAgB,aAAA,CAAc,YAAA;EAAA,SAC9B,KAAA;EAAA,SACA,eAAA,GAAkB,oBAAA;EAAA,SAClB,YAAA,GAAe,sBAAA;AAAA;AAAA,KAGd,eAAA,GAAkB,SAAS;EAAA,SAC5B,IAAI;AAAA;AAAA,KAGH,eAAA;EAAA,SACD,KAAA,EAAO,aAAA,CAAc,QAAA;EAAA,SACrB,KAAA,GAAQ,aAAA,CAAc,OAAA;EAAA,SACtB,aAAA,GAAgB,aAAA,CAAc,YAAA;EAAA,SAC9B,KAAA;EAAA,SACA,eAAA,GAAkB,aAAA,CAAc,YAAA;EAAA,SAChC,IAAA;EAAA,SACA,KAAA,GAAQ,UAAA;AAAA;AAAA,cAmlCN,YAAA,GACX,MAAA,EAAQ,eAAA,KACP,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,cAAA,EAAgB,kBAAA,GAAqB,WAAA,GAAc,UAAA;AAAA,cAuBnE,YAAA,GACX,MAAA,EAAQ,eAAA,KACP,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,cAAA,EAAgB,UAAA,GAAa,YAAA;AAAA,cA6C7C,GAAA,GACX,MAAA,EAAQ,SAAA,KACP,MAAA,CAAO,MAAA,CACR,UAAA,EACA,cAAA,EACA,kBAAA,GAAqB,WAAA,GAAc,UAAA,GAAa,YAAA"}
package/dist/loop/run.mjs CHANGED
@@ -50,6 +50,32 @@ const subagentCompletedEvent = (input) => {
50
50
  createdAtMs: input.endedAtMs
51
51
  });
52
52
  };
53
+ const toolCompletionEvents = (input) => {
54
+ const completed = subagentCompletedEvent(input);
55
+ const toolCompleted = ToolExecutionCompleted.make({
56
+ call: input.call,
57
+ result: input.result,
58
+ createdAtMs: input.endedAtMs
59
+ });
60
+ return completed === void 0 ? [toolCompleted] : [toolCompleted, completed];
61
+ };
62
+ const toolErrorResult = (call, error) => ToolResult.make({
63
+ toolCallId: call.id,
64
+ content: error.message,
65
+ isError: true
66
+ });
67
+ const toolErrorEvents = (input) => [ToolExecutionError.make({
68
+ call: input.call,
69
+ message: input.error.message,
70
+ code: toolErrorCode(input.error),
71
+ createdAtMs: input.endedAtMs
72
+ }), ...toolCompletionEvents({
73
+ call: input.call,
74
+ result: toolErrorResult(input.call, input.error),
75
+ model: input.model,
76
+ startedAtMs: input.startedAtMs,
77
+ endedAtMs: input.endedAtMs
78
+ })];
53
79
  const unsupportedInputError = (message) => new LLMError({
54
80
  cause: "validation_error",
55
81
  message,
@@ -158,26 +184,19 @@ const makeToolExecutionStream = (executor, call, model) => Stream.unwrap(Effect.
158
184
  call,
159
185
  createdAtMs: startedAtMs
160
186
  }), started];
161
- return Stream.fromIterable(startEvents).pipe(Stream.concat(Stream.fromEffect(executor.execute(call).pipe(Effect.flatMap((result) => Clock.currentTimeMillis.pipe(Effect.map((endedAtMs) => {
162
- const completed = subagentCompletedEvent({
163
- call,
164
- result,
165
- model,
166
- startedAtMs,
167
- endedAtMs
168
- });
169
- const toolCompleted = ToolExecutionCompleted.make({
170
- call,
171
- result,
172
- createdAtMs: endedAtMs
173
- });
174
- return completed === void 0 ? [toolCompleted] : [toolCompleted, completed];
175
- }))))).pipe(Stream.flatMap(Stream.fromIterable), Stream.catchTag("ToolError", (error) => Stream.fromEffect(Clock.currentTimeMillis).pipe(Stream.flatMap((endedAtMs) => Stream.make(ToolExecutionError.make({
187
+ return Stream.fromIterable(startEvents).pipe(Stream.concat(Stream.fromEffect(executor.execute(call).pipe(Effect.flatMap((result) => Clock.currentTimeMillis.pipe(Effect.map((endedAtMs) => toolCompletionEvents({
176
188
  call,
177
- message: error.message,
178
- code: toolErrorCode(error),
179
- createdAtMs: endedAtMs
180
- }))), Stream.concat(Stream.fail(error)))))));
189
+ result,
190
+ model,
191
+ startedAtMs,
192
+ endedAtMs
193
+ })))))).pipe(Stream.flatMap(Stream.fromIterable), Stream.catchTag("ToolError", (error) => Stream.fromEffect(Clock.currentTimeMillis).pipe(Stream.flatMap((endedAtMs) => Stream.fromIterable(toolErrorEvents({
194
+ call,
195
+ error,
196
+ model,
197
+ startedAtMs,
198
+ endedAtMs
199
+ }))))))));
181
200
  }));
182
201
  const boundedToolConcurrency = (loopConfig) => Math.max(1, loopConfig.toolConcurrency);
183
202
  const toolResultMessageFromResult = (result) => ToolResultMessage.make({
@@ -1 +1 @@
1
- {"version":3,"file":"run.mjs","names":["AgentLLMTextDelta","AgentLLMReasoningDelta"],"sources":["../../src/loop/run.ts"],"sourcesContent":["import { Clock, Effect, Ref, Stream } from 'effect'\nimport * as Schema from 'effect/Schema'\nimport {\n AgentAwaitingInput,\n AgentEnd,\n AgentRetry,\n AgentStart,\n AssistantMessageEvent,\n UsageUpdate,\n addAgentUsage,\n contentParts,\n contentPreview,\n LLMReasoningDelta as AgentLLMReasoningDelta,\n LLMStreamEnd,\n LLMStreamStart,\n LLMTextDelta as AgentLLMTextDelta,\n ToolExecutionCompleted,\n ToolExecutionError,\n ToolExecutionStarted,\n ToolApprovalRequested,\n ToolInputEnd,\n ToolInputDelta,\n ToolInputStart,\n QuestionRequested,\n ProviderToolResult,\n QuestionRequest,\n QuestionToolParams,\n formatQuestionResponseContent,\n hitlResponseEvent,\n questionResponseStructuredContent,\n makeSubagentRunId,\n ToolApprovalRequest,\n ToolResultMessage,\n SubagentCompleted,\n SubagentStarted,\n assistantHostToolCalls,\n type ToolCall,\n type AgentReasoningEffort,\n type HitlRequest,\n type HitlResponse,\n type QuestionPrompt,\n type QuestionResponse,\n type ToolApprovalResponse,\n ToolResult,\n TurnEnd,\n TurnStart,\n zeroAgentUsage,\n type AgentEvent,\n type AgentErrorCode,\n type AgentMessage,\n type AgentUsage,\n type AgentModelCapabilities,\n type ToolDef\n} from '@yolk-sdk/agent/protocol'\nimport { accumulateAssistantMessage, collectToolCalls } from './accumulator.ts'\nimport {\n AbortError,\n LLMError,\n ToolError,\n type AgentLoopError,\n type LLMProviderError\n} from './error.ts'\nimport type { LLMEvent } from './llm-event.ts'\nimport { ContextTransformer, type ContextTransformResult } from './services/context-transformer.ts'\nimport { LLMProvider, type LLMRequest } from './services/llm-provider.ts'\nimport { LoopConfig, type LoopConfigShape } from './services/loop-config.ts'\nimport { ToolExecutor } from './services/tool-executor.ts'\n\nexport type AgentLoopRunId = string\n\nexport type RunConfig = {\n readonly messages: ReadonlyArray<AgentMessage>\n readonly systemPrompt: string\n readonly tools: ReadonlyArray<ToolDef>\n readonly hitlResponses?: ReadonlyArray<HitlResponse>\n readonly model: string\n readonly reasoningEffort?: AgentReasoningEffort\n readonly capabilities?: AgentModelCapabilities\n}\n\nexport type ModelTurnConfig = RunConfig & {\n readonly turn: number\n}\n\nexport type ToolBatchConfig = {\n readonly calls: ReadonlyArray<ToolCall>\n readonly tools?: ReadonlyArray<ToolDef>\n readonly hitlResponses?: ReadonlyArray<HitlResponse>\n readonly model?: string\n readonly createdMessages?: ReadonlyArray<AgentMessage>\n readonly turn?: number\n readonly usage?: AgentUsage\n}\n\nconst questionToolName = 'question'\n\ntype TaskCallMetadata = {\n readonly subagentRunId: string\n readonly subagentType: string\n readonly description: string\n}\n\nconst objectField = (input: unknown, key: string) =>\n input !== null && typeof input === 'object'\n ? Object.getOwnPropertyDescriptor(input, key)?.value\n : undefined\n\nconst nonEmptyStringField = (input: unknown, key: string) => {\n const value = objectField(input, key)\n\n return typeof value === 'string' && value.trim().length > 0 ? value : undefined\n}\n\nconst taskCallMetadata = (call: ToolCall): TaskCallMetadata | undefined => {\n if (call.name !== 'task') {\n return undefined\n }\n\n const subagentType = nonEmptyStringField(call.params, 'subagent_type')\n const description = nonEmptyStringField(call.params, 'description')\n\n if (subagentType === undefined || description === undefined) {\n return undefined\n }\n\n return {\n subagentRunId: makeSubagentRunId(call.id),\n subagentType,\n description\n }\n}\n\nconst subagentStartedEvent = (input: {\n readonly call: ToolCall\n readonly model: string\n readonly startedAtMs: number\n}) => {\n const metadata = taskCallMetadata(input.call)\n\n return metadata === undefined\n ? undefined\n : SubagentStarted.make({\n parentToolCallId: input.call.id,\n subagentRunId: metadata.subagentRunId,\n subagentType: metadata.subagentType,\n description: metadata.description,\n model: input.model,\n createdAtMs: input.startedAtMs\n })\n}\n\nconst subagentCompletedEvent = (input: {\n readonly call: ToolCall\n readonly result: ToolResult\n readonly model: string\n readonly startedAtMs: number\n readonly endedAtMs: number\n}) => {\n const metadata = taskCallMetadata(input.call)\n\n return metadata === undefined\n ? undefined\n : SubagentCompleted.make({\n parentToolCallId: input.call.id,\n subagentRunId: metadata.subagentRunId,\n subagentType: metadata.subagentType,\n description: metadata.description,\n model: input.model,\n status: input.result.isError === true ? 'error' : 'completed',\n durationMs: Math.max(0, input.endedAtMs - input.startedAtMs),\n summary: contentPreview(input.result.content),\n createdAtMs: input.endedAtMs\n })\n}\n\nconst unsupportedInputError = (message: string) =>\n new LLMError({\n cause: 'validation_error',\n message,\n retryable: false\n })\n\nconst validateContent = (message: AgentMessage, capabilities: AgentModelCapabilities) =>\n Effect.forEach(contentPartsFromMessage(message), part => {\n switch (part._tag) {\n case 'Text':\n return capabilities.input.text\n ? Effect.void\n : Effect.fail(unsupportedInputError('Text input is not supported by this model'))\n case 'Image':\n return capabilities.input.image\n ? Effect.void\n : Effect.fail(unsupportedInputError('Image input is not supported by this model'))\n case 'Document':\n return capabilities.input.document\n ? Effect.void\n : Effect.fail(unsupportedInputError('Document input is not supported by this model'))\n case 'Audio':\n return capabilities.input.audio\n ? Effect.void\n : Effect.fail(unsupportedInputError('Audio input is not supported by this model'))\n }\n })\n\nconst contentPartsFromMessage = (message: AgentMessage) => {\n switch (message._tag) {\n case 'User':\n case 'ToolResult':\n return contentParts(message.content)\n case 'Assistant':\n return message.parts.flatMap(part => (part._tag === 'Text' ? contentParts(part.content) : []))\n }\n}\n\nconst validateCapabilities = (\n config: RunConfig,\n messages: ReadonlyArray<AgentMessage>\n): Effect.Effect<void, LLMError> => {\n const capabilities = config.capabilities\n\n if (capabilities === undefined) {\n return Effect.void\n }\n\n if (!capabilities.tools && config.tools.length > 0) {\n return Effect.fail(unsupportedInputError('Tools are not supported by this model'))\n }\n\n if (!capabilities.reasoning && config.reasoningEffort !== undefined) {\n return Effect.fail(unsupportedInputError('Reasoning effort is not supported by this model'))\n }\n\n return Effect.forEach(messages, message => validateContent(message, capabilities)).pipe(\n Effect.asVoid\n )\n}\n\nconst toLlmEvent = (event: LLMEvent): ReadonlyArray<AgentEvent> => {\n switch (event._tag) {\n case 'TextDelta':\n return [AgentLLMTextDelta.make({ text: event.text })]\n case 'ReasoningDelta':\n return [AgentLLMReasoningDelta.make({ text: event.text })]\n case 'ToolCall':\n return [ToolInputEnd.make({ call: event.call })]\n case 'ToolInputStart':\n return [ToolInputStart.make({ id: event.id, name: event.name })]\n case 'ToolInputDelta':\n return [ToolInputDelta.make({ id: event.id, delta: event.delta })]\n case 'ProviderToolResult':\n return [ProviderToolResult.make({ call: event.call, result: event.result })]\n case 'Usage':\n return [UsageUpdate.make({ usage: event.usage })]\n case 'Done':\n return []\n }\n}\n\nconst isLlmEvent = (event: LLMEvent | AgentEvent | AgentRetry): event is LLMEvent => {\n switch (event._tag) {\n case 'TextDelta':\n case 'ReasoningDelta':\n case 'Done':\n case 'ToolCall':\n case 'ToolInputStart':\n case 'ToolInputDelta':\n case 'ProviderToolResult':\n case 'Usage':\n return true\n default:\n return false\n }\n}\n\ntype TurnStreamInput = {\n readonly config: RunConfig\n readonly contextTransformer: {\n readonly transform: (\n messages: ReadonlyArray<AgentMessage>\n ) => Effect.Effect<ContextTransformResult, AgentLoopError>\n }\n readonly loopConfig: LoopConfigShape\n readonly provider: {\n readonly stream: (request: LLMRequest) => Stream.Stream<LLMEvent, LLMProviderError>\n }\n readonly executor: {\n readonly execute: (call: ToolCall) => Effect.Effect<ToolResult, ToolError>\n }\n readonly currentMessages: ReadonlyArray<AgentMessage>\n readonly createdMessages: Ref.Ref<ReadonlyArray<AgentMessage>>\n readonly usage: Ref.Ref<AgentUsage>\n readonly turn: number\n}\n\nconst maxUnhintedRetryDelayMs = 30_000\nconst maxHintedRetryDelayMs = 2_147_483_647\n\nconst validDelayMs = (delayMs: number) =>\n Number.isFinite(delayMs) && delayMs >= 0 ? Math.floor(delayMs) : undefined\n\nconst hintedRetryDelayMs = (error: LLMError) => {\n const delayMs = error.provider?.retryAfterMs\n const validDelay = delayMs === undefined ? undefined : validDelayMs(delayMs)\n\n return validDelay === undefined ? undefined : Math.min(validDelay, maxHintedRetryDelayMs)\n}\n\nconst retryDelayMs = (baseDelayMs: number, attempt: number, error: LLMError) => {\n const hintedDelay = hintedRetryDelayMs(error)\n\n if (hintedDelay !== undefined) {\n return hintedDelay\n }\n\n const delayMs = validDelayMs(baseDelayMs * 2 ** Math.max(0, attempt - 1)) ?? 0\n\n return Math.min(delayMs, maxUnhintedRetryDelayMs)\n}\n\nconst retryReason = (error: LLMError): AgentErrorCode => error.cause\n\nconst retrySleep = (delayMs: number) =>\n delayMs === 0 ? Effect.void : Effect.sleep(`${delayMs} millis`)\n\nconst failAgentLoopError = (\n error: AgentLoopError\n): Stream.Stream<LLMEvent | AgentRetry, AgentLoopError> => Stream.fail(error)\n\nconst sleepStream = (delayMs: number): Stream.Stream<LLMEvent | AgentRetry, AgentLoopError> =>\n Stream.fromEffect(retrySleep(delayMs)).pipe(Stream.flatMap(() => Stream.empty))\n\nconst withProviderRetries = (\n stream: Stream.Stream<LLMEvent, LLMProviderError>,\n loopConfig: TurnStreamInput['loopConfig'],\n makeStream: () => Stream.Stream<LLMEvent, LLMProviderError>,\n attempt: number\n): Stream.Stream<LLMEvent | AgentRetry, AgentLoopError> =>\n Stream.unwrap(\n Ref.make(false).pipe(\n Effect.map(emittedProviderEvent =>\n stream.pipe(\n Stream.tap(() => Ref.set(emittedProviderEvent, true)),\n Stream.catchTags({\n LLMError: error =>\n Stream.unwrap(\n Ref.get(emittedProviderEvent).pipe(\n Effect.map(emitted => {\n if (\n emitted ||\n !error.retryable ||\n error.cause === 'context_overflow' ||\n attempt > loopConfig.maxRetries\n ) {\n return failAgentLoopError(error)\n }\n\n const delayMs = retryDelayMs(loopConfig.retryBaseDelayMs, attempt, error)\n return Stream.make(\n AgentRetry.make({\n attempt,\n reason: retryReason(error),\n delayMs,\n message: error.message,\n ...(error.provider === undefined ? {} : { provider: error.provider })\n })\n ).pipe(\n Stream.concat(sleepStream(delayMs)),\n Stream.concat(\n withProviderRetries(makeStream(), loopConfig, makeStream, attempt + 1)\n )\n )\n })\n )\n ),\n AbortError: failAgentLoopError,\n FauxExhaustedError: failAgentLoopError\n })\n )\n )\n )\n )\n\nconst makeToolExecutionStream = (\n executor: TurnStreamInput['executor'],\n call: ToolCall,\n model: string\n): Stream.Stream<AgentEvent, AgentLoopError> =>\n Stream.unwrap(\n Effect.gen(function* () {\n const startedAtMs = yield* Clock.currentTimeMillis\n const started = subagentStartedEvent({ call, model, startedAtMs })\n const startEvents: ReadonlyArray<AgentEvent> =\n started === undefined\n ? [ToolExecutionStarted.make({ call, createdAtMs: startedAtMs })]\n : [ToolExecutionStarted.make({ call, createdAtMs: startedAtMs }), started]\n\n return Stream.fromIterable(startEvents).pipe(\n Stream.concat(\n Stream.fromEffect(\n executor.execute(call).pipe(\n Effect.flatMap(result =>\n Clock.currentTimeMillis.pipe(\n Effect.map(endedAtMs => {\n const completed = subagentCompletedEvent({\n call,\n result,\n model,\n startedAtMs,\n endedAtMs\n })\n const toolCompleted = ToolExecutionCompleted.make({\n call,\n result,\n createdAtMs: endedAtMs\n })\n\n return completed === undefined ? [toolCompleted] : [toolCompleted, completed]\n })\n )\n )\n )\n ).pipe(\n Stream.flatMap(Stream.fromIterable),\n Stream.catchTag('ToolError', error =>\n Stream.fromEffect(Clock.currentTimeMillis).pipe(\n Stream.flatMap(endedAtMs =>\n Stream.make(\n ToolExecutionError.make({\n call,\n message: error.message,\n code: toolErrorCode(error),\n createdAtMs: endedAtMs\n })\n )\n ),\n Stream.concat(Stream.fail(error))\n )\n )\n )\n )\n )\n })\n )\n\ntype IndexedToolResultMessage = {\n readonly index: number\n readonly message: AgentMessage\n}\n\ntype IndexedToolCall = {\n readonly index: number\n readonly call: ToolCall\n}\n\ntype PreparedToolCall =\n | {\n readonly _tag: 'Execute'\n readonly index: number\n readonly call: ToolCall\n readonly events: ReadonlyArray<AgentEvent>\n }\n | {\n readonly _tag: 'Result'\n readonly index: number\n readonly call: ToolCall\n readonly result: ToolResult\n readonly events: ReadonlyArray<AgentEvent>\n }\n | {\n readonly _tag: 'Pending'\n readonly request: HitlRequest\n readonly events: ReadonlyArray<AgentEvent>\n }\n\ntype PreparedToolBatch = {\n readonly callsToExecute: ReadonlyArray<IndexedToolCall>\n readonly resultMessages: ReadonlyArray<IndexedToolResultMessage>\n readonly resultEvents: ReadonlyArray<AgentEvent>\n readonly events: ReadonlyArray<AgentEvent>\n readonly pendingRequests: ReadonlyArray<HitlRequest>\n readonly pendingEvents: ReadonlyArray<AgentEvent>\n}\n\ntype NonEmptyHitlRequests = readonly [HitlRequest, ...Array<HitlRequest>]\n\nconst boundedToolConcurrency = (loopConfig: LoopConfigShape) =>\n Math.max(1, loopConfig.toolConcurrency)\n\nconst toolResultMessageFromResult = (result: ToolResult) =>\n ToolResultMessage.make({\n toolCallId: result.toolCallId,\n content: result.content,\n isError: result.isError,\n structuredContent: result.structuredContent\n })\n\nconst toolDefFor = (tools: ReadonlyArray<ToolDef>, call: ToolCall) =>\n tools.find(tool => tool.name === call.name)\n\nconst approvalRequired = (tools: ReadonlyArray<ToolDef>, call: ToolCall) =>\n toolDefFor(tools, call)?.approval?.mode === 'manual'\n\nconst approvalRequestId = (call: ToolCall) => `approval:${call.id}`\n\nconst questionRequestId = (call: ToolCall) => `question:${call.id}`\n\nconst matchesApproval = (response: ToolApprovalResponse, call: ToolCall) =>\n response.toolCallId === call.id && response.requestId === approvalRequestId(call)\n\nconst matchesQuestion = (response: QuestionResponse, call: ToolCall) =>\n response.toolCallId === call.id && response.requestId === questionRequestId(call)\n\nconst approvalResponseFor = (responses: ReadonlyArray<HitlResponse>, call: ToolCall) =>\n responses.flatMap(response =>\n response._tag === 'ToolApprovalResponse' && matchesApproval(response, call) ? [response] : []\n )[0]\n\nconst questionResponseFor = (responses: ReadonlyArray<HitlResponse>, call: ToolCall) =>\n responses.flatMap(response =>\n response._tag === 'QuestionResponse' && matchesQuestion(response, call) ? [response] : []\n )[0]\n\nconst toolApprovalRequest = (tools: ReadonlyArray<ToolDef>, call: ToolCall): ToolApprovalRequest =>\n ToolApprovalRequest.make({\n requestId: approvalRequestId(call),\n toolCallId: call.id,\n call,\n policy: toolDefFor(tools, call)?.approval\n })\n\nconst deniedToolResult = (call: ToolCall, response: ToolApprovalResponse) => {\n const reason = response.reason ?? 'Denied by user'\n\n return ToolResult.make({\n toolCallId: call.id,\n content: `Tool call denied: ${reason}`,\n isError: true,\n structuredContent: {\n type: 'tool_approval_denied',\n reason,\n source: response.source\n }\n })\n}\n\nconst questionToolResult = (\n response: QuestionResponse,\n questions: ReadonlyArray<QuestionPrompt>\n) => {\n return ToolResult.make({\n toolCallId: response.toolCallId,\n content: formatQuestionResponseContent(response, questions),\n isError: response.outcome === 'cancelled' ? true : undefined,\n structuredContent: questionResponseStructuredContent(response)\n })\n}\n\nconst invalidQuestionToolResult = (call: ToolCall) =>\n ToolResult.make({\n toolCallId: call.id,\n content: 'Invalid question arguments.',\n isError: true,\n structuredContent: { type: 'question_invalid' }\n })\n\nconst prepareQuestionCall = (\n call: ToolCall,\n index: number,\n responses: ReadonlyArray<HitlResponse>\n): Effect.Effect<PreparedToolCall> =>\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeUnknownEffect(QuestionToolParams)(call.params).pipe(\n Effect.result\n )\n\n if (decoded._tag === 'Failure') {\n return {\n _tag: 'Result',\n index,\n call,\n result: invalidQuestionToolResult(call),\n events: []\n }\n }\n\n const response = questionResponseFor(responses, call)\n\n if (response !== undefined) {\n return {\n _tag: 'Result',\n index,\n call,\n result: questionToolResult(response, decoded.success.questions),\n events: [hitlResponseEvent(response)]\n }\n }\n\n const request = QuestionRequest.make({\n requestId: questionRequestId(call),\n toolCallId: call.id,\n call,\n questions: decoded.success.questions\n })\n\n return {\n _tag: 'Pending',\n request,\n events: [QuestionRequested.make({ request })]\n }\n })\n\nconst prepareApprovalCall = (\n tools: ReadonlyArray<ToolDef>,\n call: ToolCall,\n index: number,\n responses: ReadonlyArray<HitlResponse>\n): PreparedToolCall => {\n if (!approvalRequired(tools, call)) {\n return { _tag: 'Execute', index, call, events: [] }\n }\n\n const request = toolApprovalRequest(tools, call)\n const response = approvalResponseFor(responses, call)\n\n if (response === undefined) {\n return {\n _tag: 'Pending',\n request,\n events: [ToolApprovalRequested.make({ call, request })]\n }\n }\n\n if (response.decision === 'denied') {\n return {\n _tag: 'Result',\n index,\n call,\n result: deniedToolResult(call, response),\n events: [hitlResponseEvent(response)]\n }\n }\n\n return {\n _tag: 'Execute',\n index,\n call,\n events: [hitlResponseEvent(response)]\n }\n}\n\nconst prepareToolCall = (input: {\n readonly tools: ReadonlyArray<ToolDef>\n readonly responses: ReadonlyArray<HitlResponse>\n readonly call: ToolCall\n readonly index: number\n}): Effect.Effect<PreparedToolCall> =>\n input.call.name === questionToolName\n ? prepareQuestionCall(input.call, input.index, input.responses)\n : Effect.succeed(prepareApprovalCall(input.tools, input.call, input.index, input.responses))\n\nconst prepareToolBatch = (input: {\n readonly tools: ReadonlyArray<ToolDef>\n readonly responses: ReadonlyArray<HitlResponse>\n readonly calls: ReadonlyArray<ToolCall>\n}): Effect.Effect<PreparedToolBatch> =>\n Effect.gen(function* () {\n const prepared = yield* Effect.forEach(input.calls, (call, index) =>\n prepareToolCall({ tools: input.tools, responses: input.responses, call, index })\n )\n\n return {\n callsToExecute: prepared.flatMap(item =>\n item._tag === 'Execute' ? [{ index: item.index, call: item.call }] : []\n ),\n resultMessages: prepared.flatMap(item =>\n item._tag === 'Result'\n ? [{ index: item.index, message: toolResultMessageFromResult(item.result) }]\n : []\n ),\n resultEvents: syntheticToolCompletionEvents(prepared),\n events: prepared.flatMap(item => (item._tag === 'Pending' ? [] : item.events)),\n pendingRequests: prepared.flatMap(item => (item._tag === 'Pending' ? [item.request] : [])),\n pendingEvents: prepared.flatMap(item => (item._tag === 'Pending' ? item.events : []))\n }\n })\n\nconst orderedToolResultMessages = (results: ReadonlyArray<IndexedToolResultMessage>) =>\n [...results].sort((left, right) => left.index - right.index).map(result => result.message)\n\nconst syntheticToolCompletionEvents = (\n prepared: ReadonlyArray<PreparedToolCall>\n): ReadonlyArray<AgentEvent> =>\n prepared.flatMap(item =>\n item._tag === 'Result'\n ? [ToolExecutionCompleted.make({ call: item.call, result: item.result })]\n : []\n )\n\nconst toolResultIds = (messages: ReadonlyArray<AgentMessage>): ReadonlySet<string> =>\n new Set(messages.flatMap(message => (message._tag === 'ToolResult' ? [message.toolCallId] : [])))\n\nconst pendingHostToolCalls = (messages: ReadonlyArray<AgentMessage>) => {\n const completed = toolResultIds(messages)\n\n return messages.flatMap(message =>\n message._tag === 'Assistant'\n ? assistantHostToolCalls(message).filter(call => !completed.has(call.id))\n : []\n )\n}\n\nconst nonEmptyHitlRequests = (\n requests: ReadonlyArray<HitlRequest>\n): NonEmptyHitlRequests | undefined => {\n const first = requests[0]\n\n return first === undefined ? undefined : [first, ...requests.slice(1)]\n}\n\nconst parallelToolExecutionStream = (input: {\n readonly calls: ReadonlyArray<IndexedToolCall>\n readonly executor: TurnStreamInput['executor']\n readonly loopConfig: LoopConfigShape\n readonly model: string\n readonly results: Ref.Ref<ReadonlyArray<IndexedToolResultMessage>>\n}) =>\n Stream.mergeAll(\n input.calls.map(({ call, index }) =>\n makeToolExecutionStream(input.executor, call, input.model).pipe(\n Stream.tap(event => {\n if (event._tag !== 'ToolExecutionCompleted') {\n return Effect.void\n }\n\n return Ref.update(input.results, results => [\n ...results,\n { index, message: toolResultMessageFromResult(event.result) }\n ])\n })\n )\n ),\n { concurrency: boundedToolConcurrency(input.loopConfig) }\n )\n\nconst toolErrorCode = (error: ToolError): AgentErrorCode => {\n switch (error.cause) {\n case 'validation':\n case 'invalid_input':\n return 'validation_error'\n case 'timeout':\n return 'tool_timeout'\n case 'permission':\n case 'denied':\n return 'tool_denied'\n case 'execution':\n case 'not_found':\n case 'unavailable':\n return 'tool_error'\n }\n}\n\ntype TurnCompletion = {\n readonly toolCalls: ReadonlyArray<ToolCall>\n readonly stopReason: 'stop' | 'tool_use'\n}\n\nconst validateTurnCompletion = (\n events: ReadonlyArray<LLMEvent>\n): Effect.Effect<TurnCompletion, LLMError> => {\n const doneEvents = events.filter(event => event._tag === 'Done')\n const toolCalls = collectToolCalls(events)\n const stopReason: TurnCompletion['stopReason'] = toolCalls.length === 0 ? 'stop' : 'tool_use'\n\n if (doneEvents.length !== 1) {\n return Effect.fail(\n new LLMError({\n cause: 'invalid_response',\n message: `Expected exactly one LLM done event, received ${doneEvents.length}`,\n retryable: false\n })\n )\n }\n\n const doneEvent = doneEvents[0]\n\n if (doneEvent === undefined || doneEvent.stopReason !== stopReason) {\n return Effect.fail(\n new LLMError({\n cause: 'invalid_response',\n message: `LLM done reason must be ${stopReason}`,\n retryable: false\n })\n )\n }\n\n return Effect.succeed({ toolCalls, stopReason })\n}\n\nconst makeAfterLlmStream = (\n input: TurnStreamInput,\n llmEventsRef: Ref.Ref<ReadonlyArray<LLMEvent>>\n): Stream.Stream<AgentEvent, AgentLoopError> =>\n Stream.unwrap(\n Effect.gen(function* () {\n const llmEvents = yield* Ref.get(llmEventsRef)\n const completion = yield* validateTurnCompletion(llmEvents)\n const assistantMessage = accumulateAssistantMessage(llmEvents)\n const turnEndEvents: ReadonlyArray<AgentEvent> = [\n LLMStreamEnd.make({ turn: input.turn }),\n AssistantMessageEvent.make({ message: assistantMessage })\n ]\n\n yield* Ref.update(input.createdMessages, messages => [...messages, assistantMessage])\n\n if (completion.toolCalls.length === 0) {\n const messages = yield* Ref.get(input.createdMessages)\n const usage = yield* Ref.get(input.usage)\n\n return Stream.fromIterable([\n ...turnEndEvents,\n TurnEnd.make({ turn: input.turn, reason: completion.stopReason }),\n AgentEnd.make({\n messages,\n turns: input.turn,\n usage\n })\n ])\n }\n\n const toolResultMessages = yield* Ref.make<ReadonlyArray<IndexedToolResultMessage>>([])\n const prepared = yield* prepareToolBatch({\n tools: input.config.tools,\n responses: input.config.hitlResponses ?? [],\n calls: completion.toolCalls\n })\n\n if (prepared.resultMessages.length > 0) {\n yield* Ref.update(toolResultMessages, results => [...results, ...prepared.resultMessages])\n }\n\n if (prepared.pendingRequests.length > 0) {\n const pendingRequests = nonEmptyHitlRequests(prepared.pendingRequests)\n\n if (pendingRequests === undefined) {\n return Stream.empty\n }\n\n const readyResults = orderedToolResultMessages(yield* Ref.get(toolResultMessages))\n if (readyResults.length > 0) {\n yield* Ref.update(input.createdMessages, messages => [...messages, ...readyResults])\n }\n\n const messages = yield* Ref.get(input.createdMessages)\n const usage = yield* Ref.get(input.usage)\n\n return Stream.fromIterable([\n ...turnEndEvents,\n ...prepared.events,\n ...prepared.pendingEvents,\n TurnEnd.make({ turn: input.turn, reason: completion.stopReason }),\n AgentAwaitingInput.make({\n requests: pendingRequests,\n messages,\n turns: input.turn,\n usage\n })\n ])\n }\n\n const toolExecutionStream = parallelToolExecutionStream({\n calls: prepared.callsToExecute,\n executor: input.executor,\n loopConfig: input.loopConfig,\n model: input.config.model,\n results: toolResultMessages\n })\n const nextTurnStream = Stream.unwrap(\n Ref.get(toolResultMessages).pipe(\n Effect.flatMap(results => {\n const orderedResults = orderedToolResultMessages(results)\n\n return Ref.update(input.createdMessages, messages => [\n ...messages,\n ...orderedResults\n ]).pipe(\n Effect.as(\n Stream.make(TurnEnd.make({ turn: input.turn, reason: completion.stopReason })).pipe(\n Stream.concat(\n makeTurnStream({\n ...input,\n currentMessages: [\n ...input.currentMessages,\n assistantMessage,\n ...orderedResults\n ],\n turn: input.turn + 1\n })\n )\n )\n )\n )\n })\n )\n )\n\n return Stream.fromIterable(turnEndEvents).pipe(\n Stream.concat(Stream.fromIterable(prepared.events)),\n Stream.concat(toolExecutionStream),\n Stream.concat(nextTurnStream)\n )\n })\n )\n\nconst makeModelOnlyAfterLlmStream = (\n input: TurnStreamInput,\n llmEventsRef: Ref.Ref<ReadonlyArray<LLMEvent>>\n): Stream.Stream<AgentEvent, AgentLoopError> =>\n Stream.unwrap(\n Effect.gen(function* () {\n const llmEvents = yield* Ref.get(llmEventsRef)\n const completion = yield* validateTurnCompletion(llmEvents)\n const assistantMessage = accumulateAssistantMessage(llmEvents)\n\n yield* Ref.update(input.createdMessages, messages => [...messages, assistantMessage])\n\n return Stream.fromIterable([\n LLMStreamEnd.make({ turn: input.turn }),\n AssistantMessageEvent.make({ message: assistantMessage }),\n TurnEnd.make({ turn: input.turn, reason: completion.stopReason })\n ])\n })\n )\n\nconst makeLlmStream = (\n input: TurnStreamInput,\n llmEvents: Ref.Ref<ReadonlyArray<LLMEvent>>,\n result: ContextTransformResult\n): Stream.Stream<AgentEvent, AgentLoopError> => {\n const makeStream = () =>\n input.provider.stream({\n messages: result.messages,\n tools: input.config.tools,\n model: input.config.model,\n reasoningEffort: input.config.reasoningEffort,\n systemPrompt: input.config.systemPrompt\n })\n\n return Stream.fromIterable(result.events)\n .pipe(Stream.concat(withProviderRetries(makeStream(), input.loopConfig, makeStream, 1)))\n .pipe(\n Stream.tap(event => {\n if (!isLlmEvent(event)) {\n return Effect.void\n }\n\n const appendEvent = Ref.update(llmEvents, events => [...events, event])\n\n if (event._tag !== 'Usage') {\n return appendEvent\n }\n\n return Ref.update(input.usage, usage => addAgentUsage(usage, event.usage)).pipe(\n Effect.flatMap(() => appendEvent)\n )\n }),\n Stream.flatMap(event =>\n event._tag === 'AgentRetry'\n ? Stream.make(event)\n : isLlmEvent(event)\n ? Stream.fromIterable(toLlmEvent(event))\n : Stream.make(event)\n ),\n Stream.concat(makeAfterLlmStream(input, llmEvents))\n )\n}\n\nconst makeModelOnlyLlmStream = (\n input: TurnStreamInput,\n llmEvents: Ref.Ref<ReadonlyArray<LLMEvent>>,\n result: ContextTransformResult\n): Stream.Stream<AgentEvent, AgentLoopError> => {\n const makeStream = () =>\n input.provider.stream({\n messages: result.messages,\n tools: input.config.tools,\n model: input.config.model,\n reasoningEffort: input.config.reasoningEffort,\n systemPrompt: input.config.systemPrompt\n })\n\n return Stream.fromIterable(result.events)\n .pipe(Stream.concat(withProviderRetries(makeStream(), input.loopConfig, makeStream, 1)))\n .pipe(\n Stream.tap(event => {\n if (!isLlmEvent(event)) {\n return Effect.void\n }\n\n const appendEvent = Ref.update(llmEvents, events => [...events, event])\n\n if (event._tag !== 'Usage') {\n return appendEvent\n }\n\n return Ref.update(input.usage, usage => addAgentUsage(usage, event.usage)).pipe(\n Effect.flatMap(() => appendEvent)\n )\n }),\n Stream.flatMap(event =>\n event._tag === 'AgentRetry'\n ? Stream.make(event)\n : isLlmEvent(event)\n ? Stream.fromIterable(toLlmEvent(event))\n : Stream.make(event)\n ),\n Stream.concat(makeModelOnlyAfterLlmStream(input, llmEvents))\n )\n}\n\nconst makeTurnStream = (input: TurnStreamInput): Stream.Stream<AgentEvent, AgentLoopError> =>\n Stream.suspend(() => {\n if (input.turn > input.loopConfig.maxTurns) {\n return Stream.fail(new AbortError({ reason: 'max_turns' }))\n }\n\n const llmStream = Stream.unwrap(\n Effect.gen(function* () {\n const llmEvents = yield* Ref.make<ReadonlyArray<LLMEvent>>([])\n const result = yield* input.contextTransformer.transform(input.currentMessages)\n yield* validateCapabilities(input.config, result.messages)\n\n return makeLlmStream(input, llmEvents, result)\n })\n )\n\n return Stream.fromIterable([\n TurnStart.make({ turn: input.turn }),\n LLMStreamStart.make({ turn: input.turn })\n ]).pipe(Stream.concat(llmStream))\n })\n\nconst makePendingToolResumeStream = (\n input: TurnStreamInput\n): Stream.Stream<AgentEvent, AgentLoopError> =>\n Stream.unwrap(\n Effect.gen(function* () {\n const pendingCalls = pendingHostToolCalls(input.currentMessages)\n\n if (pendingCalls.length === 0 || (input.config.hitlResponses ?? []).length === 0) {\n return makeTurnStream(input)\n }\n\n const toolResultMessages = yield* Ref.make<ReadonlyArray<IndexedToolResultMessage>>([])\n const prepared = yield* prepareToolBatch({\n tools: input.config.tools,\n responses: input.config.hitlResponses ?? [],\n calls: pendingCalls\n })\n\n if (prepared.resultMessages.length > 0) {\n yield* Ref.update(toolResultMessages, results => [...results, ...prepared.resultMessages])\n }\n\n if (prepared.pendingRequests.length > 0) {\n const pendingRequests = nonEmptyHitlRequests(prepared.pendingRequests)\n\n if (pendingRequests === undefined) {\n return Stream.empty\n }\n\n const readyResults = orderedToolResultMessages(yield* Ref.get(toolResultMessages))\n if (readyResults.length > 0) {\n yield* Ref.update(input.createdMessages, messages => [...messages, ...readyResults])\n }\n\n const messages = yield* Ref.get(input.createdMessages)\n const usage = yield* Ref.get(input.usage)\n\n return Stream.fromIterable([\n ...prepared.events,\n ...prepared.pendingEvents,\n AgentAwaitingInput.make({\n requests: pendingRequests,\n messages,\n turns: Math.max(0, input.turn - 1),\n usage\n })\n ])\n }\n\n const toolExecutionStream = parallelToolExecutionStream({\n calls: prepared.callsToExecute,\n executor: input.executor,\n loopConfig: input.loopConfig,\n model: input.config.model,\n results: toolResultMessages\n })\n const nextTurnStream = Stream.unwrap(\n Ref.get(toolResultMessages).pipe(\n Effect.flatMap(results => {\n const orderedResults = orderedToolResultMessages(results)\n\n return Ref.update(input.createdMessages, messages => [\n ...messages,\n ...orderedResults\n ]).pipe(\n Effect.as(\n makeTurnStream({\n ...input,\n currentMessages: [...input.currentMessages, ...orderedResults]\n })\n )\n )\n })\n )\n )\n\n return Stream.fromIterable(prepared.events).pipe(\n Stream.concat(toolExecutionStream),\n Stream.concat(nextTurnStream)\n )\n })\n )\n\nconst unavailableToolExecutor: TurnStreamInput['executor'] = {\n execute: call =>\n Effect.fail(\n new ToolError({\n tool: call.name,\n message: 'Tool execution is not available in model turn step',\n cause: 'execution'\n })\n )\n}\n\nconst makeModelOnlyTurnStream = (\n input: TurnStreamInput\n): Stream.Stream<AgentEvent, AgentLoopError> =>\n Stream.suspend(() => {\n if (input.turn > input.loopConfig.maxTurns) {\n return Stream.fail(new AbortError({ reason: 'max_turns' }))\n }\n\n const llmStream = Stream.unwrap(\n Effect.gen(function* () {\n const llmEvents = yield* Ref.make<ReadonlyArray<LLMEvent>>([])\n const result = yield* input.contextTransformer.transform(input.currentMessages)\n yield* validateCapabilities(input.config, result.messages)\n\n return makeModelOnlyLlmStream(input, llmEvents, result)\n })\n )\n\n return Stream.fromIterable([\n TurnStart.make({ turn: input.turn }),\n LLMStreamStart.make({ turn: input.turn })\n ]).pipe(Stream.concat(llmStream))\n })\n\nexport const runModelTurn = (\n config: ModelTurnConfig\n): Stream.Stream<AgentEvent, AgentLoopError, ContextTransformer | LLMProvider | LoopConfig> =>\n Stream.unwrap(\n Effect.gen(function* () {\n const contextTransformer = yield* ContextTransformer\n const loopConfig = yield* LoopConfig\n const provider = yield* LLMProvider\n const createdMessages = yield* Ref.make<ReadonlyArray<AgentMessage>>([])\n const usage = yield* Ref.make(zeroAgentUsage)\n\n return makeModelOnlyTurnStream({\n config,\n contextTransformer,\n loopConfig,\n provider,\n executor: unavailableToolExecutor,\n currentMessages: config.messages,\n createdMessages,\n usage,\n turn: config.turn\n })\n })\n )\n\nexport const runToolBatch = (\n config: ToolBatchConfig\n): Stream.Stream<AgentEvent, AgentLoopError, LoopConfig | ToolExecutor> =>\n Stream.unwrap(\n Effect.gen(function* () {\n const executor = yield* ToolExecutor\n const loopConfig = yield* LoopConfig\n const toolResultMessages = yield* Ref.make<ReadonlyArray<IndexedToolResultMessage>>([])\n const prepared = yield* prepareToolBatch({\n tools: config.tools ?? [],\n responses: config.hitlResponses ?? [],\n calls: config.calls\n })\n const hasPendingRequests = prepared.pendingRequests.length > 0\n const resultEvents = hasPendingRequests ? [] : prepared.resultEvents\n const pendingRequests = nonEmptyHitlRequests(prepared.pendingRequests)\n const awaitingEvents: ReadonlyArray<AgentEvent> =\n pendingRequests === undefined\n ? []\n : [\n AgentAwaitingInput.make({\n requests: pendingRequests,\n messages: config.createdMessages ?? [],\n turns: config.turn ?? 0,\n usage: config.usage ?? zeroAgentUsage\n })\n ]\n\n return Stream.fromIterable([\n ...prepared.events,\n ...resultEvents,\n ...prepared.pendingEvents,\n ...awaitingEvents\n ]).pipe(\n Stream.concat(\n parallelToolExecutionStream({\n calls: hasPendingRequests ? [] : prepared.callsToExecute,\n executor,\n loopConfig,\n model: config.model ?? '',\n results: toolResultMessages\n })\n )\n )\n })\n )\n\nexport const run = (\n config: RunConfig\n): Stream.Stream<\n AgentEvent,\n AgentLoopError,\n ContextTransformer | LLMProvider | LoopConfig | ToolExecutor\n> =>\n Stream.unwrap(\n Effect.gen(function* () {\n const contextTransformer = yield* ContextTransformer\n const loopConfig = yield* LoopConfig\n const provider = yield* LLMProvider\n const executor = yield* ToolExecutor\n const createdMessages = yield* Ref.make<ReadonlyArray<AgentMessage>>([])\n const usage = yield* Ref.make(zeroAgentUsage)\n\n return Stream.make(AgentStart.make({})).pipe(\n Stream.concat(\n makePendingToolResumeStream({\n config,\n contextTransformer,\n loopConfig,\n provider,\n executor,\n currentMessages: config.messages,\n createdMessages,\n usage,\n turn: 1\n })\n )\n )\n })\n )\n"],"mappings":"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"}
1
+ {"version":3,"file":"run.mjs","names":["AgentLLMTextDelta","AgentLLMReasoningDelta"],"sources":["../../src/loop/run.ts"],"sourcesContent":["import { Clock, Effect, Ref, Stream } from 'effect'\nimport * as Schema from 'effect/Schema'\nimport {\n AgentAwaitingInput,\n AgentEnd,\n AgentRetry,\n AgentStart,\n AssistantMessageEvent,\n UsageUpdate,\n addAgentUsage,\n contentParts,\n contentPreview,\n LLMReasoningDelta as AgentLLMReasoningDelta,\n LLMStreamEnd,\n LLMStreamStart,\n LLMTextDelta as AgentLLMTextDelta,\n ToolExecutionCompleted,\n ToolExecutionError,\n ToolExecutionStarted,\n ToolApprovalRequested,\n ToolInputEnd,\n ToolInputDelta,\n ToolInputStart,\n QuestionRequested,\n ProviderToolResult,\n QuestionRequest,\n QuestionToolParams,\n formatQuestionResponseContent,\n hitlResponseEvent,\n questionResponseStructuredContent,\n makeSubagentRunId,\n ToolApprovalRequest,\n ToolResultMessage,\n SubagentCompleted,\n SubagentStarted,\n assistantHostToolCalls,\n type ToolCall,\n type AgentReasoningEffort,\n type HitlRequest,\n type HitlResponse,\n type QuestionPrompt,\n type QuestionResponse,\n type ToolApprovalResponse,\n ToolResult,\n TurnEnd,\n TurnStart,\n zeroAgentUsage,\n type AgentEvent,\n type AgentErrorCode,\n type AgentMessage,\n type AgentUsage,\n type AgentModelCapabilities,\n type ToolDef\n} from '@yolk-sdk/agent/protocol'\nimport { accumulateAssistantMessage, collectToolCalls } from './accumulator.ts'\nimport {\n AbortError,\n LLMError,\n ToolError,\n type AgentLoopError,\n type LLMProviderError\n} from './error.ts'\nimport type { LLMEvent } from './llm-event.ts'\nimport { ContextTransformer, type ContextTransformResult } from './services/context-transformer.ts'\nimport { LLMProvider, type LLMRequest } from './services/llm-provider.ts'\nimport { LoopConfig, type LoopConfigShape } from './services/loop-config.ts'\nimport { ToolExecutor } from './services/tool-executor.ts'\n\nexport type AgentLoopRunId = string\n\nexport type RunConfig = {\n readonly messages: ReadonlyArray<AgentMessage>\n readonly systemPrompt: string\n readonly tools: ReadonlyArray<ToolDef>\n readonly hitlResponses?: ReadonlyArray<HitlResponse>\n readonly model: string\n readonly reasoningEffort?: AgentReasoningEffort\n readonly capabilities?: AgentModelCapabilities\n}\n\nexport type ModelTurnConfig = RunConfig & {\n readonly turn: number\n}\n\nexport type ToolBatchConfig = {\n readonly calls: ReadonlyArray<ToolCall>\n readonly tools?: ReadonlyArray<ToolDef>\n readonly hitlResponses?: ReadonlyArray<HitlResponse>\n readonly model?: string\n readonly createdMessages?: ReadonlyArray<AgentMessage>\n readonly turn?: number\n readonly usage?: AgentUsage\n}\n\nconst questionToolName = 'question'\n\ntype TaskCallMetadata = {\n readonly subagentRunId: string\n readonly subagentType: string\n readonly description: string\n}\n\nconst objectField = (input: unknown, key: string) =>\n input !== null && typeof input === 'object'\n ? Object.getOwnPropertyDescriptor(input, key)?.value\n : undefined\n\nconst nonEmptyStringField = (input: unknown, key: string) => {\n const value = objectField(input, key)\n\n return typeof value === 'string' && value.trim().length > 0 ? value : undefined\n}\n\nconst taskCallMetadata = (call: ToolCall): TaskCallMetadata | undefined => {\n if (call.name !== 'task') {\n return undefined\n }\n\n const subagentType = nonEmptyStringField(call.params, 'subagent_type')\n const description = nonEmptyStringField(call.params, 'description')\n\n if (subagentType === undefined || description === undefined) {\n return undefined\n }\n\n return {\n subagentRunId: makeSubagentRunId(call.id),\n subagentType,\n description\n }\n}\n\nconst subagentStartedEvent = (input: {\n readonly call: ToolCall\n readonly model: string\n readonly startedAtMs: number\n}) => {\n const metadata = taskCallMetadata(input.call)\n\n return metadata === undefined\n ? undefined\n : SubagentStarted.make({\n parentToolCallId: input.call.id,\n subagentRunId: metadata.subagentRunId,\n subagentType: metadata.subagentType,\n description: metadata.description,\n model: input.model,\n createdAtMs: input.startedAtMs\n })\n}\n\nconst subagentCompletedEvent = (input: {\n readonly call: ToolCall\n readonly result: ToolResult\n readonly model: string\n readonly startedAtMs: number\n readonly endedAtMs: number\n}) => {\n const metadata = taskCallMetadata(input.call)\n\n return metadata === undefined\n ? undefined\n : SubagentCompleted.make({\n parentToolCallId: input.call.id,\n subagentRunId: metadata.subagentRunId,\n subagentType: metadata.subagentType,\n description: metadata.description,\n model: input.model,\n status: input.result.isError === true ? 'error' : 'completed',\n durationMs: Math.max(0, input.endedAtMs - input.startedAtMs),\n summary: contentPreview(input.result.content),\n createdAtMs: input.endedAtMs\n })\n}\n\nconst toolCompletionEvents = (input: {\n readonly call: ToolCall\n readonly result: ToolResult\n readonly model: string\n readonly startedAtMs: number\n readonly endedAtMs: number\n}): ReadonlyArray<AgentEvent> => {\n const completed = subagentCompletedEvent(input)\n const toolCompleted = ToolExecutionCompleted.make({\n call: input.call,\n result: input.result,\n createdAtMs: input.endedAtMs\n })\n\n return completed === undefined ? [toolCompleted] : [toolCompleted, completed]\n}\n\nconst toolErrorResult = (call: ToolCall, error: ToolError) =>\n ToolResult.make({\n toolCallId: call.id,\n content: error.message,\n isError: true\n })\n\nconst toolErrorEvents = (input: {\n readonly call: ToolCall\n readonly error: ToolError\n readonly model: string\n readonly startedAtMs: number\n readonly endedAtMs: number\n}): ReadonlyArray<AgentEvent> => [\n ToolExecutionError.make({\n call: input.call,\n message: input.error.message,\n code: toolErrorCode(input.error),\n createdAtMs: input.endedAtMs\n }),\n ...toolCompletionEvents({\n call: input.call,\n result: toolErrorResult(input.call, input.error),\n model: input.model,\n startedAtMs: input.startedAtMs,\n endedAtMs: input.endedAtMs\n })\n]\n\nconst unsupportedInputError = (message: string) =>\n new LLMError({\n cause: 'validation_error',\n message,\n retryable: false\n })\n\nconst validateContent = (message: AgentMessage, capabilities: AgentModelCapabilities) =>\n Effect.forEach(contentPartsFromMessage(message), part => {\n switch (part._tag) {\n case 'Text':\n return capabilities.input.text\n ? Effect.void\n : Effect.fail(unsupportedInputError('Text input is not supported by this model'))\n case 'Image':\n return capabilities.input.image\n ? Effect.void\n : Effect.fail(unsupportedInputError('Image input is not supported by this model'))\n case 'Document':\n return capabilities.input.document\n ? Effect.void\n : Effect.fail(unsupportedInputError('Document input is not supported by this model'))\n case 'Audio':\n return capabilities.input.audio\n ? Effect.void\n : Effect.fail(unsupportedInputError('Audio input is not supported by this model'))\n }\n })\n\nconst contentPartsFromMessage = (message: AgentMessage) => {\n switch (message._tag) {\n case 'User':\n case 'ToolResult':\n return contentParts(message.content)\n case 'Assistant':\n return message.parts.flatMap(part => (part._tag === 'Text' ? contentParts(part.content) : []))\n }\n}\n\nconst validateCapabilities = (\n config: RunConfig,\n messages: ReadonlyArray<AgentMessage>\n): Effect.Effect<void, LLMError> => {\n const capabilities = config.capabilities\n\n if (capabilities === undefined) {\n return Effect.void\n }\n\n if (!capabilities.tools && config.tools.length > 0) {\n return Effect.fail(unsupportedInputError('Tools are not supported by this model'))\n }\n\n if (!capabilities.reasoning && config.reasoningEffort !== undefined) {\n return Effect.fail(unsupportedInputError('Reasoning effort is not supported by this model'))\n }\n\n return Effect.forEach(messages, message => validateContent(message, capabilities)).pipe(\n Effect.asVoid\n )\n}\n\nconst toLlmEvent = (event: LLMEvent): ReadonlyArray<AgentEvent> => {\n switch (event._tag) {\n case 'TextDelta':\n return [AgentLLMTextDelta.make({ text: event.text })]\n case 'ReasoningDelta':\n return [AgentLLMReasoningDelta.make({ text: event.text })]\n case 'ToolCall':\n return [ToolInputEnd.make({ call: event.call })]\n case 'ToolInputStart':\n return [ToolInputStart.make({ id: event.id, name: event.name })]\n case 'ToolInputDelta':\n return [ToolInputDelta.make({ id: event.id, delta: event.delta })]\n case 'ProviderToolResult':\n return [ProviderToolResult.make({ call: event.call, result: event.result })]\n case 'Usage':\n return [UsageUpdate.make({ usage: event.usage })]\n case 'Done':\n return []\n }\n}\n\nconst isLlmEvent = (event: LLMEvent | AgentEvent | AgentRetry): event is LLMEvent => {\n switch (event._tag) {\n case 'TextDelta':\n case 'ReasoningDelta':\n case 'Done':\n case 'ToolCall':\n case 'ToolInputStart':\n case 'ToolInputDelta':\n case 'ProviderToolResult':\n case 'Usage':\n return true\n default:\n return false\n }\n}\n\ntype TurnStreamInput = {\n readonly config: RunConfig\n readonly contextTransformer: {\n readonly transform: (\n messages: ReadonlyArray<AgentMessage>\n ) => Effect.Effect<ContextTransformResult, AgentLoopError>\n }\n readonly loopConfig: LoopConfigShape\n readonly provider: {\n readonly stream: (request: LLMRequest) => Stream.Stream<LLMEvent, LLMProviderError>\n }\n readonly executor: {\n readonly execute: (call: ToolCall) => Effect.Effect<ToolResult, ToolError>\n }\n readonly currentMessages: ReadonlyArray<AgentMessage>\n readonly createdMessages: Ref.Ref<ReadonlyArray<AgentMessage>>\n readonly usage: Ref.Ref<AgentUsage>\n readonly turn: number\n}\n\nconst maxUnhintedRetryDelayMs = 30_000\nconst maxHintedRetryDelayMs = 2_147_483_647\n\nconst validDelayMs = (delayMs: number) =>\n Number.isFinite(delayMs) && delayMs >= 0 ? Math.floor(delayMs) : undefined\n\nconst hintedRetryDelayMs = (error: LLMError) => {\n const delayMs = error.provider?.retryAfterMs\n const validDelay = delayMs === undefined ? undefined : validDelayMs(delayMs)\n\n return validDelay === undefined ? undefined : Math.min(validDelay, maxHintedRetryDelayMs)\n}\n\nconst retryDelayMs = (baseDelayMs: number, attempt: number, error: LLMError) => {\n const hintedDelay = hintedRetryDelayMs(error)\n\n if (hintedDelay !== undefined) {\n return hintedDelay\n }\n\n const delayMs = validDelayMs(baseDelayMs * 2 ** Math.max(0, attempt - 1)) ?? 0\n\n return Math.min(delayMs, maxUnhintedRetryDelayMs)\n}\n\nconst retryReason = (error: LLMError): AgentErrorCode => error.cause\n\nconst retrySleep = (delayMs: number) =>\n delayMs === 0 ? Effect.void : Effect.sleep(`${delayMs} millis`)\n\nconst failAgentLoopError = (\n error: AgentLoopError\n): Stream.Stream<LLMEvent | AgentRetry, AgentLoopError> => Stream.fail(error)\n\nconst sleepStream = (delayMs: number): Stream.Stream<LLMEvent | AgentRetry, AgentLoopError> =>\n Stream.fromEffect(retrySleep(delayMs)).pipe(Stream.flatMap(() => Stream.empty))\n\nconst withProviderRetries = (\n stream: Stream.Stream<LLMEvent, LLMProviderError>,\n loopConfig: TurnStreamInput['loopConfig'],\n makeStream: () => Stream.Stream<LLMEvent, LLMProviderError>,\n attempt: number\n): Stream.Stream<LLMEvent | AgentRetry, AgentLoopError> =>\n Stream.unwrap(\n Ref.make(false).pipe(\n Effect.map(emittedProviderEvent =>\n stream.pipe(\n Stream.tap(() => Ref.set(emittedProviderEvent, true)),\n Stream.catchTags({\n LLMError: error =>\n Stream.unwrap(\n Ref.get(emittedProviderEvent).pipe(\n Effect.map(emitted => {\n if (\n emitted ||\n !error.retryable ||\n error.cause === 'context_overflow' ||\n attempt > loopConfig.maxRetries\n ) {\n return failAgentLoopError(error)\n }\n\n const delayMs = retryDelayMs(loopConfig.retryBaseDelayMs, attempt, error)\n return Stream.make(\n AgentRetry.make({\n attempt,\n reason: retryReason(error),\n delayMs,\n message: error.message,\n ...(error.provider === undefined ? {} : { provider: error.provider })\n })\n ).pipe(\n Stream.concat(sleepStream(delayMs)),\n Stream.concat(\n withProviderRetries(makeStream(), loopConfig, makeStream, attempt + 1)\n )\n )\n })\n )\n ),\n AbortError: failAgentLoopError,\n FauxExhaustedError: failAgentLoopError\n })\n )\n )\n )\n )\n\nconst makeToolExecutionStream = (\n executor: TurnStreamInput['executor'],\n call: ToolCall,\n model: string\n): Stream.Stream<AgentEvent, AgentLoopError> =>\n Stream.unwrap(\n Effect.gen(function* () {\n const startedAtMs = yield* Clock.currentTimeMillis\n const started = subagentStartedEvent({ call, model, startedAtMs })\n const startEvents: ReadonlyArray<AgentEvent> =\n started === undefined\n ? [ToolExecutionStarted.make({ call, createdAtMs: startedAtMs })]\n : [ToolExecutionStarted.make({ call, createdAtMs: startedAtMs }), started]\n\n return Stream.fromIterable(startEvents).pipe(\n Stream.concat(\n Stream.fromEffect(\n executor.execute(call).pipe(\n Effect.flatMap(result =>\n Clock.currentTimeMillis.pipe(\n Effect.map(endedAtMs =>\n toolCompletionEvents({\n call,\n result,\n model,\n startedAtMs,\n endedAtMs\n })\n )\n )\n )\n )\n ).pipe(\n Stream.flatMap(Stream.fromIterable),\n Stream.catchTag('ToolError', error =>\n Stream.fromEffect(Clock.currentTimeMillis).pipe(\n Stream.flatMap(endedAtMs =>\n Stream.fromIterable(\n toolErrorEvents({\n call,\n error,\n model,\n startedAtMs,\n endedAtMs\n })\n )\n )\n )\n )\n )\n )\n )\n })\n )\n\ntype IndexedToolResultMessage = {\n readonly index: number\n readonly message: AgentMessage\n}\n\ntype IndexedToolCall = {\n readonly index: number\n readonly call: ToolCall\n}\n\ntype PreparedToolCall =\n | {\n readonly _tag: 'Execute'\n readonly index: number\n readonly call: ToolCall\n readonly events: ReadonlyArray<AgentEvent>\n }\n | {\n readonly _tag: 'Result'\n readonly index: number\n readonly call: ToolCall\n readonly result: ToolResult\n readonly events: ReadonlyArray<AgentEvent>\n }\n | {\n readonly _tag: 'Pending'\n readonly request: HitlRequest\n readonly events: ReadonlyArray<AgentEvent>\n }\n\ntype PreparedToolBatch = {\n readonly callsToExecute: ReadonlyArray<IndexedToolCall>\n readonly resultMessages: ReadonlyArray<IndexedToolResultMessage>\n readonly resultEvents: ReadonlyArray<AgentEvent>\n readonly events: ReadonlyArray<AgentEvent>\n readonly pendingRequests: ReadonlyArray<HitlRequest>\n readonly pendingEvents: ReadonlyArray<AgentEvent>\n}\n\ntype NonEmptyHitlRequests = readonly [HitlRequest, ...Array<HitlRequest>]\n\nconst boundedToolConcurrency = (loopConfig: LoopConfigShape) =>\n Math.max(1, loopConfig.toolConcurrency)\n\nconst toolResultMessageFromResult = (result: ToolResult) =>\n ToolResultMessage.make({\n toolCallId: result.toolCallId,\n content: result.content,\n isError: result.isError,\n structuredContent: result.structuredContent\n })\n\nconst toolDefFor = (tools: ReadonlyArray<ToolDef>, call: ToolCall) =>\n tools.find(tool => tool.name === call.name)\n\nconst approvalRequired = (tools: ReadonlyArray<ToolDef>, call: ToolCall) =>\n toolDefFor(tools, call)?.approval?.mode === 'manual'\n\nconst approvalRequestId = (call: ToolCall) => `approval:${call.id}`\n\nconst questionRequestId = (call: ToolCall) => `question:${call.id}`\n\nconst matchesApproval = (response: ToolApprovalResponse, call: ToolCall) =>\n response.toolCallId === call.id && response.requestId === approvalRequestId(call)\n\nconst matchesQuestion = (response: QuestionResponse, call: ToolCall) =>\n response.toolCallId === call.id && response.requestId === questionRequestId(call)\n\nconst approvalResponseFor = (responses: ReadonlyArray<HitlResponse>, call: ToolCall) =>\n responses.flatMap(response =>\n response._tag === 'ToolApprovalResponse' && matchesApproval(response, call) ? [response] : []\n )[0]\n\nconst questionResponseFor = (responses: ReadonlyArray<HitlResponse>, call: ToolCall) =>\n responses.flatMap(response =>\n response._tag === 'QuestionResponse' && matchesQuestion(response, call) ? [response] : []\n )[0]\n\nconst toolApprovalRequest = (tools: ReadonlyArray<ToolDef>, call: ToolCall): ToolApprovalRequest =>\n ToolApprovalRequest.make({\n requestId: approvalRequestId(call),\n toolCallId: call.id,\n call,\n policy: toolDefFor(tools, call)?.approval\n })\n\nconst deniedToolResult = (call: ToolCall, response: ToolApprovalResponse) => {\n const reason = response.reason ?? 'Denied by user'\n\n return ToolResult.make({\n toolCallId: call.id,\n content: `Tool call denied: ${reason}`,\n isError: true,\n structuredContent: {\n type: 'tool_approval_denied',\n reason,\n source: response.source\n }\n })\n}\n\nconst questionToolResult = (\n response: QuestionResponse,\n questions: ReadonlyArray<QuestionPrompt>\n) => {\n return ToolResult.make({\n toolCallId: response.toolCallId,\n content: formatQuestionResponseContent(response, questions),\n isError: response.outcome === 'cancelled' ? true : undefined,\n structuredContent: questionResponseStructuredContent(response)\n })\n}\n\nconst invalidQuestionToolResult = (call: ToolCall) =>\n ToolResult.make({\n toolCallId: call.id,\n content: 'Invalid question arguments.',\n isError: true,\n structuredContent: { type: 'question_invalid' }\n })\n\nconst prepareQuestionCall = (\n call: ToolCall,\n index: number,\n responses: ReadonlyArray<HitlResponse>\n): Effect.Effect<PreparedToolCall> =>\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeUnknownEffect(QuestionToolParams)(call.params).pipe(\n Effect.result\n )\n\n if (decoded._tag === 'Failure') {\n return {\n _tag: 'Result',\n index,\n call,\n result: invalidQuestionToolResult(call),\n events: []\n }\n }\n\n const response = questionResponseFor(responses, call)\n\n if (response !== undefined) {\n return {\n _tag: 'Result',\n index,\n call,\n result: questionToolResult(response, decoded.success.questions),\n events: [hitlResponseEvent(response)]\n }\n }\n\n const request = QuestionRequest.make({\n requestId: questionRequestId(call),\n toolCallId: call.id,\n call,\n questions: decoded.success.questions\n })\n\n return {\n _tag: 'Pending',\n request,\n events: [QuestionRequested.make({ request })]\n }\n })\n\nconst prepareApprovalCall = (\n tools: ReadonlyArray<ToolDef>,\n call: ToolCall,\n index: number,\n responses: ReadonlyArray<HitlResponse>\n): PreparedToolCall => {\n if (!approvalRequired(tools, call)) {\n return { _tag: 'Execute', index, call, events: [] }\n }\n\n const request = toolApprovalRequest(tools, call)\n const response = approvalResponseFor(responses, call)\n\n if (response === undefined) {\n return {\n _tag: 'Pending',\n request,\n events: [ToolApprovalRequested.make({ call, request })]\n }\n }\n\n if (response.decision === 'denied') {\n return {\n _tag: 'Result',\n index,\n call,\n result: deniedToolResult(call, response),\n events: [hitlResponseEvent(response)]\n }\n }\n\n return {\n _tag: 'Execute',\n index,\n call,\n events: [hitlResponseEvent(response)]\n }\n}\n\nconst prepareToolCall = (input: {\n readonly tools: ReadonlyArray<ToolDef>\n readonly responses: ReadonlyArray<HitlResponse>\n readonly call: ToolCall\n readonly index: number\n}): Effect.Effect<PreparedToolCall> =>\n input.call.name === questionToolName\n ? prepareQuestionCall(input.call, input.index, input.responses)\n : Effect.succeed(prepareApprovalCall(input.tools, input.call, input.index, input.responses))\n\nconst prepareToolBatch = (input: {\n readonly tools: ReadonlyArray<ToolDef>\n readonly responses: ReadonlyArray<HitlResponse>\n readonly calls: ReadonlyArray<ToolCall>\n}): Effect.Effect<PreparedToolBatch> =>\n Effect.gen(function* () {\n const prepared = yield* Effect.forEach(input.calls, (call, index) =>\n prepareToolCall({ tools: input.tools, responses: input.responses, call, index })\n )\n\n return {\n callsToExecute: prepared.flatMap(item =>\n item._tag === 'Execute' ? [{ index: item.index, call: item.call }] : []\n ),\n resultMessages: prepared.flatMap(item =>\n item._tag === 'Result'\n ? [{ index: item.index, message: toolResultMessageFromResult(item.result) }]\n : []\n ),\n resultEvents: syntheticToolCompletionEvents(prepared),\n events: prepared.flatMap(item => (item._tag === 'Pending' ? [] : item.events)),\n pendingRequests: prepared.flatMap(item => (item._tag === 'Pending' ? [item.request] : [])),\n pendingEvents: prepared.flatMap(item => (item._tag === 'Pending' ? item.events : []))\n }\n })\n\nconst orderedToolResultMessages = (results: ReadonlyArray<IndexedToolResultMessage>) =>\n [...results].sort((left, right) => left.index - right.index).map(result => result.message)\n\nconst syntheticToolCompletionEvents = (\n prepared: ReadonlyArray<PreparedToolCall>\n): ReadonlyArray<AgentEvent> =>\n prepared.flatMap(item =>\n item._tag === 'Result'\n ? [ToolExecutionCompleted.make({ call: item.call, result: item.result })]\n : []\n )\n\nconst toolResultIds = (messages: ReadonlyArray<AgentMessage>): ReadonlySet<string> =>\n new Set(messages.flatMap(message => (message._tag === 'ToolResult' ? [message.toolCallId] : [])))\n\nconst pendingHostToolCalls = (messages: ReadonlyArray<AgentMessage>) => {\n const completed = toolResultIds(messages)\n\n return messages.flatMap(message =>\n message._tag === 'Assistant'\n ? assistantHostToolCalls(message).filter(call => !completed.has(call.id))\n : []\n )\n}\n\nconst nonEmptyHitlRequests = (\n requests: ReadonlyArray<HitlRequest>\n): NonEmptyHitlRequests | undefined => {\n const first = requests[0]\n\n return first === undefined ? undefined : [first, ...requests.slice(1)]\n}\n\nconst parallelToolExecutionStream = (input: {\n readonly calls: ReadonlyArray<IndexedToolCall>\n readonly executor: TurnStreamInput['executor']\n readonly loopConfig: LoopConfigShape\n readonly model: string\n readonly results: Ref.Ref<ReadonlyArray<IndexedToolResultMessage>>\n}) =>\n Stream.mergeAll(\n input.calls.map(({ call, index }) =>\n makeToolExecutionStream(input.executor, call, input.model).pipe(\n Stream.tap(event => {\n if (event._tag !== 'ToolExecutionCompleted') {\n return Effect.void\n }\n\n return Ref.update(input.results, results => [\n ...results,\n { index, message: toolResultMessageFromResult(event.result) }\n ])\n })\n )\n ),\n { concurrency: boundedToolConcurrency(input.loopConfig) }\n )\n\nconst toolErrorCode = (error: ToolError): AgentErrorCode => {\n switch (error.cause) {\n case 'validation':\n case 'invalid_input':\n return 'validation_error'\n case 'timeout':\n return 'tool_timeout'\n case 'permission':\n case 'denied':\n return 'tool_denied'\n case 'execution':\n case 'not_found':\n case 'unavailable':\n return 'tool_error'\n }\n}\n\ntype TurnCompletion = {\n readonly toolCalls: ReadonlyArray<ToolCall>\n readonly stopReason: 'stop' | 'tool_use'\n}\n\nconst validateTurnCompletion = (\n events: ReadonlyArray<LLMEvent>\n): Effect.Effect<TurnCompletion, LLMError> => {\n const doneEvents = events.filter(event => event._tag === 'Done')\n const toolCalls = collectToolCalls(events)\n const stopReason: TurnCompletion['stopReason'] = toolCalls.length === 0 ? 'stop' : 'tool_use'\n\n if (doneEvents.length !== 1) {\n return Effect.fail(\n new LLMError({\n cause: 'invalid_response',\n message: `Expected exactly one LLM done event, received ${doneEvents.length}`,\n retryable: false\n })\n )\n }\n\n const doneEvent = doneEvents[0]\n\n if (doneEvent === undefined || doneEvent.stopReason !== stopReason) {\n return Effect.fail(\n new LLMError({\n cause: 'invalid_response',\n message: `LLM done reason must be ${stopReason}`,\n retryable: false\n })\n )\n }\n\n return Effect.succeed({ toolCalls, stopReason })\n}\n\nconst makeAfterLlmStream = (\n input: TurnStreamInput,\n llmEventsRef: Ref.Ref<ReadonlyArray<LLMEvent>>\n): Stream.Stream<AgentEvent, AgentLoopError> =>\n Stream.unwrap(\n Effect.gen(function* () {\n const llmEvents = yield* Ref.get(llmEventsRef)\n const completion = yield* validateTurnCompletion(llmEvents)\n const assistantMessage = accumulateAssistantMessage(llmEvents)\n const turnEndEvents: ReadonlyArray<AgentEvent> = [\n LLMStreamEnd.make({ turn: input.turn }),\n AssistantMessageEvent.make({ message: assistantMessage })\n ]\n\n yield* Ref.update(input.createdMessages, messages => [...messages, assistantMessage])\n\n if (completion.toolCalls.length === 0) {\n const messages = yield* Ref.get(input.createdMessages)\n const usage = yield* Ref.get(input.usage)\n\n return Stream.fromIterable([\n ...turnEndEvents,\n TurnEnd.make({ turn: input.turn, reason: completion.stopReason }),\n AgentEnd.make({\n messages,\n turns: input.turn,\n usage\n })\n ])\n }\n\n const toolResultMessages = yield* Ref.make<ReadonlyArray<IndexedToolResultMessage>>([])\n const prepared = yield* prepareToolBatch({\n tools: input.config.tools,\n responses: input.config.hitlResponses ?? [],\n calls: completion.toolCalls\n })\n\n if (prepared.resultMessages.length > 0) {\n yield* Ref.update(toolResultMessages, results => [...results, ...prepared.resultMessages])\n }\n\n if (prepared.pendingRequests.length > 0) {\n const pendingRequests = nonEmptyHitlRequests(prepared.pendingRequests)\n\n if (pendingRequests === undefined) {\n return Stream.empty\n }\n\n const readyResults = orderedToolResultMessages(yield* Ref.get(toolResultMessages))\n if (readyResults.length > 0) {\n yield* Ref.update(input.createdMessages, messages => [...messages, ...readyResults])\n }\n\n const messages = yield* Ref.get(input.createdMessages)\n const usage = yield* Ref.get(input.usage)\n\n return Stream.fromIterable([\n ...turnEndEvents,\n ...prepared.events,\n ...prepared.pendingEvents,\n TurnEnd.make({ turn: input.turn, reason: completion.stopReason }),\n AgentAwaitingInput.make({\n requests: pendingRequests,\n messages,\n turns: input.turn,\n usage\n })\n ])\n }\n\n const toolExecutionStream = parallelToolExecutionStream({\n calls: prepared.callsToExecute,\n executor: input.executor,\n loopConfig: input.loopConfig,\n model: input.config.model,\n results: toolResultMessages\n })\n const nextTurnStream = Stream.unwrap(\n Ref.get(toolResultMessages).pipe(\n Effect.flatMap(results => {\n const orderedResults = orderedToolResultMessages(results)\n\n return Ref.update(input.createdMessages, messages => [\n ...messages,\n ...orderedResults\n ]).pipe(\n Effect.as(\n Stream.make(TurnEnd.make({ turn: input.turn, reason: completion.stopReason })).pipe(\n Stream.concat(\n makeTurnStream({\n ...input,\n currentMessages: [\n ...input.currentMessages,\n assistantMessage,\n ...orderedResults\n ],\n turn: input.turn + 1\n })\n )\n )\n )\n )\n })\n )\n )\n\n return Stream.fromIterable(turnEndEvents).pipe(\n Stream.concat(Stream.fromIterable(prepared.events)),\n Stream.concat(toolExecutionStream),\n Stream.concat(nextTurnStream)\n )\n })\n )\n\nconst makeModelOnlyAfterLlmStream = (\n input: TurnStreamInput,\n llmEventsRef: Ref.Ref<ReadonlyArray<LLMEvent>>\n): Stream.Stream<AgentEvent, AgentLoopError> =>\n Stream.unwrap(\n Effect.gen(function* () {\n const llmEvents = yield* Ref.get(llmEventsRef)\n const completion = yield* validateTurnCompletion(llmEvents)\n const assistantMessage = accumulateAssistantMessage(llmEvents)\n\n yield* Ref.update(input.createdMessages, messages => [...messages, assistantMessage])\n\n return Stream.fromIterable([\n LLMStreamEnd.make({ turn: input.turn }),\n AssistantMessageEvent.make({ message: assistantMessage }),\n TurnEnd.make({ turn: input.turn, reason: completion.stopReason })\n ])\n })\n )\n\nconst makeLlmStream = (\n input: TurnStreamInput,\n llmEvents: Ref.Ref<ReadonlyArray<LLMEvent>>,\n result: ContextTransformResult\n): Stream.Stream<AgentEvent, AgentLoopError> => {\n const makeStream = () =>\n input.provider.stream({\n messages: result.messages,\n tools: input.config.tools,\n model: input.config.model,\n reasoningEffort: input.config.reasoningEffort,\n systemPrompt: input.config.systemPrompt\n })\n\n return Stream.fromIterable(result.events)\n .pipe(Stream.concat(withProviderRetries(makeStream(), input.loopConfig, makeStream, 1)))\n .pipe(\n Stream.tap(event => {\n if (!isLlmEvent(event)) {\n return Effect.void\n }\n\n const appendEvent = Ref.update(llmEvents, events => [...events, event])\n\n if (event._tag !== 'Usage') {\n return appendEvent\n }\n\n return Ref.update(input.usage, usage => addAgentUsage(usage, event.usage)).pipe(\n Effect.flatMap(() => appendEvent)\n )\n }),\n Stream.flatMap(event =>\n event._tag === 'AgentRetry'\n ? Stream.make(event)\n : isLlmEvent(event)\n ? Stream.fromIterable(toLlmEvent(event))\n : Stream.make(event)\n ),\n Stream.concat(makeAfterLlmStream(input, llmEvents))\n )\n}\n\nconst makeModelOnlyLlmStream = (\n input: TurnStreamInput,\n llmEvents: Ref.Ref<ReadonlyArray<LLMEvent>>,\n result: ContextTransformResult\n): Stream.Stream<AgentEvent, AgentLoopError> => {\n const makeStream = () =>\n input.provider.stream({\n messages: result.messages,\n tools: input.config.tools,\n model: input.config.model,\n reasoningEffort: input.config.reasoningEffort,\n systemPrompt: input.config.systemPrompt\n })\n\n return Stream.fromIterable(result.events)\n .pipe(Stream.concat(withProviderRetries(makeStream(), input.loopConfig, makeStream, 1)))\n .pipe(\n Stream.tap(event => {\n if (!isLlmEvent(event)) {\n return Effect.void\n }\n\n const appendEvent = Ref.update(llmEvents, events => [...events, event])\n\n if (event._tag !== 'Usage') {\n return appendEvent\n }\n\n return Ref.update(input.usage, usage => addAgentUsage(usage, event.usage)).pipe(\n Effect.flatMap(() => appendEvent)\n )\n }),\n Stream.flatMap(event =>\n event._tag === 'AgentRetry'\n ? Stream.make(event)\n : isLlmEvent(event)\n ? Stream.fromIterable(toLlmEvent(event))\n : Stream.make(event)\n ),\n Stream.concat(makeModelOnlyAfterLlmStream(input, llmEvents))\n )\n}\n\nconst makeTurnStream = (input: TurnStreamInput): Stream.Stream<AgentEvent, AgentLoopError> =>\n Stream.suspend(() => {\n if (input.turn > input.loopConfig.maxTurns) {\n return Stream.fail(new AbortError({ reason: 'max_turns' }))\n }\n\n const llmStream = Stream.unwrap(\n Effect.gen(function* () {\n const llmEvents = yield* Ref.make<ReadonlyArray<LLMEvent>>([])\n const result = yield* input.contextTransformer.transform(input.currentMessages)\n yield* validateCapabilities(input.config, result.messages)\n\n return makeLlmStream(input, llmEvents, result)\n })\n )\n\n return Stream.fromIterable([\n TurnStart.make({ turn: input.turn }),\n LLMStreamStart.make({ turn: input.turn })\n ]).pipe(Stream.concat(llmStream))\n })\n\nconst makePendingToolResumeStream = (\n input: TurnStreamInput\n): Stream.Stream<AgentEvent, AgentLoopError> =>\n Stream.unwrap(\n Effect.gen(function* () {\n const pendingCalls = pendingHostToolCalls(input.currentMessages)\n\n if (pendingCalls.length === 0 || (input.config.hitlResponses ?? []).length === 0) {\n return makeTurnStream(input)\n }\n\n const toolResultMessages = yield* Ref.make<ReadonlyArray<IndexedToolResultMessage>>([])\n const prepared = yield* prepareToolBatch({\n tools: input.config.tools,\n responses: input.config.hitlResponses ?? [],\n calls: pendingCalls\n })\n\n if (prepared.resultMessages.length > 0) {\n yield* Ref.update(toolResultMessages, results => [...results, ...prepared.resultMessages])\n }\n\n if (prepared.pendingRequests.length > 0) {\n const pendingRequests = nonEmptyHitlRequests(prepared.pendingRequests)\n\n if (pendingRequests === undefined) {\n return Stream.empty\n }\n\n const readyResults = orderedToolResultMessages(yield* Ref.get(toolResultMessages))\n if (readyResults.length > 0) {\n yield* Ref.update(input.createdMessages, messages => [...messages, ...readyResults])\n }\n\n const messages = yield* Ref.get(input.createdMessages)\n const usage = yield* Ref.get(input.usage)\n\n return Stream.fromIterable([\n ...prepared.events,\n ...prepared.pendingEvents,\n AgentAwaitingInput.make({\n requests: pendingRequests,\n messages,\n turns: Math.max(0, input.turn - 1),\n usage\n })\n ])\n }\n\n const toolExecutionStream = parallelToolExecutionStream({\n calls: prepared.callsToExecute,\n executor: input.executor,\n loopConfig: input.loopConfig,\n model: input.config.model,\n results: toolResultMessages\n })\n const nextTurnStream = Stream.unwrap(\n Ref.get(toolResultMessages).pipe(\n Effect.flatMap(results => {\n const orderedResults = orderedToolResultMessages(results)\n\n return Ref.update(input.createdMessages, messages => [\n ...messages,\n ...orderedResults\n ]).pipe(\n Effect.as(\n makeTurnStream({\n ...input,\n currentMessages: [...input.currentMessages, ...orderedResults]\n })\n )\n )\n })\n )\n )\n\n return Stream.fromIterable(prepared.events).pipe(\n Stream.concat(toolExecutionStream),\n Stream.concat(nextTurnStream)\n )\n })\n )\n\nconst unavailableToolExecutor: TurnStreamInput['executor'] = {\n execute: call =>\n Effect.fail(\n new ToolError({\n tool: call.name,\n message: 'Tool execution is not available in model turn step',\n cause: 'execution'\n })\n )\n}\n\nconst makeModelOnlyTurnStream = (\n input: TurnStreamInput\n): Stream.Stream<AgentEvent, AgentLoopError> =>\n Stream.suspend(() => {\n if (input.turn > input.loopConfig.maxTurns) {\n return Stream.fail(new AbortError({ reason: 'max_turns' }))\n }\n\n const llmStream = Stream.unwrap(\n Effect.gen(function* () {\n const llmEvents = yield* Ref.make<ReadonlyArray<LLMEvent>>([])\n const result = yield* input.contextTransformer.transform(input.currentMessages)\n yield* validateCapabilities(input.config, result.messages)\n\n return makeModelOnlyLlmStream(input, llmEvents, result)\n })\n )\n\n return Stream.fromIterable([\n TurnStart.make({ turn: input.turn }),\n LLMStreamStart.make({ turn: input.turn })\n ]).pipe(Stream.concat(llmStream))\n })\n\nexport const runModelTurn = (\n config: ModelTurnConfig\n): Stream.Stream<AgentEvent, AgentLoopError, ContextTransformer | LLMProvider | LoopConfig> =>\n Stream.unwrap(\n Effect.gen(function* () {\n const contextTransformer = yield* ContextTransformer\n const loopConfig = yield* LoopConfig\n const provider = yield* LLMProvider\n const createdMessages = yield* Ref.make<ReadonlyArray<AgentMessage>>([])\n const usage = yield* Ref.make(zeroAgentUsage)\n\n return makeModelOnlyTurnStream({\n config,\n contextTransformer,\n loopConfig,\n provider,\n executor: unavailableToolExecutor,\n currentMessages: config.messages,\n createdMessages,\n usage,\n turn: config.turn\n })\n })\n )\n\nexport const runToolBatch = (\n config: ToolBatchConfig\n): Stream.Stream<AgentEvent, AgentLoopError, LoopConfig | ToolExecutor> =>\n Stream.unwrap(\n Effect.gen(function* () {\n const executor = yield* ToolExecutor\n const loopConfig = yield* LoopConfig\n const toolResultMessages = yield* Ref.make<ReadonlyArray<IndexedToolResultMessage>>([])\n const prepared = yield* prepareToolBatch({\n tools: config.tools ?? [],\n responses: config.hitlResponses ?? [],\n calls: config.calls\n })\n const hasPendingRequests = prepared.pendingRequests.length > 0\n const resultEvents = hasPendingRequests ? [] : prepared.resultEvents\n const pendingRequests = nonEmptyHitlRequests(prepared.pendingRequests)\n const awaitingEvents: ReadonlyArray<AgentEvent> =\n pendingRequests === undefined\n ? []\n : [\n AgentAwaitingInput.make({\n requests: pendingRequests,\n messages: config.createdMessages ?? [],\n turns: config.turn ?? 0,\n usage: config.usage ?? zeroAgentUsage\n })\n ]\n\n return Stream.fromIterable([\n ...prepared.events,\n ...resultEvents,\n ...prepared.pendingEvents,\n ...awaitingEvents\n ]).pipe(\n Stream.concat(\n parallelToolExecutionStream({\n calls: hasPendingRequests ? [] : prepared.callsToExecute,\n executor,\n loopConfig,\n model: config.model ?? '',\n results: toolResultMessages\n })\n )\n )\n })\n )\n\nexport const run = (\n config: RunConfig\n): Stream.Stream<\n AgentEvent,\n AgentLoopError,\n ContextTransformer | LLMProvider | LoopConfig | ToolExecutor\n> =>\n Stream.unwrap(\n Effect.gen(function* () {\n const contextTransformer = yield* ContextTransformer\n const loopConfig = yield* LoopConfig\n const provider = yield* LLMProvider\n const executor = yield* ToolExecutor\n const createdMessages = yield* Ref.make<ReadonlyArray<AgentMessage>>([])\n const usage = yield* Ref.make(zeroAgentUsage)\n\n return Stream.make(AgentStart.make({})).pipe(\n Stream.concat(\n makePendingToolResumeStream({\n config,\n contextTransformer,\n loopConfig,\n provider,\n executor,\n currentMessages: config.messages,\n createdMessages,\n usage,\n turn: 1\n })\n )\n )\n })\n )\n"],"mappings":"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"}
@@ -63,6 +63,7 @@ declare const refAttachmentSource: (id: string) => RefAttachmentSource;
63
63
  declare const inlineBase64Source: (data: string) => InlineBase64AttachmentSource;
64
64
  declare const attachmentSourcePreview: (source: AttachmentSource) => string;
65
65
  declare const attachmentSourceDataUrl: (source: AttachmentSource, mimeType: string) => Option.Option<string>;
66
+ declare const attachmentSourceUrl: (source: AttachmentSource, mimeType: string) => Option.Option<string>;
66
67
  declare const isTextDocumentMimeType: (mimeType: string) => boolean;
67
68
  declare const textDocumentMimeTypeFromFilename: (filename: string) => string | undefined;
68
69
  declare const inferTextDocumentMimeType: (input: {
@@ -79,5 +80,5 @@ declare const documentPartFromText: (input: {
79
80
  declare const attachmentSourceText: (source: AttachmentSource) => Effect.Effect<Option.Option<string>, unknown, never>;
80
81
  declare const attachmentSourceBase64: (source: AttachmentSource) => Option.Option<string>;
81
82
  //#endregion
82
- export { AttachmentContentPart, AttachmentSource, AttachmentSourceResolver, AudioPart, Content, ContentPart, DocumentPart, ImagePart, InlineBase64AttachmentSource, RefAttachmentSource, TextPart, UrlAttachmentSource, appendTextToContent, attachmentSourceBase64, attachmentSourceDataUrl, attachmentSourcePreview, attachmentSourceText, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, documentPartFromText, inferTextDocumentMimeType, inlineBase64AttachmentSource, inlineBase64Source, isContentEmpty, isTextDocumentMimeType, refAttachmentSource, resolveContentAttachmentSources, textDocumentMimeTypeFromFilename, textToBase64Utf8, urlAttachmentSource };
83
+ export { AttachmentContentPart, AttachmentSource, AttachmentSourceResolver, AudioPart, Content, ContentPart, DocumentPart, ImagePart, InlineBase64AttachmentSource, RefAttachmentSource, TextPart, UrlAttachmentSource, appendTextToContent, attachmentSourceBase64, attachmentSourceDataUrl, attachmentSourcePreview, attachmentSourceText, attachmentSourceUrl, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, documentPartFromText, inferTextDocumentMimeType, inlineBase64AttachmentSource, inlineBase64Source, isContentEmpty, isTextDocumentMimeType, refAttachmentSource, resolveContentAttachmentSources, textDocumentMimeTypeFromFilename, textToBase64Utf8, urlAttachmentSource };
83
84
  //# sourceMappingURL=content.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"content.d.mts","names":[],"sources":["../../src/protocol/content.ts"],"mappings":";;;;cACuC,aAAA;;;cAE1B,QAAA,SAAiB,aAE5B;AAAA,cAAG,iCAAA;;;cAEQ,4BAAA,SAAqC,iCAKjD;AAAA,cAAG,wBAAA;;;cAES,mBAAA,SAA4B,wBAEvC;AAAA,cAAG,wBAAA;;;cAEQ,mBAAA,SAA4B,wBAEvC;AAAA,cAEW,gBAAA,EAAgB,MAAA,CAAA,KAAA,kBAAA,4BAAA,SAAA,mBAAA,SAAA,mBAAA;AAAA,KAKjB,gBAAA,UAA0B,gBAAA,CAAiB,IAAI;AAAA,cAAA,cAAA;;;;;;;;cAE9C,SAAA,SAAkB,cAO7B;AAAA,cAAG,iBAAA;;;;;;cAEQ,YAAA,SAAqB,iBAKhC;AAAA,cAAG,cAAA;;;;;;cAEQ,SAAA,SAAkB,cAK7B;AAAA,cAEW,WAAA,EAAW,MAAA,CAAA,KAAA,kBAAA,QAAA,SAAA,SAAA,SAAA,YAAA,SAAA,SAAA;AAAA,KACZ,WAAA,UAAqB,WAAA,CAAY,IAAI;AAAA,cAEpC,OAAA,EAAO,MAAA,CAAA,KAAA,WAAA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,KAAA,kBAAA,QAAA,SAAA,SAAA,SAAA,YAAA,SAAA,SAAA;AAAA,KACR,OAAA,UAAiB,OAAA,CAAQ,IAAI;AAAA,KAE7B,qBAAA,GAAwB,SAAA,GAAY,YAAA,GAAe,SAAA;AAAA,KAEnD,wBAAA,0BACV,IAAA,EAAM,qBAAA,KACH,MAAA,CAAO,MAAA,CAAO,gBAAA,EAAkB,CAAA,EAAG,CAAA;AAAA,cA+C3B,+BAAA,SACX,OAAA,EAAS,OAAA,EACT,QAAA,EAAU,wBAAA,CAAyB,CAAA,EAAG,CAAA,MACrC,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS,CAAA,EAAG,CAAA;AAAA,cAKhB,eAAA,GAAmB,IAAiB,EAAX,WAAW;AAAA,cAWpC,kBAAA,GAAsB,IAAiB,EAAX,WAAW;AAAA,cAavC,WAAA,GAAe,OAAgB,EAAP,OAAO;AAAA,cAG/B,cAAA,GAAkB,OAAgB,EAAP,OAAO;AAAA,cAGlC,YAAA,GAAgB,OAAA,EAAS,OAAA,KAAU,aAAA,CAAc,WAAA;AAAA,cAGjD,cAAA,GAAkB,OAAgB,EAAP,OAAO;AAAA,cAMlC,mBAAA,GAAuB,OAAA,EAAS,OAAA,EAAS,IAAA,aAAe,OAgBpE;AAAA,cAEY,4BAAA,GAAgC,IAAA,aAAY,4BAAgD;AAAA,cAE5F,mBAAA,GAAuB,GAAA,aAAW,mBAAsC;AAAA,cAExE,mBAAA,GAAuB,EAAA,aAAU,mBAAqC;AAAA,cAEtE,kBAAA,GAAkB,IAAA,aAN0B,4BAMK;AAAA,cAEjD,uBAAA,GAA2B,MAAwB,EAAhB,gBAAgB;AAAA,cAWnD,uBAAA,GAA2B,MAAA,EAAQ,gBAAA,EAAkB,QAAA,aAAgB,MAAA,CAAA,MAAA;AAAA,cAqCrE,sBAAA,GAA0B,QAAgB;AAAA,cAyB1C,gCAAA,GAAoC,QAAgB;AAAA,cASpD,yBAAA,GAA6B,KAAA;EAAA,SAC/B,QAAA;EAAA,SACA,QAAA;AAAA;AAAA,cAUE,gBAAA,GAAoB,IAAY;AAAA,cAWhC,oBAAA,GAAwB,KAAA;EAAA,SAC1B,IAAA;EAAA,SACA,QAAA;EAAA,SACA,QAAA;EAAA,SACA,KAAA;AAAA,MACV,YAAA;AAAA,cA2BY,oBAAA,GAAwB,MAAA,EAAQ,gBAAA,KAAgB,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA;AAAA,cAahD,sBAAA,GAA0B,MAAA,EAAQ,gBAAA,KAAgB,MAAA,CAAA,MAAA"}
1
+ {"version":3,"file":"content.d.mts","names":[],"sources":["../../src/protocol/content.ts"],"mappings":"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"}
@@ -108,6 +108,13 @@ const attachmentSourceDataUrl = (source, mimeType) => {
108
108
  case "Ref": return Option.none();
109
109
  }
110
110
  };
111
+ const attachmentSourceUrl = (source, mimeType) => {
112
+ switch (source._tag) {
113
+ case "InlineBase64": return Option.some(`data:${mimeType};base64,${source.data}`);
114
+ case "Url": return Option.some(source.url);
115
+ case "Ref": return Option.none();
116
+ }
117
+ };
111
118
  const normalizeMimeType = (mimeType) => mimeType.split(";", 1)[0]?.trim().toLowerCase() ?? "";
112
119
  const textDocumentMimeTypeByExtension = {
113
120
  ".csv": "text/csv",
@@ -191,6 +198,6 @@ const attachmentSourceBase64 = (source) => {
191
198
  }
192
199
  };
193
200
  //#endregion
194
- export { AttachmentSource, AudioPart, Content, ContentPart, DocumentPart, ImagePart, InlineBase64AttachmentSource, RefAttachmentSource, TextPart, UrlAttachmentSource, appendTextToContent, attachmentSourceBase64, attachmentSourceDataUrl, attachmentSourcePreview, attachmentSourceText, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, documentPartFromText, inferTextDocumentMimeType, inlineBase64AttachmentSource, inlineBase64Source, isContentEmpty, isTextDocumentMimeType, refAttachmentSource, resolveContentAttachmentSources, textDocumentMimeTypeFromFilename, textToBase64Utf8, urlAttachmentSource };
201
+ export { AttachmentSource, AudioPart, Content, ContentPart, DocumentPart, ImagePart, InlineBase64AttachmentSource, RefAttachmentSource, TextPart, UrlAttachmentSource, appendTextToContent, attachmentSourceBase64, attachmentSourceDataUrl, attachmentSourcePreview, attachmentSourceText, attachmentSourceUrl, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, documentPartFromText, inferTextDocumentMimeType, inlineBase64AttachmentSource, inlineBase64Source, isContentEmpty, isTextDocumentMimeType, refAttachmentSource, resolveContentAttachmentSources, textDocumentMimeTypeFromFilename, textToBase64Utf8, urlAttachmentSource };
195
202
 
196
203
  //# sourceMappingURL=content.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"content.mjs","names":["Arr"],"sources":["../../src/protocol/content.ts"],"sourcesContent":["import { Array as Arr, Effect, Option } from 'effect'\nimport * as Schema from 'effect/Schema'\n\nexport class TextPart extends Schema.TaggedClass<TextPart>()('Text', {\n text: Schema.String\n}) {}\n\nexport class InlineBase64AttachmentSource extends Schema.TaggedClass<InlineBase64AttachmentSource>()(\n 'InlineBase64',\n {\n data: Schema.String\n }\n) {}\n\nexport class UrlAttachmentSource extends Schema.TaggedClass<UrlAttachmentSource>()('Url', {\n url: Schema.String\n}) {}\n\nexport class RefAttachmentSource extends Schema.TaggedClass<RefAttachmentSource>()('Ref', {\n id: Schema.String\n}) {}\n\nexport const AttachmentSource = Schema.Union([\n InlineBase64AttachmentSource,\n UrlAttachmentSource,\n RefAttachmentSource\n])\nexport type AttachmentSource = typeof AttachmentSource.Type\n\nexport class ImagePart extends Schema.TaggedClass<ImagePart>()('Image', {\n source: AttachmentSource,\n mimeType: Schema.String,\n filename: Schema.optional(Schema.String),\n title: Schema.optional(Schema.String),\n width: Schema.optional(Schema.Number),\n height: Schema.optional(Schema.Number)\n}) {}\n\nexport class DocumentPart extends Schema.TaggedClass<DocumentPart>()('Document', {\n source: AttachmentSource,\n mimeType: Schema.String,\n filename: Schema.String,\n title: Schema.optional(Schema.String)\n}) {}\n\nexport class AudioPart extends Schema.TaggedClass<AudioPart>()('Audio', {\n source: AttachmentSource,\n mimeType: Schema.String,\n filename: Schema.optional(Schema.String),\n durationMs: Schema.optional(Schema.Number)\n}) {}\n\nexport const ContentPart = Schema.Union([TextPart, ImagePart, DocumentPart, AudioPart])\nexport type ContentPart = typeof ContentPart.Type\n\nexport const Content = Schema.Union([Schema.String, Schema.Array(ContentPart)])\nexport type Content = typeof Content.Type\n\nexport type AttachmentContentPart = ImagePart | DocumentPart | AudioPart\n\nexport type AttachmentSourceResolver<E = never, R = never> = (\n part: AttachmentContentPart\n) => Effect.Effect<AttachmentSource, E, R>\n\nconst resolveContentPartAttachmentSource = <E, R>(\n part: ContentPart,\n resolver: AttachmentSourceResolver<E, R>\n): Effect.Effect<ContentPart, E, R> => {\n switch (part._tag) {\n case 'Text':\n return Effect.succeed(part)\n case 'Image':\n return resolver(part).pipe(\n Effect.map(source =>\n ImagePart.make({\n source,\n mimeType: part.mimeType,\n filename: part.filename,\n title: part.title,\n width: part.width,\n height: part.height\n })\n )\n )\n case 'Document':\n return resolver(part).pipe(\n Effect.map(source =>\n DocumentPart.make({\n source,\n mimeType: part.mimeType,\n filename: part.filename,\n title: part.title\n })\n )\n )\n case 'Audio':\n return resolver(part).pipe(\n Effect.map(source =>\n AudioPart.make({\n source,\n mimeType: part.mimeType,\n filename: part.filename,\n durationMs: part.durationMs\n })\n )\n )\n }\n}\n\nexport const resolveContentAttachmentSources = <E, R>(\n content: Content,\n resolver: AttachmentSourceResolver<E, R>\n): Effect.Effect<Content, E, R> =>\n typeof content === 'string'\n ? Effect.succeed(content)\n : Effect.forEach(content, part => resolveContentPartAttachmentSource(part, resolver))\n\nexport const contentPartText = (part: ContentPart) => {\n switch (part._tag) {\n case 'Text':\n return part.text\n case 'Image':\n case 'Document':\n case 'Audio':\n return ''\n }\n}\n\nexport const contentPartPreview = (part: ContentPart) => {\n switch (part._tag) {\n case 'Text':\n return part.text\n case 'Image':\n return 'Image'\n case 'Document':\n return `Document: ${part.title ?? part.filename}`\n case 'Audio':\n return 'Audio'\n }\n}\n\nexport const contentText = (content: Content) =>\n typeof content === 'string' ? content : Arr.map(content, contentPartText).join('')\n\nexport const contentPreview = (content: Content) =>\n typeof content === 'string' ? content : Arr.map(content, contentPartPreview).join(', ')\n\nexport const contentParts = (content: Content): ReadonlyArray<ContentPart> =>\n typeof content === 'string' ? [TextPart.make({ text: content })] : content\n\nexport const isContentEmpty = (content: Content) =>\n typeof content === 'string'\n ? content.length === 0\n : content.length === 0 ||\n Arr.every(content, part => part._tag === 'Text' && part.text.length === 0)\n\nexport const appendTextToContent = (content: Content, text: string): Content => {\n if (typeof content === 'string') {\n return `${content}${text}`\n }\n\n return Option.match(Arr.last(content), {\n onNone: () => [TextPart.make({ text })],\n onSome: last =>\n last._tag !== 'Text'\n ? [...content, TextPart.make({ text })]\n : Arr.map(content, (part, index) =>\n index === content.length - 1 && part._tag === 'Text'\n ? TextPart.make({ text: `${part.text}${text}` })\n : part\n )\n })\n}\n\nexport const inlineBase64AttachmentSource = (data: string) => InlineBase64AttachmentSource.make({ data })\n\nexport const urlAttachmentSource = (url: string) => UrlAttachmentSource.make({ url })\n\nexport const refAttachmentSource = (id: string) => RefAttachmentSource.make({ id })\n\nexport const inlineBase64Source = inlineBase64AttachmentSource\n\nexport const attachmentSourcePreview = (source: AttachmentSource) => {\n switch (source._tag) {\n case 'InlineBase64':\n return 'inline'\n case 'Url':\n return source.url\n case 'Ref':\n return source.id\n }\n}\n\nexport const attachmentSourceDataUrl = (source: AttachmentSource, mimeType: string) => {\n switch (source._tag) {\n case 'InlineBase64':\n return Option.some(`data:${mimeType};base64,${source.data}`)\n case 'Url':\n case 'Ref':\n return Option.none<string>()\n }\n}\n\nconst normalizeMimeType = (mimeType: string) => mimeType.split(';', 1)[0]?.trim().toLowerCase() ?? ''\n\nconst textDocumentMimeTypeByExtension: Readonly<Record<string, string>> = {\n '.csv': 'text/csv',\n '.css': 'text/css',\n '.gql': 'application/graphql',\n '.graphql': 'application/graphql',\n '.html': 'text/html',\n '.js': 'application/javascript',\n '.jsx': 'application/javascript',\n '.json': 'application/json',\n '.jsonl': 'application/x-ndjson',\n '.md': 'text/markdown',\n '.markdown': 'text/markdown',\n '.sql': 'application/sql',\n '.toml': 'application/toml',\n '.ts': 'application/typescript',\n '.tsx': 'application/typescript',\n '.txt': 'text/plain',\n '.xml': 'application/xml',\n '.yaml': 'application/yaml',\n '.yml': 'application/yaml'\n}\n\nconst isUnknownDocumentMimeType = (mimeType: string) =>\n mimeType.length === 0 || mimeType === 'application/octet-stream' || mimeType === 'binary/octet-stream'\n\nexport const isTextDocumentMimeType = (mimeType: string) => {\n const normalized = normalizeMimeType(mimeType)\n\n return (\n normalized.startsWith('text/') ||\n normalized === 'application/json' ||\n normalized === 'application/ld+json' ||\n normalized === 'application/jsonl' ||\n normalized === 'application/x-ndjson' ||\n normalized === 'application/javascript' ||\n normalized === 'application/x-javascript' ||\n normalized === 'application/typescript' ||\n normalized === 'application/x-typescript' ||\n normalized === 'application/xml' ||\n normalized === 'application/yaml' ||\n normalized === 'application/x-yaml' ||\n normalized === 'application/toml' ||\n normalized === 'application/markdown' ||\n normalized === 'application/sql' ||\n normalized === 'application/graphql' ||\n normalized.endsWith('+json') ||\n normalized.endsWith('+xml')\n )\n}\n\nexport const textDocumentMimeTypeFromFilename = (filename: string) => {\n const normalized = filename.trim().toLowerCase()\n const entry = Object.entries(textDocumentMimeTypeByExtension).find(([extension]) =>\n normalized.endsWith(extension)\n )\n\n return entry?.[1]\n}\n\nexport const inferTextDocumentMimeType = (input: {\n readonly filename: string\n readonly mimeType: string\n}) => {\n const normalized = normalizeMimeType(input.mimeType)\n\n if (isTextDocumentMimeType(normalized)) return normalized\n if (!isUnknownDocumentMimeType(normalized)) return undefined\n\n return textDocumentMimeTypeFromFilename(input.filename)\n}\n\nexport const textToBase64Utf8 = (text: string) => {\n const bytes = new TextEncoder().encode(text)\n let binary = ''\n\n for (const byte of bytes) {\n binary += String.fromCharCode(byte)\n }\n\n return globalThis.btoa(binary)\n}\n\nexport const documentPartFromText = (input: {\n readonly text: string\n readonly filename: string\n readonly mimeType: string\n readonly title?: string\n}) => {\n const normalized = normalizeMimeType(input.mimeType)\n const mimeType = inferTextDocumentMimeType({\n filename: input.filename,\n mimeType: input.mimeType\n }) ?? (isUnknownDocumentMimeType(normalized) ? 'text/plain' : undefined)\n\n if (mimeType === undefined) return undefined\n\n const base = {\n source: inlineBase64AttachmentSource(textToBase64Utf8(input.text)),\n mimeType,\n filename: input.filename\n }\n\n return input.title === undefined\n ? DocumentPart.make(base)\n : DocumentPart.make({ ...base, title: input.title })\n}\n\nconst decodeBase64Utf8 = (data: string) => {\n const binary = globalThis.atob(data)\n const bytes = Uint8Array.from(binary, character => character.charCodeAt(0))\n\n return new TextDecoder('utf-8', { fatal: true }).decode(bytes)\n}\n\nexport const attachmentSourceText = (source: AttachmentSource) => {\n switch (source._tag) {\n case 'InlineBase64':\n return Effect.try({\n try: () => Option.some(decodeBase64Utf8(source.data)),\n catch: error => error\n })\n case 'Url':\n case 'Ref':\n return Effect.succeed(Option.none<string>())\n }\n}\n\nexport const attachmentSourceBase64 = (source: AttachmentSource) => {\n switch (source._tag) {\n case 'InlineBase64':\n return Option.some(source.data)\n case 'Url':\n case 'Ref':\n return Option.none<string>()\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"content.mjs","names":["Arr"],"sources":["../../src/protocol/content.ts"],"sourcesContent":["import { Array as Arr, Effect, Option } from 'effect'\nimport * as Schema from 'effect/Schema'\n\nexport class TextPart extends Schema.TaggedClass<TextPart>()('Text', {\n text: Schema.String\n}) {}\n\nexport class InlineBase64AttachmentSource extends Schema.TaggedClass<InlineBase64AttachmentSource>()(\n 'InlineBase64',\n {\n data: Schema.String\n }\n) {}\n\nexport class UrlAttachmentSource extends Schema.TaggedClass<UrlAttachmentSource>()('Url', {\n url: Schema.String\n}) {}\n\nexport class RefAttachmentSource extends Schema.TaggedClass<RefAttachmentSource>()('Ref', {\n id: Schema.String\n}) {}\n\nexport const AttachmentSource = Schema.Union([\n InlineBase64AttachmentSource,\n UrlAttachmentSource,\n RefAttachmentSource\n])\nexport type AttachmentSource = typeof AttachmentSource.Type\n\nexport class ImagePart extends Schema.TaggedClass<ImagePart>()('Image', {\n source: AttachmentSource,\n mimeType: Schema.String,\n filename: Schema.optional(Schema.String),\n title: Schema.optional(Schema.String),\n width: Schema.optional(Schema.Number),\n height: Schema.optional(Schema.Number)\n}) {}\n\nexport class DocumentPart extends Schema.TaggedClass<DocumentPart>()('Document', {\n source: AttachmentSource,\n mimeType: Schema.String,\n filename: Schema.String,\n title: Schema.optional(Schema.String)\n}) {}\n\nexport class AudioPart extends Schema.TaggedClass<AudioPart>()('Audio', {\n source: AttachmentSource,\n mimeType: Schema.String,\n filename: Schema.optional(Schema.String),\n durationMs: Schema.optional(Schema.Number)\n}) {}\n\nexport const ContentPart = Schema.Union([TextPart, ImagePart, DocumentPart, AudioPart])\nexport type ContentPart = typeof ContentPart.Type\n\nexport const Content = Schema.Union([Schema.String, Schema.Array(ContentPart)])\nexport type Content = typeof Content.Type\n\nexport type AttachmentContentPart = ImagePart | DocumentPart | AudioPart\n\nexport type AttachmentSourceResolver<E = never, R = never> = (\n part: AttachmentContentPart\n) => Effect.Effect<AttachmentSource, E, R>\n\nconst resolveContentPartAttachmentSource = <E, R>(\n part: ContentPart,\n resolver: AttachmentSourceResolver<E, R>\n): Effect.Effect<ContentPart, E, R> => {\n switch (part._tag) {\n case 'Text':\n return Effect.succeed(part)\n case 'Image':\n return resolver(part).pipe(\n Effect.map(source =>\n ImagePart.make({\n source,\n mimeType: part.mimeType,\n filename: part.filename,\n title: part.title,\n width: part.width,\n height: part.height\n })\n )\n )\n case 'Document':\n return resolver(part).pipe(\n Effect.map(source =>\n DocumentPart.make({\n source,\n mimeType: part.mimeType,\n filename: part.filename,\n title: part.title\n })\n )\n )\n case 'Audio':\n return resolver(part).pipe(\n Effect.map(source =>\n AudioPart.make({\n source,\n mimeType: part.mimeType,\n filename: part.filename,\n durationMs: part.durationMs\n })\n )\n )\n }\n}\n\nexport const resolveContentAttachmentSources = <E, R>(\n content: Content,\n resolver: AttachmentSourceResolver<E, R>\n): Effect.Effect<Content, E, R> =>\n typeof content === 'string'\n ? Effect.succeed(content)\n : Effect.forEach(content, part => resolveContentPartAttachmentSource(part, resolver))\n\nexport const contentPartText = (part: ContentPart) => {\n switch (part._tag) {\n case 'Text':\n return part.text\n case 'Image':\n case 'Document':\n case 'Audio':\n return ''\n }\n}\n\nexport const contentPartPreview = (part: ContentPart) => {\n switch (part._tag) {\n case 'Text':\n return part.text\n case 'Image':\n return 'Image'\n case 'Document':\n return `Document: ${part.title ?? part.filename}`\n case 'Audio':\n return 'Audio'\n }\n}\n\nexport const contentText = (content: Content) =>\n typeof content === 'string' ? content : Arr.map(content, contentPartText).join('')\n\nexport const contentPreview = (content: Content) =>\n typeof content === 'string' ? content : Arr.map(content, contentPartPreview).join(', ')\n\nexport const contentParts = (content: Content): ReadonlyArray<ContentPart> =>\n typeof content === 'string' ? [TextPart.make({ text: content })] : content\n\nexport const isContentEmpty = (content: Content) =>\n typeof content === 'string'\n ? content.length === 0\n : content.length === 0 ||\n Arr.every(content, part => part._tag === 'Text' && part.text.length === 0)\n\nexport const appendTextToContent = (content: Content, text: string): Content => {\n if (typeof content === 'string') {\n return `${content}${text}`\n }\n\n return Option.match(Arr.last(content), {\n onNone: () => [TextPart.make({ text })],\n onSome: last =>\n last._tag !== 'Text'\n ? [...content, TextPart.make({ text })]\n : Arr.map(content, (part, index) =>\n index === content.length - 1 && part._tag === 'Text'\n ? TextPart.make({ text: `${part.text}${text}` })\n : part\n )\n })\n}\n\nexport const inlineBase64AttachmentSource = (data: string) => InlineBase64AttachmentSource.make({ data })\n\nexport const urlAttachmentSource = (url: string) => UrlAttachmentSource.make({ url })\n\nexport const refAttachmentSource = (id: string) => RefAttachmentSource.make({ id })\n\nexport const inlineBase64Source = inlineBase64AttachmentSource\n\nexport const attachmentSourcePreview = (source: AttachmentSource) => {\n switch (source._tag) {\n case 'InlineBase64':\n return 'inline'\n case 'Url':\n return source.url\n case 'Ref':\n return source.id\n }\n}\n\nexport const attachmentSourceDataUrl = (source: AttachmentSource, mimeType: string) => {\n switch (source._tag) {\n case 'InlineBase64':\n return Option.some(`data:${mimeType};base64,${source.data}`)\n case 'Url':\n case 'Ref':\n return Option.none<string>()\n }\n}\n\nexport const attachmentSourceUrl = (source: AttachmentSource, mimeType: string) => {\n switch (source._tag) {\n case 'InlineBase64':\n return Option.some(`data:${mimeType};base64,${source.data}`)\n case 'Url':\n return Option.some(source.url)\n case 'Ref':\n return Option.none<string>()\n }\n}\n\nconst normalizeMimeType = (mimeType: string) => mimeType.split(';', 1)[0]?.trim().toLowerCase() ?? ''\n\nconst textDocumentMimeTypeByExtension: Readonly<Record<string, string>> = {\n '.csv': 'text/csv',\n '.css': 'text/css',\n '.gql': 'application/graphql',\n '.graphql': 'application/graphql',\n '.html': 'text/html',\n '.js': 'application/javascript',\n '.jsx': 'application/javascript',\n '.json': 'application/json',\n '.jsonl': 'application/x-ndjson',\n '.md': 'text/markdown',\n '.markdown': 'text/markdown',\n '.sql': 'application/sql',\n '.toml': 'application/toml',\n '.ts': 'application/typescript',\n '.tsx': 'application/typescript',\n '.txt': 'text/plain',\n '.xml': 'application/xml',\n '.yaml': 'application/yaml',\n '.yml': 'application/yaml'\n}\n\nconst isUnknownDocumentMimeType = (mimeType: string) =>\n mimeType.length === 0 || mimeType === 'application/octet-stream' || mimeType === 'binary/octet-stream'\n\nexport const isTextDocumentMimeType = (mimeType: string) => {\n const normalized = normalizeMimeType(mimeType)\n\n return (\n normalized.startsWith('text/') ||\n normalized === 'application/json' ||\n normalized === 'application/ld+json' ||\n normalized === 'application/jsonl' ||\n normalized === 'application/x-ndjson' ||\n normalized === 'application/javascript' ||\n normalized === 'application/x-javascript' ||\n normalized === 'application/typescript' ||\n normalized === 'application/x-typescript' ||\n normalized === 'application/xml' ||\n normalized === 'application/yaml' ||\n normalized === 'application/x-yaml' ||\n normalized === 'application/toml' ||\n normalized === 'application/markdown' ||\n normalized === 'application/sql' ||\n normalized === 'application/graphql' ||\n normalized.endsWith('+json') ||\n normalized.endsWith('+xml')\n )\n}\n\nexport const textDocumentMimeTypeFromFilename = (filename: string) => {\n const normalized = filename.trim().toLowerCase()\n const entry = Object.entries(textDocumentMimeTypeByExtension).find(([extension]) =>\n normalized.endsWith(extension)\n )\n\n return entry?.[1]\n}\n\nexport const inferTextDocumentMimeType = (input: {\n readonly filename: string\n readonly mimeType: string\n}) => {\n const normalized = normalizeMimeType(input.mimeType)\n\n if (isTextDocumentMimeType(normalized)) return normalized\n if (!isUnknownDocumentMimeType(normalized)) return undefined\n\n return textDocumentMimeTypeFromFilename(input.filename)\n}\n\nexport const textToBase64Utf8 = (text: string) => {\n const bytes = new TextEncoder().encode(text)\n let binary = ''\n\n for (const byte of bytes) {\n binary += String.fromCharCode(byte)\n }\n\n return globalThis.btoa(binary)\n}\n\nexport const documentPartFromText = (input: {\n readonly text: string\n readonly filename: string\n readonly mimeType: string\n readonly title?: string\n}) => {\n const normalized = normalizeMimeType(input.mimeType)\n const mimeType = inferTextDocumentMimeType({\n filename: input.filename,\n mimeType: input.mimeType\n }) ?? (isUnknownDocumentMimeType(normalized) ? 'text/plain' : undefined)\n\n if (mimeType === undefined) return undefined\n\n const base = {\n source: inlineBase64AttachmentSource(textToBase64Utf8(input.text)),\n mimeType,\n filename: input.filename\n }\n\n return input.title === undefined\n ? DocumentPart.make(base)\n : DocumentPart.make({ ...base, title: input.title })\n}\n\nconst decodeBase64Utf8 = (data: string) => {\n const binary = globalThis.atob(data)\n const bytes = Uint8Array.from(binary, character => character.charCodeAt(0))\n\n return new TextDecoder('utf-8', { fatal: true }).decode(bytes)\n}\n\nexport const attachmentSourceText = (source: AttachmentSource) => {\n switch (source._tag) {\n case 'InlineBase64':\n return Effect.try({\n try: () => Option.some(decodeBase64Utf8(source.data)),\n catch: error => error\n })\n case 'Url':\n case 'Ref':\n return Effect.succeed(Option.none<string>())\n }\n}\n\nexport const attachmentSourceBase64 = (source: AttachmentSource) => {\n switch (source._tag) {\n case 'InlineBase64':\n return Option.some(source.data)\n case 'Url':\n case 'Ref':\n return Option.none<string>()\n }\n}\n"],"mappings":"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"}