@simulacra-ai/core 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2293 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1631 -0
- package/dist/index.d.ts +1631 -10
- package/dist/index.js +2232 -8
- package/dist/index.js.map +1 -1
- package/package.json +10 -4
- package/dist/checkpoints/default-summarization-strategy.d.ts +0 -19
- package/dist/checkpoints/default-summarization-strategy.d.ts.map +0 -1
- package/dist/checkpoints/default-summarization-strategy.js +0 -69
- package/dist/checkpoints/default-summarization-strategy.js.map +0 -1
- package/dist/checkpoints/index.d.ts +0 -3
- package/dist/checkpoints/index.d.ts.map +0 -1
- package/dist/checkpoints/index.js +0 -3
- package/dist/checkpoints/index.js.map +0 -1
- package/dist/checkpoints/types.d.ts +0 -32
- package/dist/checkpoints/types.d.ts.map +0 -1
- package/dist/checkpoints/types.js +0 -2
- package/dist/checkpoints/types.js.map +0 -1
- package/dist/context-transformers/checkpoint-context-transformer.d.ts +0 -19
- package/dist/context-transformers/checkpoint-context-transformer.d.ts.map +0 -1
- package/dist/context-transformers/checkpoint-context-transformer.js +0 -38
- package/dist/context-transformers/checkpoint-context-transformer.js.map +0 -1
- package/dist/context-transformers/composite-context-transformer.d.ts +0 -31
- package/dist/context-transformers/composite-context-transformer.d.ts.map +0 -1
- package/dist/context-transformers/composite-context-transformer.js +0 -41
- package/dist/context-transformers/composite-context-transformer.js.map +0 -1
- package/dist/context-transformers/index.d.ts +0 -6
- package/dist/context-transformers/index.d.ts.map +0 -1
- package/dist/context-transformers/index.js +0 -6
- package/dist/context-transformers/index.js.map +0 -1
- package/dist/context-transformers/noop-context-transformer.d.ts +0 -24
- package/dist/context-transformers/noop-context-transformer.d.ts.map +0 -1
- package/dist/context-transformers/noop-context-transformer.js +0 -26
- package/dist/context-transformers/noop-context-transformer.js.map +0 -1
- package/dist/context-transformers/tool-context-transformer.d.ts +0 -26
- package/dist/context-transformers/tool-context-transformer.d.ts.map +0 -1
- package/dist/context-transformers/tool-context-transformer.js +0 -52
- package/dist/context-transformers/tool-context-transformer.js.map +0 -1
- package/dist/context-transformers/types.d.ts +0 -65
- package/dist/context-transformers/types.d.ts.map +0 -1
- package/dist/context-transformers/types.js +0 -2
- package/dist/context-transformers/types.js.map +0 -1
- package/dist/conversations/conversation.d.ts +0 -152
- package/dist/conversations/conversation.d.ts.map +0 -1
- package/dist/conversations/conversation.js +0 -648
- package/dist/conversations/conversation.js.map +0 -1
- package/dist/conversations/index.d.ts +0 -5
- package/dist/conversations/index.d.ts.map +0 -1
- package/dist/conversations/index.js +0 -5
- package/dist/conversations/index.js.map +0 -1
- package/dist/conversations/stream-listener.d.ts +0 -37
- package/dist/conversations/stream-listener.d.ts.map +0 -1
- package/dist/conversations/stream-listener.js +0 -68
- package/dist/conversations/stream-listener.js.map +0 -1
- package/dist/conversations/token-tracker.d.ts +0 -59
- package/dist/conversations/token-tracker.d.ts.map +0 -1
- package/dist/conversations/token-tracker.js +0 -98
- package/dist/conversations/token-tracker.js.map +0 -1
- package/dist/conversations/types.d.ts +0 -346
- package/dist/conversations/types.d.ts.map +0 -1
- package/dist/conversations/types.js +0 -2
- package/dist/conversations/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/policies/composite-policy.d.ts +0 -29
- package/dist/policies/composite-policy.d.ts.map +0 -1
- package/dist/policies/composite-policy.js +0 -77
- package/dist/policies/composite-policy.js.map +0 -1
- package/dist/policies/default-policy.d.ts +0 -7
- package/dist/policies/default-policy.d.ts.map +0 -1
- package/dist/policies/default-policy.js +0 -14
- package/dist/policies/default-policy.js.map +0 -1
- package/dist/policies/index.d.ts +0 -8
- package/dist/policies/index.d.ts.map +0 -1
- package/dist/policies/index.js +0 -8
- package/dist/policies/index.js.map +0 -1
- package/dist/policies/noop-policy.d.ts +0 -21
- package/dist/policies/noop-policy.d.ts.map +0 -1
- package/dist/policies/noop-policy.js +0 -36
- package/dist/policies/noop-policy.js.map +0 -1
- package/dist/policies/rate-limit-policy.d.ts +0 -44
- package/dist/policies/rate-limit-policy.d.ts.map +0 -1
- package/dist/policies/rate-limit-policy.js +0 -98
- package/dist/policies/rate-limit-policy.js.map +0 -1
- package/dist/policies/retry-policy.d.ts +0 -42
- package/dist/policies/retry-policy.d.ts.map +0 -1
- package/dist/policies/retry-policy.js +0 -114
- package/dist/policies/retry-policy.js.map +0 -1
- package/dist/policies/token-limit-policy.d.ts +0 -76
- package/dist/policies/token-limit-policy.d.ts.map +0 -1
- package/dist/policies/token-limit-policy.js +0 -134
- package/dist/policies/token-limit-policy.js.map +0 -1
- package/dist/policies/types.d.ts +0 -49
- package/dist/policies/types.d.ts.map +0 -1
- package/dist/policies/types.js +0 -9
- package/dist/policies/types.js.map +0 -1
- package/dist/tools/index.d.ts +0 -2
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -2
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/types.d.ts +0 -180
- package/dist/tools/types.d.ts.map +0 -1
- package/dist/tools/types.js +0 -2
- package/dist/tools/types.js.map +0 -1
- package/dist/utils/async.d.ts +0 -125
- package/dist/utils/async.d.ts.map +0 -1
- package/dist/utils/async.js +0 -217
- package/dist/utils/async.js.map +0 -1
- package/dist/utils/index.d.ts +0 -4
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -4
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/object.d.ts +0 -80
- package/dist/utils/object.d.ts.map +0 -1
- package/dist/utils/object.js +0 -189
- package/dist/utils/object.js.map +0 -1
- package/dist/utils/types.d.ts +0 -17
- package/dist/utils/types.d.ts.map +0 -1
- package/dist/utils/types.js +0 -2
- package/dist/utils/types.js.map +0 -1
- package/dist/workflows/index.d.ts +0 -4
- package/dist/workflows/index.d.ts.map +0 -1
- package/dist/workflows/index.js +0 -4
- package/dist/workflows/index.js.map +0 -1
- package/dist/workflows/types.d.ts +0 -70
- package/dist/workflows/types.d.ts.map +0 -1
- package/dist/workflows/types.js +0 -2
- package/dist/workflows/types.js.map +0 -1
- package/dist/workflows/workflow-manager.d.ts +0 -74
- package/dist/workflows/workflow-manager.d.ts.map +0 -1
- package/dist/workflows/workflow-manager.js +0 -165
- package/dist/workflows/workflow-manager.js.map +0 -1
- package/dist/workflows/workflow.d.ts +0 -117
- package/dist/workflows/workflow.d.ts.map +0 -1
- package/dist/workflows/workflow.js +0 -355
- package/dist/workflows/workflow.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/checkpoints/default-summarization-strategy.ts","../src/conversations/conversation.ts","../src/context-transformers/checkpoint-context-transformer.ts","../src/context-transformers/composite-context-transformer.ts","../src/context-transformers/tool-context-transformer.ts","../src/policies/types.ts","../src/policies/noop-policy.ts","../src/policies/composite-policy.ts","../src/utils/async.ts","../src/policies/retry-policy.ts","../src/policies/default-policy.ts","../src/conversations/stream-listener.ts","../src/conversations/token-tracker.ts","../src/context-transformers/noop-context-transformer.ts","../src/policies/rate-limit-policy.ts","../src/policies/token-limit-policy.ts","../src/workflows/workflow.ts","../src/workflows/workflow-manager.ts","../src/utils/object.ts"],"sourcesContent":["export * from \"./checkpoints/index.ts\";\nexport * from \"./conversations/index.ts\";\nexport * from \"./context-transformers/index.ts\";\nexport * from \"./policies/index.ts\";\nexport * from \"./workflows/index.ts\";\nexport * from \"./tools/index.ts\";\nexport {\n CancellationToken,\n CancellationTokenSource,\n OperationCanceledError,\n peek_generator,\n sleep,\n} from \"./utils/async.ts\";\nexport { deep_merge, undefined_if_empty } from \"./utils/object.ts\";\nexport type { DeepPartial, Prettify } from \"./utils/types.ts\";\n","import type { Message } from \"../conversations/types.ts\";\nimport type { SummarizationContext, SummarizationStrategy } from \"./types.ts\";\n\n/**\n * Default summarization strategy for checkpoints.\n *\n * Serializes the conversation context into a structured text block and appends\n * an instruction asking the model to produce a condensed summary.\n */\nexport class DefaultSummarizationStrategy implements SummarizationStrategy {\n /**\n * Builds the summarization prompt from the conversation context. Assembles\n * the previous checkpoint summary, system prompt, and recent messages into a\n * structured text block, then appends instructions asking the model to produce\n * a condensed summary suitable for continuing the conversation.\n */\n build_prompt(context: SummarizationContext): Message[] {\n const sections: string[] = [];\n\n if (context.previous_checkpoint) {\n sections.push(`## Previous Checkpoint Summary\\n${context.previous_checkpoint.summary}`);\n }\n\n if (context.system) {\n sections.push(`## System Prompt\\n${context.system}`);\n }\n\n if (context.messages.length > 0) {\n sections.push(`## Conversation\\n${this.#serialize_messages(context.messages)}`);\n }\n\n sections.push(\n [\n \"## Instructions\",\n \"Summarize the above conversation concisely. Preserve:\",\n \"- Key decisions and their rationale\",\n \"- Current state of any in-progress work\",\n \"- Important facts, names, and values established\",\n \"- Tool outcomes\",\n \"- Any explicit user preferences or instructions\",\n \"\",\n \"Omit redundant back-and-forth and superseded plans.\",\n \"Format as a structured briefing the model can use to continue the conversation seamlessly.\",\n ].join(\"\\n\"),\n );\n\n return [\n {\n role: \"user\",\n content: [{ type: \"text\", text: sections.join(\"\\n\\n\") }],\n },\n ];\n }\n\n #serialize_messages(messages: readonly Message[]): string {\n return messages\n .map((m) => {\n const role = m.role === \"user\" ? \"User\" : \"Assistant\";\n const parts = m.content\n .map((c) => {\n switch (c.type) {\n case \"text\":\n return c.text;\n case \"thinking\":\n return `[Thinking: ${c.thought}]`;\n case \"tool\":\n return `[Called tool: ${c.tool}]`;\n case \"tool_result\":\n return `[Tool ${c.tool} returned: ${JSON.stringify(c.result)}]`;\n default:\n return undefined;\n }\n })\n .filter(Boolean);\n return `${role}: ${parts.join(\"\\n\")}`;\n })\n .join(\"\\n\\n\");\n }\n}\n","import crypto from \"node:crypto\";\nimport EventEmitter from \"node:events\";\nimport { setImmediate } from \"node:timers/promises\";\n\nimport type {\n CheckpointState,\n ContextTransformer,\n TransformContext,\n} from \"../context-transformers/types.ts\";\nimport type { CheckpointConfig, SummarizationStrategy } from \"../checkpoints/types.ts\";\nimport { DefaultSummarizationStrategy } from \"../checkpoints/default-summarization-strategy.ts\";\nimport { CheckpointContextTransformer } from \"../context-transformers/checkpoint-context-transformer.ts\";\nimport { CompositeContextTransformer } from \"../context-transformers/composite-context-transformer.ts\";\nimport { ToolContextTransformer } from \"../context-transformers/tool-context-transformer.ts\";\nimport type { ToolClass } from \"../tools/types.ts\";\nimport { getDefaultPolicy } from \"../policies/default-policy.ts\";\nimport type { Policy, PolicyResult } from \"../policies/types.ts\";\nimport {\n AssistantMessage,\n ChangeEvent,\n Content,\n ConversationEvents,\n ConversationState,\n Message,\n ModelProvider,\n PromptRequestData,\n TextContent,\n UserContent,\n UserMessage,\n} from \"./types.ts\";\nimport { CancellationTokenSource } from \"../utils/async.ts\";\nimport { StreamListener } from \"./stream-listener.ts\";\n\n/**\n * Manages a conversation with a language model.\n *\n * The Conversation class handles message exchange, tool execution coordination,\n * event emission, and state management for interactions with language models.\n */\nexport class Conversation {\n readonly #event_emitter: EventEmitter<ConversationEvents>;\n\n readonly #provider: ModelProvider;\n readonly #policy: Policy;\n readonly #context_transformer: ContextTransformer;\n readonly #summarization_strategy: SummarizationStrategy;\n\n #id: string = crypto.randomUUID();\n #state: ConversationState = \"idle\";\n #system: string | undefined;\n #toolkit: ToolClass[] = [];\n #messages: Readonly<Message>[] = [];\n #checkpoint_state: CheckpointState | undefined;\n #is_checkpoint = false;\n\n /**\n * Creates a new conversation instance.\n *\n * @param provider - The model provider for executing requests.\n * @param policy - The policy for controlling request execution (default: retry + rate limiting).\n * @param context_transformer - Transformer for modifying messages before sending (default: ToolContextTransformer + CheckpointContextTransformer).\n * @param summarization_strategy - Strategy for generating checkpoint summaries (default: DefaultSummarizationStrategy).\n */\n constructor(\n provider: ModelProvider,\n policy: Policy = getDefaultPolicy(),\n context_transformer: ContextTransformer = new CompositeContextTransformer([\n new ToolContextTransformer(),\n new CheckpointContextTransformer(),\n ]),\n summarization_strategy: SummarizationStrategy = new DefaultSummarizationStrategy(),\n ) {\n this.#event_emitter = new EventEmitter<ConversationEvents>();\n this.#event_emitter.setMaxListeners(0);\n\n this.#provider = provider;\n this.#policy = policy;\n this.#context_transformer = context_transformer;\n this.#summarization_strategy = summarization_strategy;\n }\n\n /**\n * The unique identifier for this conversation.\n */\n get id(): string {\n return this.#id;\n }\n set id(value: string) {\n this.#id = value;\n }\n\n /**\n * The current state of the conversation.\n */\n get state(): ConversationState {\n return this.#state;\n }\n\n /**\n * The system prompt for this conversation.\n */\n get system(): string | undefined {\n return this.#system;\n }\n set system(value: string | undefined) {\n this.#system = value;\n }\n\n /**\n * The collection of tools available to the model in this conversation.\n */\n get toolkit(): Readonly<ToolClass[]> {\n return Object.freeze([...this.#toolkit]);\n }\n set toolkit(value: ToolClass[]) {\n if (this.#state === \"disposed\") {\n throw new Error(\"invalid state\");\n }\n this.#toolkit = [...value];\n }\n\n /**\n * The conversation message history.\n */\n get messages(): Readonly<Readonly<Message>[]> {\n return Object.freeze([...this.#messages.map((m) => Object.freeze({ ...m }))]);\n }\n\n /**\n * The most recent checkpoint state, containing the summary text and the ID\n * of the last message included in the checkpoint. Available after a\n * successful call to `checkpoint()`. Used by CheckpointContextTransformer\n * to replace pre-checkpoint messages with the summary on subsequent prompts.\n */\n get checkpoint_state(): Readonly<CheckpointState> | undefined {\n return this.#checkpoint_state ? Object.freeze({ ...this.#checkpoint_state }) : undefined;\n }\n set checkpoint_state(value: CheckpointState | undefined) {\n this.#checkpoint_state = value;\n }\n\n /**\n * True when this conversation is an ephemeral child spawned to generate a\n * checkpoint summary. Checkpoint sessions are short-lived, receive the\n * conversation history as a summarization prompt, and are disposed after\n * the summary is produced.\n */\n get is_checkpoint() {\n return this.#is_checkpoint;\n }\n\n /**\n * Disposes the conversation and releases all resources.\n *\n * This method is called automatically when using the `using` keyword.\n * Emits a dispose event and transitions to the disposed state.\n */\n [Symbol.dispose]() {\n if (this.state === \"disposed\") {\n throw new Error(\"invalid state\");\n }\n const previous = this.#state;\n\n this.#event_emitter.emit(\"dispose\", this);\n this.#state = \"disposed\";\n this.#event_emitter.emit(\"state_change\", { current: this.#state, previous }, this);\n this.#event_emitter.removeAllListeners();\n }\n\n /**\n * Sends a text prompt to the model.\n *\n * @param prompt - The text prompt to send.\n * @returns A promise that resolves with the request data, or undefined if cancelled.\n */\n async prompt(prompt: string) {\n return await this.send_message([\n {\n timestamp: Date.now(),\n type: \"text\",\n text: prompt,\n },\n ]);\n }\n\n /**\n * Sends a message with custom content to the model.\n *\n * @param contents - The content blocks to include in the message.\n * @returns A promise that resolves with the request data, or undefined if cancelled.\n */\n async send_message(contents: UserContent[]) {\n if (this.state !== \"idle\") {\n throw new Error(\"invalid state\");\n }\n let prompt_message: UserMessage = {\n timestamp: Date.now(),\n role: \"user\",\n content: contents\n .map((c) => ({\n timestamp: Date.now(),\n ...c,\n }))\n .map((c) => ({\n ...c,\n id: c.id ?? crypto.createHash(\"sha1\").update(JSON.stringify(c)).digest(\"hex\"),\n })),\n };\n prompt_message = {\n ...prompt_message,\n id:\n prompt_message.id ??\n crypto.createHash(\"sha1\").update(JSON.stringify(prompt_message)).digest(\"hex\"),\n };\n\n let request_id: string | undefined;\n let result: PromptRequestData | undefined;\n let policy_result: PolicyResult<PromptRequestData | undefined> | undefined;\n try {\n const stream_listener = new StreamListener(async ({ event, payload }) => {\n switch (event) {\n case \"start_message\": {\n const [{ message, usage }] = payload;\n this.#set_state(\"streaming_response\");\n this.#event_emitter.emit(\"message_start\", { request_id, usage, message }, this);\n break;\n }\n case \"update_message\": {\n const [{ message, usage }] = payload;\n this.#event_emitter.emit(\"message_update\", { request_id, usage, message }, this);\n break;\n }\n case \"complete_message\": {\n const [data] = payload;\n let message = identify_message(data.message);\n for (const t of this.#provider.context_transformers ?? []) {\n if (t.transform_completion) {\n message = await t.transform_completion(message);\n }\n }\n message = await this.#context_transformer.transform_completion(message);\n const has_tool_calls = message.content.some((c) => c.type === \"tool\");\n const stop_reason = has_tool_calls ? \"tool_use\" : data.stop_reason;\n this.#set_state(\"idle\");\n this.#messages.push(prompt_message, message);\n this.#event_emitter.emit(\n \"message_complete\",\n { request_id, ...data, message, stop_reason },\n this,\n );\n break;\n }\n case \"start_content\": {\n const [data] = payload;\n this.#event_emitter.emit(\"content_start\", { request_id, ...data }, this);\n break;\n }\n case \"update_content\": {\n const [data] = payload;\n this.#event_emitter.emit(\"content_update\", { request_id, ...data }, this);\n break;\n }\n case \"complete_content\": {\n const [data] = payload;\n this.#event_emitter.emit(\"content_complete\", { request_id, ...data }, this);\n break;\n }\n case \"error\": {\n stream_listener[Symbol.dispose]();\n const [error] = payload;\n if (this.state !== \"disposed\") {\n this.#set_state(\"idle\");\n }\n this.#event_emitter.emit(\n \"request_error\",\n { request_id, message: prompt_message, error },\n {},\n this,\n );\n break;\n }\n case \"before_request\": {\n const [data] = payload;\n this.#event_emitter.emit(\"before_request\", { data }, this);\n break;\n }\n case \"request_raw\": {\n const [data] = payload;\n this.#event_emitter.emit(\"raw_request\", { request_id, data }, this);\n break;\n }\n case \"response_raw\": {\n const [data] = payload;\n this.#event_emitter.emit(\"raw_response\", { request_id, data }, this);\n break;\n }\n case \"stream_raw\": {\n const [data] = payload;\n this.#event_emitter.emit(\"raw_stream\", { request_id, data }, this);\n break;\n }\n case \"cancel\": {\n stream_listener[Symbol.dispose]();\n if (this.state !== \"disposed\") {\n this.#set_state(\"idle\");\n }\n break;\n }\n }\n });\n using source = new CancellationTokenSource();\n\n const on_state_change = ({ current }: ChangeEvent<ConversationState>) => {\n if (current === \"stopping\") {\n if (!source.is_cancelled) {\n source.cancel();\n }\n }\n if (current === \"idle\" || current === \"disposed\") {\n this.off(\"state_change\", on_state_change);\n }\n };\n this.on(\"state_change\", on_state_change);\n\n const transformed_messages = await this.#get_prompt_context([\n ...this.#messages,\n prompt_message,\n ]);\n const tool_definitions = this.#toolkit.map((t) => t.get_definition());\n\n // Policies are intentionally scoped to the initial request and connection.\n // Mid-stream errors are not handled by the policy; they surface as events\n // through stream_listener.\n const result_promise = this.#policy.execute(source.token, async () => {\n await this.#provider.execute_request(\n {\n messages: transformed_messages,\n tools: tool_definitions,\n system: this.#system,\n },\n stream_listener.create_receiver(),\n source.token,\n );\n return { message: prompt_message } as PromptRequestData;\n });\n\n this.#event_emitter.emit(\"prompt_send\", { message: prompt_message }, this);\n this.#set_state(\"awaiting_response\");\n\n policy_result = await Promise.race([\n result_promise,\n new Promise<undefined>((resolve) => {\n const on_state_change = ({ current }: ChangeEvent<ConversationState>) => {\n if (current === \"stopping\") {\n stream_listener[Symbol.dispose]();\n resolve(undefined);\n } else if (current === \"disposed\") {\n stream_listener[Symbol.dispose]();\n resolve(undefined);\n } else if (current === \"streaming_response\") {\n this.off(\"state_change\", on_state_change);\n }\n };\n this.on(\"state_change\", on_state_change);\n }),\n ]);\n request_id = request_id ?? crypto.randomUUID();\n result = {\n message: prompt_message,\n request_id,\n };\n if (policy_result) {\n if (!policy_result.result) {\n throw policy_result.error;\n }\n result = { ...result, ...policy_result.value };\n this.#event_emitter.emit(\"request_success\", result, policy_result.metadata ?? {}, this);\n } else {\n if (this.#state !== \"disposed\") {\n this.#set_state(\"idle\");\n }\n }\n } catch (error) {\n this.#event_emitter.emit(\n \"request_error\",\n { request_id, message: prompt_message, error },\n {},\n this,\n );\n if (this.#state !== \"disposed\") {\n this.#set_state(\"idle\");\n }\n }\n return result;\n }\n\n /**\n * Registers a one-time event listener.\n *\n * @template E - The event name type.\n * @param event_name - The name of the event to listen for.\n * @param listener - The callback function to invoke when the event occurs.\n */\n once<E extends keyof ConversationEvents>(\n event_name: E,\n listener: E extends keyof ConversationEvents ? (...arg: ConversationEvents[E]) => void : never,\n ): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.#event_emitter as any).once(event_name, listener);\n }\n\n /**\n * Registers a persistent event listener.\n *\n * @template E - The event name type.\n * @param event_name - The name of the event to listen for.\n * @param listener - The callback function to invoke when the event occurs.\n */\n on<E extends keyof ConversationEvents>(\n event_name: E,\n listener: E extends keyof ConversationEvents ? (...arg: ConversationEvents[E]) => void : never,\n ): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.#event_emitter as any).on(event_name, listener);\n }\n\n /**\n * Removes an event listener.\n *\n * @template E - The event name type.\n * @param event_name - The name of the event.\n * @param listener - The callback function to remove.\n */\n off<E extends keyof ConversationEvents>(\n event_name: E,\n listener: E extends keyof ConversationEvents ? (...arg: ConversationEvents[E]) => void : never,\n ): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.#event_emitter as any).off(event_name, listener);\n }\n\n /**\n * Cancels an in-progress model response.\n *\n * Transitions the conversation to the \"stopping\" state, which triggers\n * cancellation of the underlying request.\n */\n cancel_response() {\n if (this.state === \"idle\" || this.state === \"disposed\") {\n throw new Error(\"invalid state\");\n }\n this.#set_state(\"stopping\");\n }\n\n /**\n * Clears all messages from the conversation history.\n *\n * Can only be called when the conversation is idle.\n */\n clear(): void {\n if (this.state !== \"idle\") {\n throw new Error(\"invalid state\");\n }\n this.#messages = [];\n this.#set_state(\"idle\");\n }\n\n /**\n * Loads messages into the conversation history.\n *\n * @param messages - The messages to load.\n */\n load(messages: Message[]) {\n if (this.state !== \"idle\") {\n throw new Error(\"invalid state\");\n }\n this.#messages = [...messages.map((m) => Object.freeze({ ...m }))];\n }\n\n /**\n * Creates a child conversation that inherits configuration from this conversation.\n *\n * Child events are propagated to the parent as \"child_event\" events.\n *\n * @param fork_session - Whether to copy the current message history to the child.\n * @param id - Optional custom ID for the child conversation.\n * @param system_prompt - Optional system prompt override for the child.\n * @param is_checkpoint - Whether this child is a checkpoint summarization session.\n * @returns The newly created child conversation.\n */\n spawn_child(\n fork_session?: boolean,\n id?: string,\n system_prompt?: string,\n is_checkpoint?: boolean,\n ) {\n const child = new Conversation(\n this.#provider.clone(),\n this.#policy,\n this.#context_transformer,\n this.#summarization_strategy,\n );\n if (id) {\n child.id = id;\n }\n if (system_prompt) {\n child.system = system_prompt;\n }\n if (fork_session) {\n child.load(this.#messages);\n }\n if (is_checkpoint) {\n child.#is_checkpoint = true;\n }\n this.#attach_child_event(child, \"state_change\");\n this.#attach_child_event(child, \"checkpoint_begin\");\n this.#attach_child_event(child, \"checkpoint_complete\");\n this.#attach_child_event(child, \"prompt_send\");\n this.#attach_child_event(child, \"message_start\");\n this.#attach_child_event(child, \"message_update\");\n this.#attach_child_event(child, \"message_complete\");\n this.#attach_child_event(child, \"content_start\");\n this.#attach_child_event(child, \"content_update\");\n this.#attach_child_event(child, \"content_complete\");\n this.#attach_child_event(child, \"request_success\");\n this.#attach_child_event(child, \"request_error\");\n this.#attach_child_event(child, \"before_request\");\n this.#attach_child_event(child, \"raw_request\");\n this.#attach_child_event(child, \"raw_response\");\n this.#attach_child_event(child, \"raw_stream\");\n this.#attach_child_event(child, \"create_child\");\n this.#attach_child_event(child, \"child_event\");\n this.#attach_child_event(child, \"lifecycle_error\");\n this.#attach_child_event(child, \"dispose\");\n\n this.#event_emitter.emit(\"create_child\", child, this);\n\n return child;\n }\n\n /**\n * Creates a checkpoint summarizing the conversation so far.\n *\n * Spawns an ephemeral child conversation, sends the checkpoint prompt,\n * and stores the resulting summary as the new checkpoint state.\n *\n * Requires a CheckpointContextTransformer (or composite that includes one)\n * in the context transformer pipeline for the checkpoint state to take effect\n * on subsequent prompts.\n *\n * @param config - Optional checkpoint configuration.\n * @returns The new checkpoint state.\n */\n async checkpoint(config?: CheckpointConfig): Promise<CheckpointState> {\n if (this.state !== \"idle\") {\n throw new Error(\"invalid state\");\n }\n if (this.#messages.length === 0) {\n throw new Error(\"no messages to checkpoint\");\n }\n\n const messages_since = this.#get_messages_since_checkpoint();\n if (messages_since.length === 0) {\n throw new Error(\"no new messages since last checkpoint\");\n }\n const prompt_messages = this.#summarization_strategy.build_prompt({\n session_id: this.#id,\n messages: messages_since,\n previous_checkpoint: this.#checkpoint_state,\n system: this.#system,\n context: config?.context,\n });\n\n const child = this.spawn_child(false, undefined, undefined, true);\n this.#event_emitter.emit(\"checkpoint_begin\", child, this);\n try {\n if (prompt_messages.length > 1) {\n child.load(prompt_messages.slice(0, -1));\n }\n\n const last = prompt_messages[prompt_messages.length - 1];\n if (last.role !== \"user\") {\n throw new Error(\"checkpoint prompt strategy must return a user message last\");\n }\n const response_promise = new Promise<AssistantMessage>((resolve, reject) => {\n child.once(\"message_complete\", ({ message }) => resolve(message));\n child.once(\"request_error\", ({ error }) =>\n reject(error instanceof Error ? error : new Error(String(error))),\n );\n });\n\n await child.send_message(last.content);\n const response = await response_promise;\n\n const summary = response.content\n .filter((c): c is TextContent => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n\n if (!summary) {\n throw new Error(\"checkpoint produced an empty summary\");\n }\n\n const boundary = this.#messages[this.#messages.length - 1];\n if (!boundary.id) {\n throw new Error(\"boundary message has no id\");\n }\n\n const state: CheckpointState = {\n message_id: boundary.id,\n summary,\n };\n\n this.#checkpoint_state = state;\n this.#event_emitter.emit(\"checkpoint_complete\", state, this);\n return state;\n } finally {\n if (child.state !== \"disposed\") {\n child[Symbol.dispose]();\n }\n }\n }\n\n #get_messages_since_checkpoint(): Readonly<Message>[] {\n const checkpointState = this.#checkpoint_state;\n if (!checkpointState) {\n return [...this.#messages];\n }\n const idx = this.#messages.findIndex((m) => m.id === checkpointState.message_id);\n if (idx === -1) {\n return [...this.#messages];\n }\n return this.#messages.slice(idx + 1);\n }\n\n #set_state(value: ConversationState) {\n if (this.#state === \"disposed\" || value === \"disposed\") {\n throw new Error(\"invalid state\");\n }\n if (this.#state !== value) {\n const previous = this.#state;\n this.#state = value;\n this.#event_emitter.emit(\n \"state_change\",\n {\n current: value,\n previous,\n },\n this,\n );\n }\n }\n\n async #get_prompt_context(messages: Message[]): Promise<Message[]> {\n for (const t of this.#provider.context_transformers ?? []) {\n if (t.transform_prompt) {\n messages = await t.transform_prompt(messages);\n }\n }\n const context: TransformContext = { checkpoint: this.#checkpoint_state };\n return await this.#context_transformer.transform_prompt(messages, context);\n }\n\n #attach_child_event(child: Conversation, event_name: keyof ConversationEvents) {\n const handler = (...args: unknown[]) => {\n this.#event_emitter.emit(\n \"child_event\",\n {\n event_name,\n event_args: args,\n } as ConversationEvents[\"child_event\"][0],\n this,\n );\n };\n child.on(event_name, handler);\n child.once(\"dispose\", () => setImmediate(() => child.off(event_name, handler)));\n }\n}\n\nfunction identify_message<T extends Partial<Message>>(message: T): T {\n const content = message.content?.map(identify_content);\n const id =\n message.id ??\n crypto\n .createHash(\"sha1\")\n .update(JSON.stringify({ ...message, content }))\n .digest(\"hex\");\n return {\n timestamp: Date.now(),\n ...message,\n content,\n id,\n } as T;\n}\n\nfunction identify_content<T extends Partial<Content>>(content: T): T {\n const id = content.id ?? crypto.createHash(\"sha1\").update(JSON.stringify(content)).digest(\"hex\");\n return {\n timestamp: Date.now(),\n ...content,\n id,\n } as T;\n}\n","import type { AssistantMessage, Message } from \"../conversations/index.ts\";\nimport type { ContextTransformer, TransformContext } from \"./types.ts\";\n\n/**\n * Context transformer that trims pre-checkpoint messages and inserts\n * the checkpoint summary as a synthetic first user message. The boundary\n * message (an assistant response) is retained as the natural response to\n * the summary, maintaining proper message alternation.\n */\nexport class CheckpointContextTransformer implements ContextTransformer {\n /**\n * Replaces all messages before the checkpoint boundary with a synthetic user\n * message containing the checkpoint summary. Messages after the boundary are\n * kept intact. Returns messages unchanged if no checkpoint is active.\n */\n async transform_prompt(messages: Message[], context?: TransformContext): Promise<Message[]> {\n const checkpoint = context?.checkpoint;\n if (!checkpoint) {\n return messages;\n }\n\n const boundary = messages.findIndex((m) => m.id === checkpoint.message_id);\n if (boundary === -1) {\n return messages;\n }\n\n const summary_message: Message = {\n role: \"user\",\n timestamp: Date.now(),\n content: [{ type: \"text\", timestamp: Date.now(), text: checkpoint.summary }],\n };\n\n const boundary_message = messages[boundary];\n if (boundary_message.role === \"user\") {\n return [summary_message, ...messages.slice(boundary + 1)];\n }\n return [summary_message, ...messages.slice(boundary)];\n }\n\n /** No-op. Returns the message unchanged. */\n transform_completion(message: AssistantMessage): Promise<AssistantMessage> {\n return Promise.resolve(message);\n }\n}\n","import { AssistantMessage, Message } from \"../conversations/index.ts\";\nimport { ContextTransformer, TransformContext } from \"./types.ts\";\n\n/**\n * Combines multiple context transformers into a single transformation pipeline.\n *\n * Transformers are applied in the order provided.\n */\nexport class CompositeContextTransformer implements ContextTransformer {\n readonly #transformers: ContextTransformer[];\n\n /**\n * Creates a new composite context transformer.\n *\n * @param transformers - The transformers to compose.\n */\n constructor(transformers: ContextTransformer[]) {\n this.#transformers = transformers;\n }\n\n /**\n * Transforms prompt messages by applying all transformers in sequence.\n *\n * @param messages - The messages to transform.\n * @returns A promise that resolves to the transformed messages.\n */\n async transform_prompt(messages: Message[], context?: TransformContext): Promise<Message[]> {\n for (const transformer of this.#transformers) {\n messages = await transformer.transform_prompt(messages, context);\n }\n return messages;\n }\n\n /**\n * Transforms a completion message by applying all transformers in sequence.\n *\n * @param message - The assistant message to transform.\n * @returns A promise that resolves to the transformed message.\n */\n async transform_completion(message: AssistantMessage): Promise<AssistantMessage> {\n for (const transformer of this.#transformers) {\n message = await transformer.transform_completion(message);\n }\n return message;\n }\n}\n","import { AssistantMessage, Message } from \"../conversations/index.ts\";\nimport { ContextTransformer } from \"./types.ts\";\n\n/**\n * Context transformer that removes unreferenced tool invocations from message history.\n *\n * Filters out tool content blocks that don't have a corresponding tool_result,\n * reducing context size when tools were invoked but their results are no longer\n * relevant to the conversation.\n */\nexport class ToolContextTransformer implements ContextTransformer {\n /**\n * Transforms prompt messages by removing unreferenced tool invocations.\n *\n * @param messages - The messages to transform.\n * @returns A promise that resolves to the transformed messages.\n */\n transform_prompt(messages: Message[]) {\n const tool_ids: string[] = [];\n const message_context: Message[] = [];\n\n for (const message of messages.toReversed()) {\n tool_ids.push(\n ...message.content.filter((c) => c.type === \"tool_result\").map((c) => c.tool_request_id),\n );\n const cleaned_message = {\n ...message,\n content: message.content.filter(\n (c) => c.type !== \"tool\" || tool_ids.includes(c.tool_request_id),\n ),\n };\n if (cleaned_message.content.length) {\n message_context.unshift(cleaned_message as Message);\n } else if (message.role === \"assistant\") {\n message_context.unshift({\n ...message,\n content: [{ type: \"text\", text: \"\" }],\n } as Message);\n } else if (message.role === \"user\") {\n message_context.unshift({\n ...message,\n content: [{ type: \"text\", text: \"\" }],\n } as Message);\n }\n }\n return Promise.resolve(message_context);\n }\n\n /**\n * Returns the completion message unchanged.\n *\n * @param message - The assistant message to pass through.\n * @returns A promise that resolves to the same message.\n */\n transform_completion(message: AssistantMessage) {\n return Promise.resolve(message);\n }\n}\n","import { CancellationToken } from \"../utils/async.ts\";\n\n/**\n * Represents a successful policy execution.\n *\n * @template T - The type of the result value.\n */\nexport interface PolicySuccessResult<T> {\n result: true;\n /** Metadata about the policy execution. */\n metadata: object;\n /** The value returned by the wrapped function. */\n value: T;\n}\n\n/**\n * Represents a failed policy execution.\n */\nexport interface PolicyErrorResult {\n result: false;\n /** Metadata about the policy execution. */\n metadata: object;\n /** The error that occurred. */\n error: unknown;\n}\n\n/**\n * Union of all possible policy execution results.\n *\n * @template T - The type of the success result value.\n */\nexport type PolicyResult<T> = PolicySuccessResult<T> | PolicyErrorResult;\n\n/**\n * Base class for all policies.\n *\n * Policies wrap function execution to provide cross-cutting concerns like\n * retries, rate limiting, and token budget management.\n */\nexport abstract class Policy {\n /**\n * Executes a function with this policy applied.\n *\n * @template TResult - The return type of the function.\n * @template TArgs - The argument types of the function.\n * @param cancellation_token - Token for cancelling the operation.\n * @param fn - The function to execute.\n * @param args - Arguments to pass to the function.\n * @returns A promise that resolves to the policy result.\n */\n abstract execute<TResult, TArgs extends unknown[]>(\n cancellation_token: CancellationToken,\n fn: (...args: TArgs) => Promise<TResult>,\n ...args: TArgs\n ): Promise<PolicyResult<TResult>>;\n}\n","import { CancellationToken } from \"../utils/async.ts\";\nimport { Policy, PolicyResult } from \"./types.ts\";\n\n/**\n * Policy that performs no special operations.\n *\n * Simply executes the provided function with cancellation support.\n */\nexport class NoopPolicy extends Policy {\n /**\n * Executes a function with no additional policy logic.\n *\n * @template TResult - The return type of the function.\n * @template TArgs - The argument types of the function.\n * @param cancellation_token - Token for cancelling the operation.\n * @param fn - The function to execute.\n * @param args - Arguments to pass to the function.\n * @returns A promise that resolves to the policy result.\n */\n async execute<TResult, TArgs extends unknown[]>(\n cancellation_token: CancellationToken,\n fn: (...args: TArgs) => Promise<TResult>,\n ...args: TArgs\n ): Promise<PolicyResult<TResult>> {\n try {\n cancellation_token.throw_if_cancellation_requested();\n return {\n result: true,\n value: await Promise.race([fn(...args), cancellation_token.await_cancellation()]),\n metadata: { policy: NoopPolicy.name },\n };\n } catch (error) {\n return {\n result: false,\n error,\n metadata: { policy: NoopPolicy.name },\n };\n }\n }\n}\n","import { CancellationToken } from \"../utils/async.ts\";\nimport { NoopPolicy } from \"./noop-policy.ts\";\nimport { Policy, PolicyResult } from \"./types.ts\";\n\n/**\n * Policy that combines multiple policies into a single execution chain.\n *\n * Policies are applied in the order provided, with each policy wrapping\n * the execution of the next.\n */\nexport class CompositePolicy extends Policy {\n readonly #policies: Policy[];\n\n /**\n * Creates a new composite policy.\n *\n * @param policies - The policies to compose. If empty, uses a NoopPolicy.\n */\n constructor(...policies: Policy[]) {\n super();\n this.#policies = policies.length > 0 ? policies : [new NoopPolicy()];\n }\n\n /**\n * Executes a function with all composed policies applied.\n *\n * @template TResult - The return type of the function.\n * @template TArgs - The argument types of the function.\n * @param cancellation_token - Token for cancelling the operation.\n * @param fn - The function to execute.\n * @param args - Arguments to pass to the function.\n * @returns A promise that resolves to the policy result.\n */\n async execute<TResult, TArgs extends unknown[]>(\n cancellation_token: CancellationToken,\n fn: (...args: TArgs) => Promise<TResult>,\n ...args: TArgs\n ): Promise<PolicyResult<TResult>> {\n let current_fn = fn;\n const policy_metadata: Record<string, unknown> = {};\n const execution_order: string[] = [];\n\n for (let i = this.#policies.length - 1; i >= 0; i--) {\n cancellation_token.throw_if_cancellation_requested();\n\n const policy = this.#policies[i];\n const policy_name = `${policy.constructor.name}[${i}]`;\n execution_order.push(policy_name);\n\n const wrapped_fn = current_fn;\n current_fn = async (...wrapped_args: TArgs) => {\n const policy_result = await policy.execute(cancellation_token, wrapped_fn, ...wrapped_args);\n policy_metadata[policy_name] = policy_result.metadata;\n\n if (policy_result.result) {\n return policy_result.value;\n } else {\n throw policy_result.error;\n }\n };\n }\n\n try {\n return {\n result: true,\n value: await current_fn(...args),\n metadata: {\n policy: CompositePolicy.name,\n policies: policy_metadata,\n execution_order: [...execution_order].reverse(),\n policy_count: this.#policies.length,\n },\n };\n } catch (error) {\n return {\n result: false,\n error,\n metadata: {\n policy: CompositePolicy.name,\n policies: policy_metadata,\n execution_order: [...execution_order].reverse(),\n policy_count: this.#policies.length,\n },\n };\n }\n }\n}\n","import EventEmitter from \"node:events\";\n\n/**\n * Token for monitoring and responding to cancellation requests.\n *\n * Provides a way to check if an operation has been cancelled and to\n * register callbacks for when cancellation occurs.\n */\nexport class CancellationToken {\n readonly #source?: CancellationTokenSource;\n\n /**\n * Creates a new cancellation token.\n *\n * @param source - Optional source that controls this token.\n */\n constructor(source?: CancellationTokenSource) {\n this.#source = source;\n }\n\n /**\n * Whether cancellation has been requested.\n */\n get is_cancellation_requested() {\n return !!this.#source?.is_cancelled;\n }\n\n /**\n * Registers a one-time handler for cancellation.\n *\n * @param event - The event name (always \"cancel\").\n * @param handler - The callback to invoke when cancelled.\n */\n once(event: \"cancel\", handler: () => void) {\n this.#source?.once(event, handler);\n }\n\n /**\n * Removes a cancellation handler.\n *\n * @param event - The event name (always \"cancel\").\n * @param handler - The callback to remove.\n */\n off(event: \"cancel\", handler: () => void) {\n this.#source?.off(event, handler);\n }\n\n /**\n * Throws an error if cancellation has been requested.\n */\n throw_if_cancellation_requested() {\n if (this.is_cancellation_requested) {\n throw new OperationCanceledError(this);\n }\n }\n\n /**\n * Creates a promise that rejects when cancellation is requested.\n *\n * @returns A promise that never resolves but rejects on cancellation.\n */\n await_cancellation() {\n return new Promise<never>((_, reject) =>\n this.once(\"cancel\", () => reject(new OperationCanceledError(this))),\n );\n }\n\n /**\n * Creates an empty cancellation token that can never be cancelled.\n *\n * @returns A new cancellation token with no source.\n */\n static empty() {\n return new CancellationToken();\n }\n}\n\n/**\n * Source for creating and controlling cancellation tokens.\n *\n * Allows triggering cancellation for associated tokens.\n */\nexport class CancellationTokenSource {\n readonly #event_emitter = new EventEmitter();\n\n #is_cancelled = false;\n #is_disposed = false;\n #token?: CancellationToken;\n\n /**\n * Disposes the cancellation token source.\n *\n * This method is called automatically when using the `using` keyword.\n */\n [Symbol.dispose]() {\n if (this.#is_disposed) {\n throw new Error(\"invalid state\");\n }\n this.#is_disposed = true;\n this.#event_emitter.removeAllListeners();\n }\n\n /**\n * Gets a cancellation token associated with this source.\n */\n get token() {\n if (!this.#token) {\n this.#token = new CancellationToken(this);\n }\n return this.#token;\n }\n\n /**\n * Whether cancellation has been triggered.\n */\n get is_cancelled() {\n return this.#is_cancelled;\n }\n\n /**\n * Registers a one-time handler for cancellation.\n *\n * @param event - The event name (always \"cancel\").\n * @param handler - The callback to invoke when cancelled.\n */\n once(event: \"cancel\", handler: () => void) {\n if (this.#is_cancelled) {\n throw new OperationCanceledError(new CancellationToken(this));\n }\n if (this.#is_disposed) {\n throw new Error(\"invalid state\");\n }\n this.#event_emitter.once(event, handler);\n }\n\n /**\n * Removes a cancellation handler.\n *\n * @param event - The event name (always \"cancel\").\n * @param handler - The callback to remove.\n */\n off(event: \"cancel\", handler: () => void) {\n this.#event_emitter.off(event, handler);\n }\n\n /**\n * Triggers cancellation for all associated tokens.\n */\n cancel() {\n if (this.#is_cancelled) {\n throw new OperationCanceledError(new CancellationToken(this));\n }\n this.#is_cancelled = true;\n this.#event_emitter.emit(\"cancel\");\n }\n}\n\n/**\n * Error thrown when an operation is cancelled.\n */\nexport class OperationCanceledError extends Error {\n readonly #token: CancellationToken;\n\n /**\n * Creates a new operation cancelled error.\n *\n * @param token - The cancellation token associated with this error.\n */\n constructor(token: CancellationToken) {\n super(\"The operation was cancelled\", { cause: \"cancelled\" });\n this.#token = token;\n }\n\n /**\n * The cancellation token associated with this error.\n */\n get token() {\n return this.#token;\n }\n}\n\n/**\n * Delays execution for a specified time period with cancellation support.\n *\n * @param ms - The number of milliseconds to sleep.\n * @param cancellation_token - Optional token for cancelling the sleep.\n * @returns A promise that resolves after the delay or rejects if cancelled.\n */\nexport function sleep(ms: number, cancellation_token?: CancellationToken): Promise<void> {\n return new Promise((resolve, reject) => {\n if (cancellation_token) {\n const token = cancellation_token;\n const on_cancel = () => {\n clearTimeout(timeout);\n reject(new OperationCanceledError(token));\n };\n const on_timeout = () => {\n token.off(\"cancel\", on_cancel);\n resolve();\n };\n const timeout = setTimeout(on_timeout, ms);\n if (token.is_cancellation_requested) {\n clearTimeout(timeout);\n reject(new OperationCanceledError(token));\n } else {\n token.once(\"cancel\", on_cancel);\n }\n } else {\n setTimeout(resolve, ms);\n }\n });\n}\n\n/**\n * Peeks at the first value from an async generator without consuming it.\n *\n * @template T - The type of values yielded by the generator.\n * @param generator - The async generator to peek.\n * @returns An object containing the peeked value and a new generator that includes it.\n */\nexport async function peek_generator<T>(generator: AsyncGenerator<T>) {\n const iterator = generator[Symbol.asyncIterator]();\n\n let result = await iterator.next();\n\n const wrapper = (async function* () {\n while (true) {\n if (result.done) {\n break;\n }\n yield result.value;\n result = await iterator.next();\n }\n })();\n\n return {\n peeked_value: result.value as T,\n generator: wrapper,\n };\n}\n","import { CancellationToken, sleep } from \"../utils/async.ts\";\nimport { Policy, PolicyErrorResult, PolicyResult } from \"./types.ts\";\n\n/**\n * Configuration options for retry behavior.\n */\nexport interface RetryPolicyOptions {\n /** Maximum number of attempts (including the initial attempt). */\n max_attempts: number;\n /** Initial backoff delay in milliseconds. */\n initial_backoff_ms: number;\n /** Factor by which to multiply the backoff after each retry. */\n backoff_factor: number;\n /** Optional function to determine if an error is retryable. */\n retryable?: (result: PolicyErrorResult) => boolean;\n}\n\nconst RETRYABLE_NETWORK_ERROR_CODES = new Set([\n \"ECONNRESET\",\n \"ECONNREFUSED\",\n \"ECONNABORTED\",\n \"ETIMEDOUT\",\n \"ENETUNREACH\",\n \"EHOSTUNREACH\",\n \"EPIPE\",\n \"EAI_AGAIN\",\n \"UND_ERR_CONNECT_TIMEOUT\",\n \"UND_ERR_SOCKET\",\n]);\n\nconst RETRYABLE_HTTP_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504, 529]);\n\nexport function defaultRetryable(result: PolicyErrorResult): boolean {\n const error = result.error;\n\n if (error !== null && error !== undefined && typeof error === \"object\" && \"status\" in error) {\n const status = (error as { status: unknown }).status;\n if (typeof status === \"number\") {\n return RETRYABLE_HTTP_STATUS_CODES.has(status);\n }\n }\n\n if (error !== null && error !== undefined && typeof error === \"object\") {\n const code = (error as { code?: unknown }).code;\n if (typeof code === \"string\" && RETRYABLE_NETWORK_ERROR_CODES.has(code)) {\n return true;\n }\n const cause = (error as { cause?: unknown }).cause;\n if (cause !== null && cause !== undefined && typeof cause === \"object\") {\n const causeCode = (cause as { code?: unknown }).code;\n if (typeof causeCode === \"string\" && RETRYABLE_NETWORK_ERROR_CODES.has(causeCode)) {\n return true;\n }\n }\n }\n\n if (error instanceof Error) {\n const msg = error.message.toLowerCase();\n if (\n msg.includes(\"timeout\") ||\n msg.includes(\"econnreset\") ||\n msg.includes(\"econnrefused\") ||\n msg.includes(\"socket hang up\") ||\n msg.includes(\"network error\") ||\n msg.includes(\"fetch failed\")\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Policy that retries failed operations with exponential backoff.\n *\n * @template _TResult - The result type of the operation.\n */\nexport class RetryPolicy<_TResult> extends Policy {\n readonly #options: Required<RetryPolicyOptions>;\n\n /**\n * Creates a new retry policy.\n *\n * @param options - The retry configuration options.\n */\n constructor(options: RetryPolicyOptions) {\n super();\n this.#options = { ...options, retryable: options.retryable ?? defaultRetryable };\n }\n\n /**\n * Executes a function with retry logic applied.\n *\n * @template TResult - The return type of the function.\n * @template TArgs - The argument types of the function.\n * @param cancellation_token - Token for cancelling the operation.\n * @param fn - The function to execute.\n * @param args - Arguments to pass to the function.\n * @returns A promise that resolves to the policy result.\n */\n async execute<TResult, TArgs extends unknown[]>(\n cancellation_token: CancellationToken,\n fn: (...args: TArgs) => Promise<TResult>,\n ...args: TArgs\n ): Promise<PolicyResult<TResult>> {\n let attempt = 1;\n let backoff_ms = this.#options.initial_backoff_ms;\n const metadata: Record<string | symbol, unknown> = {\n policy: RetryPolicy.name,\n attempts: 0,\n ...this.#options,\n };\n\n while (true) {\n cancellation_token.throw_if_cancellation_requested();\n try {\n const value = await Promise.race([fn(...args), cancellation_token.await_cancellation()]);\n metadata.attempts = attempt;\n\n return {\n result: true,\n value,\n metadata,\n };\n } catch (error) {\n metadata.attempts = attempt;\n\n const result: PolicyErrorResult = {\n result: false,\n error,\n metadata,\n };\n if (attempt >= this.#options.max_attempts || !this.#options.retryable(result)) {\n return result;\n }\n\n await sleep(backoff_ms, cancellation_token);\n\n metadata.lastError = error;\n metadata.lastBackoffMs = backoff_ms;\n\n backoff_ms *= this.#options.backoff_factor;\n attempt++;\n }\n }\n }\n}\n","import type { Policy } from \"./types.ts\";\nimport { CompositePolicy } from \"./composite-policy.ts\";\nimport { RetryPolicy } from \"./retry-policy.ts\";\n\n/**\n * The default policy used when none is passed to Conversation.\n * A composite that includes retry with exponential backoff. Rate and token limits require attach(conversation) so are not in the default.\n */\nexport function getDefaultPolicy(): Policy {\n return new CompositePolicy(\n new RetryPolicy({\n max_attempts: 3,\n initial_backoff_ms: 1000,\n backoff_factor: 2,\n }),\n );\n}\n","import { StreamReceiver } from \"./types.ts\";\n\n/**\n * Discriminated union of all possible stream events and their payloads.\n */\nexport type StreamListenerPayload = {\n [E in keyof StreamReceiver]: {\n event: E;\n payload: Parameters<StreamReceiver[E]>;\n };\n}[keyof StreamReceiver];\n\n/**\n * Internal utility for converting StreamReceiver callbacks into a single event handler.\n *\n * This class is used internally by Conversation to manage streaming events.\n */\nexport class StreamListener {\n readonly #listener: (payload: StreamListenerPayload) => void | Promise<void>;\n\n #is_disposed = false;\n\n /**\n * Creates a new stream listener.\n *\n * @param listener - The callback to invoke with stream events.\n */\n constructor(listener: (payload: StreamListenerPayload) => void | Promise<void>) {\n this.#listener = listener;\n }\n\n /**\n * Disposes the stream listener.\n *\n * This method is called automatically when using the `using` keyword.\n */\n [Symbol.dispose]() {\n this.#is_disposed = true;\n }\n\n /**\n * Creates a StreamReceiver that forwards all events to the listener.\n *\n * @returns A new stream receiver instance.\n */\n create_receiver() {\n const receiver: StreamReceiver = {\n start_message: (...args) => this.#receive({ event: \"start_message\", payload: args }),\n update_message: (...args) => this.#receive({ event: \"update_message\", payload: args }),\n complete_message: (...args) => this.#receive({ event: \"complete_message\", payload: args }),\n start_content: (...args) => this.#receive({ event: \"start_content\", payload: args }),\n update_content: (...args) => this.#receive({ event: \"update_content\", payload: args }),\n complete_content: (...args) => this.#receive({ event: \"complete_content\", payload: args }),\n error: (...args) => this.#receive({ event: \"error\", payload: args }),\n before_request: (...args) => this.#receive({ event: \"before_request\", payload: args }),\n request_raw: (...args) => this.#receive({ event: \"request_raw\", payload: args }),\n response_raw: (...args) => this.#receive({ event: \"response_raw\", payload: args }),\n stream_raw: (...args) => this.#receive({ event: \"stream_raw\", payload: args }),\n cancel: (...args) => this.#receive({ event: \"cancel\", payload: args }),\n };\n return receiver;\n }\n\n #receive = (payload: StreamListenerPayload) => {\n if (this.#is_disposed) {\n return;\n }\n try {\n const result = this.#listener(payload);\n if (result && typeof result === \"object\" && \"catch\" in result) {\n (result as Promise<void>).catch((error) => {\n if (!this.#is_disposed && payload.event !== \"error\") {\n this.#listener({ event: \"error\", payload: [error] });\n }\n });\n }\n } catch (error) {\n if (!this.#is_disposed && payload.event !== \"error\") {\n this.#listener({ event: \"error\", payload: [error] });\n }\n }\n };\n}\n","import { EventEmitter } from \"node:events\";\n\nimport { Conversation } from \"./conversation.ts\";\nimport { ConversationEvents, Usage } from \"./types.ts\";\n\n/**\n * Statistics about token usage.\n */\nexport interface TokenStats {\n /** Token usage from the most recent request. */\n last_request: {\n /** Input tokens in the last request. */\n input: number;\n /** Output tokens in the last request. */\n output: number;\n };\n /** Cumulative token usage across all requests. */\n total: {\n /** Total input tokens consumed. */\n input: number;\n /** Total output tokens generated. */\n output: number;\n };\n}\n\n/**\n * Events emitted by the TokenTracker.\n */\ninterface TokenTrackerEvents {\n /** Emitted when token statistics are updated. */\n stats_update: [TokenStats];\n}\n\n/**\n * Tracks token usage for a conversation and its children.\n *\n * Automatically monitors conversation events to accumulate token statistics.\n */\nexport class TokenTracker {\n readonly #event_emitter = new EventEmitter<TokenTrackerEvents>();\n readonly #conversation: Conversation;\n\n #stats: TokenStats = {\n last_request: {\n input: 0,\n output: 0,\n },\n total: {\n input: 0,\n output: 0,\n },\n };\n\n /**\n * Creates a new token tracker.\n *\n * @param conversation - The conversation to track.\n */\n constructor(conversation: Conversation) {\n this.#conversation = conversation;\n\n conversation.on(\"message_complete\", this.#handle_event_with_usage);\n conversation.on(\"child_event\", this.#handle_child_event);\n }\n\n /**\n * Disposes the token tracker and removes event listeners.\n *\n * This method is called automatically when using the `using` keyword.\n */\n [Symbol.dispose](): void {\n this.#conversation.off(\"message_complete\", this.#handle_event_with_usage);\n this.#conversation.off(\"child_event\", this.#handle_child_event);\n this.#event_emitter.removeAllListeners();\n }\n\n /**\n * The current token statistics.\n */\n public get stats(): Readonly<TokenStats> {\n return Object.freeze({ ...this.#stats });\n }\n\n /**\n * Registers an event listener for statistics updates.\n *\n * @param event - The event name (always \"stats_update\").\n * @param listener - The callback to invoke when statistics update.\n */\n public on(event: \"stats_update\", listener: (stats: TokenStats) => void): void {\n this.#event_emitter.on(event, listener);\n }\n\n /**\n * Removes an event listener for statistics updates.\n *\n * @param event - The event name (always \"stats_update\").\n * @param listener - The callback to remove.\n */\n public off(event: \"stats_update\", listener: (stats: TokenStats) => void): void {\n this.#event_emitter.off(event, listener);\n }\n\n #handle_event_with_usage = ({ usage }: { usage: Usage }) => {\n this.#process_usage(usage);\n };\n\n #handle_child_event = (event_data: ConversationEvents[\"child_event\"][0]) => {\n const { event_name, event_args } = event_data;\n\n if (event_name === \"message_complete\") {\n const [event_data] = event_args;\n if (event_data && \"usage\" in event_data) {\n this.#process_usage(event_data.usage);\n }\n }\n\n if (event_name === \"child_event\") {\n const [child_event_data] = event_args;\n this.#handle_child_event(child_event_data);\n }\n };\n\n #process_usage = (usage: Usage) => {\n if (usage) {\n const input_tokens = usage.input_tokens || 0;\n const output_tokens = usage.output_tokens || 0;\n\n this.#stats = {\n last_request: {\n input: input_tokens,\n output: output_tokens,\n },\n total: {\n input: this.stats.total.input + input_tokens,\n output: this.stats.total.output + output_tokens,\n },\n };\n\n this.#event_emitter.emit(\"stats_update\", this.stats);\n }\n };\n}\n","import { AssistantMessage, Message } from \"../conversations/index.ts\";\nimport { ContextTransformer } from \"./types.ts\";\n\n/**\n * Context transformer that performs no transformations.\n *\n * Returns messages unchanged.\n */\nexport class NoopContextTransformer implements ContextTransformer {\n /**\n * Returns the prompt messages unchanged.\n *\n * @param messages - The messages to pass through.\n * @returns A promise that resolves to the same messages.\n */\n transform_prompt(messages: Message[]): Promise<Message[]> {\n return Promise.resolve(messages);\n }\n\n /**\n * Returns the completion message unchanged.\n *\n * @param message - The assistant message to pass through.\n * @returns A promise that resolves to the same message.\n */\n transform_completion(message: AssistantMessage) {\n return Promise.resolve(message);\n }\n}\n","import { Conversation, ConversationEvents } from \"../conversations/index.ts\";\nimport { CancellationToken, sleep } from \"../utils/async.ts\";\nimport { Policy, PolicyResult } from \"./types.ts\";\n\n/**\n * Configuration options for rate limiting.\n */\nexport type RateLimitPolicyOptions = {\n /** Maximum number of requests allowed in the time period. */\n limit: number;\n /** Time period in milliseconds. */\n period_ms: number;\n};\n\n/**\n * Policy that enforces rate limits on operations.\n *\n * Tracks request timestamps and delays execution when the rate limit is exceeded.\n */\nexport class RateLimitPolicy extends Policy {\n readonly #options: RateLimitPolicyOptions;\n\n #requests: number[] = [];\n\n /**\n * Creates a new rate limit policy.\n *\n * @param options - The rate limiting configuration.\n */\n constructor(options: RateLimitPolicyOptions) {\n super();\n this.#options = options;\n }\n\n /**\n * Attaches this policy to a conversation to track its requests.\n *\n * @param conversation - The conversation to monitor.\n */\n attach(conversation: Conversation) {\n conversation.on(\"request_success\", this.#on_request_success);\n conversation.on(\"child_event\", this.#on_child_event);\n conversation.once(\"dispose\", () => {\n conversation.off(\"request_success\", this.#on_request_success);\n conversation.off(\"child_event\", this.#on_child_event);\n });\n }\n\n /**\n * Executes a function with rate limiting applied.\n *\n * @template TResult - The return type of the function.\n * @template TArgs - The argument types of the function.\n * @param cancellation_token - Token for cancelling the operation.\n * @param fn - The function to execute.\n * @param args - Arguments to pass to the function.\n * @returns A promise that resolves to the policy result.\n */\n async execute<TResult, TArgs extends unknown[]>(\n cancellation_token: CancellationToken,\n fn: (...args: TArgs) => Promise<TResult>,\n ...args: TArgs\n ): Promise<PolicyResult<TResult>> {\n const now = Date.now();\n\n this.#requests = this.#requests.filter(\n (timestamp) => now - timestamp < this.#options.period_ms,\n );\n\n const current_usage = this.#requests.length;\n\n const metadata: Record<string | symbol, unknown> = {\n policy: RateLimitPolicy.name,\n limit: this.#options.limit,\n period_ms: this.#options.period_ms,\n current_usage,\n };\n\n const wait_time = this.#calculate_wait_time(\n current_usage,\n this.#options.limit,\n this.#options.period_ms,\n );\n\n if (wait_time > 0) {\n metadata.wait_time_ms = wait_time;\n await sleep(wait_time, cancellation_token);\n }\n\n cancellation_token.throw_if_cancellation_requested();\n try {\n const value = await Promise.race([fn(...args), cancellation_token.await_cancellation()]);\n return {\n result: true,\n value,\n metadata,\n };\n } catch (error) {\n return {\n result: false,\n error: error as Error,\n metadata,\n };\n }\n }\n\n #calculate_wait_time(current_usage: number, limit: number, period_ms: number): number {\n if (current_usage < limit) {\n return 0;\n }\n const requests_over_limit = current_usage - limit + 1;\n const time_per_request = period_ms / limit;\n return requests_over_limit * time_per_request;\n }\n\n #on_request_success = () => {\n const now = Date.now();\n this.#requests.push(now);\n };\n\n #on_child_event = (event_data: ConversationEvents[\"child_event\"][0]) => {\n const { event_name, event_args } = event_data;\n\n if (event_name === \"request_success\") {\n this.#on_request_success();\n }\n\n if (event_name === \"child_event\") {\n const [child_event_data] = event_args;\n this.#on_child_event(child_event_data);\n }\n };\n}\n","import {\n Conversation,\n ConversationEvents,\n FullMessageCompletionEvent,\n} from \"../conversations/index.ts\";\nimport { CancellationToken, sleep } from \"../utils/async.ts\";\nimport { Policy, PolicyResult } from \"./types.ts\";\n\n/**\n * Record of token usage for a single request.\n */\nexport interface TokenRecord {\n /** When this usage occurred. */\n timestamp: number;\n /** Number of input tokens consumed. */\n input_tokens: number;\n /** Number of output tokens generated. */\n output_tokens: number;\n}\n\n/**\n * Base options for token limit policy.\n */\ntype BaseOptions = {\n /** Time period in milliseconds for the token budget. */\n period_ms: number;\n};\n\n/**\n * Options for separate input and output token limits.\n */\ntype InputOutputTokenOptions = {\n /** Maximum input tokens allowed per period. */\n input_tokens_per_period: number;\n /** Maximum output tokens allowed per period. */\n output_tokens_per_period: number;\n};\n\n/**\n * Options for a combined total token limit.\n */\ntype TotalTokenOptions = {\n /** Maximum total tokens (input + output) allowed per period. */\n total_tokens_per_period: number;\n};\n\n/**\n * Configuration options for token limit policy.\n *\n * Can specify either separate input/output limits or a combined total limit.\n */\nexport type TokenLimitPolicyOptions = BaseOptions & (InputOutputTokenOptions | TotalTokenOptions);\n\n/**\n * Policy that enforces token usage limits over a time period.\n *\n * Tracks token consumption and delays execution when limits are exceeded.\n */\nexport class TokenLimitPolicy extends Policy {\n readonly #options: TokenLimitPolicyOptions;\n\n #usage: TokenRecord[] = [];\n\n /**\n * Creates a new token limit policy.\n *\n * @param options - The token limit configuration.\n */\n constructor(options: TokenLimitPolicyOptions) {\n super();\n this.#options = options;\n }\n\n /**\n * Executes a function with token limit enforcement applied.\n *\n * @template TResult - The return type of the function.\n * @template TArgs - The argument types of the function.\n * @param cancellation_token - Token for cancelling the operation.\n * @param fn - The function to execute.\n * @param args - Arguments to pass to the function.\n * @returns A promise that resolves to the policy result.\n */\n async execute<TResult, TArgs extends unknown[]>(\n cancellation_token: CancellationToken,\n fn: (...args: TArgs) => Promise<TResult>,\n ...args: TArgs\n ): Promise<PolicyResult<TResult>> {\n const now = Date.now();\n this.#usage = this.#usage.filter((record) => now - record.timestamp < this.#options.period_ms);\n\n const input_tokens = this.#usage.reduce((sum, record) => sum + record.input_tokens, 0);\n const output_tokens = this.#usage.reduce((sum, record) => sum + record.output_tokens, 0);\n const total_tokens = input_tokens + output_tokens;\n\n let wait_time: number;\n\n const options = this.#options;\n\n if (\"total_tokens_per_period\" in options) {\n const total_token_wait_time = this.#calculate_wait_time(\n total_tokens,\n options.total_tokens_per_period,\n );\n wait_time = total_token_wait_time;\n } else {\n const input_token_wait_time = this.#calculate_wait_time(\n input_tokens,\n options.input_tokens_per_period,\n );\n const output_token_wait_time = this.#calculate_wait_time(\n output_tokens,\n options.output_tokens_per_period,\n );\n wait_time = Math.max(input_token_wait_time, output_token_wait_time);\n }\n\n const metadata: Record<string | symbol, unknown> = {\n policy: TokenLimitPolicy.name,\n ...this.#options,\n current_period_start: now - this.#options.period_ms,\n current_period_end: now,\n input_tokens,\n output_tokens,\n total_tokens,\n wait_time,\n recent_usage_count: this.#usage.length,\n recent_usage: this.#usage,\n };\n\n if (\"total_tokens_per_period\" in options) {\n metadata.total_token_wait_time = wait_time;\n } else {\n metadata.input_token_wait_time = this.#calculate_wait_time(\n input_tokens,\n options.input_tokens_per_period,\n );\n metadata.output_token_wait_time = this.#calculate_wait_time(\n output_tokens,\n options.output_tokens_per_period,\n );\n }\n\n if (wait_time > 0) {\n metadata.wait_time_ms = wait_time;\n await sleep(wait_time, cancellation_token);\n }\n cancellation_token.throw_if_cancellation_requested();\n try {\n const value = await Promise.race([fn(...args), cancellation_token.await_cancellation()]);\n return {\n result: true,\n value,\n metadata,\n };\n } catch (error) {\n return {\n result: false,\n error,\n metadata,\n };\n }\n }\n\n /**\n * Attaches this policy to a conversation to track its token usage.\n *\n * @param conversation - The conversation to monitor.\n */\n attach(conversation: Conversation) {\n conversation.on(\"message_complete\", this.#on_message_complete);\n conversation.on(\"child_event\", this.#on_child_event);\n conversation.once(\"dispose\", () => {\n conversation.off(\"message_complete\", this.#on_message_complete);\n conversation.off(\"child_event\", this.#on_child_event);\n });\n }\n\n #on_message_complete = ({ usage }: FullMessageCompletionEvent) => {\n const input_tokens = usage?.input_tokens || 0;\n const output_tokens = usage?.output_tokens || 0;\n this.#usage.push({\n timestamp: Date.now(),\n input_tokens,\n output_tokens,\n });\n };\n\n #on_child_event = (event_data: ConversationEvents[\"child_event\"][0]) => {\n const { event_name, event_args } = event_data;\n\n if (event_name === \"message_complete\") {\n const [event_data] = event_args;\n if (event_data) {\n this.#on_message_complete(event_data);\n }\n }\n\n if (event_name === \"child_event\") {\n const [child_event_data] = event_args;\n this.#on_child_event(child_event_data);\n }\n };\n\n #calculate_wait_time(current_tokens: number, tokens_per_period: number): number {\n if (current_tokens < tokens_per_period) {\n return 0;\n }\n const now = Date.now();\n const oldest = this.#usage[0];\n if (!oldest) {\n return 0;\n }\n return Math.max(0, oldest.timestamp + this.#options.period_ms - now);\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { EventEmitter } from \"node:events\";\nimport { setImmediate } from \"node:timers/promises\";\n\nimport {\n AssistantContent,\n AssistantMessage,\n Conversation,\n FullMessageCompletionEvent,\n Message,\n PromptRequestData,\n ToolResultContent,\n} from \"../conversations/index.ts\";\nimport type { ToolContext, ToolClass } from \"../tools/types.ts\";\nimport { WorkflowEndEvent, WorkflowEvents } from \"./types.ts\";\nimport { WorkflowState } from \"./index.ts\";\nimport { UserMessage } from \"../conversations/types.ts\";\n\n/**\n * Manages an agentic workflow with automatic tool execution.\n *\n * A Workflow wraps a Conversation and automatically executes tools requested\n * by the model, continuing the conversation until completion or error.\n */\nexport class Workflow {\n readonly #event_emitter: EventEmitter<WorkflowEvents>;\n readonly #conversation: Conversation;\n readonly #context_data: Record<string, unknown>;\n readonly #parent?: Workflow;\n readonly #messages: Readonly<Message>[] = [];\n readonly #queued_messages: string[] = [];\n\n #id: string = randomUUID();\n #state: WorkflowState = \"idle\";\n #tool_context: ToolContext | undefined;\n\n /**\n * Creates a new workflow instance.\n *\n * @param conversation - The conversation to manage.\n * @param options - Optional configuration.\n * @param options.context_data - Custom data to pass to tools via ToolContext.\n * @param options.parent - Parent workflow if this is a child workflow.\n */\n constructor(\n conversation: Conversation,\n options?: { context_data?: Record<string, unknown>; parent?: Workflow },\n ) {\n this.#event_emitter = new EventEmitter<WorkflowEvents>();\n this.#event_emitter.setMaxListeners(0);\n\n this.#conversation = conversation;\n this.#context_data = options?.context_data ?? {};\n this.#parent = options?.parent;\n\n this.#conversation.on(\"prompt_send\", this.#on_prompt_send);\n this.#conversation.on(\"message_complete\", this.#on_message_complete);\n this.#conversation.on(\"request_error\", this.#on_request_error);\n this.#conversation.once(\"dispose\", this.#on_conversation_dispose);\n this.#parent?.once(\"workflow_end\", this.#on_parent_workflow_end);\n }\n\n /**\n * The unique identifier for this workflow.\n */\n get id(): string {\n return this.#id;\n }\n set id(value: string) {\n this.#id = value;\n }\n\n /**\n * The current state of the workflow.\n */\n get state() {\n return this.#state;\n }\n\n /**\n * The conversation being managed by this workflow.\n */\n get conversation() {\n return this.#conversation;\n }\n\n /**\n * The parent workflow, if this is a child workflow.\n */\n get parent() {\n return this.#parent;\n }\n\n /**\n * The message history tracked by this workflow.\n */\n get messages() {\n return Object.freeze([...this.#messages]);\n }\n\n /**\n * Messages queued for sending after the current response completes.\n */\n get queued_messages() {\n return [...this.#queued_messages];\n }\n\n /**\n * Disposes the workflow and releases all resources.\n *\n * This method is called automatically when using the `using` keyword.\n */\n [Symbol.dispose]() {\n this.#conversation.off(\"prompt_send\", this.#on_prompt_send);\n this.#conversation.off(\"message_complete\", this.#on_message_complete);\n this.#conversation.off(\"request_error\", this.#on_request_error);\n this.#conversation.off(\"dispose\", this.#on_conversation_dispose);\n this.#parent?.off(\"workflow_end\", this.#on_parent_workflow_end);\n\n this.#event_emitter.emit(\"dispose\", this);\n this.#set_state(\"disposed\");\n this.#event_emitter.removeAllListeners();\n }\n\n /**\n * Registers a one-time event listener.\n *\n * @template E - The event name type.\n * @param event - The name of the event to listen for.\n * @param listener - The callback function to invoke when the event occurs.\n * @returns This workflow instance for chaining.\n */\n once<E extends keyof WorkflowEvents>(\n event: E,\n listener: E extends keyof WorkflowEvents ? (...args: WorkflowEvents[E]) => void : never,\n ): this {\n if (this.#state === \"disposed\") {\n throw new Error(\"invalid state\");\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.#event_emitter as any).once(event, listener);\n return this;\n }\n\n /**\n * Registers a persistent event listener.\n *\n * @template E - The event name type.\n * @param event - The name of the event to listen for.\n * @param listener - The callback function to invoke when the event occurs.\n * @returns This workflow instance for chaining.\n */\n on<E extends keyof WorkflowEvents>(\n event: E,\n listener: E extends keyof WorkflowEvents ? (...args: WorkflowEvents[E]) => void : never,\n ): this {\n if (this.#state === \"disposed\") {\n throw new Error(\"invalid state\");\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.#event_emitter as any).on(event, listener);\n return this;\n }\n\n /**\n * Removes an event listener.\n *\n * @template E - The event name type.\n * @param event - The name of the event.\n * @param listener - The callback function to remove.\n * @returns This workflow instance for chaining.\n */\n off<E extends keyof WorkflowEvents>(\n event: E,\n listener: E extends keyof WorkflowEvents ? (...args: WorkflowEvents[E]) => void : never,\n ): this {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.#event_emitter as any).off(event, listener);\n return this;\n }\n\n /**\n * Starts the workflow execution.\n *\n * @param message - Optional initial user message to begin the workflow.\n */\n start(message?: UserMessage) {\n if (this.#state !== \"idle\") {\n throw new Error(\"invalid state\");\n }\n if (message) {\n this.#messages.push(message);\n this.#event_emitter.emit(\"workflow_update\", this);\n }\n this.#set_state(\"busy\");\n }\n\n /**\n * Cancels the workflow execution.\n *\n * This will cancel any in-progress model response and emit a workflow_end event.\n */\n cancel() {\n if (this.#state === \"disposed\") {\n throw new Error(\"invalid state\");\n }\n if (\n this.#conversation.state === \"awaiting_response\" ||\n this.#conversation.state === \"streaming_response\"\n ) {\n this.#conversation.cancel_response();\n }\n this.#set_state(\"idle\");\n this.#event_emitter.emit(\"workflow_end\", { reason: \"cancel\" }, this);\n this[Symbol.dispose]();\n }\n\n /**\n * Creates a child workflow with a different conversation.\n *\n * Child events are propagated to the parent as \"child_workflow_event\" events.\n *\n * @param conversation - The conversation for the child workflow.\n * @param id - Optional custom ID for the child workflow.\n * @param context_data - Additional context data to merge with this workflow's context data.\n * @returns The newly created child workflow.\n */\n spawn_child(conversation: Conversation, id?: string, context_data?: Record<string, unknown>) {\n if (this.#state === \"disposed\") {\n throw new Error(\"invalid state\");\n }\n const merged_context = context_data\n ? { ...this.#context_data, ...context_data }\n : this.#context_data;\n const child = new Workflow(conversation, { context_data: merged_context, parent: this });\n if (id) {\n child.id = id;\n }\n\n this.#attach_child_event(child, \"state_change\");\n this.#attach_child_event(child, \"workflow_update\");\n this.#attach_child_event(child, \"workflow_end\");\n this.#attach_child_event(child, \"child_workflow_begin\");\n this.#attach_child_event(child, \"child_workflow_event\");\n this.#attach_child_event(child, \"message_queued\");\n this.#attach_child_event(child, \"message_dequeued\");\n this.#attach_child_event(child, \"queue_cleared\");\n this.#attach_child_event(child, \"lifecycle_error\");\n this.#attach_child_event(child, \"dispose\");\n\n this.#event_emitter.emit(\"child_workflow_begin\", child, this);\n\n return child;\n }\n\n /**\n * Adds a message to the queue for sending after the current response completes.\n *\n * @param message - The text message to queue.\n */\n queue_message(message: string) {\n if (this.#state === \"disposed\") {\n throw new Error(\"invalid state\");\n }\n this.#queued_messages.push(message);\n this.#event_emitter.emit(\"message_queued\", message, this);\n }\n\n /**\n * Clears all queued messages.\n */\n clear_queue() {\n if (this.#state === \"disposed\") {\n throw new Error(\"invalid state\");\n }\n this.#queued_messages.length = 0;\n this.#event_emitter.emit(\"queue_cleared\", this);\n }\n\n #set_state(state: WorkflowState) {\n if (this.#state === state) {\n return;\n }\n const previous = this.state;\n\n this.#state = state;\n this.#event_emitter.emit(\"state_change\", { previous, current: this.#state }, this);\n }\n\n async #execute_tools(message: AssistantMessage) {\n const tool_calls = (message.content as AssistantContent[]).filter(\n (c): c is Extract<AssistantContent, { type: \"tool\" }> => c.type === \"tool\",\n );\n\n const batches: (typeof tool_calls)[] = [];\n let current_batch: typeof tool_calls = [];\n\n for (const call of tool_calls) {\n const tool_class = this.conversation.toolkit.find(\n (t: ToolClass) => t.get_definition().name === call.tool,\n );\n const is_parallel = tool_class?.get_definition().parallelizable !== false;\n\n if (!is_parallel) {\n if (current_batch.length > 0) {\n batches.push(current_batch);\n current_batch = [];\n }\n batches.push([call]);\n } else {\n current_batch.push(call);\n }\n }\n if (current_batch.length > 0) {\n batches.push(current_batch);\n }\n\n const results: ToolResultContent[] = [];\n\n for (const batch of batches) {\n const batch_results = await Promise.all(\n batch.map(async (call) => {\n const tool_class = this.conversation.toolkit.find(\n (t: ToolClass) => t.get_definition().name === call.tool,\n );\n\n if (tool_class) {\n if (!this.#tool_context) {\n this.#tool_context = {\n ...this.#context_data,\n conversation: this.conversation,\n workflow: this,\n };\n }\n const context = this.#tool_context;\n const tool = new tool_class(context);\n try {\n const result = await tool.execute(call.params);\n return {\n type: \"tool_result\" as const,\n tool: call.tool,\n tool_request_id: call.tool_request_id,\n result,\n };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : \"Tool execution failed\";\n return {\n type: \"tool_result\" as const,\n tool: call.tool,\n tool_request_id: call.tool_request_id,\n result: { result: false as const, message },\n };\n }\n }\n\n return {\n type: \"tool_result\" as const,\n tool: call.tool,\n tool_request_id: call.tool_request_id,\n result: { result: false as const, message: \"invalid tool\" },\n };\n }),\n );\n\n results.push(...batch_results);\n\n if (this.#state !== \"busy\") {\n return;\n }\n }\n\n await this.conversation.send_message(results);\n }\n\n #attach_child_event(child: Workflow, event_name: keyof WorkflowEvents) {\n const handler = (...args: unknown[]) => {\n this.#event_emitter.emit(\n \"child_workflow_event\",\n {\n event_name,\n event_args: args,\n } as WorkflowEvents[\"child_workflow_event\"][0],\n this,\n );\n };\n child.on(event_name, handler);\n child.once(\"dispose\", () => setImmediate(() => child.off(event_name, handler)));\n }\n\n #on_prompt_send = ({ message }: PromptRequestData) => {\n this.#messages.push(message);\n this.#event_emitter.emit(\"workflow_update\", this);\n };\n\n #on_message_complete = async (event: FullMessageCompletionEvent) => {\n try {\n this.#messages.push(event.message);\n this.#event_emitter.emit(\"workflow_update\", this);\n\n if (event.stop_reason === \"tool_use\") {\n await this.#execute_tools(event.message);\n } else {\n const queued_message = this.#queued_messages.shift();\n if (queued_message) {\n this.#event_emitter.emit(\"message_dequeued\", queued_message, this);\n await this.#conversation.prompt(queued_message);\n } else {\n this.#set_state(\"idle\");\n this.#event_emitter.emit(\"workflow_end\", { reason: \"complete\" }, this);\n this[Symbol.dispose]();\n }\n }\n } catch {\n this.#set_state(\"idle\");\n this.#event_emitter.emit(\"workflow_end\", { reason: \"error\" }, this);\n this[Symbol.dispose]();\n }\n };\n\n #on_request_error = () => {\n this.#set_state(\"idle\");\n this.#event_emitter.emit(\"workflow_end\", { reason: \"error\" }, this);\n this[Symbol.dispose]();\n };\n\n #on_conversation_dispose = () => this[Symbol.dispose]();\n\n #on_parent_workflow_end = (event: WorkflowEndEvent) => {\n if (event.reason === \"cancel\") {\n this.cancel();\n }\n };\n}\n","import { EventEmitter } from \"node:events\";\nimport { setImmediate } from \"node:timers/promises\";\n\nimport { Conversation } from \"../conversations/index.ts\";\nimport { WorkflowEvents, WorkflowManagerEvents, WorkflowState } from \"./types.ts\";\nimport { Workflow } from \"./workflow.ts\";\nimport { PromptRequestData } from \"../conversations/types.ts\";\n\n/**\n * Automatically manages workflow lifecycle for a conversation.\n *\n * The WorkflowManager creates a new Workflow instance whenever a message is sent\n * to its associated conversation, eliminating the need for manual workflow management.\n */\nexport class WorkflowManager {\n readonly #event_emitter = new EventEmitter<WorkflowManagerEvents>();\n readonly #conversation: Conversation;\n readonly #context_data: Record<string, unknown>;\n\n #state: WorkflowState = \"idle\";\n #current_workflow?: Workflow;\n\n /**\n * Creates a new workflow manager instance.\n *\n * @param conversation - The conversation to manage workflows for.\n * @param options - Optional configuration.\n * @param options.context_data - Custom data to pass to tools via ToolContext.\n */\n constructor(conversation: Conversation, options?: { context_data?: Record<string, unknown> }) {\n this.#conversation = conversation;\n this.#context_data = options?.context_data ?? {};\n\n this.#conversation.on(\"prompt_send\", this.#on_prompt_send);\n this.#conversation.on(\"checkpoint_begin\", this.#on_checkpoint_begin);\n this.#conversation.once(\"dispose\", this.#on_conversation_dispose);\n }\n\n /**\n * The current state of the workflow manager.\n */\n get state() {\n return this.#state;\n }\n\n /**\n * The conversation being managed.\n */\n get conversation() {\n return this.#conversation;\n }\n\n /**\n * The currently active workflow, if any.\n */\n get current_workflow(): Workflow | undefined {\n return this.#current_workflow;\n }\n\n /**\n * Disposes the workflow manager and releases all resources.\n *\n * This method is called automatically when using the `using` keyword.\n */\n [Symbol.dispose]() {\n this.#conversation.off(\"prompt_send\", this.#on_prompt_send);\n this.#conversation.off(\"checkpoint_begin\", this.#on_checkpoint_begin);\n this.#conversation.off(\"dispose\", this.#on_conversation_dispose);\n\n this.#event_emitter.emit(\"dispose\", this);\n this.#set_state(\"disposed\");\n this.#event_emitter.removeAllListeners();\n }\n\n /**\n * Registers a one-time event listener.\n *\n * @template E - The event name type.\n * @param event - The name of the event to listen for.\n * @param listener - The callback function to invoke when the event occurs.\n * @returns This workflow manager instance for chaining.\n */\n once<E extends keyof WorkflowManagerEvents>(\n event: E,\n listener: E extends keyof WorkflowManagerEvents\n ? (...args: WorkflowManagerEvents[E]) => void\n : never,\n ): this {\n if (this.#state === \"disposed\") {\n throw new Error(\"invalid state\");\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.#event_emitter as any).once(event, listener);\n return this;\n }\n\n /**\n * Registers a persistent event listener.\n *\n * @template E - The event name type.\n * @param event - The name of the event to listen for.\n * @param listener - The callback function to invoke when the event occurs.\n * @returns This workflow manager instance for chaining.\n */\n on<E extends keyof WorkflowManagerEvents>(\n event: E,\n listener: E extends keyof WorkflowManagerEvents\n ? (...args: WorkflowManagerEvents[E]) => void\n : never,\n ): this {\n if (this.#state === \"disposed\") {\n throw new Error(\"invalid state\");\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.#event_emitter as any).on(event, listener);\n return this;\n }\n\n /**\n * Removes an event listener.\n *\n * @template E - The event name type.\n * @param event - The name of the event.\n * @param listener - The callback function to remove.\n * @returns This workflow manager instance for chaining.\n */\n off<E extends keyof WorkflowManagerEvents>(\n event: E,\n listener: E extends keyof WorkflowManagerEvents\n ? (...args: WorkflowManagerEvents[E]) => void\n : never,\n ): this {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.#event_emitter as any).off(event, listener);\n return this;\n }\n\n /**\n * Manually starts a workflow.\n *\n * This is typically not needed as workflows are started automatically when messages are sent.\n */\n start_workflow() {\n if (this.#state !== \"idle\") {\n throw new Error(\"invalid state\");\n }\n }\n\n #on_prompt_send = ({ message }: PromptRequestData) => {\n if (this.#current_workflow) {\n return;\n }\n this.#current_workflow = new Workflow(this.#conversation, { context_data: this.#context_data });\n\n this.#attach_workflow_event(this.#current_workflow, \"state_change\");\n this.#attach_workflow_event(this.#current_workflow, \"workflow_update\");\n this.#attach_workflow_event(this.#current_workflow, \"workflow_end\");\n this.#attach_workflow_event(this.#current_workflow, \"child_workflow_begin\");\n this.#attach_workflow_event(this.#current_workflow, \"child_workflow_event\");\n this.#attach_workflow_event(this.#current_workflow, \"message_queued\");\n this.#attach_workflow_event(this.#current_workflow, \"message_dequeued\");\n this.#attach_workflow_event(this.#current_workflow, \"queue_cleared\");\n this.#attach_workflow_event(this.#current_workflow, \"lifecycle_error\");\n this.#attach_workflow_event(this.#current_workflow, \"dispose\");\n\n this.#current_workflow.once(\"dispose\", () => {\n this.#current_workflow = undefined;\n this.#set_state(\"idle\");\n });\n\n this.#set_state(\"busy\");\n this.#event_emitter.emit(\"workflow_begin\", this.#current_workflow, this);\n\n this.#current_workflow.start(message);\n };\n\n #set_state(state: WorkflowState) {\n if (this.#state === state) {\n return;\n }\n const previous = this.state;\n\n this.#state = state;\n this.#event_emitter.emit(\"state_change\", { previous, current: this.#state }, this);\n }\n\n #attach_workflow_event(workflow: Workflow, event_name: keyof WorkflowEvents) {\n const handler = (...args: unknown[]) => {\n this.#event_emitter.emit(\n \"workflow_event\",\n {\n event_name,\n event_args: args,\n } as WorkflowManagerEvents[\"workflow_event\"][0],\n this,\n );\n };\n workflow.on(event_name, handler);\n workflow.once(\"dispose\", () => setImmediate(() => workflow.off(event_name, handler)));\n }\n\n #on_checkpoint_begin = (child: Conversation) => {\n this.#set_state(\"busy\");\n child.once(\"dispose\", () => {\n this.#set_state(\"idle\");\n });\n };\n\n #on_conversation_dispose = () => this[Symbol.dispose]();\n}\n","/**\n * Gets all keys from an object where the value is not undefined.\n *\n * @param obj - The object to examine.\n * @returns An array of keys with defined values.\n */\nexport function defined_keys(obj: Record<string, unknown>) {\n return Object.keys(obj).filter((key) => obj[key] !== undefined);\n}\n\n/**\n * Checks whether an object has any defined properties.\n *\n * @param obj - The object to examine.\n * @returns True if the object has at least one defined property.\n */\nexport function has_data(obj: Record<string, unknown>) {\n return defined_keys(obj).length > 0;\n}\n\n/**\n * Returns undefined if the value is empty (empty array or object with no defined keys).\n *\n * @template T - The type of the value.\n * @param obj - The value to check.\n * @returns The value if non-empty, otherwise undefined.\n */\nexport function undefined_if_empty<T = unknown>(obj: T) {\n if (!obj) {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.length === 0 ? undefined : obj;\n }\n if (typeof obj === \"object\") {\n return defined_keys(obj as Record<string, unknown>).length === 0 ? undefined : obj;\n }\n return obj;\n}\n\n/**\n * Recursively merges two values together.\n *\n * For objects, properties are merged recursively. For arrays, elements are concatenated.\n * For primitives, the supplemental value replaces the original.\n *\n * @template T - The type of values being merged.\n * @param original - The original value.\n * @param supplemental - The value to merge in.\n * @returns The merged result.\n */\nexport function deep_merge<T = unknown>(original: T, supplemental: T): T {\n if (supplemental === undefined || supplemental === null) {\n return original;\n }\n if (original === undefined || original === null) {\n return supplemental;\n }\n if (typeof original === \"object\" && typeof supplemental === \"object\") {\n if (Array.isArray(original)) {\n if (!Array.isArray(supplemental)) {\n throw new Error(\"type mismatch\");\n }\n return [...original, ...supplemental] as T;\n } else {\n if (Array.isArray(supplemental)) {\n throw new Error(\"type mismatch\");\n }\n const result = { ...original } as Record<string, unknown>;\n for (const [key, value] of Object.entries(supplemental)) {\n result[key] = deep_merge(result[key], value);\n }\n return result as T;\n }\n }\n if (typeof supplemental !== typeof original) {\n throw new Error(\"type mismatch\");\n }\n if (\n typeof supplemental === \"string\" ||\n typeof supplemental === \"number\" ||\n typeof supplemental === \"boolean\"\n ) {\n return supplemental as T;\n }\n throw new Error(\"unsupported type\");\n}\n\n/**\n * Copies a property from source to destination only if it is defined.\n *\n * @template TKey - The key type.\n * @template TSource - The source object type.\n * @param key - The property key to copy.\n * @param source - The source object.\n * @param destination - The destination object.\n */\nexport function copy_if_defined<TKey extends keyof TSource, TSource extends object>(\n key: TKey,\n source: TSource,\n destination: Partial<Pick<TSource, TKey>>,\n) {\n if (source[key] !== undefined) {\n destination[key] = source[key];\n }\n}\n\n/**\n * Type guard that checks if an object contains a specific key.\n *\n * @template T - The object type.\n * @template K - The key type.\n * @param obj - The object to check.\n * @param key - The key to look for.\n * @returns True if the object contains the key.\n */\nexport function contains_key<T extends object, K extends string | number>(\n obj: T,\n key: K,\n): obj is T & Record<K, unknown> {\n return key in obj;\n}\n\n/**\n * Gets a value from a nested object path.\n *\n * @param node - The object to traverse.\n * @param key_path - The path to the value (dot-separated string or array of keys).\n * @returns The value at the path, or undefined if not found.\n */\nexport function get_nested_value(node: unknown, key_path: string | (string | number)[]): unknown {\n if (typeof key_path === \"string\") {\n return get_nested_value(node, key_path.split(\".\"));\n }\n const [key, ...rest] = key_path;\n\n if (typeof node !== \"object\" || node === null || key === undefined) {\n return node;\n }\n if (!contains_key(node, key)) {\n return undefined;\n }\n return get_nested_value(node[key], rest);\n}\n\n/**\n * Sets a value at a nested object path.\n *\n * Creates intermediate objects/arrays as needed.\n *\n * @param node - The object to modify.\n * @param key_path - The path to set (dot-separated string or array of keys).\n * @param value - The value to set.\n */\nexport function set_nested_value(\n node: unknown,\n key_path: string | (string | number)[],\n value: unknown,\n) {\n if (typeof key_path === \"string\") {\n set_nested_value(node, key_path.split(\".\"), value);\n return;\n }\n const [key, next_key, ...rest] = key_path;\n\n if (key === undefined) {\n throw new Error(\"invalid object key\");\n }\n if (typeof node !== \"object\" || node === null) {\n throw new Error(\"invalid object value\");\n }\n const obj = node as Record<string | number, unknown>;\n\n if (next_key === undefined || next_key === null) {\n obj[key] = value;\n return;\n }\n if (obj[key] === undefined || obj[key] === null) {\n obj[key] = typeof next_key === \"number\" || /^\\d+$/.test(String(next_key)) ? [] : {};\n }\n set_nested_value(obj[key], [next_key, ...rest], value);\n}\n\n/**\n * Deletes a value at a nested object path.\n *\n * @param node - The object to modify.\n * @param key_path - The path to delete (dot-separated string or array of keys).\n */\nexport function delete_nested_value(node: unknown, key_path: string | (string | number)[]) {\n if (typeof key_path === \"string\") {\n delete_nested_value(node, key_path.split(\".\"));\n return;\n }\n const [key, next_key, ...rest] = key_path;\n\n if (key === undefined) {\n return;\n }\n if (typeof node !== \"object\" || node === null) {\n return;\n }\n const obj = node as Record<string | number, unknown>;\n\n if (!contains_key(obj, key)) {\n return;\n }\n\n if (next_key === undefined) {\n delete obj[key];\n return;\n }\n delete_nested_value(obj[key], [next_key, ...rest]);\n}\n"],"mappings":"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","names":["import_node_events","EventEmitter","crypto","EventEmitter","on_state_change","import_node_events","event_data","event_data","import_node_crypto","import_node_events","import_promises","message","import_node_events","import_promises"]}
|