agentxjs 0.1.1 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/browser.cjs CHANGED
@@ -1,11 +1,236 @@
1
1
  'use strict';
2
2
 
3
- var agentx = require('@agentxjs/types/agentx');
4
- var event = require('@agentxjs/types/event');
5
- var common = require('@agentxjs/common');
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __esm = (fn, res) => function __init() {
5
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
6
+ };
6
7
 
7
- // src/browser.ts
8
- var remoteLogger = common.createLogger("agentx/RemoteClient");
8
+ // ../common/dist/index.js
9
+ function createLogger(name) {
10
+ return LoggerFactoryImpl.getLogger(name);
11
+ }
12
+ var __defProp, __defNormalProp, __publicField, _ConsoleLogger, ConsoleLogger, externalFactory, LoggerFactoryImpl;
13
+ var init_dist = __esm({
14
+ "../common/dist/index.js"() {
15
+ __defProp = Object.defineProperty;
16
+ __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
17
+ __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
18
+ _ConsoleLogger = class _ConsoleLogger2 {
19
+ constructor(name, options = {}) {
20
+ __publicField(this, "name");
21
+ __publicField(this, "level");
22
+ __publicField(this, "colors");
23
+ __publicField(this, "timestamps");
24
+ this.name = name;
25
+ this.level = options.level ?? "info";
26
+ this.colors = options.colors ?? this.isNodeEnvironment();
27
+ this.timestamps = options.timestamps ?? true;
28
+ }
29
+ debug(message, context) {
30
+ if (this.isDebugEnabled()) {
31
+ this.log("DEBUG", message, context);
32
+ }
33
+ }
34
+ info(message, context) {
35
+ if (this.isInfoEnabled()) {
36
+ this.log("INFO", message, context);
37
+ }
38
+ }
39
+ warn(message, context) {
40
+ if (this.isWarnEnabled()) {
41
+ this.log("WARN", message, context);
42
+ }
43
+ }
44
+ error(message, context) {
45
+ if (this.isErrorEnabled()) {
46
+ if (message instanceof Error) {
47
+ this.log("ERROR", message.message, { ...context, stack: message.stack });
48
+ } else {
49
+ this.log("ERROR", message, context);
50
+ }
51
+ }
52
+ }
53
+ isDebugEnabled() {
54
+ return this.getLevelValue(this.level) <= this.getLevelValue("debug");
55
+ }
56
+ isInfoEnabled() {
57
+ return this.getLevelValue(this.level) <= this.getLevelValue("info");
58
+ }
59
+ isWarnEnabled() {
60
+ return this.getLevelValue(this.level) <= this.getLevelValue("warn");
61
+ }
62
+ isErrorEnabled() {
63
+ return this.getLevelValue(this.level) <= this.getLevelValue("error");
64
+ }
65
+ getLevelValue(level) {
66
+ const levels = {
67
+ debug: 0,
68
+ info: 1,
69
+ warn: 2,
70
+ error: 3,
71
+ silent: 4
72
+ };
73
+ return levels[level];
74
+ }
75
+ log(level, message, context) {
76
+ const parts = [];
77
+ if (this.timestamps) {
78
+ parts.push((/* @__PURE__ */ new Date()).toISOString());
79
+ }
80
+ if (this.colors) {
81
+ const color = _ConsoleLogger2.COLORS[level];
82
+ parts.push(`${color}${level.padEnd(5)}${_ConsoleLogger2.COLORS.RESET}`);
83
+ } else {
84
+ parts.push(level.padEnd(5));
85
+ }
86
+ parts.push(`[${this.name}]`);
87
+ parts.push(message);
88
+ const logLine = parts.join(" ");
89
+ const consoleMethod = this.getConsoleMethod(level);
90
+ if (context && Object.keys(context).length > 0) {
91
+ consoleMethod(logLine, context);
92
+ } else {
93
+ consoleMethod(logLine);
94
+ }
95
+ }
96
+ getConsoleMethod(level) {
97
+ switch (level) {
98
+ case "DEBUG":
99
+ return console.debug.bind(console);
100
+ case "INFO":
101
+ return console.info.bind(console);
102
+ case "WARN":
103
+ return console.warn.bind(console);
104
+ case "ERROR":
105
+ return console.error.bind(console);
106
+ default:
107
+ return console.log.bind(console);
108
+ }
109
+ }
110
+ isNodeEnvironment() {
111
+ return typeof process !== "undefined" && process.versions?.node !== void 0;
112
+ }
113
+ };
114
+ __publicField(_ConsoleLogger, "COLORS", {
115
+ DEBUG: "\x1B[36m",
116
+ INFO: "\x1B[32m",
117
+ WARN: "\x1B[33m",
118
+ ERROR: "\x1B[31m",
119
+ RESET: "\x1B[0m"
120
+ });
121
+ ConsoleLogger = _ConsoleLogger;
122
+ externalFactory = null;
123
+ LoggerFactoryImpl = class {
124
+ static getLogger(nameOrClass) {
125
+ const name = typeof nameOrClass === "string" ? nameOrClass : nameOrClass.name;
126
+ if (this.loggers.has(name)) {
127
+ return this.loggers.get(name);
128
+ }
129
+ const lazyLogger = this.createLazyLogger(name);
130
+ this.loggers.set(name, lazyLogger);
131
+ return lazyLogger;
132
+ }
133
+ static configure(config) {
134
+ this.config = { ...this.config, ...config };
135
+ }
136
+ static reset() {
137
+ this.loggers.clear();
138
+ this.config = { defaultLevel: "info" };
139
+ externalFactory = null;
140
+ }
141
+ static createLazyLogger(name) {
142
+ let realLogger = null;
143
+ const getRealLogger = () => {
144
+ if (!realLogger) {
145
+ realLogger = this.createLogger(name);
146
+ }
147
+ return realLogger;
148
+ };
149
+ return {
150
+ name,
151
+ level: this.config.defaultLevel || "info",
152
+ debug: (message, context) => getRealLogger().debug(message, context),
153
+ info: (message, context) => getRealLogger().info(message, context),
154
+ warn: (message, context) => getRealLogger().warn(message, context),
155
+ error: (message, context) => getRealLogger().error(message, context),
156
+ isDebugEnabled: () => getRealLogger().isDebugEnabled(),
157
+ isInfoEnabled: () => getRealLogger().isInfoEnabled(),
158
+ isWarnEnabled: () => getRealLogger().isWarnEnabled(),
159
+ isErrorEnabled: () => getRealLogger().isErrorEnabled()
160
+ };
161
+ }
162
+ static createLogger(name) {
163
+ if (externalFactory) {
164
+ return externalFactory.getLogger(name);
165
+ }
166
+ if (this.config.defaultImplementation) {
167
+ return this.config.defaultImplementation(name);
168
+ }
169
+ return new ConsoleLogger(name, {
170
+ level: this.config.defaultLevel,
171
+ ...this.config.consoleOptions
172
+ });
173
+ }
174
+ };
175
+ __publicField(LoggerFactoryImpl, "loggers", /* @__PURE__ */ new Map());
176
+ __publicField(LoggerFactoryImpl, "config", {
177
+ defaultLevel: "info"
178
+ });
179
+ }
180
+ });
181
+
182
+ // ../types/dist/agentx.js
183
+ function isRemoteConfig(config) {
184
+ return "serverUrl" in config && typeof config.serverUrl === "string";
185
+ }
186
+ function isLocalConfig(config) {
187
+ return !isRemoteConfig(config);
188
+ }
189
+
190
+ // ../types/dist/event.js
191
+ function isFromSource(event, source) {
192
+ return event.source === source;
193
+ }
194
+ function hasIntent(event, intent) {
195
+ return event.intent === intent;
196
+ }
197
+ function isRequest(event) {
198
+ return event.intent === "request";
199
+ }
200
+ function isResult(event) {
201
+ return event.intent === "result";
202
+ }
203
+ function isNotification(event) {
204
+ return event.intent === "notification";
205
+ }
206
+ function isCommandEvent(event) {
207
+ return event.source === "command";
208
+ }
209
+ function isCommandRequest(event) {
210
+ return event.source === "command" && event.category === "request";
211
+ }
212
+ function isCommandResponse(event) {
213
+ return event.source === "command" && event.category === "response";
214
+ }
215
+ function isAgentStreamEvent(event) {
216
+ return event.source === "agent" && event.category === "stream";
217
+ }
218
+ function isAgentStateEvent(event) {
219
+ return event.source === "agent" && event.category === "state";
220
+ }
221
+ function isAgentMessageEvent(event) {
222
+ return event.source === "agent" && event.category === "message";
223
+ }
224
+ function isAgentTurnEvent(event) {
225
+ return event.source === "agent" && event.category === "turn";
226
+ }
227
+ function isAgentEvent(event) {
228
+ return event.source === "agent";
229
+ }
230
+
231
+ // src/createAgentX.ts
232
+ init_dist();
233
+ var remoteLogger = createLogger("agentx/RemoteClient");
9
234
  var isBrowser = typeof window !== "undefined" && typeof window.WebSocket !== "undefined";
10
235
  async function createRemoteAgentX(serverUrl) {
11
236
  const WebSocketImpl = isBrowser ? window.WebSocket : (await import('ws')).WebSocket;
@@ -141,7 +366,7 @@ async function createRemoteAgentX(serverUrl) {
141
366
 
142
367
  // src/browser.ts
143
368
  async function createAgentX(config) {
144
- if (!config || !agentx.isRemoteConfig(config)) {
369
+ if (!config || !isRemoteConfig(config)) {
145
370
  throw new Error(
146
371
  'Browser environment only supports remote mode. Please provide { serverUrl: "ws://..." } configuration.'
147
372
  );
@@ -149,67 +374,22 @@ async function createAgentX(config) {
149
374
  return createRemoteAgentX(config.serverUrl);
150
375
  }
151
376
 
152
- Object.defineProperty(exports, "isLocalConfig", {
153
- enumerable: true,
154
- get: function () { return agentx.isLocalConfig; }
155
- });
156
- Object.defineProperty(exports, "isRemoteConfig", {
157
- enumerable: true,
158
- get: function () { return agentx.isRemoteConfig; }
159
- });
160
- Object.defineProperty(exports, "hasIntent", {
161
- enumerable: true,
162
- get: function () { return event.hasIntent; }
163
- });
164
- Object.defineProperty(exports, "isAgentEvent", {
165
- enumerable: true,
166
- get: function () { return event.isAgentEvent; }
167
- });
168
- Object.defineProperty(exports, "isAgentMessageEvent", {
169
- enumerable: true,
170
- get: function () { return event.isAgentMessageEvent; }
171
- });
172
- Object.defineProperty(exports, "isAgentStateEvent", {
173
- enumerable: true,
174
- get: function () { return event.isAgentStateEvent; }
175
- });
176
- Object.defineProperty(exports, "isAgentStreamEvent", {
177
- enumerable: true,
178
- get: function () { return event.isAgentStreamEvent; }
179
- });
180
- Object.defineProperty(exports, "isAgentTurnEvent", {
181
- enumerable: true,
182
- get: function () { return event.isAgentTurnEvent; }
183
- });
184
- Object.defineProperty(exports, "isCommandEvent", {
185
- enumerable: true,
186
- get: function () { return event.isCommandEvent; }
187
- });
188
- Object.defineProperty(exports, "isCommandRequest", {
189
- enumerable: true,
190
- get: function () { return event.isCommandRequest; }
191
- });
192
- Object.defineProperty(exports, "isCommandResponse", {
193
- enumerable: true,
194
- get: function () { return event.isCommandResponse; }
195
- });
196
- Object.defineProperty(exports, "isFromSource", {
197
- enumerable: true,
198
- get: function () { return event.isFromSource; }
199
- });
200
- Object.defineProperty(exports, "isNotification", {
201
- enumerable: true,
202
- get: function () { return event.isNotification; }
203
- });
204
- Object.defineProperty(exports, "isRequest", {
205
- enumerable: true,
206
- get: function () { return event.isRequest; }
207
- });
208
- Object.defineProperty(exports, "isResult", {
209
- enumerable: true,
210
- get: function () { return event.isResult; }
211
- });
212
377
  exports.createAgentX = createAgentX;
213
378
  exports.createRemoteAgentX = createRemoteAgentX;
379
+ exports.hasIntent = hasIntent;
380
+ exports.isAgentEvent = isAgentEvent;
381
+ exports.isAgentMessageEvent = isAgentMessageEvent;
382
+ exports.isAgentStateEvent = isAgentStateEvent;
383
+ exports.isAgentStreamEvent = isAgentStreamEvent;
384
+ exports.isAgentTurnEvent = isAgentTurnEvent;
385
+ exports.isCommandEvent = isCommandEvent;
386
+ exports.isCommandRequest = isCommandRequest;
387
+ exports.isCommandResponse = isCommandResponse;
388
+ exports.isFromSource = isFromSource;
389
+ exports.isLocalConfig = isLocalConfig;
390
+ exports.isNotification = isNotification;
391
+ exports.isRemoteConfig = isRemoteConfig;
392
+ exports.isRequest = isRequest;
393
+ exports.isResult = isResult;
214
394
  //# sourceMappingURL=browser.cjs.map
215
395
  //# sourceMappingURL=browser.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/createAgentX.ts","../src/browser.ts"],"names":["createLogger","isRemoteConfig"],"mappings":"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","file":"browser.cjs","sourcesContent":["/**\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":"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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"]}