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.
- package/README.md +255 -464
- package/dist/browser.cjs +215 -0
- package/dist/browser.cjs.map +1 -0
- package/dist/browser.d.cts +32 -0
- package/dist/browser.d.ts +32 -0
- package/dist/browser.js +153 -0
- package/dist/browser.js.map +1 -0
- package/dist/index.cjs +326 -2763
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +27 -69
- package/dist/index.d.ts +27 -69
- package/dist/index.js +255 -2760
- package/dist/index.js.map +1 -1
- package/package.json +17 -40
- package/dist/runtime/sse/index.cjs +0 -633
- package/dist/runtime/sse/index.cjs.map +0 -1
- package/dist/runtime/sse/index.d.cts +0 -159
- package/dist/runtime/sse/index.d.ts +0 -159
- package/dist/runtime/sse/index.js +0 -621
- package/dist/runtime/sse/index.js.map +0 -1
- package/dist/server/adapters/express.cjs +0 -81
- package/dist/server/adapters/express.cjs.map +0 -1
- package/dist/server/adapters/express.d.cts +0 -75
- package/dist/server/adapters/express.d.ts +0 -75
- package/dist/server/adapters/express.js +0 -78
- package/dist/server/adapters/express.js.map +0 -1
- package/dist/server/adapters/hono.cjs +0 -32
- package/dist/server/adapters/hono.cjs.map +0 -1
- package/dist/server/adapters/hono.d.cts +0 -96
- package/dist/server/adapters/hono.d.ts +0 -96
- package/dist/server/adapters/hono.js +0 -28
- package/dist/server/adapters/hono.js.map +0 -1
- package/dist/server/adapters/index.cjs +0 -135
- package/dist/server/adapters/index.cjs.map +0 -1
- package/dist/server/adapters/index.d.cts +0 -5
- package/dist/server/adapters/index.d.ts +0 -5
- package/dist/server/adapters/index.js +0 -125
- package/dist/server/adapters/index.js.map +0 -1
- package/dist/server/adapters/next.cjs +0 -30
- package/dist/server/adapters/next.cjs.map +0 -1
- package/dist/server/adapters/next.d.cts +0 -107
- package/dist/server/adapters/next.d.ts +0 -107
- package/dist/server/adapters/next.js +0 -25
- package/dist/server/adapters/next.js.map +0 -1
- package/dist/server/index.cjs +0 -1093
- package/dist/server/index.cjs.map +0 -1
- package/dist/server/index.d.cts +0 -131
- package/dist/server/index.d.ts +0 -131
- package/dist/server/index.js +0 -1080
- package/dist/server/index.js.map +0 -1
- package/dist/types-Cgfcw91r.d.cts +0 -282
- package/dist/types-Cgfcw91r.d.ts +0 -282
- package/dist/types-OVKV6qpE.d.cts +0 -118
- package/dist/types-OVKV6qpE.d.ts +0 -118
package/dist/browser.cjs
ADDED
|
@@ -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 };
|
package/dist/browser.js
ADDED
|
@@ -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"]}
|