@aizonaai/adk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/events/event-bus.ts","../src/agent/define-agent.ts","../src/tools/define-tool.ts","../src/tools/tool-registry.ts","../src/tools/built-in/tool-search.ts","../src/output/structured-output.ts","../src/output/schema-utils.ts","../src/guardrails/engine.ts","../src/guardrails/built-in/content-filter.ts","../src/guardrails/built-in/consent-gate.ts","../src/guardrails/built-in/budget-limit.ts","../src/guardrails/built-in/budget-gate.ts","../src/guardrails/built-in/token-limit.ts","../src/guardrails/built-in/pii-filter.ts","../src/content/helpers.ts","../src/harness/notes-store.ts","../src/harness/progress-tracker.ts","../src/sessions/context-summarizer.ts","../src/sessions/token-counter.ts","../src/sessions/context-manager.ts","../src/runner/code-executor.ts","../src/tools/built-in/execute-code.ts","../src/tools/built-in/notes-tool.ts","../src/tools/built-in/progress-tool.ts","../src/tools/tool-selector.ts","../src/runner/context.ts","../src/runner/turn-executor.ts","../src/runner/runner.ts","../src/providers/errors.ts","../src/providers/base-provider.ts","../src/providers/content-adapters.ts","../src/providers/anthropic.ts","../src/providers/openai.ts","../src/providers/google.ts","../src/providers/xai.ts","../src/providers/ollama.ts","../src/providers/lmstudio.ts","../src/providers/factory.ts","../src/utils/redact.ts","../src/routing/llm-adapter.ts","../src/routing/llm-router.ts","../src/streaming/async-generator.ts","../src/streaming/sse-encoder.ts","../src/streaming/ws-relay.ts","../src/streaming/backpressure.ts","../src/streaming/index.ts","../src/auth/api-key.ts","../src/auth/proxy-router.ts","../src/sessions/memory-backend.ts","../src/sessions/prisma-backend.ts","../src/sessions/compaction.ts","../src/sessions/agentic-memory.ts","../src/tools/built-in/memory-tools.ts","../src/tracing/span.ts","../src/tracing/tracer.ts","../src/tracing/exporters/console.ts","../src/tracing/exporters/eventbus.ts","../src/tracing/exporters/langfuse.ts","../src/multi-agent/handoff.ts","../src/multi-agent/agent-tool.ts","../src/multi-agent/parallel-runner.ts","../src/multi-agent/team.ts","../src/pipeline/pipeline-executor.ts","../src/pipeline/review-pipeline.ts","../src/tools/mcp/mcp-tool-adapter.ts","../src/realtime/realtime-agent.ts","../src/realtime/audio-stream.ts","../src/skills/define-skill.ts","../src/skills/skill-loader.ts","../src/skills/publishing/manuscript-ingest/manifest.ts","../src/skills/publishing/manuscript-summarize/manifest.ts","../src/skills/publishing/book-edit-suggest/manifest.ts","../src/skills/publishing/publisher-database-search/manifest.ts","../src/skills/publishing/market-fit-score/manifest.ts","../src/skills/publishing/query-letter-generate/manifest.ts","../src/skills/publishing/query-letter-personalize.ts","../src/skills/publishing/email-campaign-basic.ts","../src/skills/publishing/email-campaign-advanced.ts","../src/skills/publishing/author-bio-generate.ts","../src/skills/publishing/comp-title-finder.ts","../src/skills/publishing/submission-tracker.ts","../src/artifacts/artifact-store.ts","../src/artifacts/artifact-tool.ts","../src/memory/embedding.ts","../src/memory/memory-manager.ts","../src/memory/pgvector-backend.ts","../src/memory/in-memory-shared-store.ts","../src/memory/decay-policy.ts","../src/eval/eval-harness.ts","../src/plugins/define-plugin.ts","../src/plugins/plugin-registry.ts"],"sourcesContent":["// ──────────────────────────────────────────────────────\n// @aizonaai/adk — AIZona Agent Development Kit\n// ──────────────────────────────────────────────────────\n\n// Types\nexport type * from \"./types/index\";\n\n// Events\nexport { ADKEventBus } from \"./events/index\";\n\n// Agent\nexport { Agent, defineAgent } from \"./agent/index\";\n\n// Tools\nexport { defineTool, ToolRegistry, createToolSearchTool } from \"./tools/index\";\nexport type { ToolSearchResult } from \"./tools/index\";\n\n// Structured Output\nexport {\n zodToJsonSchema,\n isZodSchema,\n ensureJsonSchema,\n validateOutput,\n toAnthropicToolSchema,\n toOpenAIResponseFormat,\n toGoogleSchemaFormat,\n schemaToToolInput,\n} from \"./output/index\";\n\n// Guardrails\nexport { GuardrailEngine, GuardrailTripwireError } from \"./guardrails/engine\";\nexport { contentFilter } from \"./guardrails/built-in/content-filter\";\nexport { consentGate } from \"./guardrails/built-in/consent-gate\";\nexport { budgetLimit } from \"./guardrails/built-in/budget-limit\";\nexport { budgetGateGuardrail } from \"./guardrails/built-in/budget-gate\";\nexport type { BudgetCheckData } from \"./guardrails/built-in/budget-gate\";\nexport { tokenLimit } from \"./guardrails/built-in/token-limit\";\nexport { piiFilter } from \"./guardrails/built-in/pii-filter\";\n\n// Runner\nexport { Runner } from \"./runner/runner\";\nexport { TurnExecutor } from \"./runner/turn-executor\";\nexport { createRunContext, createRunId, createTraceId } from \"./runner/context\";\nexport { CodeExecutor } from \"./runner/code-executor\";\nexport type { CodeExecutorConfig, CodeExecutionResult } from \"./runner/code-executor\";\nexport { createExecuteCodeTool } from \"./tools/built-in/execute-code\";\n\n// Providers\nexport { BaseProvider } from \"./providers/base-provider\";\nexport { AnthropicProvider } from \"./providers/anthropic\";\nexport { OpenAIProvider } from \"./providers/openai\";\nexport { GoogleProvider } from \"./providers/google\";\nexport { XAIProvider } from \"./providers/xai\";\nexport { OllamaProvider } from \"./providers/ollama\";\nexport { LMStudioProvider } from \"./providers/lmstudio\";\nexport { createProvider } from \"./providers/factory\";\nexport { ADKProviderError } from \"./providers/errors\";\nexport type { ADKProviderErrorCode } from \"./providers/errors\";\n\n// Utils\nexport { redact } from \"./utils/index\";\nexport type { RedactOptions } from \"./utils/index\";\n\n// Routing\nexport { ADKLLMAdapter } from \"./routing/llm-adapter\";\nexport { ADKRouter } from \"./routing/llm-router\";\n\n// Streaming\nexport { createAsyncEventStream } from \"./streaming/async-generator\";\nexport { encodeSSE, streamToSSE } from \"./streaming/sse-encoder\";\nexport { relayToWebSocket, createStreamAdapter } from \"./streaming/index\";\nexport { BackpressuredStream } from \"./streaming/backpressure\";\nexport type { BackpressureOptions } from \"./streaming/backpressure\";\n\n// Auth / API Key\nexport { generateApiKey, hashApiKey, parseApiKey, validateApiKeyFormat } from \"./auth/api-key\";\nexport { ProxyRouter } from \"./auth/proxy-router\";\n\n// Sessions\nexport { MemorySessionBackend } from \"./sessions/memory-backend\";\nexport { PrismaSessionBackend } from \"./sessions/prisma-backend\";\nexport { ContextManager } from \"./sessions/context-manager\";\nexport { compactMessages } from \"./sessions/compaction\";\nexport type { CompactionOptions } from \"./sessions/compaction\";\nexport type { ContextManagerConfig } from \"./sessions/context-manager\";\nexport { TokenCounter } from \"./sessions/token-counter\";\nexport type { TokenCounterStrategy, TokenCounterConfig } from \"./sessions/token-counter\";\nexport { ContextSummarizer } from \"./sessions/context-summarizer\";\nexport type { SummarizationConfig } from \"./sessions/context-summarizer\";\nexport { AgenticMemory, InMemoryBackend } from \"./sessions/agentic-memory\";\nexport type { AgenticMemoryBackend } from \"./sessions/agentic-memory\";\nexport {\n createMemoryWriteTool,\n createMemoryReadTool,\n createMemorySearchTool,\n} from \"./tools/built-in/memory-tools\";\n\n// Tracing\nexport { Tracer, Trace } from \"./tracing/tracer\";\nexport { Span } from \"./tracing/span\";\nexport { ConsoleExporter } from \"./tracing/exporters/console\";\nexport { EventBusExporter } from \"./tracing/exporters/eventbus\";\nexport { LangfuseExporter } from \"./tracing/exporters/langfuse\";\n\n// Multi-Agent\nexport { HandoffManager, HANDOFF_PREFIX } from \"./multi-agent/handoff\";\nexport { agentAsTool } from \"./multi-agent/agent-tool\";\nexport { ParallelRunner } from \"./multi-agent/parallel-runner\";\nexport { Team } from \"./multi-agent/team\";\n\n// Pipeline\nexport { ADKPipeline } from \"./pipeline/pipeline-executor\";\nexport { ADKReviewPipeline } from \"./pipeline/review-pipeline\";\n\n// Tool Selection\nexport { ToolSelector } from \"./tools/tool-selector\";\nexport type {\n ToolSelectionConfig,\n ToolSelectionStrategy,\n ToolRelevanceScore,\n} from \"./tools/tool-selector\";\n\n// MCP Tools\nexport {\n mcpServerTools,\n MCPServerConnector,\n discoverMCPTools,\n mcpSelectTools,\n} from \"./tools/mcp/index\";\n\n// Realtime / Voice\nexport { RealtimeAgent } from \"./realtime/realtime-agent\";\nexport {\n AudioStreamBuffer,\n pcm16FromArrayBuffer,\n pcm16ToArrayBuffer,\n calculateVolume,\n} from \"./realtime/audio-stream\";\n\n// Skills\nexport {\n defineSkill,\n SkillManifestSchema,\n loadSkill,\n mergeSkillTools,\n} from \"./skills/index\";\nexport type { SkillManifest, SkillToolEntry, LoadedSkill } from \"./skills/index\";\n\n// Content (Multi-modal)\nexport {\n isMultiModalContent,\n isTextPart,\n isImagePart,\n isAudioPart,\n isVideoPart,\n isUIArtifactPart,\n contentToString,\n extractText,\n contentToParts,\n countMediaParts,\n} from \"./content/index\";\n\n// Artifacts (A2UI)\nexport { ArtifactStore, createArtifactTool } from \"./artifacts/index\";\nexport type { Artifact } from \"./artifacts/index\";\n\n// Harness (Progress Protocol + Structured Notes)\nexport { ProgressTracker, NotesStore } from \"./harness/index\";\nexport type { ProgressFeature, FeatureStatus, NoteEntry, NoteSection } from \"./harness/index\";\nexport { createProgressTool } from \"./tools/built-in/progress-tool\";\nexport { createWriteNoteTool, createReadNotesTool } from \"./tools/built-in/notes-tool\";\n\n// Memory (Vector Memory System)\nexport {\n EmbeddingService,\n MemoryManager,\n PgVectorMemoryBackend,\n InMemorySharedStore,\n MemoryDecayManager,\n} from \"./memory/index\";\nexport type {\n MemoryType,\n MemoryEntry,\n MemorySearchResult,\n MemoryBackend,\n EmbeddingConfig,\n EmbedApiResponse,\n MemoryManagerConfig,\n PgVectorDatabaseClient,\n SharedMemoryScope,\n SharedMemoryNamespace,\n SharedMemoryEntry,\n SharedMemoryStore,\n DecayPolicy,\n} from \"./memory/index\";\n\n// Eval Harness\nexport { defineEvalSuite, runEval } from \"./eval/index\";\nexport type { EvalCase, EvalResult, EvalSuite } from \"./eval/index\";\n\n// Plugins\nexport { definePlugin, PluginRegistry } from \"./plugins/index\";\nexport type {\n PluginDefinition,\n PluginManifest,\n PluginContext,\n PluginCapability,\n PluginLifecycle,\n PluginStatus,\n UIExtensionSlot,\n} from \"./plugins/index\";\n","// ──────────────────────────────────────────────────────\n// ADK EventBus — Portable, instantiable (no globalThis)\n// ──────────────────────────────────────────────────────\n// Extracted from @aizona/platform-agents/observability/event-bus.ts\n// Key difference: NOT a singleton. Each Runner/Session gets its own.\n// ──────────────────────────────────────────────────────\n\nimport type { ADKEventListener, ADKEventMap, ADKEventName } from \"../types/events\";\n\nexport class ADKEventBus {\n private listeners = new Map<ADKEventName, Set<ADKEventListener<ADKEventName>>>();\n\n /** Subscribe to an event. Returns unsubscribe function. */\n on<K extends ADKEventName>(event: K, listener: ADKEventListener<K>): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n const set = this.listeners.get(event)!;\n set.add(listener as ADKEventListener<ADKEventName>);\n\n return () => {\n set.delete(listener as ADKEventListener<ADKEventName>);\n if (set.size === 0) {\n this.listeners.delete(event);\n }\n };\n }\n\n /** Subscribe to an event once. Auto-unsubscribes after first emit. */\n once<K extends ADKEventName>(event: K, listener: ADKEventListener<K>): () => void {\n const wrappedListener = ((data: ADKEventMap[K]) => {\n unsubscribe();\n listener(data);\n }) as ADKEventListener<K>;\n\n const unsubscribe = this.on(event, wrappedListener);\n return unsubscribe;\n }\n\n /** Unsubscribe a specific listener. */\n off<K extends ADKEventName>(event: K, listener: ADKEventListener<K>): void {\n const set = this.listeners.get(event);\n if (set) {\n set.delete(listener as ADKEventListener<ADKEventName>);\n if (set.size === 0) {\n this.listeners.delete(event);\n }\n }\n }\n\n /** Emit an event to all listeners. */\n emit<K extends ADKEventName>(event: K, data: ADKEventMap[K]): void {\n const set = this.listeners.get(event);\n if (!set) return;\n for (const listener of set) {\n try {\n listener(data);\n } catch {\n // Non-critical — don't let listener errors break the emitter\n }\n }\n }\n\n /** Get the number of listeners for an event. */\n listenerCount(event: ADKEventName): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n\n /** Get all events with active listeners. */\n activeEvents(): ADKEventName[] {\n return Array.from(this.listeners.keys());\n }\n\n /** Remove all listeners for all events. */\n removeAllListeners(): void {\n this.listeners.clear();\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Agent — defineAgent() + Agent class\n// ──────────────────────────────────────────────────────\n\nimport type { z } from \"zod\";\nimport type { ToolSelectionConfig } from \"../tools/tool-selector\";\nimport type {\n AgentConfig,\n ConsentLevel,\n ContextConfig,\n HandoffTarget,\n JsonSchema,\n} from \"../types/agent\";\nimport type { RunContext } from \"../types/runner\";\nimport type { ToolDef } from \"../types/tool\";\n\n/** Agent class — wraps config with utility methods */\nexport class Agent {\n readonly name: string;\n readonly config: Readonly<AgentConfig>;\n private runtimeTools: ToolDef[] = [];\n\n constructor(config: AgentConfig) {\n if (!config.name || config.name.trim().length === 0) {\n throw new Error(\"Agent name is required\");\n }\n this.name = config.name;\n this.config = Object.freeze({ ...config });\n }\n\n /** Resolve instructions (handles static string or dynamic function) */\n async getInstructions(ctx: RunContext): Promise<string> {\n if (typeof this.config.instructions === \"function\") {\n return this.config.instructions(ctx);\n }\n return this.config.instructions;\n }\n\n /** Get tool definitions (config tools + runtime-injected tools) */\n getTools(): ToolDef[] {\n return [...(this.config.tools ?? []), ...this.runtimeTools];\n }\n\n /** Add a tool at runtime (e.g., harness tools injected by Runner) */\n // biome-ignore lint/suspicious/noExplicitAny: accept typed ToolDef variants\n addTool(tool: ToolDef<any, any>): void {\n const allTools = this.getTools();\n if (!allTools.some((t) => t.name === tool.name)) {\n this.runtimeTools.push(tool as ToolDef);\n }\n }\n\n /** Get handoff targets */\n getHandoffs(): HandoffTarget[] {\n return this.config.handoffs ?? [];\n }\n\n /** Get output schema (Zod or JSON Schema) */\n getOutputSchema(): z.ZodSchema | JsonSchema | undefined {\n return this.config.outputSchema;\n }\n\n /** Get consent level */\n getConsentLevel(): ConsentLevel {\n return this.config.consentLevel ?? \"auto\";\n }\n\n /** Get max turns */\n getMaxTurns(): number {\n return this.config.maxTurns ?? 25;\n }\n\n /** Get budget limit */\n getBudgetLimit(): number | undefined {\n return this.config.budgetLimitUsd;\n }\n\n /** Get tool selection config */\n getToolSelection(): ToolSelectionConfig | undefined {\n return this.config.toolSelection;\n }\n\n /** Get context config */\n getContextConfig(): ContextConfig | undefined {\n return this.config.contextConfig;\n }\n\n /** Clone agent with config overrides */\n clone(overrides?: Partial<AgentConfig>): Agent {\n return new Agent({ ...this.config, ...overrides });\n }\n}\n\n/** Define an agent from config */\nexport function defineAgent(config: AgentConfig): Agent {\n return new Agent(config);\n}\n","// ──────────────────────────────────────────────────────\n// ADK Tool — defineTool()\n// ──────────────────────────────────────────────────────\n\nimport type { ToolDef, ToolDefConfig } from \"../types/tool\";\n\n/** Define a tool from config */\nexport function defineTool<TInput = unknown, TOutput = unknown>(\n config: ToolDefConfig<TInput, TOutput>,\n): ToolDef<TInput, TOutput> {\n if (!config.name || config.name.trim().length === 0) {\n throw new Error(\"Tool name is required\");\n }\n if (!config.description || config.description.trim().length === 0) {\n throw new Error(\"Tool description is required\");\n }\n if (!config.execute) {\n throw new Error(\"Tool execute function is required\");\n }\n\n return {\n name: config.name,\n description: config.description,\n inputSchema: config.inputSchema,\n outputSchema: config.outputSchema,\n execute: config.execute,\n hooks: config.hooks,\n metadata: config.metadata,\n deferLoading: config.deferLoading,\n examples: config.examples,\n timeoutMs: config.timeoutMs,\n retries: config.retries,\n };\n}\n","// ──────────────────────────────────────────────────────\n// ADK Tool Registry — Deferred tool loading + search\n// ──────────────────────────────────────────────────────\n\nimport type { ToolDef } from \"../types/tool\";\n\n/** Search result from the tool registry */\nexport interface ToolSearchResult {\n name: string;\n description: string;\n score: number;\n}\n\n/**\n * ToolRegistry — central store for all tools with BM25-style search.\n * Supports deferred loading: tools marked `deferLoading: true` are stored\n * but not returned to the LLM until explicitly loaded via search.\n */\nexport class ToolRegistry {\n private tools = new Map<string, ToolDef>();\n private loadedDeferred = new Set<string>();\n\n /** Register a tool */\n register(tool: ToolDef): void {\n this.tools.set(tool.name, tool);\n }\n\n /** Register multiple tools */\n registerAll(tools: ToolDef[]): void {\n for (const tool of tools) {\n this.register(tool);\n }\n }\n\n /** Get a tool by name */\n get(name: string): ToolDef | undefined {\n return this.tools.get(name);\n }\n\n /** Check if a tool exists */\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n /** Search tools by query using BM25-style keyword matching */\n search(query: string, limit = 5): ToolSearchResult[] {\n const queryTerms = this.tokenize(query.toLowerCase());\n if (queryTerms.length === 0) return [];\n\n // Compute IDF for each query term\n const totalDocs = this.tools.size;\n const idf = new Map<string, number>();\n for (const term of queryTerms) {\n let docFreq = 0;\n for (const tool of this.tools.values()) {\n const text = `${tool.name} ${tool.description}`.toLowerCase();\n if (text.includes(term)) docFreq++;\n }\n idf.set(term, Math.log((totalDocs - docFreq + 0.5) / (docFreq + 0.5) + 1));\n }\n\n const k1 = 1.2;\n const b = 0.75;\n\n // Compute average document length\n let totalLen = 0;\n for (const tool of this.tools.values()) {\n totalLen += this.tokenize(`${tool.name} ${tool.description}`).length;\n }\n const avgLen = totalLen / Math.max(1, totalDocs);\n\n const scored: ToolSearchResult[] = [];\n for (const tool of this.tools.values()) {\n const text = `${tool.name} ${tool.description}`.toLowerCase();\n const tokens = this.tokenize(text);\n const docLen = tokens.length;\n\n let score = 0;\n for (const term of queryTerms) {\n const tf = tokens.filter((t) => t === term).length;\n const termIdf = idf.get(term) ?? 0;\n const numerator = tf * (k1 + 1);\n const denominator = tf + k1 * (1 - b + b * (docLen / avgLen));\n score += termIdf * (numerator / denominator);\n }\n\n // Boost for name match (tool names are more specific)\n const nameLower = tool.name.toLowerCase().replace(/[_-]/g, \" \");\n for (const term of queryTerms) {\n if (nameLower.includes(term)) score *= 1.5;\n }\n\n if (score > 0) {\n scored.push({ name: tool.name, description: tool.description, score });\n }\n }\n\n scored.sort((a, b) => b.score - a.score);\n return scored.slice(0, limit);\n }\n\n /** Load a deferred tool (mark it as available for LLM) */\n load(name: string): ToolDef | undefined {\n const tool = this.tools.get(name);\n if (tool?.deferLoading) {\n this.loadedDeferred.add(name);\n }\n return tool;\n }\n\n /** Get all eager (non-deferred) tools */\n getEager(): ToolDef[] {\n return Array.from(this.tools.values()).filter((t) => !t.deferLoading);\n }\n\n /** Get all tools that should be sent to LLM (eager + loaded deferred) */\n getAvailable(): ToolDef[] {\n return Array.from(this.tools.values()).filter(\n (t) => !t.deferLoading || this.loadedDeferred.has(t.name),\n );\n }\n\n /** Check if a deferred tool has been loaded */\n isLoaded(name: string): boolean {\n const tool = this.tools.get(name);\n if (!tool) return false;\n return !tool.deferLoading || this.loadedDeferred.has(name);\n }\n\n /** Get all registered tool names */\n getAllNames(): string[] {\n return Array.from(this.tools.keys());\n }\n\n /** Clear all tools and loaded state */\n clear(): void {\n this.tools.clear();\n this.loadedDeferred.clear();\n }\n\n private tokenize(text: string): string[] {\n return text\n .replace(/[^\\w\\s-]/g, \" \")\n .split(/[\\s_-]+/)\n .filter((w) => w.length > 1);\n }\n}\n","// ──────────────────────────────────────────────────────\n// Built-in tool_search tool — discovers deferred tools\n// ──────────────────────────────────────────────────────\n\nimport type { ToolContext, ToolDef } from \"../../types/tool\";\nimport type { ToolRegistry } from \"../tool-registry\";\n\n/**\n * Create a tool_search tool bound to a specific ToolRegistry.\n * Agents use this to discover and load deferred tools at runtime.\n */\nexport function createToolSearchTool(\n registry: ToolRegistry,\n): ToolDef<{ query: string }, { tools: { name: string; description: string }[] }> {\n return {\n name: \"tool_search\",\n description:\n \"Search for available tools by keyword. Returns matching tool names and descriptions. Use this when you need a tool that isn't currently available.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Keywords to search for tools (e.g., 'file system', 'database query')\",\n },\n },\n required: [\"query\"],\n },\n execute: async (input: { query: string }, _ctx: ToolContext) => {\n const results = registry.search(input.query, 5);\n // Auto-load found tools\n for (const r of results) {\n registry.load(r.name);\n }\n return {\n tools: results.map((r) => ({ name: r.name, description: r.description })),\n };\n },\n };\n}\n","// ──────────────────────────────────────────────────────\n// ADK Structured Output\n// ──────────────────────────────────────────────────────\n// Converts Zod schemas to JSON Schema and generates\n// provider-specific formats for structured output.\n//\n// - Anthropic: tool_use with forced single-tool call\n// - OpenAI: response_format: { type: \"json_schema\" }\n// - Google: response_schema\n// ──────────────────────────────────────────────────────\n\nimport type { ZodSchema } from \"zod\";\nimport { z } from \"zod\";\nimport type { JsonSchema } from \"../types/agent\";\n\n// Internal helper: access Zod internals via `unknown` cast\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyDef = any;\n\n/** Convert a Zod schema to JSON Schema */\nexport function zodToJsonSchema(schema: ZodSchema): JsonSchema {\n return convertZodType(schema._def as AnyDef);\n}\n\nfunction convertZodType(def: AnyDef): JsonSchema {\n const typeName: string = def.typeName;\n\n switch (typeName) {\n case \"ZodString\":\n return handleStringDef(def);\n case \"ZodNumber\":\n return handleNumberDef(def);\n case \"ZodBoolean\":\n return { type: \"boolean\" };\n case \"ZodNull\":\n return { type: \"null\" };\n case \"ZodUndefined\":\n return {};\n case \"ZodLiteral\":\n return { const: def.value };\n case \"ZodEnum\":\n return { type: \"string\", enum: def.values };\n case \"ZodNativeEnum\":\n return { type: \"string\", enum: Object.values(def.values) };\n case \"ZodArray\":\n return handleArrayDef(def);\n case \"ZodObject\":\n return handleObjectDef(def);\n case \"ZodOptional\":\n return convertZodType(def.innerType._def);\n case \"ZodNullable\": {\n const inner = convertZodType(def.innerType._def);\n return { anyOf: [inner, { type: \"null\" }] };\n }\n case \"ZodUnion\": {\n const options: ZodSchema[] = def.options;\n return { anyOf: options.map((opt) => convertZodType(opt._def as AnyDef)) };\n }\n case \"ZodDiscriminatedUnion\": {\n const opts: ZodSchema[] = def.options;\n return { anyOf: opts.map((opt) => convertZodType(opt._def as AnyDef)) };\n }\n case \"ZodRecord\": {\n return {\n type: \"object\",\n additionalProperties: convertZodType(def.valueType._def),\n };\n }\n case \"ZodTuple\": {\n const items: ZodSchema[] = def.items;\n return {\n type: \"array\",\n items: items.map((item) => convertZodType(item._def as AnyDef)),\n minItems: items.length,\n maxItems: items.length,\n };\n }\n case \"ZodDefault\":\n return {\n ...convertZodType(def.innerType._def),\n default: def.defaultValue(),\n };\n case \"ZodEffects\":\n return convertZodType(def.schema._def);\n case \"ZodPipeline\":\n return convertZodType(def.in._def);\n case \"ZodLazy\":\n return convertZodType(def.getter()._def);\n case \"ZodAny\":\n return {};\n default:\n return {};\n }\n}\n\nfunction handleStringDef(def: AnyDef): JsonSchema {\n const schema: Record<string, unknown> = { type: \"string\" };\n const checks: Array<{ kind: string; value?: unknown; regex?: RegExp }> | undefined = def.checks;\n if (checks) {\n for (const check of checks) {\n if (check.kind === \"min\") schema.minLength = check.value;\n if (check.kind === \"max\") schema.maxLength = check.value;\n if (check.kind === \"email\") schema.format = \"email\";\n if (check.kind === \"url\") schema.format = \"uri\";\n if (check.kind === \"uuid\") schema.format = \"uuid\";\n if (check.kind === \"regex\" && check.regex) schema.pattern = String(check.regex);\n }\n }\n return schema;\n}\n\nfunction handleNumberDef(def: AnyDef): JsonSchema {\n const checks: Array<{ kind: string; value?: number; inclusive?: boolean }> | undefined =\n def.checks;\n const isInt = checks?.some((c) => c.kind === \"int\");\n const schema: Record<string, unknown> = { type: isInt ? \"integer\" : \"number\" };\n if (checks) {\n for (const check of checks) {\n if (check.kind === \"min\") {\n if (check.inclusive === false) schema.exclusiveMinimum = check.value;\n else schema.minimum = check.value;\n }\n if (check.kind === \"max\") {\n if (check.inclusive === false) schema.exclusiveMaximum = check.value;\n else schema.maximum = check.value;\n }\n }\n }\n return schema;\n}\n\nfunction handleArrayDef(def: AnyDef): JsonSchema {\n const schema: Record<string, unknown> = {\n type: \"array\",\n items: convertZodType(def.type._def),\n };\n if (def.minLength) schema.minItems = def.minLength.value;\n if (def.maxLength) schema.maxItems = def.maxLength.value;\n return schema;\n}\n\nfunction handleObjectDef(def: AnyDef): JsonSchema {\n const shape: Record<string, ZodSchema> = def.shape();\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = convertZodType(value._def as AnyDef);\n if (!isOptional(value)) {\n required.push(key);\n }\n }\n\n const schema: Record<string, unknown> = { type: \"object\", properties };\n if (required.length > 0) {\n schema.required = required;\n }\n return schema;\n}\n\nfunction isOptional(schema: ZodSchema): boolean {\n const def = schema._def as AnyDef;\n if (def.typeName === \"ZodOptional\") return true;\n if (def.typeName === \"ZodDefault\") return true;\n if (def.typeName === \"ZodUndefined\") return true;\n return false;\n}\n\n/** Check if a value is a Zod schema */\nexport function isZodSchema(value: unknown): value is ZodSchema {\n return value instanceof z.ZodType;\n}\n\n/** Ensure we have a JSON Schema (convert Zod if needed) */\nexport function ensureJsonSchema(schema: ZodSchema | JsonSchema): JsonSchema {\n if (isZodSchema(schema)) {\n return zodToJsonSchema(schema);\n }\n return schema;\n}\n","// ──────────────────────────────────────────────────────\n// ADK Schema Utilities\n// ──────────────────────────────────────────────────────\n// Validation utilities and provider-specific format converters\n// ──────────────────────────────────────────────────────\n\nimport type { ZodSchema } from \"zod\";\nimport type { JsonSchema } from \"../types/agent\";\nimport { ensureJsonSchema, isZodSchema } from \"./structured-output\";\n\n/** Validate output against a Zod schema */\nexport function validateOutput<T>(\n output: string,\n schema: ZodSchema<T>,\n): { success: true; data: T } | { success: false; error: string } {\n try {\n const parsed = JSON.parse(output);\n const result = schema.safeParse(parsed);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error.message };\n } catch (e) {\n return { success: false, error: `Invalid JSON: ${e instanceof Error ? e.message : String(e)}` };\n }\n}\n\n/** Anthropic structured output: use tool_use with forced single-tool call */\nexport function toAnthropicToolSchema(\n schema: ZodSchema | JsonSchema,\n name = \"structured_output\",\n): { name: string; description: string; input_schema: JsonSchema } {\n const jsonSchema = ensureJsonSchema(schema);\n return {\n name,\n description: \"Generate structured output matching the specified schema\",\n input_schema: jsonSchema,\n };\n}\n\n/** OpenAI structured output: response_format with json_schema */\nexport function toOpenAIResponseFormat(\n schema: ZodSchema | JsonSchema,\n name = \"output\",\n): { type: \"json_schema\"; json_schema: { name: string; strict: boolean; schema: JsonSchema } } {\n const jsonSchema = ensureJsonSchema(schema);\n return {\n type: \"json_schema\",\n json_schema: {\n name,\n strict: true,\n schema: jsonSchema,\n },\n };\n}\n\n/** Google structured output: generation_config.response_schema */\nexport function toGoogleSchemaFormat(schema: ZodSchema | JsonSchema): {\n responseMimeType: string;\n responseSchema: JsonSchema;\n} {\n const jsonSchema = ensureJsonSchema(schema);\n return {\n responseMimeType: \"application/json\",\n responseSchema: jsonSchema,\n };\n}\n\n/** Convert a schema (Zod or JSON) to LLM tool definition format */\nexport function schemaToToolInput(schema: ZodSchema | JsonSchema): Record<string, unknown> {\n if (isZodSchema(schema)) {\n return ensureJsonSchema(schema) as Record<string, unknown>;\n }\n return schema as Record<string, unknown>;\n}\n","// ──────────────────────────────────────────────────────\n// ADK Guardrail Engine\n// ──────────────────────────────────────────────────────\n\nimport type { ADKEventBus } from \"../events/event-bus\";\nimport type {\n GuardrailConfig,\n GuardrailResult,\n GuardrailType,\n InputGuardrail,\n OutputGuardrail,\n ToolGuardrail,\n} from \"../types/guardrail\";\nimport type { ChatMessage } from \"../types/llm\";\nimport type { RunContext } from \"../types/runner\";\n\n/** Error thrown when a tripwire guardrail fails */\nexport class GuardrailTripwireError extends Error {\n constructor(\n public readonly guardrailName: string,\n public readonly result: GuardrailResult,\n ) {\n super(`Guardrail tripwire: ${guardrailName} — ${result.message ?? \"blocked\"}`);\n this.name = \"GuardrailTripwireError\";\n }\n}\n\nexport class GuardrailEngine {\n private eventBus?: ADKEventBus;\n\n /** Attach an ADKEventBus for guardrail audit events */\n setEventBus(bus: ADKEventBus): void {\n this.eventBus = bus;\n }\n\n /**\n * Determine whether a guardrail result should block execution.\n * - info/warning: never block (soft constraints)\n * - critical: always block regardless of tripwire\n * - error (default): block only if tripwire is true (backward compatible)\n */\n private shouldBlock(result: GuardrailResult): boolean {\n if (result.passed) return false;\n const severity = result.severity ?? \"error\";\n if (severity === \"info\" || severity === \"warning\") return false;\n if (severity === \"critical\") return true;\n return result.tripwire; // \"error\" severity: respect tripwire setting\n }\n\n /** Emit guardrail.triggered events for each result */\n private emitGuardrailEvents(\n results: GuardrailResult[],\n guardrailType: GuardrailType,\n ctx: RunContext,\n ): void {\n if (!this.eventBus) return;\n for (const result of results) {\n this.eventBus.emit(\"guardrail.triggered\", {\n runId: ctx.runId,\n guardrailName: result.name,\n type: guardrailType,\n passed: result.passed,\n tripwire: result.tripwire,\n agentName: ctx.agentName,\n severity: result.severity,\n message: result.message,\n timestamp: Date.now(),\n });\n }\n }\n\n /** Run all input guardrails. Throws GuardrailTripwireError if a tripwire fails. */\n async runInputGuardrails(\n input: string,\n messages: ChatMessage[],\n ctx: RunContext,\n guardrails: GuardrailConfig[],\n ): Promise<GuardrailResult[]> {\n const inputGuardrails = guardrails.filter((g) => g.guardrail.type === \"input\");\n if (inputGuardrails.length === 0) return [];\n\n const results = await Promise.all(\n inputGuardrails.map(async (config) => {\n const guardrail = config.guardrail as InputGuardrail;\n const result = await guardrail.execute(input, messages, ctx);\n // Allow config-level tripwire override\n if (config.tripwire !== undefined) {\n result.tripwire = config.tripwire;\n }\n return result;\n }),\n );\n\n // Emit audit events for all results\n this.emitGuardrailEvents(results, \"input\", ctx);\n\n // Check for blocking failures (severity-aware)\n for (const result of results) {\n if (this.shouldBlock(result)) {\n throw new GuardrailTripwireError(result.name, result);\n }\n }\n\n return results;\n }\n\n /** Run all output guardrails. Throws GuardrailTripwireError if a tripwire fails. */\n async runOutputGuardrails(\n output: string,\n messages: ChatMessage[],\n ctx: RunContext,\n guardrails: GuardrailConfig[],\n ): Promise<GuardrailResult[]> {\n const outputGuardrails = guardrails.filter((g) => g.guardrail.type === \"output\");\n if (outputGuardrails.length === 0) return [];\n\n const results = await Promise.all(\n outputGuardrails.map(async (config) => {\n const guardrail = config.guardrail as OutputGuardrail;\n const result = await guardrail.execute(output, messages, ctx);\n if (config.tripwire !== undefined) {\n result.tripwire = config.tripwire;\n }\n return result;\n }),\n );\n\n // Emit audit events for all results\n this.emitGuardrailEvents(results, \"output\", ctx);\n\n for (const result of results) {\n if (this.shouldBlock(result)) {\n throw new GuardrailTripwireError(result.name, result);\n }\n }\n\n return results;\n }\n\n /** Run tool guardrails before tool execution. Throws on tripwire failure. */\n async runToolGuardrails(\n toolName: string,\n input: unknown,\n ctx: RunContext,\n guardrails: GuardrailConfig[],\n ): Promise<GuardrailResult[]> {\n const toolGuardrails = guardrails.filter((g) => g.guardrail.type === \"tool\");\n if (toolGuardrails.length === 0) return [];\n\n const results = await Promise.all(\n toolGuardrails.map(async (config) => {\n const guardrail = config.guardrail as ToolGuardrail;\n const result = await guardrail.execute(toolName, input, ctx);\n if (config.tripwire !== undefined) {\n result.tripwire = config.tripwire;\n }\n return result;\n }),\n );\n\n // Emit audit events for all results\n this.emitGuardrailEvents(results, \"tool\", ctx);\n\n for (const result of results) {\n if (this.shouldBlock(result)) {\n throw new GuardrailTripwireError(result.name, result);\n }\n }\n\n return results;\n }\n}\n","// ──────────────────────────────────────────────────────\n// Built-in: Content Filter Guardrail\n// ──────────────────────────────────────────────────────\n\nimport type { GuardrailResult, InputGuardrail, OutputGuardrail } from \"../../types/guardrail\";\nimport type { ChatMessage } from \"../../types/llm\";\nimport type { RunContext } from \"../../types/runner\";\n\ninterface ContentFilterOptions {\n /** Block patterns (regex) */\n blockedPatterns?: RegExp[];\n /** Block keywords (case-insensitive) */\n blockedKeywords?: string[];\n /** Max content length */\n maxLength?: number;\n /** Whether to tripwire on failure (default: true) */\n tripwire?: boolean;\n}\n\n/** Creates a content filter guardrail (input guardrail) */\nexport function contentFilter(options: ContentFilterOptions = {}): InputGuardrail {\n const { blockedPatterns = [], blockedKeywords = [], maxLength, tripwire = true } = options;\n\n const check = (content: string): GuardrailResult => {\n // Check blocked patterns\n for (const pattern of blockedPatterns) {\n if (pattern.test(content)) {\n return {\n name: \"content-filter\",\n type: \"input\",\n passed: false,\n tripwire,\n message: `Content matches blocked pattern: ${pattern}`,\n };\n }\n }\n\n // Check blocked keywords\n const lowerContent = content.toLowerCase();\n for (const keyword of blockedKeywords) {\n if (lowerContent.includes(keyword.toLowerCase())) {\n return {\n name: \"content-filter\",\n type: \"input\",\n passed: false,\n tripwire,\n message: `Content contains blocked keyword: ${keyword}`,\n };\n }\n }\n\n // Check length\n if (maxLength && content.length > maxLength) {\n return {\n name: \"content-filter\",\n type: \"input\",\n passed: false,\n tripwire,\n message: `Content exceeds max length: ${content.length} > ${maxLength}`,\n };\n }\n\n return { name: \"content-filter\", type: \"input\", passed: true, tripwire };\n };\n\n return {\n name: \"content-filter\",\n type: \"input\" as const,\n tripwire,\n async execute(\n input: string,\n _messages: ChatMessage[],\n _ctx: RunContext,\n ): Promise<GuardrailResult> {\n const result = check(input);\n result.type = \"input\";\n return result;\n },\n };\n}\n","// ──────────────────────────────────────────────────────\n// Built-in: Consent Gate Guardrail\n// ──────────────────────────────────────────────────────\n// Extracted from @aizona/platform-agents/orchestrator/consent-gate.ts\n// Simplified for ADK: uses a ConsentHandler callback instead of in-memory state\n// ──────────────────────────────────────────────────────\n\nimport type { ConsentLevel } from \"../../types/agent\";\nimport type {\n ConsentHandler,\n ConsentRequest,\n GuardrailResult,\n InputGuardrail,\n} from \"../../types/guardrail\";\nimport type { ChatMessage } from \"../../types/llm\";\nimport type { RunContext } from \"../../types/runner\";\n\nlet requestCounter = 0;\n\n/** Creates a consent gate guardrail */\nexport function consentGate(level: ConsentLevel, handler?: ConsentHandler): InputGuardrail {\n return {\n name: \"consent-gate\",\n type: \"input\",\n tripwire: true,\n async execute(\n _input: string,\n _messages: ChatMessage[],\n ctx: RunContext,\n ): Promise<GuardrailResult> {\n // Auto consent — always allow\n if (level === \"auto\") {\n return { name: \"consent-gate\", type: \"input\", passed: true, tripwire: true };\n }\n\n // Notify — allow but log\n if (level === \"notify\") {\n return {\n name: \"consent-gate\",\n type: \"input\",\n passed: true,\n tripwire: false,\n message: `Agent ${ctx.agentName} is executing (notification)`,\n };\n }\n\n // Explicit / multi_party — need handler\n if (!handler) {\n return {\n name: \"consent-gate\",\n type: \"input\",\n passed: false,\n tripwire: true,\n message: `Consent level \"${level}\" requires a handler but none provided`,\n };\n }\n\n const request: ConsentRequest = {\n id: `consent-${++requestCounter}`,\n agentName: ctx.agentName,\n action: `run-${ctx.runId}`,\n consentLevel: level,\n requiredApprovals: level === \"multi_party\" ? 3 : 1,\n currentApprovals: [],\n rejectedBy: null,\n status: \"pending\",\n createdAt: Date.now(),\n expiresAt: Date.now() + 3600000, // 1 hour\n };\n\n const decision = await handler(request);\n\n return {\n name: \"consent-gate\",\n type: \"input\",\n passed: decision.allowed,\n tripwire: true,\n message: decision.allowed\n ? `Consent granted (${decision.status})`\n : `Consent denied: ${decision.reason ?? \"rejected\"}`,\n };\n },\n };\n}\n","// ──────────────────────────────────────────────────────\n// Built-in: Budget Limit Guardrail\n// ──────────────────────────────────────────────────────\n\nimport type { GuardrailResult, OutputGuardrail } from \"../../types/guardrail\";\nimport type { ChatMessage } from \"../../types/llm\";\nimport type { RunContext } from \"../../types/runner\";\n\n/** Creates a budget limit guardrail (checks accumulated cost after each LLM call) */\nexport function budgetLimit(maxUsd: number): OutputGuardrail {\n return {\n name: \"budget-limit\",\n type: \"output\",\n tripwire: true,\n async execute(\n _output: string,\n _messages: ChatMessage[],\n ctx: RunContext,\n ): Promise<GuardrailResult> {\n if (ctx.usage.totalCostUsd > maxUsd) {\n return {\n name: \"budget-limit\",\n type: \"output\",\n passed: false,\n tripwire: true,\n message: `Budget exceeded: $${ctx.usage.totalCostUsd.toFixed(4)} > $${maxUsd.toFixed(4)}`,\n };\n }\n\n // Warn at 80%\n if (ctx.usage.totalCostUsd > maxUsd * 0.8) {\n return {\n name: \"budget-limit\",\n type: \"output\",\n passed: true,\n tripwire: false,\n message: `Budget warning: $${ctx.usage.totalCostUsd.toFixed(4)} / $${maxUsd.toFixed(4)} (${Math.round((ctx.usage.totalCostUsd / maxUsd) * 100)}%)`,\n };\n }\n\n return { name: \"budget-limit\", type: \"output\", passed: true, tripwire: false };\n },\n };\n}\n","// ──────────────────────────────────────────────────────\n// ADK Built-in Guardrail: Budget Gate (Pre-call)\n// ──────────────────────────────────────────────────────\n// Pre-call budget gate guardrail.\n// Checks if the agent's budget allows another LLM call before execution.\n// When budget is exceeded and hard enforcement is enabled, blocks the call.\n//\n// Unlike budget-limit (output guardrail, checks AFTER the call), this\n// guardrail checks BEFORE the LLM call and prevents spending entirely.\n// ──────────────────────────────────────────────────────\n\nimport type { GuardrailResult, InputGuardrail } from \"../../types/guardrail\";\nimport type { ChatMessage } from \"../../types/llm\";\nimport type { RunContext } from \"../../types/runner\";\n\n/** Budget check data injected into RunContext.metadata.budgetCheck */\nexport interface BudgetCheckData {\n allowed: boolean;\n usagePercent: number;\n remainingUsd: number;\n}\n\nexport const budgetGateGuardrail: InputGuardrail = {\n name: \"budget-gate\",\n type: \"input\",\n tripwire: true,\n async execute(\n _input: string,\n _messages: ChatMessage[],\n ctx: RunContext,\n ): Promise<GuardrailResult> {\n // Check if budget tracking is available in context\n const budget = ctx.metadata?.budgetCheck as BudgetCheckData | undefined;\n\n if (!budget) {\n // No budget configured -- allow\n return {\n name: \"budget-gate\",\n type: \"input\",\n passed: true,\n tripwire: false,\n message: \"No budget configured\",\n };\n }\n\n if (!budget.allowed) {\n return {\n name: \"budget-gate\",\n type: \"input\",\n passed: false,\n tripwire: true,\n severity: \"critical\",\n message: `Budget exceeded: ${budget.usagePercent.toFixed(0)}% used, $${budget.remainingUsd.toFixed(4)} remaining`,\n };\n }\n\n if (budget.usagePercent >= 80) {\n return {\n name: \"budget-gate\",\n type: \"input\",\n passed: true,\n tripwire: false,\n severity: \"warning\",\n message: `Budget warning: ${budget.usagePercent.toFixed(0)}% used`,\n };\n }\n\n return {\n name: \"budget-gate\",\n type: \"input\",\n passed: true,\n tripwire: false,\n message: \"Within budget\",\n };\n },\n};\n","// ──────────────────────────────────────────────────────\n// ADK Built-in Guardrail: Token/Cost Limit\n// ──────────────────────────────────────────────────────\n\nimport type { GuardrailResult, GuardrailSeverity, OutputGuardrail } from \"../../types/guardrail\";\nimport type { ChatMessage } from \"../../types/llm\";\nimport type { RunContext } from \"../../types/runner\";\n\nexport interface TokenLimitConfig {\n /** Max total tokens (input + output) before triggering */\n maxTotalTokens?: number;\n /** Max cost USD before triggering */\n maxCostUsd?: number;\n /** Severity when limit exceeded (default: \"warning\") */\n severity?: GuardrailSeverity;\n}\n\nexport function tokenLimit(config: TokenLimitConfig): OutputGuardrail {\n const severity = config.severity ?? \"warning\";\n\n return {\n name: \"token-limit\",\n type: \"output\",\n tripwire: severity === \"critical\" || severity === \"error\",\n execute: async (\n _output: string,\n _messages: ChatMessage[],\n ctx: RunContext,\n ): Promise<GuardrailResult> => {\n const totalTokens = ctx.usage.inputTokens + ctx.usage.outputTokens;\n\n const tokenExceeded = config.maxTotalTokens && totalTokens > config.maxTotalTokens;\n const costExceeded = config.maxCostUsd && ctx.usage.totalCostUsd > config.maxCostUsd;\n\n if (tokenExceeded || costExceeded) {\n const reasons: string[] = [];\n if (tokenExceeded) reasons.push(`tokens ${totalTokens} > ${config.maxTotalTokens}`);\n if (costExceeded)\n reasons.push(`cost $${ctx.usage.totalCostUsd.toFixed(4)} > $${config.maxCostUsd}`);\n\n return {\n name: \"token-limit\",\n type: \"output\",\n passed: false,\n tripwire: severity === \"critical\" || severity === \"error\",\n severity,\n score: tokenExceeded\n ? Math.min(1, totalTokens / (config.maxTotalTokens! * 2))\n : Math.min(1, ctx.usage.totalCostUsd / (config.maxCostUsd! * 2)),\n message: `Token/cost limit exceeded: ${reasons.join(\", \")}`,\n };\n }\n\n return {\n name: \"token-limit\",\n type: \"output\",\n passed: true,\n tripwire: false,\n severity: \"info\",\n message: `Within limits: ${totalTokens} tokens, $${ctx.usage.totalCostUsd.toFixed(4)}`,\n };\n },\n };\n}\n","// ──────────────────────────────────────────────────────\n// ADK Built-in Guardrail: PII Filter\n// ──────────────────────────────────────────────────────\n\nimport type { GuardrailResult, GuardrailSeverity, OutputGuardrail } from \"../../types/guardrail\";\nimport type { ChatMessage } from \"../../types/llm\";\nimport type { RunContext } from \"../../types/runner\";\n\nexport interface PIIFilterConfig {\n /** PII types to detect */\n detect?: (\"email\" | \"phone\" | \"ssn\" | \"credit_card\")[];\n /** Severity when PII detected (default: \"warning\") */\n severity?: GuardrailSeverity;\n}\n\nconst PATTERNS: Record<string, RegExp> = {\n email: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g,\n phone: /(?:\\+?1[-.\\s]?)?\\(?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{4}/g,\n ssn: /\\b\\d{3}-\\d{2}-\\d{4}\\b/g,\n credit_card: /\\b(?:\\d{4}[-\\s]?){3}\\d{4}\\b/g,\n};\n\nexport function piiFilter(config?: PIIFilterConfig): OutputGuardrail {\n const detectTypes = config?.detect ?? [\"email\", \"phone\", \"ssn\", \"credit_card\"];\n const severity = config?.severity ?? \"warning\";\n\n return {\n name: \"pii-filter\",\n type: \"output\",\n tripwire: severity === \"critical\" || severity === \"error\",\n execute: async (\n output: string,\n _messages: ChatMessage[],\n _ctx: RunContext,\n ): Promise<GuardrailResult> => {\n const found: { type: string; count: number }[] = [];\n\n for (const type of detectTypes) {\n const pattern = PATTERNS[type];\n if (!pattern) continue;\n const matches = output.match(new RegExp(pattern.source, pattern.flags));\n if (matches && matches.length > 0) {\n found.push({ type, count: matches.length });\n }\n }\n\n if (found.length > 0) {\n const details = found.map((f) => `${f.count} ${f.type}(s)`).join(\", \");\n return {\n name: \"pii-filter\",\n type: \"output\",\n passed: false,\n tripwire: severity === \"critical\" || severity === \"error\",\n severity,\n score: Math.min(1, found.reduce((s, f) => s + f.count, 0) / 5),\n message: `PII detected in output: ${details}`,\n metadata: { detections: found },\n };\n }\n\n return {\n name: \"pii-filter\",\n type: \"output\",\n passed: true,\n tripwire: false,\n severity: \"info\",\n message: \"No PII detected\",\n };\n },\n };\n}\n","// ──────────────────────────────────────────────────────\n// ADK Content Helpers — Type guards and utilities\n// ──────────────────────────────────────────────────────\n\nimport type {\n AudioPart,\n Content,\n ContentPart,\n ImagePart,\n TextPart,\n UIArtifactPart,\n VideoPart,\n} from \"../types/content\";\n\n// ── Type Guards ──\n\n/** Check if content is multi-modal (ContentPart[]) */\nexport function isMultiModalContent(content: Content): content is ContentPart[] {\n return Array.isArray(content);\n}\n\n/** Check if a content part is a TextPart */\nexport function isTextPart(part: ContentPart): part is TextPart {\n return part.type === \"text\";\n}\n\n/** Check if a content part is an ImagePart */\nexport function isImagePart(part: ContentPart): part is ImagePart {\n return part.type === \"image\";\n}\n\n/** Check if a content part is an AudioPart */\nexport function isAudioPart(part: ContentPart): part is AudioPart {\n return part.type === \"audio\";\n}\n\n/** Check if a content part is a VideoPart */\nexport function isVideoPart(part: ContentPart): part is VideoPart {\n return part.type === \"video\";\n}\n\n/** Check if a content part is a UIArtifactPart */\nexport function isUIArtifactPart(part: ContentPart): part is UIArtifactPart {\n return part.type === \"ui_artifact\";\n}\n\n// ── Conversion Utilities ──\n\n/**\n * Extract text from Content. For strings, returns as-is.\n * For ContentPart[], concatenates all TextPart.text values.\n * Non-text parts are represented as markers.\n */\nexport function contentToString(content: Content): string {\n if (typeof content === \"string\") return content;\n\n const parts: string[] = [];\n for (const part of content) {\n switch (part.type) {\n case \"text\":\n parts.push(part.text);\n break;\n case \"image\":\n parts.push(`[Image${part.alt ? `: ${part.alt}` : \"\"}]`);\n break;\n case \"audio\":\n parts.push(`[Audio${part.transcript ? `: ${part.transcript}` : \"\"}]`);\n break;\n case \"video\":\n parts.push(\"[Video]\");\n break;\n case \"ui_artifact\":\n parts.push(`[Artifact: ${part.title}]`);\n break;\n }\n }\n return parts.join(\"\");\n}\n\n/** Alias for contentToString — backward compat with plan naming */\nexport const extractText = contentToString;\n\n/**\n * Normalize content to ContentPart[].\n * Strings become a single TextPart.\n */\nexport function contentToParts(content: Content): ContentPart[] {\n if (typeof content === \"string\") {\n return content ? [{ type: \"text\", text: content }] : [];\n }\n return content;\n}\n\n/**\n * Count media parts by type.\n */\nexport function countMediaParts(content: Content): {\n text: number;\n image: number;\n audio: number;\n video: number;\n uiArtifact: number;\n} {\n const counts = { text: 0, image: 0, audio: 0, video: 0, uiArtifact: 0 };\n\n if (typeof content === \"string\") {\n counts.text = content.length > 0 ? 1 : 0;\n return counts;\n }\n\n for (const part of content) {\n switch (part.type) {\n case \"text\":\n counts.text++;\n break;\n case \"image\":\n counts.image++;\n break;\n case \"audio\":\n counts.audio++;\n break;\n case \"video\":\n counts.video++;\n break;\n case \"ui_artifact\":\n counts.uiArtifact++;\n break;\n }\n }\n\n return counts;\n}\n","// ──────────────────────────────────────────────────────\n// Harness Notes Store — Structured note-taking\n// ──────────────────────────────────────────────────────\n\n/** Predefined note sections */\nexport type NoteSection = \"findings\" | \"decisions\" | \"todo\" | \"questions\";\n\n/** A single note entry */\nexport interface NoteEntry {\n section: NoteSection;\n content: string;\n createdAt: number;\n}\n\n/**\n * NotesStore — structured note-taking for agents across sessions.\n * Notes are organized by section (Findings, Decisions, TODO, Questions).\n * Serializable to/from JSON for cross-session persistence.\n */\nexport class NotesStore {\n private notes: NoteEntry[] = [];\n\n /** Add a note to a section */\n addNote(section: NoteSection, content: string): void {\n this.notes.push({ section, content, createdAt: Date.now() });\n }\n\n /** Get notes from a specific section or all notes */\n getNotes(section?: NoteSection): NoteEntry[] {\n if (section) {\n return this.notes.filter((n) => n.section === section).map((n) => ({ ...n }));\n }\n return this.notes.map((n) => ({ ...n }));\n }\n\n /** Get note count per section */\n getCounts(): Record<NoteSection, number> {\n const counts: Record<NoteSection, number> = {\n findings: 0,\n decisions: 0,\n todo: 0,\n questions: 0,\n };\n for (const n of this.notes) {\n counts[n.section]++;\n }\n return counts;\n }\n\n /** Clear all notes or notes in a specific section */\n clear(section?: NoteSection): void {\n if (section) {\n this.notes = this.notes.filter((n) => n.section !== section);\n } else {\n this.notes = [];\n }\n }\n\n /** Serialize to JSON for persistence */\n toJSON(): NoteEntry[] {\n return this.getNotes();\n }\n\n /** Restore from serialized state */\n static fromJSON(data: NoteEntry[]): NotesStore {\n const store = new NotesStore();\n store.notes = data.map((n) => ({ ...n }));\n return store;\n }\n}\n","// ──────────────────────────────────────────────────────\n// Harness Progress Tracker — Feature-level tracking\n// ──────────────────────────────────────────────────────\n\n/** Status of a progress feature */\nexport type FeatureStatus = \"pending\" | \"in_progress\" | \"passed\" | \"failed\";\n\n/** A tracked feature in the progress list */\nexport interface ProgressFeature {\n id: string;\n name: string;\n status: FeatureStatus;\n verifiedAt?: number;\n}\n\n/**\n * ProgressTracker — tracks feature-level progress for long-running agent sessions.\n * Serializable to/from JSON for cross-session persistence.\n */\nexport class ProgressTracker {\n private features = new Map<string, ProgressFeature>();\n\n /** Add a feature to track */\n addFeature(id: string, name: string): void {\n if (!this.features.has(id)) {\n this.features.set(id, { id, name, status: \"pending\" });\n }\n }\n\n /** Add multiple features at once */\n addFeatures(features: Array<{ id: string; name: string }>): void {\n for (const f of features) {\n this.addFeature(f.id, f.name);\n }\n }\n\n /** Update the status of a feature */\n updateStatus(id: string, status: FeatureStatus): boolean {\n const feature = this.features.get(id);\n if (!feature) return false;\n feature.status = status;\n if (status === \"passed\" || status === \"failed\") {\n feature.verifiedAt = Date.now();\n }\n return true;\n }\n\n /** Get the next pending feature */\n getNextPending(): ProgressFeature | undefined {\n for (const feature of this.features.values()) {\n if (feature.status === \"pending\") return { ...feature };\n }\n return undefined;\n }\n\n /** Get a feature by ID */\n getFeature(id: string): ProgressFeature | undefined {\n const f = this.features.get(id);\n return f ? { ...f } : undefined;\n }\n\n /** Get all features */\n getAllFeatures(): ProgressFeature[] {\n return Array.from(this.features.values()).map((f) => ({ ...f }));\n }\n\n /** Get a summary of progress */\n getSummary(): {\n total: number;\n pending: number;\n inProgress: number;\n passed: number;\n failed: number;\n percentComplete: number;\n } {\n let pending = 0;\n let inProgress = 0;\n let passed = 0;\n let failed = 0;\n for (const f of this.features.values()) {\n switch (f.status) {\n case \"pending\":\n pending++;\n break;\n case \"in_progress\":\n inProgress++;\n break;\n case \"passed\":\n passed++;\n break;\n case \"failed\":\n failed++;\n break;\n }\n }\n const total = this.features.size;\n const done = passed + failed;\n return {\n total,\n pending,\n inProgress,\n passed,\n failed,\n percentComplete: total > 0 ? Math.round((done / total) * 100) : 0,\n };\n }\n\n /** Serialize to JSON for persistence */\n toJSON(): ProgressFeature[] {\n return this.getAllFeatures();\n }\n\n /** Restore from serialized state */\n static fromJSON(data: ProgressFeature[]): ProgressTracker {\n const tracker = new ProgressTracker();\n for (const f of data) {\n tracker.features.set(f.id, { ...f });\n }\n return tracker;\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Context Summarizer — LLM-powered message summarization\n// ──────────────────────────────────────────────────────\n\nimport { extractText } from \"../content/helpers\";\nimport type { ADKLLMProvider, ChatMessage } from \"../types/llm\";\n\n/** Summarization configuration */\nexport interface SummarizationConfig {\n /** LLM provider for summarization */\n provider?: ADKLLMProvider;\n /** Model to use for summarization (cheap/fast model recommended) */\n model?: string;\n /** Max tokens for the summary (default: 500) */\n maxSummaryTokens?: number;\n}\n\n/** Partition result: messages to summarize vs. messages to keep */\nexport interface MessagePartition {\n /** Older messages to be summarized */\n summarize: ChatMessage[];\n /** Recent messages to keep verbatim */\n keep: ChatMessage[];\n}\n\nconst SUMMARIZATION_PROMPT =\n \"Summarize this conversation concisely. Preserve: key decisions, important facts, current task state, relevant tool results. Be brief but capture essential information.\";\n\n/**\n * ContextSummarizer — summarizes older messages to reduce context size.\n *\n * Uses an LLM provider if available, otherwise falls back to extractive\n * summarization (first + last sentence per message).\n */\nexport class ContextSummarizer {\n private config: SummarizationConfig;\n\n constructor(config?: SummarizationConfig) {\n this.config = config ?? {};\n }\n\n /**\n * Summarize messages into a condensed context message.\n * Falls back to extractive summarization if no LLM provider is available.\n */\n async summarize(messages: ChatMessage[]): Promise<ChatMessage> {\n if (messages.length === 0) {\n return { role: \"system\", content: \"[No previous context]\" };\n }\n\n // Try LLM-powered summarization\n if (this.config.provider) {\n try {\n return await this.llmSummarize(messages);\n } catch {\n // Fall back to extractive on LLM failure\n }\n }\n\n // Extractive fallback\n return this.extractiveSummarize(messages);\n }\n\n /**\n * Split messages: keep recent N turns verbatim, summarize the rest.\n * A \"turn\" is a user message + assistant response pair.\n */\n partitionMessages(messages: ChatMessage[], keepRecentTurns: number): MessagePartition {\n // Filter out system messages — they're handled separately\n const nonSystem = messages.filter((m) => m.role !== \"system\");\n\n if (keepRecentTurns <= 0) {\n return { summarize: nonSystem, keep: [] };\n }\n\n // Count user-message turns from the end\n let turnsFound = 0;\n let splitIndex = 0; // Default: keep everything\n\n for (let i = nonSystem.length - 1; i >= 0; i--) {\n if (nonSystem[i]?.role === \"user\") {\n turnsFound++;\n if (turnsFound >= keepRecentTurns) {\n splitIndex = i;\n break;\n }\n }\n }\n\n return {\n summarize: nonSystem.slice(0, splitIndex),\n keep: nonSystem.slice(splitIndex),\n };\n }\n\n /** LLM-powered summarization */\n private async llmSummarize(messages: ChatMessage[]): Promise<ChatMessage> {\n const provider = this.config.provider!;\n\n // Build conversation text for summarization\n const conversationText = messages\n .map((m) => `[${m.role}]: ${extractText(m.content)}`)\n .join(\"\\n\");\n\n const response = await provider.chat({\n messages: [{ role: \"user\", content: `${SUMMARIZATION_PROMPT}\\n\\n---\\n${conversationText}` }],\n model: this.config.model,\n maxTokens: this.config.maxSummaryTokens ?? 500,\n temperature: 0.3,\n });\n\n return {\n role: \"assistant\",\n content: `[Previous conversation summary]\\n${response.content}`,\n };\n }\n\n /** Extractive fallback: first + last sentence per message */\n private extractiveSummarize(messages: ChatMessage[]): ChatMessage {\n const summaryParts: string[] = [];\n\n for (const msg of messages) {\n const text = extractText(msg.content);\n if (!text || text.trim().length === 0) continue;\n\n const sentences = text\n .split(/[.!?]+/)\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\n if (sentences.length === 0) continue;\n\n if (sentences.length === 1) {\n summaryParts.push(`[${msg.role}]: ${sentences[0]}`);\n } else {\n summaryParts.push(\n `[${msg.role}]: ${sentences[0]}. ... ${sentences[sentences.length - 1]}.`,\n );\n }\n }\n\n return {\n role: \"assistant\",\n content: `[Previous conversation summary]\\n${summaryParts.join(\"\\n\")}`,\n };\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Token Counter — Estimate token counts for messages and tools\n// ──────────────────────────────────────────────────────\n\nimport { isMultiModalContent } from \"../content/helpers\";\nimport type { ChatMessage, LLMToolDefinition } from \"../types/llm\";\n\n/** Token counting strategy */\nexport type TokenCounterStrategy = \"character\" | \"tiktoken-approx\" | \"provider-reported\";\n\n/** Token counter configuration */\nexport interface TokenCounterConfig {\n strategy?: TokenCounterStrategy;\n}\n\n/** Message overhead: ~4 tokens per message for role framing */\nconst MESSAGE_OVERHEAD = 4;\n\n/** Tool framing overhead: name + description + schema framing */\nconst TOOL_FRAMING_OVERHEAD = 10;\n\n/**\n * TokenCounter — estimates token counts without external dependencies.\n *\n * Strategies:\n * - \"character\": simple `Math.ceil(text.length / 4)` (cheapest, ~70% accuracy)\n * - \"tiktoken-approx\": BPE-approximation without external deps (~85% accuracy)\n * - \"provider-reported\": starts with tiktoken-approx, calibrates from actual provider counts\n */\nexport class TokenCounter {\n private strategy: TokenCounterStrategy;\n private calibrationFactor = 1.0;\n\n constructor(config?: TokenCounterConfig) {\n this.strategy = config?.strategy ?? \"tiktoken-approx\";\n }\n\n /** Count tokens in a text string */\n countText(text: string): number {\n if (!text) return 0;\n\n switch (this.strategy) {\n case \"character\":\n return Math.ceil(text.length / 4);\n case \"tiktoken-approx\":\n case \"provider-reported\":\n return Math.ceil(this.bpeApprox(text) * this.calibrationFactor);\n default:\n return Math.ceil(text.length / 4);\n }\n }\n\n /** Count tokens in a single message (content + overhead) */\n countMessage(msg: ChatMessage): number {\n let tokens = MESSAGE_OVERHEAD;\n\n if (isMultiModalContent(msg.content)) {\n for (const part of msg.content) {\n if (part.type === \"text\") {\n tokens += this.countText(part.text);\n } else if (part.type === \"image\") {\n tokens += this.estimateImageTokens(part);\n } else if (part.type === \"audio\") {\n tokens += this.estimateAudioTokens(part);\n } else if (part.type === \"video\") {\n tokens += this.estimateVideoTokens(part);\n } else if (part.type === \"ui_artifact\") {\n tokens += this.countText(part.content);\n }\n }\n } else {\n tokens += this.countText(msg.content);\n }\n\n // Tool calls add tokens\n if (msg.toolCalls) {\n for (const tc of msg.toolCalls) {\n tokens += this.countText(tc.name) + this.countText(JSON.stringify(tc.input)) + 4;\n }\n }\n\n // Tool results add tokens\n if (msg.toolResults) {\n for (const tr of msg.toolResults) {\n tokens +=\n this.countText(typeof tr.output === \"string\" ? tr.output : JSON.stringify(tr.output)) + 4;\n }\n }\n\n return tokens;\n }\n\n /** Count tokens across multiple messages */\n countMessages(messages: ChatMessage[]): number {\n return messages.reduce((sum, msg) => sum + this.countMessage(msg), 0);\n }\n\n /** Count tokens for a single tool definition */\n countToolDef(tool: LLMToolDefinition): number {\n const nameTokens = this.countText(tool.name);\n const descTokens = this.countText(tool.description);\n const schemaTokens = this.countText(JSON.stringify(tool.inputSchema));\n return nameTokens + descTokens + schemaTokens + TOOL_FRAMING_OVERHEAD;\n }\n\n /** Count tokens for all tool definitions */\n countToolDefs(tools: LLMToolDefinition[]): number {\n return tools.reduce((sum, tool) => sum + this.countToolDef(tool), 0);\n }\n\n /** Calibrate from actual provider-reported token count */\n calibrate(text: string, actualTokens: number): void {\n if (this.strategy !== \"provider-reported\") return;\n const estimated = this.bpeApprox(text);\n if (estimated > 0) {\n this.calibrationFactor = actualTokens / estimated;\n }\n }\n\n /** Get current calibration factor */\n getCalibrationFactor(): number {\n return this.calibrationFactor;\n }\n\n /** Estimate image tokens based on detail level */\n private estimateImageTokens(part: import(\"../types/content\").ImagePart): number {\n const detail = part.source.type === \"url\" ? (part.source.detail ?? \"auto\") : \"auto\";\n if (detail === \"low\") return 85;\n if (detail === \"high\") return 1600;\n return 800; // auto\n }\n\n /** Estimate audio tokens from duration or base64 size */\n private estimateAudioTokens(part: import(\"../types/content\").AudioPart): number {\n if (part.durationSec) return Math.ceil(part.durationSec * 25); // ~25 tokens per second\n if (part.source.type === \"base64\") return Math.ceil(part.source.data.length / 100);\n return 500; // fallback\n }\n\n /** Estimate video tokens from duration or base64 size */\n private estimateVideoTokens(part: import(\"../types/content\").VideoPart): number {\n if (part.durationSec) return Math.ceil(part.durationSec * 100); // ~100 tokens per second\n if (part.source.type === \"base64\") return Math.ceil(part.source.data.length / 50);\n return 2000; // fallback\n }\n\n /**\n * BPE-approximation: split on whitespace, count sub-word splits for long words,\n * account for punctuation. ~85% accuracy without external deps.\n */\n private bpeApprox(text: string): number {\n if (!text) return 0;\n\n let tokenCount = 0;\n // Split on whitespace\n const words = text.split(/\\s+/).filter((w) => w.length > 0);\n\n for (const word of words) {\n if (word.length <= 3) {\n // Short words are usually 1 token\n tokenCount += 1;\n } else if (word.length <= 8) {\n // Medium words: ~1.3 tokens\n tokenCount += Math.ceil(word.length / 6);\n } else {\n // Long words get split into sub-word tokens (~3-4 chars per token)\n tokenCount += Math.ceil(word.length / 3.5);\n }\n\n // Punctuation attached to words adds extra tokens\n const punctuation = word.match(/[^\\w]/g);\n if (punctuation) {\n tokenCount += Math.ceil(punctuation.length / 2);\n }\n }\n\n // Minimum 1 token for non-empty text\n return Math.max(1, tokenCount);\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Context Manager — Message trimming strategies\n// ──────────────────────────────────────────────────────\n\nimport type { ChatMessage } from \"../types/llm\";\nimport type { ContextStrategy } from \"../types/session\";\nimport { ContextSummarizer, type SummarizationConfig } from \"./context-summarizer\";\nimport { TokenCounter, type TokenCounterStrategy } from \"./token-counter\";\n\n/** Context manager configuration */\nexport interface ContextManagerConfig {\n /** Token counting strategy */\n tokenCounterStrategy?: TokenCounterStrategy;\n /** Summarization config (provider, model, maxSummaryTokens) */\n summarization?: SummarizationConfig;\n /** Number of recent turns to always keep verbatim (default: 4) */\n keepRecentTurns?: number;\n}\n\nexport class ContextManager {\n private tokenCounter: TokenCounter;\n private summarizer?: ContextSummarizer;\n private keepRecentTurns: number;\n\n constructor(config?: ContextManagerConfig) {\n this.tokenCounter = new TokenCounter({ strategy: config?.tokenCounterStrategy });\n this.keepRecentTurns = config?.keepRecentTurns ?? 4;\n if (config?.summarization) {\n this.summarizer = new ContextSummarizer(config.summarization);\n }\n }\n\n /**\n * Trim messages to fit within a token budget.\n * Always preserves the system message (first) and most recent messages.\n */\n async trimToFit(\n messages: ChatMessage[],\n maxTokens: number,\n strategy: ContextStrategy = \"sliding-window\",\n ): Promise<ChatMessage[]> {\n // Calculate current token count\n const totalTokens = this.getTokenCount(messages);\n if (totalTokens <= maxTokens) return [...messages];\n\n if (strategy === \"smart-summary\" && this.summarizer) {\n return this.smartSummary(messages, maxTokens);\n }\n\n if (strategy === \"jit\") {\n return this.jitTrim(messages, maxTokens);\n }\n\n // Default: sliding window\n return this.slidingWindow(messages, maxTokens);\n }\n\n /** Get total token count for messages */\n getTokenCount(messages: ChatMessage[]): number {\n return this.tokenCounter.countMessages(messages);\n }\n\n private async smartSummary(messages: ChatMessage[], maxTokens: number): Promise<ChatMessage[]> {\n const result: ChatMessage[] = [];\n let tokenCount = 0;\n\n // 1. Always keep system message\n const systemMsg = messages.find((m) => m.role === \"system\");\n if (systemMsg) {\n result.push(systemMsg);\n tokenCount += this.tokenCounter.countMessage(systemMsg);\n }\n\n // 2. Partition: summarize older, keep recent turns\n const nonSystem = messages.filter((m) => m.role !== \"system\");\n const partitioned = this.summarizer?.partitionMessages(nonSystem, this.keepRecentTurns);\n if (!partitioned) return messages;\n const { summarize, keep } = partitioned;\n\n // 3. If there are messages to summarize, generate summary\n if (summarize.length > 0) {\n const summaryMsg = await this.summarizer?.summarize(summarize);\n if (!summaryMsg) return messages;\n const summaryTokens = this.tokenCounter.countMessage(summaryMsg);\n\n // Check if summary + recent fits\n const recentTokens = this.tokenCounter.countMessages(keep);\n if (tokenCount + summaryTokens + recentTokens <= maxTokens) {\n result.push(summaryMsg);\n result.push(...keep);\n return result;\n }\n\n // Summary + all recent doesn't fit — add summary, then fill recent from end\n result.push(summaryMsg);\n tokenCount += summaryTokens;\n\n // Add recent messages from end until budget exhausted\n const included: ChatMessage[] = [];\n for (let i = keep.length - 1; i >= 0; i--) {\n const msgTokens = this.tokenCounter.countMessage(keep[i]!);\n if (tokenCount + msgTokens > maxTokens) break;\n included.unshift(keep[i]!);\n tokenCount += msgTokens;\n }\n result.push(...included);\n return result;\n }\n\n // No messages to summarize — just apply sliding window\n result.push(...keep);\n return this.slidingWindow(result, maxTokens);\n }\n\n /**\n * JIT (Just-In-Time) strategy: keep only system prompt + last N messages.\n * Older messages are dropped (they can be recalled via a recall_context tool).\n */\n private jitTrim(messages: ChatMessage[], maxTokens: number): ChatMessage[] {\n const result: ChatMessage[] = [];\n let tokenCount = 0;\n\n // Always keep system message\n const systemMsg = messages.find((m) => m.role === \"system\");\n if (systemMsg) {\n result.push(systemMsg);\n tokenCount += this.tokenCounter.countMessage(systemMsg);\n }\n\n // Keep recent messages from end (more aggressive than sliding-window)\n const nonSystem = messages.filter((m) => m.role !== \"system\");\n const included: ChatMessage[] = [];\n\n for (let i = nonSystem.length - 1; i >= 0; i--) {\n const msgTokens = this.tokenCounter.countMessage(nonSystem[i]!);\n if (tokenCount + msgTokens > maxTokens) break;\n included.unshift(nonSystem[i]!);\n tokenCount += msgTokens;\n }\n\n result.push(...included);\n return result;\n }\n\n private slidingWindow(messages: ChatMessage[], maxTokens: number): ChatMessage[] {\n const result: ChatMessage[] = [];\n let tokenCount = 0;\n\n // Always keep system message\n if (messages.length > 0 && messages[0]?.role === \"system\") {\n result.push(messages[0]!);\n tokenCount += this.tokenCounter.countMessage(messages[0]!);\n }\n\n // Add messages from the end (most recent first)\n const nonSystem = messages.filter((m) => m.role !== \"system\");\n const included: ChatMessage[] = [];\n\n for (let i = nonSystem.length - 1; i >= 0; i--) {\n const msgTokens = this.tokenCounter.countMessage(nonSystem[i]!);\n if (tokenCount + msgTokens > maxTokens) break;\n included.unshift(nonSystem[i]!);\n tokenCount += msgTokens;\n }\n\n result.push(...included);\n return result;\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Code Executor — Sandboxed JavaScript execution\n// ──────────────────────────────────────────────────────\n// Enables programmatic tool calling: agent writes code\n// that orchestrates tools, reducing token usage by ~37%.\n// ──────────────────────────────────────────────────────\n\nimport * as vm from \"node:vm\";\nimport type { ToolContext, ToolDef } from \"../types/tool\";\n\n/** Configuration for the code executor */\nexport interface CodeExecutorConfig {\n /** Timeout in milliseconds (default: 30000) */\n timeoutMs?: number;\n}\n\n/** Result of code execution */\nexport interface CodeExecutionResult {\n success: boolean;\n result: unknown;\n error?: string;\n toolCallsPerformed: string[];\n}\n\n/**\n * CodeExecutor — sandboxed JavaScript executor with tool bindings.\n * Agent code can call tools via `tools.toolName(input)` which returns a Promise.\n * No filesystem, network, or process access from the sandbox.\n */\nexport class CodeExecutor {\n private timeoutMs: number;\n\n constructor(config?: CodeExecutorConfig) {\n this.timeoutMs = config?.timeoutMs ?? 30_000;\n }\n\n /**\n * Execute code in a sandbox with tool bindings.\n * @param code JavaScript code to execute\n * @param tools Available tools that the code can call\n * @param toolCtx Tool context for tool calls\n */\n async execute(\n code: string,\n tools: ToolDef[],\n toolCtx: ToolContext,\n ): Promise<CodeExecutionResult> {\n const toolCallsPerformed: string[] = [];\n\n // Build tool bindings as async functions\n const toolBindings: Record<string, (input: unknown) => Promise<unknown>> = {};\n for (const tool of tools) {\n toolBindings[tool.name] = async (input: unknown) => {\n toolCallsPerformed.push(tool.name);\n return tool.execute(input as never, toolCtx);\n };\n }\n\n // Create sandbox with safe globals only\n const sandbox: Record<string, unknown> = {\n tools: toolBindings,\n console: {\n log: () => {},\n warn: () => {},\n error: () => {},\n },\n JSON,\n Math,\n Date,\n parseInt,\n parseFloat,\n isNaN,\n isFinite,\n Array,\n Object,\n String,\n Number,\n Boolean,\n Map,\n Set,\n RegExp,\n Error,\n Promise,\n setTimeout: undefined,\n setInterval: undefined,\n setImmediate: undefined,\n // Explicitly block dangerous APIs\n require: undefined,\n process: undefined,\n global: undefined,\n globalThis: undefined,\n __dirname: undefined,\n __filename: undefined,\n Buffer: undefined,\n fetch: undefined,\n XMLHttpRequest: undefined,\n };\n\n const context = vm.createContext(sandbox);\n\n // Wrap code in an async IIFE to support await\n const wrappedCode = `\n (async () => {\n ${code}\n })()\n `;\n\n try {\n const script = new vm.Script(wrappedCode, {\n filename: \"agent-code.js\",\n });\n\n const result = await script.runInContext(context, {\n timeout: this.timeoutMs,\n });\n\n return {\n success: true,\n result,\n toolCallsPerformed,\n };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n result: null,\n error: errorMsg,\n toolCallsPerformed,\n };\n }\n }\n}\n","// ──────────────────────────────────────────────────────\n// Built-in execute_code tool\n// ──────────────────────────────────────────────────────\n\nimport { CodeExecutor } from \"../../runner/code-executor\";\nimport type { ToolContext, ToolDef } from \"../../types/tool\";\n\ninterface ExecuteCodeInput {\n code: string;\n description?: string;\n}\n\n/**\n * Create an execute_code tool that runs agent-written JavaScript\n * in a sandboxed environment with access to all available tools.\n */\nexport function createExecuteCodeTool(\n availableTools: ToolDef[],\n config?: { timeoutMs?: number },\n): ToolDef<ExecuteCodeInput> {\n const executor = new CodeExecutor({ timeoutMs: config?.timeoutMs });\n\n return {\n name: \"execute_code\",\n description:\n \"Execute JavaScript code with access to all tools via `tools.toolName(input)`. \" +\n \"Use this to call multiple tools in a single step, process results, or implement complex logic. \" +\n \"Return a value from the code block to see the result.\",\n inputSchema: {\n type: \"object\",\n properties: {\n code: {\n type: \"string\",\n description:\n \"JavaScript code to execute. Tools are available as `tools.toolName(input)`. Use `return` to return a value.\",\n },\n description: {\n type: \"string\",\n description: \"Brief description of what the code does\",\n },\n },\n required: [\"code\"],\n },\n examples: [\n {\n input: {\n code: 'const result = await tools.read_file({ path: \"config.json\" }); return JSON.parse(result);',\n description: \"Read and parse a config file\",\n },\n description: \"Call a tool and process its result\",\n },\n ],\n execute: async (input: ExecuteCodeInput, ctx: ToolContext) => {\n // Filter out execute_code itself to prevent recursion\n const safeTools = availableTools.filter((t) => t.name !== \"execute_code\");\n const result = await executor.execute(input.code, safeTools, ctx);\n return result;\n },\n };\n}\n","// ──────────────────────────────────────────────────────\n// Built-in write_note / read_notes tools\n// ──────────────────────────────────────────────────────\n\nimport type { NoteSection, NotesStore } from \"../../harness/notes-store\";\nimport type { ToolContext, ToolDef } from \"../../types/tool\";\n\ninterface WriteNoteInput {\n section: NoteSection;\n content: string;\n}\n\ninterface ReadNotesInput {\n section?: NoteSection;\n}\n\nexport function createWriteNoteTool(store: NotesStore): ToolDef<WriteNoteInput> {\n return {\n name: \"write_note\",\n description:\n \"Write a structured note. Sections: 'findings' for discoveries, 'decisions' for choices made, 'todo' for pending items, 'questions' for open questions.\",\n inputSchema: {\n type: \"object\",\n properties: {\n section: {\n type: \"string\",\n enum: [\"findings\", \"decisions\", \"todo\", \"questions\"],\n description: \"Note section\",\n },\n content: { type: \"string\", description: \"Note content\" },\n },\n required: [\"section\", \"content\"],\n },\n execute: async (input: WriteNoteInput, _ctx: ToolContext) => {\n store.addNote(input.section, input.content);\n return { written: true, section: input.section };\n },\n };\n}\n\nexport function createReadNotesTool(store: NotesStore): ToolDef<ReadNotesInput> {\n return {\n name: \"read_notes\",\n description:\n \"Read structured notes. Optionally filter by section: findings, decisions, todo, questions.\",\n inputSchema: {\n type: \"object\",\n properties: {\n section: {\n type: \"string\",\n enum: [\"findings\", \"decisions\", \"todo\", \"questions\"],\n description: \"Filter by section (optional)\",\n },\n },\n },\n execute: async (input: ReadNotesInput, _ctx: ToolContext) => {\n const notes = store.getNotes(input.section);\n const counts = store.getCounts();\n return { notes, counts };\n },\n };\n}\n","// ──────────────────────────────────────────────────────\n// Built-in update_progress tool\n// ──────────────────────────────────────────────────────\n\nimport type { FeatureStatus, ProgressTracker } from \"../../harness/progress-tracker\";\nimport type { ToolContext, ToolDef } from \"../../types/tool\";\n\ninterface ProgressInput {\n action: \"add\" | \"update\" | \"get_next\" | \"summary\";\n featureId?: string;\n featureName?: string;\n status?: FeatureStatus;\n}\n\nexport function createProgressTool(tracker: ProgressTracker): ToolDef<ProgressInput> {\n return {\n name: \"update_progress\",\n description:\n \"Track progress on features. Actions: 'add' a new feature, 'update' status (pending/in_progress/passed/failed), 'get_next' pending feature, 'summary' of all progress.\",\n inputSchema: {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\"add\", \"update\", \"get_next\", \"summary\"],\n description: \"Action to perform\",\n },\n featureId: { type: \"string\", description: \"Feature ID (for add/update)\" },\n featureName: { type: \"string\", description: \"Feature name (for add)\" },\n status: {\n type: \"string\",\n enum: [\"pending\", \"in_progress\", \"passed\", \"failed\"],\n description: \"New status (for update)\",\n },\n },\n required: [\"action\"],\n },\n execute: async (input: ProgressInput, _ctx: ToolContext) => {\n switch (input.action) {\n case \"add\": {\n if (!input.featureId || !input.featureName) {\n return { error: \"featureId and featureName required for add\" };\n }\n tracker.addFeature(input.featureId, input.featureName);\n return { added: input.featureId };\n }\n case \"update\": {\n if (!input.featureId || !input.status) {\n return { error: \"featureId and status required for update\" };\n }\n const updated = tracker.updateStatus(input.featureId, input.status);\n return { updated, featureId: input.featureId, status: input.status };\n }\n case \"get_next\": {\n const next = tracker.getNextPending();\n return next ?? { message: \"No pending features\" };\n }\n case \"summary\": {\n return tracker.getSummary();\n }\n default:\n return { error: `Unknown action: ${input.action}` };\n }\n },\n };\n}\n","// ──────────────────────────────────────────────────────\n// ADK Tool Selector — Dynamic per-turn tool filtering\n// ──────────────────────────────────────────────────────\n\nimport type { ChatMessage } from \"../types/llm\";\nimport type { ToolDef } from \"../types/tool\";\n\n/** Tool selection strategy */\nexport type ToolSelectionStrategy = \"all\" | \"keyword\" | \"deferred\";\n\n/** Tool selection configuration */\nexport interface ToolSelectionConfig {\n /** Max tools to send to LLM per turn (default: 20) */\n maxToolsPerTurn?: number;\n /** Selection strategy (default: \"all\") */\n strategy?: ToolSelectionStrategy;\n /** Minimum relevance score to include (default: 0.1) */\n minRelevance?: number;\n /** Boost tools used in recent turns (default: true) */\n includeRecentlyUsed?: boolean;\n /** How many recent turns to consider for recently-used boost (default: 3) */\n recentTurnWindow?: number;\n /** Tool names that are never filtered out */\n alwaysInclude?: string[];\n}\n\n/** Tool relevance score */\nexport interface ToolRelevanceScore {\n tool: ToolDef;\n score: number;\n reason: string;\n}\n\n/** Default configuration values */\nconst DEFAULTS = {\n maxToolsPerTurn: 20,\n strategy: \"all\" as ToolSelectionStrategy,\n minRelevance: 0.1,\n includeRecentlyUsed: true,\n recentTurnWindow: 3,\n};\n\n/**\n * ToolSelector — selects relevant tools for each LLM turn.\n *\n * Strategies:\n * - \"all\": pass through all tools (no filtering)\n * - \"keyword\": extract keywords from recent messages, match against tool name + description\n */\nexport class ToolSelector {\n private config: Required<Omit<ToolSelectionConfig, \"alwaysInclude\">> & {\n alwaysInclude: string[];\n };\n\n constructor(config?: ToolSelectionConfig) {\n this.config = {\n maxToolsPerTurn: config?.maxToolsPerTurn ?? DEFAULTS.maxToolsPerTurn,\n strategy: config?.strategy ?? DEFAULTS.strategy,\n minRelevance: config?.minRelevance ?? DEFAULTS.minRelevance,\n includeRecentlyUsed: config?.includeRecentlyUsed ?? DEFAULTS.includeRecentlyUsed,\n recentTurnWindow: config?.recentTurnWindow ?? DEFAULTS.recentTurnWindow,\n alwaysInclude: config?.alwaysInclude ?? [],\n };\n }\n\n /** Select tools relevant to the current conversation turn */\n selectTools(\n allTools: ToolDef[],\n messages: ChatMessage[],\n _turnNumber: number,\n recentToolCalls?: string[],\n ): ToolDef[] {\n if (this.config.strategy === \"all\") {\n return allTools.slice(0, this.config.maxToolsPerTurn);\n }\n\n // Deferred strategy: only return non-deferred tools + any already-loaded deferred tools\n if (this.config.strategy === \"deferred\") {\n const eager = allTools.filter((t) => !t.deferLoading);\n return eager.slice(0, this.config.maxToolsPerTurn);\n }\n\n // Score all tools\n const scored = this.scoreTools(allTools, messages, recentToolCalls);\n\n // Separate always-include tools\n const alwaysSet = new Set(this.config.alwaysInclude);\n const alwaysTools = scored.filter((s) => alwaysSet.has(s.tool.name));\n const regularTools = scored.filter((s) => !alwaysSet.has(s.tool.name));\n\n // Filter by min relevance, sort by score descending\n const relevant = regularTools\n .filter((s) => s.score >= this.config.minRelevance)\n .sort((a, b) => b.score - a.score);\n\n // Combine: always-include first, then top-scored up to max\n const remaining = this.config.maxToolsPerTurn - alwaysTools.length;\n const selected = [\n ...alwaysTools.map((s) => s.tool),\n ...relevant.slice(0, Math.max(0, remaining)).map((s) => s.tool),\n ];\n\n return selected;\n }\n\n /** Score all tools by relevance to current messages */\n scoreTools(\n allTools: ToolDef[],\n messages: ChatMessage[],\n recentToolCalls?: string[],\n ): ToolRelevanceScore[] {\n // Extract keywords from recent messages\n const recentMessages = messages.slice(-this.config.recentTurnWindow * 2);\n const keywords = this.extractKeywords(recentMessages);\n\n const recentSet = new Set(recentToolCalls ?? []);\n\n return allTools.map((tool) => {\n let score = 0;\n let reason = \"\";\n\n // Keyword matching against tool name + description\n const toolText = `${tool.name} ${tool.description}`.toLowerCase();\n const toolTokens = this.tokenize(toolText);\n\n let matchCount = 0;\n for (const keyword of keywords) {\n if (toolText.includes(keyword)) {\n matchCount++;\n }\n }\n\n if (keywords.length > 0) {\n score = matchCount / keywords.length;\n reason =\n matchCount > 0 ? `matched ${matchCount}/${keywords.length} keywords` : \"no keyword match\";\n }\n\n // Boost by TF-IDF-like weighting: rare tool tokens matching keywords score higher\n const uniqueToolTokens = new Set(toolTokens);\n let specificityBoost = 0;\n for (const token of uniqueToolTokens) {\n if (keywords.includes(token)) {\n // Boost inversely proportional to how many tools contain this token\n const containingTools = allTools.filter((t) =>\n `${t.name} ${t.description}`.toLowerCase().includes(token),\n ).length;\n specificityBoost += 1 / Math.max(1, containingTools);\n }\n }\n score += specificityBoost * 0.3;\n\n // Recently-used boost\n if (this.config.includeRecentlyUsed && recentSet.has(tool.name)) {\n score += 0.4;\n reason += `${reason ? \"; \" : \"\"}recently used`;\n }\n\n // Always-include gets max score\n if (this.config.alwaysInclude.includes(tool.name)) {\n score = 10;\n reason = \"always included\";\n }\n\n return { tool, score, reason };\n });\n }\n\n /** Extract keywords from messages */\n private extractKeywords(messages: ChatMessage[]): string[] {\n const text = messages\n .filter((m) => m.role === \"user\" || m.role === \"assistant\")\n .map((m) =>\n typeof m.content === \"string\"\n ? m.content\n : m.content\n .filter((p) => p.type === \"text\")\n .map((p) => (p as { text: string }).text)\n .join(\" \"),\n )\n .join(\" \")\n .toLowerCase();\n\n const tokens = this.tokenize(text);\n\n // Remove common stop words\n const stopWords = new Set([\n \"the\",\n \"a\",\n \"an\",\n \"is\",\n \"are\",\n \"was\",\n \"were\",\n \"be\",\n \"been\",\n \"being\",\n \"have\",\n \"has\",\n \"had\",\n \"do\",\n \"does\",\n \"did\",\n \"will\",\n \"would\",\n \"could\",\n \"should\",\n \"may\",\n \"might\",\n \"can\",\n \"shall\",\n \"to\",\n \"of\",\n \"in\",\n \"for\",\n \"on\",\n \"with\",\n \"at\",\n \"by\",\n \"from\",\n \"as\",\n \"into\",\n \"through\",\n \"during\",\n \"before\",\n \"after\",\n \"above\",\n \"below\",\n \"between\",\n \"out\",\n \"off\",\n \"over\",\n \"under\",\n \"again\",\n \"further\",\n \"then\",\n \"once\",\n \"here\",\n \"there\",\n \"when\",\n \"where\",\n \"why\",\n \"how\",\n \"all\",\n \"each\",\n \"every\",\n \"both\",\n \"few\",\n \"more\",\n \"most\",\n \"other\",\n \"some\",\n \"such\",\n \"no\",\n \"nor\",\n \"not\",\n \"only\",\n \"own\",\n \"same\",\n \"so\",\n \"than\",\n \"too\",\n \"very\",\n \"just\",\n \"because\",\n \"but\",\n \"and\",\n \"or\",\n \"if\",\n \"while\",\n \"about\",\n \"up\",\n \"it\",\n \"its\",\n \"i\",\n \"me\",\n \"my\",\n \"you\",\n \"your\",\n \"we\",\n \"our\",\n \"they\",\n \"them\",\n \"their\",\n \"this\",\n \"that\",\n \"what\",\n \"which\",\n \"who\",\n \"whom\",\n \"he\",\n \"she\",\n \"him\",\n \"her\",\n \"please\",\n \"help\",\n \"want\",\n \"need\",\n \"like\",\n \"use\",\n \"get\",\n \"make\",\n ]);\n\n return [...new Set(tokens.filter((t) => t.length > 2 && !stopWords.has(t)))];\n }\n\n /** Tokenize text into words */\n private tokenize(text: string): string[] {\n return text\n .replace(/[^\\w\\s-]/g, \" \")\n .split(/\\s+/)\n .filter((w) => w.length > 0);\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK RunContext Builder\n// ──────────────────────────────────────────────────────\n\nimport type { RunContext, RunUsage } from \"../types/runner\";\n\nlet runCounter = 0;\n\nexport function createRunId(): string {\n return `run-${Date.now()}-${++runCounter}`;\n}\n\nexport function createTraceId(): string {\n return `trace-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function createRunContext(opts: {\n runId?: string;\n agentName: string;\n sessionId?: string;\n traceId?: string;\n signal?: AbortSignal;\n metadata?: Record<string, unknown>;\n}): RunContext {\n return {\n runId: opts.runId ?? createRunId(),\n agentName: opts.agentName,\n turnNumber: 0,\n sessionId: opts.sessionId,\n traceId: opts.traceId ?? createTraceId(),\n usage: createEmptyUsage(),\n signal: opts.signal,\n metadata: opts.metadata ?? {},\n };\n}\n\nexport function createEmptyUsage(): RunUsage {\n return {\n inputTokens: 0,\n outputTokens: 0,\n totalCostUsd: 0,\n latencyMs: 0,\n };\n}\n\nexport function addUsage(\n target: RunUsage,\n source: { inputTokens: number; outputTokens: number; costUsd: number; latencyMs: number },\n): void {\n target.inputTokens += source.inputTokens;\n target.outputTokens += source.outputTokens;\n target.totalCostUsd += source.costUsd;\n target.latencyMs += source.latencyMs;\n}\n","// ──────────────────────────────────────────────────────\n// ADK Turn Executor\n// ──────────────────────────────────────────────────────\n// Executes a single turn: LLM call → process tool calls → return result\n// ──────────────────────────────────────────────────────\n\nimport type { Agent } from \"../agent/define-agent\";\nimport { extractText } from \"../content/helpers\";\nimport type { ADKEventBus } from \"../events/event-bus\";\nimport { GuardrailEngine } from \"../guardrails/engine\";\nimport { ensureJsonSchema } from \"../output/structured-output\";\nimport type { ToolRegistry } from \"../tools/tool-registry\";\nimport type { ToolSelector } from \"../tools/tool-selector\";\nimport type { Trace } from \"../tracing/tracer\";\nimport type { GuardrailConfig } from \"../types/guardrail\";\nimport type {\n ADKLLMProvider,\n ChatMessage,\n ChatParamsWithTools,\n ChatResponseWithToolCalls,\n LLMToolDefinition,\n} from \"../types/llm\";\nimport type { RunContext, StreamEvent } from \"../types/runner\";\nimport type { ToolContext, ToolDef } from \"../types/tool\";\nimport { addUsage } from \"./context\";\n\n/** Result of a single turn */\nexport interface TurnResult {\n /** New messages produced this turn (assistant response + tool results) */\n newMessages: ChatMessage[];\n /** Whether the agent has finished (no tool calls, text response) */\n finished: boolean;\n /** Text output (if finished) */\n output?: string;\n /** Handoff target (if handoff tool was called) */\n handoffTarget?: string;\n /** Handoff reason */\n handoffReason?: string;\n /** Guardrail results from this turn */\n guardrailResults: import(\"../types/guardrail\").GuardrailResult[];\n}\n\n/** Handoff tool prefix */\nconst HANDOFF_PREFIX = \"transfer_to_\";\n\nexport class TurnExecutor {\n private guardrailEngine = new GuardrailEngine();\n private toolSelector?: ToolSelector;\n private eventBus?: ADKEventBus;\n private toolRegistry?: ToolRegistry;\n private currentTrace?: Trace;\n\n /** Set a tool selector for dynamic per-turn tool filtering */\n setToolSelector(selector: ToolSelector): void {\n this.toolSelector = selector;\n }\n\n /** Set event bus for observability */\n setEventBus(eventBus: ADKEventBus): void {\n this.eventBus = eventBus;\n }\n\n /** Set tool registry for deferred tool loading */\n setToolRegistry(registry: ToolRegistry): void {\n this.toolRegistry = registry;\n }\n\n /** Set trace for span-based tracing */\n setTrace(trace?: Trace): void {\n this.currentTrace = trace;\n }\n\n /**\n * Execute a single turn.\n * @param agent The current agent\n * @param messages All messages so far (including system)\n * @param provider The LLM provider to use\n * @param ctx The run context\n * @param onEvent Optional stream event callback\n */\n async executeTurn(\n agent: Agent,\n messages: ChatMessage[],\n provider: ADKLLMProvider,\n ctx: RunContext,\n guardrails: GuardrailConfig[],\n handoffToolDefs?: LLMToolDefinition[],\n onEvent?: (event: StreamEvent) => void,\n ): Promise<TurnResult> {\n const allGuardrailResults: import(\"../types/guardrail\").GuardrailResult[] = [];\n\n // Build tool definitions for LLM (with optional per-turn filtering)\n const tools = this.buildToolDefs(agent, messages, ctx, handoffToolDefs);\n\n // Build params\n const systemMsg = messages.find((m) => m.role === \"system\");\n const params: ChatParamsWithTools = {\n messages: messages.filter((m) => m.role !== \"system\"),\n systemPrompt: systemMsg ? extractText(systemMsg.content) : undefined,\n tools: tools.length > 0 ? tools : undefined,\n };\n\n // Add model config\n const modelConfig = agent.config.model;\n if (typeof modelConfig === \"string\") {\n params.model = modelConfig;\n } else if (modelConfig && typeof modelConfig === \"object\") {\n params.model = modelConfig.model;\n params.temperature = modelConfig.temperature;\n params.maxTokens = modelConfig.maxTokens;\n }\n\n // Call LLM with tracing\n const llmSpan = this.currentTrace?.startSpan(\"llm\", \"llm\");\n llmSpan?.setAttribute(\"model\", params.model ?? \"default\");\n\n const llmStart = Date.now();\n const response = await provider.chatWithTools(params);\n const llmLatencyMs = Date.now() - llmStart;\n\n llmSpan?.setAttributes({\n inputTokens: response.inputTokens,\n outputTokens: response.outputTokens,\n costUsd: response.costUsd,\n latencyMs: llmLatencyMs,\n });\n llmSpan?.end();\n\n // Track usage\n addUsage(ctx.usage, {\n inputTokens: response.inputTokens,\n outputTokens: response.outputTokens,\n costUsd: response.costUsd,\n latencyMs: response.latencyMs,\n });\n\n // Emit cost event for observability and budget tracking\n this.eventBus?.emit(\"llm.call.completed\", {\n callId: `${ctx.runId}-turn-${ctx.turnNumber}`,\n providerId: response.providerId ?? \"unknown\",\n model: response.model ?? params.model ?? \"unknown\",\n agentSlug: ctx.agentName,\n taskId: (ctx.metadata?.taskId as string) ?? undefined,\n inputTokens: response.inputTokens ?? 0,\n outputTokens: response.outputTokens ?? 0,\n costUsd: response.costUsd ?? 0,\n latencyMs: llmLatencyMs,\n ttfbMs: response.ttfbMs,\n timestamp: Date.now(),\n });\n\n // Process response\n const assistantMessage: ChatMessage = {\n role: \"assistant\",\n content: response.content,\n toolCalls: response.toolCalls,\n };\n\n // No tool calls → agent is done\n if (!response.toolCalls || response.toolCalls.length === 0) {\n // Run output guardrails with tracing\n const guardrailSpan =\n guardrails.length > 0\n ? this.currentTrace?.startSpan(\"output-guardrails\", \"guardrail\")\n : undefined;\n\n const outputResults = await this.guardrailEngine.runOutputGuardrails(\n response.content,\n [...messages, assistantMessage],\n ctx,\n guardrails,\n );\n allGuardrailResults.push(...outputResults);\n\n if (guardrailSpan) {\n const allPassed = outputResults.every((r) => r.passed);\n guardrailSpan.setAttribute(\"guardrailCount\", outputResults.length);\n guardrailSpan.setAttribute(\"passed\", allPassed);\n for (const r of outputResults) {\n guardrailSpan.addEvent(r.name, { passed: r.passed, severity: r.severity });\n }\n guardrailSpan.end();\n }\n\n onEvent?.({ type: \"text_delta\", content: response.content, agentName: ctx.agentName });\n\n return {\n newMessages: [assistantMessage],\n finished: true,\n output: response.content,\n guardrailResults: allGuardrailResults,\n };\n }\n\n // Check for handoff first (handoffs take priority)\n for (const toolCall of response.toolCalls) {\n if (toolCall.name.startsWith(HANDOFF_PREFIX)) {\n const targetAgent = toolCall.name.slice(HANDOFF_PREFIX.length);\n const reason =\n typeof toolCall.input === \"object\" && toolCall.input !== null\n ? (((toolCall.input as Record<string, unknown>).reason as string) ?? \"Agent handoff\")\n : \"Agent handoff\";\n\n onEvent?.({\n type: \"handoff\",\n fromAgent: ctx.agentName,\n toAgent: targetAgent,\n reason,\n });\n\n return {\n newMessages: [assistantMessage],\n finished: false,\n handoffTarget: targetAgent,\n handoffReason: reason,\n guardrailResults: allGuardrailResults,\n };\n }\n }\n\n // Execute all non-handoff tool calls in parallel\n const toolResultMessages: ChatMessage[] = [];\n const nonHandoffCalls = response.toolCalls.filter((tc) => !tc.name.startsWith(HANDOFF_PREFIX));\n\n const toolCallResults = await Promise.all(\n nonHandoffCalls.map((toolCall) =>\n this.executeToolCall(agent, toolCall, ctx, guardrails, onEvent),\n ),\n );\n\n for (const result of toolCallResults) {\n allGuardrailResults.push(...result.guardrailResults);\n toolResultMessages.push(result.message);\n }\n\n return {\n newMessages: [assistantMessage, ...toolResultMessages],\n finished: false,\n guardrailResults: allGuardrailResults,\n };\n }\n\n /** Execute a single tool call with timeout and retry support */\n private async executeToolCall(\n agent: Agent,\n toolCall: { id: string; name: string; input: unknown },\n ctx: RunContext,\n guardrails: GuardrailConfig[],\n onEvent?: (event: StreamEvent) => void,\n ): Promise<{\n message: ChatMessage;\n guardrailResults: import(\"../types/guardrail\").GuardrailResult[];\n }> {\n const guardrailResults: import(\"../types/guardrail\").GuardrailResult[] = [];\n\n // Find tool — check agent tools first, then registry for deferred tools\n let toolDef: ToolDef | undefined = agent.getTools().find((t) => t.name === toolCall.name);\n if (!toolDef && this.toolRegistry) {\n const deferred = this.toolRegistry.load(toolCall.name);\n if (deferred) toolDef = deferred;\n }\n if (!toolDef) {\n return {\n message: {\n role: \"tool\",\n content: `Error: Unknown tool \"${toolCall.name}\"`,\n toolResults: [\n {\n toolCallId: toolCall.id,\n name: toolCall.name,\n output: `Error: Unknown tool \"${toolCall.name}\"`,\n isError: true,\n },\n ],\n },\n guardrailResults,\n };\n }\n\n // Run tool guardrails with tracing\n const toolGuardrailSpan =\n guardrails.length > 0\n ? this.currentTrace?.startSpan(`tool-guardrails:${toolCall.name}`, \"guardrail\")\n : undefined;\n\n const gResults = await this.guardrailEngine.runToolGuardrails(\n toolCall.name,\n toolCall.input,\n ctx,\n guardrails,\n );\n guardrailResults.push(...gResults);\n\n if (toolGuardrailSpan) {\n const allPassed = gResults.every((r) => r.passed);\n toolGuardrailSpan.setAttribute(\"guardrailName\", `tool-guardrails:${toolCall.name}`);\n toolGuardrailSpan.setAttribute(\"passed\", allPassed);\n for (const r of gResults) {\n toolGuardrailSpan.addEvent(r.name, { passed: r.passed, severity: r.severity });\n }\n toolGuardrailSpan.end();\n }\n\n onEvent?.({\n type: \"tool_call_start\",\n toolName: toolCall.name,\n agentName: ctx.agentName,\n input: toolCall.input,\n });\n\n // Create tool span for tracing\n const toolSpan = this.currentTrace?.startSpan(`tool:${toolCall.name}`, \"tool\");\n toolSpan?.setAttribute(\"toolName\", toolCall.name);\n\n const maxAttempts = (toolDef.retries ?? 0) + 1;\n const timeoutMs = toolDef.timeoutMs ?? 30_000;\n let lastError: string | undefined;\n const toolStart = Date.now();\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const toolCtx: ToolContext = {\n runContext: ctx,\n toolCallId: toolCall.id,\n agentName: ctx.agentName,\n };\n\n // Run pre-hook\n let currentInput = toolCall.input;\n if (toolDef.hooks?.preExecute) {\n const hookResult = await toolDef.hooks.preExecute(currentInput, toolCtx);\n if (!hookResult.allow) {\n toolSpan?.setAttribute(\"success\", false);\n toolSpan?.setAttribute(\"blocked\", true);\n toolSpan?.setAttribute(\"latencyMs\", Date.now() - toolStart);\n toolSpan?.end();\n return {\n message: {\n role: \"tool\",\n content: `Tool blocked: ${hookResult.reason ?? \"pre-hook rejected\"}`,\n toolResults: [\n {\n toolCallId: toolCall.id,\n name: toolCall.name,\n output: `Tool blocked: ${hookResult.reason ?? \"pre-hook rejected\"}`,\n isError: true,\n },\n ],\n },\n guardrailResults,\n };\n }\n if (hookResult.modifiedInput !== undefined) {\n currentInput = hookResult.modifiedInput;\n }\n }\n\n // Execute with timeout\n let output = await this.withTimeout(\n toolDef.execute(currentInput as never, toolCtx),\n timeoutMs,\n toolCall.name,\n );\n\n // Run post-hook\n if (toolDef.hooks?.postExecute) {\n const hookResult = await toolDef.hooks.postExecute(currentInput, output, toolCtx);\n if (hookResult.modifiedOutput !== undefined) {\n output = hookResult.modifiedOutput as typeof output;\n }\n }\n\n const outputStr = typeof output === \"string\" ? output : JSON.stringify(output);\n\n toolSpan?.setAttribute(\"success\", true);\n toolSpan?.setAttribute(\"latencyMs\", Date.now() - toolStart);\n toolSpan?.end();\n\n onEvent?.({\n type: \"tool_call_end\",\n toolName: toolCall.name,\n agentName: ctx.agentName,\n output,\n });\n\n return {\n message: {\n role: \"tool\",\n content: outputStr,\n toolResults: [{ toolCallId: toolCall.id, name: toolCall.name, output }],\n },\n guardrailResults,\n };\n } catch (error) {\n lastError = error instanceof Error ? error.message : String(error);\n if (attempt < maxAttempts - 1) {\n // Exponential backoff before retry\n await new Promise((r) => setTimeout(r, 2 ** attempt * 100));\n }\n }\n }\n\n // All attempts failed\n toolSpan?.setAttribute(\"success\", false);\n toolSpan?.setAttribute(\"latencyMs\", Date.now() - toolStart);\n toolSpan?.setError(lastError ?? \"Unknown error\");\n toolSpan?.end();\n\n return {\n message: {\n role: \"tool\",\n content: `Error: ${lastError}`,\n toolResults: [\n {\n toolCallId: toolCall.id,\n name: toolCall.name,\n output: lastError ?? \"Unknown error\",\n isError: true,\n },\n ],\n },\n guardrailResults,\n };\n }\n\n /** Run a promise with a timeout */\n private withTimeout<T>(promise: Promise<T>, timeoutMs: number, toolName: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`Tool \"${toolName}\" timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n promise.then(\n (val) => {\n clearTimeout(timer);\n resolve(val);\n },\n (err) => {\n clearTimeout(timer);\n reject(err);\n },\n );\n });\n }\n\n private buildToolDefs(\n agent: Agent,\n messages: ChatMessage[],\n ctx: RunContext,\n handoffToolDefs?: LLMToolDefinition[],\n ): LLMToolDefinition[] {\n let agentTools = agent.getTools();\n\n // Apply dynamic tool selection if configured\n const totalToolCount = agentTools.length;\n if (this.toolSelector) {\n const recentToolCalls = this.extractRecentToolCalls(messages);\n agentTools = this.toolSelector.selectTools(\n agentTools,\n messages,\n ctx.turnNumber,\n recentToolCalls,\n );\n\n this.eventBus?.emit(\"tools.selected\", {\n runId: ctx.runId,\n agentName: ctx.agentName,\n totalTools: totalToolCount,\n selectedTools: agentTools.length,\n selectedNames: agentTools.map((t) => t.name),\n strategy: \"keyword\",\n turnNumber: ctx.turnNumber,\n timestamp: Date.now(),\n });\n }\n\n const tools: LLMToolDefinition[] = [];\n\n // Agent tools (potentially filtered)\n for (const tool of agentTools) {\n const def: LLMToolDefinition = {\n name: tool.name,\n description: tool.description,\n inputSchema: ensureJsonSchema(tool.inputSchema) as Record<string, unknown>,\n };\n // Include examples if present (helps LLM accuracy)\n if (tool.examples && tool.examples.length > 0) {\n (def as any).examples = tool.examples.map((ex) => ({\n input: ex.input,\n ...(ex.description ? { description: ex.description } : {}),\n }));\n }\n tools.push(def);\n }\n\n // Handoff tools are NEVER filtered — always appended\n if (handoffToolDefs) {\n tools.push(...handoffToolDefs);\n }\n\n return tools;\n }\n\n /** Extract tool names from recent tool call messages */\n private extractRecentToolCalls(messages: ChatMessage[]): string[] {\n const toolNames: string[] = [];\n // Look at recent messages for tool calls\n const recent = messages.slice(-10);\n for (const msg of recent) {\n if (msg.toolCalls) {\n for (const tc of msg.toolCalls) {\n if (!tc.name.startsWith(\"transfer_to_\")) {\n toolNames.push(tc.name);\n }\n }\n }\n }\n return [...new Set(toolNames)];\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Runner — Main execution engine\n// ──────────────────────────────────────────────────────\n// Generalized from @aizona/platform-agents/intelligence/agent-brain.ts\n// Turn loop: build messages → LLM call → tool execution → guardrails → handoff → repeat\n// ──────────────────────────────────────────────────────\n\nimport type { Agent } from \"../agent/define-agent\";\nimport { contentToParts, extractText, isMultiModalContent } from \"../content/helpers\";\nimport type { ADKEventBus } from \"../events/event-bus\";\nimport { NotesStore } from \"../harness/notes-store\";\nimport { ProgressTracker } from \"../harness/progress-tracker\";\nimport { ContextManager } from \"../sessions/context-manager\";\nimport { TokenCounter } from \"../sessions/token-counter\";\nimport { createExecuteCodeTool } from \"../tools/built-in/execute-code\";\nimport { createReadNotesTool, createWriteNoteTool } from \"../tools/built-in/notes-tool\";\nimport { createProgressTool } from \"../tools/built-in/progress-tool\";\nimport { ToolSelector } from \"../tools/tool-selector\";\nimport type { Trace, Tracer } from \"../tracing/tracer\";\nimport type { ContextConfig } from \"../types/agent\";\nimport type { ContentPart } from \"../types/content\";\nimport type { GuardrailResult } from \"../types/guardrail\";\nimport type { ADKLLMProvider, CatalogModel, ChatMessage, LLMToolDefinition } from \"../types/llm\";\nimport type {\n HandoffRecord,\n HarnessConfig,\n RunConfig,\n RunContext,\n RunResult,\n RunnerConfig,\n StreamEvent,\n} from \"../types/runner\";\nimport type { ToolDef } from \"../types/tool\";\nimport { createRunContext, createRunId, createTraceId } from \"./context\";\nimport { TurnExecutor } from \"./turn-executor\";\n\nconst HANDOFF_PREFIX = \"transfer_to_\";\n\nexport class Runner {\n private config: RunnerConfig;\n private turnExecutor = new TurnExecutor();\n private provider?: ADKLLMProvider;\n private eventBus?: ADKEventBus;\n private tracer?: Tracer;\n private agents = new Map<string, Agent>();\n private contextManager?: ContextManager;\n private modelContextWindow?: number;\n private modelCatalog?: CatalogModel[];\n private tokenCounter = new TokenCounter();\n\n constructor(config?: RunnerConfig & { provider?: ADKLLMProvider; eventBus?: ADKEventBus }) {\n this.config = config ?? {};\n this.provider = config?.provider;\n this.eventBus = config?.eventBus;\n this.tracer = config?.tracer;\n this.modelContextWindow = config?.modelContextWindow;\n this.modelCatalog = config?.modelCatalog;\n\n // Wire eventBus to turn executor\n if (this.eventBus) {\n this.turnExecutor.setEventBus(this.eventBus);\n }\n }\n\n /** Register an agent (for handoff resolution) */\n registerAgent(agent: Agent): void {\n this.agents.set(agent.name, agent);\n }\n\n /** Set the LLM provider */\n setProvider(provider: ADKLLMProvider): void {\n this.provider = provider;\n }\n\n /** Run an agent to completion */\n async run(agent: Agent, input: RunConfig): Promise<RunResult> {\n const provider = this.provider;\n if (!provider) {\n throw new Error(\n \"No LLM provider configured. Call setProvider() or pass provider in constructor.\",\n );\n }\n\n // Register agent for handoff lookup\n this.agents.set(agent.name, agent);\n\n const runId = createRunId();\n const traceId = createTraceId();\n const maxTurns = input.maxTurns ?? agent.getMaxTurns() ?? this.config.defaultMaxTurns ?? 25;\n\n const ctx = createRunContext({\n runId,\n agentName: agent.name,\n sessionId: input.sessionId,\n traceId,\n signal: input.signal,\n metadata: input.metadata,\n });\n\n this.eventBus?.emit(\"run.started\", {\n runId,\n agentName: agent.name,\n sessionId: input.sessionId,\n traceId,\n timestamp: Date.now(),\n });\n\n // Start trace if tracer is configured\n const trace = this.tracer?.startTrace(agent.name, {\n runId: ctx.runId,\n sessionId: ctx.sessionId,\n });\n const runSpan = trace?.startSpan(\"run\", \"agent\");\n runSpan?.setAttribute(\"agentName\", agent.name);\n runSpan?.setAttribute(\"runId\", runId);\n\n // Pass trace to turn executor for per-turn span creation\n this.turnExecutor.setTrace(trace);\n\n // Configure tool selection\n this.configureToolSelection(agent);\n\n // Build initial messages\n const messages: ChatMessage[] = [];\n\n // System prompt\n const instructions = await agent.getInstructions(ctx);\n messages.push({ role: \"system\", content: instructions });\n\n // Previous messages\n if (input.messages) {\n messages.push(...input.messages);\n }\n\n // User input (string or ContentPart[])\n messages.push({ role: \"user\", content: input.input });\n\n // Inject harness tools if configured\n const harnessTools = this.buildHarnessTools(input.harness);\n if (harnessTools.length > 0) {\n for (const tool of harnessTools) {\n agent.addTool(tool);\n }\n }\n\n // Inject execute_code tool if code execution enabled\n if (this.config.enableCodeExecution) {\n agent.addTool(createExecuteCodeTool(agent.getTools()));\n }\n\n // Turn loop\n let currentAgent = agent;\n const handoffs: HandoffRecord[] = [];\n const allGuardrailResults: GuardrailResult[] = [];\n\n const startTime = Date.now();\n\n // Resolve context management\n const ctxManager = this.resolveContextManager(currentAgent);\n const contextBudget = this.resolveContextBudget(\n currentAgent,\n currentAgent.config.contextConfig,\n );\n const contextStrategy = currentAgent.config.contextConfig?.strategy ?? \"sliding-window\";\n\n for (let turn = 0; turn < maxTurns; turn++) {\n // Check abort signal\n if (input.signal?.aborted) {\n runSpan?.setError(\"Run aborted\");\n runSpan?.end();\n if (trace) await this.tracer?.endAndExport(trace);\n throw new Error(\"Run aborted\");\n }\n\n ctx.turnNumber = turn + 1;\n ctx.agentName = currentAgent.name;\n\n // Trim context before LLM call\n if (ctxManager && contextBudget > 0) {\n const originalCount = messages.length;\n const originalTokens = ctxManager.getTokenCount(messages);\n const toolTokens = this.estimateToolTokens(currentAgent);\n const availableForMessages = contextBudget - toolTokens;\n if (availableForMessages > 0) {\n const trimmed = await ctxManager.trimToFit(\n messages,\n availableForMessages,\n contextStrategy,\n );\n if (trimmed !== messages) {\n if (trimmed.length < originalCount) {\n const trimmedTokens = ctxManager.getTokenCount(trimmed);\n this.eventBus?.emit(\"context.trimmed\", {\n runId,\n agentName: currentAgent.name,\n strategy: contextStrategy,\n originalTokens,\n trimmedTokens,\n messagesRemoved: originalCount - trimmed.length,\n turnNumber: ctx.turnNumber,\n timestamp: Date.now(),\n });\n }\n messages.length = 0;\n messages.push(...trimmed);\n }\n }\n }\n\n // Build handoff tools\n const handoffToolDefs = this.buildHandoffTools(currentAgent);\n\n const guardrails = currentAgent.config.guardrails ?? [];\n\n // Create turn span under the run span\n const turnSpan = trace?.startSpan(`turn-${turn + 1}`, \"agent\", runSpan?.id);\n turnSpan?.setAttribute(\"turnNumber\", turn + 1);\n turnSpan?.setAttribute(\"agentName\", currentAgent.name);\n\n const turnResult = await this.turnExecutor.executeTurn(\n currentAgent,\n messages,\n provider,\n ctx,\n guardrails,\n handoffToolDefs,\n );\n\n // End turn span\n turnSpan?.end();\n\n // Append messages\n messages.push(...turnResult.newMessages);\n allGuardrailResults.push(...turnResult.guardrailResults);\n\n this.eventBus?.emit(\"tool.executed\", {\n runId,\n toolName: \"turn\",\n agentName: currentAgent.name,\n latencyMs: 0,\n success: true,\n timestamp: Date.now(),\n });\n\n // Handoff\n if (turnResult.handoffTarget) {\n const targetAgent = this.agents.get(turnResult.handoffTarget);\n if (!targetAgent) {\n throw new Error(`Handoff target \"${turnResult.handoffTarget}\" not registered`);\n }\n\n handoffs.push({\n fromAgent: currentAgent.name,\n toAgent: turnResult.handoffTarget,\n reason: turnResult.handoffReason ?? \"Agent handoff\",\n turnNumber: turn + 1,\n });\n\n this.eventBus?.emit(\"handoff\", {\n runId,\n fromAgent: currentAgent.name,\n toAgent: turnResult.handoffTarget,\n reason: turnResult.handoffReason ?? \"Agent handoff\",\n turnNumber: turn + 1,\n timestamp: Date.now(),\n });\n\n // Switch agent — rebuild system prompt\n currentAgent = targetAgent;\n const newInstructions = await currentAgent.getInstructions(ctx);\n messages[0] = { role: \"system\", content: newInstructions };\n continue;\n }\n\n // Finished\n if (turnResult.finished) {\n const totalLatencyMs = Date.now() - startTime;\n ctx.usage.latencyMs = totalLatencyMs;\n\n // Finalize tracing\n runSpan?.setAttribute(\"totalTurns\", turn + 1);\n runSpan?.setAttribute(\"totalCostUsd\", ctx.usage.totalCostUsd);\n runSpan?.setAttribute(\"totalLatencyMs\", totalLatencyMs);\n runSpan?.end();\n if (trace) await this.tracer?.endAndExport(trace);\n\n const outputParts = this.extractOutputParts(turnResult.newMessages);\n\n const result: RunResult = {\n output: turnResult.output ?? \"\",\n outputParts: outputParts.length > 0 ? outputParts : undefined,\n messages,\n usage: { ...ctx.usage },\n handoffs,\n guardrailResults: allGuardrailResults,\n traceId,\n sessionId: input.sessionId,\n finalAgent: currentAgent.name,\n runId,\n totalTurns: turn + 1,\n };\n\n this.eventBus?.emit(\"run.completed\", {\n runId,\n agentName: currentAgent.name,\n totalTurns: turn + 1,\n totalCostUsd: ctx.usage.totalCostUsd,\n totalLatencyMs,\n sessionId: input.sessionId,\n traceId,\n timestamp: Date.now(),\n });\n\n return result;\n }\n }\n\n // Max turns reached — finalize tracing\n const lastMessage = messages[messages.length - 1];\n const totalLatencyMs = Date.now() - startTime;\n ctx.usage.latencyMs = totalLatencyMs;\n\n runSpan?.setAttribute(\"totalTurns\", maxTurns);\n runSpan?.setAttribute(\"totalCostUsd\", ctx.usage.totalCostUsd);\n runSpan?.setAttribute(\"totalLatencyMs\", totalLatencyMs);\n runSpan?.addEvent(\"max_turns_reached\");\n runSpan?.end();\n if (trace) await this.tracer?.endAndExport(trace);\n\n const result: RunResult = {\n output: extractText(lastMessage?.content ?? \"\"),\n messages,\n usage: { ...ctx.usage },\n handoffs,\n guardrailResults: allGuardrailResults,\n traceId,\n sessionId: input.sessionId,\n finalAgent: currentAgent.name,\n runId,\n totalTurns: maxTurns,\n };\n\n this.eventBus?.emit(\"run.completed\", {\n runId,\n agentName: currentAgent.name,\n totalTurns: maxTurns,\n totalCostUsd: ctx.usage.totalCostUsd,\n totalLatencyMs,\n sessionId: input.sessionId,\n traceId,\n timestamp: Date.now(),\n });\n\n return result;\n }\n\n /** Stream events from an agent run — yields events during the turn loop */\n async *stream(agent: Agent, input: RunConfig): AsyncGenerator<StreamEvent> {\n const provider = this.provider;\n if (!provider) {\n throw new Error(\n \"No LLM provider configured. Call setProvider() or pass provider in constructor.\",\n );\n }\n\n this.agents.set(agent.name, agent);\n\n const runId = createRunId();\n const traceId = createTraceId();\n const maxTurns = input.maxTurns ?? agent.getMaxTurns() ?? this.config.defaultMaxTurns ?? 25;\n\n const ctx = createRunContext({\n runId,\n agentName: agent.name,\n sessionId: input.sessionId,\n traceId,\n signal: input.signal,\n metadata: input.metadata,\n });\n\n // Configure tool selection\n this.configureToolSelection(agent);\n\n const messages: ChatMessage[] = [];\n const instructions = await agent.getInstructions(ctx);\n messages.push({ role: \"system\", content: instructions });\n if (input.messages) messages.push(...input.messages);\n messages.push({ role: \"user\", content: input.input });\n\n // Inject harness tools if configured\n const streamHarnessTools = this.buildHarnessTools(input.harness);\n if (streamHarnessTools.length > 0) {\n for (const tool of streamHarnessTools) {\n agent.addTool(tool);\n }\n }\n\n // Inject execute_code tool if code execution enabled\n if (this.config.enableCodeExecution) {\n agent.addTool(createExecuteCodeTool(agent.getTools()));\n }\n\n let currentAgent = agent;\n const handoffs: HandoffRecord[] = [];\n const allGuardrailResults: GuardrailResult[] = [];\n const startTime = Date.now();\n\n // Resolve context management\n const streamCtxManager = this.resolveContextManager(currentAgent);\n const streamContextBudget = this.resolveContextBudget(\n currentAgent,\n currentAgent.config.contextConfig,\n );\n const streamContextStrategy = currentAgent.config.contextConfig?.strategy ?? \"sliding-window\";\n\n for (let turn = 0; turn < maxTurns; turn++) {\n if (input.signal?.aborted) throw new Error(\"Run aborted\");\n\n ctx.turnNumber = turn + 1;\n ctx.agentName = currentAgent.name;\n\n // Trim context before LLM call\n if (streamCtxManager && streamContextBudget > 0) {\n const originalCount = messages.length;\n const originalTokens = streamCtxManager.getTokenCount(messages);\n const toolTokens = this.estimateToolTokens(currentAgent);\n const availableForMessages = streamContextBudget - toolTokens;\n if (availableForMessages > 0) {\n const trimmed = await streamCtxManager.trimToFit(\n messages,\n availableForMessages,\n streamContextStrategy,\n );\n if (trimmed !== messages) {\n if (trimmed.length < originalCount) {\n this.eventBus?.emit(\"context.trimmed\", {\n runId,\n agentName: currentAgent.name,\n strategy: streamContextStrategy,\n originalTokens,\n trimmedTokens: streamCtxManager.getTokenCount(trimmed),\n messagesRemoved: originalCount - trimmed.length,\n turnNumber: ctx.turnNumber,\n timestamp: Date.now(),\n });\n }\n messages.length = 0;\n messages.push(...trimmed);\n }\n }\n }\n\n const handoffToolDefs = this.buildHandoffTools(currentAgent);\n const guardrails = currentAgent.config.guardrails ?? [];\n\n const turnResult = await this.turnExecutor.executeTurn(\n currentAgent,\n messages,\n provider,\n ctx,\n guardrails,\n handoffToolDefs,\n );\n\n messages.push(...turnResult.newMessages);\n allGuardrailResults.push(...turnResult.guardrailResults);\n\n // Yield tool call start events from assistant message\n for (const msg of turnResult.newMessages) {\n if (msg.role === \"assistant\" && msg.toolCalls) {\n for (const tc of msg.toolCalls) {\n yield {\n type: \"tool_call_start\" as const,\n toolName: tc.name,\n agentName: currentAgent.name,\n input: tc.input,\n };\n }\n }\n }\n\n // Yield tool call end events from tool result messages\n for (const msg of turnResult.newMessages) {\n if (msg.role === \"tool\" && msg.toolResults) {\n for (const tr of msg.toolResults) {\n yield {\n type: \"tool_call_end\" as const,\n toolName: tr.name,\n agentName: currentAgent.name,\n output: tr.output,\n };\n }\n }\n }\n\n // Fallback: tool messages without toolResults\n for (const msg of turnResult.newMessages) {\n if (msg.role === \"tool\" && !msg.toolResults) {\n yield {\n type: \"tool_call_end\" as const,\n toolName: \"tool\",\n agentName: currentAgent.name,\n output: extractText(msg.content),\n };\n }\n }\n\n // Yield turn complete\n yield { type: \"turn_complete\" as const, agentName: currentAgent.name, turnNumber: turn + 1 };\n\n // Handoff\n if (turnResult.handoffTarget) {\n const targetAgent = this.agents.get(turnResult.handoffTarget);\n if (!targetAgent)\n throw new Error(`Handoff target \"${turnResult.handoffTarget}\" not registered`);\n\n const handoffReason = turnResult.handoffReason ?? \"Agent handoff\";\n\n handoffs.push({\n fromAgent: currentAgent.name,\n toAgent: turnResult.handoffTarget,\n reason: handoffReason,\n turnNumber: turn + 1,\n });\n\n yield {\n type: \"handoff\" as const,\n fromAgent: currentAgent.name,\n toAgent: turnResult.handoffTarget,\n reason: handoffReason,\n };\n\n currentAgent = targetAgent;\n const newInstructions = await currentAgent.getInstructions(ctx);\n messages[0] = { role: \"system\", content: newInstructions };\n continue;\n }\n\n // Yield text content\n if (turnResult.output) {\n yield { type: \"text_delta\", content: turnResult.output, agentName: currentAgent.name };\n }\n\n // Yield multi-modal content parts from assistant messages\n for (const msg of turnResult.newMessages) {\n if (msg.role === \"assistant\" && isMultiModalContent(msg.content)) {\n for (const part of msg.content) {\n if (part.type === \"image\") {\n yield { type: \"image_output\", image: part, agentName: currentAgent.name };\n } else if (part.type === \"audio\") {\n yield { type: \"audio_output\", audio: part, agentName: currentAgent.name };\n } else if (part.type === \"video\") {\n yield { type: \"video_output\", video: part, agentName: currentAgent.name };\n } else if (part.type === \"ui_artifact\") {\n yield { type: \"ui_artifact\", artifact: part, agentName: currentAgent.name };\n }\n }\n }\n }\n\n // Finished\n if (turnResult.finished) {\n const totalLatencyMs = Date.now() - startTime;\n ctx.usage.latencyMs = totalLatencyMs;\n\n const streamOutputParts = this.extractOutputParts(turnResult.newMessages);\n\n const result: RunResult = {\n output: turnResult.output ?? \"\",\n outputParts: streamOutputParts.length > 0 ? streamOutputParts : undefined,\n messages,\n usage: { ...ctx.usage },\n handoffs,\n guardrailResults: allGuardrailResults,\n traceId,\n sessionId: input.sessionId,\n finalAgent: currentAgent.name,\n runId,\n totalTurns: turn + 1,\n };\n\n yield { type: \"run_complete\", result };\n return;\n }\n }\n\n // Max turns reached\n const lastMessage = messages[messages.length - 1];\n const totalLatencyMs = Date.now() - startTime;\n ctx.usage.latencyMs = totalLatencyMs;\n\n const result: RunResult = {\n output: extractText(lastMessage?.content ?? \"\"),\n messages,\n usage: { ...ctx.usage },\n handoffs,\n guardrailResults: allGuardrailResults,\n traceId,\n sessionId: input.sessionId,\n finalAgent: currentAgent.name,\n runId,\n totalTurns: maxTurns,\n };\n\n yield { type: \"run_complete\", result };\n }\n\n /** Resolve context manager from agent config or runner config */\n private resolveContextManager(agent: Agent): ContextManager | undefined {\n if (this.contextManager) return this.contextManager;\n\n const contextConfig = agent.config.contextConfig;\n if (!contextConfig) return undefined;\n\n return new ContextManager({\n tokenCounterStrategy: contextConfig.tokenCounterStrategy,\n summarization:\n contextConfig.strategy === \"smart-summary\"\n ? {\n provider: this.provider,\n model: contextConfig.summaryModel,\n }\n : undefined,\n keepRecentTurns: contextConfig.keepRecentTurns,\n });\n }\n\n /** Resolve context budget from agent config, model catalog, or defaults */\n private resolveContextBudget(agent: Agent, contextConfig?: ContextConfig): number {\n if (!contextConfig) return 0;\n\n // 1. Explicit fixed budget (highest priority)\n if (contextConfig.maxContextTokens) return contextConfig.maxContextTokens;\n\n // 2. Determine model's context window\n let modelWindow = this.modelContextWindow;\n\n // 3. If not set, try to look up from model catalog\n if (!modelWindow) {\n const modelId =\n typeof agent.config.model === \"string\" ? agent.config.model : agent.config.model?.model;\n if (modelId) {\n modelWindow = this.lookupModelContextWindow(modelId);\n }\n }\n\n // 4. Fallback: 128K (safe for modern models)\n modelWindow ??= 128_000;\n\n const ratio = contextConfig.contextBudgetRatio ?? 0.85;\n return Math.floor(modelWindow * ratio);\n }\n\n /** Look up model context window from catalog */\n private lookupModelContextWindow(modelId: string): number | undefined {\n if (!this.modelCatalog) return undefined;\n const model = this.modelCatalog.find(\n (m) => m.modelId === modelId || m.aliases?.includes(modelId),\n );\n return model?.contextWindowInput;\n }\n\n /** Estimate total tokens for all tool definitions */\n private estimateToolTokens(agent: Agent): number {\n const tools = agent.getTools();\n if (tools.length === 0) return 0;\n\n let total = 0;\n for (const tool of tools) {\n total += this.tokenCounter.countText(tool.name);\n total += this.tokenCounter.countText(tool.description);\n total += this.tokenCounter.countText(JSON.stringify(tool.inputSchema ?? {}));\n total += 10; // framing overhead\n }\n return total;\n }\n\n /** Configure tool selection for an agent's turn executor */\n private configureToolSelection(agent: Agent): void {\n const toolSelectionConfig = agent.config.toolSelection;\n if (toolSelectionConfig && toolSelectionConfig.strategy !== \"all\") {\n this.turnExecutor.setToolSelector(new ToolSelector(toolSelectionConfig));\n }\n }\n\n /** Extract non-text content parts from the final assistant message */\n private extractOutputParts(messages: ChatMessage[]): ContentPart[] {\n const parts: ContentPart[] = [];\n for (const msg of messages) {\n if (msg.role === \"assistant\" && isMultiModalContent(msg.content)) {\n for (const part of msg.content) {\n if (part.type !== \"text\") {\n parts.push(part);\n }\n }\n }\n }\n return parts;\n }\n\n /** Build harness tools (progress + notes) if configured */\n // biome-ignore lint/suspicious/noExplicitAny: typed tools need widening\n private buildHarnessTools(harness?: HarnessConfig): ToolDef<any, any>[] {\n if (!harness) return [];\n // biome-ignore lint/suspicious/noExplicitAny: typed tools need widening\n const tools: ToolDef<any, any>[] = [];\n\n if (harness.enableProgress) {\n const tracker = new ProgressTracker();\n if (harness.features) {\n tracker.addFeatures(harness.features);\n }\n tools.push(createProgressTool(tracker));\n }\n\n if (harness.enableNotes) {\n const store = new NotesStore();\n tools.push(createWriteNoteTool(store));\n tools.push(createReadNotesTool(store));\n }\n\n return tools;\n }\n\n private buildHandoffTools(agent: Agent): LLMToolDefinition[] {\n const handoffs = agent.getHandoffs();\n if (handoffs.length === 0) return [];\n\n return handoffs.map((h) => {\n const targetName = typeof h.agent === \"string\" ? h.agent : h.agent.name;\n return {\n name: `${HANDOFF_PREFIX}${targetName}`,\n description: h.description,\n inputSchema: {\n type: \"object\",\n properties: {\n reason: {\n type: \"string\",\n description: \"Reason for the handoff\",\n },\n },\n },\n };\n });\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Provider Error — Normalized error codes for all providers\n// ──────────────────────────────────────────────────────\n\nexport type ADKProviderErrorCode =\n | \"RATE_LIMITED\"\n | \"CONTEXT_LENGTH_EXCEEDED\"\n | \"INVALID_API_KEY\"\n | \"MODEL_NOT_FOUND\"\n | \"CONTENT_FILTERED\"\n | \"SERVICE_UNAVAILABLE\"\n | \"TIMEOUT\"\n | \"NETWORK_ERROR\"\n | \"INSUFFICIENT_QUOTA\"\n | \"UNKNOWN\";\n\nexport class ADKProviderError extends Error {\n readonly code: ADKProviderErrorCode;\n readonly providerId: string;\n readonly model?: string;\n readonly retryable: boolean;\n readonly retryAfterMs?: number;\n readonly statusCode?: number;\n readonly raw?: unknown;\n\n constructor(params: {\n code: ADKProviderErrorCode;\n message: string;\n providerId: string;\n model?: string;\n retryable?: boolean;\n retryAfterMs?: number;\n statusCode?: number;\n raw?: unknown;\n }) {\n super(params.message);\n this.name = \"ADKProviderError\";\n this.code = params.code;\n this.providerId = params.providerId;\n this.model = params.model;\n this.retryable = params.retryable ?? false;\n this.retryAfterMs = params.retryAfterMs;\n this.statusCode = params.statusCode;\n this.raw = params.raw;\n }\n\n static rateLimited(providerId: string, retryAfterMs?: number, raw?: unknown): ADKProviderError {\n return new ADKProviderError({\n code: \"RATE_LIMITED\",\n message: `Rate limited by ${providerId}`,\n providerId,\n retryable: true,\n retryAfterMs,\n statusCode: 429,\n raw,\n });\n }\n\n static contextExceeded(providerId: string, model?: string, raw?: unknown): ADKProviderError {\n return new ADKProviderError({\n code: \"CONTEXT_LENGTH_EXCEEDED\",\n message: `Context length exceeded for ${model ?? \"unknown\"} on ${providerId}`,\n providerId,\n model,\n retryable: false,\n statusCode: 413,\n raw,\n });\n }\n\n static invalidApiKey(providerId: string, raw?: unknown): ADKProviderError {\n return new ADKProviderError({\n code: \"INVALID_API_KEY\",\n message: `Invalid API key for ${providerId}`,\n providerId,\n retryable: false,\n statusCode: 401,\n raw,\n });\n }\n\n static modelNotFound(providerId: string, model: string, raw?: unknown): ADKProviderError {\n return new ADKProviderError({\n code: \"MODEL_NOT_FOUND\",\n message: `Model ${model} not found on ${providerId}`,\n providerId,\n model,\n retryable: false,\n statusCode: 404,\n raw,\n });\n }\n\n static contentFiltered(providerId: string, raw?: unknown): ADKProviderError {\n return new ADKProviderError({\n code: \"CONTENT_FILTERED\",\n message: `Content was filtered by ${providerId}`,\n providerId,\n retryable: false,\n statusCode: 400,\n raw,\n });\n }\n\n static serviceUnavailable(providerId: string, raw?: unknown): ADKProviderError {\n return new ADKProviderError({\n code: \"SERVICE_UNAVAILABLE\",\n message: `${providerId} is unavailable`,\n providerId,\n retryable: true,\n statusCode: 503,\n raw,\n });\n }\n\n static timeout(providerId: string, raw?: unknown): ADKProviderError {\n return new ADKProviderError({\n code: \"TIMEOUT\",\n message: `Request to ${providerId} timed out`,\n providerId,\n retryable: true,\n raw,\n });\n }\n\n static networkError(providerId: string, raw?: unknown): ADKProviderError {\n return new ADKProviderError({\n code: \"NETWORK_ERROR\",\n message: `Network error connecting to ${providerId}`,\n providerId,\n retryable: true,\n raw,\n });\n }\n\n static insufficientQuota(providerId: string, raw?: unknown): ADKProviderError {\n return new ADKProviderError({\n code: \"INSUFFICIENT_QUOTA\",\n message: `Insufficient quota for ${providerId}`,\n providerId,\n retryable: false,\n statusCode: 402,\n raw,\n });\n }\n\n static unknown(providerId: string, raw?: unknown): ADKProviderError {\n const message = raw instanceof Error ? raw.message : String(raw);\n return new ADKProviderError({\n code: \"UNKNOWN\",\n message: `Unknown error from ${providerId}: ${message}`,\n providerId,\n retryable: false,\n raw,\n });\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Base Provider — Abstract base with tool_use + streaming\n// ──────────────────────────────────────────────────────\n\nimport type {\n ADKLLMProvider,\n ChatParams,\n ChatParamsWithTools,\n ChatResponse,\n ChatResponseWithToolCalls,\n CompleteParams,\n CompleteResponse,\n EmbedParams,\n EmbedResponse,\n ProviderInitConfig,\n StreamChunk,\n} from \"../types/llm\";\nimport { ADKProviderError } from \"./errors\";\n\nexport abstract class BaseProvider implements ADKLLMProvider {\n abstract readonly providerId: string;\n abstract readonly displayName: string;\n abstract readonly isLocal: boolean;\n\n protected apiKey?: string;\n protected baseUrl?: string;\n protected defaultModel: string;\n protected modelCosts: Map<string, { input: number; output: number }>;\n\n constructor(config: ProviderInitConfig) {\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl;\n this.defaultModel = config.defaultModel ?? \"\";\n this.modelCosts = config.modelCosts ?? new Map();\n }\n\n abstract chat(params: ChatParams): Promise<ChatResponse>;\n abstract complete(params: CompleteParams): Promise<CompleteResponse>;\n abstract chatWithTools(params: ChatParamsWithTools): Promise<ChatResponseWithToolCalls>;\n abstract chatStream(params: ChatParamsWithTools): AsyncGenerator<StreamChunk>;\n\n embed?(_params: EmbedParams): Promise<EmbedResponse>;\n abstract isAvailable(): boolean;\n abstract getModels(): string[];\n abstract estimateCost(inputTokens: number, outputTokens: number, model?: string): number;\n\n /** Update model costs (for hot-update from discovery) */\n updateModelCosts(costs: Map<string, { input: number; output: number }>): void {\n this.modelCosts = costs;\n }\n\n /**\n * Health check — sends a minimal chat request to verify provider reachability.\n * Subclasses can override for more specific checks (e.g., model listing).\n * Returns healthy status, latency, and optional error message.\n */\n async isHealthy(): Promise<{ healthy: boolean; latencyMs: number; error?: string }> {\n const start = Date.now();\n try {\n await this.chat({\n messages: [{ role: \"user\", content: \"ping\" }],\n model: this.defaultModel || undefined,\n maxTokens: 1,\n });\n return { healthy: true, latencyMs: Date.now() - start };\n } catch (err) {\n return {\n healthy: false,\n latencyMs: Date.now() - start,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n /** Normalize any thrown error into a structured ADKProviderError */\n protected normalizeError(err: unknown, model?: string): ADKProviderError {\n if (err instanceof ADKProviderError) return err;\n\n const status =\n (err as Record<string, unknown>)?.status ?? (err as Record<string, unknown>)?.statusCode;\n\n if (status === 429) return ADKProviderError.rateLimited(this.providerId, undefined, err);\n if (status === 401) return ADKProviderError.invalidApiKey(this.providerId, err);\n if (status === 413) return ADKProviderError.contextExceeded(this.providerId, model, err);\n if (status === 404)\n return ADKProviderError.modelNotFound(this.providerId, model ?? \"unknown\", err);\n if (status === 503 || status === 502)\n return ADKProviderError.serviceUnavailable(this.providerId, err);\n\n if (\n err instanceof Error &&\n (err.message.includes(\"ECONNREFUSED\") ||\n err.message.includes(\"ENOTFOUND\") ||\n err.message.includes(\"fetch failed\"))\n ) {\n return ADKProviderError.networkError(this.providerId, err);\n }\n\n if (\n err instanceof Error &&\n (err.message.includes(\"timeout\") || err.message.includes(\"ETIMEDOUT\"))\n ) {\n return ADKProviderError.timeout(this.providerId, err);\n }\n\n return ADKProviderError.unknown(this.providerId, err);\n }\n\n protected getModelCost(model?: string): { input: number; output: number } {\n const m = model ?? this.defaultModel;\n return this.modelCosts.get(m) ?? { input: 0, output: 0 };\n }\n\n protected calculateCost(inputTokens: number, outputTokens: number, model?: string): number {\n const costs = this.getModelCost(model);\n return (inputTokens * costs.input + outputTokens * costs.output) / 1_000_000;\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Provider Content Adapters\n// ──────────────────────────────────────────────────────\n// Centralized conversion from ADK Content to provider-specific formats.\n// Each provider API has its own multi-modal format:\n// - Anthropic: content blocks with type/text/source\n// - OpenAI: content array with text/image_url\n// - Google: parts with text/inlineData\n// - Ollama: text content + separate images field (for vision models)\n// ──────────────────────────────────────────────────────\n\nimport { extractText, isMultiModalContent } from \"../content/helpers\";\nimport type { Content, ContentPart } from \"../types/content\";\n\n// ── Anthropic ──\n\n/**\n * Convert Content to Anthropic API format.\n * String → passthrough. ContentPart[] → Anthropic content blocks.\n */\nexport function toAnthropicContent(content: Content): unknown {\n if (!isMultiModalContent(content)) return content;\n\n const blocks: unknown[] = [];\n for (const part of content) {\n switch (part.type) {\n case \"text\":\n blocks.push({ type: \"text\", text: part.text });\n break;\n case \"image\":\n if (part.source.type === \"base64\") {\n blocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: part.source.mediaType,\n data: part.source.data,\n },\n });\n } else {\n blocks.push({\n type: \"image\",\n source: {\n type: \"url\",\n url: part.source.url,\n },\n });\n }\n break;\n case \"audio\":\n // Anthropic doesn't natively support audio in messages — degrade gracefully\n if (part.transcript) {\n blocks.push({ type: \"text\", text: `[Audio transcript: ${part.transcript}]` });\n } else {\n blocks.push({ type: \"text\", text: \"[Audio content omitted]\" });\n }\n break;\n case \"video\":\n blocks.push({ type: \"text\", text: \"[Video content omitted]\" });\n break;\n case \"ui_artifact\":\n blocks.push({ type: \"text\", text: `[Artifact: ${part.title}]\\n${part.content}` });\n break;\n }\n }\n\n // Return string if only text blocks\n if (blocks.length === 1 && (blocks[0] as { type: string }).type === \"text\") {\n return (blocks[0] as { text: string }).text;\n }\n\n return blocks.length > 0 ? blocks : \"\";\n}\n\n// ── OpenAI ──\n\n/**\n * Convert Content to OpenAI API format.\n * String → passthrough. ContentPart[] → OpenAI content array.\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: content type mapping requires branching\nexport function toOpenAIContent(content: Content): unknown {\n if (!isMultiModalContent(content)) return content;\n\n const parts: unknown[] = [];\n for (const part of content) {\n switch (part.type) {\n case \"text\":\n parts.push({ type: \"text\", text: part.text });\n break;\n case \"image\":\n if (part.source.type === \"base64\") {\n parts.push({\n type: \"image_url\",\n image_url: {\n url: `data:${part.source.mediaType};base64,${part.source.data}`,\n detail: \"auto\",\n },\n });\n } else {\n parts.push({\n type: \"image_url\",\n image_url: {\n url: part.source.url,\n detail: part.source.detail ?? \"auto\",\n },\n });\n }\n break;\n case \"audio\":\n if (part.source.type === \"base64\") {\n parts.push({\n type: \"input_audio\",\n input_audio: {\n data: part.source.data,\n format: part.source.mediaType === \"audio/wav\" ? \"wav\" : \"mp3\",\n },\n });\n } else if (part.transcript) {\n parts.push({ type: \"text\", text: `[Audio transcript: ${part.transcript}]` });\n } else {\n parts.push({ type: \"text\", text: \"[Audio content omitted]\" });\n }\n break;\n case \"video\":\n parts.push({ type: \"text\", text: \"[Video content omitted]\" });\n break;\n case \"ui_artifact\":\n parts.push({ type: \"text\", text: `[Artifact: ${part.title}]\\n${part.content}` });\n break;\n }\n }\n\n // Return string if only text parts\n if (parts.length === 1 && (parts[0] as { type: string }).type === \"text\") {\n return (parts[0] as { text: string }).text;\n }\n\n return parts.length > 0 ? parts : \"\";\n}\n\n// ── Google ──\n\n/**\n * Convert Content to Google Gemini API format (parts array).\n * String → [{ text }]. ContentPart[] → mixed parts.\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: content type mapping requires branching\nexport function toGoogleParts(content: Content): unknown[] {\n if (!isMultiModalContent(content)) {\n return [{ text: content }];\n }\n\n const parts: unknown[] = [];\n for (const part of content) {\n switch (part.type) {\n case \"text\":\n parts.push({ text: part.text });\n break;\n case \"image\":\n if (part.source.type === \"base64\") {\n parts.push({\n inlineData: {\n mimeType: part.source.mediaType,\n data: part.source.data,\n },\n });\n } else {\n parts.push({\n fileData: {\n mimeType: \"image/png\",\n fileUri: part.source.url,\n },\n });\n }\n break;\n case \"audio\":\n if (part.source.type === \"base64\") {\n parts.push({\n inlineData: {\n mimeType: part.source.mediaType,\n data: part.source.data,\n },\n });\n } else if (part.transcript) {\n parts.push({ text: `[Audio transcript: ${part.transcript}]` });\n } else {\n parts.push({ text: \"[Audio content omitted]\" });\n }\n break;\n case \"video\":\n if (part.source.type === \"base64\") {\n parts.push({\n inlineData: {\n mimeType: part.source.mediaType,\n data: part.source.data,\n },\n });\n } else {\n parts.push({\n fileData: {\n mimeType: \"video/mp4\",\n fileUri: part.source.url,\n },\n });\n }\n break;\n case \"ui_artifact\":\n parts.push({ text: `[Artifact: ${part.title}]\\n${part.content}` });\n break;\n }\n }\n\n return parts.length > 0 ? parts : [{ text: \"\" }];\n}\n\n// ── Ollama ──\n\n/**\n * Extract content for Ollama.\n * Returns { content, images } where images is an optional base64 array for vision models.\n */\nexport function toOllamaContent(content: Content): { content: string; images?: string[] } {\n if (!isMultiModalContent(content)) return { content };\n\n const text = extractText(content);\n const images: string[] = [];\n\n for (const part of content) {\n if (part.type === \"image\" && part.source.type === \"base64\") {\n images.push(part.source.data);\n }\n }\n\n return { content: text, images: images.length > 0 ? images : undefined };\n}\n","// ──────────────────────────────────────────────────────\n// ADK Anthropic Provider\n// ──────────────────────────────────────────────────────\n// Extended with tool_use + streaming from platform-agents\n// ──────────────────────────────────────────────────────\n\nimport { extractText } from \"../content/helpers\";\nimport type {\n ChatParams,\n ChatParamsWithTools,\n ChatResponse,\n ChatResponseWithToolCalls,\n CompleteParams,\n CompleteResponse,\n ProviderInitConfig,\n StreamChunk,\n} from \"../types/llm\";\nimport { BaseProvider } from \"./base-provider\";\nimport { toAnthropicContent } from \"./content-adapters\";\n\nconst DEFAULT_MODEL = \"claude-sonnet-4-5-20250929\";\nconst API_URL = \"https://api.anthropic.com\";\n\nexport class AnthropicProvider extends BaseProvider {\n readonly providerId = \"anthropic\";\n readonly displayName = \"Anthropic\";\n readonly isLocal = false;\n\n constructor(config: ProviderInitConfig) {\n super({ ...config, defaultModel: config.defaultModel ?? DEFAULT_MODEL });\n this.baseUrl = config.baseUrl ?? API_URL;\n }\n\n isAvailable(): boolean {\n return !!this.apiKey;\n }\n\n getModels(): string[] {\n return Array.from(this.modelCosts.keys()).length > 0\n ? Array.from(this.modelCosts.keys())\n : [\"claude-opus-4-6\", \"claude-sonnet-4-5-20250929\", \"claude-haiku-4-5-20251001\"];\n }\n\n estimateCost(inputTokens: number, outputTokens: number, model?: string): number {\n return this.calculateCost(inputTokens, outputTokens, model);\n }\n\n async chat(params: ChatParams): Promise<ChatResponse> {\n const result = await this.chatWithTools(params);\n return result;\n }\n\n async complete(params: CompleteParams): Promise<CompleteResponse> {\n const chatResult = await this.chat({\n messages: [{ role: \"user\", content: params.prompt }],\n model: params.model,\n maxTokens: params.maxTokens,\n temperature: params.temperature,\n });\n\n return {\n text: chatResult.content,\n model: chatResult.model,\n providerId: chatResult.providerId,\n inputTokens: chatResult.inputTokens,\n outputTokens: chatResult.outputTokens,\n totalTokens: chatResult.totalTokens,\n latencyMs: chatResult.latencyMs,\n costUsd: chatResult.costUsd,\n finishReason: chatResult.finishReason,\n };\n }\n\n async chatWithTools(params: ChatParamsWithTools): Promise<ChatResponseWithToolCalls> {\n const model = params.model ?? this.defaultModel;\n const startTime = Date.now();\n\n // Build Anthropic request\n const body: Record<string, unknown> = {\n model,\n max_tokens: params.maxTokens ?? 4096,\n messages: params.messages\n .filter((m) => m.role !== \"system\")\n .map((m) => {\n if (m.role === \"tool\" && m.toolResults) {\n return {\n role: \"user\",\n content: m.toolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.toolCallId,\n content: typeof tr.output === \"string\" ? tr.output : JSON.stringify(tr.output),\n is_error: tr.isError,\n })),\n };\n }\n if (m.role === \"assistant\" && m.toolCalls) {\n const text = extractText(m.content);\n return {\n role: \"assistant\",\n content: [\n ...(text ? [{ type: \"text\", text }] : []),\n ...m.toolCalls.map((tc) => ({\n type: \"tool_use\",\n id: tc.id,\n name: tc.name,\n input: tc.input,\n })),\n ],\n };\n }\n return {\n role: m.role === \"tool\" ? \"user\" : m.role,\n content: toAnthropicContent(m.content),\n };\n }),\n };\n\n // System prompt\n const systemMsg = params.messages.find((m) => m.role === \"system\");\n const systemPrompt =\n params.systemPrompt ?? (systemMsg ? extractText(systemMsg.content) : undefined);\n if (systemPrompt) {\n body.system = systemPrompt;\n }\n\n // Tools\n if (params.tools && params.tools.length > 0) {\n body.tools = params.tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.inputSchema,\n }));\n }\n\n if (params.temperature !== undefined) body.temperature = params.temperature;\n if (params.topP !== undefined) body.top_p = params.topP;\n if (params.stopSequences) body.stop_sequences = params.stopSequences;\n\n // Tool choice\n if (params.toolChoice) {\n if (params.toolChoice === \"required\") body.tool_choice = { type: \"any\" };\n else if (params.toolChoice === \"none\") body.tool_choice = { type: \"none\" };\n else if (typeof params.toolChoice === \"object\")\n body.tool_choice = { type: \"tool\", name: params.toolChoice.name };\n else body.tool_choice = { type: \"auto\" };\n }\n\n const response = await fetch(`${this.baseUrl}/v1/messages`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.apiKey!,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw this.normalizeError(\n Object.assign(new Error(`Anthropic API error (${response.status}): ${error}`), {\n status: response.status,\n }),\n model,\n );\n }\n\n const data = (await response.json()) as {\n content: Array<{ type: string; text?: string; id?: string; name?: string; input?: unknown }>;\n model: string;\n usage: { input_tokens: number; output_tokens: number };\n stop_reason: string;\n };\n\n const latencyMs = Date.now() - startTime;\n const inputTokens = data.usage.input_tokens;\n const outputTokens = data.usage.output_tokens;\n\n // Extract text and tool calls\n let content = \"\";\n const toolCalls: Array<{ id: string; name: string; input: unknown }> = [];\n\n for (const block of data.content) {\n if (block.type === \"text\" && block.text) {\n content += block.text;\n } else if (block.type === \"tool_use\") {\n toolCalls.push({\n id: block.id!,\n name: block.name!,\n input: block.input,\n });\n }\n }\n\n return {\n content,\n model: data.model,\n providerId: this.providerId,\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n latencyMs,\n costUsd: this.calculateCost(inputTokens, outputTokens, model),\n finishReason: data.stop_reason,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n };\n }\n\n async *chatStream(params: ChatParamsWithTools): AsyncGenerator<StreamChunk> {\n const model = params.model ?? this.defaultModel;\n\n const body: Record<string, unknown> = {\n model,\n max_tokens: params.maxTokens ?? 4096,\n stream: true,\n messages: params.messages\n .filter((m) => m.role !== \"system\")\n .map((m) => ({\n role: m.role === \"tool\" ? \"user\" : m.role,\n content: toAnthropicContent(m.content),\n })),\n };\n\n const streamSysMsg = params.messages.find((m) => m.role === \"system\");\n const streamSystemPrompt =\n params.systemPrompt ?? (streamSysMsg ? extractText(streamSysMsg.content) : undefined);\n if (streamSystemPrompt) body.system = streamSystemPrompt;\n\n if (params.tools) {\n body.tools = params.tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.inputSchema,\n }));\n }\n\n if (params.temperature !== undefined) body.temperature = params.temperature;\n\n const response = await fetch(`${this.baseUrl}/v1/messages`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.apiKey!,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok || !response.body) {\n throw this.normalizeError(\n Object.assign(new Error(`Anthropic streaming error (${response.status})`), {\n status: response.status,\n }),\n model,\n );\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n const jsonStr = line.slice(6).trim();\n if (jsonStr === \"[DONE]\") return;\n\n try {\n const event = JSON.parse(jsonStr) as {\n type: string;\n delta?: { type: string; text?: string; partial_json?: string };\n content_block?: { type: string; id?: string; name?: string };\n index?: number;\n usage?: { input_tokens: number; output_tokens: number };\n };\n\n if (event.type === \"content_block_start\" && event.content_block?.type === \"tool_use\") {\n yield {\n type: \"tool_use_start\",\n id: event.content_block.id!,\n name: event.content_block.name!,\n };\n } else if (event.type === \"content_block_delta\") {\n if (event.delta?.type === \"text_delta\" && event.delta.text) {\n yield { type: \"text_delta\", content: event.delta.text };\n } else if (event.delta?.type === \"input_json_delta\" && event.delta.partial_json) {\n yield {\n type: \"tool_use_delta\",\n id: `tool-${event.index}`,\n inputJson: event.delta.partial_json,\n };\n }\n } else if (event.type === \"content_block_stop\") {\n // Could be text or tool_use end\n } else if (event.type === \"message_delta\" && event.usage) {\n yield {\n type: \"message_end\",\n usage: {\n inputTokens: event.usage.input_tokens,\n outputTokens: event.usage.output_tokens,\n },\n };\n }\n } catch {\n // Skip unparseable lines\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK OpenAI Provider\n// ──────────────────────────────────────────────────────\n\nimport { extractText } from \"../content/helpers\";\nimport type {\n ChatParams,\n ChatParamsWithTools,\n ChatResponse,\n ChatResponseWithToolCalls,\n CompleteParams,\n CompleteResponse,\n EmbedParams,\n EmbedResponse,\n ProviderInitConfig,\n StreamChunk,\n} from \"../types/llm\";\nimport { BaseProvider } from \"./base-provider\";\nimport { toOpenAIContent } from \"./content-adapters\";\n\nconst DEFAULT_MODEL = \"gpt-4o\";\nconst API_URL = \"https://api.openai.com/v1\";\n\nexport class OpenAIProvider extends BaseProvider {\n readonly providerId: string;\n readonly displayName: string;\n readonly isLocal: boolean = false;\n\n constructor(config: ProviderInitConfig) {\n super({ ...config, defaultModel: config.defaultModel ?? DEFAULT_MODEL });\n this.providerId = config.providerId ?? \"openai\";\n this.displayName = config.providerId === \"xai\" ? \"xAI\" : \"OpenAI\";\n this.baseUrl = config.baseUrl ?? API_URL;\n }\n\n isAvailable(): boolean {\n return !!this.apiKey;\n }\n\n getModels(): string[] {\n return Array.from(this.modelCosts.keys()).length > 0\n ? Array.from(this.modelCosts.keys())\n : [\"gpt-4o\", \"gpt-4o-mini\", \"gpt-4.1\", \"o3\", \"o4-mini\"];\n }\n\n estimateCost(inputTokens: number, outputTokens: number, model?: string): number {\n return this.calculateCost(inputTokens, outputTokens, model);\n }\n\n async chat(params: ChatParams): Promise<ChatResponse> {\n return this.chatWithTools(params);\n }\n\n async complete(params: CompleteParams): Promise<CompleteResponse> {\n const chatResult = await this.chat({\n messages: [{ role: \"user\", content: params.prompt }],\n model: params.model,\n maxTokens: params.maxTokens,\n temperature: params.temperature,\n });\n return {\n text: chatResult.content,\n model: chatResult.model,\n providerId: chatResult.providerId,\n inputTokens: chatResult.inputTokens,\n outputTokens: chatResult.outputTokens,\n totalTokens: chatResult.totalTokens,\n latencyMs: chatResult.latencyMs,\n costUsd: chatResult.costUsd,\n finishReason: chatResult.finishReason,\n };\n }\n\n async chatWithTools(params: ChatParamsWithTools): Promise<ChatResponseWithToolCalls> {\n const model = params.model ?? this.defaultModel;\n const startTime = Date.now();\n\n const body: Record<string, unknown> = {\n model,\n messages: params.messages.flatMap(\n (\n m,\n ): { role: string; content?: unknown; tool_call_id?: string; tool_calls?: unknown[] }[] => {\n if (m.role === \"tool\" && m.toolResults) {\n return m.toolResults.map((tr) => ({\n role: \"tool\" as const,\n tool_call_id: tr.toolCallId,\n content: typeof tr.output === \"string\" ? tr.output : JSON.stringify(tr.output),\n }));\n }\n if (m.role === \"assistant\" && m.toolCalls) {\n return [\n {\n role: \"assistant\" as const,\n content: extractText(m.content) || null,\n tool_calls: m.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\",\n function: { name: tc.name, arguments: JSON.stringify(tc.input) },\n })),\n },\n ];\n }\n return [{ role: m.role, content: toOpenAIContent(m.content) }];\n },\n ),\n };\n\n if (params.maxTokens) body.max_tokens = params.maxTokens;\n if (params.temperature !== undefined) body.temperature = params.temperature;\n if (params.topP !== undefined) body.top_p = params.topP;\n if (params.stopSequences) body.stop = params.stopSequences;\n\n // Tools\n if (params.tools && params.tools.length > 0) {\n body.tools = params.tools.map((t) => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n },\n }));\n }\n\n // Response format\n if (params.responseFormat) {\n body.response_format = params.responseFormat;\n }\n\n // Tool choice\n if (params.toolChoice) {\n if (params.toolChoice === \"required\") body.tool_choice = \"required\";\n else if (params.toolChoice === \"none\") body.tool_choice = \"none\";\n else if (typeof params.toolChoice === \"object\")\n body.tool_choice = { type: \"function\", function: { name: params.toolChoice.name } };\n else body.tool_choice = \"auto\";\n }\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw this.normalizeError(\n Object.assign(new Error(`OpenAI API error (${response.status}): ${error}`), {\n status: response.status,\n }),\n model,\n );\n }\n\n const data = (await response.json()) as {\n choices: Array<{\n message: {\n content?: string;\n tool_calls?: Array<{ id: string; function: { name: string; arguments: string } }>;\n };\n finish_reason: string;\n }>;\n model: string;\n usage: { prompt_tokens: number; completion_tokens: number };\n };\n\n const latencyMs = Date.now() - startTime;\n const choice = data.choices[0]!;\n const inputTokens = data.usage.prompt_tokens;\n const outputTokens = data.usage.completion_tokens;\n\n const toolCalls = choice.message.tool_calls?.map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n }));\n\n return {\n content: choice.message.content ?? \"\",\n model: data.model,\n providerId: this.providerId,\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n latencyMs,\n costUsd: this.calculateCost(inputTokens, outputTokens, model),\n finishReason: choice.finish_reason,\n toolCalls: toolCalls && toolCalls.length > 0 ? toolCalls : undefined,\n };\n }\n\n async embed(params: EmbedParams): Promise<EmbedResponse> {\n const startTime = Date.now();\n const model = params.model ?? \"text-embedding-3-small\";\n\n const response = await fetch(`${this.baseUrl}/embeddings`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({ input: params.input, model }),\n });\n\n if (!response.ok) {\n throw this.normalizeError(\n Object.assign(new Error(`OpenAI embedding error (${response.status})`), {\n status: response.status,\n }),\n model,\n );\n }\n\n const data = (await response.json()) as {\n data: Array<{ embedding: number[] }>;\n model: string;\n usage: { total_tokens: number };\n };\n\n return {\n embeddings: data.data.map((d) => d.embedding),\n model: data.model,\n providerId: this.providerId,\n totalTokens: data.usage.total_tokens,\n latencyMs: Date.now() - startTime,\n costUsd: 0,\n };\n }\n\n async *chatStream(params: ChatParamsWithTools): AsyncGenerator<StreamChunk> {\n const model = params.model ?? this.defaultModel;\n\n const body: Record<string, unknown> = {\n model,\n stream: true,\n messages: params.messages.map((m) => ({ role: m.role, content: toOpenAIContent(m.content) })),\n };\n\n if (params.maxTokens) body.max_tokens = params.maxTokens;\n if (params.temperature !== undefined) body.temperature = params.temperature;\n\n if (params.tools) {\n body.tools = params.tools.map((t) => ({\n type: \"function\",\n function: { name: t.name, description: t.description, parameters: t.inputSchema },\n }));\n }\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok || !response.body) {\n throw this.normalizeError(\n Object.assign(new Error(`OpenAI streaming error (${response.status})`), {\n status: response.status,\n }),\n model,\n );\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n const jsonStr = line.slice(6).trim();\n if (jsonStr === \"[DONE]\") return;\n\n try {\n const event = JSON.parse(jsonStr) as {\n choices: Array<{\n delta: {\n content?: string;\n tool_calls?: Array<{\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n }>;\n usage?: { prompt_tokens: number; completion_tokens: number };\n };\n\n const delta = event.choices[0]?.delta;\n if (delta?.content) {\n yield { type: \"text_delta\", content: delta.content };\n }\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (tc.id && tc.function?.name) {\n yield { type: \"tool_use_start\", id: tc.id, name: tc.function.name };\n }\n if (tc.function?.arguments) {\n yield {\n type: \"tool_use_delta\",\n id: tc.id ?? `tool-${tc.index}`,\n inputJson: tc.function.arguments,\n };\n }\n }\n }\n if (event.usage) {\n yield {\n type: \"message_end\",\n usage: {\n inputTokens: event.usage.prompt_tokens,\n outputTokens: event.usage.completion_tokens,\n },\n };\n }\n } catch {\n // Skip\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Google Provider (Gemini)\n// ──────────────────────────────────────────────────────\n\nimport { extractText } from \"../content/helpers\";\nimport type {\n ChatParams,\n ChatParamsWithTools,\n ChatResponse,\n ChatResponseWithToolCalls,\n CompleteParams,\n CompleteResponse,\n ProviderInitConfig,\n StreamChunk,\n} from \"../types/llm\";\nimport { BaseProvider } from \"./base-provider\";\nimport { toGoogleParts } from \"./content-adapters\";\n\nconst DEFAULT_MODEL = \"gemini-2.0-flash\";\nconst API_URL = \"https://generativelanguage.googleapis.com\";\n\nexport class GoogleProvider extends BaseProvider {\n readonly providerId = \"google\";\n readonly displayName = \"Google\";\n readonly isLocal = false;\n\n constructor(config: ProviderInitConfig) {\n super({ ...config, defaultModel: config.defaultModel ?? DEFAULT_MODEL });\n this.baseUrl = config.baseUrl ?? API_URL;\n }\n\n isAvailable(): boolean {\n return !!this.apiKey;\n }\n\n getModels(): string[] {\n return Array.from(this.modelCosts.keys()).length > 0\n ? Array.from(this.modelCosts.keys())\n : [\"gemini-2.5-pro\", \"gemini-2.5-flash\", \"gemini-2.0-flash\"];\n }\n\n estimateCost(inputTokens: number, outputTokens: number, model?: string): number {\n return this.calculateCost(inputTokens, outputTokens, model);\n }\n\n async chat(params: ChatParams): Promise<ChatResponse> {\n return this.chatWithTools(params);\n }\n\n async complete(params: CompleteParams): Promise<CompleteResponse> {\n const chatResult = await this.chat({\n messages: [{ role: \"user\", content: params.prompt }],\n model: params.model,\n maxTokens: params.maxTokens,\n temperature: params.temperature,\n });\n return {\n text: chatResult.content,\n model: chatResult.model,\n providerId: chatResult.providerId,\n inputTokens: chatResult.inputTokens,\n outputTokens: chatResult.outputTokens,\n totalTokens: chatResult.totalTokens,\n latencyMs: chatResult.latencyMs,\n costUsd: chatResult.costUsd,\n finishReason: chatResult.finishReason,\n };\n }\n\n async chatWithTools(params: ChatParamsWithTools): Promise<ChatResponseWithToolCalls> {\n const model = params.model ?? this.defaultModel;\n const startTime = Date.now();\n\n // Convert messages to Google format\n const contents = params.messages\n .filter((m) => m.role !== \"system\")\n .map((m) => ({\n role: m.role === \"assistant\" ? \"model\" : \"user\",\n parts: toGoogleParts(m.content),\n }));\n\n const body: Record<string, unknown> = { contents };\n\n // System instruction\n const systemMsg = params.messages.find((m) => m.role === \"system\");\n const systemPrompt =\n params.systemPrompt ?? (systemMsg ? extractText(systemMsg.content) : undefined);\n if (systemPrompt) {\n body.systemInstruction = { parts: [{ text: systemPrompt }] };\n }\n\n // Generation config\n const generationConfig: Record<string, unknown> = {};\n if (params.maxTokens) generationConfig.maxOutputTokens = params.maxTokens;\n if (params.temperature !== undefined) generationConfig.temperature = params.temperature;\n if (params.topP !== undefined) generationConfig.topP = params.topP;\n if (params.stopSequences) generationConfig.stopSequences = params.stopSequences;\n\n if (\n params.responseFormat?.type === \"json_schema\" ||\n params.responseFormat?.type === \"json_object\"\n ) {\n generationConfig.responseMimeType = \"application/json\";\n if (params.responseFormat.type === \"json_schema\" && \"schema\" in params.responseFormat) {\n generationConfig.responseSchema = params.responseFormat.schema;\n }\n }\n\n if (Object.keys(generationConfig).length > 0) {\n body.generationConfig = generationConfig;\n }\n\n // Tools\n if (params.tools && params.tools.length > 0) {\n body.tools = [\n {\n functionDeclarations: params.tools.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n })),\n },\n ];\n }\n\n const response = await fetch(\n `${this.baseUrl}/v1beta/models/${model}:generateContent?key=${this.apiKey}`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw this.normalizeError(\n Object.assign(new Error(`Google API error (${response.status}): ${error}`), {\n status: response.status,\n }),\n model,\n );\n }\n\n const data = (await response.json()) as {\n candidates: Array<{\n content: {\n parts: Array<{ text?: string; functionCall?: { name: string; args: unknown } }>;\n };\n finishReason: string;\n }>;\n usageMetadata?: { promptTokenCount: number; candidatesTokenCount: number };\n };\n\n const latencyMs = Date.now() - startTime;\n const candidate = data.candidates[0]!;\n const inputTokens = data.usageMetadata?.promptTokenCount ?? 0;\n const outputTokens = data.usageMetadata?.candidatesTokenCount ?? 0;\n\n let content = \"\";\n const toolCalls: Array<{ id: string; name: string; input: unknown }> = [];\n let toolCallCounter = 0;\n\n for (const part of candidate.content.parts) {\n if (part.text) content += part.text;\n if (part.functionCall) {\n toolCalls.push({\n id: `call-${++toolCallCounter}`,\n name: part.functionCall.name,\n input: part.functionCall.args,\n });\n }\n }\n\n return {\n content,\n model,\n providerId: this.providerId,\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n latencyMs,\n costUsd: this.calculateCost(inputTokens, outputTokens, model),\n finishReason: candidate.finishReason,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n };\n }\n\n async *chatStream(params: ChatParamsWithTools): AsyncGenerator<StreamChunk> {\n const model = params.model ?? this.defaultModel;\n\n const contents = params.messages\n .filter((m) => m.role !== \"system\")\n .map((m) => ({\n role: m.role === \"assistant\" ? \"model\" : \"user\",\n parts: toGoogleParts(m.content),\n }));\n\n const body: Record<string, unknown> = { contents };\n\n const streamSysMsg = params.messages.find((m) => m.role === \"system\");\n const systemPrompt =\n params.systemPrompt ?? (streamSysMsg ? extractText(streamSysMsg.content) : undefined);\n if (systemPrompt) {\n body.systemInstruction = { parts: [{ text: systemPrompt }] };\n }\n\n const response = await fetch(\n `${this.baseUrl}/v1beta/models/${model}:streamGenerateContent?key=${this.apiKey}&alt=sse`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n\n if (!response.ok || !response.body) {\n throw this.normalizeError(\n Object.assign(new Error(`Google streaming error (${response.status})`), {\n status: response.status,\n }),\n model,\n );\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n try {\n const event = JSON.parse(line.slice(6)) as {\n candidates?: Array<{ content: { parts: Array<{ text?: string }> } }>;\n usageMetadata?: { promptTokenCount: number; candidatesTokenCount: number };\n };\n const text = event.candidates?.[0]?.content?.parts?.[0]?.text;\n if (text) yield { type: \"text_delta\", content: text };\n if (event.usageMetadata) {\n yield {\n type: \"message_end\",\n usage: {\n inputTokens: event.usageMetadata.promptTokenCount,\n outputTokens: event.usageMetadata.candidatesTokenCount,\n },\n };\n }\n } catch {\n // Skip\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK xAI Provider (Grok)\n// ──────────────────────────────────────────────────────\n// Wraps OpenAI provider with xAI base URL\n\nimport type { ProviderInitConfig } from \"../types/llm\";\nimport { OpenAIProvider } from \"./openai\";\n\nconst DEFAULT_MODEL = \"grok-3-mini\";\nconst API_URL = \"https://api.x.ai/v1\";\n\nexport class XAIProvider extends OpenAIProvider {\n override readonly providerId = \"xai\";\n override readonly displayName = \"xAI\";\n\n constructor(config: ProviderInitConfig) {\n super({\n ...config,\n providerId: \"xai\",\n baseUrl: config.baseUrl ?? API_URL,\n defaultModel: config.defaultModel ?? DEFAULT_MODEL,\n });\n }\n\n override getModels(): string[] {\n return Array.from(this.modelCosts.keys()).length > 0\n ? Array.from(this.modelCosts.keys())\n : [\"grok-4\", \"grok-4-fast\", \"grok-3-mini\"];\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Ollama Provider (Local)\n// ──────────────────────────────────────────────────────\n\nimport type {\n ChatParams,\n ChatParamsWithTools,\n ChatResponse,\n ChatResponseWithToolCalls,\n CompleteParams,\n CompleteResponse,\n ProviderInitConfig,\n StreamChunk,\n} from \"../types/llm\";\nimport { BaseProvider } from \"./base-provider\";\nimport { toOllamaContent } from \"./content-adapters\";\n\nconst DEFAULT_MODEL = \"llama3.2\";\nconst API_URL = \"http://localhost:11434\";\n\nexport class OllamaProvider extends BaseProvider {\n readonly providerId = \"ollama\";\n readonly displayName = \"Ollama\";\n readonly isLocal = true;\n private knownModels: string[];\n\n constructor(config: ProviderInitConfig) {\n super({ ...config, defaultModel: config.defaultModel ?? DEFAULT_MODEL });\n this.baseUrl = config.baseUrl ?? API_URL;\n this.knownModels = config.knownModels ?? [DEFAULT_MODEL];\n }\n\n isAvailable(): boolean {\n return true; // Local — always \"available\", may fail on actual call\n }\n\n getModels(): string[] {\n return this.knownModels;\n }\n\n estimateCost(): number {\n return 0; // Local is free\n }\n\n updateKnownModels(models: string[]): void {\n this.knownModels = models;\n }\n\n async chat(params: ChatParams): Promise<ChatResponse> {\n return this.chatWithTools(params);\n }\n\n async complete(params: CompleteParams): Promise<CompleteResponse> {\n const startTime = Date.now();\n const model = params.model ?? this.defaultModel;\n\n const response = await fetch(`${this.baseUrl}/api/generate`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model,\n prompt: params.prompt,\n stream: false,\n options: {\n temperature: params.temperature,\n top_p: params.topP,\n num_predict: params.maxTokens,\n stop: params.stopSequences,\n },\n }),\n });\n\n if (!response.ok) {\n throw this.normalizeError(\n Object.assign(new Error(`Ollama error (${response.status})`), {\n status: response.status,\n }),\n model,\n );\n }\n\n const data = (await response.json()) as {\n response: string;\n model: string;\n prompt_eval_count?: number;\n eval_count?: number;\n };\n\n return {\n text: data.response,\n model: data.model,\n providerId: this.providerId,\n inputTokens: data.prompt_eval_count ?? 0,\n outputTokens: data.eval_count ?? 0,\n totalTokens: (data.prompt_eval_count ?? 0) + (data.eval_count ?? 0),\n latencyMs: Date.now() - startTime,\n costUsd: 0,\n finishReason: \"stop\",\n };\n }\n\n async chatWithTools(params: ChatParamsWithTools): Promise<ChatResponseWithToolCalls> {\n const model = params.model ?? this.defaultModel;\n const startTime = Date.now();\n\n const body: Record<string, unknown> = {\n model,\n messages: params.messages.map((m) => {\n const { content, images } = toOllamaContent(m.content);\n return images ? { role: m.role, content, images } : { role: m.role, content };\n }),\n stream: false,\n options: {\n temperature: params.temperature,\n top_p: params.topP,\n num_predict: params.maxTokens,\n },\n };\n\n if (params.tools && params.tools.length > 0) {\n body.tools = params.tools.map((t) => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n },\n }));\n }\n\n const response = await fetch(`${this.baseUrl}/api/chat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw this.normalizeError(\n Object.assign(new Error(`Ollama error (${response.status})`), {\n status: response.status,\n }),\n model,\n );\n }\n\n const data = (await response.json()) as {\n message: {\n content: string;\n tool_calls?: Array<{ function: { name: string; arguments: Record<string, unknown> } }>;\n };\n model: string;\n prompt_eval_count?: number;\n eval_count?: number;\n };\n\n const latencyMs = Date.now() - startTime;\n const inputTokens = data.prompt_eval_count ?? 0;\n const outputTokens = data.eval_count ?? 0;\n\n const toolCalls = data.message.tool_calls?.map((tc, i) => ({\n id: `call-${i}`,\n name: tc.function.name,\n input: tc.function.arguments,\n }));\n\n return {\n content: data.message.content,\n model: data.model,\n providerId: this.providerId,\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n latencyMs,\n costUsd: 0,\n finishReason: \"stop\",\n toolCalls: toolCalls && toolCalls.length > 0 ? toolCalls : undefined,\n };\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: streaming response parsing requires branching\n async *chatStream(params: ChatParamsWithTools): AsyncGenerator<StreamChunk> {\n const model = params.model ?? this.defaultModel;\n\n const response = await fetch(`${this.baseUrl}/api/chat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model,\n messages: params.messages.map((m) => {\n const { content, images } = toOllamaContent(m.content);\n return images ? { role: m.role, content, images } : { role: m.role, content };\n }),\n stream: true,\n }),\n });\n\n if (!response.ok || !response.body) {\n throw this.normalizeError(\n Object.assign(new Error(`Ollama streaming error (${response.status})`), {\n status: response.status,\n }),\n model,\n );\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const event = JSON.parse(line) as {\n message?: { content: string };\n done: boolean;\n prompt_eval_count?: number;\n eval_count?: number;\n };\n if (event.message?.content) {\n yield { type: \"text_delta\", content: event.message.content };\n }\n if (event.done) {\n yield {\n type: \"message_end\",\n usage: {\n inputTokens: event.prompt_eval_count ?? 0,\n outputTokens: event.eval_count ?? 0,\n },\n };\n }\n } catch {\n // Skip\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK LM Studio Provider (Local, OpenAI-compatible)\n// ──────────────────────────────────────────────────────\n\nimport type { ProviderInitConfig } from \"../types/llm\";\nimport { OpenAIProvider } from \"./openai\";\n\nconst API_URL = \"http://localhost:1234/v1\";\n\nexport class LMStudioProvider extends OpenAIProvider {\n override readonly providerId = \"lmstudio\";\n override readonly displayName = \"LM Studio\";\n override readonly isLocal: boolean = true;\n\n constructor(config: ProviderInitConfig) {\n super({\n ...config,\n providerId: \"lmstudio\",\n baseUrl: config.baseUrl ?? API_URL,\n apiKey: config.apiKey ?? \"lm-studio\",\n defaultModel: config.defaultModel ?? \"default\",\n });\n }\n\n override isAvailable(): boolean {\n return true; // Local — always \"available\"\n }\n\n override estimateCost(): number {\n return 0; // Local is free\n }\n\n override getModels(): string[] {\n return this.knownModels ?? [\"default\"];\n }\n\n private knownModels?: string[];\n\n updateKnownModels(models: string[]): void {\n this.knownModels = models;\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Provider Factory\n// ──────────────────────────────────────────────────────\n\nimport type { ADKLLMProvider, ProviderInitConfig } from \"../types/llm\";\nimport { AnthropicProvider } from \"./anthropic\";\nimport { GoogleProvider } from \"./google\";\nimport { LMStudioProvider } from \"./lmstudio\";\nimport { OllamaProvider } from \"./ollama\";\nimport { OpenAIProvider } from \"./openai\";\nimport { XAIProvider } from \"./xai\";\n\n/** Create a provider from config. Returns null if required API key is missing for cloud providers. */\nexport function createProvider(config: ProviderInitConfig): ADKLLMProvider | null {\n switch (config.providerId) {\n case \"anthropic\":\n if (!config.apiKey) return null;\n return new AnthropicProvider(config);\n case \"openai\":\n if (!config.apiKey) return null;\n return new OpenAIProvider(config);\n case \"google\":\n if (!config.apiKey) return null;\n return new GoogleProvider(config);\n case \"xai\":\n if (!config.apiKey) return null;\n return new XAIProvider(config);\n case \"ollama\":\n return new OllamaProvider(config);\n case \"lmstudio\":\n return new LMStudioProvider(config);\n default:\n return null;\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Log Redaction — Mask sensitive data in log output\n// ──────────────────────────────────────────────────────\n\nexport interface RedactOptions {\n /** Additional patterns to match (merged with defaults unless `patternsOnly` is set) */\n patterns?: RegExp[];\n /** Fixed replacement string — if omitted, values are partially masked */\n replacement?: string;\n}\n\nconst DEFAULT_PATTERNS: RegExp[] = [\n // API keys with common prefixes\n /\\b(sk-[a-zA-Z0-9]{20,})\\b/g,\n /\\b(AIza[a-zA-Z0-9_-]{30,})\\b/g,\n /\\b(xai-[a-zA-Z0-9]{20,})\\b/g,\n /\\b(pcp_[a-zA-Z0-9]{20,})\\b/g,\n /\\b(key-[a-zA-Z0-9]{20,})\\b/g,\n /\\b(Bearer\\s+[a-zA-Z0-9._-]{20,})\\b/g,\n // Connection strings\n /\\b(postgres(?:ql)?:\\/\\/[^\\s]+)\\b/g,\n /\\b(redis:\\/\\/[^\\s]+)\\b/g,\n /\\b(mongodb(?:\\+srv)?:\\/\\/[^\\s]+)\\b/g,\n // Email addresses\n /\\b([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})\\b/g,\n // JWT tokens\n /\\b(eyJ[a-zA-Z0-9_-]{10,}\\.[a-zA-Z0-9_-]{10,}\\.[a-zA-Z0-9_-]{10,})\\b/g,\n];\n\nfunction maskValue(value: string): string {\n if (value.length <= 8) return \"***\";\n return `${value.slice(0, 4)}***${value.slice(-4)}`;\n}\n\n/**\n * Redact sensitive information from a text string.\n * By default masks API keys, connection strings, emails, and JWTs.\n */\nexport function redact(text: string, options?: RedactOptions): string {\n const patterns = options?.patterns ?? DEFAULT_PATTERNS;\n let result = text;\n for (const pattern of patterns) {\n // Create a fresh RegExp to reset lastIndex (global flag state)\n const fresh = new RegExp(pattern.source, pattern.flags);\n result = result.replace(fresh, (match) => {\n if (options?.replacement) return options.replacement;\n return maskValue(match);\n });\n }\n return result;\n}\n","// ──────────────────────────────────────────────────────\n// ADK LLM Adapter — Circuit breaker + metrics\n// ──────────────────────────────────────────────────────\n// Extracted from @aizona/platform-agents/runtime/llm-adapter.ts\n// Extended with tool calling and streaming support\n// ──────────────────────────────────────────────────────\n\nimport type { ADKEventBus } from \"../events/event-bus\";\nimport type {\n ADKLLMProvider,\n ChatParams,\n ChatParamsWithTools,\n ChatResponse,\n ChatResponseWithToolCalls,\n CircuitBreakerState,\n CompleteParams,\n CompleteResponse,\n EmbedParams,\n EmbedResponse,\n ProviderMetrics,\n StreamChunk,\n} from \"../types/llm\";\n\nconst CIRCUIT_BREAKER_THRESHOLD = 5;\nconst CIRCUIT_BREAKER_RESET_MS = 30_000;\nconst CIRCUIT_BREAKER_SUCCESS_THRESHOLD = 3;\n\nexport class ADKLLMAdapter {\n private providers = new Map<string, ADKLLMProvider>();\n private circuitBreakers = new Map<string, CircuitBreakerState>();\n private metrics = new Map<string, ProviderMetrics>();\n private eventBus?: ADKEventBus;\n\n constructor(eventBus?: ADKEventBus) {\n this.eventBus = eventBus;\n }\n\n registerProvider(provider: ADKLLMProvider): void {\n this.providers.set(provider.providerId, provider);\n this.circuitBreakers.set(provider.providerId, {\n providerId: provider.providerId,\n state: \"closed\",\n failures: 0,\n lastFailure: null,\n lastSuccess: null,\n openedAt: null,\n });\n this.metrics.set(provider.providerId, {\n providerId: provider.providerId,\n totalCalls: 0,\n successCalls: 0,\n failedCalls: 0,\n avgLatencyMs: 0,\n totalCostUsd: 0,\n lastCallAt: null,\n });\n }\n\n unregisterProvider(providerId: string): void {\n this.providers.delete(providerId);\n this.circuitBreakers.delete(providerId);\n this.metrics.delete(providerId);\n }\n\n getProvider(providerId: string): ADKLLMProvider | undefined {\n return this.providers.get(providerId);\n }\n\n getAllProviders(): ADKLLMProvider[] {\n return Array.from(this.providers.values());\n }\n\n getAvailableProviders(): ADKLLMProvider[] {\n return this.getAllProviders().filter((p) => {\n if (!p.isAvailable()) return false;\n const cb = this.getCircuitState(p.providerId);\n return cb.state !== \"open\";\n });\n }\n\n getCircuitState(providerId: string): CircuitBreakerState {\n const cb = this.circuitBreakers.get(providerId);\n if (!cb) {\n return {\n providerId,\n state: \"closed\",\n failures: 0,\n lastFailure: null,\n lastSuccess: null,\n openedAt: null,\n };\n }\n if (cb.state === \"open\" && cb.openedAt) {\n if (Date.now() - cb.openedAt >= CIRCUIT_BREAKER_RESET_MS) {\n cb.state = \"half-open\";\n }\n }\n return cb;\n }\n\n getProviderMetrics(providerId: string): ProviderMetrics | undefined {\n return this.metrics.get(providerId);\n }\n\n getAllMetrics(): ProviderMetrics[] {\n return Array.from(this.metrics.values());\n }\n\n async chat(\n providerId: string,\n params: ChatParams,\n context?: { agentSlug?: string; taskId?: string },\n ): Promise<ChatResponse> {\n const provider = this.providers.get(providerId);\n if (!provider) throw new Error(`LLM provider \"${providerId}\" not registered`);\n this.checkCircuitBreaker(providerId);\n\n const startTime = Date.now();\n try {\n const response = await provider.chat(params);\n this.recordSuccess(providerId, Date.now() - startTime, response.costUsd);\n this.emitCallCompleted(providerId, response, context);\n return response;\n } catch (error) {\n this.recordFailure(providerId);\n this.emitCallFailed(providerId, params.model, error, Date.now() - startTime, context);\n throw error;\n }\n }\n\n async chatWithTools(\n providerId: string,\n params: ChatParamsWithTools,\n context?: { agentSlug?: string; taskId?: string },\n ): Promise<ChatResponseWithToolCalls> {\n const provider = this.providers.get(providerId);\n if (!provider) throw new Error(`LLM provider \"${providerId}\" not registered`);\n this.checkCircuitBreaker(providerId);\n\n const startTime = Date.now();\n try {\n const response = await provider.chatWithTools(params);\n this.recordSuccess(providerId, Date.now() - startTime, response.costUsd);\n this.emitCallCompleted(providerId, response, context);\n return response;\n } catch (error) {\n this.recordFailure(providerId);\n this.emitCallFailed(providerId, params.model, error, Date.now() - startTime, context);\n throw error;\n }\n }\n\n async *chatStream(providerId: string, params: ChatParamsWithTools): AsyncGenerator<StreamChunk> {\n const provider = this.providers.get(providerId);\n if (!provider) throw new Error(`LLM provider \"${providerId}\" not registered`);\n this.checkCircuitBreaker(providerId);\n\n yield* provider.chatStream(params);\n }\n\n async complete(providerId: string, params: CompleteParams): Promise<CompleteResponse> {\n const provider = this.providers.get(providerId);\n if (!provider) throw new Error(`LLM provider \"${providerId}\" not registered`);\n this.checkCircuitBreaker(providerId);\n\n const startTime = Date.now();\n try {\n const response = await provider.complete(params);\n this.recordSuccess(providerId, Date.now() - startTime, response.costUsd);\n return response;\n } catch (error) {\n this.recordFailure(providerId);\n throw error;\n }\n }\n\n async embed(providerId: string, params: EmbedParams): Promise<EmbedResponse> {\n const provider = this.providers.get(providerId);\n if (!provider?.embed) throw new Error(`Provider \"${providerId}\" doesn't support embeddings`);\n\n const startTime = Date.now();\n try {\n const response = await provider.embed(params);\n this.recordSuccess(providerId, Date.now() - startTime, response.costUsd);\n return response;\n } catch (error) {\n this.recordFailure(providerId);\n throw error;\n }\n }\n\n private checkCircuitBreaker(providerId: string): void {\n const cb = this.getCircuitState(providerId);\n if (cb.state === \"open\") {\n throw new Error(`Circuit breaker open for provider \"${providerId}\"`);\n }\n }\n\n private recordSuccess(providerId: string, latencyMs: number, costUsd: number): void {\n const cb = this.circuitBreakers.get(providerId);\n if (cb) {\n cb.lastSuccess = Date.now();\n if (cb.state === \"half-open\") {\n cb.failures = Math.max(0, cb.failures - 1);\n if (cb.failures <= CIRCUIT_BREAKER_THRESHOLD - CIRCUIT_BREAKER_SUCCESS_THRESHOLD) {\n cb.state = \"closed\";\n cb.failures = 0;\n cb.openedAt = null;\n }\n } else {\n cb.failures = 0;\n }\n }\n const m = this.metrics.get(providerId);\n if (m) {\n m.totalCalls++;\n m.successCalls++;\n m.avgLatencyMs = (m.avgLatencyMs * (m.totalCalls - 1) + latencyMs) / m.totalCalls;\n m.totalCostUsd += costUsd;\n m.lastCallAt = Date.now();\n }\n }\n\n private recordFailure(providerId: string): void {\n const cb = this.circuitBreakers.get(providerId);\n if (cb) {\n cb.failures++;\n cb.lastFailure = Date.now();\n if (cb.failures >= CIRCUIT_BREAKER_THRESHOLD) {\n cb.state = \"open\";\n cb.openedAt = Date.now();\n }\n }\n const m = this.metrics.get(providerId);\n if (m) {\n m.totalCalls++;\n m.failedCalls++;\n m.lastCallAt = Date.now();\n }\n }\n\n private emitCallCompleted(\n providerId: string,\n response: ChatResponse,\n context?: { agentSlug?: string; taskId?: string },\n ): void {\n try {\n this.eventBus?.emit(\"llm.call.completed\", {\n callId: `${providerId}-${Date.now()}`,\n providerId,\n model: response.model,\n agentSlug: context?.agentSlug,\n taskId: context?.taskId,\n inputTokens: response.inputTokens,\n outputTokens: response.outputTokens,\n costUsd: response.costUsd,\n latencyMs: response.latencyMs,\n ttfbMs: response.ttfbMs,\n timestamp: Date.now(),\n });\n } catch {\n /* non-critical */\n }\n }\n\n private emitCallFailed(\n providerId: string,\n model: string | undefined,\n error: unknown,\n latencyMs: number,\n context?: { agentSlug?: string; taskId?: string },\n ): void {\n try {\n this.eventBus?.emit(\"llm.call.failed\", {\n callId: `${providerId}-${Date.now()}`,\n providerId,\n model: model ?? \"unknown\",\n agentSlug: context?.agentSlug,\n taskId: context?.taskId,\n error: error instanceof Error ? error.message : String(error),\n latencyMs,\n timestamp: Date.now(),\n });\n } catch {\n /* non-critical */\n }\n }\n\n reset(): void {\n this.providers.clear();\n this.circuitBreakers.clear();\n this.metrics.clear();\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK LLM Router — 5 strategies + budget enforcement\n// ──────────────────────────────────────────────────────\n// Extracted from @aizona/platform-agents/runtime/llm-router.ts\n// Extended with tool calling support\n// ──────────────────────────────────────────────────────\n\nimport type {\n ADKLLMProvider,\n AgentLLMConfig,\n ChatParamsWithTools,\n ChatResponseWithToolCalls,\n RoutingStrategy,\n} from \"../types/llm\";\nimport type { ADKLLMAdapter } from \"./llm-adapter\";\n\nexport class ADKRouter {\n private configs = new Map<string, AgentLLMConfig>();\n private budgetUsage = new Map<string, number>();\n private adapter: ADKLLMAdapter;\n\n constructor(adapter: ADKLLMAdapter) {\n this.adapter = adapter;\n }\n\n setConfig(agentSlug: string, config: AgentLLMConfig): void {\n this.configs.set(agentSlug, config);\n }\n\n getConfig(agentSlug: string): AgentLLMConfig {\n return (\n this.configs.get(agentSlug) ?? {\n agentSlug,\n enabledProviders: this.adapter.getAvailableProviders().map((p) => p.providerId),\n strategy: \"balanced\",\n }\n );\n }\n\n async route(\n agentSlug: string,\n params: ChatParamsWithTools,\n context?: { taskId?: string },\n ): Promise<ChatResponseWithToolCalls> {\n const config = this.getConfig(agentSlug);\n\n // Budget check\n if (config.budgetLimitUsd) {\n const used = this.budgetUsage.get(agentSlug) ?? 0;\n if (used >= config.budgetLimitUsd) {\n // Try local/free provider fallback\n const freeProvider = this.adapter.getAvailableProviders().find((p) => p.isLocal);\n if (freeProvider) {\n return this.adapter.chatWithTools(freeProvider.providerId, params, {\n agentSlug,\n ...context,\n });\n }\n throw new Error(\n `Budget exceeded for agent \"${agentSlug}\": $${used.toFixed(4)} >= $${config.budgetLimitUsd}`,\n );\n }\n }\n\n // Select provider based on strategy\n const providerId = this.selectProvider(config);\n if (!providerId) {\n throw new Error(`No available provider for agent \"${agentSlug}\"`);\n }\n\n const response = await this.adapter.chatWithTools(providerId, params, {\n agentSlug,\n ...context,\n });\n\n // Track budget\n const currentUsage = this.budgetUsage.get(agentSlug) ?? 0;\n this.budgetUsage.set(agentSlug, currentUsage + response.costUsd);\n\n return response;\n }\n\n private selectProvider(config: AgentLLMConfig): string | null {\n const available = this.adapter\n .getAvailableProviders()\n .filter((p) => config.enabledProviders.includes(p.providerId));\n\n if (available.length === 0) return null;\n\n switch (config.strategy) {\n case \"cost-optimized\":\n return this.selectCheapest(available);\n case \"latency-optimized\":\n return this.selectFastest(available);\n case \"quality-optimized\":\n return this.selectHighestQuality(available, config);\n case \"balanced\":\n return this.selectBalanced(available);\n case \"fallback-chain\":\n return this.selectFromChain(available, config);\n default:\n return available[0]?.providerId ?? null;\n }\n }\n\n private selectCheapest(providers: ADKLLMProvider[]): string {\n let cheapest = providers[0]!;\n let cheapestCost = cheapest.estimateCost(1000, 1000);\n for (let i = 1; i < providers.length; i++) {\n const provider = providers[i]!;\n const cost = provider.estimateCost(1000, 1000);\n if (cost < cheapestCost) {\n cheapest = provider;\n cheapestCost = cost;\n }\n }\n return cheapest.providerId;\n }\n\n private selectFastest(providers: ADKLLMProvider[]): string {\n let fastest = providers[0]!;\n let fastestLatency =\n this.adapter.getProviderMetrics(fastest.providerId)?.avgLatencyMs ?? Number.POSITIVE_INFINITY;\n for (let i = 1; i < providers.length; i++) {\n const provider = providers[i]!;\n const latency =\n this.adapter.getProviderMetrics(provider.providerId)?.avgLatencyMs ??\n Number.POSITIVE_INFINITY;\n if (latency < fastestLatency) {\n fastest = provider;\n fastestLatency = latency;\n }\n }\n return fastest.providerId;\n }\n\n private selectHighestQuality(providers: ADKLLMProvider[], config: AgentLLMConfig): string {\n if (config.preferredModel) {\n const preferred = providers.find((p) => p.getModels().includes(config.preferredModel!));\n if (preferred) return preferred.providerId;\n }\n return providers[0]?.providerId ?? \"\";\n }\n\n private selectBalanced(providers: ADKLLMProvider[]): string {\n let best = providers[0]!;\n let bestScore = Number.NEGATIVE_INFINITY;\n\n for (const p of providers) {\n const metrics = this.adapter.getProviderMetrics(p.providerId);\n const cost = p.estimateCost(1000, 1000);\n const latency = metrics?.avgLatencyMs ?? 500;\n const successRate = metrics?.totalCalls ? metrics.successCalls / metrics.totalCalls : 1;\n\n // Lower cost + lower latency + higher success rate = better\n const costScore = 1 / (1 + cost);\n const latencyScore = 1 / (1 + latency / 1000);\n const score = costScore * 0.3 + latencyScore * 0.3 + successRate * 0.4;\n\n if (score > bestScore) {\n best = p;\n bestScore = score;\n }\n }\n return best.providerId;\n }\n\n private selectFromChain(providers: ADKLLMProvider[], config: AgentLLMConfig): string {\n if (config.fallbackChain) {\n for (const providerId of config.fallbackChain) {\n if (providers.some((p) => p.providerId === providerId)) {\n return providerId;\n }\n }\n }\n return providers[0]?.providerId ?? \"\";\n }\n\n resetBudget(agentSlug: string): void {\n this.budgetUsage.delete(agentSlug);\n }\n\n resetAllBudgets(): void {\n this.budgetUsage.clear();\n }\n\n getBudgetUsage(agentSlug: string): number {\n return this.budgetUsage.get(agentSlug) ?? 0;\n }\n\n reset(): void {\n this.configs.clear();\n this.budgetUsage.clear();\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Streaming — AsyncGenerator utilities\n// ──────────────────────────────────────────────────────\n\nimport type { StreamEvent } from \"../types/runner\";\n\n/** Create a controllable async generator from events */\nexport function createAsyncEventStream(): {\n push: (event: StreamEvent) => void;\n close: () => void;\n error: (err: Error) => void;\n stream: AsyncGenerator<StreamEvent>;\n} {\n const queue: StreamEvent[] = [];\n let resolve: (() => void) | null = null;\n let closed = false;\n let streamError: Error | null = null;\n\n const push = (event: StreamEvent) => {\n if (closed) return;\n queue.push(event);\n resolve?.();\n resolve = null;\n };\n\n const close = () => {\n closed = true;\n resolve?.();\n resolve = null;\n };\n\n const error = (err: Error) => {\n streamError = err;\n closed = true;\n resolve?.();\n resolve = null;\n };\n\n async function* generator(): AsyncGenerator<StreamEvent> {\n while (true) {\n if (streamError) throw streamError;\n if (queue.length > 0) {\n yield queue.shift()!;\n continue;\n }\n if (closed) return;\n await new Promise<void>((r) => {\n resolve = r;\n });\n }\n }\n\n return { push, close, error, stream: generator() };\n}\n","// ──────────────────────────────────────────────────────\n// ADK Streaming — SSE Encoder\n// ──────────────────────────────────────────────────────\n\nimport type { StreamEvent } from \"../types/runner\";\n\n/** Encode a StreamEvent as an SSE data line */\nexport function encodeSSE(event: StreamEvent): string {\n return `data: ${JSON.stringify(event)}\\n\\n`;\n}\n\n/** Convert an AsyncGenerator<StreamEvent> to a ReadableStream<Uint8Array> for SSE */\nexport function streamToSSE(generator: AsyncGenerator<StreamEvent>): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const { done, value } = await generator.next();\n if (done) {\n controller.enqueue(encoder.encode(\"data: [DONE]\\n\\n\"));\n controller.close();\n return;\n }\n controller.enqueue(encoder.encode(encodeSSE(value)));\n } catch (error) {\n controller.error(error);\n }\n },\n cancel() {\n generator.return(undefined);\n },\n });\n}\n","// ──────────────────────────────────────────────────────\n// ADK Streaming — WebSocket Relay\n// ──────────────────────────────────────────────────────\n\nimport type { StreamEvent } from \"../types/runner\";\n\n/** Minimal WebSocket interface (works with ws, browser WebSocket, etc.) */\nexport interface WSLike {\n send(data: string): void;\n close(code?: number, reason?: string): void;\n readyState: number;\n}\n\n/** WebSocket readyState constants */\nconst WS_OPEN = 1;\n\n/** Relay stream events to a WebSocket connection */\nexport async function relayToWebSocket(\n generator: AsyncGenerator<StreamEvent>,\n ws: WSLike,\n): Promise<void> {\n try {\n for await (const event of generator) {\n if (ws.readyState !== WS_OPEN) break;\n ws.send(JSON.stringify(event));\n }\n if (ws.readyState === WS_OPEN) {\n ws.send(JSON.stringify({ type: \"done\" }));\n }\n } catch (error) {\n if (ws.readyState === WS_OPEN) {\n ws.send(JSON.stringify({ type: \"error\", error: String(error) }));\n }\n }\n}\n","// ──────────────────────────────────────────────────────\n// Stream Backpressure — bounded buffer with lossy drop\n// ──────────────────────────────────────────────────────\n// Provides an async-iterable stream with configurable buffer limits.\n// When the buffer is full, the oldest item is dropped (lossy backpressure).\n// Includes optional SSE keepalive support for long-lived connections.\n// ──────────────────────────────────────────────────────\n\nexport interface BackpressureOptions {\n /** Max items in buffer before dropping oldest (default: 100) */\n bufferLimit?: number;\n /** SSE keepalive interval in ms (default: 15000) */\n keepaliveIntervalMs?: number;\n}\n\nexport class BackpressuredStream<T> {\n private buffer: T[] = [];\n private resolve: ((value: IteratorResult<T>) => void) | null = null;\n private done = false;\n private keepaliveTimer: ReturnType<typeof setInterval> | null = null;\n private readonly bufferLimit: number;\n\n constructor(private options: BackpressureOptions = {}) {\n this.bufferLimit = options.bufferLimit ?? 100;\n }\n\n /**\n * Push an item into the stream.\n * If a consumer is waiting, delivers directly.\n * If buffer is full, drops the oldest item (lossy backpressure).\n * Returns false if stream is already ended.\n */\n push(item: T): boolean {\n if (this.done) return false;\n if (this.resolve) {\n // Consumer is waiting — deliver directly\n const r = this.resolve;\n this.resolve = null;\n r({ value: item, done: false });\n return true;\n }\n if (this.buffer.length >= this.bufferLimit) {\n // Buffer full — drop oldest (lossy backpressure)\n this.buffer.shift();\n }\n this.buffer.push(item);\n return true;\n }\n\n /** Signal end-of-stream. Resolves any waiting consumer. */\n end(): void {\n this.done = true;\n if (this.resolve) {\n const r = this.resolve;\n this.resolve = null;\n r({ value: undefined as unknown as T, done: true });\n }\n this.stopKeepalive();\n }\n\n /** Start an interval that calls onKeepalive periodically (for SSE `:keepalive` comments). */\n startKeepalive(onKeepalive: () => void): void {\n const interval = this.options.keepaliveIntervalMs ?? 15000;\n this.keepaliveTimer = setInterval(onKeepalive, interval);\n }\n\n /** Stop the keepalive timer. */\n stopKeepalive(): void {\n if (this.keepaliveTimer) {\n clearInterval(this.keepaliveTimer);\n this.keepaliveTimer = null;\n }\n }\n\n /** Current number of buffered items. */\n get bufferSize(): number {\n return this.buffer.length;\n }\n\n /** True when buffer has reached its limit. */\n get isFull(): boolean {\n return this.buffer.length >= this.bufferLimit;\n }\n\n /** Whether the stream has been ended. */\n get isDone(): boolean {\n return this.done;\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: (): Promise<IteratorResult<T>> => {\n if (this.buffer.length > 0) {\n return Promise.resolve({ value: this.buffer.shift() as T, done: false });\n }\n if (this.done) {\n return Promise.resolve({\n value: undefined as unknown as T,\n done: true,\n });\n }\n return new Promise<IteratorResult<T>>((resolve) => {\n this.resolve = resolve;\n });\n },\n };\n }\n}\n","export { createAsyncEventStream } from \"./async-generator\";\nexport { encodeSSE, streamToSSE } from \"./sse-encoder\";\nexport { relayToWebSocket } from \"./ws-relay\";\nexport type { WSLike } from \"./ws-relay\";\nexport { BackpressuredStream } from \"./backpressure\";\nexport type { BackpressureOptions } from \"./backpressure\";\n\nimport type { StreamEvent } from \"../types/runner\";\nimport { streamToSSE } from \"./sse-encoder\";\nimport { type WSLike, relayToWebSocket } from \"./ws-relay\";\n\n/** Create a stream adapter from an AsyncGenerator<StreamEvent> */\nexport function createStreamAdapter(generator: AsyncGenerator<StreamEvent>): {\n toSSE(): ReadableStream<Uint8Array>;\n toWebSocket(ws: WSLike): Promise<void>;\n toAsyncIterable(): AsyncIterable<StreamEvent>;\n} {\n // We need to tee the generator for multiple consumers\n // For simplicity, each consumer gets the same generator (use one at a time)\n return {\n toSSE: () => streamToSSE(generator),\n toWebSocket: (ws: WSLike) => relayToWebSocket(generator, ws),\n toAsyncIterable: () => ({ [Symbol.asyncIterator]: () => generator }),\n };\n}\n","// ──────────────────────────────────────────────────────\n// ADK API Key — Generation, parsing, validation\n// ──────────────────────────────────────────────────────\n\nimport { createHash, randomBytes } from \"node:crypto\";\n\nconst KEY_PREFIX_LIVE = \"aiz_live_\";\nconst KEY_PREFIX_TEST = \"aiz_test_\";\nconst KEY_LENGTH = 32; // 32 random bytes = 64 hex chars\n\n/** Generate a new API key */\nexport function generateApiKey(type: \"live\" | \"test\" = \"live\"): {\n key: string;\n hash: string;\n prefix: string;\n} {\n const prefix = type === \"live\" ? KEY_PREFIX_LIVE : KEY_PREFIX_TEST;\n const randomPart = randomBytes(KEY_LENGTH).toString(\"hex\");\n const key = `${prefix}${randomPart}`;\n const hash = hashApiKey(key);\n\n return { key, hash, prefix };\n}\n\n/** Hash an API key (for storage — never store the raw key) */\nexport function hashApiKey(key: string): string {\n return createHash(\"sha256\").update(key).digest(\"hex\");\n}\n\n/** Parse an API key into its parts */\nexport function parseApiKey(key: string): {\n type: \"live\" | \"test\";\n prefix: string;\n hash: string;\n} | null {\n if (key.startsWith(KEY_PREFIX_LIVE)) {\n return { type: \"live\", prefix: KEY_PREFIX_LIVE, hash: hashApiKey(key) };\n }\n if (key.startsWith(KEY_PREFIX_TEST)) {\n return { type: \"test\", prefix: KEY_PREFIX_TEST, hash: hashApiKey(key) };\n }\n return null;\n}\n\n/** Validate API key format */\nexport function validateApiKeyFormat(key: string): boolean {\n if (!key.startsWith(KEY_PREFIX_LIVE) && !key.startsWith(KEY_PREFIX_TEST)) {\n return false;\n }\n const prefix = key.startsWith(KEY_PREFIX_LIVE) ? KEY_PREFIX_LIVE : KEY_PREFIX_TEST;\n const randomPart = key.slice(prefix.length);\n // Should be exactly 64 hex characters\n return /^[a-f0-9]{64}$/.test(randomPart);\n}\n","// ──────────────────────────────────────────────────────\n// ADK Proxy Router — Resolve AIZona key → provider credentials\n// ──────────────────────────────────────────────────────\n\nexport interface ADKApiKey {\n id: string;\n keyHash: string;\n type: \"live\" | \"test\";\n permissions: string[];\n active: boolean;\n ownerId: string;\n}\n\n/** Proxy router: resolves an ADK API key to underlying provider credentials */\nexport class ProxyRouter {\n private providerCredentials: Map<string, string>;\n\n constructor(providerCredentials: Map<string, string>) {\n this.providerCredentials = providerCredentials;\n }\n\n /**\n * Resolve a validated API key to provider credentials.\n * Returns the provider's API key and optional base URL.\n */\n resolve(_apiKey: ADKApiKey, providerId: string): { apiKey: string; baseUrl?: string } | null {\n const credential = this.providerCredentials.get(providerId);\n if (!credential) return null;\n return { apiKey: credential };\n }\n\n /** Check if a provider has credentials configured */\n hasProvider(providerId: string): boolean {\n return this.providerCredentials.has(providerId);\n }\n\n /** Get all configured provider IDs */\n getConfiguredProviders(): string[] {\n return Array.from(this.providerCredentials.keys());\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Session Backend — In-Memory (default standalone)\n// ──────────────────────────────────────────────────────\n\nimport { randomBytes } from \"node:crypto\";\nimport type { ChatMessage } from \"../types/llm\";\nimport type {\n Session,\n SessionBackend,\n SessionCreateOptions,\n SessionListFilter,\n SessionUpdateOptions,\n} from \"../types/session\";\n\nexport class MemorySessionBackend implements SessionBackend {\n private sessions = new Map<string, Session>();\n\n async create(options: SessionCreateOptions): Promise<Session> {\n const id = `session-${randomBytes(8).toString(\"hex\")}`;\n const session: Session = {\n id,\n agentName: options.agentName,\n messages: [],\n metadata: options.metadata ?? {},\n status: \"active\",\n createdAt: new Date(),\n updatedAt: new Date(),\n expiresAt: options.expiresAt,\n };\n this.sessions.set(id, session);\n return { ...session };\n }\n\n async get(sessionId: string): Promise<Session | null> {\n const session = this.sessions.get(sessionId);\n if (!session) return null;\n\n // Check expiry\n if (session.expiresAt && new Date() > session.expiresAt) {\n session.status = \"expired\";\n }\n\n return { ...session, messages: [...session.messages] };\n }\n\n async update(sessionId: string, options: SessionUpdateOptions): Promise<Session> {\n const session = this.sessions.get(sessionId);\n if (!session) throw new Error(`Session \"${sessionId}\" not found`);\n\n if (options.messages) session.messages = [...options.messages];\n if (options.metadata) session.metadata = { ...session.metadata, ...options.metadata };\n if (options.status) session.status = options.status;\n session.updatedAt = new Date();\n\n return { ...session, messages: [...session.messages] };\n }\n\n async appendMessages(sessionId: string, messages: ChatMessage[]): Promise<Session> {\n const session = this.sessions.get(sessionId);\n if (!session) throw new Error(`Session \"${sessionId}\" not found`);\n\n session.messages.push(...messages);\n session.updatedAt = new Date();\n\n return { ...session, messages: [...session.messages] };\n }\n\n async fork(sessionId: string): Promise<Session> {\n const original = this.sessions.get(sessionId);\n if (!original) throw new Error(`Session \"${sessionId}\" not found`);\n\n const id = `session-${randomBytes(8).toString(\"hex\")}`;\n const forked: Session = {\n id,\n agentName: original.agentName,\n messages: [...original.messages],\n metadata: { ...original.metadata },\n status: \"active\",\n parentId: sessionId,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n this.sessions.set(id, forked);\n return { ...forked };\n }\n\n async delete(sessionId: string): Promise<void> {\n this.sessions.delete(sessionId);\n }\n\n async list(filter?: SessionListFilter): Promise<Session[]> {\n let sessions = Array.from(this.sessions.values());\n\n if (filter?.agentName) {\n sessions = sessions.filter((s) => s.agentName === filter.agentName);\n }\n if (filter?.status) {\n sessions = sessions.filter((s) => s.status === filter.status);\n }\n\n // Sort by updatedAt descending\n sessions.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n\n if (filter?.offset) {\n sessions = sessions.slice(filter.offset);\n }\n if (filter?.limit) {\n sessions = sessions.slice(0, filter.limit);\n }\n\n return sessions.map((s) => ({ ...s, messages: [...s.messages] }));\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Session Backend — Prisma (persistent storage)\n// ──────────────────────────────────────────────────────\n// Implements SessionBackend using the AgentSession Prisma model.\n// PrismaClient is injected via constructor to avoid hard dependency.\n// ──────────────────────────────────────────────────────\n\nimport type { ChatMessage } from \"../types/llm\";\nimport type {\n Session,\n SessionBackend,\n SessionCreateOptions,\n SessionListFilter,\n SessionUpdateOptions,\n} from \"../types/session\";\n\nexport class PrismaSessionBackend implements SessionBackend {\n // biome-ignore lint/suspicious/noExplicitAny: PrismaClient injected — no @aizona/db hard dep\n private db: any;\n\n constructor(db: unknown) {\n this.db = db;\n }\n\n async create(options: SessionCreateOptions): Promise<Session> {\n const record = await this.db.agentSession.create({\n data: {\n agentName: options.agentName,\n messages: JSON.stringify([]),\n metadata: JSON.stringify(options.metadata ?? {}),\n status: \"active\",\n messageCount: 0,\n tokenCount: 0,\n expiresAt: options.expiresAt ?? null,\n },\n });\n return this.toSession(record);\n }\n\n async get(sessionId: string): Promise<Session | null> {\n const record = await this.db.agentSession.findUnique({\n where: { id: sessionId },\n });\n if (!record) return null;\n\n // Check expiry — mark as expired if past expiresAt\n if (record.expiresAt && new Date(record.expiresAt) < new Date()) {\n await this.db.agentSession.update({\n where: { id: sessionId },\n data: { status: \"expired\" },\n });\n return null;\n }\n\n return this.toSession(record);\n }\n\n async update(sessionId: string, options: SessionUpdateOptions): Promise<Session> {\n const data: Record<string, unknown> = { updatedAt: new Date() };\n if (options.messages) {\n data.messages = JSON.stringify(options.messages);\n data.messageCount = options.messages.length;\n }\n if (options.metadata) data.metadata = JSON.stringify(options.metadata);\n if (options.status) data.status = options.status;\n\n const record = await this.db.agentSession.update({\n where: { id: sessionId },\n data,\n });\n return this.toSession(record);\n }\n\n async appendMessages(sessionId: string, messages: ChatMessage[]): Promise<Session> {\n const existing = await this.db.agentSession.findUnique({\n where: { id: sessionId },\n });\n if (!existing) throw new Error(`Session \"${sessionId}\" not found`);\n\n const currentMessages = this.parseJson(existing.messages, []);\n const updated = [...currentMessages, ...messages];\n\n const record = await this.db.agentSession.update({\n where: { id: sessionId },\n data: {\n messages: JSON.stringify(updated),\n messageCount: updated.length,\n updatedAt: new Date(),\n },\n });\n return this.toSession(record);\n }\n\n async fork(sessionId: string): Promise<Session> {\n const parent = await this.get(sessionId);\n if (!parent) throw new Error(`Session \"${sessionId}\" not found`);\n\n const record = await this.db.agentSession.create({\n data: {\n agentName: parent.agentName,\n messages: JSON.stringify(parent.messages),\n metadata: JSON.stringify(parent.metadata),\n status: \"active\",\n parentId: sessionId,\n messageCount: parent.messages?.length ?? 0,\n tokenCount: 0,\n },\n });\n return this.toSession(record);\n }\n\n async delete(sessionId: string): Promise<void> {\n await this.db.agentSession.delete({ where: { id: sessionId } });\n }\n\n async list(filter?: SessionListFilter): Promise<Session[]> {\n const where: Record<string, unknown> = {};\n if (filter?.agentName) where.agentName = filter.agentName;\n if (filter?.status) where.status = filter.status;\n\n const records = await this.db.agentSession.findMany({\n where,\n orderBy: { updatedAt: \"desc\" },\n take: filter?.limit ?? 50,\n skip: filter?.offset ?? 0,\n });\n // biome-ignore lint/suspicious/noExplicitAny: Prisma record type varies\n return records.map((r: any) => this.toSession(r));\n }\n\n /** Convert a Prisma record to Session interface */\n // biome-ignore lint/suspicious/noExplicitAny: Prisma record shape\n private toSession(record: any): Session {\n return {\n id: record.id,\n agentName: record.agentName,\n messages: this.parseJson(record.messages, []),\n metadata: this.parseJson(record.metadata, {}),\n status: record.status,\n parentId: record.parentId ?? undefined,\n createdAt: new Date(record.createdAt),\n updatedAt: new Date(record.updatedAt),\n expiresAt: record.expiresAt ? new Date(record.expiresAt) : undefined,\n };\n }\n\n /** Safely parse JSON — handles both string and pre-parsed values */\n private parseJson<T>(value: unknown, fallback: T): T {\n if (value === null || value === undefined) return fallback;\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n }\n return value as T;\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Session Compaction — Message list truncation\n// ──────────────────────────────────────────────────────\n// Compact message history to keep sessions within limits.\n// Two strategies: \"truncate\" (keep recent) or \"summarize\"\n// (placeholder for future LLM-powered summarization).\n// ──────────────────────────────────────────────────────\n\nimport type { ChatMessage } from \"../types/llm\";\n\nexport interface CompactionOptions {\n /** Maximum number of messages to retain */\n maxMessages: number;\n /** Compaction strategy — truncate keeps most recent messages */\n strategy: \"truncate\" | \"summarize\";\n /** Whether to always preserve the system message(s) at the start */\n keepSystemMessage: boolean;\n}\n\nconst DEFAULT_OPTIONS: CompactionOptions = {\n maxMessages: 100,\n strategy: \"truncate\",\n keepSystemMessage: true,\n};\n\n/**\n * Compact a message array to fit within maxMessages.\n *\n * With strategy=\"truncate\", system messages are preserved at the front\n * and the most recent non-system messages are kept.\n *\n * With strategy=\"summarize\", falls back to truncate for now (future:\n * will insert an LLM-generated summary of trimmed messages).\n */\nexport function compactMessages(\n messages: ChatMessage[],\n options: Partial<CompactionOptions> = {},\n): ChatMessage[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n if (messages.length <= opts.maxMessages) return messages;\n\n // Separate system messages from conversation messages\n const systemMessages = opts.keepSystemMessage ? messages.filter((m) => m.role === \"system\") : [];\n const nonSystem = messages.filter((m) => m.role !== \"system\");\n\n // Calculate how many non-system messages we can keep\n const keepCount = Math.max(0, opts.maxMessages - systemMessages.length);\n const kept = nonSystem.slice(-keepCount); // Keep most recent\n\n return [...systemMessages, ...kept];\n}\n","// ──────────────────────────────────────────────────────\n// Agentic Memory — Persistent key-value store for agents\n// ──────────────────────────────────────────────────────\n\n/** Backend interface for pluggable persistence */\nexport interface AgenticMemoryBackend {\n get(key: string): Promise<string | undefined>;\n set(key: string, value: string): Promise<void>;\n delete(key: string): Promise<boolean>;\n list(prefix?: string): Promise<string[]>;\n}\n\n/** In-memory backend (default) */\nexport class InMemoryBackend implements AgenticMemoryBackend {\n private store = new Map<string, string>();\n\n async get(key: string): Promise<string | undefined> {\n return this.store.get(key);\n }\n\n async set(key: string, value: string): Promise<void> {\n this.store.set(key, value);\n }\n\n async delete(key: string): Promise<boolean> {\n return this.store.delete(key);\n }\n\n async list(prefix?: string): Promise<string[]> {\n const keys = Array.from(this.store.keys());\n if (prefix) return keys.filter((k) => k.startsWith(prefix));\n return keys;\n }\n}\n\n/**\n * AgenticMemory — simple persistent key-value store for agents.\n * Persists state across run calls when the same store instance is reused.\n */\nexport class AgenticMemory {\n private backend: AgenticMemoryBackend;\n\n constructor(backend?: AgenticMemoryBackend) {\n this.backend = backend ?? new InMemoryBackend();\n }\n\n async get(key: string): Promise<string | undefined> {\n return this.backend.get(key);\n }\n\n async set(key: string, value: string): Promise<void> {\n return this.backend.set(key, value);\n }\n\n async delete(key: string): Promise<boolean> {\n return this.backend.delete(key);\n }\n\n async search(prefix: string): Promise<Array<{ key: string; value: string }>> {\n const keys = await this.backend.list(prefix);\n const results: Array<{ key: string; value: string }> = [];\n for (const key of keys) {\n const value = await this.backend.get(key);\n if (value !== undefined) {\n results.push({ key, value });\n }\n }\n return results;\n }\n\n async list(): Promise<string[]> {\n return this.backend.list();\n }\n}\n","// ──────────────────────────────────────────────────────\n// Built-in memory tools — persistent key-value for agents\n// ──────────────────────────────────────────────────────\n\nimport type { AgenticMemory } from \"../../sessions/agentic-memory\";\nimport type { ToolContext, ToolDef } from \"../../types/tool\";\n\nexport function createMemoryWriteTool(\n memory: AgenticMemory,\n): ToolDef<{ key: string; value: string }> {\n return {\n name: \"memory_write\",\n description:\n \"Write a value to persistent memory. Use this to remember information across sessions.\",\n inputSchema: {\n type: \"object\",\n properties: {\n key: { type: \"string\", description: \"Memory key\" },\n value: { type: \"string\", description: \"Value to store\" },\n },\n required: [\"key\", \"value\"],\n },\n execute: async (input: { key: string; value: string }, _ctx: ToolContext) => {\n await memory.set(input.key, input.value);\n return { written: true, key: input.key };\n },\n };\n}\n\nexport function createMemoryReadTool(memory: AgenticMemory): ToolDef<{ key: string }> {\n return {\n name: \"memory_read\",\n description: \"Read a value from persistent memory by key.\",\n inputSchema: {\n type: \"object\",\n properties: {\n key: { type: \"string\", description: \"Memory key to read\" },\n },\n required: [\"key\"],\n },\n execute: async (input: { key: string }, _ctx: ToolContext) => {\n const value = await memory.get(input.key);\n return { key: input.key, value: value ?? null, found: value !== undefined };\n },\n };\n}\n\nexport function createMemorySearchTool(memory: AgenticMemory): ToolDef<{ prefix: string }> {\n return {\n name: \"memory_search\",\n description: \"Search persistent memory by key prefix. Returns all matching key-value pairs.\",\n inputSchema: {\n type: \"object\",\n properties: {\n prefix: { type: \"string\", description: \"Key prefix to search\" },\n },\n required: [\"prefix\"],\n },\n execute: async (input: { prefix: string }, _ctx: ToolContext) => {\n const results = await memory.search(input.prefix);\n return { results, count: results.length };\n },\n };\n}\n","// ──────────────────────────────────────────────────────\n// ADK Tracing — Span\n// ──────────────────────────────────────────────────────\n\nexport type SpanType = \"agent\" | \"llm\" | \"tool\" | \"guardrail\" | \"handoff\" | \"session\" | \"pipeline\";\n\nexport interface SpanEvent {\n name: string;\n timestamp: number;\n data?: Record<string, unknown>;\n}\n\nexport interface SpanData {\n id: string;\n traceId: string;\n parentSpanId?: string;\n name: string;\n type: SpanType;\n startTime: number;\n endTime?: number;\n durationMs?: number;\n attributes: Record<string, unknown>;\n events: SpanEvent[];\n status: \"ok\" | \"error\";\n error?: string;\n}\n\nlet spanCounter = 0;\n\nexport class Span {\n readonly id: string;\n readonly traceId: string;\n readonly parentSpanId?: string;\n readonly name: string;\n readonly type: SpanType;\n readonly startTime: number;\n private _endTime?: number;\n private _attributes: Record<string, unknown> = {};\n private _events: SpanEvent[] = [];\n private _status: \"ok\" | \"error\" = \"ok\";\n private _error?: string;\n\n constructor(traceId: string, name: string, type: SpanType, parentSpanId?: string) {\n this.id = `span-${++spanCounter}-${Date.now()}`;\n this.traceId = traceId;\n this.parentSpanId = parentSpanId;\n this.name = name;\n this.type = type;\n this.startTime = Date.now();\n }\n\n setAttributes(attrs: Record<string, unknown>): void {\n Object.assign(this._attributes, attrs);\n }\n\n setAttribute(key: string, value: unknown): void {\n this._attributes[key] = value;\n }\n\n addEvent(name: string, data?: Record<string, unknown>): void {\n this._events.push({ name, timestamp: Date.now(), data });\n }\n\n setError(error: string): void {\n this._status = \"error\";\n this._error = error;\n }\n\n end(): void {\n this._endTime = Date.now();\n }\n\n get durationMs(): number | undefined {\n return this._endTime ? this._endTime - this.startTime : undefined;\n }\n\n toJSON(): SpanData {\n return {\n id: this.id,\n traceId: this.traceId,\n parentSpanId: this.parentSpanId,\n name: this.name,\n type: this.type,\n startTime: this.startTime,\n endTime: this._endTime,\n durationMs: this.durationMs,\n attributes: { ...this._attributes },\n events: [...this._events],\n status: this._status,\n error: this._error,\n };\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Tracing — Tracer + Trace\n// ──────────────────────────────────────────────────────\n\nimport { Span, type SpanData, type SpanType } from \"./span\";\n\nexport interface TraceData {\n id: string;\n name: string;\n startTime: number;\n endTime?: number;\n durationMs?: number;\n spans: SpanData[];\n metadata: Record<string, unknown>;\n}\n\nexport interface TraceExporter {\n export(trace: TraceData): Promise<void>;\n}\n\nlet traceCounter = 0;\n\nexport class Trace {\n readonly id: string;\n readonly name: string;\n readonly startTime: number;\n private _endTime?: number;\n private _spans: Span[] = [];\n private _metadata: Record<string, unknown> = {};\n\n constructor(name: string, metadata?: Record<string, unknown>) {\n this.id = `trace-${++traceCounter}-${Date.now()}`;\n this.name = name;\n this.startTime = Date.now();\n if (metadata) this._metadata = { ...metadata };\n }\n\n startSpan(name: string, type: SpanType, parentSpanId?: string): Span {\n const span = new Span(this.id, name, type, parentSpanId);\n this._spans.push(span);\n return span;\n }\n\n setMetadata(key: string, value: unknown): void {\n this._metadata[key] = value;\n }\n\n end(): void {\n this._endTime = Date.now();\n // End any unclosed spans\n for (const span of this._spans) {\n if (!span.durationMs) span.end();\n }\n }\n\n get durationMs(): number | undefined {\n return this._endTime ? this._endTime - this.startTime : undefined;\n }\n\n get spans(): Span[] {\n return [...this._spans];\n }\n\n toJSON(): TraceData {\n return {\n id: this.id,\n name: this.name,\n startTime: this.startTime,\n endTime: this._endTime,\n durationMs: this.durationMs,\n spans: this._spans.map((s) => s.toJSON()),\n metadata: { ...this._metadata },\n };\n }\n}\n\nexport class Tracer {\n private exporters: TraceExporter[] = [];\n private traces: Trace[] = [];\n\n addExporter(exporter: TraceExporter): void {\n this.exporters.push(exporter);\n }\n\n startTrace(name: string, metadata?: Record<string, unknown>): Trace {\n const trace = new Trace(name, metadata);\n this.traces.push(trace);\n return trace;\n }\n\n async endAndExport(trace: Trace): Promise<void> {\n trace.end();\n const data = trace.toJSON();\n await Promise.all(this.exporters.map((e) => e.export(data)));\n }\n\n getTraces(): Trace[] {\n return [...this.traces];\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Tracing — Console Exporter\n// ──────────────────────────────────────────────────────\n\nimport type { TraceData, TraceExporter } from \"../tracer\";\n\nexport class ConsoleExporter implements TraceExporter {\n async export(trace: TraceData): Promise<void> {\n console.log(`[ADK Trace] ${trace.name} (${trace.id})`);\n console.log(` Duration: ${trace.durationMs ?? \"?\"}ms`);\n console.log(` Spans: ${trace.spans.length}`);\n for (const span of trace.spans) {\n const status = span.status === \"error\" ? \" [ERROR]\" : \"\";\n console.log(` [${span.type}] ${span.name}: ${span.durationMs ?? \"?\"}ms${status}`);\n }\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Tracing — EventBus Exporter\n// ──────────────────────────────────────────────────────\n\nimport type { ADKEventBus } from \"../../events/event-bus\";\nimport type { TraceData, TraceExporter } from \"../tracer\";\n\nexport class EventBusExporter implements TraceExporter {\n constructor(private eventBus: ADKEventBus) {}\n\n async export(trace: TraceData): Promise<void> {\n // Emit as agent.log events for platform observability\n this.eventBus.emit(\"agent.log\", {\n agentSlug: (trace.metadata.agentName as string) ?? \"adk\",\n level: \"info\",\n message: `Trace completed: ${trace.name} (${trace.spans.length} spans, ${trace.durationMs}ms)`,\n metadata: {\n traceId: trace.id,\n spans: trace.spans.length,\n durationMs: trace.durationMs,\n },\n timestamp: Date.now(),\n });\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Tracing — Langfuse Exporter (placeholder)\n// ──────────────────────────────────────────────────────\n// Sends traces to Langfuse for observability\n// Requires langfuse SDK to be installed by the user\n\nimport type { TraceData, TraceExporter } from \"../tracer\";\n\nexport interface LangfuseConfig {\n publicKey: string;\n secretKey: string;\n baseUrl?: string;\n}\n\nexport class LangfuseExporter implements TraceExporter {\n private config: LangfuseConfig;\n\n constructor(config: LangfuseConfig) {\n this.config = config;\n }\n\n async export(trace: TraceData): Promise<void> {\n // POST to Langfuse API\n const url = `${this.config.baseUrl ?? \"https://cloud.langfuse.com\"}/api/public/ingestion`;\n\n const events = trace.spans.map((span) => ({\n type: span.type === \"llm\" ? \"generation\" : \"span\",\n body: {\n traceId: trace.id,\n id: span.id,\n parentObservationId: span.parentSpanId,\n name: span.name,\n startTime: new Date(span.startTime).toISOString(),\n endTime: span.endTime ? new Date(span.endTime).toISOString() : undefined,\n metadata: span.attributes,\n level: span.status === \"error\" ? \"ERROR\" : \"DEFAULT\",\n statusMessage: span.error,\n },\n }));\n\n try {\n await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${btoa(`${this.config.publicKey}:${this.config.secretKey}`)}`,\n },\n body: JSON.stringify({ batch: events }),\n });\n } catch {\n // Non-critical — don't break the application\n }\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Handoff Manager\n// ──────────────────────────────────────────────────────\n// Manages agent-to-agent handoffs (OpenAI Swarm pattern)\n// Injects synthetic `transfer_to_{name}` tools.\n// ──────────────────────────────────────────────────────\n\nimport type { Agent } from \"../agent/define-agent\";\nimport type { HandoffTarget } from \"../types/agent\";\nimport type { LLMToolDefinition } from \"../types/llm\";\nimport type { RunContext } from \"../types/runner\";\nimport type { ToolContext, ToolDef } from \"../types/tool\";\n\nexport const HANDOFF_PREFIX = \"transfer_to_\";\n\n/** Record of a handoff registration */\ninterface HandoffRegistration {\n from: Agent;\n to: Agent;\n description: string;\n filter?: (ctx: RunContext) => boolean | Promise<boolean>;\n}\n\n/** Manages handoff registrations and tool generation */\nexport class HandoffManager {\n private registrations: HandoffRegistration[] = [];\n private circularGuard = new Set<string>();\n\n /** Register a handoff from one agent to another */\n registerHandoff(\n from: Agent,\n to: Agent,\n description: string,\n filter?: (ctx: RunContext) => boolean | Promise<boolean>,\n ): void {\n // Prevent duplicate registrations\n const existing = this.registrations.find(\n (r) => r.from.name === from.name && r.to.name === to.name,\n );\n if (existing) return;\n\n this.registrations.push({ from, to, description, filter });\n }\n\n /** Auto-register handoffs from an agent's config.handoffs */\n registerFromConfig(agent: Agent, agentMap: Map<string, Agent>): void {\n for (const handoff of agent.getHandoffs()) {\n const targetName = typeof handoff.agent === \"string\" ? handoff.agent : handoff.agent.name;\n const targetAgent = agentMap.get(targetName);\n if (targetAgent) {\n this.registerHandoff(agent, targetAgent, handoff.description, handoff.filter);\n }\n }\n }\n\n /** Get handoff tools for a given agent (as ToolDefs) */\n getHandoffTools(agent: Agent): ToolDef[] {\n const handoffs = this.getHandoffsForAgent(agent);\n return handoffs.map((h) => ({\n name: `${HANDOFF_PREFIX}${h.to.name}`,\n description: h.description,\n inputSchema: {\n type: \"object\",\n properties: {\n reason: {\n type: \"string\",\n description: \"Reason for the handoff\",\n },\n },\n },\n execute: async (_input: unknown, _ctx: ToolContext) => {\n // Handoffs are intercepted by the runner/turn-executor before execute() is called.\n // This is a fallback that should not normally be reached.\n return { handoff: true, target: h.to.name };\n },\n }));\n }\n\n /** Get handoff LLMToolDefinitions for a given agent */\n getHandoffToolDefs(agent: Agent): LLMToolDefinition[] {\n const handoffs = this.getHandoffsForAgent(agent);\n return handoffs.map((h) => ({\n name: `${HANDOFF_PREFIX}${h.to.name}`,\n description: h.description,\n inputSchema: {\n type: \"object\",\n properties: {\n reason: {\n type: \"string\",\n description: \"Reason for the handoff\",\n },\n },\n },\n }));\n }\n\n /** Execute a handoff (validates, checks circular, emits) */\n async executeHandoff(from: Agent, to: Agent, ctx: RunContext, reason: string): Promise<void> {\n // Circular handoff prevention\n const key = `${ctx.runId}:${from.name}->${to.name}@${ctx.turnNumber}`;\n if (this.circularGuard.has(key)) {\n throw new Error(\n `Circular handoff detected: ${from.name} → ${to.name} (turn ${ctx.turnNumber})`,\n );\n }\n this.circularGuard.add(key);\n\n // Validate registration exists\n const reg = this.registrations.find((r) => r.from.name === from.name && r.to.name === to.name);\n if (!reg) {\n throw new Error(`No handoff registered from \"${from.name}\" to \"${to.name}\"`);\n }\n\n // Run filter\n if (reg.filter) {\n const allowed = await reg.filter(ctx);\n if (!allowed) {\n throw new Error(`Handoff from \"${from.name}\" to \"${to.name}\" blocked by filter`);\n }\n }\n }\n\n /** Get all registered handoffs for a given agent */\n getHandoffsForAgent(agent: Agent): HandoffRegistration[] {\n return this.registrations.filter((r) => r.from.name === agent.name);\n }\n\n /** Reset circular guard (call between runs) */\n resetCircularGuard(): void {\n this.circularGuard.clear();\n }\n\n /** Clear all registrations */\n clear(): void {\n this.registrations = [];\n this.circularGuard.clear();\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Agent-as-Tool — Wrap an Agent as a callable ToolDef\n// ──────────────────────────────────────────────────────\n\nimport type { Agent } from \"../agent/define-agent\";\nimport { Runner } from \"../runner/runner\";\nimport type { ADKLLMProvider } from \"../types/llm\";\nimport type { RunConfig } from \"../types/runner\";\nimport type { ToolContext, ToolDef } from \"../types/tool\";\n\nexport interface AgentAsToolConfig {\n /** Custom tool name (defaults to agent name) */\n name?: string;\n /** Custom description (defaults to agent description or instructions summary) */\n description?: string;\n /** Provider to use for the inner run */\n provider?: ADKLLMProvider;\n /** Max turns for the inner run */\n maxTurns?: number;\n /** Whether to return full RunResult or just output text */\n fullResult?: boolean;\n}\n\n/**\n * Wrap an Agent as a ToolDef. When another agent calls this tool,\n * it runs the wrapped agent as a sub-agent and returns the output.\n */\nexport function agentAsTool(agent: Agent, config?: AgentAsToolConfig): ToolDef {\n const toolName = config?.name ?? agent.name;\n const description =\n config?.description ?? agent.config.description ?? `Delegate to ${agent.name} agent`;\n\n return {\n name: toolName,\n description,\n inputSchema: {\n type: \"object\",\n properties: {\n input: {\n type: \"string\",\n description: \"The task or question to delegate to this agent\",\n },\n },\n required: [\"input\"],\n },\n execute: async (rawInput: unknown, ctx: ToolContext) => {\n const input = rawInput as { input: string };\n\n if (!config?.provider) {\n return {\n error: `No provider configured for agent-as-tool \"${toolName}\". Pass provider in config.`,\n };\n }\n\n const runner = new Runner({ provider: config.provider });\n\n const runConfig: RunConfig = {\n input: input.input,\n maxTurns: config?.maxTurns ?? 10,\n signal: ctx.runContext.signal,\n metadata: {\n parentRunId: ctx.runContext.runId,\n parentAgent: ctx.agentName,\n },\n };\n\n const result = await runner.run(agent, runConfig);\n\n if (config?.fullResult) {\n return result;\n }\n\n return result.output;\n },\n };\n}\n","// ──────────────────────────────────────────────────────\n// ADK Parallel Runner — Concurrent agent execution\n// ──────────────────────────────────────────────────────\n\nimport type { Agent } from \"../agent/define-agent\";\nimport { Runner } from \"../runner/runner\";\nimport type { ADKLLMProvider } from \"../types/llm\";\nimport type { RunConfig, RunResult } from \"../types/runner\";\n\nexport interface ParallelRunnerConfig {\n /** LLM provider to use */\n provider: ADKLLMProvider;\n}\n\nexport class ParallelRunner {\n private provider: ADKLLMProvider;\n\n constructor(config: ParallelRunnerConfig) {\n this.provider = config.provider;\n }\n\n /**\n * Run all agents concurrently. Returns all results.\n * All agents receive the same input.\n */\n async runAll(agents: Agent[], input: RunConfig): Promise<RunResult[]> {\n const promises = agents.map((agent) => {\n const runner = new Runner({ provider: this.provider });\n return runner.run(agent, input);\n });\n\n return Promise.all(promises);\n }\n\n /**\n * Race agents. Returns the first result that completes.\n * Other runs are aborted.\n */\n async race(agents: Agent[], input: RunConfig): Promise<RunResult> {\n const controller = new AbortController();\n\n const promises = agents.map((agent) => {\n const runner = new Runner({ provider: this.provider });\n return runner.run(agent, {\n ...input,\n signal: controller.signal,\n });\n });\n\n try {\n const result = await Promise.race(promises);\n controller.abort();\n return result;\n } catch (error) {\n controller.abort();\n throw error;\n }\n }\n\n /**\n * Run agents in pipeline — output of one becomes input of the next.\n * The first agent gets the original input; subsequent agents get the\n * previous agent's output as their input.\n */\n async pipeline(agents: Agent[], input: RunConfig): Promise<RunResult> {\n if (agents.length === 0) {\n throw new Error(\"Pipeline requires at least one agent\");\n }\n\n let currentInput = input;\n let lastResult: RunResult | undefined;\n\n for (const agent of agents) {\n const runner = new Runner({ provider: this.provider });\n lastResult = await runner.run(agent, currentInput);\n\n // Feed output of this agent as input to the next\n currentInput = {\n ...input,\n input: lastResult.output,\n messages: lastResult.messages,\n };\n }\n\n return lastResult!;\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Team — Coordinator-based multi-agent orchestration\n// ──────────────────────────────────────────────────────\n// Extracted from @aizona/platform-agents/orchestrator/team-coordinator.ts\n// Generalized — no DB dependency, no platform-specific types.\n// ──────────────────────────────────────────────────────\n\nimport type { Agent } from \"../agent/define-agent\";\nimport type { ADKEventBus } from \"../events/event-bus\";\nimport { Runner } from \"../runner/runner\";\nimport type { ADKLLMProvider } from \"../types/llm\";\nimport type { RunConfig, RunResult, StreamEvent } from \"../types/runner\";\nimport { agentAsTool } from \"./agent-tool\";\n\n/** Team consensus types */\nexport type ConsensusType = \"coordinator_decides\" | \"majority\" | \"unanimous\" | \"weighted\";\n\n/** Team configuration */\nexport interface TeamConfig {\n /** Team name */\n name: string;\n /** Coordinator agent — orchestrates the team */\n coordinator: Agent;\n /** Team member agents */\n members: Agent[];\n /** How decisions are made */\n consensusType?: ConsensusType;\n /** Maximum coordination rounds */\n maxRounds?: number;\n /** LLM provider */\n provider: ADKLLMProvider;\n /** Event bus (optional) */\n eventBus?: ADKEventBus;\n}\n\n/** Team execution result */\nexport interface TeamResult extends RunResult {\n /** Individual member results */\n memberResults: { agentName: string; result: RunResult }[];\n /** Number of coordination rounds */\n rounds: number;\n}\n\nexport class Team {\n private config: TeamConfig;\n\n constructor(config: TeamConfig) {\n if (!config.coordinator) {\n throw new Error(\"Team requires a coordinator agent\");\n }\n if (!config.members || config.members.length === 0) {\n throw new Error(\"Team requires at least one member\");\n }\n this.config = config;\n }\n\n /** Run the team: coordinator delegates to members, aggregates results */\n async run(input: RunConfig): Promise<TeamResult> {\n const {\n coordinator,\n members,\n provider,\n maxRounds = 3,\n consensusType = \"coordinator_decides\",\n eventBus,\n } = this.config;\n\n // Wrap each member as a tool for the coordinator\n const memberTools = members.map((member) =>\n agentAsTool(member, {\n provider,\n maxTurns: 10,\n description: member.config.description ?? `Delegate to ${member.name}`,\n }),\n );\n\n // Create a coordinator agent clone with member tools injected\n const coordinatorWithTools = coordinator.clone({\n tools: [...coordinator.getTools(), ...memberTools],\n });\n\n const runner = new Runner({ provider, eventBus });\n\n // Register all agents\n runner.registerAgent(coordinatorWithTools);\n for (const m of members) {\n runner.registerAgent(m);\n }\n\n // Run coordinator — it will call member tools as needed\n const result = await runner.run(coordinatorWithTools, {\n ...input,\n maxTurns: maxRounds * (members.length + 1),\n });\n\n // Collect member results from tool calls in the message history\n const memberResults: { agentName: string; result: RunResult }[] = [];\n\n // In coordinator_decides mode, the coordinator's final output is the answer\n // For other consensus types, we would need separate logic\n if (consensusType !== \"coordinator_decides\") {\n // For majority/unanimous/weighted, run all members independently\n const independentResults = await Promise.all(\n members.map(async (member) => {\n const memberRunner = new Runner({ provider });\n const memberResult = await memberRunner.run(member, input);\n return { agentName: member.name, result: memberResult };\n }),\n );\n memberResults.push(...independentResults);\n }\n\n return {\n ...result,\n memberResults,\n rounds: Math.ceil(result.totalTurns / Math.max(members.length, 1)),\n };\n }\n\n /** Stream events from a team run */\n async *stream(input: RunConfig): AsyncGenerator<StreamEvent> {\n const result = await this.run(input);\n yield { type: \"text_delta\", content: result.output, agentName: result.finalAgent };\n yield { type: \"run_complete\", result };\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Pipeline Executor\n// ──────────────────────────────────────────────────────\n// Extracted from @aizona/platform-agents/pipeline/pipeline-executor.ts\n// Generalized — no Prisma, no DB, no platform-specific types.\n// Pipeline: workspace → agent → validate → report\n// ──────────────────────────────────────────────────────\n\nimport type { Agent } from \"../agent/define-agent\";\nimport type { ADKEventBus } from \"../events/event-bus\";\nimport { Runner } from \"../runner/runner\";\nimport type { ADKLLMProvider } from \"../types/llm\";\nimport type { RunConfig, RunResult } from \"../types/runner\";\n\n/** Pipeline task definition */\nexport interface PipelineTask {\n /** Task ID */\n id: string;\n /** Task description / instructions */\n description: string;\n /** File context (paths, diffs, etc.) */\n context?: string;\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Pipeline step type */\nexport type PipelineStepType = \"workspace\" | \"agent\" | \"validate\" | \"report\";\n\n/** Pipeline step result */\nexport interface PipelineStepResult {\n step: PipelineStepType;\n success: boolean;\n output: string;\n durationMs: number;\n error?: string;\n}\n\n/** Full pipeline result */\nexport interface PipelineResult {\n taskId: string;\n success: boolean;\n steps: PipelineStepResult[];\n agentResult?: RunResult;\n totalDurationMs: number;\n output: string;\n}\n\n/** Pipeline configuration */\nexport interface PipelineConfig {\n /** LLM provider */\n provider: ADKLLMProvider;\n /** Event bus (optional) */\n eventBus?: ADKEventBus;\n /** Workspace setup function (optional — returns context string) */\n workspaceSetup?: (task: PipelineTask) => Promise<string>;\n /** Validation function (optional — returns { valid, errors }) */\n validator?: (output: string, task: PipelineTask) => Promise<{ valid: boolean; errors: string[] }>;\n /** Report function (optional — generates report from results) */\n reporter?: (result: PipelineResult) => Promise<string>;\n /** Max agent turns */\n maxTurns?: number;\n}\n\nexport class ADKPipeline {\n private config: PipelineConfig;\n\n constructor(config: PipelineConfig) {\n this.config = config;\n }\n\n /** Execute the full pipeline */\n async execute(agent: Agent, task: PipelineTask): Promise<PipelineResult> {\n const startTime = Date.now();\n const steps: PipelineStepResult[] = [];\n\n let contextFromWorkspace = \"\";\n let agentResult: RunResult | undefined;\n\n // Step 1: Workspace setup\n if (this.config.workspaceSetup) {\n const stepStart = Date.now();\n try {\n contextFromWorkspace = await this.config.workspaceSetup(task);\n steps.push({\n step: \"workspace\",\n success: true,\n output: contextFromWorkspace.slice(0, 200),\n durationMs: Date.now() - stepStart,\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n steps.push({\n step: \"workspace\",\n success: false,\n output: \"\",\n durationMs: Date.now() - stepStart,\n error: msg,\n });\n return {\n taskId: task.id,\n success: false,\n steps,\n totalDurationMs: Date.now() - startTime,\n output: `Workspace setup failed: ${msg}`,\n };\n }\n }\n\n // Step 2: Agent execution\n const agentStepStart = Date.now();\n try {\n const input = this.buildAgentInput(task, contextFromWorkspace);\n const runner = new Runner({\n provider: this.config.provider,\n eventBus: this.config.eventBus,\n });\n\n const runConfig: RunConfig = {\n input,\n maxTurns: this.config.maxTurns ?? 15,\n metadata: { pipelineTaskId: task.id, ...task.metadata },\n };\n\n agentResult = await runner.run(agent, runConfig);\n\n steps.push({\n step: \"agent\",\n success: true,\n output: agentResult.output.slice(0, 500),\n durationMs: Date.now() - agentStepStart,\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n steps.push({\n step: \"agent\",\n success: false,\n output: \"\",\n durationMs: Date.now() - agentStepStart,\n error: msg,\n });\n return {\n taskId: task.id,\n success: false,\n steps,\n totalDurationMs: Date.now() - startTime,\n output: `Agent execution failed: ${msg}`,\n };\n }\n\n // Step 3: Validation\n if (this.config.validator) {\n const validateStart = Date.now();\n try {\n const validation = await this.config.validator(agentResult.output, task);\n steps.push({\n step: \"validate\",\n success: validation.valid,\n output: validation.valid\n ? \"Validation passed\"\n : `Validation failed: ${validation.errors.join(\", \")}`,\n durationMs: Date.now() - validateStart,\n error: validation.valid ? undefined : validation.errors.join(\", \"),\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n steps.push({\n step: \"validate\",\n success: false,\n output: \"\",\n durationMs: Date.now() - validateStart,\n error: msg,\n });\n }\n }\n\n const pipelineResult: PipelineResult = {\n taskId: task.id,\n success: steps.every((s) => s.success),\n steps,\n agentResult,\n totalDurationMs: Date.now() - startTime,\n output: agentResult.output,\n };\n\n // Step 4: Report\n if (this.config.reporter) {\n const reportStart = Date.now();\n try {\n const report = await this.config.reporter(pipelineResult);\n steps.push({\n step: \"report\",\n success: true,\n output: report.slice(0, 500),\n durationMs: Date.now() - reportStart,\n });\n pipelineResult.output = report;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n steps.push({\n step: \"report\",\n success: false,\n output: \"\",\n durationMs: Date.now() - reportStart,\n error: msg,\n });\n }\n }\n\n pipelineResult.totalDurationMs = Date.now() - startTime;\n return pipelineResult;\n }\n\n private buildAgentInput(task: PipelineTask, workspace: string): string {\n const parts: string[] = [];\n parts.push(`Task: ${task.description}`);\n if (task.context) {\n parts.push(`\\nContext:\\n${task.context}`);\n }\n if (workspace) {\n parts.push(`\\nWorkspace:\\n${workspace}`);\n }\n return parts.join(\"\\n\");\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Review Pipeline — Multi-agent code review\n// ──────────────────────────────────────────────────────\n// Extracted from @aizona/platform-agents/pipeline/review-pipeline.ts\n// Generalized — no Prisma, no DB, no platform-specific types.\n// ──────────────────────────────────────────────────────\n\nimport type { Agent } from \"../agent/define-agent\";\nimport type { ADKEventBus } from \"../events/event-bus\";\nimport { Runner } from \"../runner/runner\";\nimport type { ADKLLMProvider } from \"../types/llm\";\nimport type { RunResult } from \"../types/runner\";\n\n/** Review severity levels */\nexport type ReviewSeverity = \"info\" | \"warning\" | \"error\" | \"critical\";\n\n/** Single review comment */\nexport interface ReviewComment {\n file?: string;\n line?: number;\n severity: ReviewSeverity;\n message: string;\n suggestion?: string;\n reviewer: string;\n}\n\n/** Individual reviewer's result */\nexport interface ReviewerResult {\n reviewer: string;\n verdict: \"approve\" | \"request_changes\" | \"comment\";\n comments: ReviewComment[];\n summary: string;\n confidence: number;\n runResult: RunResult;\n}\n\n/** Aggregated review result */\nexport interface ReviewResult {\n verdict: \"approve\" | \"request_changes\" | \"comment\";\n reviewers: ReviewerResult[];\n comments: ReviewComment[];\n summary: string;\n totalDurationMs: number;\n}\n\n/** Review configuration */\nexport interface ReviewConfig {\n /** LLM provider */\n provider: ADKLLMProvider;\n /** Event bus (optional) */\n eventBus?: ADKEventBus;\n /** Approval threshold (fraction of reviewers that must approve: 0.0 - 1.0) */\n approvalThreshold?: number;\n /** Max turns per reviewer */\n maxTurns?: number;\n}\n\nexport class ADKReviewPipeline {\n private config: ReviewConfig;\n\n constructor(config: ReviewConfig) {\n this.config = config;\n }\n\n /** Run a multi-agent code review */\n async review(diff: string, reviewers: Agent[], context?: string): Promise<ReviewResult> {\n if (reviewers.length === 0) {\n throw new Error(\"Review requires at least one reviewer agent\");\n }\n\n const startTime = Date.now();\n const threshold = this.config.approvalThreshold ?? 0.5;\n\n // Run all reviewers in parallel\n const reviewerResults = await Promise.all(\n reviewers.map((reviewer) => this.runReviewer(reviewer, diff, context)),\n );\n\n // Aggregate comments\n const allComments = reviewerResults.flatMap((r) => r.comments);\n\n // Determine aggregate verdict\n const approveCount = reviewerResults.filter((r) => r.verdict === \"approve\").length;\n const approvalRate = approveCount / reviewers.length;\n\n let verdict: ReviewResult[\"verdict\"];\n if (approvalRate >= threshold) {\n verdict = \"approve\";\n } else if (reviewerResults.some((r) => r.verdict === \"request_changes\")) {\n verdict = \"request_changes\";\n } else {\n verdict = \"comment\";\n }\n\n // Build summary\n const summaryParts = reviewerResults.map((r) => `${r.reviewer}: ${r.verdict} — ${r.summary}`);\n\n return {\n verdict,\n reviewers: reviewerResults,\n comments: allComments,\n summary: summaryParts.join(\"\\n\"),\n totalDurationMs: Date.now() - startTime,\n };\n }\n\n private async runReviewer(\n reviewer: Agent,\n diff: string,\n context?: string,\n ): Promise<ReviewerResult> {\n const runner = new Runner({\n provider: this.config.provider,\n eventBus: this.config.eventBus,\n });\n\n const inputParts = [`Please review the following code changes:\\n\\n${diff}`];\n if (context) {\n inputParts.push(`\\nAdditional context:\\n${context}`);\n }\n inputParts.push(\n \"\\nRespond with a JSON object: { verdict, comments: [{ file?, line?, severity, message, suggestion? }], summary, confidence }\",\n );\n\n const runResult = await runner.run(reviewer, {\n input: inputParts.join(\"\\n\"),\n maxTurns: this.config.maxTurns ?? 5,\n });\n\n // Parse reviewer output\n return this.parseReviewerOutput(reviewer.name, runResult);\n }\n\n private parseReviewerOutput(reviewerName: string, runResult: RunResult): ReviewerResult {\n const defaultResult: ReviewerResult = {\n reviewer: reviewerName,\n verdict: \"comment\",\n comments: [],\n summary: runResult.output,\n confidence: 0.5,\n runResult,\n };\n\n // Try to parse JSON from output\n try {\n const jsonMatch = runResult.output.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) return defaultResult;\n\n const parsed = JSON.parse(jsonMatch[0]);\n\n const verdict =\n parsed.verdict === \"approve\" || parsed.verdict === \"request_changes\"\n ? parsed.verdict\n : \"comment\";\n\n const comments: ReviewComment[] = Array.isArray(parsed.comments)\n ? parsed.comments.map((c: Record<string, unknown>) => ({\n file: typeof c.file === \"string\" ? c.file : undefined,\n line: typeof c.line === \"number\" ? c.line : undefined,\n severity: this.parseSeverity(c.severity),\n message: String(c.message ?? \"\"),\n suggestion: typeof c.suggestion === \"string\" ? c.suggestion : undefined,\n reviewer: reviewerName,\n }))\n : [];\n\n return {\n reviewer: reviewerName,\n verdict,\n comments,\n summary: typeof parsed.summary === \"string\" ? parsed.summary : runResult.output,\n confidence: typeof parsed.confidence === \"number\" ? parsed.confidence : 0.5,\n runResult,\n };\n } catch {\n return defaultResult;\n }\n }\n\n private parseSeverity(value: unknown): ReviewSeverity {\n if (value === \"info\" || value === \"warning\" || value === \"error\" || value === \"critical\") {\n return value;\n }\n return \"info\";\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK MCP Tool Adapter\n// ──────────────────────────────────────────────────────\n// Adapts MCP tools into ADK ToolDef[] format.\n// Wraps @aizonaai/mcp-bridge when available, or connects\n// directly to MCP servers via the lightweight connector.\n// ──────────────────────────────────────────────────────\n\nimport type { JsonSchema } from \"../../types/agent\";\nimport type { ToolContext, ToolDef } from \"../../types/tool\";\n\n/** MCP transport type */\nexport type MCPTransport = \"stdio\" | \"sse\" | \"streamable-http\";\n\n/** MCP auth configuration */\nexport interface MCPAuthConfig {\n type: \"bearer\" | \"basic\" | \"api-key\";\n token?: string;\n username?: string;\n password?: string;\n apiKey?: string;\n headerName?: string;\n}\n\n/** MCP server connection config */\nexport interface MCPServerConfig {\n /** Server URL or command (for stdio) */\n serverUrl: string;\n /** Transport type */\n transport: MCPTransport;\n /** Auth config (optional) */\n authConfig?: MCPAuthConfig;\n /** Filter function to select which tools to expose */\n toolFilter?: (tool: MCPToolInfo) => boolean;\n /** Timeout for tool calls in ms */\n timeoutMs?: number;\n /** Specific tool names to load (name-based filter) */\n toolNames?: string[];\n /** Filter by category metadata */\n categories?: string[];\n /** Cap total tools returned */\n maxTools?: number;\n}\n\n/** MCP tool information (from server) */\nexport interface MCPToolInfo {\n name: string;\n description: string;\n inputSchema: JsonSchema;\n /** Optional category metadata */\n category?: string;\n /** Optional tags */\n tags?: string[];\n}\n\n/** MCP connection state */\ninterface MCPConnection {\n config: MCPServerConfig;\n tools: MCPToolInfo[];\n connected: boolean;\n}\n\n/**\n * Connect to an MCP server and return its tools as ToolDef[].\n *\n * This is a lightweight adapter that converts MCP tool definitions\n * to ADK ToolDef format. For full MCP bridge features (rate limiting,\n * circuit breaking, output sanitization), use @aizonaai/mcp-bridge directly.\n */\nexport async function mcpServerTools(config: MCPServerConfig): Promise<ToolDef[]> {\n const connector = new MCPServerConnector(config);\n let tools = await connector.discover();\n\n // Apply name-based filter from config\n if (config.toolNames && config.toolNames.length > 0) {\n const nameSet = new Set(config.toolNames);\n tools = tools.filter((t) => nameSet.has(t.name));\n }\n\n // Apply category filter from config\n if (config.categories && config.categories.length > 0) {\n const catSet = new Set(config.categories);\n tools = tools.filter((t) => t.category && catSet.has(t.category));\n }\n\n // Apply max tools cap\n if (config.maxTools && config.maxTools > 0) {\n tools = tools.slice(0, config.maxTools);\n }\n\n return tools.map((tool) => connector.toToolDef(tool));\n}\n\n/**\n * Discover tool metadata from an MCP server without creating ToolDefs.\n * Useful for browsing available tools before selecting specific ones.\n */\nexport async function discoverMCPTools(config: MCPServerConfig): Promise<MCPToolInfo[]> {\n const connector = new MCPServerConnector(config);\n return connector.discover();\n}\n\n/**\n * Load only specific named tools from an MCP server.\n * Combines discovery with name-based selection in one call.\n */\nexport async function mcpSelectTools(\n config: MCPServerConfig,\n toolNames: string[],\n): Promise<ToolDef[]> {\n const connector = new MCPServerConnector(config);\n const allTools = await connector.discover();\n return connector.selectTools(allTools, toolNames);\n}\n\n/**\n * MCPServerConnector — lightweight connector for MCP servers.\n * Handles discovery and invocation.\n */\nexport class MCPServerConnector {\n private config: MCPServerConfig;\n private connection: MCPConnection;\n\n constructor(config: MCPServerConfig) {\n this.config = config;\n this.connection = {\n config,\n tools: [],\n connected: false,\n };\n }\n\n /** Discover tools from the MCP server */\n async discover(): Promise<MCPToolInfo[]> {\n if (this.config.transport === \"stdio\") {\n return this.discoverViaStdio();\n }\n return this.discoverViaHttp();\n }\n\n /** Convert an MCP tool to an ADK ToolDef */\n toToolDef(tool: MCPToolInfo): ToolDef {\n const config = this.config;\n\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n metadata: {\n source: \"mcp\",\n serverUrl: config.serverUrl,\n transport: config.transport,\n },\n execute: async (input: unknown, _ctx: ToolContext) => {\n return this.invokeTool(tool.name, input);\n },\n };\n }\n\n /** Discover tool metadata without creating ToolDefs */\n async discoverMetadata(): Promise<MCPToolInfo[]> {\n return this.discover();\n }\n\n /** Create ToolDefs for only the named subset of discovered tools */\n selectTools(discovered: MCPToolInfo[], names: string[]): ToolDef[] {\n const nameSet = new Set(names);\n return discovered.filter((t) => nameSet.has(t.name)).map((t) => this.toToolDef(t));\n }\n\n /** Invoke a tool on the MCP server */\n async invokeTool(toolName: string, input: unknown): Promise<unknown> {\n if (this.config.transport === \"stdio\") {\n return this.invokeViaStdio(toolName, input);\n }\n return this.invokeViaHttp(toolName, input);\n }\n\n /** Discover tools via HTTP (SSE or streamable-http) */\n private async discoverViaHttp(): Promise<MCPToolInfo[]> {\n const url = `${this.config.serverUrl}/tools/list`;\n const headers = this.buildHeaders();\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: JSON.stringify({ jsonrpc: \"2.0\", method: \"tools/list\", id: 1 }),\n signal: this.config.timeoutMs ? AbortSignal.timeout(this.config.timeoutMs) : undefined,\n });\n\n if (!response.ok) {\n throw new Error(`MCP server error: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n result?: { tools?: MCPToolInfo[] };\n };\n const tools = data.result?.tools ?? [];\n\n // Apply filter\n const filtered = this.config.toolFilter ? tools.filter(this.config.toolFilter) : tools;\n\n this.connection.tools = filtered;\n this.connection.connected = true;\n\n return filtered;\n }\n\n /** Invoke a tool via HTTP */\n private async invokeViaHttp(toolName: string, input: unknown): Promise<unknown> {\n const url = `${this.config.serverUrl}/tools/call`;\n const headers = this.buildHeaders();\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n method: \"tools/call\",\n params: { name: toolName, arguments: input },\n id: Date.now(),\n }),\n signal: this.config.timeoutMs ? AbortSignal.timeout(this.config.timeoutMs) : undefined,\n });\n\n if (!response.ok) {\n throw new Error(`MCP tool call failed: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n result?: { content?: unknown[] };\n error?: { message: string };\n };\n\n if (data.error) {\n throw new Error(`MCP tool error: ${data.error.message}`);\n }\n\n // Extract text content from MCP response\n const content = data.result?.content;\n if (Array.isArray(content) && content.length > 0) {\n const first = content[0] as { type?: string; text?: string };\n if (first.type === \"text\" && first.text) {\n return first.text;\n }\n return content;\n }\n\n return data.result;\n }\n\n /** Discover tools via stdio (placeholder — requires child_process) */\n private async discoverViaStdio(): Promise<MCPToolInfo[]> {\n // Stdio transport requires spawning a process.\n // In a browser/edge environment, this falls back to empty.\n // Full stdio support is available via @aizonaai/mcp-bridge.\n throw new Error(\n \"Stdio transport requires @aizonaai/mcp-bridge or Node.js child_process. \" +\n \"Use transport: 'sse' or 'streamable-http' for lightweight MCP connections.\",\n );\n }\n\n /** Invoke tool via stdio (placeholder) */\n private async invokeViaStdio(_toolName: string, _input: unknown): Promise<unknown> {\n throw new Error(\n \"Stdio transport requires @aizonaai/mcp-bridge. \" +\n \"Use transport: 'sse' or 'streamable-http' for lightweight MCP connections.\",\n );\n }\n\n /** Build auth headers */\n private buildHeaders(): Record<string, string> {\n const auth = this.config.authConfig;\n if (!auth) return {};\n\n switch (auth.type) {\n case \"bearer\":\n return { Authorization: `Bearer ${auth.token}` };\n case \"basic\": {\n const encoded = Buffer.from(`${auth.username}:${auth.password}`).toString(\"base64\");\n return { Authorization: `Basic ${encoded}` };\n }\n case \"api-key\":\n return { [auth.headerName ?? \"X-API-Key\"]: auth.apiKey ?? \"\" };\n default:\n return {};\n }\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK RealtimeAgent — Voice/Audio streaming\n// ──────────────────────────────────────────────────────\n// WebSocket-based realtime agent for voice interactions.\n// Supports OpenAI Realtime API.\n// ──────────────────────────────────────────────────────\n\nimport type { AgentConfig } from \"../types/agent\";\nimport type { ToolDef } from \"../types/tool\";\n\n/** Voice options */\nexport type VoiceName = \"alloy\" | \"echo\" | \"fable\" | \"onyx\" | \"nova\" | \"shimmer\";\n\n/** Audio format */\nexport type AudioFormat = \"pcm16\" | \"opus\";\n\n/** Voice activity detection mode */\nexport type VADMode = \"server\" | \"client\" | \"off\";\n\n/** Realtime provider */\nexport type RealtimeProvider = \"openai\";\n\n/** Realtime agent configuration */\nexport interface RealtimeAgentConfig extends AgentConfig {\n /** Voice to use */\n voice?: VoiceName;\n /** Audio format */\n audioFormat?: AudioFormat;\n /** VAD mode */\n vadMode?: VADMode;\n /** Realtime provider */\n realtimeProvider?: RealtimeProvider;\n /** Provider API key */\n apiKey?: string;\n /** WebSocket URL override */\n wsUrl?: string;\n}\n\n/** Realtime connection state */\nexport type RealtimeState = \"disconnected\" | \"connecting\" | \"connected\" | \"error\";\n\n/** Realtime event types */\nexport type RealtimeEvent =\n | { type: \"state_change\"; state: RealtimeState }\n | { type: \"audio\"; buffer: ArrayBuffer }\n | { type: \"text\"; content: string; final: boolean }\n | { type: \"tool_call\"; toolName: string; input: unknown; callId: string }\n | { type: \"error\"; message: string };\n\n/**\n * RealtimeAgent — Voice-enabled agent using WebSocket realtime APIs.\n *\n * Currently supports OpenAI Realtime API.\n * Connect, send audio, and receive audio/text responses.\n */\nexport class RealtimeAgent {\n readonly config: RealtimeAgentConfig;\n private state: RealtimeState = \"disconnected\";\n private ws: WebSocket | null = null;\n private audioHandlers: Array<(buffer: ArrayBuffer) => void> = [];\n private textHandlers: Array<(text: string) => void> = [];\n private toolCallHandlers: Array<(toolName: string, input: unknown) => Promise<unknown>> = [];\n private eventHandlers: Array<(event: RealtimeEvent) => void> = [];\n\n constructor(config: RealtimeAgentConfig) {\n this.config = config;\n }\n\n /** Get current connection state */\n getState(): RealtimeState {\n return this.state;\n }\n\n /** Connect to the realtime provider */\n async connect(): Promise<void> {\n if (this.state === \"connected\" || this.state === \"connecting\") {\n return;\n }\n\n this.setState(\"connecting\");\n\n const url = this.config.wsUrl ?? this.getProviderUrl();\n\n try {\n this.ws = new WebSocket(url, [\n \"realtime\",\n `openai-insecure-api-key.${this.config.apiKey ?? \"\"}`,\n \"openai-beta.realtime-v1\",\n ]);\n\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\"Connection timeout\"));\n }, 10000);\n\n this.ws!.onopen = () => {\n clearTimeout(timeout);\n this.setState(\"connected\");\n this.sendSessionConfig();\n resolve();\n };\n\n this.ws!.onerror = (event) => {\n clearTimeout(timeout);\n this.setState(\"error\");\n reject(new Error(\"WebSocket connection failed\"));\n };\n\n this.ws!.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws!.onclose = () => {\n this.setState(\"disconnected\");\n };\n });\n } catch (error) {\n this.setState(\"error\");\n throw error;\n }\n }\n\n /** Disconnect from the realtime provider */\n async disconnect(): Promise<void> {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.setState(\"disconnected\");\n }\n\n /** Send an audio buffer to the realtime session */\n sendAudio(buffer: ArrayBuffer): void {\n if (this.state !== \"connected\" || !this.ws) {\n throw new Error(\"Not connected\");\n }\n\n // Encode audio as base64 for JSON transport\n const base64 = arrayBufferToBase64(buffer);\n\n this.ws.send(\n JSON.stringify({\n type: \"input_audio_buffer.append\",\n audio: base64,\n }),\n );\n }\n\n /** Send a text message to the realtime session */\n sendText(text: string): void {\n if (this.state !== \"connected\" || !this.ws) {\n throw new Error(\"Not connected\");\n }\n\n this.ws.send(\n JSON.stringify({\n type: \"conversation.item.create\",\n item: {\n type: \"message\",\n role: \"user\",\n content: [{ type: \"input_text\", text }],\n },\n }),\n );\n\n // Request a response\n this.ws.send(JSON.stringify({ type: \"response.create\" }));\n }\n\n /** Register handler for audio output */\n onAudio(handler: (buffer: ArrayBuffer) => void): () => void {\n this.audioHandlers.push(handler);\n return () => {\n this.audioHandlers = this.audioHandlers.filter((h) => h !== handler);\n };\n }\n\n /** Register handler for text output */\n onText(handler: (text: string) => void): () => void {\n this.textHandlers.push(handler);\n return () => {\n this.textHandlers = this.textHandlers.filter((h) => h !== handler);\n };\n }\n\n /** Register handler for tool calls */\n onToolCall(handler: (toolName: string, input: unknown) => Promise<unknown>): () => void {\n this.toolCallHandlers.push(handler);\n return () => {\n this.toolCallHandlers = this.toolCallHandlers.filter((h) => h !== handler);\n };\n }\n\n /** Register handler for all events */\n onEvent(handler: (event: RealtimeEvent) => void): () => void {\n this.eventHandlers.push(handler);\n return () => {\n this.eventHandlers = this.eventHandlers.filter((h) => h !== handler);\n };\n }\n\n private setState(state: RealtimeState): void {\n this.state = state;\n this.emitEvent({ type: \"state_change\", state });\n }\n\n private emitEvent(event: RealtimeEvent): void {\n for (const handler of this.eventHandlers) {\n try {\n handler(event);\n } catch {\n // Don't let handler errors break the realtime stream\n }\n }\n }\n\n private sendSessionConfig(): void {\n if (!this.ws) return;\n\n const tools = (this.config.tools ?? []).map((t: ToolDef) => ({\n type: \"function\",\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n }));\n\n this.ws.send(\n JSON.stringify({\n type: \"session.update\",\n session: {\n modalities: [\"text\", \"audio\"],\n instructions:\n typeof this.config.instructions === \"string\"\n ? this.config.instructions\n : \"You are a helpful assistant.\",\n voice: this.config.voice ?? \"alloy\",\n input_audio_format: this.config.audioFormat ?? \"pcm16\",\n output_audio_format: this.config.audioFormat ?? \"pcm16\",\n turn_detection: this.config.vadMode === \"off\" ? null : { type: \"server_vad\" },\n tools,\n },\n }),\n );\n }\n\n private async handleMessage(data: unknown): Promise<void> {\n try {\n const msg = typeof data === \"string\" ? JSON.parse(data) : data;\n\n switch (msg.type) {\n case \"response.audio.delta\": {\n const buffer = base64ToArrayBuffer(msg.delta);\n for (const handler of this.audioHandlers) handler(buffer);\n this.emitEvent({ type: \"audio\", buffer });\n break;\n }\n\n case \"response.text.delta\":\n case \"response.audio_transcript.delta\": {\n const text = msg.delta ?? \"\";\n for (const handler of this.textHandlers) handler(text);\n this.emitEvent({ type: \"text\", content: text, final: false });\n break;\n }\n\n case \"response.text.done\":\n case \"response.audio_transcript.done\": {\n const text = msg.text ?? \"\";\n this.emitEvent({ type: \"text\", content: text, final: true });\n break;\n }\n\n case \"response.function_call_arguments.done\": {\n const toolName = msg.name;\n const input = JSON.parse(msg.arguments ?? \"{}\");\n const callId = msg.call_id;\n\n this.emitEvent({ type: \"tool_call\", toolName, input, callId });\n\n // Execute tool via handlers\n for (const handler of this.toolCallHandlers) {\n try {\n const result = await handler(toolName, input);\n this.sendToolResult(callId, result);\n break;\n } catch {\n // Try next handler\n }\n }\n break;\n }\n\n case \"error\": {\n const errMsg = msg.error?.message ?? \"Unknown realtime error\";\n this.emitEvent({ type: \"error\", message: errMsg });\n break;\n }\n }\n } catch {\n // Ignore unparseable messages\n }\n }\n\n private sendToolResult(callId: string, result: unknown): void {\n if (!this.ws) return;\n\n this.ws.send(\n JSON.stringify({\n type: \"conversation.item.create\",\n item: {\n type: \"function_call_output\",\n call_id: callId,\n output: typeof result === \"string\" ? result : JSON.stringify(result),\n },\n }),\n );\n\n this.ws.send(JSON.stringify({ type: \"response.create\" }));\n }\n\n private getProviderUrl(): string {\n switch (this.config.realtimeProvider ?? \"openai\") {\n case \"openai\":\n return \"wss://api.openai.com/v1/realtime?model=gpt-4o-realtime-preview\";\n default:\n throw new Error(`Unsupported realtime provider: ${this.config.realtimeProvider}`);\n }\n }\n}\n\n// ── Utility Functions ──\n\nfunction arrayBufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]!);\n }\n return btoa(binary);\n}\n\nfunction base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes.buffer;\n}\n","// ──────────────────────────────────────────────────────\n// ADK Audio Stream — Buffer management for PCM16 audio\n// ──────────────────────────────────────────────────────\n\n/** Audio buffer configuration */\nexport interface AudioBufferConfig {\n /** Sample rate in Hz (default: 24000) */\n sampleRate?: number;\n /** Number of channels (default: 1, mono) */\n channels?: number;\n /** Buffer size in samples (default: 4800, 200ms at 24kHz) */\n bufferSize?: number;\n}\n\n/**\n * AudioStreamBuffer — Manages a ring buffer for PCM16 audio data.\n * Used for smoothing audio playback from realtime streams.\n */\nexport class AudioStreamBuffer {\n private buffer: Int16Array;\n private writePos = 0;\n private readPos = 0;\n private count = 0;\n readonly sampleRate: number;\n readonly channels: number;\n\n constructor(config?: AudioBufferConfig) {\n this.sampleRate = config?.sampleRate ?? 24000;\n this.channels = config?.channels ?? 1;\n const bufferSize = config?.bufferSize ?? 4800;\n this.buffer = new Int16Array(bufferSize);\n }\n\n /** Write PCM16 samples to the buffer */\n write(samples: Int16Array): number {\n const capacity = this.buffer.length;\n let written = 0;\n\n for (let i = 0; i < samples.length; i++) {\n if (this.count >= capacity) break;\n this.buffer[this.writePos] = samples[i]!;\n this.writePos = (this.writePos + 1) % capacity;\n this.count++;\n written++;\n }\n\n return written;\n }\n\n /** Read PCM16 samples from the buffer */\n read(numSamples: number): Int16Array {\n const toRead = Math.min(numSamples, this.count);\n const result = new Int16Array(toRead);\n\n for (let i = 0; i < toRead; i++) {\n result[i] = this.buffer[this.readPos]!;\n this.readPos = (this.readPos + 1) % this.buffer.length;\n this.count--;\n }\n\n return result;\n }\n\n /** Number of samples available to read */\n get available(): number {\n return this.count;\n }\n\n /** Whether the buffer is empty */\n get isEmpty(): boolean {\n return this.count === 0;\n }\n\n /** Whether the buffer is full */\n get isFull(): boolean {\n return this.count >= this.buffer.length;\n }\n\n /** Duration of buffered audio in milliseconds */\n get durationMs(): number {\n return (this.count / this.sampleRate) * 1000;\n }\n\n /** Clear the buffer */\n clear(): void {\n this.writePos = 0;\n this.readPos = 0;\n this.count = 0;\n }\n}\n\n/**\n * Convert an ArrayBuffer (raw bytes) to Int16Array (PCM16).\n * Assumes little-endian 16-bit signed integer format.\n */\nexport function pcm16FromArrayBuffer(buffer: ArrayBuffer): Int16Array {\n return new Int16Array(buffer);\n}\n\n/**\n * Convert Int16Array (PCM16) to ArrayBuffer (raw bytes).\n */\nexport function pcm16ToArrayBuffer(samples: Int16Array): ArrayBuffer {\n return (samples.buffer as ArrayBuffer).slice(\n samples.byteOffset,\n samples.byteOffset + samples.byteLength,\n );\n}\n\n/**\n * Calculate RMS volume level from PCM16 samples.\n * Returns a value between 0.0 (silence) and 1.0 (max volume).\n */\nexport function calculateVolume(samples: Int16Array): number {\n if (samples.length === 0) return 0;\n\n let sumSquares = 0;\n for (let i = 0; i < samples.length; i++) {\n const normalized = samples[i]! / 32768;\n sumSquares += normalized * normalized;\n }\n\n return Math.sqrt(sumSquares / samples.length);\n}\n","// ──────────────────────────────────────────────────────\n// ADK Skill — defineSkill()\n// Community skill manifests for publishing & loading\n// ──────────────────────────────────────────────────────\n\nimport { z } from \"zod\";\n\n/** A single tool definition within a skill manifest */\nexport interface SkillToolEntry {\n /** Tool name */\n name: string;\n /** Tool description */\n description: string;\n /** JSON Schema for tool input */\n inputSchema: Record<string, unknown>;\n /** JSON Schema for tool output (optional) */\n outputSchema?: Record<string, unknown>;\n}\n\n/** Skill manifest — the core portable definition */\nexport interface SkillManifest {\n /** Unique skill name (scoped to community) */\n name: string;\n /** Semver version string */\n version: string;\n /** Human-readable description */\n description: string;\n /** Category for marketplace browsing */\n category?: string;\n /** Tags for search/filter */\n tags?: string[];\n /** Tool definitions included in this skill */\n tools: SkillToolEntry[];\n /** Optional agent configuration hints (model, temperature, etc.) */\n agentConfig?: Record<string, unknown>;\n /** Other skills this skill depends on */\n dependencies?: string[];\n /** Arbitrary metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Zod schema for a single tool entry */\nconst SkillToolEntrySchema = z.object({\n name: z.string().min(1, \"Tool name is required\"),\n description: z.string().min(1, \"Tool description is required\"),\n inputSchema: z.record(z.unknown()),\n outputSchema: z.record(z.unknown()).optional(),\n});\n\n/** Zod schema for full skill manifest validation */\nexport const SkillManifestSchema = z.object({\n name: z\n .string()\n .min(1, \"Skill name is required\")\n .max(128, \"Skill name must be at most 128 characters\")\n .regex(\n /^[a-zA-Z0-9_-]+$/,\n \"Skill name must contain only alphanumeric characters, hyphens, and underscores\",\n ),\n version: z\n .string()\n .min(1, \"Version is required\")\n .regex(/^\\d+\\.\\d+\\.\\d+$/, \"Version must be valid semver (e.g. 1.0.0)\"),\n description: z\n .string()\n .min(1, \"Description is required\")\n .max(2000, \"Description must be at most 2000 characters\"),\n category: z.string().max(64).optional(),\n tags: z.array(z.string().max(32)).max(20).optional(),\n tools: z.array(SkillToolEntrySchema).min(1, \"At least one tool is required\"),\n agentConfig: z.record(z.unknown()).optional(),\n dependencies: z.array(z.string()).optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\n/**\n * Define and validate a skill manifest.\n * Throws if the manifest is invalid.\n */\nexport function defineSkill(manifest: SkillManifest): SkillManifest {\n const result = SkillManifestSchema.safeParse(manifest);\n if (!result.success) {\n const issues = result.error.issues.map((i) => ` - ${i.path.join(\".\")}: ${i.message}`);\n throw new Error(`Invalid skill manifest:\\n${issues.join(\"\\n\")}`);\n }\n\n // Check for duplicate tool names\n const toolNames = new Set<string>();\n for (const tool of manifest.tools) {\n if (toolNames.has(tool.name)) {\n throw new Error(`Duplicate tool name in skill manifest: \"${tool.name}\"`);\n }\n toolNames.add(tool.name);\n }\n\n return result.data;\n}\n","// ──────────────────────────────────────────────────────\n// ADK Skill Loader — Converts SkillManifest → ToolDef[]\n// ──────────────────────────────────────────────────────\n\nimport type { JsonSchema } from \"../types/agent\";\nimport type { ToolContext, ToolDef } from \"../types/tool\";\nimport type { SkillManifest, SkillToolEntry } from \"./define-skill\";\nimport { SkillManifestSchema } from \"./define-skill\";\n\n/** Result of loading a skill */\nexport interface LoadedSkill {\n /** Tool definitions ready to use in an agent */\n tools: ToolDef[];\n /** Agent configuration hints from the manifest */\n agentConfig?: Record<string, unknown>;\n /** Original manifest metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Create a ToolDef from a SkillToolEntry.\n * The resulting tool has a stub execute that returns\n * a message indicating it was loaded from a skill manifest.\n * Callers should override `execute` with actual implementations.\n */\nfunction createToolFromEntry(skillName: string, entry: SkillToolEntry): ToolDef {\n const inputSchema: JsonSchema = {\n type: \"object\",\n ...entry.inputSchema,\n };\n\n const outputSchema: JsonSchema | undefined = entry.outputSchema\n ? { type: \"object\", ...entry.outputSchema }\n : undefined;\n\n return {\n name: entry.name,\n description: entry.description,\n inputSchema,\n outputSchema,\n execute: async (input: unknown, _ctx: ToolContext) => {\n // Default stub — real implementations should replace this\n return {\n _skill: skillName,\n _tool: entry.name,\n _stub: true,\n message: `Tool \"${entry.name}\" from skill \"${skillName}\" executed with stub. Provide a real execute function.`,\n input,\n };\n },\n metadata: {\n _fromSkill: skillName,\n _skillTool: true,\n },\n };\n}\n\n/**\n * Load a skill manifest and produce ToolDef instances.\n *\n * @param manifest - A validated SkillManifest\n * @param toolImplementations - Optional map of tool name → execute function overrides\n * @returns LoadedSkill with ToolDef[] and agentConfig\n */\nexport function loadSkill(\n manifest: SkillManifest,\n toolImplementations?: Record<string, (input: unknown, ctx: ToolContext) => Promise<unknown>>,\n): LoadedSkill {\n // Validate manifest\n const parsed = SkillManifestSchema.safeParse(manifest);\n if (!parsed.success) {\n const issues = parsed.error.issues.map((i) => ` - ${i.path.join(\".\")}: ${i.message}`);\n throw new Error(`Invalid skill manifest:\\n${issues.join(\"\\n\")}`);\n }\n\n const tools: ToolDef[] = manifest.tools.map((entry) => {\n const tool = createToolFromEntry(manifest.name, entry);\n\n // Override execute if an implementation was provided\n if (toolImplementations?.[entry.name]) {\n tool.execute = toolImplementations[entry.name]!;\n }\n\n return tool;\n });\n\n return {\n tools,\n agentConfig: manifest.agentConfig,\n metadata: manifest.metadata,\n };\n}\n\n/**\n * Merge tools from multiple loaded skills into a single array.\n * Throws if tool name collisions are detected across skills.\n */\nexport function mergeSkillTools(...loadedSkills: LoadedSkill[]): ToolDef[] {\n const nameMap = new Map<string, string>(); // tool name → skill name\n const allTools: ToolDef[] = [];\n\n for (const loaded of loadedSkills) {\n for (const tool of loaded.tools) {\n const existingSkill = nameMap.get(tool.name);\n if (existingSkill) {\n throw new Error(\n `Tool name collision: \"${tool.name}\" exists in both skill \"${existingSkill}\" ` +\n `and skill \"${(tool.metadata as Record<string, unknown>)?._fromSkill ?? \"unknown\"}\"`,\n );\n }\n nameMap.set(\n tool.name,\n ((tool.metadata as Record<string, unknown>)?._fromSkill as string) ?? \"unknown\",\n );\n allTools.push(tool);\n }\n }\n\n return allTools;\n}\n","// ──────────────────────────────────────────────────────\n// Skill Manifest — manuscript-ingest\n// Category: publishing\n// ──────────────────────────────────────────────────────\n\nimport { defineSkill } from \"../../define-skill\";\n\nexport const manuscriptIngestManifest = defineSkill({\n name: \"manuscript-ingest\",\n version: \"1.0.0\",\n description:\n \"Parse a manuscript file (epub/docx/pdf/txt) into chapters with word counts and KB-ready blocks.\",\n category: \"publishing\",\n tags: [\"publishing\", \"manuscript\", \"parsing\", \"ingest\"],\n tools: [\n {\n name: \"manuscript-ingest\",\n description: \"Parse an uploaded manuscript into chapters + KB blocks.\",\n inputSchema: {\n properties: {\n manuscriptId: { type: \"string\" },\n fileType: { type: \"string\", enum: [\"epub\", \"docx\", \"pdf\", \"txt\"] },\n source: {\n oneOf: [\n { type: \"string\" },\n {\n type: \"object\",\n properties: { base64: { type: \"string\" } },\n required: [\"base64\"],\n },\n ],\n },\n targetKbId: { type: \"string\" },\n },\n required: [\"manuscriptId\", \"fileType\", \"source\", \"targetKbId\"],\n },\n outputSchema: {\n properties: {\n manuscriptId: { type: \"string\" },\n chapters: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n index: { type: \"integer\" },\n title: { type: \"string\" },\n wordCount: { type: \"integer\" },\n blocks: { type: \"array\", items: { type: \"string\" } },\n },\n },\n },\n totalWordCount: { type: \"integer\" },\n },\n },\n },\n ],\n metadata: {\n executionMode: \"INLINE\",\n runtimeDependencies: [\"epub\", \"mammoth\", \"pdf-parse\"],\n },\n});\n","// ──────────────────────────────────────────────────────\n// Skill Manifest — manuscript-summarize\n// Category: publishing\n// ──────────────────────────────────────────────────────\n\nimport { defineSkill } from \"../../define-skill\";\n\nexport const manuscriptSummarizeManifest = defineSkill({\n name: \"manuscript-summarize\",\n version: \"1.0.0\",\n description: \"Produce 5-line, 1-page, and 3-page summaries + thematic tags + comp titles.\",\n category: \"publishing\",\n tags: [\"publishing\", \"manuscript\", \"summarize\"],\n tools: [\n {\n name: \"manuscript-summarize\",\n description: \"Multi-length summary + tags + comp-title leads.\",\n inputSchema: {\n properties: {\n manuscriptId: { type: \"string\" },\n sourceKbId: { type: \"string\" },\n },\n required: [\"manuscriptId\", \"sourceKbId\"],\n },\n outputSchema: {\n properties: {\n manuscriptId: { type: \"string\" },\n fiveLine: { type: \"string\" },\n onePage: { type: \"string\" },\n threePage: { type: \"string\" },\n tags: { type: \"array\", items: { type: \"string\" } },\n compTitles: { type: \"array\", items: { type: \"string\" } },\n },\n },\n },\n ],\n metadata: { executionMode: \"INLINE\" },\n});\n","// ──────────────────────────────────────────────────────\n// Skill Manifest — book-edit-suggest\n// Category: publishing\n// executionMode: SANDBOX — manuscript text is large/untrusted input;\n// the platform sandbox runtime (Stream B-2) reads metadata.executionMode\n// at dispatch and runs the body in isolated-vm + gVisor.\n// ──────────────────────────────────────────────────────\n\nimport { defineSkill } from \"../../define-skill\";\n\nexport const bookEditSuggestManifest = defineSkill({\n name: \"book-edit-suggest\",\n version: \"1.0.0\",\n description:\n \"Generate line-level edits and structural notes for a chapter range. Runs in SANDBOX — manuscript text is large untrusted input.\",\n category: \"publishing\",\n tags: [\"publishing\", \"manuscript\", \"editing\", \"sandbox\"],\n tools: [\n {\n name: \"book-edit-suggest\",\n description: \"Line edits + structural notes for a chapter range.\",\n inputSchema: {\n properties: {\n manuscriptId: { type: \"string\" },\n sourceKbId: { type: \"string\" },\n suggestionsKbId: { type: \"string\" },\n chapterStart: { type: \"integer\", minimum: 0 },\n chapterEnd: { type: \"integer\", minimum: 0 },\n },\n required: [\"manuscriptId\", \"sourceKbId\", \"suggestionsKbId\", \"chapterStart\", \"chapterEnd\"],\n },\n outputSchema: {\n properties: {\n suggestions: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n chapterIndex: { type: \"integer\" },\n kind: { type: \"string\", enum: [\"line\", \"structural\"] },\n location: { type: \"string\" },\n note: { type: \"string\" },\n suggestedText: { type: \"string\" },\n },\n },\n },\n },\n },\n },\n ],\n // executionMode: \"SANDBOX\" tells the platform sandbox runtime (Stream B-2) to\n // execute this body in isolated-vm + gVisor. Stream B-2 reads metadata.executionMode at dispatch.\n metadata: { executionMode: \"SANDBOX\" },\n});\n","// ──────────────────────────────────────────────────────\n// Skill Manifest — publisher-database-search\n// Category: publishing\n// executionMode: INLINE — DataApi call with AIZ unlock + per-call metering.\n// ──────────────────────────────────────────────────────\n\nimport { defineSkill } from \"../../define-skill\";\n\nexport const publisherDatabaseSearchManifest = defineSkill({\n name: \"publisher-database-search\",\n version: \"1.0.0\",\n description:\n \"Query the PublishersGlobal database for publishers + acquiring editors that fit a manuscript's metadata. AIZ-unlock + per-call metering required.\",\n category: \"publishing\",\n tags: [\"publishing\", \"publisher\", \"search\", \"data-api\"],\n tools: [\n {\n name: \"publisher-database-search\",\n description: \"Ranked publisher matches with submission guidelines.\",\n inputSchema: {\n properties: {\n genre: { type: \"string\" },\n themes: { type: \"array\", items: { type: \"string\" } },\n targetAudience: { type: \"string\" },\n wordCount: { type: \"integer\" },\n compTitles: { type: \"array\", items: { type: \"string\" } },\n limit: { type: \"integer\", default: 10 },\n },\n required: [\"genre\", \"wordCount\"],\n },\n outputSchema: {\n properties: {\n results: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n publisherId: { type: \"string\" },\n name: { type: \"string\" },\n imprint: { type: \"string\" },\n fitScore: { type: \"number\" },\n acquiringEditors: { type: \"array\" },\n submissionGuidelines: { type: \"string\" },\n },\n },\n },\n },\n },\n },\n ],\n metadata: {\n executionMode: \"INLINE\",\n dataApi: \"publishers-global-v1\",\n entitlement: {\n kind: \"DATA_API\",\n id: \"publishers-global-v1\",\n aizUnlockCost: 200,\n perCallMeter: 4,\n },\n },\n});\n","// ──────────────────────────────────────────────────────\n// Skill Manifest — market-fit-score\n// Category: publishing\n// executionMode: INLINE — DataApi call + LLM reasoning.\n// DataApi: publishers-global-v1 (shared with publisher-database-search)\n// AIZ unlock required (200 AIZ) + per-call meter (4 AIZ/call)\n// ──────────────────────────────────────────────────────\n\nimport { defineSkill } from \"../../define-skill\";\n\nexport const marketFitScoreManifest = defineSkill({\n name: \"market-fit-score\",\n version: \"1.0.0\",\n description:\n \"Score the 0-100 market fit between a manuscript and a specific publisher with reasoning.\",\n category: \"publishing\",\n tags: [\"publishing\", \"market-fit\", \"publisher\", \"data-api\"],\n tools: [\n {\n name: \"market-fit-score\",\n description: \"0-100 fit score + reasoning.\",\n inputSchema: {\n properties: {\n manuscript: {\n type: \"object\",\n properties: {\n title: { type: \"string\" },\n genre: { type: \"string\" },\n wordCount: { type: \"integer\" },\n themes: { type: \"array\", items: { type: \"string\" } },\n summary: { type: \"string\" },\n compTitles: { type: \"array\", items: { type: \"string\" } },\n },\n required: [\"genre\", \"wordCount\", \"summary\"],\n },\n publisherId: { type: \"string\" },\n },\n required: [\"manuscript\", \"publisherId\"],\n },\n outputSchema: {\n properties: {\n score: { type: \"integer\", minimum: 0, maximum: 100 },\n reasoning: { type: \"string\" },\n },\n },\n },\n ],\n metadata: {\n executionMode: \"INLINE\",\n dataApi: \"publishers-global-v1\",\n entitlement: {\n kind: \"DATA_API\",\n id: \"publishers-global-v1\",\n aizUnlockCost: 200,\n perCallMeter: 4,\n },\n },\n});\n","// ──────────────────────────────────────────────────────\n// Skill Manifest — query-letter-generate\n// Category: publishing\n// executionMode: INLINE — single LLM call producing a one-page query letter.\n// No AIZ unlock required — tier-included.\n// ──────────────────────────────────────────────────────\n\nimport { defineSkill } from \"../../define-skill\";\n\nexport const queryLetterGenerateManifest = defineSkill({\n name: \"query-letter-generate\",\n version: \"1.0.0\",\n description:\n \"Draft an industry-standard query letter for a target publisher from manuscript metadata.\",\n category: \"publishing\",\n tags: [\"publishing\", \"query-letter\", \"writing\"],\n tools: [\n {\n name: \"query-letter-generate\",\n description: \"One-page query letter (hook + pitch + bio + housekeeping).\",\n inputSchema: {\n properties: {\n manuscript: {\n type: \"object\",\n properties: {\n title: { type: \"string\" },\n genre: { type: \"string\" },\n wordCount: { type: \"integer\" },\n summary: { type: \"string\" },\n compTitles: { type: \"array\", items: { type: \"string\" } },\n authorBio: { type: \"string\" },\n },\n required: [\"title\", \"genre\", \"wordCount\", \"summary\"],\n },\n publisher: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n acquiringEditor: { type: \"string\" },\n submissionGuidelines: { type: \"string\" },\n allowsSimultaneous: { type: \"boolean\" },\n },\n required: [\"name\"],\n },\n },\n required: [\"manuscript\", \"publisher\"],\n },\n outputSchema: {\n properties: {\n letter: { type: \"string\" },\n attachmentInstructions: { type: \"string\" },\n },\n },\n },\n ],\n metadata: {\n executionMode: \"INLINE\",\n },\n});\n","// ──────────────────────────────────────────────────────\n// Skill 7 — query-letter-personalize\n// Personalize a query letter using an acquiring editor's\n// recent acquisitions (via publishers-global-v1 connector).\n// executionMode: INLINE\n// ──────────────────────────────────────────────────────\n\nimport { defineSkill } from \"../define-skill\";\n\n// ─── Types ───────────────────────────────────────────\n\nexport interface QueryLetterPersonalizeInput {\n /** The raw query letter produced by skill 6. */\n queryLetter: string;\n /** Acquiring editor identifier (used to look up recent acquisitions). */\n editorId: string;\n}\n\nexport interface QueryLetterPersonalizeOutput {\n /** The query letter with a personalization paragraph injected (or the original if no acquisitions). */\n personalized: string;\n /** Number of recent acquisitions referenced in the personalization. 0 means no LLM call was made. */\n acquisitionsUsed: number;\n}\n\nexport interface AcquisitionRecord {\n title: string;\n year: number;\n}\n\nexport interface QueryLetterPersonalizeContext {\n /** Inline LLM call — returns the revised letter text. */\n llm: (args: { prompt: string }) => Promise<{ text: string }>;\n /** Host-fn boundary for the publishers-global-v1 DataApiConnector. */\n dataApiCall: (args: {\n slug: string;\n op: string;\n params: Record<string, unknown>;\n }) => Promise<{ acquisitions: AcquisitionRecord[] }>;\n /** Workspace identifier (entitlement enforcement is upstream at host-fn boundary). */\n workspaceId: string;\n}\n\n// ─── Manifest ────────────────────────────────────────\n\nexport const queryLetterPersonalizeManifest = defineSkill({\n name: \"query-letter-personalize\",\n version: \"1.0.0\",\n description:\n \"Personalize a query letter by inserting one paragraph that ties the editor's recent acquisitions thematically to the author's manuscript. Falls back gracefully when no acquisitions are available.\",\n category: \"publishing\",\n tags: [\"query-letter\", \"personalization\", \"publishing\"],\n tools: [\n {\n name: \"personalize\",\n description:\n \"Inject a personalization paragraph into a query letter using the editor's recent acquisitions from the publishers-global-v1 connector.\",\n inputSchema: {\n type: \"object\",\n required: [\"queryLetter\", \"editorId\"],\n properties: {\n queryLetter: {\n type: \"string\",\n minLength: 50,\n description: \"The full query letter text.\",\n },\n editorId: {\n type: \"string\",\n description: \"Acquiring editor identifier.\",\n },\n },\n },\n outputSchema: {\n type: \"object\",\n required: [\"personalized\", \"acquisitionsUsed\"],\n properties: {\n personalized: {\n type: \"string\",\n description: \"Query letter with personalization injected.\",\n },\n acquisitionsUsed: {\n type: \"number\",\n description: \"Count of acquisitions referenced (0 = passthrough).\",\n },\n },\n },\n },\n ],\n});\n\n// ─── Prompt Template ─────────────────────────────────\n\nfunction buildPrompt(letter: string, acquisitions: AcquisitionRecord[]): string {\n const acqList = acquisitions.map((a) => `- \"${a.title}\" (${a.year})`).join(\"\\n\");\n\n return [\n \"You are a query-letter polish assistant.\",\n \"Insert ONE personalization paragraph between the salutation and the opening pitch.\",\n \"Reference 1-3 of the editor's recent acquisitions; tie them thematically to the author's manuscript.\",\n \"Keep tone professional.\",\n \"Do NOT alter any other paragraph.\",\n \"\",\n \"EDITOR'S RECENT ACQUISITIONS:\",\n acqList,\n \"\",\n \"ORIGINAL QUERY LETTER:\",\n letter,\n \"\",\n \"Return ONLY the revised letter, no commentary.\",\n ].join(\"\\n\");\n}\n\n// ─── Skill Object ────────────────────────────────────\n\nexport const queryLetterPersonalize = {\n manifest: queryLetterPersonalizeManifest,\n\n async execute(\n input: QueryLetterPersonalizeInput,\n ctx: QueryLetterPersonalizeContext,\n ): Promise<QueryLetterPersonalizeOutput> {\n // Fetch recent acquisitions via the publishers-global-v1 connector.\n // Entitlement is enforced upstream at the host-fn boundary (same as skill 4).\n const { acquisitions } = await ctx.dataApiCall({\n slug: \"publishers-global-v1\",\n op: \"editor.acquisitions\",\n params: { editorId: input.editorId, limit: 5 },\n });\n\n // Graceful fallback: no acquisitions available → return original unchanged.\n if (acquisitions.length === 0) {\n return { personalized: input.queryLetter, acquisitionsUsed: 0 };\n }\n\n // Inline LLM call — insert the personalization paragraph.\n const { text } = await ctx.llm({\n prompt: buildPrompt(input.queryLetter, acquisitions),\n });\n\n return {\n personalized: text.trim(),\n acquisitionsUsed: acquisitions.length,\n };\n },\n};\n","// ──────────────────────────────────────────────────────\n// Skill 8 — email-campaign-basic\n// Send a single-touch email campaign to a contact list.\n// executionMode: INLINE\n// Tier-included from PRO (no AIZ unlock for basic tier).\n// ──────────────────────────────────────────────────────\n\nimport { defineSkill } from \"../define-skill\";\n\n// ─── Types ───────────────────────────────────────────\n\nexport interface EmailContact {\n id: string;\n name: string;\n email: string;\n}\n\nexport interface EmailTemplate {\n subject: string;\n body: string;\n}\n\nexport interface EmailCampaignBasicInput {\n contacts: EmailContact[];\n template: EmailTemplate;\n}\n\nexport interface DeliveryReportRow {\n contactId: string;\n status: \"sent\" | \"failed\";\n messageId?: string;\n error?: string;\n}\n\nexport interface EmailCampaignBasicOutput {\n sent: number;\n failed: number;\n report: DeliveryReportRow[];\n}\n\nexport interface EmailCampaignBasicContext {\n /** Retrieve a secret credential by key name (SMTP_API_KEY, POSTMARK_TOKEN, etc.). */\n secretsGet: (key: string) => Promise<string | null>;\n /** Send an HTTP request via the host-fn boundary. */\n httpFetch: (args: {\n url: string;\n method: string;\n headers: Record<string, string>;\n body: unknown;\n }) => Promise<{ status: number; body: { messageId?: string; error?: string } }>;\n /** Email transport to use. */\n transport: \"sendgrid\" | \"postmark\" | \"smtp\";\n}\n\n// ─── Manifest ────────────────────────────────────────\n\nexport const emailCampaignBasicManifest = defineSkill({\n name: \"email-campaign-basic\",\n version: \"1.0.0\",\n description:\n \"Send a single-touch email campaign to a contact list (PRO+ tier-included). \" +\n \"Renders per-recipient template variables and reports per-contact delivery status.\",\n category: \"publishing\",\n tags: [\"email\", \"campaign\", \"outreach\"],\n tools: [\n {\n name: \"send\",\n description:\n \"Send a templated email to each contact and return per-recipient delivery status.\",\n inputSchema: {\n type: \"object\",\n required: [\"contacts\", \"template\"],\n properties: {\n contacts: {\n type: \"array\",\n minItems: 1,\n description: \"List of recipients (id, name, email).\",\n },\n template: {\n type: \"object\",\n description:\n \"Email template with subject and body (supports {{name}}, {{email}} vars).\",\n },\n },\n },\n outputSchema: {\n type: \"object\",\n required: [\"sent\", \"failed\", \"report\"],\n properties: {\n sent: { type: \"number\", description: \"Count of successfully sent emails.\" },\n failed: { type: \"number\", description: \"Count of failed deliveries.\" },\n report: {\n type: \"array\",\n description: \"Per-recipient delivery status rows.\",\n },\n },\n },\n },\n ],\n});\n\n// ─── Helpers ─────────────────────────────────────────\n\nconst TRANSPORT_URL: Record<EmailCampaignBasicContext[\"transport\"], string> = {\n sendgrid: \"https://api.sendgrid.com/v3/mail/send\",\n postmark: \"https://api.postmarkapp.com/email\",\n smtp: \"https://smtp.example/send\",\n};\n\nconst TRANSPORT_SECRET_KEY: Record<EmailCampaignBasicContext[\"transport\"], string> = {\n sendgrid: \"SMTP_API_KEY\",\n postmark: \"POSTMARK_TOKEN\",\n smtp: \"SMTP_API_KEY\",\n};\n\n/** Render simple {{var}} template variables. */\nfunction render(tpl: string, vars: Record<string, string>): string {\n return tpl.replace(/{{\\s*(\\w+)\\s*}}/g, (_, k) => vars[k] ?? \"\");\n}\n\n// ─── Skill Object ────────────────────────────────────\n\nexport const emailCampaignBasic = {\n manifest: emailCampaignBasicManifest,\n\n async execute(\n input: EmailCampaignBasicInput,\n ctx: EmailCampaignBasicContext,\n ): Promise<EmailCampaignBasicOutput> {\n const secretKey = TRANSPORT_SECRET_KEY[ctx.transport];\n const apiKey = await ctx.secretsGet(secretKey);\n if (!apiKey) {\n throw new Error(`Missing transport credentials: secret \"${secretKey}\" not found`);\n }\n\n const report: DeliveryReportRow[] = [];\n\n for (const contact of input.contacts) {\n const vars: Record<string, string> = { name: contact.name, email: contact.email };\n const resp = await ctx.httpFetch({\n url: TRANSPORT_URL[ctx.transport],\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: {\n to: contact.email,\n subject: render(input.template.subject, vars),\n body: render(input.template.body, vars),\n },\n });\n\n const ok = resp.status >= 200 && resp.status < 300;\n if (ok) {\n report.push({ contactId: contact.id, status: \"sent\", messageId: resp.body.messageId });\n } else {\n report.push({\n contactId: contact.id,\n status: \"failed\",\n error: resp.body.error ?? `HTTP ${resp.status}`,\n });\n }\n }\n\n return {\n sent: report.filter((r) => r.status === \"sent\").length,\n failed: report.filter((r) => r.status === \"failed\").length,\n report,\n };\n },\n};\n","// ──────────────────────────────────────────────────────\n// Skill 9 — email-campaign-advanced\n// Orchestrated multi-touch A/B email campaign with\n// deliverability optimisation, open-rate tracking, and\n// follow-up sequencing.\n// executionMode: INLINE\n// AIZ unlock: 200 (entitlement-gated via checkEntitlement)\n// ──────────────────────────────────────────────────────\n\nimport { defineSkill } from \"../define-skill\";\n\n// ─── Types ───────────────────────────────────────────\n\nexport interface EmailCampaignAdvancedInput {\n contacts: { id: string; name: string; email: string }[];\n baseTemplate: { subject: string; body: string };\n /** 1–4 alternative subject lines to A/B test. */\n abSubjectVariants: string[];\n sequencingRules: { touches: number; waitDays: number };\n}\n\nexport interface CampaignVariant {\n subject: string;\n recipientCount: number;\n}\n\nexport interface EmailCampaignAdvancedOutput {\n variants: CampaignVariant[];\n touches: number;\n totalSent: number;\n}\n\nexport interface EmailCampaignAdvancedContext {\n /** Entitlement gate — must resolve `unlocked: true` or the skill throws ENTITLEMENT_DENIED. */\n checkEntitlement: (ref: { type: \"SKILL\"; refId: string }) => Promise<{ unlocked: boolean }>;\n /** Data API call (deliverability platform, open-rate tracker, etc.) */\n dataApiCall: (args: {\n slug: string;\n op: string;\n params: Record<string, unknown>;\n }) => Promise<unknown>;\n /** Knowledge-base read — used to pull sequencing best-practice playbook. */\n kbRead: (args: { slug: string; query: string }) => Promise<{ content: string }>;\n /** Internal agent chat — used to ping the manager with campaign progress. */\n chatSend: (args: { agentId: string; channel: string; text: string }) => Promise<void>;\n /** Sleep helper (takes milliseconds). Injected so tests stay synchronous. */\n sleep: (ms: number) => Promise<void>;\n /** Workspace owning this campaign run. */\n workspaceId: string;\n /** Agent ID to notify with campaign progress updates. */\n managerAgentId: string;\n}\n\n// ─── Manifest ────────────────────────────────────────\n\nexport const emailCampaignAdvancedManifest = defineSkill({\n name: \"email-campaign-advanced\",\n version: \"1.0.0\",\n description:\n \"Orchestrated multi-touch email campaign with A/B subject-line variants, \" +\n \"deliverability optimisation, open-rate tracking, and follow-up sequencing. \" +\n \"Requires AIZ unlock 200.\",\n category: \"publishing\",\n tags: [\"email\", \"campaign\", \"ab-testing\", \"sequencing\", \"premium\"],\n tools: [\n {\n name: \"orchestrate\",\n description:\n \"Run an A/B-tested multi-touch outreach sequence; ping the manager after each touch.\",\n inputSchema: {\n type: \"object\",\n required: [\"contacts\", \"baseTemplate\", \"abSubjectVariants\", \"sequencingRules\"],\n properties: {\n contacts: {\n type: \"array\",\n minItems: 1,\n description: \"List of recipients (id, name, email).\",\n },\n baseTemplate: {\n type: \"object\",\n description: \"Base email template with subject and body.\",\n },\n abSubjectVariants: {\n type: \"array\",\n minItems: 1,\n maxItems: 4,\n description: \"Alternative subject lines for A/B testing (1–4).\",\n },\n sequencingRules: {\n type: \"object\",\n description: \"Number of touches and wait days between touches.\",\n },\n },\n },\n outputSchema: {\n type: \"object\",\n required: [\"variants\", \"touches\", \"totalSent\"],\n properties: {\n variants: {\n type: \"array\",\n description: \"Per-variant recipient distribution.\",\n },\n touches: {\n type: \"number\",\n description: \"Total number of campaign touches executed.\",\n },\n totalSent: {\n type: \"number\",\n description: \"Aggregate send count across all touches and variants.\",\n },\n },\n },\n },\n ],\n metadata: {\n aizUnlockRequired: 200,\n },\n});\n\n// ─── Skill Object ────────────────────────────────────\n\nexport const emailCampaignAdvanced = {\n manifest: emailCampaignAdvancedManifest,\n\n async execute(\n input: EmailCampaignAdvancedInput,\n ctx: EmailCampaignAdvancedContext,\n ): Promise<EmailCampaignAdvancedOutput> {\n // ── Entitlement gate ──────────────────────────────\n const ent = await ctx.checkEntitlement({ type: \"SKILL\", refId: \"email-campaign-advanced\" });\n if (!ent.unlocked) {\n throw new Error(\"ENTITLEMENT_DENIED: email-campaign-advanced not unlocked for workspace\");\n }\n\n // ── Pull sequencing playbook from KB ─────────────\n await ctx.kbRead({\n slug: \"publishing-industry-knowledge\",\n query: \"email sequencing best practices\",\n });\n\n // ── Partition contacts across A/B variants ────────\n const N = input.abSubjectVariants.length;\n const variants: CampaignVariant[] = input.abSubjectVariants.map((subject, idx) => ({\n subject,\n recipientCount: input.contacts.filter((_, i) => i % N === idx).length,\n }));\n\n // ── Multi-touch send loop ─────────────────────────\n let totalSent = 0;\n const { touches, waitDays } = input.sequencingRules;\n\n for (let touch = 0; touch < touches; touch++) {\n // Dispatch via deliverability data-api\n await ctx.dataApiCall({\n slug: \"deliverability-v1\",\n op: \"send\",\n params: {\n workspaceId: ctx.workspaceId,\n variants,\n contacts: input.contacts,\n touchIndex: touch,\n },\n });\n\n totalSent += input.contacts.length;\n\n // Ping the manager after every touch\n await ctx.chatSend({\n agentId: ctx.managerAgentId,\n channel: \"publishing\",\n text: `Campaign touch ${touch + 1}/${touches} dispatched (${input.contacts.length} recipients, ${N} variants)`,\n });\n\n // Wait between touches (skip after the final touch)\n if (touch < touches - 1) {\n await ctx.sleep(waitDays * 86_400_000);\n }\n }\n\n return { variants, touches, totalSent };\n },\n};\n","// ──────────────────────────────────────────────────────\n// Skill 10 — author-bio-generate\n// Generates 50w / 150w / 300w author bios plus a\n// headshot prompt from a freeform author background.\n// executionMode: INLINE (single LLM call, no external deps)\n// ──────────────────────────────────────────────────────\n\nimport { defineSkill } from \"../define-skill\";\n\n// ─── Types ───────────────────────────────────────────\n\nexport interface AuthorBioGenerateInput {\n /** Freeform author background (credentials, genre, milestones, tone notes, etc.). Min 20 chars. */\n background: string;\n}\n\nexport interface AuthorBioGenerateOutput {\n /** Approximately 50-word third-person bio. */\n bio50: string;\n /** Approximately 150-word third-person bio. */\n bio150: string;\n /** Approximately 300-word third-person bio. */\n bio300: string;\n /** Stable-diffusion-style headshot prompt (20-40 words). */\n headshotPrompt: string;\n}\n\nexport interface AuthorBioGenerateContext {\n /** Inline LLM call — injected so tests can mock without I/O. */\n llm: (args: { prompt: string }) => Promise<{ text: string }>;\n}\n\n// ─── Prompt template ─────────────────────────────────\n\nconst PROMPT = (background: string) => `\\\nYou are a publishing-industry copywriter specialising in author branding.\nGiven the author background below, emit FOUR labelled sections in the EXACT format shown.\nDo NOT add any other commentary, headings, or preamble — output only the four labelled sections.\n\nBIO_50W: <approximately 50 words ±10%, third-person, present tense>\n\nBIO_150W: <approximately 150 words ±10%, third-person, present tense, suitable for a book jacket>\n\nBIO_300W: <approximately 300 words ±10%, third-person, present tense, suitable for a press kit or festival programme>\n\nHEADSHOT_PROMPT: <a single sentence stable-diffusion-style portrait prompt, 20-40 words, beginning with \"Professional author headshot of\">\n\nAUTHOR BACKGROUND:\n${background}`;\n\n// ─── Parser ───────────────────────────────────────────\n\n/**\n * Extracts the text following a labelled section header.\n * Matches everything between the label and the next label (or end of string).\n * Note: label character class includes digits ([A-Z0-9_]) because labels such as\n * BIO_50W and BIO_150W contain numeric characters.\n */\nconst extract = (label: string, text: string): string =>\n text.match(new RegExp(`${label}:\\\\s*([\\\\s\\\\S]*?)(?=\\\\n[A-Z0-9_]+:|$)`))?.[1]?.trim() ?? \"\";\n\n// ─── Manifest ────────────────────────────────────────\n\nexport const authorBioGenerateManifest = defineSkill({\n name: \"author-bio-generate\",\n version: \"1.0.0\",\n description:\n \"Generate three author bios (50w, 150w, 300w) plus a headshot prompt from a \" +\n \"freeform author background. Single inline LLM call — no external data sources required.\",\n category: \"publishing\",\n tags: [\"bio\", \"author\", \"copywriting\", \"inline-llm\"],\n tools: [\n {\n name: \"generate\",\n description:\n \"Emit three bio lengths (50w / 150w / 300w) plus a stable-diffusion headshot prompt \" +\n \"from the provided author background text.\",\n inputSchema: {\n type: \"object\",\n required: [\"background\"],\n properties: {\n background: {\n type: \"string\",\n minLength: 20,\n description:\n \"Freeform author background: genre, credentials, awards, forthcoming works, tone notes.\",\n },\n },\n },\n outputSchema: {\n type: \"object\",\n required: [\"bio50\", \"bio150\", \"bio300\", \"headshotPrompt\"],\n properties: {\n bio50: { type: \"string\", description: \"~50-word third-person bio.\" },\n bio150: { type: \"string\", description: \"~150-word third-person bio.\" },\n bio300: { type: \"string\", description: \"~300-word third-person bio.\" },\n headshotPrompt: {\n type: \"string\",\n description: \"Stable-diffusion portrait prompt (20-40 words).\",\n },\n },\n },\n },\n ],\n metadata: {\n executionMode: \"INLINE\",\n },\n});\n\n// ─── Skill Object ────────────────────────────────────\n\nexport const authorBioGenerate = {\n manifest: authorBioGenerateManifest,\n\n async execute(\n input: AuthorBioGenerateInput,\n ctx: AuthorBioGenerateContext,\n ): Promise<AuthorBioGenerateOutput> {\n const { text } = await ctx.llm({ prompt: PROMPT(input.background) });\n\n return {\n bio50: extract(\"BIO_50W\", text),\n bio150: extract(\"BIO_150W\", text),\n bio300: extract(\"BIO_300W\", text),\n headshotPrompt: extract(\"HEADSHOT_PROMPT\", text),\n };\n },\n};\n","// ──────────────────────────────────────────────────────\n// Skill 11 — comp-title-finder\n// Find top 5 comparable titles with sales data + critical\n// reception via PublishersGlobal DataApi.\n// executionMode: INLINE (DataApi call, AIZ-200 unlock)\n// Same AIZ-200 unlock as publisher-database-search (skill 4).\n// Bundle: publisher-research-toolkit-v1 satisfies both.\n// ──────────────────────────────────────────────────────\n\nimport { defineSkill } from \"../define-skill\";\n\n// ─── Types ───────────────────────────────────────────\n\nexport interface CompTitleFinderInput {\n title: string;\n genre: string;\n themes: string[];\n wordCount: number;\n}\n\nexport interface CompTitle {\n title: string;\n author: string;\n salesUnits: number;\n criticalScore: number;\n}\n\nexport interface CompTitleFinderOutput {\n titles: CompTitle[];\n bundleSatisfied?: string;\n}\n\nexport interface CompTitleFinderContext {\n dataApiCall: (args: {\n slug: string;\n op: string;\n params: Record<string, unknown>;\n }) => Promise<{ titles: CompTitle[] }>;\n checkEntitlement: (ref: {\n type: \"DATA_API\" | \"BUNDLE\";\n refId: string;\n }) => Promise<{ unlocked: boolean; bundleId?: string }>;\n workspaceId: string;\n}\n\n// ─── Manifest ────────────────────────────────────────\n\nexport const compTitleFinderManifest = defineSkill({\n name: \"comp-title-finder\",\n version: \"1.0.0\",\n description:\n \"Find top 5 comparable titles with sales data + critical reception via PublishersGlobal. \" +\n \"AIZ-unlock required (200 AIZ); publisher-research-toolkit-v1 bundle satisfies both this skill \" +\n \"and publisher-database-search (skill 4).\",\n category: \"publishing\",\n tags: [\"research\", \"comp-titles\", \"publishers-global\"],\n tools: [\n {\n name: \"find\",\n description: \"Query PublishersGlobal for comparable titles.\",\n inputSchema: {\n type: \"object\",\n required: [\"title\", \"genre\", \"themes\", \"wordCount\"],\n properties: {\n title: { type: \"string\" },\n genre: { type: \"string\" },\n themes: { type: \"array\", items: { type: \"string\" } },\n wordCount: { type: \"integer\", minimum: 5_000 },\n },\n },\n outputSchema: {\n type: \"object\",\n required: [\"titles\"],\n properties: {\n titles: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n title: { type: \"string\" },\n author: { type: \"string\" },\n salesUnits: { type: \"integer\" },\n criticalScore: { type: \"number\" },\n },\n },\n },\n bundleSatisfied: { type: \"string\" },\n },\n },\n },\n ],\n metadata: {\n executionMode: \"INLINE\",\n dataApi: \"publishers-global-v1\",\n entitlement: {\n kind: \"DATA_API\",\n id: \"publishers-global-v1\",\n aizUnlockCost: 200,\n perCallMeter: 4,\n bundle: \"publisher-research-toolkit-v1\",\n },\n },\n});\n\n// ─── Skill Object ────────────────────────────────────\n\nexport const compTitleFinder = {\n manifest: compTitleFinderManifest,\n\n async execute(\n input: CompTitleFinderInput,\n ctx: CompTitleFinderContext,\n ): Promise<CompTitleFinderOutput> {\n // AIZ-200 unlock check — same gate as publisher-database-search.\n // publisher-research-toolkit-v1 BUNDLE satisfies both skills.\n const ent = await ctx.checkEntitlement({\n type: \"DATA_API\",\n refId: \"publishers-global-v1\",\n });\n\n if (!ent.unlocked) {\n throw new Error(\"ENTITLEMENT_DENIED: publishers-global-v1 not unlocked\");\n }\n\n const { titles } = await ctx.dataApiCall({\n slug: \"publishers-global-v1\",\n op: \"comp-titles.search\",\n params: {\n genre: input.genre,\n themes: input.themes,\n wordCountRange: [Math.floor(input.wordCount * 0.7), Math.ceil(input.wordCount * 1.3)],\n limit: 5,\n },\n });\n\n // Rank by combined signal: criticalScore × salesUnits (popularity × quality).\n // Take top 5 (DataApi may return more if caller raised limit).\n const top5 = [...titles]\n .sort((a, b) => b.criticalScore * b.salesUnits - a.criticalScore * a.salesUnits)\n .slice(0, 5);\n\n return {\n titles: top5,\n bundleSatisfied: ent.bundleId,\n };\n },\n};\n","// ──────────────────────────────────────────────────────\n// Skill 12 — submission-tracker\n// Track every submission in a campaign with timeline\n// visualization data ordered by createdAt.\n// executionMode: INLINE (WorkspaceMessage + MeteredUsage)\n// ──────────────────────────────────────────────────────\n\nimport { defineSkill } from \"../define-skill\";\n\n// ─── Types ───────────────────────────────────────────\n\nexport type SubmissionStatus = \"sent\" | \"received\" | \"under-review\" | \"accepted\" | \"rejected\";\n\nexport interface SubmissionTimelineEntry {\n status: SubmissionStatus;\n at: Date;\n messageId: string;\n}\n\nexport interface SubmissionRecord {\n submissionId: string;\n currentStatus: SubmissionStatus;\n timeline: SubmissionTimelineEntry[];\n}\n\nexport interface SubmissionTrackerOutput {\n submissions: SubmissionRecord[];\n totalSends: number;\n}\n\nexport interface SubmissionTrackerInput {\n campaignId: string;\n}\n\nexport interface SubmissionTrackerContext {\n queryMessages: (args: {\n campaignId: string;\n workspaceId: string;\n }) => Promise<\n Array<{\n id: string;\n channelId: string;\n metadata: { submissionId?: string; status?: SubmissionStatus };\n createdAt: Date;\n }>\n >;\n queryUsage: (args: {\n campaignId: string;\n }) => Promise<Array<{ skillRef: string; count: number }>>;\n kbRead: (args: { slug: string; query: string }) => Promise<{ content: string }>;\n workspaceId: string;\n}\n\n// ─── Manifest ────────────────────────────────────────\n\nexport const submissionTrackerManifest = defineSkill({\n name: \"submission-tracker\",\n version: \"1.0.0\",\n description:\n \"Track every submission in a campaign with timeline visualization data. \" +\n \"Aggregates WorkspaceMessage events and MeteredUsage by submissionId; \" +\n \"timeline entries are ordered by createdAt ascending.\",\n category: \"publishing\",\n tags: [\"tracking\", \"timeline\", \"campaign\"],\n tools: [\n {\n name: \"track\",\n description: \"Aggregate WorkspaceMessage + MeteredUsage by submissionId.\",\n inputSchema: {\n type: \"object\",\n required: [\"campaignId\"],\n properties: {\n campaignId: { type: \"string\" },\n },\n },\n outputSchema: {\n type: \"object\",\n required: [\"submissions\", \"totalSends\"],\n properties: {\n submissions: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n submissionId: { type: \"string\" },\n currentStatus: {\n type: \"string\",\n enum: [\"sent\", \"received\", \"under-review\", \"accepted\", \"rejected\"],\n },\n timeline: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n status: { type: \"string\" },\n at: { type: \"string\", format: \"date-time\" },\n messageId: { type: \"string\" },\n },\n },\n },\n },\n },\n },\n totalSends: { type: \"integer\" },\n },\n },\n },\n ],\n metadata: {\n executionMode: \"INLINE\",\n },\n});\n\n// ─── Skill Object ────────────────────────────────────\n\nexport const submissionTracker = {\n manifest: submissionTrackerManifest,\n\n async execute(\n input: SubmissionTrackerInput,\n ctx: SubmissionTrackerContext,\n ): Promise<SubmissionTrackerOutput> {\n // Fetch messages + usage in parallel; also warm the submission-history KB entry.\n const [messages, usage] = await Promise.all([\n ctx.queryMessages({ campaignId: input.campaignId, workspaceId: ctx.workspaceId }),\n ctx.queryUsage({ campaignId: input.campaignId }),\n ]);\n await ctx.kbRead({ slug: \"submission-history\", query: input.campaignId });\n\n // Group timeline entries by submissionId.\n const grouped = new Map<string, SubmissionTimelineEntry[]>();\n for (const m of messages) {\n const id = m.metadata.submissionId;\n const status = m.metadata.status;\n if (!id || !status) continue;\n const entries = grouped.get(id) ?? [];\n entries.push({ status, at: m.createdAt, messageId: m.id });\n grouped.set(id, entries);\n }\n\n // Sort each submission's timeline ascending by createdAt; derive currentStatus from last entry.\n const submissions: SubmissionRecord[] = [...grouped.entries()].map(\n ([submissionId, timeline]) => {\n timeline.sort((a, b) => a.at.getTime() - b.at.getTime());\n return {\n submissionId,\n currentStatus: (timeline[timeline.length - 1] as SubmissionTimelineEntry).status,\n timeline,\n };\n },\n );\n\n // totalSends = sum of MeteredUsage rows whose skillRef begins with \"email-campaign\".\n const totalSends = usage.reduce(\n (acc, u) => acc + (u.skillRef.startsWith(\"email-campaign\") ? u.count : 0),\n 0,\n );\n\n return { submissions, totalSends };\n },\n};\n","// ──────────────────────────────────────────────────────\n// ADK Artifact Store — Persistence for A2UI artifacts\n// ──────────────────────────────────────────────────────\n\nimport type { UIArtifactPart } from \"../types/content\";\n\n/** Stored artifact with metadata */\nexport interface Artifact {\n id: string;\n title: string;\n kind: \"html\" | \"react\" | \"svg\" | \"markdown\" | \"code\";\n content: string;\n css?: string;\n language?: string;\n version: number;\n createdAt: number;\n updatedAt: number;\n agentName: string;\n runId: string;\n}\n\n/**\n * In-memory artifact store. Persists artifacts created by agents\n * during runs. Supports versioning (upsert bumps version).\n */\nexport class ArtifactStore {\n private artifacts = new Map<string, Artifact>();\n\n /** Create or update an artifact from a UIArtifactPart */\n upsert(part: UIArtifactPart, agentName: string, runId: string): Artifact {\n const existing = this.artifacts.get(part.artifactId);\n const now = Date.now();\n\n const artifact: Artifact = {\n id: part.artifactId,\n title: part.title,\n kind: part.kind,\n content: part.content,\n css: part.css,\n language: part.language,\n version: existing ? existing.version + 1 : part.version,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n agentName,\n runId,\n };\n\n this.artifacts.set(part.artifactId, artifact);\n return artifact;\n }\n\n /** Get a specific artifact by ID */\n get(artifactId: string): Artifact | undefined {\n return this.artifacts.get(artifactId);\n }\n\n /** Get all artifacts for a specific run */\n getByRun(runId: string): Artifact[] {\n return Array.from(this.artifacts.values()).filter((a) => a.runId === runId);\n }\n\n /** Get all stored artifacts */\n getAll(): Artifact[] {\n return Array.from(this.artifacts.values());\n }\n\n /** Clear all artifacts */\n clear(): void {\n this.artifacts.clear();\n }\n\n /** Get the number of stored artifacts */\n get size(): number {\n return this.artifacts.size;\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Artifact Tool — Built-in tool for agents to create A2UI artifacts\n// ──────────────────────────────────────────────────────\n\nimport type { UIArtifactPart } from \"../types/content\";\nimport type { ToolContext, ToolDef } from \"../types/tool\";\nimport type { ArtifactStore } from \"./artifact-store\";\n\nlet artifactCounter = 0;\n\n/**\n * Create the built-in `create_artifact` tool.\n * When an agent calls this tool, it creates a UIArtifactPart\n * and optionally persists it to an ArtifactStore.\n */\nexport function createArtifactTool(store?: ArtifactStore): ToolDef {\n return {\n name: \"create_artifact\",\n description:\n \"Create a visual artifact (HTML page, SVG, code block, or markdown document) that will be rendered in the user's browser. Use this when the user asks for visual output, charts, interactive demos, or formatted code.\",\n inputSchema: {\n type: \"object\",\n properties: {\n title: {\n type: \"string\",\n description: \"Title for the artifact\",\n },\n kind: {\n type: \"string\",\n enum: [\"html\", \"react\", \"svg\", \"markdown\", \"code\"],\n description:\n \"Type of artifact: html (full page), react (JSX component), svg (vector graphic), markdown (formatted text), code (syntax-highlighted code block)\",\n },\n content: {\n type: \"string\",\n description:\n \"The content of the artifact. For html: full HTML with inline CSS/JS. For code: the source code. For svg: SVG markup.\",\n },\n language: {\n type: \"string\",\n description: \"Programming language (for code kind only)\",\n },\n css: {\n type: \"string\",\n description: \"Optional CSS styles (for html kind)\",\n },\n },\n required: [\"title\", \"kind\", \"content\"],\n },\n execute: async (rawInput: unknown, ctx: ToolContext) => {\n const input = rawInput as {\n title: string;\n kind: \"html\" | \"react\" | \"svg\" | \"markdown\" | \"code\";\n content: string;\n language?: string;\n css?: string;\n };\n\n const artifactId = `artifact-${++artifactCounter}-${Date.now()}`;\n\n const part: UIArtifactPart = {\n type: \"ui_artifact\",\n artifactId,\n version: 1,\n title: input.title,\n kind: input.kind,\n content: input.content,\n language: input.language,\n css: input.css,\n };\n\n // Persist if store is available\n if (store) {\n store.upsert(part, ctx.agentName, ctx.runContext.runId);\n }\n\n return {\n artifactId,\n version: 1,\n title: input.title,\n kind: input.kind,\n };\n },\n };\n}\n","// ──────────────────────────────────────────────────────\n// ADK Embedding Service — Standalone embedding generation\n// ──────────────────────────────────────────────────────\n// Uses fetch() for HTTP calls (no external dependencies).\n// Falls back to a deterministic hash-based pseudo-embedding\n// when no API key is configured (useful for testing).\n// ──────────────────────────────────────────────────────\n\nimport type { EmbedApiResponse, EmbeddingConfig } from \"./types\";\n\n/** Default embedding dimensions for the hash-based fallback */\nconst HASH_EMBEDDING_DIMS = 1536;\n\n/** Default OpenAI embedding model */\nconst DEFAULT_OPENAI_MODEL = \"text-embedding-3-small\";\n\n/** Default OpenAI embedding API endpoint */\nconst DEFAULT_OPENAI_BASE_URL = \"https://api.openai.com/v1\";\n\nexport class EmbeddingService {\n private readonly provider: string;\n private readonly model: string;\n private readonly apiKey?: string;\n private readonly baseUrl: string;\n private readonly dimensions: number;\n\n constructor(config: EmbeddingConfig = {}) {\n this.provider = config.provider ?? \"openai\";\n this.model = config.model ?? DEFAULT_OPENAI_MODEL;\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl ?? DEFAULT_OPENAI_BASE_URL;\n this.dimensions = config.dimensions ?? HASH_EMBEDDING_DIMS;\n }\n\n /**\n * Generate embeddings for one or more texts.\n * If no API key is configured, falls back to hash-based pseudo-embeddings.\n */\n async embed(texts: string[]): Promise<number[][]> {\n if (!this.apiKey) {\n return texts.map((text) => this.hashEmbed(text));\n }\n\n if (this.provider === \"openai\") {\n return this.embedOpenAI(texts);\n }\n\n // Future: support additional providers here\n throw new Error(`Unsupported embedding provider: ${this.provider}`);\n }\n\n /**\n * Generate a single embedding for a text string.\n * Convenience wrapper around embed().\n */\n async embedSingle(text: string): Promise<number[]> {\n const results = await this.embed([text]);\n return results[0]!;\n }\n\n /** Whether the service has a real embedding provider configured */\n get isConfigured(): boolean {\n return !!this.apiKey;\n }\n\n // ─── OpenAI Embedding API ────────────────────────────\n\n private async embedOpenAI(texts: string[]): Promise<number[][]> {\n const url = `${this.baseUrl}/embeddings`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n input: texts,\n model: this.model,\n encoding_format: \"float\",\n }),\n });\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => \"unknown error\");\n throw new Error(`Embedding API error (${response.status}): ${errorBody}`);\n }\n\n const data = (await response.json()) as {\n data: Array<{ embedding: number[]; index: number }>;\n model: string;\n usage: { prompt_tokens: number; total_tokens: number };\n };\n\n // Sort by index to ensure correct order\n const sorted = data.data.sort((a, b) => a.index - b.index);\n return sorted.map((item) => item.embedding);\n }\n\n // ─── Hash-based pseudo-embedding (no API key) ────────\n\n /**\n * Deterministic hash-based pseudo-embedding for testing.\n * Produces a normalized vector of the configured dimension.\n * NOT suitable for production semantic search — only for\n * development/testing when no embedding API is available.\n */\n private hashEmbed(text: string): number[] {\n const dims = this.dimensions;\n const embedding = new Array<number>(dims);\n\n // Use a simple hash function to seed the embedding\n let hash = 0;\n for (let i = 0; i < text.length; i++) {\n const char = text.charCodeAt(i);\n hash = ((hash << 5) - hash + char) | 0;\n }\n\n // Generate deterministic pseudo-random values from the hash\n let seed = hash;\n for (let i = 0; i < dims; i++) {\n // xorshift32\n seed ^= seed << 13;\n seed ^= seed >> 17;\n seed ^= seed << 5;\n embedding[i] = (seed / 0x7fffffff) * 2 - 1; // normalize to [-1, 1]\n }\n\n // L2 normalize the vector\n let norm = 0;\n for (let i = 0; i < dims; i++) {\n norm += embedding[i]! * embedding[i]!;\n }\n norm = Math.sqrt(norm);\n if (norm > 0) {\n for (let i = 0; i < dims; i++) {\n embedding[i] = embedding[i]! / norm;\n }\n }\n\n return embedding;\n }\n\n /**\n * Create an EmbedApiResponse from raw embedding results.\n * Useful for callers that need the full response shape.\n */\n async embedWithResponse(texts: string[]): Promise<EmbedApiResponse> {\n const embeddings = await this.embed(texts);\n return {\n embeddings,\n model: this.apiKey ? this.model : \"hash-pseudo-embedding\",\n usage: {\n totalTokens: texts.reduce((sum, t) => sum + Math.ceil(t.length / 4), 0),\n },\n };\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Memory Manager — High-level memory operations\n// ──────────────────────────────────────────────────────\n// Orchestrates the MemoryBackend and EmbeddingService to\n// provide store, search, context injection, extraction,\n// and decay operations for agent long-term memory.\n// ──────────────────────────────────────────────────────\n\nimport type { EmbeddingService } from \"./embedding\";\nimport type { MemoryBackend, MemoryEntry, MemorySearchResult, MemoryType } from \"./types\";\n\n/** Configuration for the MemoryManager */\nexport interface MemoryManagerConfig {\n /** Default search result limit */\n defaultSearchLimit?: number;\n /** Default similarity threshold (0-1) for search results */\n defaultThreshold?: number;\n /** Maximum number of memories to inject into context */\n maxContextMemories?: number;\n /** Whether to automatically extract and store facts from conversations */\n autoExtract?: boolean;\n}\n\n/** Default configuration values */\nconst DEFAULTS: Required<MemoryManagerConfig> = {\n defaultSearchLimit: 10,\n defaultThreshold: 0.3,\n maxContextMemories: 5,\n autoExtract: false,\n};\n\nexport class MemoryManager {\n private readonly backend: MemoryBackend;\n private readonly embedding: EmbeddingService;\n private readonly config: Required<MemoryManagerConfig>;\n\n constructor(\n backend: MemoryBackend,\n embeddingService: EmbeddingService,\n config: MemoryManagerConfig = {},\n ) {\n this.backend = backend;\n this.embedding = embeddingService;\n this.config = { ...DEFAULTS, ...config };\n }\n\n // ─── Core Operations ─────────────────────────────────\n\n /**\n * Store a new memory for an agent.\n * Embeds the content and persists it via the backend.\n */\n async storeMemory(\n agentId: string,\n content: string,\n type: MemoryType,\n metadata?: Record<string, unknown>,\n ): Promise<MemoryEntry> {\n return this.backend.store(agentId, content, type, metadata);\n }\n\n /**\n * Search agent memories by semantic similarity.\n */\n async searchMemories(\n agentId: string,\n query: string,\n limit?: number,\n threshold?: number,\n ): Promise<MemorySearchResult[]> {\n return this.backend.search(\n agentId,\n query,\n limit ?? this.config.defaultSearchLimit,\n threshold ?? this.config.defaultThreshold,\n );\n }\n\n /**\n * Recall a specific memory by id.\n */\n async recallMemory(agentId: string, memoryId: string): Promise<MemoryEntry | null> {\n return this.backend.recall(agentId, memoryId);\n }\n\n /**\n * Forget (delete) a specific memory.\n */\n async forgetMemory(agentId: string, memoryId: string): Promise<void> {\n return this.backend.forget(agentId, memoryId);\n }\n\n /**\n * Get recent memories for an agent.\n */\n async getRecentMemories(agentId: string, limit?: number): Promise<MemoryEntry[]> {\n return this.backend.getRecent(agentId, limit ?? this.config.defaultSearchLimit);\n }\n\n // ─── Context Integration ─────────────────────────────\n\n /**\n * Search for memories relevant to the current conversation messages.\n * Combines the last few messages into a query and searches for matches.\n * Returns the top N most relevant memories for context injection.\n */\n async getContextMemories(\n agentId: string,\n currentMessages: string[],\n ): Promise<MemorySearchResult[]> {\n if (currentMessages.length === 0) {\n return [];\n }\n\n // Combine the last few messages into a search query\n // Take at most the last 3 messages to keep the query focused\n const recentMessages = currentMessages.slice(-3);\n const query = recentMessages.join(\" \");\n\n return this.backend.search(\n agentId,\n query,\n this.config.maxContextMemories,\n this.config.defaultThreshold,\n );\n }\n\n /**\n * Format memory search results into a string suitable for\n * injection into a system or user prompt.\n */\n formatMemoriesForPrompt(memories: MemorySearchResult[]): string {\n if (memories.length === 0) {\n return \"\";\n }\n\n const lines = memories.map((m) => {\n const typeLabel = m.memoryType.toLowerCase().replace(\"_\", \" \");\n return `- [${typeLabel}] ${m.content} (relevance: ${(m.score * 100).toFixed(0)}%)`;\n });\n\n return `## Relevant Memories\\n${lines.join(\"\\n\")}`;\n }\n\n // ─── Extraction ──────────────────────────────────────\n\n /**\n * Parse a conversation summary and extract key facts, preferences,\n * and skills learned, storing each as a separate memory.\n *\n * The extraction uses simple heuristics to classify content:\n * - Lines starting with \"prefers\" or \"likes\" / \"dislikes\" -> PREFERENCE\n * - Lines starting with \"learned\" or \"can now\" -> SKILL_LEARNED\n * - Lines that are questions or conversation flow -> CONVERSATION\n * - Everything else -> FACT\n *\n * Returns the list of newly created memory entries.\n */\n async extractAndStore(agentId: string, conversationSummary: string): Promise<MemoryEntry[]> {\n const lines = conversationSummary\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n\n if (lines.length === 0) {\n return [];\n }\n\n const stored: MemoryEntry[] = [];\n\n for (const line of lines) {\n const type = this.classifyLine(line);\n const entry = await this.backend.store(agentId, line, type);\n stored.push(entry);\n }\n\n return stored;\n }\n\n // ─── Decay ───────────────────────────────────────────\n\n /**\n * Run memory importance decay for an agent.\n * Reduces importance scores for memories that haven't been\n * accessed recently, allowing less relevant memories to fade.\n * Returns the number of memories affected.\n */\n async runDecay(agentId: string): Promise<number> {\n return this.backend.decay(agentId);\n }\n\n // ─── Helpers ─────────────────────────────────────────\n\n /** Classify a line of text into a memory type using heuristics */\n private classifyLine(line: string): MemoryType {\n const lower = line.toLowerCase();\n\n // Preference indicators\n if (\n lower.startsWith(\"prefers\") ||\n lower.startsWith(\"likes\") ||\n lower.startsWith(\"dislikes\") ||\n lower.startsWith(\"preference:\") ||\n lower.includes(\"prefers to\") ||\n lower.includes(\"would rather\")\n ) {\n return \"PREFERENCE\";\n }\n\n // Skill / learning indicators\n if (\n lower.startsWith(\"learned\") ||\n lower.startsWith(\"can now\") ||\n lower.startsWith(\"skill:\") ||\n lower.includes(\"learned how to\") ||\n lower.includes(\"now knows\") ||\n lower.includes(\"acquired skill\")\n ) {\n return \"SKILL_LEARNED\";\n }\n\n // Conversation indicators\n if (\n lower.startsWith(\"user said\") ||\n lower.startsWith(\"asked about\") ||\n lower.startsWith(\"discussed\") ||\n lower.startsWith(\"conversation:\") ||\n lower.includes(\"talked about\") ||\n lower.endsWith(\"?\")\n ) {\n return \"CONVERSATION\";\n }\n\n // Default to fact\n return \"FACT\";\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK PgVector Memory Backend — PostgreSQL + pgvector\n// ──────────────────────────────────────────────────────\n// Uses raw SQL for vector operations via a generic database\n// client interface. The embedding column is NOT in the Prisma\n// schema — it is managed entirely via raw SQL.\n//\n// Prerequisites:\n// CREATE EXTENSION IF NOT EXISTS vector;\n// ALTER TABLE agent_memories ADD COLUMN embedding vector(1536);\n// CREATE INDEX ON agent_memories USING ivfflat (embedding vector_cosine_ops);\n// ──────────────────────────────────────────────────────\n\nimport type { EmbeddingService } from \"./embedding\";\nimport type { MemoryBackend, MemoryEntry, MemorySearchResult, MemoryType } from \"./types\";\n\n/**\n * Generic database client interface — compatible with Prisma's $queryRaw\n * but does not directly import from @aizona/db or @prisma/client.\n */\nexport interface PgVectorDatabaseClient {\n $queryRaw(sql: TemplateStringsArray, ...values: unknown[]): Promise<unknown[]>;\n}\n\n/** Raw row shape returned from PostgreSQL queries */\ninterface MemoryRow {\n id: string;\n agentId: string;\n sessionId: string | null;\n content: string;\n memoryType: MemoryType;\n importance: number;\n accessCount: number;\n lastAccessedAt: Date | null;\n expiresAt: Date | null;\n metadata: Record<string, unknown> | string;\n createdAt: Date;\n}\n\n/** Raw row shape returned from similarity search */\ninterface SearchRow extends MemoryRow {\n distance: number;\n}\n\n/** Default decay multiplier (5% reduction per decay cycle) */\nconst DECAY_FACTOR = 0.95;\n\n/** Default number of days since last access before decay applies */\nconst DECAY_STALE_DAYS = 7;\n\n/** Default similarity distance threshold */\nconst DEFAULT_THRESHOLD = 0.7;\n\n/** Default search result limit */\nconst DEFAULT_LIMIT = 10;\n\nexport class PgVectorMemoryBackend implements MemoryBackend {\n private readonly db: PgVectorDatabaseClient;\n private readonly embedding: EmbeddingService;\n private readonly decayFactor: number;\n private readonly decayStaleDays: number;\n\n constructor(\n db: PgVectorDatabaseClient,\n embeddingService: EmbeddingService,\n options?: {\n decayFactor?: number;\n decayStaleDays?: number;\n },\n ) {\n this.db = db;\n this.embedding = embeddingService;\n this.decayFactor = options?.decayFactor ?? DECAY_FACTOR;\n this.decayStaleDays = options?.decayStaleDays ?? DECAY_STALE_DAYS;\n }\n\n // ─── Store ───────────────────────────────────────────\n\n async store(\n agentId: string,\n content: string,\n type: MemoryType,\n metadata?: Record<string, unknown>,\n ): Promise<MemoryEntry> {\n // Generate embedding for the content\n const vector = await this.embedding.embedSingle(content);\n const vectorStr = `[${vector.join(\",\")}]`;\n const metadataJson = JSON.stringify(metadata ?? {});\n\n const rows = (await this.db.$queryRaw`\n INSERT INTO \"platform\".\"agent_memories\" (\n \"id\", \"agentId\", \"content\", \"memoryType\", \"importance\",\n \"accessCount\", \"metadata\", \"createdAt\", \"embedding\"\n ) VALUES (\n gen_random_uuid()::text,\n ${agentId},\n ${content},\n ${type}::\"platform\".\"MemoryType\",\n 0.5,\n 0,\n ${metadataJson}::jsonb,\n NOW(),\n ${vectorStr}::vector\n )\n RETURNING\n \"id\", \"agentId\", \"sessionId\", \"content\", \"memoryType\",\n \"importance\", \"accessCount\", \"lastAccessedAt\", \"expiresAt\",\n \"metadata\", \"createdAt\"\n `) as MemoryRow[];\n\n return this.rowToEntry(rows[0]!);\n }\n\n // ─── Search ──────────────────────────────────────────\n\n async search(\n agentId: string,\n query: string,\n limit?: number,\n threshold?: number,\n ): Promise<MemorySearchResult[]> {\n const vector = await this.embedding.embedSingle(query);\n const vectorStr = `[${vector.join(\",\")}]`;\n const maxDistance = threshold ?? DEFAULT_THRESHOLD;\n const resultLimit = limit ?? DEFAULT_LIMIT;\n\n const rows = (await this.db.$queryRaw`\n SELECT\n \"id\", \"agentId\", \"sessionId\", \"content\", \"memoryType\",\n \"importance\", \"accessCount\", \"lastAccessedAt\", \"expiresAt\",\n \"metadata\", \"createdAt\",\n (\"embedding\" <=> ${vectorStr}::vector) AS \"distance\"\n FROM \"platform\".\"agent_memories\"\n WHERE \"agentId\" = ${agentId}\n AND (\"expiresAt\" IS NULL OR \"expiresAt\" > NOW())\n AND (\"embedding\" <=> ${vectorStr}::vector) < ${maxDistance}\n ORDER BY \"distance\" ASC\n LIMIT ${resultLimit}\n `) as SearchRow[];\n\n return rows.map((row) => ({\n ...this.rowToEntry(row),\n score: 1 - row.distance, // Convert cosine distance to similarity score\n }));\n }\n\n // ─── Recall ──────────────────────────────────────────\n\n async recall(agentId: string, memoryId: string): Promise<MemoryEntry | null> {\n // Increment access count and update last accessed time\n const rows = (await this.db.$queryRaw`\n UPDATE \"platform\".\"agent_memories\"\n SET \"accessCount\" = \"accessCount\" + 1,\n \"lastAccessedAt\" = NOW()\n WHERE \"id\" = ${memoryId}\n AND \"agentId\" = ${agentId}\n RETURNING\n \"id\", \"agentId\", \"sessionId\", \"content\", \"memoryType\",\n \"importance\", \"accessCount\", \"lastAccessedAt\", \"expiresAt\",\n \"metadata\", \"createdAt\"\n `) as MemoryRow[];\n\n if (rows.length === 0) {\n return null;\n }\n\n return this.rowToEntry(rows[0]!);\n }\n\n // ─── Forget ──────────────────────────────────────────\n\n async forget(agentId: string, memoryId: string): Promise<void> {\n await this.db.$queryRaw`\n DELETE FROM \"platform\".\"agent_memories\"\n WHERE \"id\" = ${memoryId}\n AND \"agentId\" = ${agentId}\n `;\n }\n\n // ─── Get Recent ──────────────────────────────────────\n\n async getRecent(agentId: string, limit: number): Promise<MemoryEntry[]> {\n const rows = (await this.db.$queryRaw`\n SELECT\n \"id\", \"agentId\", \"sessionId\", \"content\", \"memoryType\",\n \"importance\", \"accessCount\", \"lastAccessedAt\", \"expiresAt\",\n \"metadata\", \"createdAt\"\n FROM \"platform\".\"agent_memories\"\n WHERE \"agentId\" = ${agentId}\n AND (\"expiresAt\" IS NULL OR \"expiresAt\" > NOW())\n ORDER BY \"createdAt\" DESC\n LIMIT ${limit}\n `) as MemoryRow[];\n\n return rows.map((row) => this.rowToEntry(row));\n }\n\n // ─── Decay ───────────────────────────────────────────\n\n async decay(agentId: string): Promise<number> {\n const staleDays = this.decayStaleDays;\n const factor = this.decayFactor;\n\n const result = (await this.db.$queryRaw`\n UPDATE \"platform\".\"agent_memories\"\n SET \"importance\" = \"importance\" * ${factor}\n WHERE \"agentId\" = ${agentId}\n AND (\n \"lastAccessedAt\" IS NULL\n OR \"lastAccessedAt\" < NOW() - INTERVAL '1 day' * ${staleDays}\n )\n AND \"importance\" > 0.01\n RETURNING \"id\"\n `) as Array<{ id: string }>;\n\n return result.length;\n }\n\n // ─── Helpers ─────────────────────────────────────────\n\n private rowToEntry(row: MemoryRow): MemoryEntry {\n return {\n id: row.id,\n agentId: row.agentId,\n sessionId: row.sessionId ?? undefined,\n content: row.content,\n memoryType: row.memoryType,\n importance: row.importance,\n accessCount: row.accessCount,\n lastAccessedAt: row.lastAccessedAt ?? undefined,\n expiresAt: row.expiresAt ?? undefined,\n metadata:\n typeof row.metadata === \"string\"\n ? (JSON.parse(row.metadata) as Record<string, unknown>)\n : row.metadata,\n createdAt: row.createdAt,\n };\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK In-Memory Shared Store\n// ──────────────────────────────────────────────────────\n// A lightweight, in-process implementation of the\n// SharedMemoryStore interface. Supports TTL-based expiry.\n// Suitable for development, testing, and single-process\n// deployments. For production multi-process setups,\n// implement SharedMemoryStore backed by Redis or a DB.\n// ──────────────────────────────────────────────────────\n\nimport type { SharedMemoryEntry, SharedMemoryNamespace, SharedMemoryStore } from \"./shared-memory\";\n\nexport class InMemorySharedStore implements SharedMemoryStore {\n private store = new Map<string, SharedMemoryEntry>();\n\n private makeKey(ns: SharedMemoryNamespace, key: string): string {\n return `${ns.scope}:${ns.scopeId}:${ns.namespace}:${key}`;\n }\n\n async get(ns: SharedMemoryNamespace, key: string): Promise<unknown | null> {\n const fullKey = this.makeKey(ns, key);\n const entry = this.store.get(fullKey);\n if (!entry) return null;\n if (entry.expiresAt && entry.expiresAt < new Date()) {\n this.store.delete(fullKey);\n return null;\n }\n return entry.value;\n }\n\n async set(ns: SharedMemoryNamespace, key: string, value: unknown, ttlMs?: number): Promise<void> {\n const fullKey = this.makeKey(ns, key);\n this.store.set(fullKey, {\n key,\n value,\n createdAt: this.store.get(fullKey)?.createdAt ?? new Date(),\n updatedAt: new Date(),\n expiresAt: ttlMs ? new Date(Date.now() + ttlMs) : undefined,\n });\n }\n\n async delete(ns: SharedMemoryNamespace, key: string): Promise<void> {\n this.store.delete(this.makeKey(ns, key));\n }\n\n async list(ns: SharedMemoryNamespace, prefix?: string): Promise<string[]> {\n const nsPrefix = `${ns.scope}:${ns.scopeId}:${ns.namespace}:`;\n const keys: string[] = [];\n for (const [fullKey, entry] of this.store) {\n if (!fullKey.startsWith(nsPrefix)) continue;\n if (entry.expiresAt && entry.expiresAt < new Date()) continue;\n const shortKey = fullKey.slice(nsPrefix.length);\n if (prefix && !shortKey.startsWith(prefix)) continue;\n keys.push(shortKey);\n }\n return keys;\n }\n\n async clear(ns: SharedMemoryNamespace): Promise<void> {\n const nsPrefix = `${ns.scope}:${ns.scopeId}:${ns.namespace}:`;\n for (const key of this.store.keys()) {\n if (key.startsWith(nsPrefix)) this.store.delete(key);\n }\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Memory Decay Policy\n// ──────────────────────────────────────────────────────\n// Manages automatic cleanup of stale memory entries based\n// on a configurable policy (max age, check interval, and\n// whether to delete or archive). For in-memory stores the\n// TTL handles expiry automatically; this manager is most\n// useful for persistent backends that need explicit GC.\n// ──────────────────────────────────────────────────────\n\nexport interface DecayPolicy {\n /** Maximum age in milliseconds before a memory entry decays */\n maxAgeMs: number;\n /** How often (ms) to run the decay sweep */\n checkIntervalMs: number;\n /** What to do with decayed entries */\n onDecay: \"delete\" | \"archive\";\n}\n\nexport class MemoryDecayManager {\n private timer: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n private store: {\n delete(ns: unknown, key: string): Promise<void>;\n list(ns: unknown, prefix?: string): Promise<string[]>;\n },\n private namespace: unknown,\n private policy: DecayPolicy,\n ) {}\n\n /** Start the periodic decay sweep. */\n start(): void {\n this.timer = setInterval(() => this.runDecay(), this.policy.checkIntervalMs);\n }\n\n /** Stop the periodic decay sweep. */\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n\n /**\n * Run a single decay sweep.\n *\n * For in-memory stores, TTL-based expiry handles cleanup automatically\n * during reads. This method is mainly useful for persistent stores\n * where we need explicit cleanup of old entries.\n *\n * Returns the number of entries that were decayed.\n */\n async runDecay(): Promise<number> {\n const keys = await this.store.list(this.namespace);\n const decayed = 0;\n // In a real implementation, check timestamps and delete/archive old entries\n // For the in-memory store, TTL expiry is handled at read time\n return decayed;\n }\n}\n","// ──────────────────────────────────────────────────────\n// ADK Eval Harness — lightweight agent evaluation framework\n// ──────────────────────────────────────────────────────\n// Provides a simple but extensible evaluation harness for testing\n// agent outputs against expected results. Supports exact match,\n// regex pattern matching, and custom validators.\n// ──────────────────────────────────────────────────────\n\n/** A single evaluation test case. */\nexport interface EvalCase {\n /** Human-readable name for this case. */\n name: string;\n /** Input to send to the agent/executor. */\n input: string;\n /** If set, output must exactly match this string (after trim). */\n expectedOutput?: string;\n /** If set, output must match this regex pattern. */\n expectedOutputPattern?: RegExp;\n /** If set, this function determines pass/fail. */\n validator?: (output: string) => boolean;\n /** Optional agent config overrides for this case. */\n agentConfig?: Record<string, unknown>;\n /** Optional tags for filtering/grouping. */\n tags?: string[];\n}\n\n/** Result of running a single eval case. */\nexport interface EvalResult {\n /** Name of the eval case. */\n caseName: string;\n /** Whether the case passed. */\n passed: boolean;\n /** Actual output from the executor. */\n actualOutput: string;\n /** Expected output (if specified). */\n expectedOutput?: string;\n /** Execution duration in milliseconds. */\n durationMs: number;\n /** Error message if the executor threw. */\n error?: string;\n}\n\n/** A suite of eval cases. */\nexport interface EvalSuite {\n /** Suite name. */\n name: string;\n /** Optional description. */\n description?: string;\n /** The eval cases to run. */\n cases: EvalCase[];\n}\n\n/**\n * Define an eval suite with validation.\n * Throws if the suite has no name or no cases.\n */\nexport function defineEvalSuite(config: EvalSuite): EvalSuite {\n if (!config.name) throw new Error(\"Eval suite must have a name\");\n if (!config.cases.length) throw new Error(\"Eval suite must have at least one case\");\n return config;\n}\n\n/**\n * Run an eval suite against an executor function.\n * The executor receives an input string and should return the agent's output.\n * Cases are run sequentially to avoid overwhelming LLM providers.\n */\nexport async function runEval(\n suite: EvalSuite,\n executor: (input: string) => Promise<string>,\n): Promise<EvalResult[]> {\n const results: EvalResult[] = [];\n\n for (const testCase of suite.cases) {\n const start = Date.now();\n try {\n const output = await executor(testCase.input);\n let passed = true;\n\n if (testCase.expectedOutput !== undefined) {\n passed = output.trim() === testCase.expectedOutput.trim();\n } else if (testCase.expectedOutputPattern) {\n passed = testCase.expectedOutputPattern.test(output);\n } else if (testCase.validator) {\n passed = testCase.validator(output);\n }\n\n results.push({\n caseName: testCase.name,\n passed,\n actualOutput: output,\n expectedOutput: testCase.expectedOutput,\n durationMs: Date.now() - start,\n });\n } catch (err) {\n results.push({\n caseName: testCase.name,\n passed: false,\n actualOutput: \"\",\n durationMs: Date.now() - start,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return results;\n}\n","// ──────────────────────────────────────────────────────\n// ADK Plugin — definePlugin()\n// ──────────────────────────────────────────────────────\n\nimport type { PluginDefinition, PluginLifecycle, PluginManifest } from \"./types\";\n\n/** Define a plugin from config — validates manifest and freezes the definition */\nexport function definePlugin(config: {\n manifest: PluginManifest;\n activate: PluginLifecycle[\"activate\"];\n deactivate?: PluginLifecycle[\"deactivate\"];\n onConfigChanged?: PluginLifecycle[\"onConfigChanged\"];\n onHealthCheck?: PluginLifecycle[\"onHealthCheck\"];\n}): PluginDefinition {\n if (!config.manifest.name) {\n throw new Error(\"Plugin manifest must have a name\");\n }\n if (!config.manifest.version) {\n throw new Error(\"Plugin manifest must have a version\");\n }\n if (!config.manifest.capabilities?.length) {\n throw new Error(\"Plugin must declare at least one capability\");\n }\n\n const definition: PluginDefinition = {\n manifest: Object.freeze({ ...config.manifest }),\n lifecycle: Object.freeze({\n activate: config.activate,\n deactivate: config.deactivate,\n onConfigChanged: config.onConfigChanged,\n onHealthCheck: config.onHealthCheck,\n }),\n };\n\n return Object.freeze(definition);\n}\n","// ──────────────────────────────────────────────────────\n// ADK Plugin Registry — register, activate, deactivate plugins\n// ──────────────────────────────────────────────────────\n\nimport type { ADKEventBus } from \"../events/event-bus\";\nimport type { ToolDef } from \"../types/tool\";\nimport type { PluginCapability, PluginContext, PluginDefinition } from \"./types\";\n\nexport type PluginStatus = \"registered\" | \"active\" | \"inactive\" | \"error\";\n\ninterface PluginEntry {\n definition: PluginDefinition;\n status: PluginStatus;\n config: Record<string, unknown>;\n registeredTools: string[];\n registeredGuardrails: string[];\n registeredExporters: number;\n error?: string;\n activatedAt?: Date;\n}\n\nexport class PluginRegistry {\n private plugins = new Map<string, PluginEntry>();\n private tools = new Map<string, ToolDef<unknown, unknown>>();\n private guardrails: Array<{ pluginName: string; config: unknown }> = [];\n private exporters: Array<{ pluginName: string; exporter: unknown }> = [];\n private eventBus?: ADKEventBus;\n private dataDir: string;\n\n constructor(options?: { eventBus?: ADKEventBus; dataDir?: string }) {\n this.eventBus = options?.eventBus;\n this.dataDir = options?.dataDir ?? \".aizona-plugins\";\n }\n\n /** Register a plugin definition (does not activate it) */\n register(definition: PluginDefinition, config?: Record<string, unknown>): void {\n const name = definition.manifest.name;\n if (this.plugins.has(name)) {\n throw new Error(`Plugin \"${name}\" is already registered`);\n }\n this.plugins.set(name, {\n definition,\n status: \"registered\",\n config: config ?? {},\n registeredTools: [],\n registeredGuardrails: [],\n registeredExporters: 0,\n });\n }\n\n /** Activate a registered plugin — calls its activate() lifecycle hook */\n async activate(name: string): Promise<void> {\n const entry = this.plugins.get(name);\n if (!entry) {\n throw new Error(`Plugin \"${name}\" not found`);\n }\n if (entry.status === \"active\") return;\n\n const ctx = this.createContext(name, entry);\n\n try {\n await entry.definition.lifecycle.activate(ctx);\n entry.status = \"active\";\n entry.activatedAt = new Date();\n } catch (err) {\n entry.status = \"error\";\n entry.error = err instanceof Error ? err.message : String(err);\n throw err;\n }\n }\n\n /** Deactivate a plugin — calls deactivate() and removes all registered extensions */\n async deactivate(name: string): Promise<void> {\n const entry = this.plugins.get(name);\n if (!entry) {\n throw new Error(`Plugin \"${name}\" not found`);\n }\n if (entry.status !== \"active\") return;\n\n try {\n await entry.definition.lifecycle.deactivate?.();\n } catch {\n // Best-effort — lifecycle cleanup errors should not prevent extension removal\n } finally {\n // Remove registered tools\n for (const toolName of entry.registeredTools) {\n this.tools.delete(toolName);\n }\n // Remove guardrails and exporters belonging to this plugin\n this.guardrails = this.guardrails.filter((g) => g.pluginName !== name);\n this.exporters = this.exporters.filter((e) => e.pluginName !== name);\n entry.registeredTools = [];\n entry.registeredGuardrails = [];\n entry.registeredExporters = 0;\n entry.status = \"inactive\";\n }\n }\n\n /** Unregister a plugin — must be deactivated first */\n unregister(name: string): void {\n const entry = this.plugins.get(name);\n if (!entry) return;\n if (entry.status === \"active\") {\n throw new Error(`Cannot unregister active plugin \"${name}\". Deactivate first.`);\n }\n this.plugins.delete(name);\n }\n\n /** Get a plugin entry by name */\n getPlugin(name: string): PluginEntry | undefined {\n return this.plugins.get(name);\n }\n\n /** List all registered plugins with their status */\n listPlugins(): Array<{\n name: string;\n version: string;\n status: PluginStatus;\n capabilities: PluginCapability[];\n }> {\n return Array.from(this.plugins.entries()).map(([name, entry]) => ({\n name,\n version: entry.definition.manifest.version,\n status: entry.status,\n capabilities: entry.definition.manifest.capabilities,\n }));\n }\n\n /** Get all tools registered by plugins (namespaced as \"pluginName:toolName\") */\n getRegisteredTools(): Map<string, ToolDef<unknown, unknown>> {\n return new Map(this.tools);\n }\n\n /** Get all guardrails registered by plugins */\n getRegisteredGuardrails(): Array<{ pluginName: string; config: unknown }> {\n return [...this.guardrails];\n }\n\n /** Get all trace exporters registered by plugins */\n getRegisteredExporters(): Array<{ pluginName: string; exporter: unknown }> {\n return [...this.exporters];\n }\n\n /** Run health check on a specific plugin */\n async healthCheck(\n name: string,\n ): Promise<{ healthy: boolean; details?: Record<string, unknown> }> {\n const entry = this.plugins.get(name);\n if (!entry) {\n throw new Error(`Plugin \"${name}\" not found`);\n }\n if (entry.status !== \"active\") {\n return { healthy: false, details: { reason: \"Plugin is not active\" } };\n }\n if (!entry.definition.lifecycle.onHealthCheck) {\n return { healthy: true };\n }\n return entry.definition.lifecycle.onHealthCheck();\n }\n\n /** Update config for a plugin and notify it if active */\n async updateConfig(name: string, newConfig: Record<string, unknown>): Promise<void> {\n const entry = this.plugins.get(name);\n if (!entry) {\n throw new Error(`Plugin \"${name}\" not found`);\n }\n entry.config = { ...newConfig };\n if (entry.status === \"active\" && entry.definition.lifecycle.onConfigChanged) {\n await entry.definition.lifecycle.onConfigChanged(newConfig);\n }\n }\n\n /** Create the PluginContext handed to the plugin during activation */\n private createContext(pluginName: string, entry: PluginEntry): PluginContext {\n const self = this;\n return {\n registerTool(tool: ToolDef<unknown, unknown>) {\n const namespacedName = `${pluginName}:${tool.name}`;\n const namespacedTool = { ...tool, name: namespacedName };\n self.tools.set(namespacedName, namespacedTool);\n entry.registeredTools.push(namespacedName);\n },\n registerGuardrail(config) {\n self.guardrails.push({ pluginName, config });\n entry.registeredGuardrails.push(config.name);\n },\n registerExporter(exporter) {\n self.exporters.push({ pluginName, exporter });\n entry.registeredExporters++;\n },\n getEventBus() {\n if (!self.eventBus) {\n throw new Error(\"No EventBus available\");\n }\n return self.eventBus;\n },\n getConfig<T>() {\n return entry.config as T;\n },\n getDataDir() {\n return `${self.dataDir}/${pluginName}`;\n },\n log(level, message, data) {\n const prefix = `[plugin:${pluginName}]`;\n if (level === \"error\") {\n console.error(prefix, message, data);\n } else if (level === \"warn\") {\n console.warn(prefix, message, data);\n } else {\n console.log(prefix, `[${level}]`, message, data ?? \"\");\n }\n },\n };\n }\n}\n"],"mappings":"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","names":["HANDOFF_PREFIX","b","HANDOFF_PREFIX","totalLatencyMs","result","DEFAULT_MODEL","API_URL","DEFAULT_MODEL","API_URL","DEFAULT_MODEL","API_URL","DEFAULT_MODEL","API_URL","API_URL","import_node_crypto","HANDOFF_PREFIX","import_zod","DEFAULTS"]}