@yolk-sdk/agent 0.0.1-canary.0 → 0.0.1-canary.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -10
- package/dist/loop/run.d.mts.map +1 -1
- package/dist/loop/run.mjs +5 -4
- package/dist/loop/run.mjs.map +1 -1
- package/dist/protocol/capability.d.mts +3 -1
- package/dist/protocol/capability.d.mts.map +1 -1
- package/dist/protocol/capability.mjs +14 -1
- package/dist/protocol/capability.mjs.map +1 -1
- package/dist/protocol/content.d.mts +44 -6
- package/dist/protocol/content.d.mts.map +1 -1
- package/dist/protocol/content.mjs +80 -11
- package/dist/protocol/content.mjs.map +1 -1
- package/dist/protocol/event.d.mts +2 -1
- package/dist/protocol/event.d.mts.map +1 -1
- package/dist/protocol/event.mjs +2 -1
- package/dist/protocol/event.mjs.map +1 -1
- package/dist/protocol/index.d.mts +4 -4
- package/dist/protocol/index.d.mts.map +1 -1
- package/dist/protocol/index.mjs +4 -4
- package/dist/protocol/message.d.mts +4 -4
- package/dist/protocol/tool.d.mts +2 -2
- package/dist/runtime/run-runtime.d.mts.map +1 -1
- package/dist/runtime/run-runtime.mjs +27 -1
- package/dist/runtime/run-runtime.mjs.map +1 -1
- package/dist/tools/index.d.mts +2 -2
- package/dist/tools/index.mjs +2 -2
- package/dist/tools/task.d.mts +22 -3
- package/dist/tools/task.d.mts.map +1 -1
- package/dist/tools/task.mjs +31 -2
- package/dist/tools/task.mjs.map +1 -1
- package/package.json +1 -1
- package/src/loop/run.ts +8 -3
- package/src/protocol/capability.ts +9 -2
- package/src/protocol/content.ts +142 -6
- package/src/protocol/event.ts +2 -0
- package/src/protocol/index.ts +17 -0
- package/src/runtime/run-runtime.ts +55 -1
- package/src/tools/README.md +72 -0
- package/src/tools/index.ts +7 -1
- package/src/tools/task.ts +70 -2
package/README.md
CHANGED
|
@@ -14,23 +14,28 @@ Canary APIs are unstable. Keep all `@yolk-sdk/*` packages on the same version.
|
|
|
14
14
|
|
|
15
15
|
## Subpaths
|
|
16
16
|
|
|
17
|
-
| Subpath
|
|
18
|
-
|
|
|
19
|
-
| `@yolk-sdk/agent/protocol`
|
|
20
|
-
| `@yolk-sdk/agent/loop`
|
|
21
|
-
| `@yolk-sdk/agent/loop/testing` | Faux provider and tool executor test helpers
|
|
22
|
-
| `@yolk-sdk/agent/runtime`
|
|
23
|
-
| `@yolk-sdk/agent/client`
|
|
24
|
-
| `@yolk-sdk/agent/tools`
|
|
17
|
+
| Subpath | Purpose |
|
|
18
|
+
| ------------------------------ | -------------------------------------------------------------- |
|
|
19
|
+
| `@yolk-sdk/agent/protocol` | Wire messages, events, content, usage, tool schemas |
|
|
20
|
+
| `@yolk-sdk/agent/loop` | Stateless LLM/tool loop |
|
|
21
|
+
| `@yolk-sdk/agent/loop/testing` | Faux provider and tool executor test helpers |
|
|
22
|
+
| `@yolk-sdk/agent/runtime` | Transcript or append-backed runtime orchestration |
|
|
23
|
+
| `@yolk-sdk/agent/client` | HTTP/NDJSON transport and client state helpers |
|
|
24
|
+
| `@yolk-sdk/agent/tools` | Tool module registry, `makeTool`, task/question tool contracts |
|
|
25
25
|
|
|
26
26
|
## Imports
|
|
27
27
|
|
|
28
28
|
```ts
|
|
29
|
-
import { UserMessage } from '@yolk-sdk/agent/protocol'
|
|
29
|
+
import { makeSubagentRunId, UserMessage } from '@yolk-sdk/agent/protocol'
|
|
30
30
|
import { run } from '@yolk-sdk/agent/loop'
|
|
31
31
|
import { runRuntime } from '@yolk-sdk/agent/runtime'
|
|
32
32
|
import { initialAgentClientState } from '@yolk-sdk/agent/client'
|
|
33
|
-
import {
|
|
33
|
+
import {
|
|
34
|
+
makeNonRecursiveTaskToolModule,
|
|
35
|
+
makeTaskToolResult,
|
|
36
|
+
makeQuestionToolModule,
|
|
37
|
+
resolveTools
|
|
38
|
+
} from '@yolk-sdk/agent/tools'
|
|
34
39
|
```
|
|
35
40
|
|
|
36
41
|
Test helpers live behind their own subpath:
|
|
@@ -56,6 +61,23 @@ const program = run({
|
|
|
56
61
|
// Provide LLM provider, loop config, context transformer, and tool executor layers in the host app.
|
|
57
62
|
```
|
|
58
63
|
|
|
64
|
+
## Protocol content
|
|
65
|
+
|
|
66
|
+
`Content` is either plain text or ordered parts:
|
|
67
|
+
|
|
68
|
+
- `TextPart`
|
|
69
|
+
- `ImagePart` with `InlineBase64`, `Url`, or host-owned `Ref` source
|
|
70
|
+
- `DocumentPart` with `InlineBase64`, `Url`, or host-owned `Ref` source
|
|
71
|
+
- `AudioPart` with `InlineBase64`, `Url`, or host-owned `Ref` source
|
|
72
|
+
|
|
73
|
+
Build sources with `inlineBase64AttachmentSource`, `urlAttachmentSource`, or
|
|
74
|
+
`refAttachmentSource`. Providers require inline/resolved media before lowering. Use inline base64
|
|
75
|
+
for simple apps, or persist `Ref` values and call `resolveContentAttachmentSources` at your storage
|
|
76
|
+
boundary before provider execution. Host apps own upload, auth, retention, and ref hydration policy.
|
|
77
|
+
|
|
78
|
+
Use model capabilities like `textOnlyModelCapabilities`, `textImageModelCapabilities`, or
|
|
79
|
+
`textImageDocumentModelCapabilities` so the loop rejects unsupported inputs before provider calls.
|
|
80
|
+
|
|
59
81
|
## Human-in-the-loop
|
|
60
82
|
|
|
61
83
|
HITL is protocol-level, not UI-level:
|
|
@@ -67,6 +89,23 @@ HITL is protocol-level, not UI-level:
|
|
|
67
89
|
- Use `makeQuestionToolModule` to expose the package-owned `question` tool; answers resume as structured tool results and model-visible text with selected labels.
|
|
68
90
|
- Approval is a host-enforced per-call gate for normal tools, not a model-callable permission tool or persisted allow-always system.
|
|
69
91
|
|
|
92
|
+
## Task subagents
|
|
93
|
+
|
|
94
|
+
`task` is the package-owned contract for subagent delegation. The SDK provides schema,
|
|
95
|
+
validation, non-recursive module wiring, subagent result extraction, and structured task result
|
|
96
|
+
metadata. Host apps provide the actual nested runtime.
|
|
97
|
+
|
|
98
|
+
Recommended setup:
|
|
99
|
+
|
|
100
|
+
- expose `makeNonRecursiveTaskToolModule` only to the top-level agent
|
|
101
|
+
- resolve subagent tools with `subagent: true`
|
|
102
|
+
- omit `task` from subagent toolsets
|
|
103
|
+
- include only tools that are safe for autonomous delegated work
|
|
104
|
+
- use `makeSubagentRunId(call.id)` for protocol-aligned run ids
|
|
105
|
+
- return `makeTaskToolResult(...)` so UI can show subagent id, type, status, model, and timing
|
|
106
|
+
|
|
107
|
+
See `examples/next/lib/agents/workflow-runtime/text-response.ts` for host-owned execution wiring.
|
|
108
|
+
|
|
70
109
|
## Host responsibilities
|
|
71
110
|
|
|
72
111
|
- Choose models/providers and map provider streams into protocol events.
|
package/dist/loop/run.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.mts","names":[],"sources":["../../src/loop/run.ts"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"run.d.mts","names":[],"sources":["../../src/loop/run.ts"],"mappings":";;;;;;;;;KAsEY,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,cAqhCN,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,cA4C7C,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
|
@@ -6,7 +6,7 @@ import { LoopConfig } from "./services/loop-config.mjs";
|
|
|
6
6
|
import { ToolExecutor } from "./services/tool-executor.mjs";
|
|
7
7
|
import { Clock, Effect, Ref, Stream } from "effect";
|
|
8
8
|
import * as Schema from "effect/Schema";
|
|
9
|
-
import { AgentAwaitingInput, AgentEnd, AgentRetry, AgentStart, AssistantMessageEvent, LLMReasoningDelta, LLMStreamEnd, LLMStreamStart, LLMTextDelta, ProviderToolResult, QuestionAnswered, QuestionCancelled, QuestionRequest, QuestionRequested, QuestionToolParams, SubagentCompleted, SubagentStarted, ToolApprovalDenied, ToolApprovalGranted, ToolApprovalRequest, ToolApprovalRequested, ToolExecutionCompleted, ToolExecutionError, ToolExecutionStarted, ToolInputDelta, ToolInputEnd, ToolInputStart, ToolResult, ToolResultMessage, TurnEnd, TurnStart, UsageUpdate, addAgentUsage, assistantHostToolCalls, contentParts, contentPreview, formatQuestionResponseContent, zeroAgentUsage } from "@yolk-sdk/agent/protocol";
|
|
9
|
+
import { AgentAwaitingInput, AgentEnd, AgentRetry, AgentStart, AssistantMessageEvent, LLMReasoningDelta, LLMStreamEnd, LLMStreamStart, LLMTextDelta, ProviderToolResult, QuestionAnswered, QuestionCancelled, QuestionRequest, QuestionRequested, QuestionToolParams, SubagentCompleted, SubagentStarted, ToolApprovalDenied, ToolApprovalGranted, ToolApprovalRequest, ToolApprovalRequested, ToolExecutionCompleted, ToolExecutionError, ToolExecutionStarted, ToolInputDelta, ToolInputEnd, ToolInputStart, ToolResult, ToolResultMessage, TurnEnd, TurnStart, UsageUpdate, addAgentUsage, assistantHostToolCalls, contentParts, contentPreview, formatQuestionResponseContent, makeSubagentRunId, zeroAgentUsage } from "@yolk-sdk/agent/protocol";
|
|
10
10
|
//#region src/loop/run.ts
|
|
11
11
|
const questionToolName = "question";
|
|
12
12
|
const objectField = (input, key) => input !== null && typeof input === "object" ? Object.getOwnPropertyDescriptor(input, key)?.value : void 0;
|
|
@@ -20,7 +20,7 @@ const taskCallMetadata = (call) => {
|
|
|
20
20
|
const description = nonEmptyStringField(call.params, "description");
|
|
21
21
|
if (subagentType === void 0 || description === void 0) return;
|
|
22
22
|
return {
|
|
23
|
-
subagentRunId:
|
|
23
|
+
subagentRunId: makeSubagentRunId(call.id),
|
|
24
24
|
subagentType,
|
|
25
25
|
description
|
|
26
26
|
};
|
|
@@ -59,6 +59,7 @@ const validateContent = (message, capabilities) => Effect.forEach(contentPartsFr
|
|
|
59
59
|
switch (part._tag) {
|
|
60
60
|
case "Text": return capabilities.input.text ? Effect.void : Effect.fail(unsupportedInputError("Text input is not supported by this model"));
|
|
61
61
|
case "Image": return capabilities.input.image ? Effect.void : Effect.fail(unsupportedInputError("Image input is not supported by this model"));
|
|
62
|
+
case "Document": return capabilities.input.document ? Effect.void : Effect.fail(unsupportedInputError("Document input is not supported by this model"));
|
|
62
63
|
case "Audio": return capabilities.input.audio ? Effect.void : Effect.fail(unsupportedInputError("Audio input is not supported by this model"));
|
|
63
64
|
}
|
|
64
65
|
});
|
|
@@ -175,8 +176,8 @@ const toolDefFor = (tools, call) => tools.find((tool) => tool.name === call.name
|
|
|
175
176
|
const approvalRequired = (tools, call) => toolDefFor(tools, call)?.approval?.mode === "manual";
|
|
176
177
|
const approvalRequestId = (call) => `approval:${call.id}`;
|
|
177
178
|
const questionRequestId = (call) => `question:${call.id}`;
|
|
178
|
-
const matchesApproval = (response, call) => response.toolCallId === call.id
|
|
179
|
-
const matchesQuestion = (response, call) => response.toolCallId === call.id
|
|
179
|
+
const matchesApproval = (response, call) => response.toolCallId === call.id && response.requestId === approvalRequestId(call);
|
|
180
|
+
const matchesQuestion = (response, call) => response.toolCallId === call.id && response.requestId === questionRequestId(call);
|
|
180
181
|
const approvalResponseFor = (responses, call) => responses.flatMap((response) => response._tag === "ToolApprovalResponse" && matchesApproval(response, call) ? [response] : [])[0];
|
|
181
182
|
const questionResponseFor = (responses, call) => responses.flatMap((response) => response._tag === "QuestionResponse" && matchesQuestion(response, call) ? [response] : [])[0];
|
|
182
183
|
const toolApprovalRequest = (tools, call) => ToolApprovalRequest.make({
|
package/dist/loop/run.mjs.map
CHANGED
|
@@ -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 ToolApprovalDenied,\n ToolApprovalGranted,\n ToolApprovalRequested,\n ToolInputEnd,\n ToolInputDelta,\n ToolInputStart,\n QuestionAnswered,\n QuestionCancelled,\n QuestionRequested,\n ProviderToolResult,\n QuestionRequest,\n QuestionToolParams,\n formatQuestionResponseContent,\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' ? Object.getOwnPropertyDescriptor(input, key)?.value : 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: `subagent:${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 '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 retryDelayMs = (baseDelayMs: number, attempt: number) =>\n Math.max(0, Math.floor(baseDelayMs * 2 ** Math.max(0, attempt - 1)))\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)\n return Stream.make(\n AgentRetry.make({\n attempt,\n reason: retryReason(error),\n delayMs,\n message: error.message\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> = 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\n ? [toolCompleted]\n : [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 = (\n tools: ReadonlyArray<ToolDef>,\n call: ToolCall\n): 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: {\n type: 'question_response',\n outcome: response.outcome,\n answers: response.answers ?? [],\n reason: response.reason,\n source: response.source\n }\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: [\n response.outcome === 'answered'\n ? QuestionAnswered.make({ response })\n : QuestionCancelled.make({ response })\n ]\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: [ToolApprovalDenied.make({ toolCallId: call.id, reason: response.reason ?? 'Denied by user', response })]\n }\n }\n\n return {\n _tag: 'Execute',\n index,\n call,\n events: [ToolApprovalGranted.make({ toolCallId: call.id, 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 => [...messages, ...orderedResults]).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: [...input.currentMessages, assistantMessage, ...orderedResults],\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 = (input: TurnStreamInput): 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 => [...messages, ...orderedResults]).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> = 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 ToolApprovalDenied,\n ToolApprovalGranted,\n ToolApprovalRequested,\n ToolInputEnd,\n ToolInputDelta,\n ToolInputStart,\n QuestionAnswered,\n QuestionCancelled,\n QuestionRequested,\n ProviderToolResult,\n QuestionRequest,\n QuestionToolParams,\n formatQuestionResponseContent,\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' ? Object.getOwnPropertyDescriptor(input, key)?.value : 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 retryDelayMs = (baseDelayMs: number, attempt: number) =>\n Math.max(0, Math.floor(baseDelayMs * 2 ** Math.max(0, attempt - 1)))\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)\n return Stream.make(\n AgentRetry.make({\n attempt,\n reason: retryReason(error),\n delayMs,\n message: error.message\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> = 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\n ? [toolCompleted]\n : [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 = (\n tools: ReadonlyArray<ToolDef>,\n call: ToolCall\n): 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: {\n type: 'question_response',\n outcome: response.outcome,\n answers: response.answers ?? [],\n reason: response.reason,\n source: response.source\n }\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: [\n response.outcome === 'answered'\n ? QuestionAnswered.make({ response })\n : QuestionCancelled.make({ response })\n ]\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: [ToolApprovalDenied.make({ toolCallId: call.id, reason: response.reason ?? 'Denied by user', response })]\n }\n }\n\n return {\n _tag: 'Execute',\n index,\n call,\n events: [ToolApprovalGranted.make({ toolCallId: call.id, 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 => [...messages, ...orderedResults]).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: [...input.currentMessages, assistantMessage, ...orderedResults],\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 = (input: TurnStreamInput): 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 => [...messages, ...orderedResults]).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> = 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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"}
|
|
@@ -4,6 +4,7 @@ import * as Schema from "effect/Schema";
|
|
|
4
4
|
declare const AgentContentCapabilities_base: Schema.Class<AgentContentCapabilities, Schema.Struct<{
|
|
5
5
|
readonly text: Schema.Boolean;
|
|
6
6
|
readonly image: Schema.Boolean;
|
|
7
|
+
readonly document: Schema.Boolean;
|
|
7
8
|
readonly audio: Schema.Boolean;
|
|
8
9
|
}>, {}>;
|
|
9
10
|
declare class AgentContentCapabilities extends AgentContentCapabilities_base {}
|
|
@@ -15,6 +16,7 @@ declare const AgentModelCapabilities_base: Schema.Class<AgentModelCapabilities,
|
|
|
15
16
|
declare class AgentModelCapabilities extends AgentModelCapabilities_base {}
|
|
16
17
|
declare const textOnlyModelCapabilities: AgentModelCapabilities;
|
|
17
18
|
declare const textImageModelCapabilities: AgentModelCapabilities;
|
|
19
|
+
declare const textImageDocumentModelCapabilities: AgentModelCapabilities;
|
|
18
20
|
//#endregion
|
|
19
|
-
export { AgentContentCapabilities, AgentModelCapabilities, textImageModelCapabilities, textOnlyModelCapabilities };
|
|
21
|
+
export { AgentContentCapabilities, AgentModelCapabilities, textImageDocumentModelCapabilities, textImageModelCapabilities, textOnlyModelCapabilities };
|
|
20
22
|
//# sourceMappingURL=capability.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability.d.mts","names":[],"sources":["../../src/protocol/capability.ts"],"mappings":";;;cAAuC,6BAAA
|
|
1
|
+
{"version":3,"file":"capability.d.mts","names":[],"sources":["../../src/protocol/capability.ts"],"mappings":";;;cAAuC,6BAAA;;;;;;cAE1B,wBAAA,SAAiC,6BAO5C;AAAA,cAAG,2BAAA;;;;;cAEQ,sBAAA,SAA+B,2BAM1C;AAAA,cAEW,yBAAA,EAAyB,sBAIpC;AAAA,cAEW,0BAAA,EAA0B,sBAIrC;AAAA,cAEW,kCAAA,EAAkC,sBAI7C"}
|
|
@@ -3,6 +3,7 @@ import * as Schema from "effect/Schema";
|
|
|
3
3
|
var AgentContentCapabilities = class extends Schema.Class("AgentContentCapabilities")({
|
|
4
4
|
text: Schema.Boolean,
|
|
5
5
|
image: Schema.Boolean,
|
|
6
|
+
document: Schema.Boolean,
|
|
6
7
|
audio: Schema.Boolean
|
|
7
8
|
}) {};
|
|
8
9
|
var AgentModelCapabilities = class extends Schema.Class("AgentModelCapabilities")({
|
|
@@ -14,6 +15,7 @@ const textOnlyModelCapabilities = AgentModelCapabilities.make({
|
|
|
14
15
|
input: AgentContentCapabilities.make({
|
|
15
16
|
text: true,
|
|
16
17
|
image: false,
|
|
18
|
+
document: false,
|
|
17
19
|
audio: false
|
|
18
20
|
}),
|
|
19
21
|
tools: true,
|
|
@@ -23,12 +25,23 @@ const textImageModelCapabilities = AgentModelCapabilities.make({
|
|
|
23
25
|
input: AgentContentCapabilities.make({
|
|
24
26
|
text: true,
|
|
25
27
|
image: true,
|
|
28
|
+
document: false,
|
|
29
|
+
audio: false
|
|
30
|
+
}),
|
|
31
|
+
tools: true,
|
|
32
|
+
reasoning: true
|
|
33
|
+
});
|
|
34
|
+
const textImageDocumentModelCapabilities = AgentModelCapabilities.make({
|
|
35
|
+
input: AgentContentCapabilities.make({
|
|
36
|
+
text: true,
|
|
37
|
+
image: true,
|
|
38
|
+
document: true,
|
|
26
39
|
audio: false
|
|
27
40
|
}),
|
|
28
41
|
tools: true,
|
|
29
42
|
reasoning: true
|
|
30
43
|
});
|
|
31
44
|
//#endregion
|
|
32
|
-
export { AgentContentCapabilities, AgentModelCapabilities, textImageModelCapabilities, textOnlyModelCapabilities };
|
|
45
|
+
export { AgentContentCapabilities, AgentModelCapabilities, textImageDocumentModelCapabilities, textImageModelCapabilities, textOnlyModelCapabilities };
|
|
33
46
|
|
|
34
47
|
//# sourceMappingURL=capability.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability.mjs","names":[],"sources":["../../src/protocol/capability.ts"],"sourcesContent":["import * as Schema from 'effect/Schema'\n\nexport class AgentContentCapabilities extends Schema.Class<AgentContentCapabilities>(\n 'AgentContentCapabilities'\n)({\n text: Schema.Boolean,\n image: Schema.Boolean,\n audio: Schema.Boolean\n}) {}\n\nexport class AgentModelCapabilities extends Schema.Class<AgentModelCapabilities>(\n 'AgentModelCapabilities'\n)({\n input: AgentContentCapabilities,\n tools: Schema.Boolean,\n reasoning: Schema.Boolean\n}) {}\n\nexport const textOnlyModelCapabilities = AgentModelCapabilities.make({\n input: AgentContentCapabilities.make({ text: true, image: false, audio: false }),\n tools: true,\n reasoning: true\n})\n\nexport const textImageModelCapabilities = AgentModelCapabilities.make({\n input: AgentContentCapabilities.make({ text: true, image: true, audio: false }),\n tools: true,\n reasoning: true\n})\n"],"mappings":";;AAEA,IAAa,2BAAb,cAA8C,OAAO,MACnD,0BACF,EAAE;CACA,MAAM,OAAO;CACb,OAAO,OAAO;CACd,OAAO,OAAO;AAChB,CAAC,EAAE,CAAC;AAEJ,IAAa,yBAAb,cAA4C,OAAO,MACjD,wBACF,EAAE;CACA,OAAO;CACP,OAAO,OAAO;CACd,WAAW,OAAO;AACpB,CAAC,EAAE,CAAC;AAEJ,MAAa,4BAA4B,uBAAuB,KAAK;CACnE,OAAO,yBAAyB,KAAK;EAAE,MAAM;EAAM,OAAO;EAAO,OAAO;CAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"capability.mjs","names":[],"sources":["../../src/protocol/capability.ts"],"sourcesContent":["import * as Schema from 'effect/Schema'\n\nexport class AgentContentCapabilities extends Schema.Class<AgentContentCapabilities>(\n 'AgentContentCapabilities'\n)({\n text: Schema.Boolean,\n image: Schema.Boolean,\n document: Schema.Boolean,\n audio: Schema.Boolean\n}) {}\n\nexport class AgentModelCapabilities extends Schema.Class<AgentModelCapabilities>(\n 'AgentModelCapabilities'\n)({\n input: AgentContentCapabilities,\n tools: Schema.Boolean,\n reasoning: Schema.Boolean\n}) {}\n\nexport const textOnlyModelCapabilities = AgentModelCapabilities.make({\n input: AgentContentCapabilities.make({ text: true, image: false, document: false, audio: false }),\n tools: true,\n reasoning: true\n})\n\nexport const textImageModelCapabilities = AgentModelCapabilities.make({\n input: AgentContentCapabilities.make({ text: true, image: true, document: false, audio: false }),\n tools: true,\n reasoning: true\n})\n\nexport const textImageDocumentModelCapabilities = AgentModelCapabilities.make({\n input: AgentContentCapabilities.make({ text: true, image: true, document: true, audio: false }),\n tools: true,\n reasoning: true\n})\n"],"mappings":";;AAEA,IAAa,2BAAb,cAA8C,OAAO,MACnD,0BACF,EAAE;CACA,MAAM,OAAO;CACb,OAAO,OAAO;CACd,UAAU,OAAO;CACjB,OAAO,OAAO;AAChB,CAAC,EAAE,CAAC;AAEJ,IAAa,yBAAb,cAA4C,OAAO,MACjD,wBACF,EAAE;CACA,OAAO;CACP,OAAO,OAAO;CACd,WAAW,OAAO;AACpB,CAAC,EAAE,CAAC;AAEJ,MAAa,4BAA4B,uBAAuB,KAAK;CACnE,OAAO,yBAAyB,KAAK;EAAE,MAAM;EAAM,OAAO;EAAO,UAAU;EAAO,OAAO;CAAM,CAAC;CAChG,OAAO;CACP,WAAW;AACb,CAAC;AAED,MAAa,6BAA6B,uBAAuB,KAAK;CACpE,OAAO,yBAAyB,KAAK;EAAE,MAAM;EAAM,OAAO;EAAM,UAAU;EAAO,OAAO;CAAM,CAAC;CAC/F,OAAO;CACP,WAAW;AACb,CAAC;AAED,MAAa,qCAAqC,uBAAuB,KAAK;CAC5E,OAAO,yBAAyB,KAAK;EAAE,MAAM;EAAM,OAAO;EAAM,UAAU;EAAM,OAAO;CAAM,CAAC;CAC9F,OAAO;CACP,WAAW;AACb,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Effect, Option } from "effect";
|
|
1
2
|
import * as Schema from "effect/Schema";
|
|
2
3
|
|
|
3
4
|
//#region src/protocol/content.d.ts
|
|
@@ -5,20 +6,50 @@ declare const TextPart_base: Schema.Class<TextPart, Schema.TaggedStruct<"Text",
|
|
|
5
6
|
readonly text: Schema.String;
|
|
6
7
|
}>, {}>;
|
|
7
8
|
declare class TextPart extends TextPart_base {}
|
|
8
|
-
declare const
|
|
9
|
+
declare const InlineBase64AttachmentSource_base: Schema.Class<InlineBase64AttachmentSource, Schema.TaggedStruct<"InlineBase64", {
|
|
9
10
|
readonly data: Schema.String;
|
|
11
|
+
}>, {}>;
|
|
12
|
+
declare class InlineBase64AttachmentSource extends InlineBase64AttachmentSource_base {}
|
|
13
|
+
declare const UrlAttachmentSource_base: Schema.Class<UrlAttachmentSource, Schema.TaggedStruct<"Url", {
|
|
14
|
+
readonly url: Schema.String;
|
|
15
|
+
}>, {}>;
|
|
16
|
+
declare class UrlAttachmentSource extends UrlAttachmentSource_base {}
|
|
17
|
+
declare const RefAttachmentSource_base: Schema.Class<RefAttachmentSource, Schema.TaggedStruct<"Ref", {
|
|
18
|
+
readonly id: Schema.String;
|
|
19
|
+
}>, {}>;
|
|
20
|
+
declare class RefAttachmentSource extends RefAttachmentSource_base {}
|
|
21
|
+
declare const AttachmentSource: Schema.Union<readonly [typeof InlineBase64AttachmentSource, typeof UrlAttachmentSource, typeof RefAttachmentSource]>;
|
|
22
|
+
type AttachmentSource = typeof AttachmentSource.Type;
|
|
23
|
+
declare const ImagePart_base: Schema.Class<ImagePart, Schema.TaggedStruct<"Image", {
|
|
24
|
+
readonly source: Schema.Union<readonly [typeof InlineBase64AttachmentSource, typeof UrlAttachmentSource, typeof RefAttachmentSource]>;
|
|
10
25
|
readonly mimeType: Schema.String;
|
|
26
|
+
readonly filename: Schema.optional<Schema.String>;
|
|
27
|
+
readonly title: Schema.optional<Schema.String>;
|
|
28
|
+
readonly width: Schema.optional<Schema.Number>;
|
|
29
|
+
readonly height: Schema.optional<Schema.Number>;
|
|
11
30
|
}>, {}>;
|
|
12
31
|
declare class ImagePart extends ImagePart_base {}
|
|
32
|
+
declare const DocumentPart_base: Schema.Class<DocumentPart, Schema.TaggedStruct<"Document", {
|
|
33
|
+
readonly source: Schema.Union<readonly [typeof InlineBase64AttachmentSource, typeof UrlAttachmentSource, typeof RefAttachmentSource]>;
|
|
34
|
+
readonly mimeType: Schema.String;
|
|
35
|
+
readonly filename: Schema.String;
|
|
36
|
+
readonly title: Schema.optional<Schema.String>;
|
|
37
|
+
}>, {}>;
|
|
38
|
+
declare class DocumentPart extends DocumentPart_base {}
|
|
13
39
|
declare const AudioPart_base: Schema.Class<AudioPart, Schema.TaggedStruct<"Audio", {
|
|
14
|
-
readonly
|
|
15
|
-
readonly
|
|
40
|
+
readonly source: Schema.Union<readonly [typeof InlineBase64AttachmentSource, typeof UrlAttachmentSource, typeof RefAttachmentSource]>;
|
|
41
|
+
readonly mimeType: Schema.String;
|
|
42
|
+
readonly filename: Schema.optional<Schema.String>;
|
|
43
|
+
readonly durationMs: Schema.optional<Schema.Number>;
|
|
16
44
|
}>, {}>;
|
|
17
45
|
declare class AudioPart extends AudioPart_base {}
|
|
18
|
-
declare const ContentPart: Schema.Union<readonly [typeof TextPart, typeof ImagePart, typeof AudioPart]>;
|
|
46
|
+
declare const ContentPart: Schema.Union<readonly [typeof TextPart, typeof ImagePart, typeof DocumentPart, typeof AudioPart]>;
|
|
19
47
|
type ContentPart = typeof ContentPart.Type;
|
|
20
|
-
declare const Content: Schema.Union<readonly [Schema.String, Schema.$Array<Schema.Union<readonly [typeof TextPart, typeof ImagePart, typeof AudioPart]>>]>;
|
|
48
|
+
declare const Content: Schema.Union<readonly [Schema.String, Schema.$Array<Schema.Union<readonly [typeof TextPart, typeof ImagePart, typeof DocumentPart, typeof AudioPart]>>]>;
|
|
21
49
|
type Content = typeof Content.Type;
|
|
50
|
+
type AttachmentContentPart = ImagePart | DocumentPart | AudioPart;
|
|
51
|
+
type AttachmentSourceResolver<E = never, R = never> = (part: AttachmentContentPart) => Effect.Effect<AttachmentSource, E, R>;
|
|
52
|
+
declare const resolveContentAttachmentSources: <E, R>(content: Content, resolver: AttachmentSourceResolver<E, R>) => Effect.Effect<Content, E, R>;
|
|
22
53
|
declare const contentPartText: (part: ContentPart) => string;
|
|
23
54
|
declare const contentPartPreview: (part: ContentPart) => string;
|
|
24
55
|
declare const contentText: (content: Content) => string;
|
|
@@ -26,6 +57,13 @@ declare const contentPreview: (content: Content) => string;
|
|
|
26
57
|
declare const contentParts: (content: Content) => ReadonlyArray<ContentPart>;
|
|
27
58
|
declare const isContentEmpty: (content: Content) => boolean;
|
|
28
59
|
declare const appendTextToContent: (content: Content, text: string) => Content;
|
|
60
|
+
declare const inlineBase64AttachmentSource: (data: string) => InlineBase64AttachmentSource;
|
|
61
|
+
declare const urlAttachmentSource: (url: string) => UrlAttachmentSource;
|
|
62
|
+
declare const refAttachmentSource: (id: string) => RefAttachmentSource;
|
|
63
|
+
declare const inlineBase64Source: (data: string) => InlineBase64AttachmentSource;
|
|
64
|
+
declare const attachmentSourcePreview: (source: AttachmentSource) => string;
|
|
65
|
+
declare const attachmentSourceDataUrl: (source: AttachmentSource, mimeType: string) => Option.Option<string>;
|
|
66
|
+
declare const attachmentSourceBase64: (source: AttachmentSource) => Option.Option<string>;
|
|
29
67
|
//#endregion
|
|
30
|
-
export { AudioPart, Content, ContentPart, ImagePart, TextPart, appendTextToContent, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, isContentEmpty };
|
|
68
|
+
export { AttachmentContentPart, AttachmentSource, AttachmentSourceResolver, AudioPart, Content, ContentPart, DocumentPart, ImagePart, InlineBase64AttachmentSource, RefAttachmentSource, TextPart, UrlAttachmentSource, appendTextToContent, attachmentSourceBase64, attachmentSourceDataUrl, attachmentSourcePreview, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, inlineBase64AttachmentSource, inlineBase64Source, isContentEmpty, refAttachmentSource, resolveContentAttachmentSources, urlAttachmentSource };
|
|
31
69
|
//# sourceMappingURL=content.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.d.mts","names":[],"sources":["../../src/protocol/content.ts"],"mappings":"
|
|
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,cAUrE,sBAAA,GAA0B,MAAA,EAAQ,gBAAA,KAAgB,MAAA,CAAA,MAAA"}
|