{"version":3,"sources":["../src/agent/core/session.ts","../src/agent/core/context.ts","../src/agent/core/tool.ts"],"names":["result"],"mappings":"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","file":"chunk-GCDUXZXG.mjs","sourcesContent":["/**\n * EADK Session\n *\n * Session state management with scoped key-value storage.\n * Implements Google ADK's state scoping pattern (app/user/session/temp).\n */\n\nimport type { MemoryScope, SessionConfig, SessionState } from './types';\n\nconst SCOPE_PREFIX: Record<MemoryScope, string> = {\n  temp: 'temp:',\n  session: 'session:',\n  user: 'user:',\n  app: 'app:',\n};\n\n/**\n * In-memory session state with scope-based key namespacing.\n */\nexport class Session implements SessionState {\n  readonly id: string;\n  private state: Map<string, unknown>;\n  private createdAt: number;\n  private readonly timeoutMs?: number;\n\n  constructor(config?: SessionConfig) {\n    this.id = config?.id ?? crypto.randomUUID();\n    this.state = new Map();\n    this.createdAt = Date.now();\n    this.timeoutMs = config?.timeoutMs;\n\n    // Initialize with provided state\n    if (config?.initialState) {\n      for (const [key, value] of Object.entries(config.initialState)) {\n        this.state.set(`${SCOPE_PREFIX.session}${key}`, value);\n      }\n    }\n  }\n\n  private scopedKey(key: string, scope: MemoryScope = 'session'): string {\n    return `${SCOPE_PREFIX[scope]}${key}`;\n  }\n\n  get(key: string, scope: MemoryScope = 'session'): unknown {\n    if (this.isExpired()) return undefined;\n    return this.state.get(this.scopedKey(key, scope));\n  }\n\n  set(key: string, value: unknown, scope: MemoryScope = 'session'): void {\n    this.state.set(this.scopedKey(key, scope), value);\n  }\n\n  delete(key: string, scope: MemoryScope = 'session'): void {\n    this.state.delete(this.scopedKey(key, scope));\n  }\n\n  getAll(scope: MemoryScope = 'session'): Record<string, unknown> {\n    const prefix = SCOPE_PREFIX[scope];\n    const result: Record<string, unknown> = {};\n\n    for (const [key, value] of this.state) {\n      if (key.startsWith(prefix)) {\n        result[key.slice(prefix.length)] = value;\n      }\n    }\n\n    return result;\n  }\n\n  clear(scope?: MemoryScope): void {\n    if (scope) {\n      const prefix = SCOPE_PREFIX[scope];\n      for (const key of [...this.state.keys()]) {\n        if (key.startsWith(prefix)) {\n          this.state.delete(key);\n        }\n      }\n    } else {\n      this.state.clear();\n    }\n  }\n\n  /**\n   * Check if session has expired.\n   */\n  isExpired(): boolean {\n    if (!this.timeoutMs) return false;\n    return Date.now() - this.createdAt > this.timeoutMs;\n  }\n\n  /**\n   * Create a snapshot of the current state for checkpointing.\n   */\n  snapshot(): Record<string, unknown> {\n    const data: Record<string, unknown> = {};\n    for (const [key, value] of this.state) {\n      data[key] = value;\n    }\n    return data;\n  }\n\n  /**\n   * Restore state from a checkpoint snapshot.\n   */\n  restore(snapshot: Record<string, unknown>): void {\n    this.state.clear();\n    for (const [key, value] of Object.entries(snapshot)) {\n      this.state.set(key, value);\n    }\n  }\n\n  /**\n   * Fork the session (creates a copy for exploring different paths).\n   */\n  fork(newId?: string): Session {\n    const forked = new Session({\n      id: newId ?? crypto.randomUUID(),\n      timeoutMs: this.timeoutMs,\n    });\n    for (const [key, value] of this.state) {\n      forked.state.set(key, value);\n    }\n    return forked;\n  }\n}\n","/**\n * EADK Context\n *\n * Provides runtime context objects for agents, tools, guardrails, and hooks.\n */\n\nimport type {\n  AgentContext,\n  ToolContext,\n  GuardrailContext,\n  HookContext,\n  ComputePreference,\n  Message,\n  SessionState,\n} from './types';\nimport { Session } from './session';\n\n/**\n * Create a new root agent context.\n */\nexport function createAgentContext(options: {\n  agentName: string;\n  session?: SessionState;\n  computePreference?: ComputePreference;\n  messages?: Message[];\n  abortSignal?: AbortSignal;\n  metadata?: Record<string, unknown>;\n  parent?: AgentContext;\n}): AgentContext {\n  return {\n    session: options.session ?? new Session(),\n    agentName: options.agentName,\n    turn: 0,\n    messages: options.messages ?? [],\n    parent: options.parent,\n    computePreference: options.computePreference ?? 'auto',\n    abortSignal: options.abortSignal,\n    metadata: options.metadata ?? {},\n  };\n}\n\n/**\n * Create a child context for sub-agent delegation.\n */\nexport function createChildContext(\n  parent: AgentContext,\n  childAgentName: string,\n  overrides?: Partial<AgentContext>\n): AgentContext {\n  return {\n    ...parent,\n    agentName: childAgentName,\n    turn: 0,\n    parent,\n    metadata: { ...parent.metadata },\n    ...overrides,\n  };\n}\n\n/**\n * Create a tool execution context from an agent context.\n */\nexport function createToolContext(\n  agentCtx: AgentContext,\n  toolName: string,\n  retryCount = 0\n): ToolContext {\n  return {\n    ...agentCtx,\n    toolName,\n    isRetry: retryCount > 0,\n    retryCount,\n  };\n}\n\n/**\n * Create a guardrail evaluation context.\n */\nexport function createGuardrailContext(\n  agentCtx: AgentContext,\n  guardrailName: string,\n  phase: 'input' | 'output'\n): GuardrailContext {\n  return {\n    ...agentCtx,\n    guardrailName,\n    phase,\n  };\n}\n\n/**\n * Create a hook execution context.\n */\nexport function createHookContext(\n  agentCtx: AgentContext,\n  spanId?: string\n): HookContext {\n  return {\n    ...agentCtx,\n    spanId,\n    startTime: Date.now(),\n  };\n}\n","/**\n * EADK Tool System\n *\n * Tool definitions, helpers, and built-in tool implementations.\n * Combines patterns from all major ADKs with edge-native extensions.\n */\n\nimport { z } from 'zod';\nimport type {\n  Tool,\n  ToolContext,\n  ToolGuardrail,\n  ComputePreference,\n} from './types';\nimport { createToolContext } from './context';\nimport type { AgentContext } from './types';\n\n/**\n * Create a tool from a typed function with automatic schema inference.\n * This is the primary way to define tools — similar to Google ADK's FunctionTool.\n */\nexport function defineTool<TInput extends z.ZodSchema, TOutput = unknown>(\n  config: {\n    name: string;\n    description: string;\n    input: TInput;\n    output?: z.ZodSchema;\n    needsApproval?: boolean | ((input: z.infer<TInput>) => Promise<boolean>);\n    guardrails?: { input?: ToolGuardrail[]; output?: ToolGuardrail[] };\n    strictMode?: boolean;\n    computeTarget?: ComputePreference;\n  },\n  handler: (input: z.infer<TInput>, ctx: ToolContext) => Promise<TOutput>\n): Tool {\n  return {\n    name: config.name,\n    description: config.description,\n    inputSchema: config.input,\n    outputSchema: config.output,\n    needsApproval: config.needsApproval,\n    guardrails: config.guardrails,\n    strictMode: config.strictMode ?? false,\n    computeTarget: config.computeTarget,\n    execute: handler as Tool['execute'],\n  };\n}\n\n/**\n * Convert a Zod schema to a JSON Schema object (for LLM tool definitions).\n */\nexport function zodToJsonSchema(schema: z.ZodSchema): Record<string, unknown> {\n  // Use Zod's built-in description if available\n  const description = schema.description;\n\n  if (schema instanceof z.ZodObject) {\n    const shape = schema.shape;\n    const properties: Record<string, unknown> = {};\n    const required: string[] = [];\n\n    for (const [key, value] of Object.entries(shape)) {\n      const fieldSchema = value as z.ZodSchema;\n      properties[key] = zodToJsonSchema(fieldSchema);\n\n      // Check if field is optional\n      if (!(fieldSchema instanceof z.ZodOptional)) {\n        required.push(key);\n      }\n    }\n\n    return {\n      type: 'object',\n      properties,\n      ...(required.length > 0 ? { required } : {}),\n      ...(description ? { description } : {}),\n    };\n  }\n\n  if (schema instanceof z.ZodString) {\n    return { type: 'string', ...(description ? { description } : {}) };\n  }\n\n  if (schema instanceof z.ZodNumber) {\n    return { type: 'number', ...(description ? { description } : {}) };\n  }\n\n  if (schema instanceof z.ZodBoolean) {\n    return { type: 'boolean', ...(description ? { description } : {}) };\n  }\n\n  if (schema instanceof z.ZodArray) {\n    return {\n      type: 'array',\n      items: zodToJsonSchema((schema as z.ZodArray<z.ZodSchema>).element),\n      ...(description ? { description } : {}),\n    };\n  }\n\n  if (schema instanceof z.ZodEnum) {\n    return {\n      type: 'string',\n      enum: (schema as z.ZodEnum<[string, ...string[]]>).options,\n      ...(description ? { description } : {}),\n    };\n  }\n\n  if (schema instanceof z.ZodOptional) {\n    return zodToJsonSchema((schema as z.ZodOptional<z.ZodSchema>).unwrap());\n  }\n\n  if (schema instanceof z.ZodDefault) {\n    const inner = zodToJsonSchema(\n      (schema as z.ZodDefault<z.ZodSchema>).removeDefault()\n    );\n    return { ...inner, ...(description ? { description } : {}) };\n  }\n\n  // Fallback for complex types\n  return { type: 'object', ...(description ? { description } : {}) };\n}\n\n/**\n * Convert tools to LLM tool definitions for API calls.\n */\nexport function toolsToLLMDefinitions(tools: Tool[]): Array<{\n  name: string;\n  description: string;\n  parameters: Record<string, unknown>;\n}> {\n  return tools.map((tool) => ({\n    name: tool.name,\n    description: tool.description,\n    parameters: zodToJsonSchema(tool.inputSchema),\n  }));\n}\n\n/**\n * Execute a tool with full guardrail, validation, and approval pipeline.\n */\nexport async function executeTool(\n  tool: Tool,\n  input: unknown,\n  agentCtx: AgentContext,\n  retryCount = 0\n): Promise<{ result: unknown; error?: string; durationMs: number }> {\n  const ctx = createToolContext(agentCtx, tool.name, retryCount);\n  const startTime = Date.now();\n\n  try {\n    // 1. Validate input against schema\n    if (tool.strictMode || tool.inputSchema) {\n      const parseResult = tool.inputSchema.safeParse(input);\n      if (!parseResult.success) {\n        return {\n          result: null,\n          error: `Input validation failed: ${parseResult.error.message}`,\n          durationMs: Date.now() - startTime,\n        };\n      }\n      input = parseResult.data;\n    }\n\n    // 2. Run input guardrails\n    if (tool.guardrails?.input) {\n      for (const guardrail of tool.guardrails.input) {\n        const result = await guardrail.validate(input, ctx);\n        if (!result.passed) {\n          if (result.replacement !== undefined) {\n            input = result.replacement;\n          } else {\n            return {\n              result: null,\n              error: `Tool input guardrail '${guardrail.name}' blocked execution`,\n              durationMs: Date.now() - startTime,\n            };\n          }\n        }\n      }\n    }\n\n    // 3. Check approval\n    if (tool.needsApproval) {\n      const needs =\n        typeof tool.needsApproval === 'function'\n          ? await tool.needsApproval(input)\n          : tool.needsApproval;\n\n      if (needs) {\n        // In an interactive session, this would pause and ask the user.\n        // For now, we proceed — the approval mechanism is handled by the Runner.\n      }\n    }\n\n    // 4. Execute\n    let result = await tool.execute(input, ctx);\n\n    // 5. Validate output\n    if (tool.outputSchema) {\n      const parseResult = tool.outputSchema.safeParse(result);\n      if (!parseResult.success) {\n        return {\n          result: null,\n          error: `Output validation failed: ${parseResult.error.message}`,\n          durationMs: Date.now() - startTime,\n        };\n      }\n      result = parseResult.data;\n    }\n\n    // 6. Run output guardrails\n    if (tool.guardrails?.output) {\n      for (const guardrail of tool.guardrails.output) {\n        const guardResult = await guardrail.validate(result, ctx);\n        if (!guardResult.passed) {\n          if (guardResult.replacement !== undefined) {\n            result = guardResult.replacement;\n          } else {\n            return {\n              result: null,\n              error: `Tool output guardrail '${guardrail.name}' blocked result`,\n              durationMs: Date.now() - startTime,\n            };\n          }\n        }\n      }\n    }\n\n    return { result, durationMs: Date.now() - startTime };\n  } catch (err) {\n    return {\n      result: null,\n      error: err instanceof Error ? err.message : String(err),\n      durationMs: Date.now() - startTime,\n    };\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Agent-as-Tool helper (Google ADK / OpenAI pattern)\n// ---------------------------------------------------------------------------\n\n/**\n * Wrap an agent as a tool that can be used by other agents.\n * The agent is consulted and its result is returned as the tool output.\n */\nexport function agentAsTool(\n  agent: { run: (input: string) => Promise<{ output: string }> },\n  options?: {\n    name?: string;\n    description?: string;\n  }\n): Tool {\n  return defineTool(\n    {\n      name:\n        options?.name ?? `consult_${(agent as any).config?.name ?? 'agent'}`,\n      description:\n        options?.description ??\n        `Consult the ${\n          (agent as any).config?.name ?? 'agent'\n        } agent for assistance`,\n      input: z.object({\n        query: z.string().describe('The question or request for the agent'),\n      }),\n    },\n    async (input) => {\n      const result = await agent.run(input.query);\n      return result.output;\n    }\n  );\n}\n"]}