@yolk-sdk/agent 0.0.1-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/dist/client/index.d.mts +3 -0
  4. package/dist/client/index.mjs +3 -0
  5. package/dist/client/state.d.mts +99 -0
  6. package/dist/client/state.d.mts.map +1 -0
  7. package/dist/client/state.mjs +245 -0
  8. package/dist/client/state.mjs.map +1 -0
  9. package/dist/client/transport.d.mts +67 -0
  10. package/dist/client/transport.d.mts.map +1 -0
  11. package/dist/client/transport.mjs +219 -0
  12. package/dist/client/transport.mjs.map +1 -0
  13. package/dist/index.d.mts +1 -0
  14. package/dist/index.mjs +1 -0
  15. package/dist/loop/accumulator.d.mts +11 -0
  16. package/dist/loop/accumulator.d.mts.map +1 -0
  17. package/dist/loop/accumulator.mjs +40 -0
  18. package/dist/loop/accumulator.mjs.map +1 -0
  19. package/dist/loop/error.d.mts +36 -0
  20. package/dist/loop/error.d.mts.map +1 -0
  21. package/dist/loop/error.mjs +84 -0
  22. package/dist/loop/error.mjs.map +1 -0
  23. package/dist/loop/index.d.mts +9 -0
  24. package/dist/loop/index.mjs +9 -0
  25. package/dist/loop/llm-event.d.mts +44 -0
  26. package/dist/loop/llm-event.d.mts.map +1 -0
  27. package/dist/loop/llm-event.mjs +34 -0
  28. package/dist/loop/llm-event.mjs.map +1 -0
  29. package/dist/loop/run.d.mts +37 -0
  30. package/dist/loop/run.d.mts.map +1 -0
  31. package/dist/loop/run.mjs +624 -0
  32. package/dist/loop/run.mjs.map +1 -0
  33. package/dist/loop/services/context-transformer.d.mts +18 -0
  34. package/dist/loop/services/context-transformer.d.mts.map +1 -0
  35. package/dist/loop/services/context-transformer.mjs +12 -0
  36. package/dist/loop/services/context-transformer.mjs.map +1 -0
  37. package/dist/loop/services/llm-provider.d.mts +20 -0
  38. package/dist/loop/services/llm-provider.d.mts.map +1 -0
  39. package/dist/loop/services/llm-provider.mjs +7 -0
  40. package/dist/loop/services/llm-provider.mjs.map +1 -0
  41. package/dist/loop/services/loop-config.d.mts +17 -0
  42. package/dist/loop/services/loop-config.d.mts.map +1 -0
  43. package/dist/loop/services/loop-config.mjs +15 -0
  44. package/dist/loop/services/loop-config.mjs.map +1 -0
  45. package/dist/loop/services/tool-executor.d.mts +12 -0
  46. package/dist/loop/services/tool-executor.d.mts.map +1 -0
  47. package/dist/loop/services/tool-executor.mjs +7 -0
  48. package/dist/loop/services/tool-executor.mjs.map +1 -0
  49. package/dist/loop/testing/faux-provider.d.mts +31 -0
  50. package/dist/loop/testing/faux-provider.d.mts.map +1 -0
  51. package/dist/loop/testing/faux-provider.mjs +47 -0
  52. package/dist/loop/testing/faux-provider.mjs.map +1 -0
  53. package/dist/loop/testing/index.d.mts +3 -0
  54. package/dist/loop/testing/index.mjs +3 -0
  55. package/dist/loop/testing/test-tool-executor.d.mts +10 -0
  56. package/dist/loop/testing/test-tool-executor.d.mts.map +1 -0
  57. package/dist/loop/testing/test-tool-executor.mjs +21 -0
  58. package/dist/loop/testing/test-tool-executor.mjs.map +1 -0
  59. package/dist/protocol/capability.d.mts +20 -0
  60. package/dist/protocol/capability.d.mts.map +1 -0
  61. package/dist/protocol/capability.mjs +34 -0
  62. package/dist/protocol/capability.mjs.map +1 -0
  63. package/dist/protocol/content.d.mts +31 -0
  64. package/dist/protocol/content.d.mts.map +1 -0
  65. package/dist/protocol/content.mjs +52 -0
  66. package/dist/protocol/content.mjs.map +1 -0
  67. package/dist/protocol/event.d.mts +228 -0
  68. package/dist/protocol/event.d.mts.map +1 -0
  69. package/dist/protocol/event.mjs +217 -0
  70. package/dist/protocol/event.mjs.map +1 -0
  71. package/dist/protocol/index.d.mts +14 -0
  72. package/dist/protocol/index.d.mts.map +1 -0
  73. package/dist/protocol/index.mjs +9 -0
  74. package/dist/protocol/message.d.mts +53 -0
  75. package/dist/protocol/message.d.mts.map +1 -0
  76. package/dist/protocol/message.mjs +49 -0
  77. package/dist/protocol/message.mjs.map +1 -0
  78. package/dist/protocol/reasoning.d.mts +8 -0
  79. package/dist/protocol/reasoning.d.mts.map +1 -0
  80. package/dist/protocol/reasoning.mjs +13 -0
  81. package/dist/protocol/reasoning.mjs.map +1 -0
  82. package/dist/protocol/session.d.mts +39 -0
  83. package/dist/protocol/session.d.mts.map +1 -0
  84. package/dist/protocol/session.mjs +38 -0
  85. package/dist/protocol/session.mjs.map +1 -0
  86. package/dist/protocol/tool.d.mts +101 -0
  87. package/dist/protocol/tool.d.mts.map +1 -0
  88. package/dist/protocol/tool.mjs +102 -0
  89. package/dist/protocol/tool.mjs.map +1 -0
  90. package/dist/protocol/usage.d.mts +26 -0
  91. package/dist/protocol/usage.d.mts.map +1 -0
  92. package/dist/protocol/usage.mjs +40 -0
  93. package/dist/protocol/usage.mjs.map +1 -0
  94. package/dist/runtime/error.d.mts +29 -0
  95. package/dist/runtime/error.d.mts.map +1 -0
  96. package/dist/runtime/error.mjs +46 -0
  97. package/dist/runtime/error.mjs.map +1 -0
  98. package/dist/runtime/index.d.mts +9 -0
  99. package/dist/runtime/index.d.mts.map +1 -0
  100. package/dist/runtime/index.mjs +4 -0
  101. package/dist/runtime/run-runtime.d.mts +47 -0
  102. package/dist/runtime/run-runtime.d.mts.map +1 -0
  103. package/dist/runtime/run-runtime.mjs +112 -0
  104. package/dist/runtime/run-runtime.mjs.map +1 -0
  105. package/dist/runtime/session-event-store.d.mts +75 -0
  106. package/dist/runtime/session-event-store.d.mts.map +1 -0
  107. package/dist/runtime/session-event-store.mjs +124 -0
  108. package/dist/runtime/session-event-store.mjs.map +1 -0
  109. package/dist/tools/index.d.mts +4 -0
  110. package/dist/tools/index.mjs +4 -0
  111. package/dist/tools/question.d.mts +21 -0
  112. package/dist/tools/question.d.mts.map +1 -0
  113. package/dist/tools/question.mjs +41 -0
  114. package/dist/tools/question.mjs.map +1 -0
  115. package/dist/tools/registry.d.mts +61 -0
  116. package/dist/tools/registry.d.mts.map +1 -0
  117. package/dist/tools/registry.mjs +113 -0
  118. package/dist/tools/registry.mjs.map +1 -0
  119. package/dist/tools/task.d.mts +34 -0
  120. package/dist/tools/task.d.mts.map +1 -0
  121. package/dist/tools/task.mjs +81 -0
  122. package/dist/tools/task.mjs.map +1 -0
  123. package/package.json +86 -0
  124. package/src/client/README.md +23 -0
  125. package/src/client/index.ts +43 -0
  126. package/src/client/state.ts +380 -0
  127. package/src/client/transport.ts +517 -0
  128. package/src/index.ts +2 -0
  129. package/src/loop/README.md +23 -0
  130. package/src/loop/accumulator.ts +71 -0
  131. package/src/loop/error.ts +105 -0
  132. package/src/loop/index.ts +35 -0
  133. package/src/loop/llm-event.ts +52 -0
  134. package/src/loop/run.ts +1237 -0
  135. package/src/loop/services/context-transformer.ts +24 -0
  136. package/src/loop/services/llm-provider.ts +20 -0
  137. package/src/loop/services/loop-config.ts +20 -0
  138. package/src/loop/services/tool-executor.ts +11 -0
  139. package/src/loop/testing/faux-provider.ts +94 -0
  140. package/src/loop/testing/index.ts +3 -0
  141. package/src/loop/testing/test-tool-executor.ts +28 -0
  142. package/src/protocol/README.md +24 -0
  143. package/src/protocol/capability.ts +29 -0
  144. package/src/protocol/content.ts +76 -0
  145. package/src/protocol/event.ts +286 -0
  146. package/src/protocol/index.ts +109 -0
  147. package/src/protocol/message.ts +86 -0
  148. package/src/protocol/reasoning.ts +4 -0
  149. package/src/protocol/session.ts +47 -0
  150. package/src/protocol/tool.ts +154 -0
  151. package/src/protocol/usage.ts +48 -0
  152. package/src/runtime/README.md +44 -0
  153. package/src/runtime/error.ts +70 -0
  154. package/src/runtime/index.ts +43 -0
  155. package/src/runtime/run-runtime.ts +307 -0
  156. package/src/runtime/session-event-store.ts +254 -0
  157. package/src/tools/README.md +22 -0
  158. package/src/tools/index.ts +29 -0
  159. package/src/tools/question.ts +58 -0
  160. package/src/tools/registry.ts +228 -0
  161. package/src/tools/task.ts +132 -0
@@ -0,0 +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":";;;;;;;;;;AA+FA,MAAM,mBAAmB;AAQzB,MAAM,eAAe,OAAgB,QACnC,UAAU,QAAQ,OAAO,UAAU,WAAW,OAAO,yBAAyB,OAAO,GAAG,GAAG,QAAQ,KAAA;AAErG,MAAM,uBAAuB,OAAgB,QAAgB;CAC3D,MAAM,QAAQ,YAAY,OAAO,GAAG;CAEpC,OAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,IAAI,QAAQ,KAAA;AACxE;AAEA,MAAM,oBAAoB,SAAiD;CACzE,IAAI,KAAK,SAAS,QAChB;CAGF,MAAM,eAAe,oBAAoB,KAAK,QAAQ,eAAe;CACrE,MAAM,cAAc,oBAAoB,KAAK,QAAQ,aAAa;CAElE,IAAI,iBAAiB,KAAA,KAAa,gBAAgB,KAAA,GAChD;CAGF,OAAO;EACL,eAAe,YAAY,KAAK;EAChC;EACA;CACF;AACF;AAEA,MAAM,wBAAwB,UAIxB;CACJ,MAAM,WAAW,iBAAiB,MAAM,IAAI;CAE5C,OAAO,aAAa,KAAA,IAChB,KAAA,IACA,gBAAgB,KAAK;EACnB,kBAAkB,MAAM,KAAK;EAC7B,eAAe,SAAS;EACxB,cAAc,SAAS;EACvB,aAAa,SAAS;EACtB,OAAO,MAAM;EACb,aAAa,MAAM;CACrB,CAAC;AACP;AAEA,MAAM,0BAA0B,UAM1B;CACJ,MAAM,WAAW,iBAAiB,MAAM,IAAI;CAE5C,OAAO,aAAa,KAAA,IAChB,KAAA,IACA,kBAAkB,KAAK;EACrB,kBAAkB,MAAM,KAAK;EAC7B,eAAe,SAAS;EACxB,cAAc,SAAS;EACvB,aAAa,SAAS;EACtB,OAAO,MAAM;EACb,QAAQ,MAAM,OAAO,YAAY,OAAO,UAAU;EAClD,YAAY,KAAK,IAAI,GAAG,MAAM,YAAY,MAAM,WAAW;EAC3D,SAAS,eAAe,MAAM,OAAO,OAAO;EAC5C,aAAa,MAAM;CACrB,CAAC;AACP;AAEA,MAAM,yBAAyB,YAC7B,IAAI,SAAS;CACX,OAAO;CACP;CACA,WAAW;AACb,CAAC;AAEH,MAAM,mBAAmB,SAAuB,iBAC9C,OAAO,QAAQ,wBAAwB,OAAO,IAAG,SAAQ;CACvD,QAAQ,KAAK,MAAb;EACE,KAAK,QACH,OAAO,aAAa,MAAM,OACtB,OAAO,OACP,OAAO,KAAK,sBAAsB,2CAA2C,CAAC;EACpF,KAAK,SACH,OAAO,aAAa,MAAM,QACtB,OAAO,OACP,OAAO,KAAK,sBAAsB,4CAA4C,CAAC;EACrF,KAAK,SACH,OAAO,aAAa,MAAM,QACtB,OAAO,OACP,OAAO,KAAK,sBAAsB,4CAA4C,CAAC;CACvF;AACF,CAAC;AAEH,MAAM,2BAA2B,YAA0B;CACzD,QAAQ,QAAQ,MAAhB;EACE,KAAK;EACL,KAAK,cACH,OAAO,aAAa,QAAQ,OAAO;EACrC,KAAK,aACH,OAAO,QAAQ,MAAM,SAAQ,SAAS,KAAK,SAAS,SAAS,aAAa,KAAK,OAAO,IAAI,CAAC,CAAE;CACjG;AACF;AAEA,MAAM,wBACJ,QACA,aACkC;CAClC,MAAM,eAAe,OAAO;CAE5B,IAAI,iBAAiB,KAAA,GACnB,OAAO,OAAO;CAGhB,IAAI,CAAC,aAAa,SAAS,OAAO,MAAM,SAAS,GAC/C,OAAO,OAAO,KAAK,sBAAsB,uCAAuC,CAAC;CAGnF,IAAI,CAAC,aAAa,aAAa,OAAO,oBAAoB,KAAA,GACxD,OAAO,OAAO,KAAK,sBAAsB,iDAAiD,CAAC;CAG7F,OAAO,OAAO,QAAQ,WAAU,YAAW,gBAAgB,SAAS,YAAY,CAAC,EAAE,KACjF,OAAO,MACT;AACF;AAEA,MAAM,cAAc,UAA+C;CACjE,QAAQ,MAAM,MAAd;EACE,KAAK,aACH,OAAO,CAACA,aAAkB,KAAK,EAAE,MAAM,MAAM,KAAK,CAAC,CAAC;EACtD,KAAK,kBACH,OAAO,CAACC,kBAAuB,KAAK,EAAE,MAAM,MAAM,KAAK,CAAC,CAAC;EAC3D,KAAK,YACH,OAAO,CAAC,aAAa,KAAK,EAAE,MAAM,MAAM,KAAK,CAAC,CAAC;EACjD,KAAK,kBACH,OAAO,CAAC,eAAe,KAAK;GAAE,IAAI,MAAM;GAAI,MAAM,MAAM;EAAK,CAAC,CAAC;EACjE,KAAK,kBACH,OAAO,CAAC,eAAe,KAAK;GAAE,IAAI,MAAM;GAAI,OAAO,MAAM;EAAM,CAAC,CAAC;EACnE,KAAK,sBACH,OAAO,CAAC,mBAAmB,KAAK;GAAE,MAAM,MAAM;GAAM,QAAQ,MAAM;EAAO,CAAC,CAAC;EAC7E,KAAK,SACH,OAAO,CAAC,YAAY,KAAK,EAAE,OAAO,MAAM,MAAM,CAAC,CAAC;EAClD,KAAK,QACH,OAAO,CAAC;CACZ;AACF;AAEA,MAAM,cAAc,UAAiE;CACnF,QAAQ,MAAM,MAAd;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,SACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAsBA,MAAM,gBAAgB,aAAqB,YACzC,KAAK,IAAI,GAAG,KAAK,MAAM,cAAc,KAAK,KAAK,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC;AAErE,MAAM,eAAe,UAAoC,MAAM;AAE/D,MAAM,cAAc,YAClB,YAAY,IAAI,OAAO,OAAO,OAAO,MAAM,GAAG,QAAQ,QAAQ;AAEhE,MAAM,sBACJ,UACyD,OAAO,KAAK,KAAK;AAE5E,MAAM,eAAe,YACnB,OAAO,WAAW,WAAW,OAAO,CAAC,EAAE,KAAK,OAAO,cAAc,OAAO,KAAK,CAAC;AAEhF,MAAM,uBACJ,QACA,YACA,YACA,YAEA,OAAO,OACL,IAAI,KAAK,KAAK,EAAE,KACd,OAAO,KAAI,yBACT,OAAO,KACL,OAAO,UAAU,IAAI,IAAI,sBAAsB,IAAI,CAAC,GACpD,OAAO,UAAU;CACf,WAAU,UACR,OAAO,OACL,IAAI,IAAI,oBAAoB,EAAE,KAC5B,OAAO,KAAI,YAAW;EACpB,IACE,WACA,CAAC,MAAM,aACP,MAAM,UAAU,sBAChB,UAAU,WAAW,YAErB,OAAO,mBAAmB,KAAK;EAGjC,MAAM,UAAU,aAAa,WAAW,kBAAkB,OAAO;EACjE,OAAO,OAAO,KACZ,WAAW,KAAK;GACd;GACA,QAAQ,YAAY,KAAK;GACzB;GACA,SAAS,MAAM;EACjB,CAAC,CACH,EAAE,KACA,OAAO,OAAO,YAAY,OAAO,CAAC,GAClC,OAAO,OACL,oBAAoB,WAAW,GAAG,YAAY,YAAY,UAAU,CAAC,CACvE,CACF;CACF,CAAC,CACH,CACF;CACF,YAAY;CACZ,oBAAoB;AACtB,CAAC,CACH,CACF,CACF,CACF;AAEF,MAAM,2BACJ,UACA,MACA,UAEA,OAAO,OACL,OAAO,IAAI,aAAa;CACtB,MAAM,cAAc,OAAO,MAAM;CACjC,MAAM,UAAU,qBAAqB;EAAE;EAAM;EAAO;CAAY,CAAC;CACjE,MAAM,cAAyC,YAAY,KAAA,IACvD,CAAC,qBAAqB,KAAK;EAAE;EAAM,aAAa;CAAY,CAAC,CAAC,IAC9D,CAAC,qBAAqB,KAAK;EAAE;EAAM,aAAa;CAAY,CAAC,GAAG,OAAO;CAE3E,OAAO,OAAO,aAAa,WAAW,EAAE,KACtC,OAAO,OACL,OAAO,WACL,SAAS,QAAQ,IAAI,EAAE,KACrB,OAAO,SAAQ,WACb,MAAM,kBAAkB,KACtB,OAAO,KAAI,cAAa;EACtB,MAAM,YAAY,uBAAuB;GACvC;GACA;GACA;GACA;GACA;EACF,CAAC;EACD,MAAM,gBAAgB,uBAAuB,KAAK;GAChD;GACA;GACA,aAAa;EACf,CAAC;EAED,OAAO,cAAc,KAAA,IACjB,CAAC,aAAa,IACd,CAAC,eAAe,SAAS;CAC/B,CAAC,CACH,CACF,CACF,CACF,EAAE,KACA,OAAO,QAAQ,OAAO,YAAY,GAClC,OAAO,SAAS,cAAa,UAC3B,OAAO,WAAW,MAAM,iBAAiB,EAAE,KACzC,OAAO,SAAQ,cACb,OAAO,KACL,mBAAmB,KAAK;EACtB;EACA,SAAS,MAAM;EACf,MAAM,cAAc,KAAK;EACzB,aAAa;CACf,CAAC,CACH,CACF,GACA,OAAO,OAAO,OAAO,KAAK,KAAK,CAAC,CAClC,CACF,CACF,CACF,CACF;AACF,CAAC,CACH;AA2CF,MAAM,0BAA0B,eAC9B,KAAK,IAAI,GAAG,WAAW,eAAe;AAExC,MAAM,+BAA+B,WACnC,kBAAkB,KAAK;CACrB,YAAY,OAAO;CACnB,SAAS,OAAO;CAChB,SAAS,OAAO;CAChB,mBAAmB,OAAO;AAC5B,CAAC;AAEH,MAAM,cAAc,OAA+B,SACjD,MAAM,MAAK,SAAQ,KAAK,SAAS,KAAK,IAAI;AAE5C,MAAM,oBAAoB,OAA+B,SACvD,WAAW,OAAO,IAAI,GAAG,UAAU,SAAS;AAE9C,MAAM,qBAAqB,SAAmB,YAAY,KAAK;AAE/D,MAAM,qBAAqB,SAAmB,YAAY,KAAK;AAE/D,MAAM,mBAAmB,UAAgC,SACvD,SAAS,eAAe,KAAK,MAAM,SAAS,cAAc,kBAAkB,IAAI;AAElF,MAAM,mBAAmB,UAA4B,SACnD,SAAS,eAAe,KAAK,MAAM,SAAS,cAAc,kBAAkB,IAAI;AAElF,MAAM,uBAAuB,WAAwC,SACnE,UAAU,SAAQ,aAChB,SAAS,SAAS,0BAA0B,gBAAgB,UAAU,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,CAC9F,EAAE;AAEJ,MAAM,uBAAuB,WAAwC,SACnE,UAAU,SAAQ,aAChB,SAAS,SAAS,sBAAsB,gBAAgB,UAAU,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,CAC1F,EAAE;AAEJ,MAAM,uBACJ,OACA,SAEA,oBAAoB,KAAK;CACvB,WAAW,kBAAkB,IAAI;CACjC,YAAY,KAAK;CACjB;CACA,QAAQ,WAAW,OAAO,IAAI,GAAG;AACnC,CAAC;AAEH,MAAM,oBAAoB,MAAgB,aAAmC;CAC3E,MAAM,SAAS,SAAS,UAAU;CAElC,OAAO,WAAW,KAAK;EACrB,YAAY,KAAK;EACjB,SAAS,qBAAqB;EAC9B,SAAS;EACT,mBAAmB;GACjB,MAAM;GACN;GACA,QAAQ,SAAS;EACnB;CACF,CAAC;AACH;AAEA,MAAM,sBACJ,UACA,cACG;CACH,OAAO,WAAW,KAAK;EACrB,YAAY,SAAS;EACrB,SAAS,8BAA8B,UAAU,SAAS;EAC1D,SAAS,SAAS,YAAY,cAAc,OAAO,KAAA;EACnD,mBAAmB;GACjB,MAAM;GACN,SAAS,SAAS;GAClB,SAAS,SAAS,WAAW,CAAC;GAC9B,QAAQ,SAAS;GACjB,QAAQ,SAAS;EACnB;CACF,CAAC;AACH;AAEA,MAAM,6BAA6B,SACjC,WAAW,KAAK;CACd,YAAY,KAAK;CACjB,SAAS;CACT,SAAS;CACT,mBAAmB,EAAE,MAAM,mBAAmB;AAChD,CAAC;AAEH,MAAM,uBACJ,MACA,OACA,cAEA,OAAO,IAAI,aAAa;CACtB,MAAM,UAAU,OAAO,OAAO,oBAAoB,kBAAkB,EAAE,KAAK,MAAM,EAAE,KACjF,OAAO,MACT;CAEA,IAAI,QAAQ,SAAS,WACnB,OAAO;EACL,MAAM;EACN;EACA;EACA,QAAQ,0BAA0B,IAAI;EACtC,QAAQ,CAAC;CACX;CAGF,MAAM,WAAW,oBAAoB,WAAW,IAAI;CAEpD,IAAI,aAAa,KAAA,GACf,OAAO;EACL,MAAM;EACN;EACA;EACA,QAAQ,mBAAmB,UAAU,QAAQ,QAAQ,SAAS;EAC9D,QAAQ,CACN,SAAS,YAAY,aACjB,iBAAiB,KAAK,EAAE,SAAS,CAAC,IAClC,kBAAkB,KAAK,EAAE,SAAS,CAAC,CACzC;CACF;CAGF,MAAM,UAAU,gBAAgB,KAAK;EACnC,WAAW,kBAAkB,IAAI;EACjC,YAAY,KAAK;EACjB;EACA,WAAW,QAAQ,QAAQ;CAC7B,CAAC;CAED,OAAO;EACL,MAAM;EACN;EACA,QAAQ,CAAC,kBAAkB,KAAK,EAAE,QAAQ,CAAC,CAAC;CAC9C;AACF,CAAC;AAEH,MAAM,uBACJ,OACA,MACA,OACA,cACqB;CACrB,IAAI,CAAC,iBAAiB,OAAO,IAAI,GAC/B,OAAO;EAAE,MAAM;EAAW;EAAO;EAAM,QAAQ,CAAC;CAAE;CAGpD,MAAM,UAAU,oBAAoB,OAAO,IAAI;CAC/C,MAAM,WAAW,oBAAoB,WAAW,IAAI;CAEpD,IAAI,aAAa,KAAA,GACf,OAAO;EACL,MAAM;EACN;EACA,QAAQ,CAAC,sBAAsB,KAAK;GAAE;GAAM;EAAQ,CAAC,CAAC;CACxD;CAGF,IAAI,SAAS,aAAa,UACxB,OAAO;EACL,MAAM;EACN;EACA;EACA,QAAQ,iBAAiB,MAAM,QAAQ;EACvC,QAAQ,CAAC,mBAAmB,KAAK;GAAE,YAAY,KAAK;GAAI,QAAQ,SAAS,UAAU;GAAkB;EAAS,CAAC,CAAC;CAClH;CAGF,OAAO;EACL,MAAM;EACN;EACA;EACA,QAAQ,CAAC,oBAAoB,KAAK;GAAE,YAAY,KAAK;GAAI;EAAS,CAAC,CAAC;CACtE;AACF;AAEA,MAAM,mBAAmB,UAMvB,MAAM,KAAK,SAAS,mBAChB,oBAAoB,MAAM,MAAM,MAAM,OAAO,MAAM,SAAS,IAC5D,OAAO,QAAQ,oBAAoB,MAAM,OAAO,MAAM,MAAM,MAAM,OAAO,MAAM,SAAS,CAAC;AAE/F,MAAM,oBAAoB,UAKxB,OAAO,IAAI,aAAa;CACtB,MAAM,WAAW,OAAO,OAAO,QAAQ,MAAM,QAAQ,MAAM,UACzD,gBAAgB;EAAE,OAAO,MAAM;EAAO,WAAW,MAAM;EAAW;EAAM;CAAM,CAAC,CACjF;CAEA,OAAO;EACL,gBAAgB,SAAS,SAAQ,SAC/B,KAAK,SAAS,YAAY,CAAC;GAAE,OAAO,KAAK;GAAO,MAAM,KAAK;EAAK,CAAC,IAAI,CAAC,CACxE;EACA,gBAAgB,SAAS,SAAQ,SAC/B,KAAK,SAAS,WACV,CAAC;GAAE,OAAO,KAAK;GAAO,SAAS,4BAA4B,KAAK,MAAM;EAAE,CAAC,IACzE,CAAC,CACP;EACA,cAAc,8BAA8B,QAAQ;EACpD,QAAQ,SAAS,SAAQ,SAAS,KAAK,SAAS,YAAY,CAAC,IAAI,KAAK,MAAO;EAC7E,iBAAiB,SAAS,SAAQ,SAAS,KAAK,SAAS,YAAY,CAAC,KAAK,OAAO,IAAI,CAAC,CAAE;EACzF,eAAe,SAAS,SAAQ,SAAS,KAAK,SAAS,YAAY,KAAK,SAAS,CAAC,CAAE;CACtF;AACF,CAAC;AAEH,MAAM,6BAA6B,YACjC,CAAC,GAAG,OAAO,EAAE,MAAM,MAAM,UAAU,KAAK,QAAQ,MAAM,KAAK,EAAE,KAAI,WAAU,OAAO,OAAO;AAE3F,MAAM,iCACJ,aAEA,SAAS,SAAQ,SACf,KAAK,SAAS,WACV,CAAC,uBAAuB,KAAK;CAAE,MAAM,KAAK;CAAM,QAAQ,KAAK;AAAO,CAAC,CAAC,IACtE,CAAC,CACP;AAEF,MAAM,iBAAiB,aACrB,IAAI,IAAI,SAAS,SAAQ,YAAY,QAAQ,SAAS,eAAe,CAAC,QAAQ,UAAU,IAAI,CAAC,CAAE,CAAC;AAElG,MAAM,wBAAwB,aAA0C;CACtE,MAAM,YAAY,cAAc,QAAQ;CAExC,OAAO,SAAS,SAAQ,YACtB,QAAQ,SAAS,cACb,uBAAuB,OAAO,EAAE,QAAO,SAAQ,CAAC,UAAU,IAAI,KAAK,EAAE,CAAC,IACtE,CAAC,CACP;AACF;AAEA,MAAM,wBACJ,aACqC;CACrC,MAAM,QAAQ,SAAS;CAEvB,OAAO,UAAU,KAAA,IAAY,KAAA,IAAY,CAAC,OAAO,GAAG,SAAS,MAAM,CAAC,CAAC;AACvE;AAEA,MAAM,+BAA+B,UAOnC,OAAO,SACL,MAAM,MAAM,KAAK,EAAE,MAAM,YACvB,wBAAwB,MAAM,UAAU,MAAM,MAAM,KAAK,EAAE,KACzD,OAAO,KAAI,UAAS;CAClB,IAAI,MAAM,SAAS,0BACjB,OAAO,OAAO;CAGhB,OAAO,IAAI,OAAO,MAAM,UAAS,YAAW,CAC1C,GAAG,SACH;EAAE;EAAO,SAAS,4BAA4B,MAAM,MAAM;CAAE,CAC9D,CAAC;AACH,CAAC,CACH,CACF,GACA,EAAE,aAAa,uBAAuB,MAAM,UAAU,EAAE,CAC1D;AAEF,MAAM,iBAAiB,UAAqC;CAC1D,QAAQ,MAAM,OAAd;EACE,KAAK;EACL,KAAK,iBACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK;EACL,KAAK,UACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,eACH,OAAO;CACX;AACF;AAOA,MAAM,0BACJ,WAC4C;CAC5C,MAAM,aAAa,OAAO,QAAO,UAAS,MAAM,SAAS,MAAM;CAC/D,MAAM,YAAY,iBAAiB,MAAM;CACzC,MAAM,aAA2C,UAAU,WAAW,IAAI,SAAS;CAEnF,IAAI,WAAW,WAAW,GACxB,OAAO,OAAO,KACZ,IAAI,SAAS;EACX,OAAO;EACP,SAAS,iDAAiD,WAAW;EACrE,WAAW;CACb,CAAC,CACH;CAGF,MAAM,YAAY,WAAW;CAE7B,IAAI,cAAc,KAAA,KAAa,UAAU,eAAe,YACtD,OAAO,OAAO,KACZ,IAAI,SAAS;EACX,OAAO;EACP,SAAS,2BAA2B;EACpC,WAAW;CACb,CAAC,CACH;CAGF,OAAO,OAAO,QAAQ;EAAE;EAAW;CAAW,CAAC;AACjD;AAEA,MAAM,sBACJ,OACA,iBAEA,OAAO,OACL,OAAO,IAAI,aAAa;CACtB,MAAM,YAAY,OAAO,IAAI,IAAI,YAAY;CAC7C,MAAM,aAAa,OAAO,uBAAuB,SAAS;CAC1D,MAAM,mBAAmB,2BAA2B,SAAS;CAC7D,MAAM,gBAA2C,CAC/C,aAAa,KAAK,EAAE,MAAM,MAAM,KAAK,CAAC,GACtC,sBAAsB,KAAK,EAAE,SAAS,iBAAiB,CAAC,CAC1D;CAEA,OAAO,IAAI,OAAO,MAAM,kBAAiB,aAAY,CAAC,GAAG,UAAU,gBAAgB,CAAC;CAEpF,IAAI,WAAW,UAAU,WAAW,GAAG;EACrC,MAAM,WAAW,OAAO,IAAI,IAAI,MAAM,eAAe;EACrD,MAAM,QAAQ,OAAO,IAAI,IAAI,MAAM,KAAK;EAExC,OAAO,OAAO,aAAa;GACzB,GAAG;GACH,QAAQ,KAAK;IAAE,MAAM,MAAM;IAAM,QAAQ,WAAW;GAAW,CAAC;GAChE,SAAS,KAAK;IACZ;IACA,OAAO,MAAM;IACb;GACF,CAAC;EACH,CAAC;CACH;CAEA,MAAM,qBAAqB,OAAO,IAAI,KAA8C,CAAC,CAAC;CACtF,MAAM,WAAW,OAAO,iBAAiB;EACvC,OAAO,MAAM,OAAO;EACpB,WAAW,MAAM,OAAO,iBAAiB,CAAC;EAC1C,OAAO,WAAW;CACpB,CAAC;CAED,IAAI,SAAS,eAAe,SAAS,GACnC,OAAO,IAAI,OAAO,qBAAoB,YAAW,CAAC,GAAG,SAAS,GAAG,SAAS,cAAc,CAAC;CAG3F,IAAI,SAAS,gBAAgB,SAAS,GAAG;EACvC,MAAM,kBAAkB,qBAAqB,SAAS,eAAe;EAErE,IAAI,oBAAoB,KAAA,GACtB,OAAO,OAAO;EAGhB,MAAM,eAAe,0BAA0B,OAAO,IAAI,IAAI,kBAAkB,CAAC;EACjF,IAAI,aAAa,SAAS,GACxB,OAAO,IAAI,OAAO,MAAM,kBAAiB,aAAY,CAAC,GAAG,UAAU,GAAG,YAAY,CAAC;EAGrF,MAAM,WAAW,OAAO,IAAI,IAAI,MAAM,eAAe;EACrD,MAAM,QAAQ,OAAO,IAAI,IAAI,MAAM,KAAK;EAExC,OAAO,OAAO,aAAa;GACzB,GAAG;GACH,GAAG,SAAS;GACZ,GAAG,SAAS;GACZ,QAAQ,KAAK;IAAE,MAAM,MAAM;IAAM,QAAQ,WAAW;GAAW,CAAC;GAChE,mBAAmB,KAAK;IACtB,UAAU;IACV;IACA,OAAO,MAAM;IACb;GACF,CAAC;EACH,CAAC;CACH;CAEA,MAAM,sBAAsB,4BAA4B;EACtD,OAAO,SAAS;EAChB,UAAU,MAAM;EAChB,YAAY,MAAM;EAClB,OAAO,MAAM,OAAO;EACpB,SAAS;CACX,CAAC;CACD,MAAM,iBAAiB,OAAO,OAC5B,IAAI,IAAI,kBAAkB,EAAE,KAC1B,OAAO,SAAQ,YAAW;EACxB,MAAM,iBAAiB,0BAA0B,OAAO;EAExD,OAAO,IAAI,OAAO,MAAM,kBAAiB,aAAY,CAAC,GAAG,UAAU,GAAG,cAAc,CAAC,EAAE,KACrF,OAAO,GACL,OAAO,KAAK,QAAQ,KAAK;GAAE,MAAM,MAAM;GAAM,QAAQ,WAAW;EAAW,CAAC,CAAC,EAAE,KAC7E,OAAO,OACL,eAAe;GACb,GAAG;GACH,iBAAiB;IAAC,GAAG,MAAM;IAAiB;IAAkB,GAAG;GAAc;GAC/E,MAAM,MAAM,OAAO;EACrB,CAAC,CACH,CACF,CACF,CACF;CACF,CAAC,CACH,CACF;CAEA,OAAO,OAAO,aAAa,aAAa,EAAE,KACxC,OAAO,OAAO,OAAO,aAAa,SAAS,MAAM,CAAC,GAClD,OAAO,OAAO,mBAAmB,GACjC,OAAO,OAAO,cAAc,CAC9B;AACF,CAAC,CACH;AAEF,MAAM,+BACJ,OACA,iBAEA,OAAO,OACL,OAAO,IAAI,aAAa;CACtB,MAAM,YAAY,OAAO,IAAI,IAAI,YAAY;CAC7C,MAAM,aAAa,OAAO,uBAAuB,SAAS;CAC1D,MAAM,mBAAmB,2BAA2B,SAAS;CAE7D,OAAO,IAAI,OAAO,MAAM,kBAAiB,aAAY,CAAC,GAAG,UAAU,gBAAgB,CAAC;CAEpF,OAAO,OAAO,aAAa;EACzB,aAAa,KAAK,EAAE,MAAM,MAAM,KAAK,CAAC;EACtC,sBAAsB,KAAK,EAAE,SAAS,iBAAiB,CAAC;EACxD,QAAQ,KAAK;GAAE,MAAM,MAAM;GAAM,QAAQ,WAAW;EAAW,CAAC;CAClE,CAAC;AACH,CAAC,CACH;AAEF,MAAM,iBACJ,OACA,WACA,WAC8C;CAC9C,MAAM,mBACJ,MAAM,SAAS,OAAO;EACpB,UAAU,OAAO;EACjB,OAAO,MAAM,OAAO;EACpB,OAAO,MAAM,OAAO;EACpB,iBAAiB,MAAM,OAAO;EAC9B,cAAc,MAAM,OAAO;CAC7B,CAAC;CAEH,OAAO,OAAO,aAAa,OAAO,MAAM,EACrC,KAAK,OAAO,OAAO,oBAAoB,WAAW,GAAG,MAAM,YAAY,YAAY,CAAC,CAAC,CAAC,EACtF,KACC,OAAO,KAAI,UAAS;EAClB,IAAI,CAAC,WAAW,KAAK,GACnB,OAAO,OAAO;EAGhB,MAAM,cAAc,IAAI,OAAO,YAAW,WAAU,CAAC,GAAG,QAAQ,KAAK,CAAC;EAEtE,IAAI,MAAM,SAAS,SACjB,OAAO;EAGT,OAAO,IAAI,OAAO,MAAM,QAAO,UAAS,cAAc,OAAO,MAAM,KAAK,CAAC,EAAE,KACzE,OAAO,cAAc,WAAW,CAClC;CACF,CAAC,GACD,OAAO,SAAQ,UACb,MAAM,SAAS,eACX,OAAO,KAAK,KAAK,IACjB,WAAW,KAAK,IACd,OAAO,aAAa,WAAW,KAAK,CAAC,IACrC,OAAO,KAAK,KAAK,CACzB,GACA,OAAO,OAAO,mBAAmB,OAAO,SAAS,CAAC,CACpD;AACJ;AAEA,MAAM,0BACJ,OACA,WACA,WAC8C;CAC9C,MAAM,mBACJ,MAAM,SAAS,OAAO;EACpB,UAAU,OAAO;EACjB,OAAO,MAAM,OAAO;EACpB,OAAO,MAAM,OAAO;EACpB,iBAAiB,MAAM,OAAO;EAC9B,cAAc,MAAM,OAAO;CAC7B,CAAC;CAEH,OAAO,OAAO,aAAa,OAAO,MAAM,EACrC,KAAK,OAAO,OAAO,oBAAoB,WAAW,GAAG,MAAM,YAAY,YAAY,CAAC,CAAC,CAAC,EACtF,KACC,OAAO,KAAI,UAAS;EAClB,IAAI,CAAC,WAAW,KAAK,GACnB,OAAO,OAAO;EAGhB,MAAM,cAAc,IAAI,OAAO,YAAW,WAAU,CAAC,GAAG,QAAQ,KAAK,CAAC;EAEtE,IAAI,MAAM,SAAS,SACjB,OAAO;EAGT,OAAO,IAAI,OAAO,MAAM,QAAO,UAAS,cAAc,OAAO,MAAM,KAAK,CAAC,EAAE,KACzE,OAAO,cAAc,WAAW,CAClC;CACF,CAAC,GACD,OAAO,SAAQ,UACb,MAAM,SAAS,eACX,OAAO,KAAK,KAAK,IACjB,WAAW,KAAK,IACd,OAAO,aAAa,WAAW,KAAK,CAAC,IACrC,OAAO,KAAK,KAAK,CACzB,GACA,OAAO,OAAO,4BAA4B,OAAO,SAAS,CAAC,CAC7D;AACJ;AAEA,MAAM,kBAAkB,UACtB,OAAO,cAAc;CACnB,IAAI,MAAM,OAAO,MAAM,WAAW,UAChC,OAAO,OAAO,KAAK,IAAI,WAAW,EAAE,QAAQ,YAAY,CAAC,CAAC;CAG5D,MAAM,YAAY,OAAO,OACvB,OAAO,IAAI,aAAa;EACtB,MAAM,YAAY,OAAO,IAAI,KAA8B,CAAC,CAAC;EAC7D,MAAM,SAAS,OAAO,MAAM,mBAAmB,UAAU,MAAM,eAAe;EAC9E,OAAO,qBAAqB,MAAM,QAAQ,OAAO,QAAQ;EAEzD,OAAO,cAAc,OAAO,WAAW,MAAM;CAC/C,CAAC,CACH;CAEA,OAAO,OAAO,aAAa,CACzB,UAAU,KAAK,EAAE,MAAM,MAAM,KAAK,CAAC,GACnC,eAAe,KAAK,EAAE,MAAM,MAAM,KAAK,CAAC,CAC1C,CAAC,EAAE,KAAK,OAAO,OAAO,SAAS,CAAC;AAClC,CAAC;AAEH,MAAM,+BAA+B,UACnC,OAAO,OACL,OAAO,IAAI,aAAa;CACtB,MAAM,eAAe,qBAAqB,MAAM,eAAe;CAE/D,IAAI,aAAa,WAAW,MAAM,MAAM,OAAO,iBAAiB,CAAC,GAAG,WAAW,GAC7E,OAAO,eAAe,KAAK;CAG7B,MAAM,qBAAqB,OAAO,IAAI,KAA8C,CAAC,CAAC;CACtF,MAAM,WAAW,OAAO,iBAAiB;EACvC,OAAO,MAAM,OAAO;EACpB,WAAW,MAAM,OAAO,iBAAiB,CAAC;EAC1C,OAAO;CACT,CAAC;CAED,IAAI,SAAS,eAAe,SAAS,GACnC,OAAO,IAAI,OAAO,qBAAoB,YAAW,CAAC,GAAG,SAAS,GAAG,SAAS,cAAc,CAAC;CAG3F,IAAI,SAAS,gBAAgB,SAAS,GAAG;EACvC,MAAM,kBAAkB,qBAAqB,SAAS,eAAe;EAErE,IAAI,oBAAoB,KAAA,GACtB,OAAO,OAAO;EAGhB,MAAM,eAAe,0BAA0B,OAAO,IAAI,IAAI,kBAAkB,CAAC;EACjF,IAAI,aAAa,SAAS,GACxB,OAAO,IAAI,OAAO,MAAM,kBAAiB,aAAY,CAAC,GAAG,UAAU,GAAG,YAAY,CAAC;EAGrF,MAAM,WAAW,OAAO,IAAI,IAAI,MAAM,eAAe;EACrD,MAAM,QAAQ,OAAO,IAAI,IAAI,MAAM,KAAK;EAExC,OAAO,OAAO,aAAa;GACzB,GAAG,SAAS;GACZ,GAAG,SAAS;GACZ,mBAAmB,KAAK;IACtB,UAAU;IACV;IACA,OAAO,KAAK,IAAI,GAAG,MAAM,OAAO,CAAC;IACjC;GACF,CAAC;EACH,CAAC;CACH;CAEA,MAAM,sBAAsB,4BAA4B;EACtD,OAAO,SAAS;EAChB,UAAU,MAAM;EAChB,YAAY,MAAM;EAClB,OAAO,MAAM,OAAO;EACpB,SAAS;CACX,CAAC;CACD,MAAM,iBAAiB,OAAO,OAC5B,IAAI,IAAI,kBAAkB,EAAE,KAC1B,OAAO,SAAQ,YAAW;EACxB,MAAM,iBAAiB,0BAA0B,OAAO;EAExD,OAAO,IAAI,OAAO,MAAM,kBAAiB,aAAY,CAAC,GAAG,UAAU,GAAG,cAAc,CAAC,EAAE,KACrF,OAAO,GACL,eAAe;GACb,GAAG;GACH,iBAAiB,CAAC,GAAG,MAAM,iBAAiB,GAAG,cAAc;EAC/D,CAAC,CACH,CACF;CACF,CAAC,CACH,CACF;CAEA,OAAO,OAAO,aAAa,SAAS,MAAM,EAAE,KAC1C,OAAO,OAAO,mBAAmB,GACjC,OAAO,OAAO,cAAc,CAC9B;AACF,CAAC,CACH;AAEF,MAAM,0BAAuD,EAC3D,UAAS,SACP,OAAO,KACL,IAAI,UAAU;CACZ,MAAM,KAAK;CACX,SAAS;CACT,OAAO;AACT,CAAC,CACH,EACJ;AAEA,MAAM,2BACJ,UAEA,OAAO,cAAc;CACnB,IAAI,MAAM,OAAO,MAAM,WAAW,UAChC,OAAO,OAAO,KAAK,IAAI,WAAW,EAAE,QAAQ,YAAY,CAAC,CAAC;CAG5D,MAAM,YAAY,OAAO,OACvB,OAAO,IAAI,aAAa;EACtB,MAAM,YAAY,OAAO,IAAI,KAA8B,CAAC,CAAC;EAC7D,MAAM,SAAS,OAAO,MAAM,mBAAmB,UAAU,MAAM,eAAe;EAC9E,OAAO,qBAAqB,MAAM,QAAQ,OAAO,QAAQ;EAEzD,OAAO,uBAAuB,OAAO,WAAW,MAAM;CACxD,CAAC,CACH;CAEA,OAAO,OAAO,aAAa,CACzB,UAAU,KAAK,EAAE,MAAM,MAAM,KAAK,CAAC,GACnC,eAAe,KAAK,EAAE,MAAM,MAAM,KAAK,CAAC,CAC1C,CAAC,EAAE,KAAK,OAAO,OAAO,SAAS,CAAC;AAClC,CAAC;AAEH,MAAa,gBACX,WAEA,OAAO,OACL,OAAO,IAAI,aAAa;CACtB,MAAM,qBAAqB,OAAO;CAClC,MAAM,aAAa,OAAO;CAC1B,MAAM,WAAW,OAAO;CACxB,MAAM,kBAAkB,OAAO,IAAI,KAAkC,CAAC,CAAC;CACvE,MAAM,QAAQ,OAAO,IAAI,KAAK,cAAc;CAE5C,OAAO,wBAAwB;EAC7B;EACA;EACA;EACA;EACA,UAAU;EACV,iBAAiB,OAAO;EACxB;EACA;EACA,MAAM,OAAO;CACf,CAAC;AACH,CAAC,CACH;AAEF,MAAa,gBACX,WAEA,OAAO,OACL,OAAO,IAAI,aAAa;CACtB,MAAM,WAAW,OAAO;CACxB,MAAM,aAAa,OAAO;CAC1B,MAAM,qBAAqB,OAAO,IAAI,KAA8C,CAAC,CAAC;CACtF,MAAM,WAAW,OAAO,iBAAiB;EACvC,OAAO,OAAO,SAAS,CAAC;EACxB,WAAW,OAAO,iBAAiB,CAAC;EACpC,OAAO,OAAO;CAChB,CAAC;CACD,MAAM,qBAAqB,SAAS,gBAAgB,SAAS;CAC7D,MAAM,eAAe,qBAAqB,CAAC,IAAI,SAAS;CACxD,MAAM,kBAAkB,qBAAqB,SAAS,eAAe;CACrE,MAAM,iBAA4C,oBAAoB,KAAA,IAClE,CAAC,IACD,CACE,mBAAmB,KAAK;EACtB,UAAU;EACV,UAAU,OAAO,mBAAmB,CAAC;EACrC,OAAO,OAAO,QAAQ;EACtB,OAAO,OAAO,SAAS;CACzB,CAAC,CACH;CAEJ,OAAO,OAAO,aAAa;EACzB,GAAG,SAAS;EACZ,GAAG;EACH,GAAG,SAAS;EACZ,GAAG;CACL,CAAC,EAAE,KACD,OAAO,OACL,4BAA4B;EAC1B,OAAO,qBAAqB,CAAC,IAAI,SAAS;EAC1C;EACA;EACA,OAAO,OAAO,SAAS;EACvB,SAAS;CACX,CAAC,CACH,CACF;AACF,CAAC,CACH;AAEF,MAAa,OACX,WAMA,OAAO,OACL,OAAO,IAAI,aAAa;CACtB,MAAM,qBAAqB,OAAO;CAClC,MAAM,aAAa,OAAO;CAC1B,MAAM,WAAW,OAAO;CACxB,MAAM,WAAW,OAAO;CACxB,MAAM,kBAAkB,OAAO,IAAI,KAAkC,CAAC,CAAC;CACvE,MAAM,QAAQ,OAAO,IAAI,KAAK,cAAc;CAE5C,OAAO,OAAO,KAAK,WAAW,KAAK,CAAC,CAAC,CAAC,EAAE,KACtC,OAAO,OACL,4BAA4B;EAC1B;EACA;EACA;EACA;EACA;EACA,iBAAiB,OAAO;EACxB;EACA;EACA,MAAM;CACR,CAAC,CACH,CACF;AACF,CAAC,CACH"}
@@ -0,0 +1,18 @@
1
+ import { ContextTransformError } from "../error.mjs";
2
+ import { Context, Effect, Layer } from "effect";
3
+ import { AgentEvent, AgentMessage } from "@yolk-sdk/agent/protocol";
4
+
5
+ //#region src/loop/services/context-transformer.d.ts
6
+ type ContextTransformResult = {
7
+ readonly messages: ReadonlyArray<AgentMessage>;
8
+ readonly events: ReadonlyArray<AgentEvent>;
9
+ };
10
+ declare const ContextTransformer_base: Context.ServiceClass<ContextTransformer, "@yolk-sdk/agent/loop/ContextTransformer", {
11
+ readonly transform: (messages: ReadonlyArray<AgentMessage>) => Effect.Effect<ContextTransformResult, ContextTransformError>;
12
+ }>;
13
+ declare class ContextTransformer extends ContextTransformer_base {
14
+ static identity: Layer.Layer<ContextTransformer, never, never>;
15
+ }
16
+ //#endregion
17
+ export { ContextTransformResult, ContextTransformer };
18
+ //# sourceMappingURL=context-transformer.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-transformer.d.mts","names":[],"sources":["../../../src/loop/services/context-transformer.ts"],"mappings":";;;;;KAIY,sBAAA;EAAA,SACD,QAAA,EAAU,aAAA,CAAc,YAAA;EAAA,SACxB,MAAA,EAAQ,aAAA,CAAc,UAAA;AAAA;AAAA,cAChC,uBAAA;uBAMK,QAAA,EAAU,aAAA,CAAc,YAAA,MACrB,MAAA,CAAO,MAAA,CAAO,sBAAA,EAAwB,qBAAA;AAAA;AAAA,cALlC,kBAAA,SAA2B,uBAAA;EAAA,OAQ/B,QAAA,EAAQ,KAAA,CAAA,KAAA,CAAA,kBAAA;AAAA"}
@@ -0,0 +1,12 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ //#region src/loop/services/context-transformer.ts
3
+ var ContextTransformer = class extends Context.Service()("@yolk-sdk/agent/loop/ContextTransformer") {
4
+ static identity = Layer.succeed(this, this.of({ transform: (messages) => Effect.succeed({
5
+ messages,
6
+ events: []
7
+ }) }));
8
+ };
9
+ //#endregion
10
+ export { ContextTransformer };
11
+
12
+ //# sourceMappingURL=context-transformer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-transformer.mjs","names":[],"sources":["../../../src/loop/services/context-transformer.ts"],"sourcesContent":["import { Context, Effect, Layer } from 'effect'\nimport type { AgentEvent, AgentMessage } from '@yolk-sdk/agent/protocol'\nimport type { ContextTransformError } from '../error.ts'\n\nexport type ContextTransformResult = {\n readonly messages: ReadonlyArray<AgentMessage>\n readonly events: ReadonlyArray<AgentEvent>\n}\n\nexport class ContextTransformer extends Context.Service<\n ContextTransformer,\n {\n readonly transform: (\n messages: ReadonlyArray<AgentMessage>\n ) => Effect.Effect<ContextTransformResult, ContextTransformError>\n }\n>()('@yolk-sdk/agent/loop/ContextTransformer') {\n static identity = Layer.succeed(\n this,\n this.of({\n transform: messages => Effect.succeed({ messages, events: [] })\n })\n )\n}\n"],"mappings":";;AASA,IAAa,qBAAb,cAAwC,QAAQ,QAO9C,EAAE,yCAAyC,EAAE;CAC7C,OAAO,WAAW,MAAM,QACtB,MACA,KAAK,GAAG,EACN,YAAW,aAAY,OAAO,QAAQ;EAAE;EAAU,QAAQ,CAAC;CAAE,CAAC,EAChE,CAAC,CACH;AACF"}
@@ -0,0 +1,20 @@
1
+ import { LLMEvent } from "../llm-event.mjs";
2
+ import { LLMProviderError } from "../error.mjs";
3
+ import { Context, Stream } from "effect";
4
+ import { AgentMessage, AgentReasoningEffort, ToolDef } from "@yolk-sdk/agent/protocol";
5
+
6
+ //#region src/loop/services/llm-provider.d.ts
7
+ type LLMRequest = {
8
+ readonly messages: ReadonlyArray<AgentMessage>;
9
+ readonly tools: ReadonlyArray<ToolDef>;
10
+ readonly model: string;
11
+ readonly systemPrompt: string;
12
+ readonly reasoningEffort?: AgentReasoningEffort;
13
+ };
14
+ declare const LLMProvider_base: Context.ServiceClass<LLMProvider, "@yolk-sdk/agent/loop/LLMProvider", {
15
+ readonly stream: (request: LLMRequest) => Stream.Stream<LLMEvent, LLMProviderError>;
16
+ }>;
17
+ declare class LLMProvider extends LLMProvider_base {}
18
+ //#endregion
19
+ export { LLMProvider, LLMRequest };
20
+ //# sourceMappingURL=llm-provider.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-provider.d.mts","names":[],"sources":["../../../src/loop/services/llm-provider.ts"],"mappings":";;;;;;KAMY,UAAA;EAAA,SACD,QAAA,EAAU,aAAA,CAAc,YAAA;EAAA,SACxB,KAAA,EAAO,aAAA,CAAc,OAAA;EAAA,SACrB,KAAA;EAAA,SACA,YAAA;EAAA,SACA,eAAA,GAAkB,oBAAA;AAAA;AAAA,cAC5B,gBAAA;oBAKqB,OAAA,EAAS,UAAA,KAAe,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,gBAAA;AAAA;AAAA,cAHzD,WAAA,SAAoB,gBAKM"}
@@ -0,0 +1,7 @@
1
+ import { Context } from "effect";
2
+ //#region src/loop/services/llm-provider.ts
3
+ var LLMProvider = class extends Context.Service()("@yolk-sdk/agent/loop/LLMProvider") {};
4
+ //#endregion
5
+ export { LLMProvider };
6
+
7
+ //# sourceMappingURL=llm-provider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-provider.mjs","names":[],"sources":["../../../src/loop/services/llm-provider.ts"],"sourcesContent":["import { Context } from 'effect'\nimport type { Stream } from 'effect'\nimport type { AgentMessage, AgentReasoningEffort, ToolDef } from '@yolk-sdk/agent/protocol'\nimport type { LLMProviderError } from '../error.ts'\nimport type { LLMEvent } from '../llm-event.ts'\n\nexport type LLMRequest = {\n readonly messages: ReadonlyArray<AgentMessage>\n readonly tools: ReadonlyArray<ToolDef>\n readonly model: string\n readonly systemPrompt: string\n readonly reasoningEffort?: AgentReasoningEffort\n}\n\nexport class LLMProvider extends Context.Service<\n LLMProvider,\n {\n readonly stream: (request: LLMRequest) => Stream.Stream<LLMEvent, LLMProviderError>\n }\n>()('@yolk-sdk/agent/loop/LLMProvider') {}\n"],"mappings":";;AAcA,IAAa,cAAb,cAAiC,QAAQ,QAKvC,EAAE,kCAAkC,EAAE,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { Context, Layer } from "effect";
2
+
3
+ //#region src/loop/services/loop-config.d.ts
4
+ type LoopConfigShape = {
5
+ readonly maxTurns: number;
6
+ readonly maxRetries: number;
7
+ readonly retryBaseDelayMs: number;
8
+ readonly toolConcurrency: number;
9
+ };
10
+ declare const LoopConfig_base: Context.ServiceClass<LoopConfig, "@yolk-sdk/agent/loop/LoopConfig", LoopConfigShape>;
11
+ declare class LoopConfig extends LoopConfig_base {
12
+ static layer: (config: LoopConfigShape) => Layer.Layer<LoopConfig, never, never>;
13
+ static defaultLayer: Layer.Layer<LoopConfig, never, never>;
14
+ }
15
+ //#endregion
16
+ export { LoopConfig, LoopConfigShape };
17
+ //# sourceMappingURL=loop-config.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-config.d.mts","names":[],"sources":["../../../src/loop/services/loop-config.ts"],"mappings":";;;KAEY,eAAA;EAAA,SACD,QAAA;EAAA,SACA,UAAA;EAAA,SACA,gBAAA;EAAA,SACA,eAAA;AAAA;AAAA,cACV,eAAA;cAEY,UAAA,SAAmB,eAAA;EAAA,OAGvB,KAAA,GAAS,MAAA,EAAQ,eAAA,KAAe,KAAA,CAAA,KAAA,CAAA,UAAA;EAAA,OAChC,YAAA,EAAY,KAAA,CAAA,KAAA,CAAA,UAAA;AAAA"}
@@ -0,0 +1,15 @@
1
+ import { Context, Layer } from "effect";
2
+ //#region src/loop/services/loop-config.ts
3
+ var LoopConfig = class extends Context.Service()("@yolk-sdk/agent/loop/LoopConfig") {
4
+ static layer = (config) => Layer.succeed(this, config);
5
+ static defaultLayer = this.layer({
6
+ maxTurns: 500,
7
+ maxRetries: 2,
8
+ retryBaseDelayMs: 1e3,
9
+ toolConcurrency: 4
10
+ });
11
+ };
12
+ //#endregion
13
+ export { LoopConfig };
14
+
15
+ //# sourceMappingURL=loop-config.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-config.mjs","names":[],"sources":["../../../src/loop/services/loop-config.ts"],"sourcesContent":["import { Context, Layer } from 'effect'\n\nexport type LoopConfigShape = {\n readonly maxTurns: number\n readonly maxRetries: number\n readonly retryBaseDelayMs: number\n readonly toolConcurrency: number\n}\n\nexport class LoopConfig extends Context.Service<LoopConfig, LoopConfigShape>()(\n '@yolk-sdk/agent/loop/LoopConfig'\n) {\n static layer = (config: LoopConfigShape) => Layer.succeed(this, config)\n static defaultLayer = this.layer({\n maxTurns: 500,\n maxRetries: 2,\n retryBaseDelayMs: 1000,\n toolConcurrency: 4\n })\n}\n"],"mappings":";;AASA,IAAa,aAAb,cAAgC,QAAQ,QAAqC,EAC3E,iCACF,EAAE;CACA,OAAO,SAAS,WAA4B,MAAM,QAAQ,MAAM,MAAM;CACtE,OAAO,eAAe,KAAK,MAAM;EAC/B,UAAU;EACV,YAAY;EACZ,kBAAkB;EAClB,iBAAiB;CACnB,CAAC;AACH"}
@@ -0,0 +1,12 @@
1
+ import { ToolError } from "../error.mjs";
2
+ import { Context, Effect } from "effect";
3
+ import { ToolCall, ToolResult } from "@yolk-sdk/agent/protocol";
4
+
5
+ //#region src/loop/services/tool-executor.d.ts
6
+ declare const ToolExecutor_base: Context.ServiceClass<ToolExecutor, "@yolk-sdk/agent/loop/ToolExecutor", {
7
+ readonly execute: (call: ToolCall) => Effect.Effect<ToolResult, ToolError>;
8
+ }>;
9
+ declare class ToolExecutor extends ToolExecutor_base {}
10
+ //#endregion
11
+ export { ToolExecutor };
12
+ //# sourceMappingURL=tool-executor.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-executor.d.mts","names":[],"sources":["../../../src/loop/services/tool-executor.ts"],"mappings":";;;;;cAG4C,iBAAA;qBAKrB,IAAA,EAAM,QAAA,KAAa,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,SAAA;AAAA;AAAA,cAHvD,YAAA,SAAqB,iBAKM"}
@@ -0,0 +1,7 @@
1
+ import { Context } from "effect";
2
+ //#region src/loop/services/tool-executor.ts
3
+ var ToolExecutor = class extends Context.Service()("@yolk-sdk/agent/loop/ToolExecutor") {};
4
+ //#endregion
5
+ export { ToolExecutor };
6
+
7
+ //# sourceMappingURL=tool-executor.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-executor.mjs","names":[],"sources":["../../../src/loop/services/tool-executor.ts"],"sourcesContent":["import { Context } from 'effect'\nimport type { Effect } from 'effect'\nimport type { ToolCall, ToolResult } from '@yolk-sdk/agent/protocol'\nimport type { ToolError } from '../error.ts'\n\nexport class ToolExecutor extends Context.Service<\n ToolExecutor,\n {\n readonly execute: (call: ToolCall) => Effect.Effect<ToolResult, ToolError>\n }\n>()('@yolk-sdk/agent/loop/ToolExecutor') {}\n"],"mappings":";;AAKA,IAAa,eAAb,cAAkC,QAAQ,QAKxC,EAAE,mCAAmC,EAAE,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { LLMEvent } from "../llm-event.mjs";
2
+ import { LLMProvider, LLMRequest } from "../services/llm-provider.mjs";
3
+ import { Layer } from "effect";
4
+
5
+ //#region src/loop/testing/faux-provider.d.ts
6
+ type FauxResponse = {
7
+ readonly events: ReadonlyArray<LLMEvent>;
8
+ };
9
+ declare const Reply: {
10
+ text: (text: string) => FauxResponse;
11
+ reasoningText: (reasoning: string, text: string) => FauxResponse;
12
+ toolCall: (input: {
13
+ readonly id: string;
14
+ readonly name: string;
15
+ readonly params: unknown;
16
+ }) => FauxResponse;
17
+ usage: (input: {
18
+ readonly input: number;
19
+ readonly output: number;
20
+ }) => FauxResponse;
21
+ };
22
+ declare const FauxProvider: {
23
+ layer: (...initialResponses: ReadonlyArray<FauxResponse>) => Layer.Layer<LLMProvider, never, never>;
24
+ layerWithRequests: (input: {
25
+ readonly responses: ReadonlyArray<FauxResponse>;
26
+ readonly requests: Array<LLMRequest>;
27
+ }) => Layer.Layer<LLMProvider, never, never>;
28
+ };
29
+ //#endregion
30
+ export { FauxProvider, FauxResponse, Reply };
31
+ //# sourceMappingURL=faux-provider.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faux-provider.d.mts","names":[],"sources":["../../../src/loop/testing/faux-provider.ts"],"mappings":";;;;;KAaY,YAAA;EAAA,SACD,MAAA,EAAQ,aAAa,CAAC,QAAA;AAAA;AAAA,cAGpB,KAAA;0BACW,YAAA;qCAMW,IAAA,aAAiB,YAAA;;aAQvC,EAAA;IAAA,SACA,IAAA;IAAA,SACA,MAAA;EAAA,MACP,YAAA;;aAQsB,KAAA;IAAA,SAAwB,MAAA;EAAA,MAAmB,YAAA;AAAA;AAAA,cA4B1D,YAAA;+BACkB,aAAA,CAAc,YAAA,MAAa,KAAA,CAAA,KAAA,CAAA,WAAA;;aAG7C,SAAA,EAAW,aAAA,CAAc,YAAA;IAAA,SACzB,QAAA,EAAU,KAAA,CAAM,UAAA;EAAA,MAC1B,KAAA,CAAA,KAAA,CAAA,WAAA;AAAA"}
@@ -0,0 +1,47 @@
1
+ import { FauxExhaustedError } from "../error.mjs";
2
+ import { LLMDone, LLMReasoningDelta as LLMReasoningDelta$1, LLMTextDelta as LLMTextDelta$1, LLMToolCall, LLMUsage } from "../llm-event.mjs";
3
+ import { LLMProvider } from "../services/llm-provider.mjs";
4
+ import { Effect, Layer, Ref, Stream } from "effect";
5
+ import { AgentInputUsage, AgentOutputUsage, AgentUsage, ToolCall } from "@yolk-sdk/agent/protocol";
6
+ //#region src/loop/testing/faux-provider.ts
7
+ const Reply = {
8
+ text: (text) => ({ events: [...text.split("").map((character) => LLMTextDelta$1.make({ text: character })), LLMDone.make({ stopReason: "stop" })] }),
9
+ reasoningText: (reasoning, text) => ({ events: [
10
+ LLMReasoningDelta$1.make({ text: reasoning }),
11
+ ...text.split("").map((character) => LLMTextDelta$1.make({ text: character })),
12
+ LLMDone.make({ stopReason: "stop" })
13
+ ] }),
14
+ toolCall: (input) => ({ events: [LLMToolCall.make({ call: ToolCall.make({
15
+ id: input.id,
16
+ name: input.name,
17
+ params: input.params
18
+ }) }), LLMDone.make({ stopReason: "tool_use" })] }),
19
+ usage: (input) => ({ events: [LLMUsage.make({ usage: AgentUsage.make({
20
+ input: AgentInputUsage.make({ total: input.input }),
21
+ output: AgentOutputUsage.make({ total: input.output })
22
+ }) }), LLMDone.make({ stopReason: "stop" })] })
23
+ };
24
+ const takeResponse = (responses) => Effect.gen(function* () {
25
+ const current = yield* Ref.get(responses);
26
+ const response = current[0];
27
+ if (response === void 0) return yield* Effect.fail(new FauxExhaustedError({ message: "No more faux responses queued" }));
28
+ yield* Ref.set(responses, current.slice(1));
29
+ return response;
30
+ });
31
+ const FauxProvider = {
32
+ layer: (...initialResponses) => FauxProvider.layerWithRequests({
33
+ responses: initialResponses,
34
+ requests: []
35
+ }),
36
+ layerWithRequests: (input) => Layer.effect(LLMProvider, Effect.gen(function* () {
37
+ const responses = yield* Ref.make(input.responses);
38
+ return LLMProvider.of({ stream: (request) => {
39
+ input.requests.push(request);
40
+ return Stream.fromEffect(takeResponse(responses)).pipe(Stream.flatMap((response) => Stream.fromIterable(response.events)));
41
+ } });
42
+ }))
43
+ };
44
+ //#endregion
45
+ export { FauxProvider, Reply };
46
+
47
+ //# sourceMappingURL=faux-provider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faux-provider.mjs","names":["LLMTextDelta","LLMReasoningDelta"],"sources":["../../../src/loop/testing/faux-provider.ts"],"sourcesContent":["import { Effect, Layer, Ref, Stream } from 'effect'\nimport { AgentInputUsage, AgentOutputUsage, AgentUsage, ToolCall } from '@yolk-sdk/agent/protocol'\nimport { FauxExhaustedError } from '../error.ts'\nimport {\n LLMDone,\n LLMReasoningDelta,\n LLMTextDelta,\n LLMToolCall,\n LLMUsage,\n type LLMEvent\n} from '../llm-event.ts'\nimport { LLMProvider, type LLMRequest } from '../services/llm-provider.ts'\n\nexport type FauxResponse = {\n readonly events: ReadonlyArray<LLMEvent>\n}\n\nexport const Reply = {\n text: (text: string): FauxResponse => ({\n events: [\n ...text.split('').map(character => LLMTextDelta.make({ text: character })),\n LLMDone.make({ stopReason: 'stop' })\n ]\n }),\n reasoningText: (reasoning: string, text: string): FauxResponse => ({\n events: [\n LLMReasoningDelta.make({ text: reasoning }),\n ...text.split('').map(character => LLMTextDelta.make({ text: character })),\n LLMDone.make({ stopReason: 'stop' })\n ]\n }),\n toolCall: (input: {\n readonly id: string\n readonly name: string\n readonly params: unknown\n }): FauxResponse => ({\n events: [\n LLMToolCall.make({\n call: ToolCall.make({ id: input.id, name: input.name, params: input.params })\n }),\n LLMDone.make({ stopReason: 'tool_use' })\n ]\n }),\n usage: (input: { readonly input: number; readonly output: number }): FauxResponse => ({\n events: [\n LLMUsage.make({\n usage: AgentUsage.make({\n input: AgentInputUsage.make({ total: input.input }),\n output: AgentOutputUsage.make({ total: input.output })\n })\n }),\n LLMDone.make({ stopReason: 'stop' })\n ]\n })\n}\n\nconst takeResponse = (responses: Ref.Ref<ReadonlyArray<FauxResponse>>) =>\n Effect.gen(function* () {\n const current = yield* Ref.get(responses)\n const response = current[0]\n\n if (response === undefined) {\n return yield* Effect.fail(\n new FauxExhaustedError({ message: 'No more faux responses queued' })\n )\n }\n\n yield* Ref.set(responses, current.slice(1))\n return response\n })\n\nexport const FauxProvider = {\n layer: (...initialResponses: ReadonlyArray<FauxResponse>) =>\n FauxProvider.layerWithRequests({ responses: initialResponses, requests: [] }),\n layerWithRequests: (input: {\n readonly responses: ReadonlyArray<FauxResponse>\n readonly requests: Array<LLMRequest>\n }) =>\n Layer.effect(\n LLMProvider,\n Effect.gen(function* () {\n const responses = yield* Ref.make(input.responses)\n\n return LLMProvider.of({\n stream: request => {\n input.requests.push(request)\n return Stream.fromEffect(takeResponse(responses)).pipe(\n Stream.flatMap(response => Stream.fromIterable(response.events))\n )\n }\n })\n })\n )\n}\n"],"mappings":";;;;;;AAiBA,MAAa,QAAQ;CACnB,OAAO,UAAgC,EACrC,QAAQ,CACN,GAAG,KAAK,MAAM,EAAE,EAAE,KAAI,cAAaA,eAAa,KAAK,EAAE,MAAM,UAAU,CAAC,CAAC,GACzE,QAAQ,KAAK,EAAE,YAAY,OAAO,CAAC,CACrC,EACF;CACA,gBAAgB,WAAmB,UAAgC,EACjE,QAAQ;EACNC,oBAAkB,KAAK,EAAE,MAAM,UAAU,CAAC;EAC1C,GAAG,KAAK,MAAM,EAAE,EAAE,KAAI,cAAaD,eAAa,KAAK,EAAE,MAAM,UAAU,CAAC,CAAC;EACzE,QAAQ,KAAK,EAAE,YAAY,OAAO,CAAC;CACrC,EACF;CACA,WAAW,WAIU,EACnB,QAAQ,CACN,YAAY,KAAK,EACf,MAAM,SAAS,KAAK;EAAE,IAAI,MAAM;EAAI,MAAM,MAAM;EAAM,QAAQ,MAAM;CAAO,CAAC,EAC9E,CAAC,GACD,QAAQ,KAAK,EAAE,YAAY,WAAW,CAAC,CACzC,EACF;CACA,QAAQ,WAA8E,EACpF,QAAQ,CACN,SAAS,KAAK,EACZ,OAAO,WAAW,KAAK;EACrB,OAAO,gBAAgB,KAAK,EAAE,OAAO,MAAM,MAAM,CAAC;EAClD,QAAQ,iBAAiB,KAAK,EAAE,OAAO,MAAM,OAAO,CAAC;CACvD,CAAC,EACH,CAAC,GACD,QAAQ,KAAK,EAAE,YAAY,OAAO,CAAC,CACrC,EACF;AACF;AAEA,MAAM,gBAAgB,cACpB,OAAO,IAAI,aAAa;CACtB,MAAM,UAAU,OAAO,IAAI,IAAI,SAAS;CACxC,MAAM,WAAW,QAAQ;CAEzB,IAAI,aAAa,KAAA,GACf,OAAO,OAAO,OAAO,KACnB,IAAI,mBAAmB,EAAE,SAAS,gCAAgC,CAAC,CACrE;CAGF,OAAO,IAAI,IAAI,WAAW,QAAQ,MAAM,CAAC,CAAC;CAC1C,OAAO;AACT,CAAC;AAEH,MAAa,eAAe;CAC1B,QAAQ,GAAG,qBACT,aAAa,kBAAkB;EAAE,WAAW;EAAkB,UAAU,CAAC;CAAE,CAAC;CAC9E,oBAAoB,UAIlB,MAAM,OACJ,aACA,OAAO,IAAI,aAAa;EACtB,MAAM,YAAY,OAAO,IAAI,KAAK,MAAM,SAAS;EAEjD,OAAO,YAAY,GAAG,EACpB,SAAQ,YAAW;GACjB,MAAM,SAAS,KAAK,OAAO;GAC3B,OAAO,OAAO,WAAW,aAAa,SAAS,CAAC,EAAE,KAChD,OAAO,SAAQ,aAAY,OAAO,aAAa,SAAS,MAAM,CAAC,CACjE;EACF,EACF,CAAC;CACH,CAAC,CACH;AACJ"}
@@ -0,0 +1,3 @@
1
+ import { FauxProvider, FauxResponse, Reply } from "./faux-provider.mjs";
2
+ import { TestToolExecutor } from "./test-tool-executor.mjs";
3
+ export { FauxProvider, type FauxResponse, Reply, TestToolExecutor };
@@ -0,0 +1,3 @@
1
+ import { FauxProvider, Reply } from "./faux-provider.mjs";
2
+ import { TestToolExecutor } from "./test-tool-executor.mjs";
3
+ export { FauxProvider, Reply, TestToolExecutor };
@@ -0,0 +1,10 @@
1
+ import { ToolExecutor } from "../services/tool-executor.mjs";
2
+ import { Layer } from "effect";
3
+
4
+ //#region src/loop/testing/test-tool-executor.d.ts
5
+ declare const TestToolExecutor: {
6
+ layer: (resultsByName: Readonly<Record<string, string>>) => Layer.Layer<ToolExecutor, never, never>;
7
+ };
8
+ //#endregion
9
+ export { TestToolExecutor };
10
+ //# sourceMappingURL=test-tool-executor.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-tool-executor.d.mts","names":[],"sources":["../../../src/loop/testing/test-tool-executor.ts"],"mappings":";;;;cAKa,gBAAA;yBACY,QAAA,CAAS,MAAA,sBAAuB,KAAA,CAAA,KAAA,CAAA,YAAA;AAAA"}
@@ -0,0 +1,21 @@
1
+ import { ToolError } from "../error.mjs";
2
+ import { ToolExecutor } from "../services/tool-executor.mjs";
3
+ import { Effect, Layer } from "effect";
4
+ import { ToolResult } from "@yolk-sdk/agent/protocol";
5
+ //#region src/loop/testing/test-tool-executor.ts
6
+ const TestToolExecutor = { layer: (resultsByName) => Layer.succeed(ToolExecutor, ToolExecutor.of({ execute: (call) => {
7
+ const content = resultsByName[call.name];
8
+ if (content === void 0) return Effect.fail(new ToolError({
9
+ tool: call.name,
10
+ message: `No canned result for tool: ${call.name}`,
11
+ cause: "execution"
12
+ }));
13
+ return Effect.succeed(ToolResult.make({
14
+ toolCallId: call.id,
15
+ content
16
+ }));
17
+ } })) };
18
+ //#endregion
19
+ export { TestToolExecutor };
20
+
21
+ //# sourceMappingURL=test-tool-executor.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-tool-executor.mjs","names":[],"sources":["../../../src/loop/testing/test-tool-executor.ts"],"sourcesContent":["import { Effect, Layer } from 'effect'\nimport { ToolResult } from '@yolk-sdk/agent/protocol'\nimport { ToolError } from '../error.ts'\nimport { ToolExecutor } from '../services/tool-executor.ts'\n\nexport const TestToolExecutor = {\n layer: (resultsByName: Readonly<Record<string, string>>) =>\n Layer.succeed(\n ToolExecutor,\n ToolExecutor.of({\n execute: call => {\n const content = resultsByName[call.name]\n\n if (content === undefined) {\n return Effect.fail(\n new ToolError({\n tool: call.name,\n message: `No canned result for tool: ${call.name}`,\n cause: 'execution'\n })\n )\n }\n\n return Effect.succeed(ToolResult.make({ toolCallId: call.id, content }))\n }\n })\n )\n}\n"],"mappings":";;;;;AAKA,MAAa,mBAAmB,EAC9B,QAAQ,kBACN,MAAM,QACJ,cACA,aAAa,GAAG,EACd,UAAS,SAAQ;CACf,MAAM,UAAU,cAAc,KAAK;CAEnC,IAAI,YAAY,KAAA,GACd,OAAO,OAAO,KACZ,IAAI,UAAU;EACZ,MAAM,KAAK;EACX,SAAS,8BAA8B,KAAK;EAC5C,OAAO;CACT,CAAC,CACH;CAGF,OAAO,OAAO,QAAQ,WAAW,KAAK;EAAE,YAAY,KAAK;EAAI;CAAQ,CAAC,CAAC;AACzE,EACF,CAAC,CACH,EACJ"}
@@ -0,0 +1,20 @@
1
+ import * as Schema from "effect/Schema";
2
+
3
+ //#region src/protocol/capability.d.ts
4
+ declare const AgentContentCapabilities_base: Schema.Class<AgentContentCapabilities, Schema.Struct<{
5
+ readonly text: Schema.Boolean;
6
+ readonly image: Schema.Boolean;
7
+ readonly audio: Schema.Boolean;
8
+ }>, {}>;
9
+ declare class AgentContentCapabilities extends AgentContentCapabilities_base {}
10
+ declare const AgentModelCapabilities_base: Schema.Class<AgentModelCapabilities, Schema.Struct<{
11
+ readonly input: typeof AgentContentCapabilities;
12
+ readonly tools: Schema.Boolean;
13
+ readonly reasoning: Schema.Boolean;
14
+ }>, {}>;
15
+ declare class AgentModelCapabilities extends AgentModelCapabilities_base {}
16
+ declare const textOnlyModelCapabilities: AgentModelCapabilities;
17
+ declare const textImageModelCapabilities: AgentModelCapabilities;
18
+ //#endregion
19
+ export { AgentContentCapabilities, AgentModelCapabilities, textImageModelCapabilities, textOnlyModelCapabilities };
20
+ //# sourceMappingURL=capability.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability.d.mts","names":[],"sources":["../../src/protocol/capability.ts"],"mappings":";;;cAAuC,6BAAA;;;;;cAE1B,wBAAA,SAAiC,6BAM5C;AAAA,cAAG,2BAAA;;;;;cAEQ,sBAAA,SAA+B,2BAM1C;AAAA,cAEW,yBAAA,EAAyB,sBAIpC;AAAA,cAEW,0BAAA,EAA0B,sBAIrC"}
@@ -0,0 +1,34 @@
1
+ import * as Schema from "effect/Schema";
2
+ //#region src/protocol/capability.ts
3
+ var AgentContentCapabilities = class extends Schema.Class("AgentContentCapabilities")({
4
+ text: Schema.Boolean,
5
+ image: Schema.Boolean,
6
+ audio: Schema.Boolean
7
+ }) {};
8
+ var AgentModelCapabilities = class extends Schema.Class("AgentModelCapabilities")({
9
+ input: AgentContentCapabilities,
10
+ tools: Schema.Boolean,
11
+ reasoning: Schema.Boolean
12
+ }) {};
13
+ const textOnlyModelCapabilities = AgentModelCapabilities.make({
14
+ input: AgentContentCapabilities.make({
15
+ text: true,
16
+ image: false,
17
+ audio: false
18
+ }),
19
+ tools: true,
20
+ reasoning: true
21
+ });
22
+ const textImageModelCapabilities = AgentModelCapabilities.make({
23
+ input: AgentContentCapabilities.make({
24
+ text: true,
25
+ image: true,
26
+ audio: false
27
+ }),
28
+ tools: true,
29
+ reasoning: true
30
+ });
31
+ //#endregion
32
+ export { AgentContentCapabilities, AgentModelCapabilities, textImageModelCapabilities, textOnlyModelCapabilities };
33
+
34
+ //# sourceMappingURL=capability.mjs.map
@@ -0,0 +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;CAC/E,OAAO;CACP,WAAW;AACb,CAAC;AAED,MAAa,6BAA6B,uBAAuB,KAAK;CACpE,OAAO,yBAAyB,KAAK;EAAE,MAAM;EAAM,OAAO;EAAM,OAAO;CAAM,CAAC;CAC9E,OAAO;CACP,WAAW;AACb,CAAC"}
@@ -0,0 +1,31 @@
1
+ import * as Schema from "effect/Schema";
2
+
3
+ //#region src/protocol/content.d.ts
4
+ declare const TextPart_base: Schema.Class<TextPart, Schema.TaggedStruct<"Text", {
5
+ readonly text: Schema.String;
6
+ }>, {}>;
7
+ declare class TextPart extends TextPart_base {}
8
+ declare const ImagePart_base: Schema.Class<ImagePart, Schema.TaggedStruct<"Image", {
9
+ readonly data: Schema.String;
10
+ readonly mimeType: Schema.String;
11
+ }>, {}>;
12
+ declare class ImagePart extends ImagePart_base {}
13
+ declare const AudioPart_base: Schema.Class<AudioPart, Schema.TaggedStruct<"Audio", {
14
+ readonly data: Schema.String;
15
+ readonly format: Schema.Literals<readonly ["pcm16", "wav", "mp3", "opus"]>;
16
+ }>, {}>;
17
+ declare class AudioPart extends AudioPart_base {}
18
+ declare const ContentPart: Schema.Union<readonly [typeof TextPart, typeof ImagePart, typeof AudioPart]>;
19
+ 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]>>]>;
21
+ type Content = typeof Content.Type;
22
+ declare const contentPartText: (part: ContentPart) => string;
23
+ declare const contentPartPreview: (part: ContentPart) => string;
24
+ declare const contentText: (content: Content) => string;
25
+ declare const contentPreview: (content: Content) => string;
26
+ declare const contentParts: (content: Content) => ReadonlyArray<ContentPart>;
27
+ declare const isContentEmpty: (content: Content) => boolean;
28
+ declare const appendTextToContent: (content: Content, text: string) => Content;
29
+ //#endregion
30
+ export { AudioPart, Content, ContentPart, ImagePart, TextPart, appendTextToContent, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, isContentEmpty };
31
+ //# sourceMappingURL=content.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.d.mts","names":[],"sources":["../../src/protocol/content.ts"],"mappings":";;;cACuC,aAAA;;;cAE1B,QAAA,SAAiB,aAE5B;AAAA,cAAG,cAAA;;;;cAEQ,SAAA,SAAkB,cAG7B;AAAA,cAAG,cAAA;;;;cAEQ,SAAA,SAAkB,cAG7B;AAAA,cAEW,WAAA,EAAW,MAAA,CAAA,KAAA,kBAAA,QAAA,SAAA,SAAA,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,SAAA;AAAA,KACR,OAAA,UAAiB,OAAA,CAAQ,IAAI;AAAA,cAE5B,eAAA,GAAmB,IAAiB,EAAX,WAAW;AAAA,cAUpC,kBAAA,GAAsB,IAAiB,EAAX,WAAW;AAAA,cAWvC,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"}
@@ -0,0 +1,52 @@
1
+ import { Array, Option } from "effect";
2
+ import * as Schema from "effect/Schema";
3
+ //#region src/protocol/content.ts
4
+ var TextPart = class extends Schema.TaggedClass()("Text", { text: Schema.String }) {};
5
+ var ImagePart = class extends Schema.TaggedClass()("Image", {
6
+ data: Schema.String,
7
+ mimeType: Schema.String
8
+ }) {};
9
+ var AudioPart = class extends Schema.TaggedClass()("Audio", {
10
+ data: Schema.String,
11
+ format: Schema.Literals([
12
+ "pcm16",
13
+ "wav",
14
+ "mp3",
15
+ "opus"
16
+ ])
17
+ }) {};
18
+ const ContentPart = Schema.Union([
19
+ TextPart,
20
+ ImagePart,
21
+ AudioPart
22
+ ]);
23
+ const Content = Schema.Union([Schema.String, Schema.Array(ContentPart)]);
24
+ const contentPartText = (part) => {
25
+ switch (part._tag) {
26
+ case "Text": return part.text;
27
+ case "Image":
28
+ case "Audio": return "";
29
+ }
30
+ };
31
+ const contentPartPreview = (part) => {
32
+ switch (part._tag) {
33
+ case "Text": return part.text;
34
+ case "Image": return "Image";
35
+ case "Audio": return "Audio";
36
+ }
37
+ };
38
+ const contentText = (content) => typeof content === "string" ? content : Array.map(content, contentPartText).join("");
39
+ const contentPreview = (content) => typeof content === "string" ? content : Array.map(content, contentPartPreview).join(", ");
40
+ const contentParts = (content) => typeof content === "string" ? [TextPart.make({ text: content })] : content;
41
+ const isContentEmpty = (content) => typeof content === "string" ? content.length === 0 : content.length === 0 || Array.every(content, (part) => part._tag === "Text" && part.text.length === 0);
42
+ const appendTextToContent = (content, text) => {
43
+ if (typeof content === "string") return `${content}${text}`;
44
+ return Option.match(Array.last(content), {
45
+ onNone: () => [TextPart.make({ text })],
46
+ onSome: (last) => last._tag !== "Text" ? [...content, TextPart.make({ text })] : Array.map(content, (part, index) => index === content.length - 1 && part._tag === "Text" ? TextPart.make({ text: `${part.text}${text}` }) : part)
47
+ });
48
+ };
49
+ //#endregion
50
+ export { AudioPart, Content, ContentPart, ImagePart, TextPart, appendTextToContent, contentPartPreview, contentPartText, contentParts, contentPreview, contentText, isContentEmpty };
51
+
52
+ //# sourceMappingURL=content.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.mjs","names":["Arr"],"sources":["../../src/protocol/content.ts"],"sourcesContent":["import { Array as Arr, Option } from 'effect'\nimport * as Schema from 'effect/Schema'\n\nexport class TextPart extends Schema.TaggedClass<TextPart>()('Text', {\n text: Schema.String\n}) {}\n\nexport class ImagePart extends Schema.TaggedClass<ImagePart>()('Image', {\n data: Schema.String,\n mimeType: Schema.String\n}) {}\n\nexport class AudioPart extends Schema.TaggedClass<AudioPart>()('Audio', {\n data: Schema.String,\n format: Schema.Literals(['pcm16', 'wav', 'mp3', 'opus'])\n}) {}\n\nexport const ContentPart = Schema.Union([TextPart, ImagePart, AudioPart])\nexport type ContentPart = typeof ContentPart.Type\n\nexport const Content = Schema.Union([Schema.String, Schema.Array(ContentPart)])\nexport type Content = typeof Content.Type\n\nexport const contentPartText = (part: ContentPart) => {\n switch (part._tag) {\n case 'Text':\n return part.text\n case 'Image':\n case 'Audio':\n return ''\n }\n}\n\nexport const contentPartPreview = (part: ContentPart) => {\n switch (part._tag) {\n case 'Text':\n return part.text\n case 'Image':\n return 'Image'\n case 'Audio':\n return 'Audio'\n }\n}\n\nexport const contentText = (content: Content) =>\n typeof content === 'string' ? content : Arr.map(content, contentPartText).join('')\n\nexport const contentPreview = (content: Content) =>\n typeof content === 'string' ? content : Arr.map(content, contentPartPreview).join(', ')\n\nexport const contentParts = (content: Content): ReadonlyArray<ContentPart> =>\n typeof content === 'string' ? [TextPart.make({ text: content })] : content\n\nexport const isContentEmpty = (content: Content) =>\n typeof content === 'string'\n ? content.length === 0\n : content.length === 0 ||\n Arr.every(content, part => part._tag === 'Text' && part.text.length === 0)\n\nexport const appendTextToContent = (content: Content, text: string): Content => {\n if (typeof content === 'string') {\n return `${content}${text}`\n }\n\n return Option.match(Arr.last(content), {\n onNone: () => [TextPart.make({ text })],\n onSome: last =>\n last._tag !== 'Text'\n ? [...content, TextPart.make({ text })]\n : Arr.map(content, (part, index) =>\n index === content.length - 1 && part._tag === 'Text'\n ? TextPart.make({ text: `${part.text}${text}` })\n : part\n )\n })\n}\n"],"mappings":";;;AAGA,IAAa,WAAb,cAA8B,OAAO,YAAsB,EAAE,QAAQ,EACnE,MAAM,OAAO,OACf,CAAC,EAAE,CAAC;AAEJ,IAAa,YAAb,cAA+B,OAAO,YAAuB,EAAE,SAAS;CACtE,MAAM,OAAO;CACb,UAAU,OAAO;AACnB,CAAC,EAAE,CAAC;AAEJ,IAAa,YAAb,cAA+B,OAAO,YAAuB,EAAE,SAAS;CACtE,MAAM,OAAO;CACb,QAAQ,OAAO,SAAS;EAAC;EAAS;EAAO;EAAO;CAAM,CAAC;AACzD,CAAC,EAAE,CAAC;AAEJ,MAAa,cAAc,OAAO,MAAM;CAAC;CAAU;CAAW;AAAS,CAAC;AAGxE,MAAa,UAAU,OAAO,MAAM,CAAC,OAAO,QAAQ,OAAO,MAAM,WAAW,CAAC,CAAC;AAG9E,MAAa,mBAAmB,SAAsB;CACpD,QAAQ,KAAK,MAAb;EACE,KAAK,QACH,OAAO,KAAK;EACd,KAAK;EACL,KAAK,SACH,OAAO;CACX;AACF;AAEA,MAAa,sBAAsB,SAAsB;CACvD,QAAQ,KAAK,MAAb;EACE,KAAK,QACH,OAAO,KAAK;EACd,KAAK,SACH,OAAO;EACT,KAAK,SACH,OAAO;CACX;AACF;AAEA,MAAa,eAAe,YAC1B,OAAO,YAAY,WAAW,UAAUA,MAAI,IAAI,SAAS,eAAe,EAAE,KAAK,EAAE;AAEnF,MAAa,kBAAkB,YAC7B,OAAO,YAAY,WAAW,UAAUA,MAAI,IAAI,SAAS,kBAAkB,EAAE,KAAK,IAAI;AAExF,MAAa,gBAAgB,YAC3B,OAAO,YAAY,WAAW,CAAC,SAAS,KAAK,EAAE,MAAM,QAAQ,CAAC,CAAC,IAAI;AAErE,MAAa,kBAAkB,YAC7B,OAAO,YAAY,WACf,QAAQ,WAAW,IACnB,QAAQ,WAAW,KACnBA,MAAI,MAAM,UAAS,SAAQ,KAAK,SAAS,UAAU,KAAK,KAAK,WAAW,CAAC;AAE/E,MAAa,uBAAuB,SAAkB,SAA0B;CAC9E,IAAI,OAAO,YAAY,UACrB,OAAO,GAAG,UAAU;CAGtB,OAAO,OAAO,MAAMA,MAAI,KAAK,OAAO,GAAG;EACrC,cAAc,CAAC,SAAS,KAAK,EAAE,KAAK,CAAC,CAAC;EACtC,SAAQ,SACN,KAAK,SAAS,SACV,CAAC,GAAG,SAAS,SAAS,KAAK,EAAE,KAAK,CAAC,CAAC,IACpCA,MAAI,IAAI,UAAU,MAAM,UACtB,UAAU,QAAQ,SAAS,KAAK,KAAK,SAAS,SAC1C,SAAS,KAAK,EAAE,MAAM,GAAG,KAAK,OAAO,OAAO,CAAC,IAC7C,IACN;CACR,CAAC;AACH"}