agentxjs 0.1.8 → 1.0.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.
package/dist/browser.cjs CHANGED
@@ -231,25 +231,22 @@ function isAgentEvent(event) {
231
231
  // src/createAgentX.ts
232
232
  init_dist();
233
233
  var remoteLogger = createLogger("agentx/RemoteClient");
234
- var isBrowser = typeof window !== "undefined" && typeof window.WebSocket !== "undefined";
235
234
  async function createRemoteAgentX(serverUrl) {
236
- const WebSocketImpl = isBrowser ? window.WebSocket : (await import('ws')).WebSocket;
237
- const ws = new WebSocketImpl(serverUrl);
235
+ const { createWebSocketClient } = await import('@agentxjs/network');
236
+ const client = await createWebSocketClient({
237
+ serverUrl,
238
+ autoReconnect: true,
239
+ minReconnectionDelay: 1e3,
240
+ maxReconnectionDelay: 1e4,
241
+ connectionTimeout: 4e3,
242
+ maxRetries: Infinity,
243
+ debug: false
244
+ });
238
245
  const handlers = /* @__PURE__ */ new Map();
239
246
  const pendingRequests = /* @__PURE__ */ new Map();
240
- await new Promise((resolve, reject) => {
241
- if (isBrowser) {
242
- ws.onopen = () => resolve();
243
- ws.onerror = () => reject(new Error("WebSocket connection failed"));
244
- } else {
245
- ws.on("open", () => resolve());
246
- ws.on("error", (err) => reject(err));
247
- }
248
- });
249
- const handleMessage = (data) => {
247
+ client.onMessage((message) => {
250
248
  try {
251
- const text = isBrowser ? data.data : data.toString();
252
- const event = JSON.parse(text);
249
+ const event = JSON.parse(message);
253
250
  remoteLogger.info("Received event", {
254
251
  type: event.type,
255
252
  category: event.category,
@@ -287,12 +284,13 @@ async function createRemoteAgentX(serverUrl) {
287
284
  }
288
285
  } catch {
289
286
  }
290
- };
291
- if (isBrowser) {
292
- ws.onmessage = handleMessage;
293
- } else {
294
- ws.on("message", handleMessage);
295
- }
287
+ });
288
+ client.onClose(() => {
289
+ remoteLogger.warn("WebSocket closed");
290
+ });
291
+ client.onError((error) => {
292
+ remoteLogger.error("WebSocket error", { error: error.message });
293
+ });
296
294
  function subscribe(type, handler) {
297
295
  if (!handlers.has(type)) {
298
296
  handlers.set(type, /* @__PURE__ */ new Set());
@@ -323,7 +321,7 @@ async function createRemoteAgentX(serverUrl) {
323
321
  category: "request",
324
322
  intent: "request"
325
323
  };
326
- ws.send(JSON.stringify(event));
324
+ client.send(JSON.stringify(event));
327
325
  });
328
326
  },
329
327
  on(type, handler) {
@@ -341,7 +339,7 @@ async function createRemoteAgentX(serverUrl) {
341
339
  category: type.toString().endsWith("_response") ? "response" : "request",
342
340
  intent: type.toString().endsWith("_response") ? "result" : "request"
343
341
  };
344
- ws.send(JSON.stringify(event));
342
+ client.send(JSON.stringify(event));
345
343
  },
346
344
  async listen() {
347
345
  throw new Error("Cannot listen in remote mode");
@@ -355,11 +353,7 @@ async function createRemoteAgentX(serverUrl) {
355
353
  }
356
354
  pendingRequests.clear();
357
355
  handlers.clear();
358
- if (isBrowser) {
359
- ws.close();
360
- } else {
361
- ws.close();
362
- }
356
+ client.dispose();
363
357
  }
364
358
  };
365
359
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../common/src/logger/LoggerFactoryImpl.ts","../../common/src/logger/ConsoleLogger.ts","../../types/src/agentx/index.ts","../../types/src/event/base/SystemEvent.ts","../../types/src/event/command/CommandEvent.ts","../../types/src/event/agent/stream/index.ts","../../types/src/event/agent/state/index.ts","../../types/src/event/agent/message/index.ts","../../types/src/event/agent/turn/index.ts","../../types/src/event/agent/index.ts","../src/createAgentX.ts","../src/browser.ts"],"names":["_ConsoleLogger"],"mappings":"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","file":"browser.cjs","sourcesContent":["/**\n * LoggerFactoryImpl - Central factory for creating logger instances\n *\n * Implements lazy initialization pattern:\n * - createLogger() can be called at module level (before config)\n * - Real logger is created on first use\n * - External LoggerFactory can be injected via Runtime\n */\n\nimport type { Logger, LoggerFactory, LogContext, LogLevel } from \"@agentxjs/types\";\nimport { ConsoleLogger, type ConsoleLoggerOptions } from \"./ConsoleLogger\";\n\n// External factory injected via Runtime\nlet externalFactory: LoggerFactory | null = null;\n\nexport interface LoggerFactoryConfig {\n defaultImplementation?: (name: string) => Logger;\n defaultLevel?: LogLevel;\n consoleOptions?: Omit<ConsoleLoggerOptions, \"level\">;\n}\n\n/**\n * Internal LoggerFactory implementation\n *\n * Uses lazy proxy pattern to allow module-level createLogger() calls.\n */\nexport class LoggerFactoryImpl {\n private static loggers: Map<string, Logger> = new Map();\n private static config: LoggerFactoryConfig = {\n defaultLevel: \"info\",\n };\n\n static getLogger(nameOrClass: string | (new (...args: unknown[]) => unknown)): Logger {\n const name = typeof nameOrClass === \"string\" ? nameOrClass : nameOrClass.name;\n\n if (this.loggers.has(name)) {\n return this.loggers.get(name)!;\n }\n\n const lazyLogger = this.createLazyLogger(name);\n this.loggers.set(name, lazyLogger);\n return lazyLogger;\n }\n\n static configure(config: LoggerFactoryConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n static reset(): void {\n this.loggers.clear();\n this.config = { defaultLevel: \"info\" };\n externalFactory = null;\n }\n\n private static createLazyLogger(name: string): Logger {\n let realLogger: Logger | null = null;\n\n const getRealLogger = (): Logger => {\n if (!realLogger) {\n realLogger = this.createLogger(name);\n }\n return realLogger;\n };\n\n return {\n name,\n level: this.config.defaultLevel || \"info\",\n debug: (message: string, context?: LogContext) => getRealLogger().debug(message, context),\n info: (message: string, context?: LogContext) => getRealLogger().info(message, context),\n warn: (message: string, context?: LogContext) => getRealLogger().warn(message, context),\n error: (message: string | Error, context?: LogContext) =>\n getRealLogger().error(message, context),\n isDebugEnabled: () => getRealLogger().isDebugEnabled(),\n isInfoEnabled: () => getRealLogger().isInfoEnabled(),\n isWarnEnabled: () => getRealLogger().isWarnEnabled(),\n isErrorEnabled: () => getRealLogger().isErrorEnabled(),\n };\n }\n\n private static createLogger(name: string): Logger {\n if (externalFactory) {\n return externalFactory.getLogger(name);\n }\n\n if (this.config.defaultImplementation) {\n return this.config.defaultImplementation(name);\n }\n\n return new ConsoleLogger(name, {\n level: this.config.defaultLevel,\n ...this.config.consoleOptions,\n });\n }\n}\n\n/**\n * Set external LoggerFactory (called by Runtime initialization)\n */\nexport function setLoggerFactory(factory: LoggerFactory): void {\n externalFactory = factory;\n LoggerFactoryImpl.reset();\n externalFactory = factory;\n}\n\n/**\n * Create a logger instance\n *\n * Safe to call at module level before Runtime is configured.\n * Uses lazy initialization - actual logger is created on first use.\n *\n * @param name - Logger name (hierarchical, e.g., \"engine/AgentEngine\")\n * @returns Logger instance (lazy proxy)\n */\nexport function createLogger(name: string): Logger {\n return LoggerFactoryImpl.getLogger(name);\n}\n","/**\n * ConsoleLogger - Default logger implementation\n *\n * Simple console-based logger with color support.\n * Used as fallback when no custom LoggerFactory is provided.\n */\n\nimport type { Logger, LogContext, LogLevel } from \"@agentxjs/types\";\n\nexport interface ConsoleLoggerOptions {\n level?: LogLevel;\n colors?: boolean;\n timestamps?: boolean;\n}\n\nexport class ConsoleLogger implements Logger {\n readonly name: string;\n readonly level: LogLevel;\n private readonly colors: boolean;\n private readonly timestamps: boolean;\n\n private static readonly COLORS = {\n DEBUG: \"\\x1b[36m\",\n INFO: \"\\x1b[32m\",\n WARN: \"\\x1b[33m\",\n ERROR: \"\\x1b[31m\",\n RESET: \"\\x1b[0m\",\n };\n\n constructor(name: string, options: ConsoleLoggerOptions = {}) {\n this.name = name;\n this.level = options.level ?? \"info\";\n this.colors = options.colors ?? this.isNodeEnvironment();\n this.timestamps = options.timestamps ?? true;\n }\n\n debug(message: string, context?: LogContext): void {\n if (this.isDebugEnabled()) {\n this.log(\"DEBUG\", message, context);\n }\n }\n\n info(message: string, context?: LogContext): void {\n if (this.isInfoEnabled()) {\n this.log(\"INFO\", message, context);\n }\n }\n\n warn(message: string, context?: LogContext): void {\n if (this.isWarnEnabled()) {\n this.log(\"WARN\", message, context);\n }\n }\n\n error(message: string | Error, context?: LogContext): void {\n if (this.isErrorEnabled()) {\n if (message instanceof Error) {\n this.log(\"ERROR\", message.message, { ...context, stack: message.stack });\n } else {\n this.log(\"ERROR\", message, context);\n }\n }\n }\n\n isDebugEnabled(): boolean {\n return this.getLevelValue(this.level) <= this.getLevelValue(\"debug\");\n }\n\n isInfoEnabled(): boolean {\n return this.getLevelValue(this.level) <= this.getLevelValue(\"info\");\n }\n\n isWarnEnabled(): boolean {\n return this.getLevelValue(this.level) <= this.getLevelValue(\"warn\");\n }\n\n isErrorEnabled(): boolean {\n return this.getLevelValue(this.level) <= this.getLevelValue(\"error\");\n }\n\n private getLevelValue(level: LogLevel): number {\n const levels: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n };\n return levels[level];\n }\n\n private log(level: string, message: string, context?: LogContext): void {\n const parts: string[] = [];\n\n if (this.timestamps) {\n parts.push(new Date().toISOString());\n }\n\n if (this.colors) {\n const color = ConsoleLogger.COLORS[level as keyof typeof ConsoleLogger.COLORS];\n parts.push(`${color}${level.padEnd(5)}${ConsoleLogger.COLORS.RESET}`);\n } else {\n parts.push(level.padEnd(5));\n }\n\n parts.push(`[${this.name}]`);\n parts.push(message);\n\n const logLine = parts.join(\" \");\n const consoleMethod = this.getConsoleMethod(level);\n\n if (context && Object.keys(context).length > 0) {\n consoleMethod(logLine, context);\n } else {\n consoleMethod(logLine);\n }\n }\n\n private getConsoleMethod(level: string): (...args: unknown[]) => void {\n switch (level) {\n case \"DEBUG\":\n return console.debug.bind(console);\n case \"INFO\":\n return console.info.bind(console);\n case \"WARN\":\n return console.warn.bind(console);\n case \"ERROR\":\n return console.error.bind(console);\n default:\n return console.log.bind(console);\n }\n }\n\n private isNodeEnvironment(): boolean {\n return typeof process !== \"undefined\" && process.versions?.node !== undefined;\n }\n}\n","/**\n * AgentX - Unified High-Level API for AI Agents\n *\n * AgentX provides a simple, consistent API for both local and remote modes.\n * It wraps Runtime and provides the same interface regardless of deployment.\n *\n * ## Two Modes\n *\n * ```\n * Local Mode Remote Mode\n * ─────────────────────────────────────────────────────────\n * AgentX AgentX\n * │ │\n * └── Runtime (embedded) └── WebSocket ──→ Server\n * │ │\n * └── LLM, Storage └── Runtime\n * ```\n *\n * ## API Design\n *\n * All operations use CommandEvent pattern:\n * - `request(type, data)` - Send request, wait for response\n * - `on(type, handler)` - Subscribe to events\n * - `onCommand(type, handler)` - Type-safe command subscription\n *\n * ## Usage\n *\n * ```typescript\n * // Local mode (default)\n * const agentx = await createAgentX();\n *\n * // Local mode with custom LLM and storage\n * const agentx = await createAgentX({\n * llm: { apiKey: \"sk-...\", model: \"claude-opus-4-20250514\" },\n * storage: { driver: \"postgresql\", url: \"postgres://...\" },\n * });\n *\n * // Remote mode\n * const agentx = await createAgentX({ server: \"ws://localhost:5200\" });\n *\n * // Same API for both modes!\n * const res = await agentx.request(\"container_create_request\", {\n * containerId: \"my-container\"\n * });\n *\n * agentx.on(\"text_delta\", (e) => console.log(e.data.text));\n *\n * await agentx.dispose();\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { SystemEvent } from \"~/event/base\";\nimport type {\n CommandEventMap,\n CommandRequestType,\n ResponseEventFor,\n RequestDataFor,\n} from \"~/event/command\";\nimport type { LogLevel, LoggerFactory } from \"~/common/logger\";\n\n// ============================================================================\n// Configuration - Local Mode\n// ============================================================================\n\n/**\n * LLM configuration\n */\nexport interface LLMConfig {\n /**\n * Anthropic API key (required)\n */\n apiKey: string;\n\n /**\n * API base URL\n * @default \"https://api.anthropic.com\"\n */\n baseUrl?: string;\n\n /**\n * Model name\n * @default \"claude-sonnet-4-20250514\"\n */\n model?: string;\n}\n\n/**\n * Storage driver type\n */\nexport type StorageDriver =\n | \"memory\"\n | \"fs\"\n | \"redis\"\n | \"mongodb\"\n | \"sqlite\"\n | \"mysql\"\n | \"postgresql\";\n\n/**\n * Storage configuration\n */\nexport interface StorageConfig {\n /**\n * Storage driver\n * @default \"memory\"\n */\n driver?: StorageDriver;\n\n /**\n * File path (for sqlite, fs drivers)\n * @example \"./data.db\" for sqlite\n * @example \"./data\" for fs\n */\n path?: string;\n\n /**\n * Connection URL (for redis, mongodb, mysql, postgresql)\n * @example \"redis://localhost:6379\"\n * @example \"mongodb://localhost:27017/agentx\"\n * @example \"mysql://user:pass@localhost:3306/agentx\"\n * @example \"postgres://user:pass@localhost:5432/agentx\"\n */\n url?: string;\n}\n\n/**\n * Logger configuration\n */\nexport interface LoggerConfig {\n /**\n * Log level\n * @default LogLevel.INFO\n */\n level?: LogLevel;\n\n /**\n * Custom logger factory implementation\n * If provided, this factory will be used to create all logger instances.\n * If not provided, uses ConsoleLogger with console options.\n */\n factory?: LoggerFactory;\n\n /**\n * Console logger options (only used when factory is not provided)\n */\n console?: {\n /**\n * Enable colored output\n * @default true (Node.js), false (browser)\n */\n colors?: boolean;\n\n /**\n * Include timestamps in log output\n * @default true\n */\n timestamps?: boolean;\n };\n}\n\n/**\n * Local mode configuration\n *\n * Runs AgentX with local runtime, connecting directly to LLM API.\n */\nexport interface LocalConfig {\n /**\n * LLM configuration\n */\n llm?: LLMConfig;\n\n /**\n * Storage configuration\n */\n storage?: StorageConfig;\n\n /**\n * Logger configuration\n */\n logger?: LoggerConfig;\n\n /**\n * HTTP server to attach WebSocket to.\n * If provided, WebSocket upgrade will be handled on the same port.\n * The server should handle authentication before upgrading.\n *\n * @example\n * ```typescript\n * import { createServer } from \"http\";\n * import { Hono } from \"hono\";\n *\n * const app = new Hono();\n * // ... add auth middleware\n *\n * const server = createServer(app.fetch);\n * const agentx = await createAgentX({ server });\n *\n * server.listen(5200);\n * ```\n */\n server?: {\n on(\n event: \"upgrade\",\n listener: (\n request: { url?: string; headers: { host?: string } },\n socket: unknown,\n head: unknown\n ) => void\n ): void;\n };\n}\n\n// ============================================================================\n// Configuration - Remote Mode\n// ============================================================================\n\n/**\n * Remote mode configuration\n *\n * Connects to a remote AgentX server via WebSocket.\n */\nexport interface RemoteConfig {\n /**\n * Remote server URL (WebSocket)\n * @example \"ws://localhost:5200\"\n */\n serverUrl: string;\n}\n\n// ============================================================================\n// Union Type\n// ============================================================================\n\n/**\n * AgentX configuration\n *\n * - LocalConfig: Run with local runtime (default)\n * - RemoteConfig: Connect to remote server\n */\nexport type AgentXConfig = LocalConfig | RemoteConfig;\n\n/**\n * Type guard: is this a remote config?\n */\nexport function isRemoteConfig(config: AgentXConfig): config is RemoteConfig {\n return \"serverUrl\" in config && typeof config.serverUrl === \"string\";\n}\n\n/**\n * Type guard: is this a local config?\n */\nexport function isLocalConfig(config: AgentXConfig): config is LocalConfig {\n return !isRemoteConfig(config);\n}\n\n// ============================================================================\n// Unsubscribe\n// ============================================================================\n\n/**\n * Unsubscribe function\n */\nexport type Unsubscribe = () => void;\n\n// ============================================================================\n// AgentX Interface\n// ============================================================================\n\n/**\n * AgentX - Main API interface\n *\n * Unified API for both local and remote modes.\n */\nexport interface AgentX {\n // ==================== Core API ====================\n\n /**\n * Send a command request and wait for response.\n *\n * @example\n * ```typescript\n * const res = await agentx.request(\"container_create_request\", {\n * containerId: \"my-container\"\n * });\n * console.log(res.data.containerId);\n * ```\n */\n request<T extends CommandRequestType>(\n type: T,\n data: RequestDataFor<T>,\n timeout?: number\n ): Promise<ResponseEventFor<T>>;\n\n /**\n * Subscribe to events.\n *\n * @example\n * ```typescript\n * agentx.on(\"text_delta\", (e) => {\n * process.stdout.write(e.data.text);\n * });\n * ```\n */\n on<T extends string>(type: T, handler: (event: SystemEvent & { type: T }) => void): Unsubscribe;\n\n /**\n * Subscribe to command events with full type safety.\n *\n * @example\n * ```typescript\n * agentx.onCommand(\"container_create_response\", (e) => {\n * console.log(e.data.containerId);\n * });\n * ```\n */\n onCommand<T extends keyof CommandEventMap>(\n type: T,\n handler: (event: CommandEventMap[T]) => void\n ): Unsubscribe;\n\n /**\n * Emit a command event.\n *\n * For fine-grained control. Usually prefer `request()`.\n */\n emitCommand<T extends keyof CommandEventMap>(type: T, data: CommandEventMap[T][\"data\"]): void;\n\n // ==================== Server API (local mode only) ====================\n\n /**\n * Start listening for remote connections.\n *\n * Only available in local mode.\n *\n * @example\n * ```typescript\n * await agentx.listen(5200);\n * console.log(\"Server running on ws://localhost:5200\");\n * ```\n */\n listen(port: number, host?: string): Promise<void>;\n\n /**\n * Stop listening for remote connections.\n */\n close(): Promise<void>;\n\n // ==================== Lifecycle ====================\n\n /**\n * Dispose AgentX and release all resources.\n */\n dispose(): Promise<void>;\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Create AgentX instance\n *\n * @example\n * ```typescript\n * // Local mode (default)\n * const agentx = await createAgentX();\n *\n * // Local mode with config\n * const agentx = await createAgentX({\n * llm: { apiKey: \"sk-...\" },\n * storage: { driver: \"sqlite\", path: \"./data.db\" },\n * });\n *\n * // Remote mode\n * const agentx = await createAgentX({ server: \"ws://localhost:5200\" });\n * ```\n */\nexport declare function createAgentX(config?: AgentXConfig): Promise<AgentX>;\n","/**\n * SystemEvent - Base interface for all events in the system\n *\n * Unified Event Structure:\n * ```\n * SystemEvent\n * │\n * │ All events have: type, timestamp, data, source, category, intent\n * │\n * ├── source: \"command\" ← API operations (request/response)\n * │ ├── category: \"request\" → container_create_request, agent_run_request...\n * │ └── category: \"response\" → container_create_response, agent_run_response...\n * │\n * ├── source: \"environment\" ← External world (Claude API, Network)\n * │ ├── category: \"stream\" → message_start, text_delta, message_stop, tool_call...\n * │ └── category: \"connection\"→ connected, disconnected, reconnecting\n * │\n * ├── source: \"container\" ← Container operations\n * │ └── category: \"lifecycle\" → container_created, container_destroyed, agent_registered...\n * │\n * ├── source: \"session\" ← Session operations\n * │ ├── category: \"lifecycle\" → session_created, session_destroyed\n * │ ├── category: \"persist\" → session_saved, message_persisted\n * │ └── category: \"action\" → session_resumed, session_forked\n * │\n * ├── source: \"sandbox\" ← Sandbox resources\n * │ ├── category: \"workdir\" → file_read, file_written\n * │ └── category: \"mcp\" → tool_execute, mcp_server_connected\n * │\n * └── source: \"agent\" ← Agent internal\n * ├── category: \"stream\" → (forwarded from environment)\n * ├── category: \"state\" → state transitions\n * ├── category: \"message\" → complete messages\n * └── category: \"turn\" → conversation turns\n * ```\n *\n * Design Principles:\n * - Unified: All events share the same base structure\n * - Self-describing: source/category/intent tell you everything\n * - Filterable: Easy to subscribe by source, category, or type\n */\n\n// ============================================================================\n// Event Classification Types\n// ============================================================================\n\n/**\n * Event source - where the event originated\n */\nexport type EventSource =\n | \"environment\" // External world (Claude API, Network)\n | \"agent\" // Agent internal\n | \"session\" // Session operations\n | \"container\" // Container operations\n | \"sandbox\" // Sandbox resources (Workspace, MCP)\n | \"command\"; // Command request/response (API operations)\n\n/**\n * Event intent - what the event represents\n */\nexport type EventIntent =\n | \"request\" // Request to perform action (may be forwarded or executed)\n | \"result\" // Result of completed action\n | \"notification\"; // State change notification (no action needed)\n\n/**\n * Event category - fine-grained classification within source\n */\nexport type EventCategory =\n // Environment categories\n | \"stream\" // Streaming output from LLM\n | \"connection\" // Network connection status\n // Agent categories\n | \"state\" // State transitions\n | \"message\" // Complete messages\n | \"turn\" // Conversation turns\n | \"error\" // Errors\n // Session categories\n | \"lifecycle\" // Creation/destruction\n | \"persist\" // Persistence operations\n | \"action\" // User actions (resume, fork)\n // Sandbox categories\n | \"workdir\" // File operations\n | \"mcp\" // MCP tool operations\n // Command categories (API request/response)\n | \"request\" // Request to perform action\n | \"response\"; // Response with result\n\n// ============================================================================\n// Event Context\n// ============================================================================\n\n/**\n * EventContext - Scope information attached to events\n */\nexport interface EventContext {\n /**\n * Container ID (isolation boundary)\n */\n containerId?: string;\n\n /**\n * Image ID (persistent conversation identity)\n */\n imageId?: string;\n\n /**\n * Agent ID (if event is agent-scoped)\n */\n agentId?: string;\n\n /**\n * Session ID (if event is session-scoped)\n */\n sessionId?: string;\n\n /**\n * Turn ID (for correlating events within a single turn)\n * A turn = one user message + assistant response cycle\n */\n turnId?: string;\n\n /**\n * Correlation ID (for request-response tracking)\n */\n correlationId?: string;\n}\n\n// ============================================================================\n// SystemEvent - The One Event Type\n// ============================================================================\n\n/**\n * SystemEvent - Base interface for ALL events in the system\n *\n * Every event has:\n * - type: What happened (e.g., \"text_delta\", \"session_saved\")\n * - timestamp: When it happened\n * - data: Event payload\n * - source: Where it came from\n * - category: What kind of event\n * - intent: What it means (notification/request/result)\n * - context: Optional scope information\n * - broadcastable: Whether to broadcast to external clients (default: true)\n */\nexport interface SystemEvent<\n T extends string = string,\n D = unknown,\n S extends EventSource = EventSource,\n C extends EventCategory = EventCategory,\n I extends EventIntent = EventIntent,\n> {\n /**\n * Event type identifier (e.g., \"text_delta\", \"session_saved\")\n */\n readonly type: T;\n\n /**\n * Event timestamp (Unix milliseconds)\n */\n readonly timestamp: number;\n\n /**\n * Event payload data\n */\n readonly data: D;\n\n /**\n * Event source - where the event originated\n */\n readonly source: S;\n\n /**\n * Event category - fine-grained classification\n */\n readonly category: C;\n\n /**\n * Event intent - what the event represents\n */\n readonly intent: I;\n\n /**\n * Event context - scope information (optional)\n */\n readonly context?: EventContext;\n\n /**\n * Whether to broadcast this event to external clients (SSE/WebSocket)\n *\n * - true or undefined: Broadcast to all external clients\n * - false: Only consumed internally, not broadcast\n *\n * Used for internal events like DriveableEvent that should be\n * processed by the engine but not sent directly to clients.\n * @default true\n */\n readonly broadcastable?: boolean;\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if event is from a specific source\n */\nexport function isFromSource<S extends EventSource>(\n event: SystemEvent,\n source: S\n): event is SystemEvent<string, unknown, S> {\n return event.source === source;\n}\n\n/**\n * Check if event has a specific intent\n */\nexport function hasIntent<I extends EventIntent>(\n event: SystemEvent,\n intent: I\n): event is SystemEvent<string, unknown, EventSource, EventCategory, I> {\n return event.intent === intent;\n}\n\n/**\n * Check if event is a request\n */\nexport function isRequest(event: SystemEvent): boolean {\n return event.intent === \"request\";\n}\n\n/**\n * Check if event is a result\n */\nexport function isResult(event: SystemEvent): boolean {\n return event.intent === \"result\";\n}\n\n/**\n * Check if event is a notification\n */\nexport function isNotification(event: SystemEvent): boolean {\n return event.intent === \"notification\";\n}\n","/**\n * CommandEvent - Request/Response events for Runtime operations\n *\n * These events enable unified operation API for both local and remote modes:\n * - Local mode: RuntimeImpl listens to requests, emits responses\n * - Remote mode: WebSocket/SSE forwards requests/responses\n *\n * Pattern:\n * ```\n * Caller Handler (Runtime)\n * ─────────────────────────────────────────────────────────\n * container_create_request ────────► handle & execute\n * ◄──────── container_create_response\n *\n * agent_run_request ────────► handle & execute\n * ◄──────── agent_run_response\n * ```\n *\n * All CommandEvents have:\n * - source: \"command\"\n * - category: \"request\" | \"response\"\n * - intent: \"request\" | \"result\"\n */\n\nimport type { SystemEvent } from \"../base\";\nimport type { ImageRecord } from \"~/runtime/internal/persistence\";\n\n// ============================================================================\n// Base Types\n// ============================================================================\n\n/**\n * Base interface for Command request events\n */\ninterface BaseCommandRequest<T extends string, D = unknown>\n extends SystemEvent<T, D, \"command\", \"request\", \"request\"> {}\n\n/**\n * Base interface for Command response events\n */\ninterface BaseCommandResponse<T extends string, D = unknown>\n extends SystemEvent<T, D, \"command\", \"response\", \"result\"> {}\n\n// ============================================================================\n// Container Commands\n// ============================================================================\n\n/**\n * Request to create a container\n */\nexport interface ContainerCreateRequest\n extends BaseCommandRequest<\n \"container_create_request\",\n {\n requestId: string;\n containerId: string;\n }\n > {}\n\n/**\n * Response to container creation\n */\nexport interface ContainerCreateResponse\n extends BaseCommandResponse<\n \"container_create_response\",\n {\n requestId: string;\n containerId: string;\n error?: string;\n }\n > {}\n\n/**\n * Request to get a container\n */\nexport interface ContainerGetRequest\n extends BaseCommandRequest<\n \"container_get_request\",\n {\n requestId: string;\n containerId: string;\n }\n > {}\n\n/**\n * Response to container get\n */\nexport interface ContainerGetResponse\n extends BaseCommandResponse<\n \"container_get_response\",\n {\n requestId: string;\n containerId?: string;\n exists: boolean;\n error?: string;\n }\n > {}\n\n/**\n * Request to list containers\n */\nexport interface ContainerListRequest\n extends BaseCommandRequest<\n \"container_list_request\",\n {\n requestId: string;\n }\n > {}\n\n/**\n * Response to container list\n */\nexport interface ContainerListResponse\n extends BaseCommandResponse<\n \"container_list_response\",\n {\n requestId: string;\n containerIds: string[];\n error?: string;\n }\n > {}\n\n// ============================================================================\n// Agent Commands\n// ============================================================================\n\n/**\n * Request to get an agent\n */\nexport interface AgentGetRequest\n extends BaseCommandRequest<\n \"agent_get_request\",\n {\n requestId: string;\n agentId: string;\n }\n > {}\n\n/**\n * Response to agent get\n */\nexport interface AgentGetResponse\n extends BaseCommandResponse<\n \"agent_get_response\",\n {\n requestId: string;\n agentId?: string;\n containerId?: string;\n exists: boolean;\n error?: string;\n }\n > {}\n\n/**\n * Request to list agents\n */\nexport interface AgentListRequest\n extends BaseCommandRequest<\n \"agent_list_request\",\n {\n requestId: string;\n containerId: string;\n }\n > {}\n\n/**\n * Response to agent list\n */\nexport interface AgentListResponse\n extends BaseCommandResponse<\n \"agent_list_response\",\n {\n requestId: string;\n agents: Array<{ agentId: string; containerId: string; imageId: string }>;\n error?: string;\n }\n > {}\n\n/**\n * Request to destroy an agent\n */\nexport interface AgentDestroyRequest\n extends BaseCommandRequest<\n \"agent_destroy_request\",\n {\n requestId: string;\n agentId: string;\n }\n > {}\n\n/**\n * Response to agent destroy\n */\nexport interface AgentDestroyResponse\n extends BaseCommandResponse<\n \"agent_destroy_response\",\n {\n requestId: string;\n agentId: string;\n success: boolean;\n error?: string;\n }\n > {}\n\n/**\n * Request to destroy all agents in a container\n */\nexport interface AgentDestroyAllRequest\n extends BaseCommandRequest<\n \"agent_destroy_all_request\",\n {\n requestId: string;\n containerId: string;\n }\n > {}\n\n/**\n * Response to destroy all agents\n */\nexport interface AgentDestroyAllResponse\n extends BaseCommandResponse<\n \"agent_destroy_all_response\",\n {\n requestId: string;\n containerId: string;\n error?: string;\n }\n > {}\n\n/**\n * Request to send a message\n * Can use either imageId (preferred) or agentId\n * If using imageId and agent is not running, it will be auto-activated\n */\nexport interface MessageSendRequest\n extends BaseCommandRequest<\n \"message_send_request\",\n {\n requestId: string;\n /** Image ID (preferred) - will auto-activate if offline */\n imageId?: string;\n /** Agent ID (legacy) - must be already running */\n agentId?: string;\n content: string;\n }\n > {}\n\n/**\n * Response to message send (acknowledges message received, not completion)\n */\nexport interface MessageSendResponse\n extends BaseCommandResponse<\n \"message_send_response\",\n {\n requestId: string;\n imageId?: string;\n agentId: string;\n error?: string;\n }\n > {}\n\n/**\n * Request to interrupt an agent\n * Can use either imageId or agentId\n */\nexport interface AgentInterruptRequest\n extends BaseCommandRequest<\n \"agent_interrupt_request\",\n {\n requestId: string;\n /** Image ID (preferred) */\n imageId?: string;\n /** Agent ID (legacy) */\n agentId?: string;\n }\n > {}\n\n/**\n * Response to agent interrupt\n */\nexport interface AgentInterruptResponse\n extends BaseCommandResponse<\n \"agent_interrupt_response\",\n {\n requestId: string;\n imageId?: string;\n agentId?: string;\n error?: string;\n }\n > {}\n\n// ============================================================================\n// Image Commands\n// ============================================================================\n\n/**\n * Request to create a new image (conversation)\n */\nexport interface ImageCreateRequest\n extends BaseCommandRequest<\n \"image_create_request\",\n {\n requestId: string;\n containerId: string;\n config: {\n name?: string;\n description?: string;\n systemPrompt?: string;\n };\n }\n > {}\n\n/**\n * Response to image creation\n */\nexport interface ImageCreateResponse\n extends BaseCommandResponse<\n \"image_create_response\",\n {\n requestId: string;\n record: ImageRecord;\n error?: string;\n }\n > {}\n\n/**\n * Request to run an image (create or reuse agent)\n */\nexport interface ImageRunRequest\n extends BaseCommandRequest<\n \"image_run_request\",\n {\n requestId: string;\n imageId: string;\n }\n > {}\n\n/**\n * Response to image run\n */\nexport interface ImageRunResponse\n extends BaseCommandResponse<\n \"image_run_response\",\n {\n requestId: string;\n imageId: string;\n agentId: string;\n /** true if reusing existing agent, false if newly created */\n reused: boolean;\n error?: string;\n }\n > {}\n\n/**\n * Request to stop an image (destroy agent, keep image)\n */\nexport interface ImageStopRequest\n extends BaseCommandRequest<\n \"image_stop_request\",\n {\n requestId: string;\n imageId: string;\n }\n > {}\n\n/**\n * Response to image stop\n */\nexport interface ImageStopResponse\n extends BaseCommandResponse<\n \"image_stop_response\",\n {\n requestId: string;\n imageId: string;\n error?: string;\n }\n > {}\n\n/**\n * Request to update an image (name, description, etc.)\n */\nexport interface ImageUpdateRequest\n extends BaseCommandRequest<\n \"image_update_request\",\n {\n requestId: string;\n imageId: string;\n updates: {\n name?: string;\n description?: string;\n };\n }\n > {}\n\n/**\n * Response to image update\n */\nexport interface ImageUpdateResponse\n extends BaseCommandResponse<\n \"image_update_response\",\n {\n requestId: string;\n record: ImageRecord;\n error?: string;\n }\n > {}\n\n/**\n * Request to list all images\n */\nexport interface ImageListRequest\n extends BaseCommandRequest<\n \"image_list_request\",\n {\n requestId: string;\n containerId?: string;\n }\n > {}\n\n/**\n * Image list item with online status\n */\nexport interface ImageListItem extends ImageRecord {\n /** Whether an agent is currently running for this image */\n online: boolean;\n /** Current agent ID if online */\n agentId?: string;\n}\n\n/**\n * Response to image list\n */\nexport interface ImageListResponse\n extends BaseCommandResponse<\n \"image_list_response\",\n {\n requestId: string;\n records: ImageListItem[];\n error?: string;\n }\n > {}\n\n/**\n * Request to get an image by ID\n */\nexport interface ImageGetRequest\n extends BaseCommandRequest<\n \"image_get_request\",\n {\n requestId: string;\n imageId: string;\n }\n > {}\n\n/**\n * Response to image get\n */\nexport interface ImageGetResponse\n extends BaseCommandResponse<\n \"image_get_response\",\n {\n requestId: string;\n record?: ImageListItem | null;\n error?: string;\n }\n > {}\n\n/**\n * Request to delete an image\n */\nexport interface ImageDeleteRequest\n extends BaseCommandRequest<\n \"image_delete_request\",\n {\n requestId: string;\n imageId: string;\n }\n > {}\n\n/**\n * Response to image delete\n */\nexport interface ImageDeleteResponse\n extends BaseCommandResponse<\n \"image_delete_response\",\n {\n requestId: string;\n imageId: string;\n error?: string;\n }\n > {}\n\n/**\n * Request to get messages for an image\n */\nexport interface ImageMessagesRequest\n extends BaseCommandRequest<\n \"image_messages_request\",\n {\n requestId: string;\n imageId: string;\n }\n > {}\n\n/**\n * Response to image messages request\n */\nexport interface ImageMessagesResponse\n extends BaseCommandResponse<\n \"image_messages_response\",\n {\n requestId: string;\n imageId: string;\n messages: Array<{\n id: string;\n role: \"user\" | \"assistant\" | \"tool_call\" | \"tool_result\";\n content: unknown;\n timestamp: number;\n }>;\n error?: string;\n }\n > {}\n\n// ============================================================================\n// Union Types\n// ============================================================================\n\n/**\n * All Command request events\n */\nexport type CommandRequest =\n // Container\n | ContainerCreateRequest\n | ContainerGetRequest\n | ContainerListRequest\n // Agent\n | AgentGetRequest\n | AgentListRequest\n | AgentDestroyRequest\n | AgentDestroyAllRequest\n | MessageSendRequest\n | AgentInterruptRequest\n // Image\n | ImageCreateRequest\n | ImageRunRequest\n | ImageStopRequest\n | ImageUpdateRequest\n | ImageListRequest\n | ImageGetRequest\n | ImageDeleteRequest\n | ImageMessagesRequest;\n\n/**\n * All Command response events\n */\nexport type CommandResponse =\n // Container\n | ContainerCreateResponse\n | ContainerGetResponse\n | ContainerListResponse\n // Agent\n | AgentGetResponse\n | AgentListResponse\n | AgentDestroyResponse\n | AgentDestroyAllResponse\n | MessageSendResponse\n | AgentInterruptResponse\n // Image\n | ImageCreateResponse\n | ImageRunResponse\n | ImageStopResponse\n | ImageUpdateResponse\n | ImageListResponse\n | ImageGetResponse\n | ImageDeleteResponse\n | ImageMessagesResponse;\n\n/**\n * All Command events (requests + responses)\n */\nexport type CommandEvent = CommandRequest | CommandResponse;\n\n/**\n * Command event type strings\n */\nexport type CommandEventType = CommandEvent[\"type\"];\n\n/**\n * Type guard: is this a CommandEvent?\n */\nexport function isCommandEvent(event: { source?: string }): event is CommandEvent {\n return event.source === \"command\";\n}\n\n/**\n * Type guard: is this a Command request event?\n */\nexport function isCommandRequest(event: {\n source?: string;\n category?: string;\n}): event is CommandRequest {\n return event.source === \"command\" && event.category === \"request\";\n}\n\n/**\n * Type guard: is this a Command response event?\n */\nexport function isCommandResponse(event: {\n source?: string;\n category?: string;\n}): event is CommandResponse {\n return event.source === \"command\" && event.category === \"response\";\n}\n\n// ============================================================================\n// Event Map - Type-safe event type to event mapping\n// ============================================================================\n\n/**\n * CommandEventMap - Maps event type string to event interface\n *\n * Enables type-safe event handling:\n * ```typescript\n * bus.onCommand(\"container_create_request\", (event) => {\n * event.data.requestId; // ✓ string\n * event.data.containerId; // ✓ string\n * });\n * ```\n */\nexport interface CommandEventMap {\n // Container\n container_create_request: ContainerCreateRequest;\n container_create_response: ContainerCreateResponse;\n container_get_request: ContainerGetRequest;\n container_get_response: ContainerGetResponse;\n container_list_request: ContainerListRequest;\n container_list_response: ContainerListResponse;\n // Agent\n agent_get_request: AgentGetRequest;\n agent_get_response: AgentGetResponse;\n agent_list_request: AgentListRequest;\n agent_list_response: AgentListResponse;\n agent_destroy_request: AgentDestroyRequest;\n agent_destroy_response: AgentDestroyResponse;\n agent_destroy_all_request: AgentDestroyAllRequest;\n agent_destroy_all_response: AgentDestroyAllResponse;\n message_send_request: MessageSendRequest;\n message_send_response: MessageSendResponse;\n agent_interrupt_request: AgentInterruptRequest;\n agent_interrupt_response: AgentInterruptResponse;\n // Image\n image_create_request: ImageCreateRequest;\n image_create_response: ImageCreateResponse;\n image_run_request: ImageRunRequest;\n image_run_response: ImageRunResponse;\n image_stop_request: ImageStopRequest;\n image_stop_response: ImageStopResponse;\n image_update_request: ImageUpdateRequest;\n image_update_response: ImageUpdateResponse;\n image_list_request: ImageListRequest;\n image_list_response: ImageListResponse;\n image_get_request: ImageGetRequest;\n image_get_response: ImageGetResponse;\n image_delete_request: ImageDeleteRequest;\n image_delete_response: ImageDeleteResponse;\n image_messages_request: ImageMessagesRequest;\n image_messages_response: ImageMessagesResponse;\n}\n\n/**\n * Maps request event type to its corresponding response event type\n */\nexport interface CommandRequestResponseMap {\n container_create_request: \"container_create_response\";\n container_get_request: \"container_get_response\";\n container_list_request: \"container_list_response\";\n agent_get_request: \"agent_get_response\";\n agent_list_request: \"agent_list_response\";\n agent_destroy_request: \"agent_destroy_response\";\n agent_destroy_all_request: \"agent_destroy_all_response\";\n message_send_request: \"message_send_response\";\n agent_interrupt_request: \"agent_interrupt_response\";\n image_create_request: \"image_create_response\";\n image_run_request: \"image_run_response\";\n image_stop_request: \"image_stop_response\";\n image_update_request: \"image_update_response\";\n image_list_request: \"image_list_response\";\n image_get_request: \"image_get_response\";\n image_delete_request: \"image_delete_response\";\n image_messages_request: \"image_messages_response\";\n}\n\n/**\n * All command request types\n */\nexport type CommandRequestType = keyof CommandRequestResponseMap;\n\n/**\n * Get response type for a request type\n */\nexport type ResponseTypeFor<T extends CommandRequestType> = CommandRequestResponseMap[T];\n\n/**\n * Get response event for a request type\n */\nexport type ResponseEventFor<T extends CommandRequestType> = CommandEventMap[ResponseTypeFor<T>];\n\n/**\n * Get request data type (without requestId, as it's auto-generated)\n */\nexport type RequestDataFor<T extends CommandRequestType> = Omit<\n CommandEventMap[T][\"data\"],\n \"requestId\"\n>;\n","/**\n * Agent Stream Events\n *\n * Real-time streaming events from LLM.\n * - source: \"agent\"\n * - category: \"stream\"\n * - intent: \"notification\"\n *\n * Note: These have same event types as DriveableEvent (environment/stream),\n * but with full SystemEvent structure (source, category, intent, context).\n */\n\nimport type { BaseAgentEvent } from \"../BaseAgentEvent\";\n\n/**\n * Base type for stream events\n */\nexport interface AgentStreamEventBase<T extends string, D> extends BaseAgentEvent<T, D, \"stream\"> {}\n\n// ============================================================================\n// Stop Reason\n// ============================================================================\n\n/**\n * Stop reason for message completion\n */\nexport type StopReason = \"end_turn\" | \"max_tokens\" | \"stop_sequence\" | \"tool_use\";\n\n// ============================================================================\n// Message Lifecycle Events\n// ============================================================================\n\n/**\n * AgentMessageStartEvent - Streaming message begins\n */\nexport interface AgentMessageStartEvent\n extends AgentStreamEventBase<\n \"message_start\",\n {\n messageId: string;\n model: string;\n }\n > {}\n\n/**\n * AgentMessageDeltaEvent - Message-level updates (usage info)\n */\nexport interface AgentMessageDeltaEvent\n extends AgentStreamEventBase<\n \"message_delta\",\n {\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n }\n > {}\n\n/**\n * AgentMessageStopEvent - Streaming message completes\n */\nexport interface AgentMessageStopEvent\n extends AgentStreamEventBase<\n \"message_stop\",\n {\n stopReason?: StopReason;\n }\n > {}\n\n// ============================================================================\n// Text Content Events\n// ============================================================================\n\n/**\n * AgentTextDeltaEvent - Incremental text output\n */\nexport interface AgentTextDeltaEvent\n extends AgentStreamEventBase<\n \"text_delta\",\n {\n text: string;\n }\n > {}\n\n// ============================================================================\n// Tool Use Events\n// ============================================================================\n\n/**\n * AgentToolUseStartEvent - Tool use block started\n */\nexport interface AgentToolUseStartEvent\n extends AgentStreamEventBase<\n \"tool_use_start\",\n {\n toolCallId: string;\n toolName: string;\n }\n > {}\n\n/**\n * AgentInputJsonDeltaEvent - Incremental tool input JSON\n */\nexport interface AgentInputJsonDeltaEvent\n extends AgentStreamEventBase<\n \"input_json_delta\",\n {\n partialJson: string;\n }\n > {}\n\n/**\n * AgentToolUseStopEvent - Tool use block completed\n */\nexport interface AgentToolUseStopEvent\n extends AgentStreamEventBase<\n \"tool_use_stop\",\n {\n toolCallId: string;\n toolName: string;\n input: Record<string, unknown>;\n }\n > {}\n\n/**\n * AgentToolResultEvent - Tool execution result\n */\nexport interface AgentToolResultEvent\n extends AgentStreamEventBase<\n \"tool_result\",\n {\n toolCallId: string;\n result: unknown;\n isError?: boolean;\n }\n > {}\n\n// ============================================================================\n// Error Events\n// ============================================================================\n\n/**\n * AgentErrorReceivedEvent - Error received from environment\n *\n * Processed by MealyMachine to produce:\n * - error_occurred (StateEvent)\n * - error_message (MessageEvent)\n */\nexport interface AgentErrorReceivedEvent\n extends AgentStreamEventBase<\n \"error_received\",\n {\n /** Error message (human-readable) */\n message: string;\n /** Error code (e.g., \"rate_limit_error\", \"api_error\") */\n errorCode?: string;\n }\n > {}\n\n// ============================================================================\n// Union Type\n// ============================================================================\n\n/**\n * AgentStreamEvent - All stream events\n */\nexport type AgentStreamEvent =\n | AgentMessageStartEvent\n | AgentMessageDeltaEvent\n | AgentMessageStopEvent\n | AgentTextDeltaEvent\n | AgentToolUseStartEvent\n | AgentInputJsonDeltaEvent\n | AgentToolUseStopEvent\n | AgentToolResultEvent\n | AgentErrorReceivedEvent;\n\n/**\n * AgentStreamEventType - String literal union\n */\nexport type AgentStreamEventType = AgentStreamEvent[\"type\"];\n\n/**\n * Type guard: is this a stream event?\n */\nexport function isAgentStreamEvent(event: {\n source?: string;\n category?: string;\n}): event is AgentStreamEvent {\n return event.source === \"agent\" && event.category === \"stream\";\n}\n","/**\n * Agent State Events\n *\n * Events that trigger AgentState transitions.\n * - source: \"agent\"\n * - category: \"state\"\n * - intent: \"notification\"\n *\n * Note: These are events that AFFECT state, not \"state\" themselves.\n */\n\nimport type { BaseAgentEvent } from \"../BaseAgentEvent\";\n\n/**\n * Base type for state events\n */\nexport interface AgentStateEventBase<T extends string, D> extends BaseAgentEvent<T, D, \"state\"> {}\n\n// ============================================================================\n// Conversation Events\n// ============================================================================\n\n/**\n * ConversationQueuedEvent - Message queued for processing\n */\nexport interface ConversationQueuedEvent\n extends AgentStateEventBase<\n \"conversation_queued\",\n {\n messageId: string;\n }\n > {}\n\n/**\n * ConversationStartEvent - Conversation started\n */\nexport interface ConversationStartEvent\n extends AgentStateEventBase<\n \"conversation_start\",\n {\n messageId: string;\n }\n > {}\n\n/**\n * ConversationThinkingEvent - Agent is thinking\n */\nexport interface ConversationThinkingEvent\n extends AgentStateEventBase<\"conversation_thinking\", Record<string, never>> {}\n\n/**\n * ConversationRespondingEvent - Agent is responding\n */\nexport interface ConversationRespondingEvent\n extends AgentStateEventBase<\"conversation_responding\", Record<string, never>> {}\n\n/**\n * ConversationEndEvent - Conversation ended\n */\nexport interface ConversationEndEvent\n extends AgentStateEventBase<\n \"conversation_end\",\n {\n reason: \"completed\" | \"interrupted\" | \"error\";\n }\n > {}\n\n/**\n * ConversationInterruptedEvent - Conversation interrupted\n */\nexport interface ConversationInterruptedEvent\n extends AgentStateEventBase<\n \"conversation_interrupted\",\n {\n reason: string;\n }\n > {}\n\n// ============================================================================\n// Tool Events\n// ============================================================================\n\n/**\n * ToolPlannedEvent - Tool use planned\n */\nexport interface ToolPlannedEvent\n extends AgentStateEventBase<\n \"tool_planned\",\n {\n toolId: string;\n toolName: string;\n }\n > {}\n\n/**\n * ToolExecutingEvent - Tool is executing\n */\nexport interface ToolExecutingEvent\n extends AgentStateEventBase<\n \"tool_executing\",\n {\n toolId: string;\n toolName: string;\n input: Record<string, unknown>;\n }\n > {}\n\n/**\n * ToolCompletedEvent - Tool execution completed\n */\nexport interface ToolCompletedEvent\n extends AgentStateEventBase<\n \"tool_completed\",\n {\n toolId: string;\n toolName: string;\n result: unknown;\n }\n > {}\n\n/**\n * ToolFailedEvent - Tool execution failed\n */\nexport interface ToolFailedEvent\n extends AgentStateEventBase<\n \"tool_failed\",\n {\n toolId: string;\n toolName: string;\n error: string;\n }\n > {}\n\n// ============================================================================\n// Error Events\n// ============================================================================\n\n/**\n * ErrorOccurredEvent - Error occurred during processing\n */\nexport interface ErrorOccurredEvent\n extends AgentStateEventBase<\n \"error_occurred\",\n {\n code: string;\n message: string;\n recoverable: boolean;\n category?: string;\n }\n > {}\n\n// ============================================================================\n// Union Type\n// ============================================================================\n\n/**\n * AgentStateEvent - All state events\n */\nexport type AgentStateEvent =\n // Conversation\n | ConversationQueuedEvent\n | ConversationStartEvent\n | ConversationThinkingEvent\n | ConversationRespondingEvent\n | ConversationEndEvent\n | ConversationInterruptedEvent\n // Tool\n | ToolPlannedEvent\n | ToolExecutingEvent\n | ToolCompletedEvent\n | ToolFailedEvent\n // Error\n | ErrorOccurredEvent;\n\n/**\n * AgentStateEventType - String literal union\n */\nexport type AgentStateEventType = AgentStateEvent[\"type\"];\n\n/**\n * Type guard: is this a state event?\n */\nexport function isAgentStateEvent(event: {\n source?: string;\n category?: string;\n}): event is AgentStateEvent {\n return event.source === \"agent\" && event.category === \"state\";\n}\n","/**\n * Agent Message Events\n *\n * Complete message events assembled from stream events.\n * - source: \"agent\"\n * - category: \"message\"\n * - intent: \"notification\"\n */\n\nimport type { BaseAgentEvent } from \"../BaseAgentEvent\";\nimport type { ContentPart, ToolCallPart, ToolResultPart } from \"~/agent/message/parts\";\n\n/**\n * Base type for message events\n */\nexport interface AgentMessageEventBase<T extends string, D>\n extends BaseAgentEvent<T, D, \"message\"> {}\n\n// ============================================================================\n// Message Events\n// ============================================================================\n\n/**\n * UserMessageEvent - User sent a message\n */\nexport interface UserMessageEvent\n extends AgentMessageEventBase<\n \"user_message\",\n {\n messageId: string;\n content: string;\n timestamp: number;\n }\n > {}\n\n/**\n * AssistantMessageEvent - Assistant response message\n */\nexport interface AssistantMessageEvent\n extends AgentMessageEventBase<\n \"assistant_message\",\n {\n messageId: string;\n content: ContentPart[];\n model?: string;\n stopReason?: string;\n timestamp: number;\n }\n > {}\n\n/**\n * ToolCallMessageEvent - Tool call message (part of assistant turn)\n */\nexport interface ToolCallMessageEvent\n extends AgentMessageEventBase<\n \"tool_call_message\",\n {\n messageId: string;\n toolCalls: ToolCallPart[];\n timestamp: number;\n }\n > {}\n\n/**\n * ToolResultMessageEvent - Tool result message\n */\nexport interface ToolResultMessageEvent\n extends AgentMessageEventBase<\n \"tool_result_message\",\n {\n messageId: string;\n results: ToolResultPart[];\n timestamp: number;\n }\n > {}\n\n/**\n * ErrorMessageEvent - Error message displayed in chat\n *\n * Generated when error_received StreamEvent is processed by MealyMachine.\n * Displayed in the chat history so users can see what went wrong.\n */\nexport interface ErrorMessageEvent\n extends AgentMessageEventBase<\n \"error_message\",\n {\n messageId: string;\n /** Error message (human-readable) */\n content: string;\n /** Error code (e.g., \"rate_limit_error\", \"api_error\") */\n errorCode?: string;\n timestamp: number;\n }\n > {}\n\n// ============================================================================\n// Union Type\n// ============================================================================\n\n/**\n * AgentMessageEvent - All message events\n */\nexport type AgentMessageEvent =\n | UserMessageEvent\n | AssistantMessageEvent\n | ToolCallMessageEvent\n | ToolResultMessageEvent\n | ErrorMessageEvent;\n\n/**\n * AgentMessageEventType - String literal union\n */\nexport type AgentMessageEventType = AgentMessageEvent[\"type\"];\n\n/**\n * Type guard: is this a message event?\n */\nexport function isAgentMessageEvent(event: {\n source?: string;\n category?: string;\n}): event is AgentMessageEvent {\n return event.source === \"agent\" && event.category === \"message\";\n}\n","/**\n * Agent Turn Events\n *\n * Turn-level events for analytics and billing.\n * A turn = one user message + assistant response cycle.\n * - source: \"agent\"\n * - category: \"turn\"\n * - intent: \"notification\"\n */\n\nimport type { BaseAgentEvent } from \"../BaseAgentEvent\";\n\n/**\n * Base type for turn events\n */\nexport interface AgentTurnEventBase<T extends string, D> extends BaseAgentEvent<T, D, \"turn\"> {}\n\n/**\n * Token usage information\n */\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n totalTokens?: number;\n}\n\n// ============================================================================\n// Turn Events\n// ============================================================================\n\n/**\n * TurnRequestEvent - Turn started (user message received)\n */\nexport interface TurnRequestEvent\n extends AgentTurnEventBase<\n \"turn_request\",\n {\n turnId: string;\n messageId: string;\n content: string;\n timestamp: number;\n }\n > {}\n\n/**\n * TurnResponseEvent - Turn completed (assistant response finished)\n */\nexport interface TurnResponseEvent\n extends AgentTurnEventBase<\n \"turn_response\",\n {\n turnId: string;\n messageId: string;\n duration: number;\n usage?: TokenUsage;\n model?: string;\n stopReason?: string;\n timestamp: number;\n }\n > {}\n\n// ============================================================================\n// Union Type\n// ============================================================================\n\n/**\n * AgentTurnEvent - All turn events\n */\nexport type AgentTurnEvent = TurnRequestEvent | TurnResponseEvent;\n\n/**\n * AgentTurnEventType - String literal union\n */\nexport type AgentTurnEventType = AgentTurnEvent[\"type\"];\n\n/**\n * Type guard: is this a turn event?\n */\nexport function isAgentTurnEvent(event: {\n source?: string;\n category?: string;\n}): event is AgentTurnEvent {\n return event.source === \"agent\" && event.category === \"turn\";\n}\n","/**\n * Agent Events - SystemEvent for Agent domain\n *\n * Complete event definitions for Agent, extending SystemEvent with:\n * - source: \"agent\"\n * - category: \"stream\" | \"state\" | \"message\" | \"turn\"\n * - intent: \"notification\"\n *\n * ## Event Categories\n *\n * ```\n * AgentEvent (source: \"agent\")\n * │\n * ├── category: \"stream\" ← Real-time streaming from LLM\n * │ └── TextDeltaEvent, MessageStartEvent, ToolUseStartEvent...\n * │\n * ├── category: \"state\" ← State transitions\n * │ └── ConversationStartEvent, ConversationEndEvent, ToolExecutingEvent...\n * │\n * ├── category: \"message\" ← Assembled complete messages\n * │ └── UserMessageEvent, AssistantMessageEvent, ToolCallMessageEvent...\n * │\n * └── category: \"turn\" ← Turn analytics\n * └── TurnStartEvent, TurnEndEvent\n * ```\n *\n * ## Relationship with Engine Events\n *\n * Engine uses lightweight events (type, timestamp, data only).\n * Use `ToEngineEvent<T>` to convert AgentEvent to EngineEvent.\n *\n * @packageDocumentation\n */\n\n// Base types\nexport type { AgentEventCategory, BaseAgentEvent } from \"./BaseAgentEvent\";\n\n// Stream events\nexport * from \"./stream\";\n\n// State events\nexport * from \"./state\";\n\n// Message events\nexport * from \"./message\";\n\n// Turn events\nexport * from \"./turn\";\n\n// Union type\nimport type { AgentStreamEvent } from \"./stream\";\nimport type { AgentStateEvent } from \"./state\";\nimport type { AgentMessageEvent } from \"./message\";\nimport type { AgentTurnEvent } from \"./turn\";\n\n/**\n * AgentEvent - All events from Agent domain\n */\nexport type AgentEvent = AgentStreamEvent | AgentStateEvent | AgentMessageEvent | AgentTurnEvent;\n\n/**\n * Type guard: is this an agent event?\n */\nexport function isAgentEvent(event: { source?: string }): event is AgentEvent {\n return event.source === \"agent\";\n}\n","/**\n * createAgentX - Factory function for creating AgentX instances\n *\n * Supports two modes:\n * - Local mode: Uses Runtime directly (Claude API) - Node.js only\n * - Remote mode: Connects to AgentX server via WebSocket - Browser & Node.js\n *\n * Local mode implementation is dynamically imported to enable tree-shaking\n * in browser builds.\n */\n\nimport type { AgentX, AgentXConfig, Unsubscribe } from \"@agentxjs/types/agentx\";\nimport { isRemoteConfig } from \"@agentxjs/types/agentx\";\nimport type {\n CommandEventMap,\n CommandRequestType,\n ResponseEventFor,\n RequestDataFor,\n SystemEvent,\n} from \"@agentxjs/types/event\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst remoteLogger = createLogger(\"agentx/RemoteClient\");\n\n/**\n * Create AgentX instance\n *\n * @param config - Configuration (LocalConfig or RemoteConfig)\n * @returns AgentX instance\n *\n * @example\n * ```typescript\n * // Remote mode (browser & Node.js)\n * const agentx = await createAgentX({ serverUrl: \"ws://localhost:5200\" });\n *\n * // Local mode (Node.js only)\n * const agentx = await createAgentX({ llm: { apiKey: \"sk-...\" } });\n * ```\n */\nexport async function createAgentX(config?: AgentXConfig): Promise<AgentX> {\n if (config && isRemoteConfig(config)) {\n return createRemoteAgentX(config.serverUrl);\n }\n\n // Dynamic import for tree-shaking in browser builds\n const { createLocalAgentX } = await import(\"./createLocalAgentX\");\n return createLocalAgentX(config ?? {});\n}\n\n// ============================================================================\n// Remote Mode Implementation (Browser & Node.js compatible)\n// ============================================================================\n\n// Declare window for TypeScript (available in browser)\ndeclare const window: { WebSocket: typeof WebSocket } | undefined;\n\n// Detect browser environment\nconst isBrowser = typeof window !== \"undefined\" && typeof window.WebSocket !== \"undefined\";\n\n/**\n * Create AgentX instance in remote mode\n *\n * Connects to an AgentX server via WebSocket.\n * Works in both browser and Node.js environments.\n *\n * @param serverUrl - WebSocket server URL\n * @returns AgentX instance\n */\nexport async function createRemoteAgentX(serverUrl: string): Promise<AgentX> {\n // Use native WebSocket in browser, ws library in Node.js\n const WebSocketImpl = isBrowser ? window.WebSocket : (await import(\"ws\")).WebSocket;\n\n const ws = new WebSocketImpl(serverUrl);\n const handlers = new Map<string, Set<(event: SystemEvent) => void>>();\n const pendingRequests = new Map<\n string,\n {\n resolve: (event: SystemEvent) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n >();\n\n // Wait for connection\n await new Promise<void>((resolve, reject) => {\n if (isBrowser) {\n // Browser WebSocket uses event properties\n ws.onopen = () => resolve();\n ws.onerror = () => reject(new Error(\"WebSocket connection failed\"));\n } else {\n // Node.js ws uses EventEmitter\n (ws as any).on(\"open\", () => resolve());\n (ws as any).on(\"error\", (err: Error) => reject(err));\n }\n });\n\n // Handle incoming messages\n const handleMessage = (data: unknown) => {\n try {\n // Browser: data is MessageEvent, Node.js: data is Buffer\n const text = isBrowser ? (data as { data: string }).data : (data as Buffer).toString();\n const event = JSON.parse(text) as SystemEvent;\n\n remoteLogger.info(\"Received event\", {\n type: event.type,\n category: event.category,\n requestId: (event.data as any)?.requestId,\n });\n\n // Handle error events - log as error (but still dispatch to handlers)\n if (event.type === \"system_error\") {\n const errorData = event.data as { message: string; severity?: string; details?: unknown };\n remoteLogger.error(errorData.message, {\n severity: errorData.severity,\n requestId: (event.data as any)?.requestId,\n details: errorData.details,\n });\n // Continue to dispatch to handlers (don't return here)\n }\n\n // Check if it's a response to a pending request\n // Only response events (category === \"response\") should resolve pending requests\n const requestId = (event.data as { requestId?: string })?.requestId;\n if (event.category === \"response\" && requestId && pendingRequests.has(requestId)) {\n remoteLogger.info(\"Resolving pending request\", { requestId, eventType: event.type });\n const pending = pendingRequests.get(requestId)!;\n clearTimeout(pending.timer);\n pendingRequests.delete(requestId);\n pending.resolve(event);\n return;\n }\n remoteLogger.info(\"Dispatching to handlers\", { type: event.type });\n\n // Dispatch to handlers\n const typeHandlers = handlers.get(event.type);\n if (typeHandlers) {\n for (const handler of typeHandlers) {\n handler(event);\n }\n }\n\n // Dispatch to \"*\" handlers\n const allHandlers = handlers.get(\"*\");\n if (allHandlers) {\n for (const handler of allHandlers) {\n handler(event);\n }\n }\n } catch {\n // Ignore parse errors\n }\n };\n\n // Register message handler\n if (isBrowser) {\n ws.onmessage = handleMessage;\n } else {\n (ws as any).on(\"message\", handleMessage);\n }\n\n function subscribe(type: string, handler: (event: SystemEvent) => void): Unsubscribe {\n if (!handlers.has(type)) {\n handlers.set(type, new Set());\n }\n handlers.get(type)!.add(handler);\n return () => {\n handlers.get(type)?.delete(handler);\n };\n }\n\n return {\n request<T extends CommandRequestType>(\n type: T,\n data: RequestDataFor<T>,\n timeout: number = 30000\n ): Promise<ResponseEventFor<T>> {\n return new Promise((resolve, reject) => {\n const requestId = `req_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;\n\n const timer = setTimeout(() => {\n pendingRequests.delete(requestId);\n reject(new Error(`Request timeout: ${type}`));\n }, timeout);\n\n pendingRequests.set(requestId, {\n resolve: resolve as (event: SystemEvent) => void,\n reject,\n timer,\n });\n\n const event: SystemEvent = {\n type,\n timestamp: Date.now(),\n data: { ...data, requestId },\n source: \"command\",\n category: \"request\",\n intent: \"request\",\n };\n\n ws.send(JSON.stringify(event));\n });\n },\n\n on<T extends string>(\n type: T,\n handler: (event: SystemEvent & { type: T }) => void\n ): Unsubscribe {\n return subscribe(type, handler as (event: SystemEvent) => void);\n },\n\n onCommand<T extends keyof CommandEventMap>(\n type: T,\n handler: (event: CommandEventMap[T]) => void\n ): Unsubscribe {\n return subscribe(type, handler as (event: SystemEvent) => void);\n },\n\n emitCommand<T extends keyof CommandEventMap>(type: T, data: CommandEventMap[T][\"data\"]): void {\n const event: SystemEvent = {\n type,\n timestamp: Date.now(),\n data,\n source: \"command\",\n category: type.toString().endsWith(\"_response\") ? \"response\" : \"request\",\n intent: type.toString().endsWith(\"_response\") ? \"result\" : \"request\",\n };\n ws.send(JSON.stringify(event));\n },\n\n async listen() {\n throw new Error(\"Cannot listen in remote mode\");\n },\n\n async close() {\n // No-op in remote mode\n },\n\n async dispose() {\n for (const pending of pendingRequests.values()) {\n clearTimeout(pending.timer);\n pending.reject(new Error(\"AgentX disposed\"));\n }\n pendingRequests.clear();\n handlers.clear();\n\n if (isBrowser) {\n ws.close();\n } else {\n (ws as any).close();\n }\n },\n };\n}\n","/**\n * agentxjs - Browser Entry Point\n *\n * This entry is automatically selected by bundlers (Vite, Webpack, etc.)\n * when building for browser environments.\n *\n * Only includes remote mode (WebSocket client).\n * Does not include Node.js specific code (runtime, fs, sqlite, etc.)\n */\n\n// Re-export everything from index except createAgentX\nexport type {\n AgentX,\n AgentXConfig,\n LocalConfig,\n RemoteConfig,\n LLMConfig,\n StorageConfig,\n StorageDriver,\n Unsubscribe,\n} from \"@agentxjs/types/agentx\";\n\nexport { isLocalConfig, isRemoteConfig } from \"@agentxjs/types/agentx\";\n\n// Event types\nexport type {\n SystemEvent,\n EventSource,\n EventCategory,\n EventIntent,\n EventContext,\n} from \"@agentxjs/types/event\";\n\nexport {\n isFromSource,\n hasIntent,\n isRequest,\n isResult,\n isNotification,\n} from \"@agentxjs/types/event\";\n\n// Command events\nexport type {\n CommandEvent,\n CommandRequest,\n CommandResponse,\n CommandEventType,\n CommandRequestType,\n CommandEventMap,\n ContainerCreateRequest,\n ContainerCreateResponse,\n ContainerGetRequest,\n ContainerGetResponse,\n ContainerListRequest,\n ContainerListResponse,\n AgentGetRequest,\n AgentGetResponse,\n AgentListRequest,\n AgentListResponse,\n AgentDestroyRequest,\n AgentDestroyResponse,\n MessageSendRequest,\n MessageSendResponse,\n AgentInterruptRequest,\n AgentInterruptResponse,\n ImageCreateRequest,\n ImageCreateResponse,\n ImageRunRequest,\n ImageRunResponse,\n ImageStopRequest,\n ImageStopResponse,\n ImageUpdateRequest,\n ImageUpdateResponse,\n ImageListRequest,\n ImageListResponse,\n ImageListItem,\n ImageGetRequest,\n ImageGetResponse,\n ImageDeleteRequest,\n ImageDeleteResponse,\n} from \"@agentxjs/types/event\";\n\nexport { isCommandEvent, isCommandRequest, isCommandResponse } from \"@agentxjs/types/event\";\n\n// Agent events\nexport type {\n AgentEvent,\n AgentEventCategory,\n AgentStreamEvent,\n AgentTextDeltaEvent,\n AgentMessageStartEvent,\n AgentMessageStopEvent,\n AgentToolUseStartEvent,\n AgentToolUseStopEvent,\n AgentToolResultEvent,\n AgentStateEvent,\n ConversationStartEvent,\n ConversationEndEvent,\n ConversationThinkingEvent,\n ConversationRespondingEvent,\n ToolExecutingEvent,\n ToolCompletedEvent,\n ErrorOccurredEvent,\n AgentMessageEvent,\n UserMessageEvent,\n AssistantMessageEvent,\n ToolCallMessageEvent,\n ToolResultMessageEvent,\n AgentTurnEvent,\n TurnRequestEvent,\n TurnResponseEvent,\n TokenUsage,\n} from \"@agentxjs/types/event\";\n\nexport {\n isAgentEvent,\n isAgentStreamEvent,\n isAgentStateEvent,\n isAgentMessageEvent,\n isAgentTurnEvent,\n} from \"@agentxjs/types/event\";\n\n// Data types\nexport type { ImageRecord } from \"@agentxjs/types\";\n\nexport type {\n Message,\n UserMessage,\n AssistantMessage,\n ToolCallMessage,\n ToolResultMessage,\n AgentError,\n ContentPart,\n TextPart,\n ToolCallPart,\n ToolResultPart,\n ToolResultOutput,\n} from \"@agentxjs/types/agent\";\n\n// Browser-only createAgentX (remote mode only)\nimport type { AgentX, AgentXConfig } from \"@agentxjs/types/agentx\";\nimport { isRemoteConfig } from \"@agentxjs/types/agentx\";\nimport { createRemoteAgentX } from \"./createAgentX\";\n\n/**\n * Create AgentX instance (Browser version - remote mode only)\n *\n * @param config - Must be RemoteConfig with server URL\n * @returns AgentX instance\n *\n * @example\n * ```typescript\n * const agentx = await createAgentX({ server: \"ws://localhost:5200\" });\n * ```\n */\nexport async function createAgentX(config: AgentXConfig): Promise<AgentX> {\n if (!config || !isRemoteConfig(config)) {\n throw new Error(\n \"Browser environment only supports remote mode. \" +\n 'Please provide { serverUrl: \"ws://...\" } configuration.'\n );\n }\n return createRemoteAgentX(config.serverUrl);\n}\n\n// Also export createRemoteAgentX for explicit usage\nexport { createRemoteAgentX } from \"./createAgentX\";\n"]}
1
+ {"version":3,"sources":["../../common/src/logger/LoggerFactoryImpl.ts","../../common/src/logger/ConsoleLogger.ts","../../types/src/agentx/index.ts","../../types/src/event/base/SystemEvent.ts","../../types/src/event/command/CommandEvent.ts","../../types/src/event/agent/stream/index.ts","../../types/src/event/agent/state/index.ts","../../types/src/event/agent/message/index.ts","../../types/src/event/agent/turn/index.ts","../../types/src/event/agent/index.ts","../src/createAgentX.ts","../src/browser.ts"],"names":["_ConsoleLogger"],"mappings":";;;;;;;;AAiHO,SAAS,aAAa,IAAA,EAAsB;AACjD,EAAA,OAAO,iBAAA,CAAkB,UAAU,IAAI,CAAA;AACzC;ACpGa,IAAA,SAAA,EAAA,eAAA,EAAA,aAAA,EAAA,cAAA,EAAA,eDFT,eAAA,EAaS,iBAAA;;;;;;ACXN,IAAM,cAAA,GAAN,MAAMA,eAAAA,CAAgC;MAc3C,WAAA,CAAY,IAAA,EAAc,OAAA,GAAgC,EAAC,EAAG;AAb9D,QAAA,aAAA,CAAA,MAAS,MAAA,CAAA;AACT,QAAA,aAAA,CAAA,MAAS,OAAA,CAAA;AACT,QAAA,aAAA,CAAA,MAAiB,QAAA,CAAA;AACjB,QAAA,aAAA,CAAA,MAAiB,YAAA,CAAA;AAWf,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,QAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,MAAA;AAC9B,QAAA,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,IAAA,CAAK,iBAAA,EAAkB;AACvD,QAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,IAAA;AAC1C,MAAA;AAEA,MAAA,KAAA,CAAM,SAAiB,OAAA,EAA4B;AACjD,QAAA,IAAI,IAAA,CAAK,gBAAe,EAAG;AACzB,UAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AACpC,QAAA;AACF,MAAA;AAEA,MAAA,IAAA,CAAK,SAAiB,OAAA,EAA4B;AAChD,QAAA,IAAI,IAAA,CAAK,eAAc,EAAG;AACxB,UAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AACnC,QAAA;AACF,MAAA;AAEA,MAAA,IAAA,CAAK,SAAiB,OAAA,EAA4B;AAChD,QAAA,IAAI,IAAA,CAAK,eAAc,EAAG;AACxB,UAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AACnC,QAAA;AACF,MAAA;AAEA,MAAA,KAAA,CAAM,SAAyB,OAAA,EAA4B;AACzD,QAAA,IAAI,IAAA,CAAK,gBAAe,EAAG;AACzB,UAAA,IAAI,mBAAmB,KAAA,EAAO;AAC5B,YAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;UACzE,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AACpC,UAAA;AACF,QAAA;AACF,MAAA;MAEA,cAAA,GAA0B;AACxB,QAAA,OAAO,KAAK,aAAA,CAAc,IAAA,CAAK,KAAK,CAAA,IAAK,IAAA,CAAK,cAAc,OAAO,CAAA;AACrE,MAAA;MAEA,aAAA,GAAyB;AACvB,QAAA,OAAO,KAAK,aAAA,CAAc,IAAA,CAAK,KAAK,CAAA,IAAK,IAAA,CAAK,cAAc,MAAM,CAAA;AACpE,MAAA;MAEA,aAAA,GAAyB;AACvB,QAAA,OAAO,KAAK,aAAA,CAAc,IAAA,CAAK,KAAK,CAAA,IAAK,IAAA,CAAK,cAAc,MAAM,CAAA;AACpE,MAAA;MAEA,cAAA,GAA0B;AACxB,QAAA,OAAO,KAAK,aAAA,CAAc,IAAA,CAAK,KAAK,CAAA,IAAK,IAAA,CAAK,cAAc,OAAO,CAAA;AACrE,MAAA;AAEQ,MAAA,aAAA,CAAc,KAAA,EAAyB;AAC7C,QAAA,MAAM,MAAA,GAAmC;UACvC,KAAA,EAAO,CAAA;UACP,IAAA,EAAM,CAAA;UACN,IAAA,EAAM,CAAA;UACN,KAAA,EAAO,CAAA;UACP,MAAA,EAAQ;AACV,SAAA;AACA,QAAA,OAAO,OAAO,KAAK,CAAA;AACrB,MAAA;MAEQ,GAAA,CAAI,KAAA,EAAe,SAAiB,OAAA,EAA4B;AACtE,QAAA,MAAM,QAAkB,EAAC;AAEzB,QAAA,IAAI,KAAK,UAAA,EAAY;AACnB,UAAA,KAAA,CAAM,IAAA,CAAA,iBAAK,IAAI,IAAA,EAAK,EAAE,aAAa,CAAA;AACrC,QAAA;AAEA,QAAA,IAAI,KAAK,MAAA,EAAQ;AACf,UAAA,MAAM,KAAA,GAAQA,eAAAA,CAAc,MAAA,CAAO,KAA0C,CAAA;AAC7E,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,EAAG,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAA,EAAGA,eAAAA,CAAc,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;QACtE,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AAC5B,QAAA;AAEA,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAC3B,QAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAElB,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAC9B,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA;AAEjD,QAAA,IAAI,WAAW,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AAC9C,UAAA,aAAA,CAAc,SAAS,OAAO,CAAA;QAChC,CAAA,MAAO;AACL,UAAA,aAAA,CAAc,OAAO,CAAA;AACvB,QAAA;AACF,MAAA;AAEQ,MAAA,gBAAA,CAAiB,KAAA,EAA6C;AACpE,QAAA,QAAQ,KAAA;UACN,KAAK,OAAA;AACH,YAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;UACnC,KAAK,MAAA;AACH,YAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;UAClC,KAAK,MAAA;AACH,YAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;UAClC,KAAK,OAAA;AACH,YAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AACnC,UAAA;AACE,YAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AACnC;AACF,MAAA;MAEQ,iBAAA,GAA6B;AACnC,QAAA,OAAO,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,UAAU,IAAA,KAAS,MAAA;AACtE,MAAA;AACF,KAAA;AAnHE,IAAA,aAAA,CANW,gBAMa,QAAA,EAAS;MAC/B,KAAA,EAAO,UAAA;MACP,IAAA,EAAM,UAAA;MACN,IAAA,EAAM,UAAA;MACN,KAAA,EAAO,UAAA;MACP,KAAA,EAAO;KACT,CAAA;AAZK,IAAM,aAAA,GAAN,cAAA;ADFP,IAAI,eAAA,GAAwC,IAAA;AAarC,IAAM,oBAAN,MAAwB;AAM7B,MAAA,OAAO,UAAU,WAAA,EAAqE;AACpF,QAAA,MAAM,IAAA,GAAO,OAAO,WAAA,KAAgB,QAAA,GAAW,cAAc,WAAA,CAAY,IAAA;AAEzE,QAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG;AAC1B,UAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC9B,QAAA;AAEA,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,IAAI,CAAA;AAC7C,QAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,UAAU,CAAA;AACjC,QAAA,OAAO,UAAA;AACT,MAAA;AAEA,MAAA,OAAO,UAAU,MAAA,EAAmC;AAClD,QAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAC5C,MAAA;AAEA,MAAA,OAAO,KAAA,GAAc;AACnB,QAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,QAAA,IAAA,CAAK,MAAA,GAAS,EAAE,YAAA,EAAc,MAAA,EAAO;AACrC,QAAA,eAAA,GAAkB,IAAA;AACpB,MAAA;AAEA,MAAA,OAAe,iBAAiB,IAAA,EAAsB;AACpD,QAAA,IAAI,UAAA,GAA4B,IAAA;AAEhC,QAAA,MAAM,gBAAgB,MAAc;AAClC,UAAA,IAAI,CAAC,UAAA,EAAY;AACf,YAAA,UAAA,GAAa,IAAA,CAAK,aAAa,IAAI,CAAA;AACrC,UAAA;AACA,UAAA,OAAO,UAAA;AACT,QAAA,CAAA;AAEA,QAAA,OAAO;AACL,UAAA,IAAA;UACA,KAAA,EAAO,IAAA,CAAK,OAAO,YAAA,IAAgB,MAAA;AACnC,UAAA,KAAA,EAAO,CAAC,OAAA,EAAiB,OAAA,KAAyB,eAAc,CAAE,KAAA,CAAM,SAAS,OAAO,CAAA;AACxF,UAAA,IAAA,EAAM,CAAC,OAAA,EAAiB,OAAA,KAAyB,eAAc,CAAE,IAAA,CAAK,SAAS,OAAO,CAAA;AACtF,UAAA,IAAA,EAAM,CAAC,OAAA,EAAiB,OAAA,KAAyB,eAAc,CAAE,IAAA,CAAK,SAAS,OAAO,CAAA;AACtF,UAAA,KAAA,EAAO,CAAC,OAAA,EAAyB,OAAA,KAC/B,eAAc,CAAE,KAAA,CAAM,SAAS,OAAO,CAAA;UACxC,cAAA,EAAgB,MAAM,aAAA,EAAc,CAAE,cAAA,EAAe;UACrD,aAAA,EAAe,MAAM,aAAA,EAAc,CAAE,aAAA,EAAc;UACnD,aAAA,EAAe,MAAM,aAAA,EAAc,CAAE,aAAA,EAAc;UACnD,cAAA,EAAgB,MAAM,aAAA,EAAc,CAAE,cAAA;AACxC,SAAA;AACF,MAAA;AAEA,MAAA,OAAe,aAAa,IAAA,EAAsB;AAChD,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,OAAO,eAAA,CAAgB,UAAU,IAAI,CAAA;AACvC,QAAA;AAEA,QAAA,IAAI,IAAA,CAAK,OAAO,qBAAA,EAAuB;AACrC,UAAA,OAAO,IAAA,CAAK,MAAA,CAAO,qBAAA,CAAsB,IAAI,CAAA;AAC/C,QAAA;AAEA,QAAA,OAAO,IAAI,cAAc,IAAA,EAAM;AAC7B,UAAA,KAAA,EAAO,KAAK,MAAA,CAAO,YAAA;AACnB,UAAA,GAAG,KAAK,MAAA,CAAO;SAChB,CAAA;AACH,MAAA;AACF,KAAA;AAlEE,IAAA,aAAA,CADW,iBAAA,EACI,SAAA,kBAA+B,IAAI,GAAA,EAAI,CAAA;AACtD,IAAA,aAAA,CAFW,mBAEI,QAAA,EAA8B;MAC3C,YAAA,EAAc;KAChB,CAAA;;;;;AEwNK,SAAS,eAAe,MAAA,EAA8C;AAC3E,EAAA,OAAO,WAAA,IAAe,MAAA,IAAU,OAAO,MAAA,CAAO,SAAA,KAAc,QAAA;AAC9D;AAKO,SAAS,cAAc,MAAA,EAA6C;AACzE,EAAA,OAAO,CAAC,eAAe,MAAM,CAAA;AAC/B;;;AChDO,SAAS,YAAA,CACd,OACA,MAAA,EAC0C;AAC1C,EAAA,OAAO,MAAM,MAAA,KAAW,MAAA;AAC1B;AAKO,SAAS,SAAA,CACd,OACA,MAAA,EACsE;AACtE,EAAA,OAAO,MAAM,MAAA,KAAW,MAAA;AAC1B;AAKO,SAAS,UAAU,KAAA,EAA6B;AACrD,EAAA,OAAO,MAAM,MAAA,KAAW,SAAA;AAC1B;AAKO,SAAS,SAAS,KAAA,EAA6B;AACpD,EAAA,OAAO,MAAM,MAAA,KAAW,QAAA;AAC1B;AAKO,SAAS,eAAe,KAAA,EAA6B;AAC1D,EAAA,OAAO,MAAM,MAAA,KAAW,cAAA;AAC1B;AC2VO,SAAS,eAAe,KAAA,EAAmD;AAChF,EAAA,OAAO,MAAM,MAAA,KAAW,SAAA;AAC1B;AAKO,SAAS,iBAAiB,KAAA,EAGL;AAC1B,EAAA,OAAO,KAAA,CAAM,MAAA,KAAW,SAAA,IAAa,KAAA,CAAM,QAAA,KAAa,SAAA;AAC1D;AAKO,SAAS,kBAAkB,KAAA,EAGL;AAC3B,EAAA,OAAO,KAAA,CAAM,MAAA,KAAW,SAAA,IAAa,KAAA,CAAM,QAAA,KAAa,UAAA;AAC1D;AC3aO,SAAS,mBAAmB,KAAA,EAGL;AAC5B,EAAA,OAAO,KAAA,CAAM,MAAA,KAAW,OAAA,IAAW,KAAA,CAAM,QAAA,KAAa,QAAA;AACxD;ACRO,SAAS,kBAAkB,KAAA,EAGL;AAC3B,EAAA,OAAO,KAAA,CAAM,MAAA,KAAW,OAAA,IAAW,KAAA,CAAM,QAAA,KAAa,OAAA;AACxD;ACtEO,SAAS,oBAAoB,KAAA,EAGL;AAC7B,EAAA,OAAO,KAAA,CAAM,MAAA,KAAW,OAAA,IAAW,KAAA,CAAM,QAAA,KAAa,SAAA;AACxD;AC5CO,SAAS,iBAAiB,KAAA,EAGL;AAC1B,EAAA,OAAO,KAAA,CAAM,MAAA,KAAW,OAAA,IAAW,KAAA,CAAM,QAAA,KAAa,MAAA;AACxD;ACpBO,SAAS,aAAa,KAAA,EAAiD;AAC5E,EAAA,OAAO,MAAM,MAAA,KAAW,OAAA;AAC1B;;;AC7CA,SAAA,EAAA;AAEA,IAAM,YAAA,GAAe,aAAa,qBAAqB,CAAA;AAwCvD,eAAsB,mBAAmB,SAAA,EAAoC;AAE3E,EAAA,MAAM,EAAE,qBAAA,EAAsB,GAAI,MAAM,OAAO,mBAAmB,CAAA;AAElE,EAAA,MAAM,MAAA,GAAS,MAAM,qBAAA,CAAsB;AAAA,IACzC,SAAA;AAAA,IACA,aAAA,EAAe,IAAA;AAAA,IACf,oBAAA,EAAsB,GAAA;AAAA,IACtB,oBAAA,EAAsB,GAAA;AAAA,IACtB,iBAAA,EAAmB,GAAA;AAAA,IACnB,UAAA,EAAY,QAAA;AAAA,IACZ,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,MAAM,QAAA,uBAAe,GAAA,EAA+C;AACpE,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAO1B;AAGF,EAAA,MAAA,CAAO,SAAA,CAAU,CAAC,OAAA,KAAoB;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAEhC,MAAA,YAAA,CAAa,KAAK,gBAAA,EAAkB;AAAA,QAClC,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,SAAA,EAAY,MAAM,IAAA,EAAc;AAAA,OACjC,CAAA;AAGD,MAAA,IAAI,KAAA,CAAM,SAAS,cAAA,EAAgB;AACjC,QAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AACxB,QAAA,YAAA,CAAa,KAAA,CAAM,UAAU,OAAA,EAAS;AAAA,UACpC,UAAU,SAAA,CAAU,QAAA;AAAA,UACpB,SAAA,EAAY,MAAM,IAAA,EAAc,SAAA;AAAA,UAChC,SAAS,SAAA,CAAU;AAAA,SACpB,CAAA;AAAA,MAEH;AAGA,MAAA,MAAM,SAAA,GAAa,MAAM,IAAA,EAAiC,SAAA;AAC1D,MAAA,IAAI,MAAM,QAAA,KAAa,UAAA,IAAc,aAAa,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA,EAAG;AAChF,QAAA,YAAA,CAAa,KAAK,2BAAA,EAA6B,EAAE,WAAW,SAAA,EAAW,KAAA,CAAM,MAAM,CAAA;AACnF,QAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA;AAC7C,QAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC1B,QAAA,eAAA,CAAgB,OAAO,SAAS,CAAA;AAChC,QAAA,OAAA,CAAQ,QAAQ,KAAK,CAAA;AACrB,QAAA;AAAA,MACF;AAEA,MAAA,YAAA,CAAa,KAAK,yBAAA,EAA2B,EAAE,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA;AAGjE,MAAA,MAAM,YAAA,GAAe,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC5C,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,KAAA,MAAW,WAAW,YAAA,EAAc;AAClC,UAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,QACf;AAAA,MACF;AAGA,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AACpC,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,KAAA,MAAW,WAAW,WAAA,EAAa;AACjC,UAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,QACf;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,QAAQ,MAAM;AACnB,IAAA,YAAA,CAAa,KAAK,kBAAkB,CAAA;AAAA,EACtC,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAiB;AAC/B,IAAA,YAAA,CAAa,MAAM,iBAAA,EAAmB,EAAE,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA;AAAA,EAChE,CAAC,CAAA;AAED,EAAA,SAAS,SAAA,CAAU,MAAc,OAAA,EAAoD;AACnF,IAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG;AACvB,MAAA,QAAA,CAAS,GAAA,CAAI,IAAA,kBAAM,IAAI,GAAA,EAAK,CAAA;AAAA,IAC9B;AACA,IAAA,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,CAAG,GAAA,CAAI,OAAO,CAAA;AAC/B,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA;AAAA,IACpC,CAAA;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,CACE,IAAA,EACA,IAAA,EACA,OAAA,GAAkB,GAAA,EACY;AAC9B,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,QAAA,MAAM,SAAA,GAAY,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAEjF,QAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,UAAA,eAAA,CAAgB,OAAO,SAAS,CAAA;AAChC,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAI,EAAE,CAAC,CAAA;AAAA,QAC9C,GAAG,OAAO,CAAA;AAEV,QAAA,eAAA,CAAgB,IAAI,SAAA,EAAW;AAAA,UAC7B,OAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,MAAM,KAAA,GAAqB;AAAA,UACzB,IAAA;AAAA,UACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,SAAA,EAAU;AAAA,UAC3B,MAAA,EAAQ,SAAA;AAAA,UACR,QAAA,EAAU,SAAA;AAAA,UACV,MAAA,EAAQ;AAAA,SACV;AAEA,QAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,MACnC,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,EAAA,CACE,MACA,OAAA,EACa;AACb,MAAA,OAAO,SAAA,CAAU,MAAM,OAAuC,CAAA;AAAA,IAChE,CAAA;AAAA,IAEA,SAAA,CACE,MACA,OAAA,EACa;AACb,MAAA,OAAO,SAAA,CAAU,MAAM,OAAuC,CAAA;AAAA,IAChE,CAAA;AAAA,IAEA,WAAA,CAA6C,MAAS,IAAA,EAAwC;AAC5F,MAAA,MAAM,KAAA,GAAqB;AAAA,QACzB,IAAA;AAAA,QACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,IAAA;AAAA,QACA,MAAA,EAAQ,SAAA;AAAA,QACR,UAAU,IAAA,CAAK,QAAA,GAAW,QAAA,CAAS,WAAW,IAAI,UAAA,GAAa,SAAA;AAAA,QAC/D,QAAQ,IAAA,CAAK,QAAA,GAAW,QAAA,CAAS,WAAW,IAAI,QAAA,GAAW;AAAA,OAC7D;AACA,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,IACnC,CAAA;AAAA,IAEA,MAAM,MAAA,GAAS;AACb,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD,CAAA;AAAA,IAEA,MAAM,KAAA,GAAQ;AAAA,IAEd,CAAA;AAAA,IAEA,MAAM,OAAA,GAAU;AACd,MAAA,KAAA,MAAW,OAAA,IAAW,eAAA,CAAgB,MAAA,EAAO,EAAG;AAC9C,QAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC1B,QAAA,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,CAAM,iBAAiB,CAAC,CAAA;AAAA,MAC7C;AACA,MAAA,eAAA,CAAgB,KAAA,EAAM;AACtB,MAAA,QAAA,CAAS,KAAA,EAAM;AACf,MAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,IACjB;AAAA,GACF;AACF;;;AClFA,eAAsB,aAAa,MAAA,EAAuC;AACxE,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,cAAA,CAAe,MAAM,CAAA,EAAG;AACtC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AACA,EAAA,OAAO,kBAAA,CAAmB,OAAO,SAAS,CAAA;AAC5C","file":"browser.cjs","sourcesContent":["/**\n * LoggerFactoryImpl - Central factory for creating logger instances\n *\n * Implements lazy initialization pattern:\n * - createLogger() can be called at module level (before config)\n * - Real logger is created on first use\n * - External LoggerFactory can be injected via Runtime\n */\n\nimport type { Logger, LoggerFactory, LogContext, LogLevel } from \"@agentxjs/types\";\nimport { ConsoleLogger, type ConsoleLoggerOptions } from \"./ConsoleLogger\";\n\n// External factory injected via Runtime\nlet externalFactory: LoggerFactory | null = null;\n\nexport interface LoggerFactoryConfig {\n defaultImplementation?: (name: string) => Logger;\n defaultLevel?: LogLevel;\n consoleOptions?: Omit<ConsoleLoggerOptions, \"level\">;\n}\n\n/**\n * Internal LoggerFactory implementation\n *\n * Uses lazy proxy pattern to allow module-level createLogger() calls.\n */\nexport class LoggerFactoryImpl {\n private static loggers: Map<string, Logger> = new Map();\n private static config: LoggerFactoryConfig = {\n defaultLevel: \"info\",\n };\n\n static getLogger(nameOrClass: string | (new (...args: unknown[]) => unknown)): Logger {\n const name = typeof nameOrClass === \"string\" ? nameOrClass : nameOrClass.name;\n\n if (this.loggers.has(name)) {\n return this.loggers.get(name)!;\n }\n\n const lazyLogger = this.createLazyLogger(name);\n this.loggers.set(name, lazyLogger);\n return lazyLogger;\n }\n\n static configure(config: LoggerFactoryConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n static reset(): void {\n this.loggers.clear();\n this.config = { defaultLevel: \"info\" };\n externalFactory = null;\n }\n\n private static createLazyLogger(name: string): Logger {\n let realLogger: Logger | null = null;\n\n const getRealLogger = (): Logger => {\n if (!realLogger) {\n realLogger = this.createLogger(name);\n }\n return realLogger;\n };\n\n return {\n name,\n level: this.config.defaultLevel || \"info\",\n debug: (message: string, context?: LogContext) => getRealLogger().debug(message, context),\n info: (message: string, context?: LogContext) => getRealLogger().info(message, context),\n warn: (message: string, context?: LogContext) => getRealLogger().warn(message, context),\n error: (message: string | Error, context?: LogContext) =>\n getRealLogger().error(message, context),\n isDebugEnabled: () => getRealLogger().isDebugEnabled(),\n isInfoEnabled: () => getRealLogger().isInfoEnabled(),\n isWarnEnabled: () => getRealLogger().isWarnEnabled(),\n isErrorEnabled: () => getRealLogger().isErrorEnabled(),\n };\n }\n\n private static createLogger(name: string): Logger {\n if (externalFactory) {\n return externalFactory.getLogger(name);\n }\n\n if (this.config.defaultImplementation) {\n return this.config.defaultImplementation(name);\n }\n\n return new ConsoleLogger(name, {\n level: this.config.defaultLevel,\n ...this.config.consoleOptions,\n });\n }\n}\n\n/**\n * Set external LoggerFactory (called by Runtime initialization)\n */\nexport function setLoggerFactory(factory: LoggerFactory): void {\n externalFactory = factory;\n LoggerFactoryImpl.reset();\n externalFactory = factory;\n}\n\n/**\n * Create a logger instance\n *\n * Safe to call at module level before Runtime is configured.\n * Uses lazy initialization - actual logger is created on first use.\n *\n * @param name - Logger name (hierarchical, e.g., \"engine/AgentEngine\")\n * @returns Logger instance (lazy proxy)\n */\nexport function createLogger(name: string): Logger {\n return LoggerFactoryImpl.getLogger(name);\n}\n","/**\n * ConsoleLogger - Default logger implementation\n *\n * Simple console-based logger with color support.\n * Used as fallback when no custom LoggerFactory is provided.\n */\n\nimport type { Logger, LogContext, LogLevel } from \"@agentxjs/types\";\n\nexport interface ConsoleLoggerOptions {\n level?: LogLevel;\n colors?: boolean;\n timestamps?: boolean;\n}\n\nexport class ConsoleLogger implements Logger {\n readonly name: string;\n readonly level: LogLevel;\n private readonly colors: boolean;\n private readonly timestamps: boolean;\n\n private static readonly COLORS = {\n DEBUG: \"\\x1b[36m\",\n INFO: \"\\x1b[32m\",\n WARN: \"\\x1b[33m\",\n ERROR: \"\\x1b[31m\",\n RESET: \"\\x1b[0m\",\n };\n\n constructor(name: string, options: ConsoleLoggerOptions = {}) {\n this.name = name;\n this.level = options.level ?? \"info\";\n this.colors = options.colors ?? this.isNodeEnvironment();\n this.timestamps = options.timestamps ?? true;\n }\n\n debug(message: string, context?: LogContext): void {\n if (this.isDebugEnabled()) {\n this.log(\"DEBUG\", message, context);\n }\n }\n\n info(message: string, context?: LogContext): void {\n if (this.isInfoEnabled()) {\n this.log(\"INFO\", message, context);\n }\n }\n\n warn(message: string, context?: LogContext): void {\n if (this.isWarnEnabled()) {\n this.log(\"WARN\", message, context);\n }\n }\n\n error(message: string | Error, context?: LogContext): void {\n if (this.isErrorEnabled()) {\n if (message instanceof Error) {\n this.log(\"ERROR\", message.message, { ...context, stack: message.stack });\n } else {\n this.log(\"ERROR\", message, context);\n }\n }\n }\n\n isDebugEnabled(): boolean {\n return this.getLevelValue(this.level) <= this.getLevelValue(\"debug\");\n }\n\n isInfoEnabled(): boolean {\n return this.getLevelValue(this.level) <= this.getLevelValue(\"info\");\n }\n\n isWarnEnabled(): boolean {\n return this.getLevelValue(this.level) <= this.getLevelValue(\"warn\");\n }\n\n isErrorEnabled(): boolean {\n return this.getLevelValue(this.level) <= this.getLevelValue(\"error\");\n }\n\n private getLevelValue(level: LogLevel): number {\n const levels: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n };\n return levels[level];\n }\n\n private log(level: string, message: string, context?: LogContext): void {\n const parts: string[] = [];\n\n if (this.timestamps) {\n parts.push(new Date().toISOString());\n }\n\n if (this.colors) {\n const color = ConsoleLogger.COLORS[level as keyof typeof ConsoleLogger.COLORS];\n parts.push(`${color}${level.padEnd(5)}${ConsoleLogger.COLORS.RESET}`);\n } else {\n parts.push(level.padEnd(5));\n }\n\n parts.push(`[${this.name}]`);\n parts.push(message);\n\n const logLine = parts.join(\" \");\n const consoleMethod = this.getConsoleMethod(level);\n\n if (context && Object.keys(context).length > 0) {\n consoleMethod(logLine, context);\n } else {\n consoleMethod(logLine);\n }\n }\n\n private getConsoleMethod(level: string): (...args: unknown[]) => void {\n switch (level) {\n case \"DEBUG\":\n return console.debug.bind(console);\n case \"INFO\":\n return console.info.bind(console);\n case \"WARN\":\n return console.warn.bind(console);\n case \"ERROR\":\n return console.error.bind(console);\n default:\n return console.log.bind(console);\n }\n }\n\n private isNodeEnvironment(): boolean {\n return typeof process !== \"undefined\" && process.versions?.node !== undefined;\n }\n}\n","/**\n * AgentX - Unified High-Level API for AI Agents\n *\n * AgentX provides a simple, consistent API for both local and remote modes.\n * It wraps Runtime and provides the same interface regardless of deployment.\n *\n * ## Two Modes\n *\n * ```\n * Local Mode Remote Mode\n * ─────────────────────────────────────────────────────────\n * AgentX AgentX\n * │ │\n * └── Runtime (embedded) └── WebSocket ──→ Server\n * │ │\n * └── LLM, Storage └── Runtime\n * ```\n *\n * ## API Design\n *\n * All operations use CommandEvent pattern:\n * - `request(type, data)` - Send request, wait for response\n * - `on(type, handler)` - Subscribe to events\n * - `onCommand(type, handler)` - Type-safe command subscription\n *\n * ## Usage\n *\n * ```typescript\n * // Local mode (default)\n * const agentx = await createAgentX();\n *\n * // Local mode with custom LLM and storage\n * const agentx = await createAgentX({\n * llm: { apiKey: \"sk-...\", model: \"claude-opus-4-20250514\" },\n * storage: { driver: \"postgresql\", url: \"postgres://...\" },\n * });\n *\n * // Remote mode\n * const agentx = await createAgentX({ server: \"ws://localhost:5200\" });\n *\n * // Same API for both modes!\n * const res = await agentx.request(\"container_create_request\", {\n * containerId: \"my-container\"\n * });\n *\n * agentx.on(\"text_delta\", (e) => console.log(e.data.text));\n *\n * await agentx.dispose();\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { SystemEvent } from \"~/event/base\";\nimport type {\n CommandEventMap,\n CommandRequestType,\n ResponseEventFor,\n RequestDataFor,\n} from \"~/event/command\";\nimport type { LogLevel, LoggerFactory } from \"~/common/logger\";\n\n// ============================================================================\n// Configuration - Local Mode\n// ============================================================================\n\n/**\n * LLM configuration\n */\nexport interface LLMConfig {\n /**\n * Anthropic API key (required)\n */\n apiKey: string;\n\n /**\n * API base URL\n * @default \"https://api.anthropic.com\"\n */\n baseUrl?: string;\n\n /**\n * Model name\n * @default \"claude-sonnet-4-20250514\"\n */\n model?: string;\n}\n\n/**\n * Storage driver type\n */\nexport type StorageDriver =\n | \"memory\"\n | \"fs\"\n | \"redis\"\n | \"mongodb\"\n | \"sqlite\"\n | \"mysql\"\n | \"postgresql\";\n\n/**\n * Storage configuration\n */\nexport interface StorageConfig {\n /**\n * Storage driver\n * @default \"memory\"\n */\n driver?: StorageDriver;\n\n /**\n * File path (for sqlite, fs drivers)\n * @example \"./data.db\" for sqlite\n * @example \"./data\" for fs\n */\n path?: string;\n\n /**\n * Connection URL (for redis, mongodb, mysql, postgresql)\n * @example \"redis://localhost:6379\"\n * @example \"mongodb://localhost:27017/agentx\"\n * @example \"mysql://user:pass@localhost:3306/agentx\"\n * @example \"postgres://user:pass@localhost:5432/agentx\"\n */\n url?: string;\n}\n\n/**\n * Logger configuration\n */\nexport interface LoggerConfig {\n /**\n * Log level\n * @default LogLevel.INFO\n */\n level?: LogLevel;\n\n /**\n * Custom logger factory implementation\n * If provided, this factory will be used to create all logger instances.\n * If not provided, uses ConsoleLogger with console options.\n */\n factory?: LoggerFactory;\n\n /**\n * Console logger options (only used when factory is not provided)\n */\n console?: {\n /**\n * Enable colored output\n * @default true (Node.js), false (browser)\n */\n colors?: boolean;\n\n /**\n * Include timestamps in log output\n * @default true\n */\n timestamps?: boolean;\n };\n}\n\n/**\n * Local mode configuration\n *\n * Runs AgentX with local runtime, connecting directly to LLM API.\n */\nexport interface LocalConfig {\n /**\n * LLM configuration\n */\n llm?: LLMConfig;\n\n /**\n * Storage configuration\n */\n storage?: StorageConfig;\n\n /**\n * Logger configuration\n */\n logger?: LoggerConfig;\n\n /**\n * HTTP server to attach WebSocket to.\n * If provided, WebSocket upgrade will be handled on the same port.\n * The server should handle authentication before upgrading.\n *\n * @example\n * ```typescript\n * import { createServer } from \"http\";\n * import { Hono } from \"hono\";\n *\n * const app = new Hono();\n * // ... add auth middleware\n *\n * const server = createServer(app.fetch);\n * const agentx = await createAgentX({ server });\n *\n * server.listen(5200);\n * ```\n */\n server?: {\n on(\n event: \"upgrade\",\n listener: (\n request: { url?: string; headers: { host?: string } },\n socket: unknown,\n head: unknown\n ) => void\n ): void;\n };\n}\n\n// ============================================================================\n// Configuration - Remote Mode\n// ============================================================================\n\n/**\n * Remote mode configuration\n *\n * Connects to a remote AgentX server via WebSocket.\n */\nexport interface RemoteConfig {\n /**\n * Remote server URL (WebSocket)\n * @example \"ws://localhost:5200\"\n */\n serverUrl: string;\n}\n\n// ============================================================================\n// Union Type\n// ============================================================================\n\n/**\n * AgentX configuration\n *\n * - LocalConfig: Run with local runtime (default)\n * - RemoteConfig: Connect to remote server\n */\nexport type AgentXConfig = LocalConfig | RemoteConfig;\n\n/**\n * Type guard: is this a remote config?\n */\nexport function isRemoteConfig(config: AgentXConfig): config is RemoteConfig {\n return \"serverUrl\" in config && typeof config.serverUrl === \"string\";\n}\n\n/**\n * Type guard: is this a local config?\n */\nexport function isLocalConfig(config: AgentXConfig): config is LocalConfig {\n return !isRemoteConfig(config);\n}\n\n// ============================================================================\n// Unsubscribe\n// ============================================================================\n\n/**\n * Unsubscribe function\n */\nexport type Unsubscribe = () => void;\n\n// ============================================================================\n// AgentX Interface\n// ============================================================================\n\n/**\n * AgentX - Main API interface\n *\n * Unified API for both local and remote modes.\n */\nexport interface AgentX {\n // ==================== Core API ====================\n\n /**\n * Send a command request and wait for response.\n *\n * @example\n * ```typescript\n * const res = await agentx.request(\"container_create_request\", {\n * containerId: \"my-container\"\n * });\n * console.log(res.data.containerId);\n * ```\n */\n request<T extends CommandRequestType>(\n type: T,\n data: RequestDataFor<T>,\n timeout?: number\n ): Promise<ResponseEventFor<T>>;\n\n /**\n * Subscribe to events.\n *\n * @example\n * ```typescript\n * agentx.on(\"text_delta\", (e) => {\n * process.stdout.write(e.data.text);\n * });\n * ```\n */\n on<T extends string>(type: T, handler: (event: SystemEvent & { type: T }) => void): Unsubscribe;\n\n /**\n * Subscribe to command events with full type safety.\n *\n * @example\n * ```typescript\n * agentx.onCommand(\"container_create_response\", (e) => {\n * console.log(e.data.containerId);\n * });\n * ```\n */\n onCommand<T extends keyof CommandEventMap>(\n type: T,\n handler: (event: CommandEventMap[T]) => void\n ): Unsubscribe;\n\n /**\n * Emit a command event.\n *\n * For fine-grained control. Usually prefer `request()`.\n */\n emitCommand<T extends keyof CommandEventMap>(type: T, data: CommandEventMap[T][\"data\"]): void;\n\n // ==================== Server API (local mode only) ====================\n\n /**\n * Start listening for remote connections.\n *\n * Only available in local mode.\n *\n * @example\n * ```typescript\n * await agentx.listen(5200);\n * console.log(\"Server running on ws://localhost:5200\");\n * ```\n */\n listen(port: number, host?: string): Promise<void>;\n\n /**\n * Stop listening for remote connections.\n */\n close(): Promise<void>;\n\n // ==================== Lifecycle ====================\n\n /**\n * Dispose AgentX and release all resources.\n */\n dispose(): Promise<void>;\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Create AgentX instance\n *\n * @example\n * ```typescript\n * // Local mode (default)\n * const agentx = await createAgentX();\n *\n * // Local mode with config\n * const agentx = await createAgentX({\n * llm: { apiKey: \"sk-...\" },\n * storage: { driver: \"sqlite\", path: \"./data.db\" },\n * });\n *\n * // Remote mode\n * const agentx = await createAgentX({ server: \"ws://localhost:5200\" });\n * ```\n */\nexport declare function createAgentX(config?: AgentXConfig): Promise<AgentX>;\n","/**\n * SystemEvent - Base interface for all events in the system\n *\n * Unified Event Structure:\n * ```\n * SystemEvent\n * │\n * │ All events have: type, timestamp, data, source, category, intent\n * │\n * ├── source: \"command\" ← API operations (request/response)\n * │ ├── category: \"request\" → container_create_request, agent_run_request...\n * │ └── category: \"response\" → container_create_response, agent_run_response...\n * │\n * ├── source: \"environment\" ← External world (Claude API, Network)\n * │ ├── category: \"stream\" → message_start, text_delta, message_stop, tool_call...\n * │ └── category: \"connection\"→ connected, disconnected, reconnecting\n * │\n * ├── source: \"container\" ← Container operations\n * │ └── category: \"lifecycle\" → container_created, container_destroyed, agent_registered...\n * │\n * ├── source: \"session\" ← Session operations\n * │ ├── category: \"lifecycle\" → session_created, session_destroyed\n * │ ├── category: \"persist\" → session_saved, message_persisted\n * │ └── category: \"action\" → session_resumed, session_forked\n * │\n * ├── source: \"sandbox\" ← Sandbox resources\n * │ ├── category: \"workdir\" → file_read, file_written\n * │ └── category: \"mcp\" → tool_execute, mcp_server_connected\n * │\n * └── source: \"agent\" ← Agent internal\n * ├── category: \"stream\" → (forwarded from environment)\n * ├── category: \"state\" → state transitions\n * ├── category: \"message\" → complete messages\n * └── category: \"turn\" → conversation turns\n * ```\n *\n * Design Principles:\n * - Unified: All events share the same base structure\n * - Self-describing: source/category/intent tell you everything\n * - Filterable: Easy to subscribe by source, category, or type\n */\n\n// ============================================================================\n// Event Classification Types\n// ============================================================================\n\n/**\n * Event source - where the event originated\n */\nexport type EventSource =\n | \"environment\" // External world (Claude API, Network)\n | \"agent\" // Agent internal\n | \"session\" // Session operations\n | \"container\" // Container operations\n | \"sandbox\" // Sandbox resources (Workspace, MCP)\n | \"command\"; // Command request/response (API operations)\n\n/**\n * Event intent - what the event represents\n */\nexport type EventIntent =\n | \"request\" // Request to perform action (may be forwarded or executed)\n | \"result\" // Result of completed action\n | \"notification\"; // State change notification (no action needed)\n\n/**\n * Event category - fine-grained classification within source\n */\nexport type EventCategory =\n // Environment categories\n | \"stream\" // Streaming output from LLM\n | \"connection\" // Network connection status\n // Agent categories\n | \"state\" // State transitions\n | \"message\" // Complete messages\n | \"turn\" // Conversation turns\n | \"error\" // Errors\n // Session categories\n | \"lifecycle\" // Creation/destruction\n | \"persist\" // Persistence operations\n | \"action\" // User actions (resume, fork)\n // Sandbox categories\n | \"workdir\" // File operations\n | \"mcp\" // MCP tool operations\n // Command categories (API request/response)\n | \"request\" // Request to perform action\n | \"response\"; // Response with result\n\n// ============================================================================\n// Event Context\n// ============================================================================\n\n/**\n * EventContext - Scope information attached to events\n */\nexport interface EventContext {\n /**\n * Container ID (isolation boundary)\n */\n containerId?: string;\n\n /**\n * Image ID (persistent conversation identity)\n */\n imageId?: string;\n\n /**\n * Agent ID (if event is agent-scoped)\n */\n agentId?: string;\n\n /**\n * Session ID (if event is session-scoped)\n */\n sessionId?: string;\n\n /**\n * Turn ID (for correlating events within a single turn)\n * A turn = one user message + assistant response cycle\n */\n turnId?: string;\n\n /**\n * Correlation ID (for request-response tracking)\n */\n correlationId?: string;\n}\n\n// ============================================================================\n// SystemEvent - The One Event Type\n// ============================================================================\n\n/**\n * SystemEvent - Base interface for ALL events in the system\n *\n * Every event has:\n * - type: What happened (e.g., \"text_delta\", \"session_saved\")\n * - timestamp: When it happened\n * - data: Event payload\n * - source: Where it came from\n * - category: What kind of event\n * - intent: What it means (notification/request/result)\n * - context: Optional scope information\n * - broadcastable: Whether to broadcast to external clients (default: true)\n */\nexport interface SystemEvent<\n T extends string = string,\n D = unknown,\n S extends EventSource = EventSource,\n C extends EventCategory = EventCategory,\n I extends EventIntent = EventIntent,\n> {\n /**\n * Event type identifier (e.g., \"text_delta\", \"session_saved\")\n */\n readonly type: T;\n\n /**\n * Event timestamp (Unix milliseconds)\n */\n readonly timestamp: number;\n\n /**\n * Event payload data\n */\n readonly data: D;\n\n /**\n * Event source - where the event originated\n */\n readonly source: S;\n\n /**\n * Event category - fine-grained classification\n */\n readonly category: C;\n\n /**\n * Event intent - what the event represents\n */\n readonly intent: I;\n\n /**\n * Event context - scope information (optional)\n */\n readonly context?: EventContext;\n\n /**\n * Whether to broadcast this event to external clients (SSE/WebSocket)\n *\n * - true or undefined: Broadcast to all external clients\n * - false: Only consumed internally, not broadcast\n *\n * Used for internal events like DriveableEvent that should be\n * processed by the engine but not sent directly to clients.\n * @default true\n */\n readonly broadcastable?: boolean;\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if event is from a specific source\n */\nexport function isFromSource<S extends EventSource>(\n event: SystemEvent,\n source: S\n): event is SystemEvent<string, unknown, S> {\n return event.source === source;\n}\n\n/**\n * Check if event has a specific intent\n */\nexport function hasIntent<I extends EventIntent>(\n event: SystemEvent,\n intent: I\n): event is SystemEvent<string, unknown, EventSource, EventCategory, I> {\n return event.intent === intent;\n}\n\n/**\n * Check if event is a request\n */\nexport function isRequest(event: SystemEvent): boolean {\n return event.intent === \"request\";\n}\n\n/**\n * Check if event is a result\n */\nexport function isResult(event: SystemEvent): boolean {\n return event.intent === \"result\";\n}\n\n/**\n * Check if event is a notification\n */\nexport function isNotification(event: SystemEvent): boolean {\n return event.intent === \"notification\";\n}\n","/**\n * CommandEvent - Request/Response events for Runtime operations\n *\n * These events enable unified operation API for both local and remote modes:\n * - Local mode: RuntimeImpl listens to requests, emits responses\n * - Remote mode: WebSocket/SSE forwards requests/responses\n *\n * Pattern:\n * ```\n * Caller Handler (Runtime)\n * ─────────────────────────────────────────────────────────\n * container_create_request ────────► handle & execute\n * ◄──────── container_create_response\n *\n * agent_run_request ────────► handle & execute\n * ◄──────── agent_run_response\n * ```\n *\n * All CommandEvents have:\n * - source: \"command\"\n * - category: \"request\" | \"response\"\n * - intent: \"request\" | \"result\"\n */\n\nimport type { SystemEvent } from \"../base\";\nimport type { ImageRecord } from \"~/runtime/internal/persistence\";\n\n// ============================================================================\n// Base Types\n// ============================================================================\n\n/**\n * Base interface for Command request events\n */\ninterface BaseCommandRequest<T extends string, D = unknown>\n extends SystemEvent<T, D, \"command\", \"request\", \"request\"> {}\n\n/**\n * Base interface for Command response events\n */\ninterface BaseCommandResponse<T extends string, D = unknown>\n extends SystemEvent<T, D, \"command\", \"response\", \"result\"> {}\n\n// ============================================================================\n// Container Commands\n// ============================================================================\n\n/**\n * Request to create a container\n */\nexport interface ContainerCreateRequest\n extends BaseCommandRequest<\n \"container_create_request\",\n {\n requestId: string;\n containerId: string;\n }\n > {}\n\n/**\n * Response to container creation\n */\nexport interface ContainerCreateResponse\n extends BaseCommandResponse<\n \"container_create_response\",\n {\n requestId: string;\n containerId: string;\n error?: string;\n }\n > {}\n\n/**\n * Request to get a container\n */\nexport interface ContainerGetRequest\n extends BaseCommandRequest<\n \"container_get_request\",\n {\n requestId: string;\n containerId: string;\n }\n > {}\n\n/**\n * Response to container get\n */\nexport interface ContainerGetResponse\n extends BaseCommandResponse<\n \"container_get_response\",\n {\n requestId: string;\n containerId?: string;\n exists: boolean;\n error?: string;\n }\n > {}\n\n/**\n * Request to list containers\n */\nexport interface ContainerListRequest\n extends BaseCommandRequest<\n \"container_list_request\",\n {\n requestId: string;\n }\n > {}\n\n/**\n * Response to container list\n */\nexport interface ContainerListResponse\n extends BaseCommandResponse<\n \"container_list_response\",\n {\n requestId: string;\n containerIds: string[];\n error?: string;\n }\n > {}\n\n// ============================================================================\n// Agent Commands\n// ============================================================================\n\n/**\n * Request to get an agent\n */\nexport interface AgentGetRequest\n extends BaseCommandRequest<\n \"agent_get_request\",\n {\n requestId: string;\n agentId: string;\n }\n > {}\n\n/**\n * Response to agent get\n */\nexport interface AgentGetResponse\n extends BaseCommandResponse<\n \"agent_get_response\",\n {\n requestId: string;\n agentId?: string;\n containerId?: string;\n exists: boolean;\n error?: string;\n }\n > {}\n\n/**\n * Request to list agents\n */\nexport interface AgentListRequest\n extends BaseCommandRequest<\n \"agent_list_request\",\n {\n requestId: string;\n containerId: string;\n }\n > {}\n\n/**\n * Response to agent list\n */\nexport interface AgentListResponse\n extends BaseCommandResponse<\n \"agent_list_response\",\n {\n requestId: string;\n agents: Array<{ agentId: string; containerId: string; imageId: string }>;\n error?: string;\n }\n > {}\n\n/**\n * Request to destroy an agent\n */\nexport interface AgentDestroyRequest\n extends BaseCommandRequest<\n \"agent_destroy_request\",\n {\n requestId: string;\n agentId: string;\n }\n > {}\n\n/**\n * Response to agent destroy\n */\nexport interface AgentDestroyResponse\n extends BaseCommandResponse<\n \"agent_destroy_response\",\n {\n requestId: string;\n agentId: string;\n success: boolean;\n error?: string;\n }\n > {}\n\n/**\n * Request to destroy all agents in a container\n */\nexport interface AgentDestroyAllRequest\n extends BaseCommandRequest<\n \"agent_destroy_all_request\",\n {\n requestId: string;\n containerId: string;\n }\n > {}\n\n/**\n * Response to destroy all agents\n */\nexport interface AgentDestroyAllResponse\n extends BaseCommandResponse<\n \"agent_destroy_all_response\",\n {\n requestId: string;\n containerId: string;\n error?: string;\n }\n > {}\n\n/**\n * Request to send a message\n * Can use either imageId (preferred) or agentId\n * If using imageId and agent is not running, it will be auto-activated\n */\nexport interface MessageSendRequest\n extends BaseCommandRequest<\n \"message_send_request\",\n {\n requestId: string;\n /** Image ID (preferred) - will auto-activate if offline */\n imageId?: string;\n /** Agent ID (legacy) - must be already running */\n agentId?: string;\n content: string;\n }\n > {}\n\n/**\n * Response to message send (acknowledges message received, not completion)\n */\nexport interface MessageSendResponse\n extends BaseCommandResponse<\n \"message_send_response\",\n {\n requestId: string;\n imageId?: string;\n agentId: string;\n error?: string;\n }\n > {}\n\n/**\n * Request to interrupt an agent\n * Can use either imageId or agentId\n */\nexport interface AgentInterruptRequest\n extends BaseCommandRequest<\n \"agent_interrupt_request\",\n {\n requestId: string;\n /** Image ID (preferred) */\n imageId?: string;\n /** Agent ID (legacy) */\n agentId?: string;\n }\n > {}\n\n/**\n * Response to agent interrupt\n */\nexport interface AgentInterruptResponse\n extends BaseCommandResponse<\n \"agent_interrupt_response\",\n {\n requestId: string;\n imageId?: string;\n agentId?: string;\n error?: string;\n }\n > {}\n\n// ============================================================================\n// Image Commands\n// ============================================================================\n\n/**\n * Request to create a new image (conversation)\n */\nexport interface ImageCreateRequest\n extends BaseCommandRequest<\n \"image_create_request\",\n {\n requestId: string;\n containerId: string;\n config: {\n name?: string;\n description?: string;\n systemPrompt?: string;\n };\n }\n > {}\n\n/**\n * Response to image creation\n */\nexport interface ImageCreateResponse\n extends BaseCommandResponse<\n \"image_create_response\",\n {\n requestId: string;\n record: ImageRecord;\n error?: string;\n }\n > {}\n\n/**\n * Request to run an image (create or reuse agent)\n */\nexport interface ImageRunRequest\n extends BaseCommandRequest<\n \"image_run_request\",\n {\n requestId: string;\n imageId: string;\n }\n > {}\n\n/**\n * Response to image run\n */\nexport interface ImageRunResponse\n extends BaseCommandResponse<\n \"image_run_response\",\n {\n requestId: string;\n imageId: string;\n agentId: string;\n /** true if reusing existing agent, false if newly created */\n reused: boolean;\n error?: string;\n }\n > {}\n\n/**\n * Request to stop an image (destroy agent, keep image)\n */\nexport interface ImageStopRequest\n extends BaseCommandRequest<\n \"image_stop_request\",\n {\n requestId: string;\n imageId: string;\n }\n > {}\n\n/**\n * Response to image stop\n */\nexport interface ImageStopResponse\n extends BaseCommandResponse<\n \"image_stop_response\",\n {\n requestId: string;\n imageId: string;\n error?: string;\n }\n > {}\n\n/**\n * Request to update an image (name, description, etc.)\n */\nexport interface ImageUpdateRequest\n extends BaseCommandRequest<\n \"image_update_request\",\n {\n requestId: string;\n imageId: string;\n updates: {\n name?: string;\n description?: string;\n };\n }\n > {}\n\n/**\n * Response to image update\n */\nexport interface ImageUpdateResponse\n extends BaseCommandResponse<\n \"image_update_response\",\n {\n requestId: string;\n record: ImageRecord;\n error?: string;\n }\n > {}\n\n/**\n * Request to list all images\n */\nexport interface ImageListRequest\n extends BaseCommandRequest<\n \"image_list_request\",\n {\n requestId: string;\n containerId?: string;\n }\n > {}\n\n/**\n * Image list item with online status\n */\nexport interface ImageListItem extends ImageRecord {\n /** Whether an agent is currently running for this image */\n online: boolean;\n /** Current agent ID if online */\n agentId?: string;\n}\n\n/**\n * Response to image list\n */\nexport interface ImageListResponse\n extends BaseCommandResponse<\n \"image_list_response\",\n {\n requestId: string;\n records: ImageListItem[];\n error?: string;\n }\n > {}\n\n/**\n * Request to get an image by ID\n */\nexport interface ImageGetRequest\n extends BaseCommandRequest<\n \"image_get_request\",\n {\n requestId: string;\n imageId: string;\n }\n > {}\n\n/**\n * Response to image get\n */\nexport interface ImageGetResponse\n extends BaseCommandResponse<\n \"image_get_response\",\n {\n requestId: string;\n record?: ImageListItem | null;\n error?: string;\n }\n > {}\n\n/**\n * Request to delete an image\n */\nexport interface ImageDeleteRequest\n extends BaseCommandRequest<\n \"image_delete_request\",\n {\n requestId: string;\n imageId: string;\n }\n > {}\n\n/**\n * Response to image delete\n */\nexport interface ImageDeleteResponse\n extends BaseCommandResponse<\n \"image_delete_response\",\n {\n requestId: string;\n imageId: string;\n error?: string;\n }\n > {}\n\n/**\n * Request to get messages for an image\n */\nexport interface ImageMessagesRequest\n extends BaseCommandRequest<\n \"image_messages_request\",\n {\n requestId: string;\n imageId: string;\n }\n > {}\n\n/**\n * Response to image messages request\n */\nexport interface ImageMessagesResponse\n extends BaseCommandResponse<\n \"image_messages_response\",\n {\n requestId: string;\n imageId: string;\n messages: Array<{\n id: string;\n role: \"user\" | \"assistant\" | \"tool_call\" | \"tool_result\";\n content: unknown;\n timestamp: number;\n }>;\n error?: string;\n }\n > {}\n\n// ============================================================================\n// Union Types\n// ============================================================================\n\n/**\n * All Command request events\n */\nexport type CommandRequest =\n // Container\n | ContainerCreateRequest\n | ContainerGetRequest\n | ContainerListRequest\n // Agent\n | AgentGetRequest\n | AgentListRequest\n | AgentDestroyRequest\n | AgentDestroyAllRequest\n | MessageSendRequest\n | AgentInterruptRequest\n // Image\n | ImageCreateRequest\n | ImageRunRequest\n | ImageStopRequest\n | ImageUpdateRequest\n | ImageListRequest\n | ImageGetRequest\n | ImageDeleteRequest\n | ImageMessagesRequest;\n\n/**\n * All Command response events\n */\nexport type CommandResponse =\n // Container\n | ContainerCreateResponse\n | ContainerGetResponse\n | ContainerListResponse\n // Agent\n | AgentGetResponse\n | AgentListResponse\n | AgentDestroyResponse\n | AgentDestroyAllResponse\n | MessageSendResponse\n | AgentInterruptResponse\n // Image\n | ImageCreateResponse\n | ImageRunResponse\n | ImageStopResponse\n | ImageUpdateResponse\n | ImageListResponse\n | ImageGetResponse\n | ImageDeleteResponse\n | ImageMessagesResponse;\n\n/**\n * All Command events (requests + responses)\n */\nexport type CommandEvent = CommandRequest | CommandResponse;\n\n/**\n * Command event type strings\n */\nexport type CommandEventType = CommandEvent[\"type\"];\n\n/**\n * Type guard: is this a CommandEvent?\n */\nexport function isCommandEvent(event: { source?: string }): event is CommandEvent {\n return event.source === \"command\";\n}\n\n/**\n * Type guard: is this a Command request event?\n */\nexport function isCommandRequest(event: {\n source?: string;\n category?: string;\n}): event is CommandRequest {\n return event.source === \"command\" && event.category === \"request\";\n}\n\n/**\n * Type guard: is this a Command response event?\n */\nexport function isCommandResponse(event: {\n source?: string;\n category?: string;\n}): event is CommandResponse {\n return event.source === \"command\" && event.category === \"response\";\n}\n\n// ============================================================================\n// Event Map - Type-safe event type to event mapping\n// ============================================================================\n\n/**\n * CommandEventMap - Maps event type string to event interface\n *\n * Enables type-safe event handling:\n * ```typescript\n * bus.onCommand(\"container_create_request\", (event) => {\n * event.data.requestId; // ✓ string\n * event.data.containerId; // ✓ string\n * });\n * ```\n */\nexport interface CommandEventMap {\n // Container\n container_create_request: ContainerCreateRequest;\n container_create_response: ContainerCreateResponse;\n container_get_request: ContainerGetRequest;\n container_get_response: ContainerGetResponse;\n container_list_request: ContainerListRequest;\n container_list_response: ContainerListResponse;\n // Agent\n agent_get_request: AgentGetRequest;\n agent_get_response: AgentGetResponse;\n agent_list_request: AgentListRequest;\n agent_list_response: AgentListResponse;\n agent_destroy_request: AgentDestroyRequest;\n agent_destroy_response: AgentDestroyResponse;\n agent_destroy_all_request: AgentDestroyAllRequest;\n agent_destroy_all_response: AgentDestroyAllResponse;\n message_send_request: MessageSendRequest;\n message_send_response: MessageSendResponse;\n agent_interrupt_request: AgentInterruptRequest;\n agent_interrupt_response: AgentInterruptResponse;\n // Image\n image_create_request: ImageCreateRequest;\n image_create_response: ImageCreateResponse;\n image_run_request: ImageRunRequest;\n image_run_response: ImageRunResponse;\n image_stop_request: ImageStopRequest;\n image_stop_response: ImageStopResponse;\n image_update_request: ImageUpdateRequest;\n image_update_response: ImageUpdateResponse;\n image_list_request: ImageListRequest;\n image_list_response: ImageListResponse;\n image_get_request: ImageGetRequest;\n image_get_response: ImageGetResponse;\n image_delete_request: ImageDeleteRequest;\n image_delete_response: ImageDeleteResponse;\n image_messages_request: ImageMessagesRequest;\n image_messages_response: ImageMessagesResponse;\n}\n\n/**\n * Maps request event type to its corresponding response event type\n */\nexport interface CommandRequestResponseMap {\n container_create_request: \"container_create_response\";\n container_get_request: \"container_get_response\";\n container_list_request: \"container_list_response\";\n agent_get_request: \"agent_get_response\";\n agent_list_request: \"agent_list_response\";\n agent_destroy_request: \"agent_destroy_response\";\n agent_destroy_all_request: \"agent_destroy_all_response\";\n message_send_request: \"message_send_response\";\n agent_interrupt_request: \"agent_interrupt_response\";\n image_create_request: \"image_create_response\";\n image_run_request: \"image_run_response\";\n image_stop_request: \"image_stop_response\";\n image_update_request: \"image_update_response\";\n image_list_request: \"image_list_response\";\n image_get_request: \"image_get_response\";\n image_delete_request: \"image_delete_response\";\n image_messages_request: \"image_messages_response\";\n}\n\n/**\n * All command request types\n */\nexport type CommandRequestType = keyof CommandRequestResponseMap;\n\n/**\n * Get response type for a request type\n */\nexport type ResponseTypeFor<T extends CommandRequestType> = CommandRequestResponseMap[T];\n\n/**\n * Get response event for a request type\n */\nexport type ResponseEventFor<T extends CommandRequestType> = CommandEventMap[ResponseTypeFor<T>];\n\n/**\n * Get request data type (without requestId, as it's auto-generated)\n */\nexport type RequestDataFor<T extends CommandRequestType> = Omit<\n CommandEventMap[T][\"data\"],\n \"requestId\"\n>;\n","/**\n * Agent Stream Events\n *\n * Real-time streaming events from LLM.\n * - source: \"agent\"\n * - category: \"stream\"\n * - intent: \"notification\"\n *\n * Note: These have same event types as DriveableEvent (environment/stream),\n * but with full SystemEvent structure (source, category, intent, context).\n */\n\nimport type { BaseAgentEvent } from \"../BaseAgentEvent\";\n\n/**\n * Base type for stream events\n */\nexport interface AgentStreamEventBase<T extends string, D> extends BaseAgentEvent<T, D, \"stream\"> {}\n\n// ============================================================================\n// Stop Reason\n// ============================================================================\n\n/**\n * Stop reason for message completion\n */\nexport type StopReason = \"end_turn\" | \"max_tokens\" | \"stop_sequence\" | \"tool_use\";\n\n// ============================================================================\n// Message Lifecycle Events\n// ============================================================================\n\n/**\n * AgentMessageStartEvent - Streaming message begins\n */\nexport interface AgentMessageStartEvent\n extends AgentStreamEventBase<\n \"message_start\",\n {\n messageId: string;\n model: string;\n }\n > {}\n\n/**\n * AgentMessageDeltaEvent - Message-level updates (usage info)\n */\nexport interface AgentMessageDeltaEvent\n extends AgentStreamEventBase<\n \"message_delta\",\n {\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n }\n > {}\n\n/**\n * AgentMessageStopEvent - Streaming message completes\n */\nexport interface AgentMessageStopEvent\n extends AgentStreamEventBase<\n \"message_stop\",\n {\n stopReason?: StopReason;\n }\n > {}\n\n// ============================================================================\n// Text Content Events\n// ============================================================================\n\n/**\n * AgentTextDeltaEvent - Incremental text output\n */\nexport interface AgentTextDeltaEvent\n extends AgentStreamEventBase<\n \"text_delta\",\n {\n text: string;\n }\n > {}\n\n// ============================================================================\n// Tool Use Events\n// ============================================================================\n\n/**\n * AgentToolUseStartEvent - Tool use block started\n */\nexport interface AgentToolUseStartEvent\n extends AgentStreamEventBase<\n \"tool_use_start\",\n {\n toolCallId: string;\n toolName: string;\n }\n > {}\n\n/**\n * AgentInputJsonDeltaEvent - Incremental tool input JSON\n */\nexport interface AgentInputJsonDeltaEvent\n extends AgentStreamEventBase<\n \"input_json_delta\",\n {\n partialJson: string;\n }\n > {}\n\n/**\n * AgentToolUseStopEvent - Tool use block completed\n */\nexport interface AgentToolUseStopEvent\n extends AgentStreamEventBase<\n \"tool_use_stop\",\n {\n toolCallId: string;\n toolName: string;\n input: Record<string, unknown>;\n }\n > {}\n\n/**\n * AgentToolResultEvent - Tool execution result\n */\nexport interface AgentToolResultEvent\n extends AgentStreamEventBase<\n \"tool_result\",\n {\n toolCallId: string;\n result: unknown;\n isError?: boolean;\n }\n > {}\n\n// ============================================================================\n// Error Events\n// ============================================================================\n\n/**\n * AgentErrorReceivedEvent - Error received from environment\n *\n * Processed by MealyMachine to produce:\n * - error_occurred (StateEvent)\n * - error_message (MessageEvent)\n */\nexport interface AgentErrorReceivedEvent\n extends AgentStreamEventBase<\n \"error_received\",\n {\n /** Error message (human-readable) */\n message: string;\n /** Error code (e.g., \"rate_limit_error\", \"api_error\") */\n errorCode?: string;\n }\n > {}\n\n// ============================================================================\n// Union Type\n// ============================================================================\n\n/**\n * AgentStreamEvent - All stream events\n */\nexport type AgentStreamEvent =\n | AgentMessageStartEvent\n | AgentMessageDeltaEvent\n | AgentMessageStopEvent\n | AgentTextDeltaEvent\n | AgentToolUseStartEvent\n | AgentInputJsonDeltaEvent\n | AgentToolUseStopEvent\n | AgentToolResultEvent\n | AgentErrorReceivedEvent;\n\n/**\n * AgentStreamEventType - String literal union\n */\nexport type AgentStreamEventType = AgentStreamEvent[\"type\"];\n\n/**\n * Type guard: is this a stream event?\n */\nexport function isAgentStreamEvent(event: {\n source?: string;\n category?: string;\n}): event is AgentStreamEvent {\n return event.source === \"agent\" && event.category === \"stream\";\n}\n","/**\n * Agent State Events\n *\n * Events that trigger AgentState transitions.\n * - source: \"agent\"\n * - category: \"state\"\n * - intent: \"notification\"\n *\n * Note: These are events that AFFECT state, not \"state\" themselves.\n */\n\nimport type { BaseAgentEvent } from \"../BaseAgentEvent\";\n\n/**\n * Base type for state events\n */\nexport interface AgentStateEventBase<T extends string, D> extends BaseAgentEvent<T, D, \"state\"> {}\n\n// ============================================================================\n// Conversation Events\n// ============================================================================\n\n/**\n * ConversationQueuedEvent - Message queued for processing\n */\nexport interface ConversationQueuedEvent\n extends AgentStateEventBase<\n \"conversation_queued\",\n {\n messageId: string;\n }\n > {}\n\n/**\n * ConversationStartEvent - Conversation started\n */\nexport interface ConversationStartEvent\n extends AgentStateEventBase<\n \"conversation_start\",\n {\n messageId: string;\n }\n > {}\n\n/**\n * ConversationThinkingEvent - Agent is thinking\n */\nexport interface ConversationThinkingEvent\n extends AgentStateEventBase<\"conversation_thinking\", Record<string, never>> {}\n\n/**\n * ConversationRespondingEvent - Agent is responding\n */\nexport interface ConversationRespondingEvent\n extends AgentStateEventBase<\"conversation_responding\", Record<string, never>> {}\n\n/**\n * ConversationEndEvent - Conversation ended\n */\nexport interface ConversationEndEvent\n extends AgentStateEventBase<\n \"conversation_end\",\n {\n reason: \"completed\" | \"interrupted\" | \"error\";\n }\n > {}\n\n/**\n * ConversationInterruptedEvent - Conversation interrupted\n */\nexport interface ConversationInterruptedEvent\n extends AgentStateEventBase<\n \"conversation_interrupted\",\n {\n reason: string;\n }\n > {}\n\n// ============================================================================\n// Tool Events\n// ============================================================================\n\n/**\n * ToolPlannedEvent - Tool use planned\n */\nexport interface ToolPlannedEvent\n extends AgentStateEventBase<\n \"tool_planned\",\n {\n toolId: string;\n toolName: string;\n }\n > {}\n\n/**\n * ToolExecutingEvent - Tool is executing\n */\nexport interface ToolExecutingEvent\n extends AgentStateEventBase<\n \"tool_executing\",\n {\n toolId: string;\n toolName: string;\n input: Record<string, unknown>;\n }\n > {}\n\n/**\n * ToolCompletedEvent - Tool execution completed\n */\nexport interface ToolCompletedEvent\n extends AgentStateEventBase<\n \"tool_completed\",\n {\n toolId: string;\n toolName: string;\n result: unknown;\n }\n > {}\n\n/**\n * ToolFailedEvent - Tool execution failed\n */\nexport interface ToolFailedEvent\n extends AgentStateEventBase<\n \"tool_failed\",\n {\n toolId: string;\n toolName: string;\n error: string;\n }\n > {}\n\n// ============================================================================\n// Error Events\n// ============================================================================\n\n/**\n * ErrorOccurredEvent - Error occurred during processing\n */\nexport interface ErrorOccurredEvent\n extends AgentStateEventBase<\n \"error_occurred\",\n {\n code: string;\n message: string;\n recoverable: boolean;\n category?: string;\n }\n > {}\n\n// ============================================================================\n// Union Type\n// ============================================================================\n\n/**\n * AgentStateEvent - All state events\n */\nexport type AgentStateEvent =\n // Conversation\n | ConversationQueuedEvent\n | ConversationStartEvent\n | ConversationThinkingEvent\n | ConversationRespondingEvent\n | ConversationEndEvent\n | ConversationInterruptedEvent\n // Tool\n | ToolPlannedEvent\n | ToolExecutingEvent\n | ToolCompletedEvent\n | ToolFailedEvent\n // Error\n | ErrorOccurredEvent;\n\n/**\n * AgentStateEventType - String literal union\n */\nexport type AgentStateEventType = AgentStateEvent[\"type\"];\n\n/**\n * Type guard: is this a state event?\n */\nexport function isAgentStateEvent(event: {\n source?: string;\n category?: string;\n}): event is AgentStateEvent {\n return event.source === \"agent\" && event.category === \"state\";\n}\n","/**\n * Agent Message Events\n *\n * Complete message events assembled from stream events.\n * - source: \"agent\"\n * - category: \"message\"\n * - intent: \"notification\"\n */\n\nimport type { BaseAgentEvent } from \"../BaseAgentEvent\";\nimport type { ContentPart, ToolCallPart, ToolResultPart } from \"~/agent/message/parts\";\n\n/**\n * Base type for message events\n */\nexport interface AgentMessageEventBase<T extends string, D>\n extends BaseAgentEvent<T, D, \"message\"> {}\n\n// ============================================================================\n// Message Events\n// ============================================================================\n\n/**\n * UserMessageEvent - User sent a message\n */\nexport interface UserMessageEvent\n extends AgentMessageEventBase<\n \"user_message\",\n {\n messageId: string;\n content: string;\n timestamp: number;\n }\n > {}\n\n/**\n * AssistantMessageEvent - Assistant response message\n */\nexport interface AssistantMessageEvent\n extends AgentMessageEventBase<\n \"assistant_message\",\n {\n messageId: string;\n content: ContentPart[];\n model?: string;\n stopReason?: string;\n timestamp: number;\n }\n > {}\n\n/**\n * ToolCallMessageEvent - Tool call message (part of assistant turn)\n */\nexport interface ToolCallMessageEvent\n extends AgentMessageEventBase<\n \"tool_call_message\",\n {\n messageId: string;\n toolCalls: ToolCallPart[];\n timestamp: number;\n }\n > {}\n\n/**\n * ToolResultMessageEvent - Tool result message\n */\nexport interface ToolResultMessageEvent\n extends AgentMessageEventBase<\n \"tool_result_message\",\n {\n messageId: string;\n results: ToolResultPart[];\n timestamp: number;\n }\n > {}\n\n/**\n * ErrorMessageEvent - Error message displayed in chat\n *\n * Generated when error_received StreamEvent is processed by MealyMachine.\n * Displayed in the chat history so users can see what went wrong.\n */\nexport interface ErrorMessageEvent\n extends AgentMessageEventBase<\n \"error_message\",\n {\n messageId: string;\n /** Error message (human-readable) */\n content: string;\n /** Error code (e.g., \"rate_limit_error\", \"api_error\") */\n errorCode?: string;\n timestamp: number;\n }\n > {}\n\n// ============================================================================\n// Union Type\n// ============================================================================\n\n/**\n * AgentMessageEvent - All message events\n */\nexport type AgentMessageEvent =\n | UserMessageEvent\n | AssistantMessageEvent\n | ToolCallMessageEvent\n | ToolResultMessageEvent\n | ErrorMessageEvent;\n\n/**\n * AgentMessageEventType - String literal union\n */\nexport type AgentMessageEventType = AgentMessageEvent[\"type\"];\n\n/**\n * Type guard: is this a message event?\n */\nexport function isAgentMessageEvent(event: {\n source?: string;\n category?: string;\n}): event is AgentMessageEvent {\n return event.source === \"agent\" && event.category === \"message\";\n}\n","/**\n * Agent Turn Events\n *\n * Turn-level events for analytics and billing.\n * A turn = one user message + assistant response cycle.\n * - source: \"agent\"\n * - category: \"turn\"\n * - intent: \"notification\"\n */\n\nimport type { BaseAgentEvent } from \"../BaseAgentEvent\";\n\n/**\n * Base type for turn events\n */\nexport interface AgentTurnEventBase<T extends string, D> extends BaseAgentEvent<T, D, \"turn\"> {}\n\n/**\n * Token usage information\n */\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n totalTokens?: number;\n}\n\n// ============================================================================\n// Turn Events\n// ============================================================================\n\n/**\n * TurnRequestEvent - Turn started (user message received)\n */\nexport interface TurnRequestEvent\n extends AgentTurnEventBase<\n \"turn_request\",\n {\n turnId: string;\n messageId: string;\n content: string;\n timestamp: number;\n }\n > {}\n\n/**\n * TurnResponseEvent - Turn completed (assistant response finished)\n */\nexport interface TurnResponseEvent\n extends AgentTurnEventBase<\n \"turn_response\",\n {\n turnId: string;\n messageId: string;\n duration: number;\n usage?: TokenUsage;\n model?: string;\n stopReason?: string;\n timestamp: number;\n }\n > {}\n\n// ============================================================================\n// Union Type\n// ============================================================================\n\n/**\n * AgentTurnEvent - All turn events\n */\nexport type AgentTurnEvent = TurnRequestEvent | TurnResponseEvent;\n\n/**\n * AgentTurnEventType - String literal union\n */\nexport type AgentTurnEventType = AgentTurnEvent[\"type\"];\n\n/**\n * Type guard: is this a turn event?\n */\nexport function isAgentTurnEvent(event: {\n source?: string;\n category?: string;\n}): event is AgentTurnEvent {\n return event.source === \"agent\" && event.category === \"turn\";\n}\n","/**\n * Agent Events - SystemEvent for Agent domain\n *\n * Complete event definitions for Agent, extending SystemEvent with:\n * - source: \"agent\"\n * - category: \"stream\" | \"state\" | \"message\" | \"turn\"\n * - intent: \"notification\"\n *\n * ## Event Categories\n *\n * ```\n * AgentEvent (source: \"agent\")\n * │\n * ├── category: \"stream\" ← Real-time streaming from LLM\n * │ └── TextDeltaEvent, MessageStartEvent, ToolUseStartEvent...\n * │\n * ├── category: \"state\" ← State transitions\n * │ └── ConversationStartEvent, ConversationEndEvent, ToolExecutingEvent...\n * │\n * ├── category: \"message\" ← Assembled complete messages\n * │ └── UserMessageEvent, AssistantMessageEvent, ToolCallMessageEvent...\n * │\n * └── category: \"turn\" ← Turn analytics\n * └── TurnStartEvent, TurnEndEvent\n * ```\n *\n * ## Relationship with Engine Events\n *\n * Engine uses lightweight events (type, timestamp, data only).\n * Use `ToEngineEvent<T>` to convert AgentEvent to EngineEvent.\n *\n * @packageDocumentation\n */\n\n// Base types\nexport type { AgentEventCategory, BaseAgentEvent } from \"./BaseAgentEvent\";\n\n// Stream events\nexport * from \"./stream\";\n\n// State events\nexport * from \"./state\";\n\n// Message events\nexport * from \"./message\";\n\n// Turn events\nexport * from \"./turn\";\n\n// Union type\nimport type { AgentStreamEvent } from \"./stream\";\nimport type { AgentStateEvent } from \"./state\";\nimport type { AgentMessageEvent } from \"./message\";\nimport type { AgentTurnEvent } from \"./turn\";\n\n/**\n * AgentEvent - All events from Agent domain\n */\nexport type AgentEvent = AgentStreamEvent | AgentStateEvent | AgentMessageEvent | AgentTurnEvent;\n\n/**\n * Type guard: is this an agent event?\n */\nexport function isAgentEvent(event: { source?: string }): event is AgentEvent {\n return event.source === \"agent\";\n}\n","/**\n * createAgentX - Factory function for creating AgentX instances\n *\n * Supports two modes:\n * - Local mode: Uses Runtime directly (Claude API) - Node.js only\n * - Remote mode: Connects to AgentX server via WebSocket - Browser & Node.js\n *\n * Local mode implementation is dynamically imported to enable tree-shaking\n * in browser builds.\n */\n\nimport type { AgentX, AgentXConfig, Unsubscribe } from \"@agentxjs/types/agentx\";\nimport { isRemoteConfig } from \"@agentxjs/types/agentx\";\nimport type {\n CommandEventMap,\n CommandRequestType,\n ResponseEventFor,\n RequestDataFor,\n SystemEvent,\n} from \"@agentxjs/types/event\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst remoteLogger = createLogger(\"agentx/RemoteClient\");\n\n/**\n * Create AgentX instance\n *\n * @param config - Configuration (LocalConfig or RemoteConfig)\n * @returns AgentX instance\n *\n * @example\n * ```typescript\n * // Remote mode (browser & Node.js)\n * const agentx = await createAgentX({ serverUrl: \"ws://localhost:5200\" });\n *\n * // Local mode (Node.js only)\n * const agentx = await createAgentX({ llm: { apiKey: \"sk-...\" } });\n * ```\n */\nexport async function createAgentX(config?: AgentXConfig): Promise<AgentX> {\n if (config && isRemoteConfig(config)) {\n return createRemoteAgentX(config.serverUrl);\n }\n\n // Dynamic import for tree-shaking in browser builds\n const { createLocalAgentX } = await import(\"./createLocalAgentX\");\n return createLocalAgentX(config ?? {});\n}\n\n// ============================================================================\n// Remote Mode Implementation (Browser & Node.js compatible)\n// ============================================================================\n\n/**\n * Create AgentX instance in remote mode\n *\n * Connects to an AgentX server via WebSocket.\n * Works in both browser and Node.js environments.\n *\n * @param serverUrl - WebSocket server URL\n * @returns AgentX instance\n */\nexport async function createRemoteAgentX(serverUrl: string): Promise<AgentX> {\n // Use @agentxjs/network for WebSocket client (handles browser/Node.js differences)\n const { createWebSocketClient } = await import(\"@agentxjs/network\");\n\n const client = await createWebSocketClient({\n serverUrl,\n autoReconnect: true,\n minReconnectionDelay: 1000,\n maxReconnectionDelay: 10000,\n connectionTimeout: 4000,\n maxRetries: Infinity,\n debug: false,\n });\n\n const handlers = new Map<string, Set<(event: SystemEvent) => void>>();\n const pendingRequests = new Map<\n string,\n {\n resolve: (event: SystemEvent) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n >();\n\n // Handle incoming messages\n client.onMessage((message: string) => {\n try {\n const event = JSON.parse(message) as SystemEvent;\n\n remoteLogger.info(\"Received event\", {\n type: event.type,\n category: event.category,\n requestId: (event.data as any)?.requestId,\n });\n\n // Handle error events - log as error (but still dispatch to handlers)\n if (event.type === \"system_error\") {\n const errorData = event.data as { message: string; severity?: string; details?: unknown };\n remoteLogger.error(errorData.message, {\n severity: errorData.severity,\n requestId: (event.data as any)?.requestId,\n details: errorData.details,\n });\n // Continue to dispatch to handlers (don't return here)\n }\n\n // Check if it's a response to a pending request\n const requestId = (event.data as { requestId?: string })?.requestId;\n if (event.category === \"response\" && requestId && pendingRequests.has(requestId)) {\n remoteLogger.info(\"Resolving pending request\", { requestId, eventType: event.type });\n const pending = pendingRequests.get(requestId)!;\n clearTimeout(pending.timer);\n pendingRequests.delete(requestId);\n pending.resolve(event);\n return;\n }\n\n remoteLogger.info(\"Dispatching to handlers\", { type: event.type });\n\n // Dispatch to handlers\n const typeHandlers = handlers.get(event.type);\n if (typeHandlers) {\n for (const handler of typeHandlers) {\n handler(event);\n }\n }\n\n // Dispatch to \"*\" handlers\n const allHandlers = handlers.get(\"*\");\n if (allHandlers) {\n for (const handler of allHandlers) {\n handler(event);\n }\n }\n } catch {\n // Ignore parse errors\n }\n });\n\n // Handle connection events\n client.onClose(() => {\n remoteLogger.warn(\"WebSocket closed\");\n });\n\n client.onError((error: Error) => {\n remoteLogger.error(\"WebSocket error\", { error: error.message });\n });\n\n function subscribe(type: string, handler: (event: SystemEvent) => void): Unsubscribe {\n if (!handlers.has(type)) {\n handlers.set(type, new Set());\n }\n handlers.get(type)!.add(handler);\n return () => {\n handlers.get(type)?.delete(handler);\n };\n }\n\n return {\n request<T extends CommandRequestType>(\n type: T,\n data: RequestDataFor<T>,\n timeout: number = 30000\n ): Promise<ResponseEventFor<T>> {\n return new Promise((resolve, reject) => {\n const requestId = `req_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;\n\n const timer = setTimeout(() => {\n pendingRequests.delete(requestId);\n reject(new Error(`Request timeout: ${type}`));\n }, timeout);\n\n pendingRequests.set(requestId, {\n resolve: resolve as (event: SystemEvent) => void,\n reject,\n timer,\n });\n\n const event: SystemEvent = {\n type,\n timestamp: Date.now(),\n data: { ...data, requestId },\n source: \"command\",\n category: \"request\",\n intent: \"request\",\n };\n\n client.send(JSON.stringify(event));\n });\n },\n\n on<T extends string>(\n type: T,\n handler: (event: SystemEvent & { type: T }) => void\n ): Unsubscribe {\n return subscribe(type, handler as (event: SystemEvent) => void);\n },\n\n onCommand<T extends keyof CommandEventMap>(\n type: T,\n handler: (event: CommandEventMap[T]) => void\n ): Unsubscribe {\n return subscribe(type, handler as (event: SystemEvent) => void);\n },\n\n emitCommand<T extends keyof CommandEventMap>(type: T, data: CommandEventMap[T][\"data\"]): void {\n const event: SystemEvent = {\n type,\n timestamp: Date.now(),\n data,\n source: \"command\",\n category: type.toString().endsWith(\"_response\") ? \"response\" : \"request\",\n intent: type.toString().endsWith(\"_response\") ? \"result\" : \"request\",\n };\n client.send(JSON.stringify(event));\n },\n\n async listen() {\n throw new Error(\"Cannot listen in remote mode\");\n },\n\n async close() {\n // No-op in remote mode\n },\n\n async dispose() {\n for (const pending of pendingRequests.values()) {\n clearTimeout(pending.timer);\n pending.reject(new Error(\"AgentX disposed\"));\n }\n pendingRequests.clear();\n handlers.clear();\n client.dispose();\n },\n };\n}\n","/**\n * agentxjs - Browser Entry Point\n *\n * This entry is automatically selected by bundlers (Vite, Webpack, etc.)\n * when building for browser environments.\n *\n * Only includes remote mode (WebSocket client).\n * Does not include Node.js specific code (runtime, fs, sqlite, etc.)\n */\n\n// Re-export everything from index except createAgentX\nexport type {\n AgentX,\n AgentXConfig,\n LocalConfig,\n RemoteConfig,\n LLMConfig,\n StorageConfig,\n StorageDriver,\n Unsubscribe,\n} from \"@agentxjs/types/agentx\";\n\nexport { isLocalConfig, isRemoteConfig } from \"@agentxjs/types/agentx\";\n\n// Event types\nexport type {\n SystemEvent,\n EventSource,\n EventCategory,\n EventIntent,\n EventContext,\n} from \"@agentxjs/types/event\";\n\nexport {\n isFromSource,\n hasIntent,\n isRequest,\n isResult,\n isNotification,\n} from \"@agentxjs/types/event\";\n\n// Command events\nexport type {\n CommandEvent,\n CommandRequest,\n CommandResponse,\n CommandEventType,\n CommandRequestType,\n CommandEventMap,\n ContainerCreateRequest,\n ContainerCreateResponse,\n ContainerGetRequest,\n ContainerGetResponse,\n ContainerListRequest,\n ContainerListResponse,\n AgentGetRequest,\n AgentGetResponse,\n AgentListRequest,\n AgentListResponse,\n AgentDestroyRequest,\n AgentDestroyResponse,\n MessageSendRequest,\n MessageSendResponse,\n AgentInterruptRequest,\n AgentInterruptResponse,\n ImageCreateRequest,\n ImageCreateResponse,\n ImageRunRequest,\n ImageRunResponse,\n ImageStopRequest,\n ImageStopResponse,\n ImageUpdateRequest,\n ImageUpdateResponse,\n ImageListRequest,\n ImageListResponse,\n ImageListItem,\n ImageGetRequest,\n ImageGetResponse,\n ImageDeleteRequest,\n ImageDeleteResponse,\n} from \"@agentxjs/types/event\";\n\nexport { isCommandEvent, isCommandRequest, isCommandResponse } from \"@agentxjs/types/event\";\n\n// Agent events\nexport type {\n AgentEvent,\n AgentEventCategory,\n AgentStreamEvent,\n AgentTextDeltaEvent,\n AgentMessageStartEvent,\n AgentMessageStopEvent,\n AgentToolUseStartEvent,\n AgentToolUseStopEvent,\n AgentToolResultEvent,\n AgentStateEvent,\n ConversationStartEvent,\n ConversationEndEvent,\n ConversationThinkingEvent,\n ConversationRespondingEvent,\n ToolExecutingEvent,\n ToolCompletedEvent,\n ErrorOccurredEvent,\n AgentMessageEvent,\n UserMessageEvent,\n AssistantMessageEvent,\n ToolCallMessageEvent,\n ToolResultMessageEvent,\n AgentTurnEvent,\n TurnRequestEvent,\n TurnResponseEvent,\n TokenUsage,\n} from \"@agentxjs/types/event\";\n\nexport {\n isAgentEvent,\n isAgentStreamEvent,\n isAgentStateEvent,\n isAgentMessageEvent,\n isAgentTurnEvent,\n} from \"@agentxjs/types/event\";\n\n// Data types\nexport type { ImageRecord } from \"@agentxjs/types\";\n\nexport type {\n Message,\n UserMessage,\n AssistantMessage,\n ToolCallMessage,\n ToolResultMessage,\n AgentError,\n ContentPart,\n TextPart,\n ToolCallPart,\n ToolResultPart,\n ToolResultOutput,\n} from \"@agentxjs/types/agent\";\n\n// Browser-only createAgentX (remote mode only)\nimport type { AgentX, AgentXConfig } from \"@agentxjs/types/agentx\";\nimport { isRemoteConfig } from \"@agentxjs/types/agentx\";\nimport { createRemoteAgentX } from \"./createAgentX\";\n\n/**\n * Create AgentX instance (Browser version - remote mode only)\n *\n * @param config - Must be RemoteConfig with server URL\n * @returns AgentX instance\n *\n * @example\n * ```typescript\n * const agentx = await createAgentX({ server: \"ws://localhost:5200\" });\n * ```\n */\nexport async function createAgentX(config: AgentXConfig): Promise<AgentX> {\n if (!config || !isRemoteConfig(config)) {\n throw new Error(\n \"Browser environment only supports remote mode. \" +\n 'Please provide { serverUrl: \"ws://...\" } configuration.'\n );\n }\n return createRemoteAgentX(config.serverUrl);\n}\n\n// Also export createRemoteAgentX for explicit usage\nexport { createRemoteAgentX } from \"./createAgentX\";\n"]}
package/dist/browser.js CHANGED
@@ -229,25 +229,22 @@ function isAgentEvent(event) {
229
229
  // src/createAgentX.ts
230
230
  init_dist();
231
231
  var remoteLogger = createLogger("agentx/RemoteClient");
232
- var isBrowser = typeof window !== "undefined" && typeof window.WebSocket !== "undefined";
233
232
  async function createRemoteAgentX(serverUrl) {
234
- const WebSocketImpl = isBrowser ? window.WebSocket : (await import('ws')).WebSocket;
235
- const ws = new WebSocketImpl(serverUrl);
233
+ const { createWebSocketClient } = await import('@agentxjs/network');
234
+ const client = await createWebSocketClient({
235
+ serverUrl,
236
+ autoReconnect: true,
237
+ minReconnectionDelay: 1e3,
238
+ maxReconnectionDelay: 1e4,
239
+ connectionTimeout: 4e3,
240
+ maxRetries: Infinity,
241
+ debug: false
242
+ });
236
243
  const handlers = /* @__PURE__ */ new Map();
237
244
  const pendingRequests = /* @__PURE__ */ new Map();
238
- await new Promise((resolve, reject) => {
239
- if (isBrowser) {
240
- ws.onopen = () => resolve();
241
- ws.onerror = () => reject(new Error("WebSocket connection failed"));
242
- } else {
243
- ws.on("open", () => resolve());
244
- ws.on("error", (err) => reject(err));
245
- }
246
- });
247
- const handleMessage = (data) => {
245
+ client.onMessage((message) => {
248
246
  try {
249
- const text = isBrowser ? data.data : data.toString();
250
- const event = JSON.parse(text);
247
+ const event = JSON.parse(message);
251
248
  remoteLogger.info("Received event", {
252
249
  type: event.type,
253
250
  category: event.category,
@@ -285,12 +282,13 @@ async function createRemoteAgentX(serverUrl) {
285
282
  }
286
283
  } catch {
287
284
  }
288
- };
289
- if (isBrowser) {
290
- ws.onmessage = handleMessage;
291
- } else {
292
- ws.on("message", handleMessage);
293
- }
285
+ });
286
+ client.onClose(() => {
287
+ remoteLogger.warn("WebSocket closed");
288
+ });
289
+ client.onError((error) => {
290
+ remoteLogger.error("WebSocket error", { error: error.message });
291
+ });
294
292
  function subscribe(type, handler) {
295
293
  if (!handlers.has(type)) {
296
294
  handlers.set(type, /* @__PURE__ */ new Set());
@@ -321,7 +319,7 @@ async function createRemoteAgentX(serverUrl) {
321
319
  category: "request",
322
320
  intent: "request"
323
321
  };
324
- ws.send(JSON.stringify(event));
322
+ client.send(JSON.stringify(event));
325
323
  });
326
324
  },
327
325
  on(type, handler) {
@@ -339,7 +337,7 @@ async function createRemoteAgentX(serverUrl) {
339
337
  category: type.toString().endsWith("_response") ? "response" : "request",
340
338
  intent: type.toString().endsWith("_response") ? "result" : "request"
341
339
  };
342
- ws.send(JSON.stringify(event));
340
+ client.send(JSON.stringify(event));
343
341
  },
344
342
  async listen() {
345
343
  throw new Error("Cannot listen in remote mode");
@@ -353,11 +351,7 @@ async function createRemoteAgentX(serverUrl) {
353
351
  }
354
352
  pendingRequests.clear();
355
353
  handlers.clear();
356
- if (isBrowser) {
357
- ws.close();
358
- } else {
359
- ws.close();
360
- }
354
+ client.dispose();
361
355
  }
362
356
  };
363
357
  }