agentxjs 0.0.9 → 0.1.1

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.
Files changed (54) hide show
  1. package/README.md +255 -464
  2. package/dist/browser.cjs +215 -0
  3. package/dist/browser.cjs.map +1 -0
  4. package/dist/browser.d.cts +32 -0
  5. package/dist/browser.d.ts +32 -0
  6. package/dist/browser.js +153 -0
  7. package/dist/browser.js.map +1 -0
  8. package/dist/index.cjs +326 -2763
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.d.cts +27 -69
  11. package/dist/index.d.ts +27 -69
  12. package/dist/index.js +255 -2760
  13. package/dist/index.js.map +1 -1
  14. package/package.json +17 -40
  15. package/dist/runtime/sse/index.cjs +0 -633
  16. package/dist/runtime/sse/index.cjs.map +0 -1
  17. package/dist/runtime/sse/index.d.cts +0 -159
  18. package/dist/runtime/sse/index.d.ts +0 -159
  19. package/dist/runtime/sse/index.js +0 -621
  20. package/dist/runtime/sse/index.js.map +0 -1
  21. package/dist/server/adapters/express.cjs +0 -81
  22. package/dist/server/adapters/express.cjs.map +0 -1
  23. package/dist/server/adapters/express.d.cts +0 -75
  24. package/dist/server/adapters/express.d.ts +0 -75
  25. package/dist/server/adapters/express.js +0 -78
  26. package/dist/server/adapters/express.js.map +0 -1
  27. package/dist/server/adapters/hono.cjs +0 -32
  28. package/dist/server/adapters/hono.cjs.map +0 -1
  29. package/dist/server/adapters/hono.d.cts +0 -96
  30. package/dist/server/adapters/hono.d.ts +0 -96
  31. package/dist/server/adapters/hono.js +0 -28
  32. package/dist/server/adapters/hono.js.map +0 -1
  33. package/dist/server/adapters/index.cjs +0 -135
  34. package/dist/server/adapters/index.cjs.map +0 -1
  35. package/dist/server/adapters/index.d.cts +0 -5
  36. package/dist/server/adapters/index.d.ts +0 -5
  37. package/dist/server/adapters/index.js +0 -125
  38. package/dist/server/adapters/index.js.map +0 -1
  39. package/dist/server/adapters/next.cjs +0 -30
  40. package/dist/server/adapters/next.cjs.map +0 -1
  41. package/dist/server/adapters/next.d.cts +0 -107
  42. package/dist/server/adapters/next.d.ts +0 -107
  43. package/dist/server/adapters/next.js +0 -25
  44. package/dist/server/adapters/next.js.map +0 -1
  45. package/dist/server/index.cjs +0 -1093
  46. package/dist/server/index.cjs.map +0 -1
  47. package/dist/server/index.d.cts +0 -131
  48. package/dist/server/index.d.ts +0 -131
  49. package/dist/server/index.js +0 -1080
  50. package/dist/server/index.js.map +0 -1
  51. package/dist/types-Cgfcw91r.d.cts +0 -282
  52. package/dist/types-Cgfcw91r.d.ts +0 -282
  53. package/dist/types-OVKV6qpE.d.cts +0 -118
  54. package/dist/types-OVKV6qpE.d.ts +0 -118
@@ -0,0 +1,215 @@
1
+ 'use strict';
2
+
3
+ var agentx = require('@agentxjs/types/agentx');
4
+ var event = require('@agentxjs/types/event');
5
+ var common = require('@agentxjs/common');
6
+
7
+ // src/browser.ts
8
+ var remoteLogger = common.createLogger("agentx/RemoteClient");
9
+ var isBrowser = typeof window !== "undefined" && typeof window.WebSocket !== "undefined";
10
+ async function createRemoteAgentX(serverUrl) {
11
+ const WebSocketImpl = isBrowser ? window.WebSocket : (await import('ws')).WebSocket;
12
+ const ws = new WebSocketImpl(serverUrl);
13
+ const handlers = /* @__PURE__ */ new Map();
14
+ const pendingRequests = /* @__PURE__ */ new Map();
15
+ await new Promise((resolve, reject) => {
16
+ if (isBrowser) {
17
+ ws.onopen = () => resolve();
18
+ ws.onerror = () => reject(new Error("WebSocket connection failed"));
19
+ } else {
20
+ ws.on("open", () => resolve());
21
+ ws.on("error", (err) => reject(err));
22
+ }
23
+ });
24
+ const handleMessage = (data) => {
25
+ try {
26
+ const text = isBrowser ? data.data : data.toString();
27
+ const event = JSON.parse(text);
28
+ remoteLogger.info("Received event", {
29
+ type: event.type,
30
+ category: event.category,
31
+ requestId: event.data?.requestId
32
+ });
33
+ if (event.type === "system_error") {
34
+ const errorData = event.data;
35
+ remoteLogger.error(errorData.message, {
36
+ severity: errorData.severity,
37
+ requestId: event.data?.requestId,
38
+ details: errorData.details
39
+ });
40
+ }
41
+ const requestId = event.data?.requestId;
42
+ if (event.category === "response" && requestId && pendingRequests.has(requestId)) {
43
+ remoteLogger.info("Resolving pending request", { requestId, eventType: event.type });
44
+ const pending = pendingRequests.get(requestId);
45
+ clearTimeout(pending.timer);
46
+ pendingRequests.delete(requestId);
47
+ pending.resolve(event);
48
+ return;
49
+ }
50
+ remoteLogger.info("Dispatching to handlers", { type: event.type });
51
+ const typeHandlers = handlers.get(event.type);
52
+ if (typeHandlers) {
53
+ for (const handler of typeHandlers) {
54
+ handler(event);
55
+ }
56
+ }
57
+ const allHandlers = handlers.get("*");
58
+ if (allHandlers) {
59
+ for (const handler of allHandlers) {
60
+ handler(event);
61
+ }
62
+ }
63
+ } catch {
64
+ }
65
+ };
66
+ if (isBrowser) {
67
+ ws.onmessage = handleMessage;
68
+ } else {
69
+ ws.on("message", handleMessage);
70
+ }
71
+ function subscribe(type, handler) {
72
+ if (!handlers.has(type)) {
73
+ handlers.set(type, /* @__PURE__ */ new Set());
74
+ }
75
+ handlers.get(type).add(handler);
76
+ return () => {
77
+ handlers.get(type)?.delete(handler);
78
+ };
79
+ }
80
+ return {
81
+ request(type, data, timeout = 3e4) {
82
+ return new Promise((resolve, reject) => {
83
+ const requestId = `req_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;
84
+ const timer = setTimeout(() => {
85
+ pendingRequests.delete(requestId);
86
+ reject(new Error(`Request timeout: ${type}`));
87
+ }, timeout);
88
+ pendingRequests.set(requestId, {
89
+ resolve,
90
+ reject,
91
+ timer
92
+ });
93
+ const event = {
94
+ type,
95
+ timestamp: Date.now(),
96
+ data: { ...data, requestId },
97
+ source: "command",
98
+ category: "request",
99
+ intent: "request"
100
+ };
101
+ ws.send(JSON.stringify(event));
102
+ });
103
+ },
104
+ on(type, handler) {
105
+ return subscribe(type, handler);
106
+ },
107
+ onCommand(type, handler) {
108
+ return subscribe(type, handler);
109
+ },
110
+ emitCommand(type, data) {
111
+ const event = {
112
+ type,
113
+ timestamp: Date.now(),
114
+ data,
115
+ source: "command",
116
+ category: type.toString().endsWith("_response") ? "response" : "request",
117
+ intent: type.toString().endsWith("_response") ? "result" : "request"
118
+ };
119
+ ws.send(JSON.stringify(event));
120
+ },
121
+ async listen() {
122
+ throw new Error("Cannot listen in remote mode");
123
+ },
124
+ async close() {
125
+ },
126
+ async dispose() {
127
+ for (const pending of pendingRequests.values()) {
128
+ clearTimeout(pending.timer);
129
+ pending.reject(new Error("AgentX disposed"));
130
+ }
131
+ pendingRequests.clear();
132
+ handlers.clear();
133
+ if (isBrowser) {
134
+ ws.close();
135
+ } else {
136
+ ws.close();
137
+ }
138
+ }
139
+ };
140
+ }
141
+
142
+ // src/browser.ts
143
+ async function createAgentX(config) {
144
+ if (!config || !agentx.isRemoteConfig(config)) {
145
+ throw new Error(
146
+ 'Browser environment only supports remote mode. Please provide { serverUrl: "ws://..." } configuration.'
147
+ );
148
+ }
149
+ return createRemoteAgentX(config.serverUrl);
150
+ }
151
+
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
+ exports.createAgentX = createAgentX;
213
+ exports.createRemoteAgentX = createRemoteAgentX;
214
+ //# sourceMappingURL=browser.cjs.map
215
+ //# sourceMappingURL=browser.cjs.map
@@ -0,0 +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"]}
@@ -0,0 +1,32 @@
1
+ import { AgentXConfig, AgentX } from '@agentxjs/types/agentx';
2
+ export { AgentX, AgentXConfig, LLMConfig, LocalConfig, RemoteConfig, StorageConfig, StorageDriver, Unsubscribe, isLocalConfig, isRemoteConfig } from '@agentxjs/types/agentx';
3
+ export { AgentDestroyRequest, AgentDestroyResponse, AgentEvent, AgentEventCategory, AgentGetRequest, AgentGetResponse, AgentInterruptRequest, AgentInterruptResponse, AgentListRequest, AgentListResponse, AgentMessageEvent, AgentMessageStartEvent, AgentMessageStopEvent, AgentStateEvent, AgentStreamEvent, AgentTextDeltaEvent, AgentToolResultEvent, AgentToolUseStartEvent, AgentToolUseStopEvent, AgentTurnEvent, AssistantMessageEvent, CommandEvent, CommandEventMap, CommandEventType, CommandRequest, CommandRequestType, CommandResponse, ContainerCreateRequest, ContainerCreateResponse, ContainerGetRequest, ContainerGetResponse, ContainerListRequest, ContainerListResponse, ConversationEndEvent, ConversationRespondingEvent, ConversationStartEvent, ConversationThinkingEvent, ErrorOccurredEvent, EventCategory, EventContext, EventIntent, EventSource, ImageCreateRequest, ImageCreateResponse, ImageDeleteRequest, ImageDeleteResponse, ImageGetRequest, ImageGetResponse, ImageListItem, ImageListRequest, ImageListResponse, ImageRunRequest, ImageRunResponse, ImageStopRequest, ImageStopResponse, ImageUpdateRequest, ImageUpdateResponse, MessageSendRequest, MessageSendResponse, SystemEvent, TokenUsage, ToolCallMessageEvent, ToolCompletedEvent, ToolExecutingEvent, ToolResultMessageEvent, TurnRequestEvent, TurnResponseEvent, UserMessageEvent, hasIntent, isAgentEvent, isAgentMessageEvent, isAgentStateEvent, isAgentStreamEvent, isAgentTurnEvent, isCommandEvent, isCommandRequest, isCommandResponse, isFromSource, isNotification, isRequest, isResult } from '@agentxjs/types/event';
4
+ export { ImageRecord } from '@agentxjs/types';
5
+ export { AgentError, AssistantMessage, ContentPart, Message, TextPart, ToolCallMessage, ToolCallPart, ToolResultMessage, ToolResultOutput, ToolResultPart, UserMessage } from '@agentxjs/types/agent';
6
+ export { createRemoteAgentX } from './index.cjs';
7
+ import '@agentxjs/common';
8
+
9
+ /**
10
+ * agentxjs - Browser Entry Point
11
+ *
12
+ * This entry is automatically selected by bundlers (Vite, Webpack, etc.)
13
+ * when building for browser environments.
14
+ *
15
+ * Only includes remote mode (WebSocket client).
16
+ * Does not include Node.js specific code (runtime, fs, sqlite, etc.)
17
+ */
18
+
19
+ /**
20
+ * Create AgentX instance (Browser version - remote mode only)
21
+ *
22
+ * @param config - Must be RemoteConfig with server URL
23
+ * @returns AgentX instance
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const agentx = await createAgentX({ server: "ws://localhost:5200" });
28
+ * ```
29
+ */
30
+ declare function createAgentX(config: AgentXConfig): Promise<AgentX>;
31
+
32
+ export { createAgentX };
@@ -0,0 +1,32 @@
1
+ import { AgentXConfig, AgentX } from '@agentxjs/types/agentx';
2
+ export { AgentX, AgentXConfig, LLMConfig, LocalConfig, RemoteConfig, StorageConfig, StorageDriver, Unsubscribe, isLocalConfig, isRemoteConfig } from '@agentxjs/types/agentx';
3
+ export { AgentDestroyRequest, AgentDestroyResponse, AgentEvent, AgentEventCategory, AgentGetRequest, AgentGetResponse, AgentInterruptRequest, AgentInterruptResponse, AgentListRequest, AgentListResponse, AgentMessageEvent, AgentMessageStartEvent, AgentMessageStopEvent, AgentStateEvent, AgentStreamEvent, AgentTextDeltaEvent, AgentToolResultEvent, AgentToolUseStartEvent, AgentToolUseStopEvent, AgentTurnEvent, AssistantMessageEvent, CommandEvent, CommandEventMap, CommandEventType, CommandRequest, CommandRequestType, CommandResponse, ContainerCreateRequest, ContainerCreateResponse, ContainerGetRequest, ContainerGetResponse, ContainerListRequest, ContainerListResponse, ConversationEndEvent, ConversationRespondingEvent, ConversationStartEvent, ConversationThinkingEvent, ErrorOccurredEvent, EventCategory, EventContext, EventIntent, EventSource, ImageCreateRequest, ImageCreateResponse, ImageDeleteRequest, ImageDeleteResponse, ImageGetRequest, ImageGetResponse, ImageListItem, ImageListRequest, ImageListResponse, ImageRunRequest, ImageRunResponse, ImageStopRequest, ImageStopResponse, ImageUpdateRequest, ImageUpdateResponse, MessageSendRequest, MessageSendResponse, SystemEvent, TokenUsage, ToolCallMessageEvent, ToolCompletedEvent, ToolExecutingEvent, ToolResultMessageEvent, TurnRequestEvent, TurnResponseEvent, UserMessageEvent, hasIntent, isAgentEvent, isAgentMessageEvent, isAgentStateEvent, isAgentStreamEvent, isAgentTurnEvent, isCommandEvent, isCommandRequest, isCommandResponse, isFromSource, isNotification, isRequest, isResult } from '@agentxjs/types/event';
4
+ export { ImageRecord } from '@agentxjs/types';
5
+ export { AgentError, AssistantMessage, ContentPart, Message, TextPart, ToolCallMessage, ToolCallPart, ToolResultMessage, ToolResultOutput, ToolResultPart, UserMessage } from '@agentxjs/types/agent';
6
+ export { createRemoteAgentX } from './index.js';
7
+ import '@agentxjs/common';
8
+
9
+ /**
10
+ * agentxjs - Browser Entry Point
11
+ *
12
+ * This entry is automatically selected by bundlers (Vite, Webpack, etc.)
13
+ * when building for browser environments.
14
+ *
15
+ * Only includes remote mode (WebSocket client).
16
+ * Does not include Node.js specific code (runtime, fs, sqlite, etc.)
17
+ */
18
+
19
+ /**
20
+ * Create AgentX instance (Browser version - remote mode only)
21
+ *
22
+ * @param config - Must be RemoteConfig with server URL
23
+ * @returns AgentX instance
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const agentx = await createAgentX({ server: "ws://localhost:5200" });
28
+ * ```
29
+ */
30
+ declare function createAgentX(config: AgentXConfig): Promise<AgentX>;
31
+
32
+ export { createAgentX };
@@ -0,0 +1,153 @@
1
+ import { isRemoteConfig } from '@agentxjs/types/agentx';
2
+ export { isLocalConfig, isRemoteConfig } from '@agentxjs/types/agentx';
3
+ export { hasIntent, isAgentEvent, isAgentMessageEvent, isAgentStateEvent, isAgentStreamEvent, isAgentTurnEvent, isCommandEvent, isCommandRequest, isCommandResponse, isFromSource, isNotification, isRequest, isResult } from '@agentxjs/types/event';
4
+ import { createLogger } from '@agentxjs/common';
5
+
6
+ // src/browser.ts
7
+ var remoteLogger = createLogger("agentx/RemoteClient");
8
+ var isBrowser = typeof window !== "undefined" && typeof window.WebSocket !== "undefined";
9
+ async function createRemoteAgentX(serverUrl) {
10
+ const WebSocketImpl = isBrowser ? window.WebSocket : (await import('ws')).WebSocket;
11
+ const ws = new WebSocketImpl(serverUrl);
12
+ const handlers = /* @__PURE__ */ new Map();
13
+ const pendingRequests = /* @__PURE__ */ new Map();
14
+ await new Promise((resolve, reject) => {
15
+ if (isBrowser) {
16
+ ws.onopen = () => resolve();
17
+ ws.onerror = () => reject(new Error("WebSocket connection failed"));
18
+ } else {
19
+ ws.on("open", () => resolve());
20
+ ws.on("error", (err) => reject(err));
21
+ }
22
+ });
23
+ const handleMessage = (data) => {
24
+ try {
25
+ const text = isBrowser ? data.data : data.toString();
26
+ const event = JSON.parse(text);
27
+ remoteLogger.info("Received event", {
28
+ type: event.type,
29
+ category: event.category,
30
+ requestId: event.data?.requestId
31
+ });
32
+ if (event.type === "system_error") {
33
+ const errorData = event.data;
34
+ remoteLogger.error(errorData.message, {
35
+ severity: errorData.severity,
36
+ requestId: event.data?.requestId,
37
+ details: errorData.details
38
+ });
39
+ }
40
+ const requestId = event.data?.requestId;
41
+ if (event.category === "response" && requestId && pendingRequests.has(requestId)) {
42
+ remoteLogger.info("Resolving pending request", { requestId, eventType: event.type });
43
+ const pending = pendingRequests.get(requestId);
44
+ clearTimeout(pending.timer);
45
+ pendingRequests.delete(requestId);
46
+ pending.resolve(event);
47
+ return;
48
+ }
49
+ remoteLogger.info("Dispatching to handlers", { type: event.type });
50
+ const typeHandlers = handlers.get(event.type);
51
+ if (typeHandlers) {
52
+ for (const handler of typeHandlers) {
53
+ handler(event);
54
+ }
55
+ }
56
+ const allHandlers = handlers.get("*");
57
+ if (allHandlers) {
58
+ for (const handler of allHandlers) {
59
+ handler(event);
60
+ }
61
+ }
62
+ } catch {
63
+ }
64
+ };
65
+ if (isBrowser) {
66
+ ws.onmessage = handleMessage;
67
+ } else {
68
+ ws.on("message", handleMessage);
69
+ }
70
+ function subscribe(type, handler) {
71
+ if (!handlers.has(type)) {
72
+ handlers.set(type, /* @__PURE__ */ new Set());
73
+ }
74
+ handlers.get(type).add(handler);
75
+ return () => {
76
+ handlers.get(type)?.delete(handler);
77
+ };
78
+ }
79
+ return {
80
+ request(type, data, timeout = 3e4) {
81
+ return new Promise((resolve, reject) => {
82
+ const requestId = `req_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;
83
+ const timer = setTimeout(() => {
84
+ pendingRequests.delete(requestId);
85
+ reject(new Error(`Request timeout: ${type}`));
86
+ }, timeout);
87
+ pendingRequests.set(requestId, {
88
+ resolve,
89
+ reject,
90
+ timer
91
+ });
92
+ const event = {
93
+ type,
94
+ timestamp: Date.now(),
95
+ data: { ...data, requestId },
96
+ source: "command",
97
+ category: "request",
98
+ intent: "request"
99
+ };
100
+ ws.send(JSON.stringify(event));
101
+ });
102
+ },
103
+ on(type, handler) {
104
+ return subscribe(type, handler);
105
+ },
106
+ onCommand(type, handler) {
107
+ return subscribe(type, handler);
108
+ },
109
+ emitCommand(type, data) {
110
+ const event = {
111
+ type,
112
+ timestamp: Date.now(),
113
+ data,
114
+ source: "command",
115
+ category: type.toString().endsWith("_response") ? "response" : "request",
116
+ intent: type.toString().endsWith("_response") ? "result" : "request"
117
+ };
118
+ ws.send(JSON.stringify(event));
119
+ },
120
+ async listen() {
121
+ throw new Error("Cannot listen in remote mode");
122
+ },
123
+ async close() {
124
+ },
125
+ async dispose() {
126
+ for (const pending of pendingRequests.values()) {
127
+ clearTimeout(pending.timer);
128
+ pending.reject(new Error("AgentX disposed"));
129
+ }
130
+ pendingRequests.clear();
131
+ handlers.clear();
132
+ if (isBrowser) {
133
+ ws.close();
134
+ } else {
135
+ ws.close();
136
+ }
137
+ }
138
+ };
139
+ }
140
+
141
+ // src/browser.ts
142
+ async function createAgentX(config) {
143
+ if (!config || !isRemoteConfig(config)) {
144
+ throw new Error(
145
+ 'Browser environment only supports remote mode. Please provide { serverUrl: "ws://..." } configuration.'
146
+ );
147
+ }
148
+ return createRemoteAgentX(config.serverUrl);
149
+ }
150
+
151
+ export { createAgentX, createRemoteAgentX };
152
+ //# sourceMappingURL=browser.js.map
153
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/createAgentX.ts","../src/browser.ts"],"names":["isRemoteConfig"],"mappings":"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","file":"browser.js","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"]}