agentxjs 0.0.4 → 0.0.6
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/index.cjs +19 -198
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -181
- package/dist/index.js.map +1 -1
- package/dist/runtime/sse/index.cjs +4 -167
- package/dist/runtime/sse/index.cjs.map +1 -1
- package/dist/runtime/sse/index.js +1 -164
- package/dist/runtime/sse/index.js.map +1 -1
- package/dist/server/index.cjs +3 -163
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.js +2 -162
- package/dist/server/index.js.map +1 -1
- package/package.json +5 -5
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var common = require('@agentxjs/common');
|
|
3
4
|
var types = require('@agentxjs/types');
|
|
4
5
|
var ky = require('ky');
|
|
5
6
|
|
|
@@ -10,168 +11,6 @@ var ky__default = /*#__PURE__*/_interopDefault(ky);
|
|
|
10
11
|
var __defProp = Object.defineProperty;
|
|
11
12
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
12
13
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
13
|
-
var __defProp2 = Object.defineProperty;
|
|
14
|
-
var __defNormalProp2 = (obj, key, value) => key in obj ? __defProp2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
15
|
-
var __publicField2 = (obj, key, value) => __defNormalProp2(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
16
|
-
var _ConsoleLogger = class _ConsoleLogger2 {
|
|
17
|
-
constructor(name, options = {}) {
|
|
18
|
-
__publicField2(this, "name");
|
|
19
|
-
__publicField2(this, "level");
|
|
20
|
-
__publicField2(this, "colors");
|
|
21
|
-
__publicField2(this, "timestamps");
|
|
22
|
-
this.name = name;
|
|
23
|
-
this.level = options.level ?? types.LogLevel.INFO;
|
|
24
|
-
this.colors = options.colors ?? this.isNodeEnvironment();
|
|
25
|
-
this.timestamps = options.timestamps ?? true;
|
|
26
|
-
}
|
|
27
|
-
debug(message, context) {
|
|
28
|
-
if (this.isDebugEnabled()) {
|
|
29
|
-
this.log("DEBUG", message, context);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
info(message, context) {
|
|
33
|
-
if (this.isInfoEnabled()) {
|
|
34
|
-
this.log("INFO", message, context);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
warn(message, context) {
|
|
38
|
-
if (this.isWarnEnabled()) {
|
|
39
|
-
this.log("WARN", message, context);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
error(message, context) {
|
|
43
|
-
if (this.isErrorEnabled()) {
|
|
44
|
-
if (message instanceof Error) {
|
|
45
|
-
this.log("ERROR", message.message, { ...context, stack: message.stack });
|
|
46
|
-
} else {
|
|
47
|
-
this.log("ERROR", message, context);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
isDebugEnabled() {
|
|
52
|
-
return this.level <= types.LogLevel.DEBUG;
|
|
53
|
-
}
|
|
54
|
-
isInfoEnabled() {
|
|
55
|
-
return this.level <= types.LogLevel.INFO;
|
|
56
|
-
}
|
|
57
|
-
isWarnEnabled() {
|
|
58
|
-
return this.level <= types.LogLevel.WARN;
|
|
59
|
-
}
|
|
60
|
-
isErrorEnabled() {
|
|
61
|
-
return this.level <= types.LogLevel.ERROR;
|
|
62
|
-
}
|
|
63
|
-
log(level, message, context) {
|
|
64
|
-
const parts = [];
|
|
65
|
-
if (this.timestamps) {
|
|
66
|
-
parts.push((/* @__PURE__ */ new Date()).toISOString());
|
|
67
|
-
}
|
|
68
|
-
if (this.colors) {
|
|
69
|
-
const color = _ConsoleLogger2.COLORS[level];
|
|
70
|
-
parts.push(`${color}${level.padEnd(5)}${_ConsoleLogger2.COLORS.RESET}`);
|
|
71
|
-
} else {
|
|
72
|
-
parts.push(level.padEnd(5));
|
|
73
|
-
}
|
|
74
|
-
parts.push(`[${this.name}]`);
|
|
75
|
-
parts.push(message);
|
|
76
|
-
const logLine = parts.join(" ");
|
|
77
|
-
const consoleMethod = this.getConsoleMethod(level);
|
|
78
|
-
if (context && Object.keys(context).length > 0) {
|
|
79
|
-
consoleMethod(logLine, context);
|
|
80
|
-
} else {
|
|
81
|
-
consoleMethod(logLine);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
getConsoleMethod(level) {
|
|
85
|
-
switch (level) {
|
|
86
|
-
case "DEBUG":
|
|
87
|
-
return console.debug.bind(console);
|
|
88
|
-
case "INFO":
|
|
89
|
-
return console.info.bind(console);
|
|
90
|
-
case "WARN":
|
|
91
|
-
return console.warn.bind(console);
|
|
92
|
-
case "ERROR":
|
|
93
|
-
return console.error.bind(console);
|
|
94
|
-
default:
|
|
95
|
-
return console.log.bind(console);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
isNodeEnvironment() {
|
|
99
|
-
return typeof process !== "undefined" && process.versions?.node !== void 0;
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
__publicField2(_ConsoleLogger, "COLORS", {
|
|
103
|
-
DEBUG: "\x1B[36m",
|
|
104
|
-
INFO: "\x1B[32m",
|
|
105
|
-
WARN: "\x1B[33m",
|
|
106
|
-
ERROR: "\x1B[31m",
|
|
107
|
-
RESET: "\x1B[0m"
|
|
108
|
-
});
|
|
109
|
-
var ConsoleLogger = _ConsoleLogger;
|
|
110
|
-
var externalFactory = null;
|
|
111
|
-
var LoggerFactoryImpl = class {
|
|
112
|
-
static getLogger(nameOrClass) {
|
|
113
|
-
const name = typeof nameOrClass === "string" ? nameOrClass : nameOrClass.name;
|
|
114
|
-
if (this.loggers.has(name)) {
|
|
115
|
-
return this.loggers.get(name);
|
|
116
|
-
}
|
|
117
|
-
const lazyLogger = this.createLazyLogger(name);
|
|
118
|
-
this.loggers.set(name, lazyLogger);
|
|
119
|
-
return lazyLogger;
|
|
120
|
-
}
|
|
121
|
-
static configure(config) {
|
|
122
|
-
this.config = { ...this.config, ...config };
|
|
123
|
-
}
|
|
124
|
-
static reset() {
|
|
125
|
-
this.loggers.clear();
|
|
126
|
-
this.config = { defaultLevel: types.LogLevel.INFO };
|
|
127
|
-
externalFactory = null;
|
|
128
|
-
}
|
|
129
|
-
static createLazyLogger(name) {
|
|
130
|
-
let realLogger = null;
|
|
131
|
-
const getRealLogger = () => {
|
|
132
|
-
if (!realLogger) {
|
|
133
|
-
realLogger = this.createLogger(name);
|
|
134
|
-
}
|
|
135
|
-
return realLogger;
|
|
136
|
-
};
|
|
137
|
-
return {
|
|
138
|
-
name,
|
|
139
|
-
level: this.config.defaultLevel || types.LogLevel.INFO,
|
|
140
|
-
debug: (message, context) => getRealLogger().debug(message, context),
|
|
141
|
-
info: (message, context) => getRealLogger().info(message, context),
|
|
142
|
-
warn: (message, context) => getRealLogger().warn(message, context),
|
|
143
|
-
error: (message, context) => getRealLogger().error(message, context),
|
|
144
|
-
isDebugEnabled: () => getRealLogger().isDebugEnabled(),
|
|
145
|
-
isInfoEnabled: () => getRealLogger().isInfoEnabled(),
|
|
146
|
-
isWarnEnabled: () => getRealLogger().isWarnEnabled(),
|
|
147
|
-
isErrorEnabled: () => getRealLogger().isErrorEnabled()
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
static createLogger(name) {
|
|
151
|
-
if (externalFactory) {
|
|
152
|
-
return externalFactory.getLogger(name);
|
|
153
|
-
}
|
|
154
|
-
if (this.config.defaultImplementation) {
|
|
155
|
-
return this.config.defaultImplementation(name);
|
|
156
|
-
}
|
|
157
|
-
return new ConsoleLogger(name, {
|
|
158
|
-
level: this.config.defaultLevel,
|
|
159
|
-
...this.config.consoleOptions
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
__publicField2(LoggerFactoryImpl, "loggers", /* @__PURE__ */ new Map());
|
|
164
|
-
__publicField2(LoggerFactoryImpl, "config", {
|
|
165
|
-
defaultLevel: types.LogLevel.INFO
|
|
166
|
-
});
|
|
167
|
-
function setLoggerFactory(factory) {
|
|
168
|
-
externalFactory = factory;
|
|
169
|
-
LoggerFactoryImpl.reset();
|
|
170
|
-
externalFactory = factory;
|
|
171
|
-
}
|
|
172
|
-
function createLogger(name) {
|
|
173
|
-
return LoggerFactoryImpl.getLogger(name);
|
|
174
|
-
}
|
|
175
14
|
var PersistentSSEConnection = class {
|
|
176
15
|
constructor(serverUrl, agentId, sseParams = {}) {
|
|
177
16
|
this.serverUrl = serverUrl;
|
|
@@ -367,7 +206,7 @@ function createHttpClient(options) {
|
|
|
367
206
|
}
|
|
368
207
|
|
|
369
208
|
// src/runtime/sse/repository/RemoteRepository.ts
|
|
370
|
-
var logger = createLogger("agentx/RemoteRepository");
|
|
209
|
+
var logger = common.createLogger("agentx/RemoteRepository");
|
|
371
210
|
var RemoteRepository = class {
|
|
372
211
|
constructor(options) {
|
|
373
212
|
__publicField(this, "client");
|
|
@@ -693,9 +532,7 @@ var BrowserLoggerFactory = class {
|
|
|
693
532
|
return logger3;
|
|
694
533
|
}
|
|
695
534
|
};
|
|
696
|
-
|
|
697
|
-
// src/runtime/sse/RemoteAgentIdResolver.ts
|
|
698
|
-
var logger2 = createLogger("agentx/RemoteAgentIdResolver");
|
|
535
|
+
var logger2 = common.createLogger("agentx/RemoteAgentIdResolver");
|
|
699
536
|
var RemoteAgentIdResolver = class {
|
|
700
537
|
constructor(options) {
|
|
701
538
|
__publicField(this, "client");
|
|
@@ -751,7 +588,7 @@ var SSERuntime = class {
|
|
|
751
588
|
this.loggerFactory = new BrowserLoggerFactory({
|
|
752
589
|
collapsed: true
|
|
753
590
|
});
|
|
754
|
-
setLoggerFactory(this.loggerFactory);
|
|
591
|
+
common.setLoggerFactory(this.loggerFactory);
|
|
755
592
|
this.repository = new RemoteRepository({
|
|
756
593
|
serverUrl: this.serverUrl,
|
|
757
594
|
headers: this.headers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../common/src/logger/ConsoleLogger.ts","../../../../common/src/logger/LoggerFactoryImpl.ts","../../../src/runtime/sse/SSEDriver.ts","../../../src/managers/remote/HttpClient.ts","../../../src/runtime/sse/repository/RemoteRepository.ts","../../../src/runtime/sse/logger/BrowserLogger.ts","../../../src/runtime/sse/logger/BrowserLoggerFactory.ts","../../../src/runtime/sse/RemoteAgentIdResolver.ts","../../../src/runtime/sse/SSERuntime.ts"],"names":["_ConsoleLogger","__publicField","LogLevelEnum","STREAM_EVENT_TYPE_NAMES","ky","logger"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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\";\nimport { LogLevel as LogLevelEnum } 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 ?? LogLevelEnum.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.level <= LogLevelEnum.DEBUG;\n }\n\n isInfoEnabled(): boolean {\n return this.level <= LogLevelEnum.INFO;\n }\n\n isWarnEnabled(): boolean {\n return this.level <= LogLevelEnum.WARN;\n }\n\n isErrorEnabled(): boolean {\n return this.level <= LogLevelEnum.ERROR;\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 * 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 { LogLevel as LogLevelEnum } 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: LogLevelEnum.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: LogLevelEnum.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 || LogLevelEnum.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","/* eslint-disable no-undef */\n/**\n * SSEDriver - Browser-side driver that connects to remote AgentX server via SSE\n *\n * This driver enables the client to use the full agentx stack (including AgentEngine)\n * by bridging SSE push events to the async generator pull model.\n *\n * @example\n * ```typescript\n * import { createSSERuntime } from \"agentxjs/client\";\n * import { createAgentX, defineAgent } from \"agentxjs\";\n *\n * const runtime = createSSERuntime({\n * serverUrl: \"http://localhost:5200/agentx\",\n * agentId: \"agent_123\"\n * });\n * const agentx = createAgentX(runtime);\n * const agent = agentx.agents.create(defineAgent({ name: \"Assistant\" }));\n *\n * agent.on(\"assistant_message\", (event) => {\n * console.log(event.data.content);\n * });\n *\n * await agent.receive(\"Hello!\");\n * ```\n */\n\nimport type { UserMessage, StreamEventType, AgentDriver } from \"@agentxjs/types\";\nimport { STREAM_EVENT_TYPE_NAMES } from \"@agentxjs/types\";\n\n/**\n * Persistent SSE connection manager\n *\n * Maintains a single SSE connection for the lifetime of the driver.\n * Bridges SSE push model to async generator pull model for each receive() call.\n */\nclass PersistentSSEConnection {\n private eventSource: EventSource | null = null;\n private messageQueue: StreamEventType[] = [];\n private activeIterators: Set<{\n resolve: (result: IteratorResult<StreamEventType>) => void;\n reject: (error: Error) => void;\n }> = new Set();\n private isDone = false;\n\n constructor(\n private readonly serverUrl: string,\n private readonly agentId: string,\n private readonly sseParams: Record<string, string> = {}\n ) {}\n\n /**\n * Initialize SSE connection\n */\n connect(): void {\n if (this.eventSource) {\n return; // Already connected\n }\n\n // Build SSE URL with optional query parameters (for auth, etc.)\n let sseUrl = `${this.serverUrl}/agents/${this.agentId}/sse`;\n if (Object.keys(this.sseParams).length > 0) {\n const params = new URLSearchParams(this.sseParams);\n sseUrl += `?${params.toString()}`;\n }\n this.eventSource = new EventSource(sseUrl);\n\n const handleEvent = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data) as StreamEventType;\n\n // Notify all active iterators\n if (this.activeIterators.size > 0) {\n const iterator = this.activeIterators.values().next().value;\n if (iterator) {\n this.activeIterators.delete(iterator);\n iterator.resolve({ value: data, done: false });\n }\n } else {\n // Queue event if no iterator is waiting\n this.messageQueue.push(data);\n }\n } catch {\n // Ignore parse errors\n }\n };\n\n const handleError = () => {\n this.isDone = true;\n this.eventSource?.close();\n this.eventSource = null;\n\n // Reject all waiting iterators\n for (const iterator of this.activeIterators) {\n iterator.reject(new Error(\"SSE connection error\"));\n }\n this.activeIterators.clear();\n };\n\n // Listen for all stream event types\n for (const eventType of STREAM_EVENT_TYPE_NAMES) {\n this.eventSource.addEventListener(eventType, handleEvent as any);\n }\n\n // Listen for error events (independent from stream events, transportable via SSE)\n this.eventSource.addEventListener(\"error\", handleEvent as any);\n\n // Also listen for generic message events (fallback)\n this.eventSource.onmessage = handleEvent;\n\n // Handle SSE connection errors (different from our ErrorEvent)\n this.eventSource.onerror = handleError;\n }\n\n /**\n * Create an async iterable for a single receive() call\n *\n * This iterator continues until a final message_stop is received (stopReason !== \"tool_use\").\n * For tool calls, this means it will span multiple message_start/message_stop cycles.\n * The SSE connection itself remains open for future receive() calls.\n */\n createIterator(): AsyncIterable<StreamEventType> {\n const connection = this;\n\n return {\n [Symbol.asyncIterator]() {\n let turnComplete = false;\n\n return {\n async next(): Promise<IteratorResult<StreamEventType>> {\n // Return queued events first\n if (connection.messageQueue.length > 0) {\n const event = connection.messageQueue.shift()!;\n\n // Check if turn is complete at message_stop\n // Continue if stopReason is \"tool_use\", stop otherwise\n if (event.type === \"message_stop\") {\n const stopReason = event.data.stopReason;\n if (stopReason !== \"tool_use\") {\n turnComplete = true;\n }\n }\n\n return { value: event, done: false };\n }\n\n // If turn is complete, end iteration (but keep connection open for next receive())\n if (turnComplete) {\n return { done: true, value: undefined as any };\n }\n\n // If connection died, end iteration\n if (connection.isDone) {\n return { done: true, value: undefined as any };\n }\n\n // Wait for next event\n return new Promise((resolve, reject) => {\n // Wrap resolve to check for completion\n const wrappedResolve = (result: IteratorResult<StreamEventType>) => {\n if (!result.done) {\n // Check if turn is complete at message_stop\n if (result.value.type === \"message_stop\") {\n const stopReason = result.value.data.stopReason;\n if (stopReason !== \"tool_use\") {\n turnComplete = true;\n }\n }\n }\n resolve(result);\n };\n\n const iterator = { resolve: wrappedResolve, reject };\n connection.activeIterators.add(iterator);\n });\n },\n\n async return(): Promise<IteratorResult<StreamEventType>> {\n // Cleanup this iterator (but keep connection alive)\n return { done: true, value: undefined as any };\n },\n };\n },\n };\n }\n\n /**\n * Close the connection\n */\n close(): void {\n this.isDone = true;\n\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n\n // Reject all waiting iterators\n for (const iterator of this.activeIterators) {\n iterator.reject(new Error(\"Connection closed\"));\n }\n this.activeIterators.clear();\n this.messageQueue = [];\n }\n}\n\n/**\n * SSEDriver configuration\n */\nexport interface SSEDriverConfig {\n serverUrl: string;\n agentId: string;\n headers?: Record<string, string>;\n /**\n * Query parameters to append to SSE URL.\n * Use this for authentication since EventSource doesn't support headers.\n */\n sseParams?: Record<string, string>;\n}\n\n/**\n * Create an SSEDriver instance\n *\n * Factory function for browser-side SSE driver.\n */\nexport function createSSEDriver(config: SSEDriverConfig): AgentDriver {\n const { serverUrl, agentId, headers = {}, sseParams = {} } = config;\n let connection: PersistentSSEConnection | null = null;\n\n return {\n name: \"SSEDriver\",\n\n async *receive(message: UserMessage): AsyncIterable<StreamEventType> {\n // 1. Ensure SSE connection is established\n if (!connection) {\n connection = new PersistentSSEConnection(serverUrl, agentId, sseParams);\n connection.connect();\n }\n\n // 2. Send message to server via HTTP POST\n const messageUrl = `${serverUrl}/agents/${agentId}/messages`;\n const response = await fetch(messageUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify({\n content: typeof message.content === \"string\" ? message.content : message.content,\n }),\n });\n\n if (!response.ok) {\n const errorBody = (await response.json().catch(() => ({}))) as {\n error?: { message?: string };\n };\n throw new Error(errorBody.error?.message || `HTTP ${response.status}`);\n }\n\n // 3. Yield events from persistent SSE connection\n yield* connection.createIterator();\n },\n\n interrupt(): void {\n // Call server interrupt endpoint (fire-and-forget)\n const interruptUrl = `${serverUrl}/agents/${agentId}/interrupt`;\n fetch(interruptUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n }).catch(() => {\n // Ignore errors - interrupt is best-effort\n });\n },\n };\n}\n","/**\n * HttpClient - ky-based HTTP client for Remote managers\n */\n\nimport ky, { type KyInstance } from \"ky\";\n\n/**\n * HTTP client options\n */\nexport interface HttpClientOptions {\n baseUrl: string;\n headers?: Record<string, string>;\n timeout?: number;\n}\n\n/**\n * API error from server\n */\nexport class ApiError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly details?: unknown\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\n/**\n * Create HTTP client instance\n */\nexport function createHttpClient(options: HttpClientOptions): KyInstance {\n return ky.create({\n prefixUrl: options.baseUrl.replace(/\\/+$/, \"\"),\n headers: options.headers,\n timeout: options.timeout || 30000,\n hooks: {\n afterResponse: [\n async (_request, _options, response) => {\n if (!response.ok) {\n const data = (await response.json().catch(() => ({}))) as {\n error?: { code?: string; message?: string; details?: unknown };\n };\n throw new ApiError(\n data.error?.code || \"UNKNOWN_ERROR\",\n data.error?.message || `Request failed: ${response.status}`,\n data.error?.details\n );\n }\n return response;\n },\n ],\n },\n });\n}\n\nexport type { KyInstance };\n","/**\n * RemoteRepository - HTTP-based repository implementation\n *\n * Communicates with remote AgentX server for persistence.\n *\n * Part of Docker-style layered architecture:\n * Definition → build → Image → run → Agent\n * ↓\n * Session (external wrapper)\n */\n\nimport type {\n Repository,\n DefinitionRecord,\n ImageRecord,\n SessionRecord,\n MessageRecord,\n ContainerRecord,\n} from \"@agentxjs/types\";\nimport { createLogger } from \"@agentxjs/common\";\nimport { createHttpClient, type KyInstance } from \"~/managers/remote/HttpClient\";\n\nconst logger = createLogger(\"agentx/RemoteRepository\");\n\nexport interface RemoteRepositoryOptions {\n serverUrl: string;\n headers?: Record<string, string>;\n}\n\nexport class RemoteRepository implements Repository {\n private readonly client: KyInstance;\n\n constructor(options: RemoteRepositoryOptions) {\n this.client = createHttpClient({\n baseUrl: options.serverUrl,\n headers: options.headers,\n });\n logger.debug(\"RemoteRepository created\", { serverUrl: options.serverUrl });\n }\n\n // ==================== Definition ====================\n\n async saveDefinition(record: DefinitionRecord): Promise<void> {\n await this.client.put(`definitions/${record.name}`, { json: record });\n }\n\n async findDefinitionByName(name: string): Promise<DefinitionRecord | null> {\n try {\n const result = await this.client.get(`definitions/${name}`).json<DefinitionRecord>();\n return this.parseDefinitionRecord(result);\n } catch (error: unknown) {\n if (this.isNotFound(error)) return null;\n throw error;\n }\n }\n\n async findAllDefinitions(): Promise<DefinitionRecord[]> {\n const result = await this.client.get(\"definitions\").json<DefinitionRecord[]>();\n return result.map((r) => this.parseDefinitionRecord(r));\n }\n\n async deleteDefinition(name: string): Promise<void> {\n await this.client.delete(`definitions/${name}`);\n }\n\n async definitionExists(name: string): Promise<boolean> {\n try {\n await this.client.head(`definitions/${name}`);\n return true;\n } catch {\n return false;\n }\n }\n\n // ==================== Image ====================\n\n async saveImage(record: ImageRecord): Promise<void> {\n await this.client.put(`images/${record.imageId}`, { json: record });\n }\n\n async findImageById(imageId: string): Promise<ImageRecord | null> {\n try {\n const result = await this.client.get(`images/${imageId}`).json<ImageRecord>();\n return this.parseImageRecord(result);\n } catch (error: unknown) {\n if (this.isNotFound(error)) return null;\n throw error;\n }\n }\n\n async findAllImages(): Promise<ImageRecord[]> {\n const result = await this.client.get(\"images\").json<ImageRecord[]>();\n return result.map((r) => this.parseImageRecord(r));\n }\n\n async deleteImage(imageId: string): Promise<void> {\n await this.client.delete(`images/${imageId}`);\n }\n\n async imageExists(imageId: string): Promise<boolean> {\n try {\n await this.client.head(`images/${imageId}`);\n return true;\n } catch {\n return false;\n }\n }\n\n // ==================== Session ====================\n\n async saveSession(record: SessionRecord): Promise<void> {\n await this.client.put(`sessions/${record.sessionId}`, { json: record });\n }\n\n async findSessionById(sessionId: string): Promise<SessionRecord | null> {\n try {\n const result = await this.client.get(`sessions/${sessionId}`).json<SessionRecord>();\n return this.parseSessionRecord(result);\n } catch (error: unknown) {\n if (this.isNotFound(error)) return null;\n throw error;\n }\n }\n\n async findSessionsByImageId(imageId: string): Promise<SessionRecord[]> {\n const result = await this.client.get(`images/${imageId}/sessions`).json<SessionRecord[]>();\n return result.map((r) => this.parseSessionRecord(r));\n }\n\n async findSessionsByUserId(userId: string): Promise<SessionRecord[]> {\n const result = await this.client.get(`users/${userId}/sessions`).json<SessionRecord[]>();\n return result.map((r) => this.parseSessionRecord(r));\n }\n\n async findAllSessions(): Promise<SessionRecord[]> {\n const result = await this.client.get(\"sessions\").json<SessionRecord[]>();\n return result.map((r) => this.parseSessionRecord(r));\n }\n\n async deleteSession(sessionId: string): Promise<void> {\n await this.client.delete(`sessions/${sessionId}`);\n }\n\n async deleteSessionsByImageId(imageId: string): Promise<void> {\n await this.client.delete(`images/${imageId}/sessions`);\n }\n\n async sessionExists(sessionId: string): Promise<boolean> {\n try {\n await this.client.head(`sessions/${sessionId}`);\n return true;\n } catch {\n return false;\n }\n }\n\n // ==================== Message ====================\n\n /**\n * Save message - noop in browser\n *\n * Messages are persisted by server-side SessionCollector.\n * Browser-side calls this but it does nothing to avoid duplicate saves.\n */\n async saveMessage(_record: MessageRecord): Promise<void> {\n // Noop - server handles persistence via SessionCollector\n logger.debug(\"saveMessage called (noop in browser)\");\n }\n\n async findMessageById(messageId: string): Promise<MessageRecord | null> {\n try {\n const result = await this.client.get(`messages/${messageId}`).json<MessageRecord>();\n return this.parseMessageRecord(result);\n } catch (error: unknown) {\n if (this.isNotFound(error)) return null;\n throw error;\n }\n }\n\n async findMessagesBySessionId(sessionId: string): Promise<MessageRecord[]> {\n const result = await this.client.get(`sessions/${sessionId}/messages`).json<MessageRecord[]>();\n return result.map((r) => this.parseMessageRecord(r));\n }\n\n async deleteMessage(messageId: string): Promise<void> {\n await this.client.delete(`messages/${messageId}`);\n }\n\n async deleteMessagesBySessionId(sessionId: string): Promise<void> {\n await this.client.delete(`sessions/${sessionId}/messages`);\n }\n\n async countMessagesBySessionId(sessionId: string): Promise<number> {\n const result = await this.client\n .get(`sessions/${sessionId}/messages/count`)\n .json<{ count: number }>();\n return result.count;\n }\n\n // ==================== Container ====================\n\n async saveContainer(record: ContainerRecord): Promise<void> {\n await this.client.put(`containers/${record.containerId}`, { json: record });\n }\n\n async findContainerById(containerId: string): Promise<ContainerRecord | null> {\n try {\n const result = await this.client.get(`containers/${containerId}`).json<ContainerRecord>();\n return this.parseContainerRecord(result);\n } catch (error: unknown) {\n if (this.isNotFound(error)) return null;\n throw error;\n }\n }\n\n async findAllContainers(): Promise<ContainerRecord[]> {\n const result = await this.client.get(\"containers\").json<ContainerRecord[]>();\n return result.map((r) => this.parseContainerRecord(r));\n }\n\n async deleteContainer(containerId: string): Promise<void> {\n await this.client.delete(`containers/${containerId}`);\n }\n\n async containerExists(containerId: string): Promise<boolean> {\n try {\n await this.client.head(`containers/${containerId}`);\n return true;\n } catch {\n return false;\n }\n }\n\n // ==================== Helpers ====================\n\n private isNotFound(error: unknown): boolean {\n return (error as { response?: { status: number } })?.response?.status === 404;\n }\n\n private parseDefinitionRecord(raw: DefinitionRecord): DefinitionRecord {\n return {\n ...raw,\n createdAt: new Date(raw.createdAt),\n updatedAt: new Date(raw.updatedAt),\n };\n }\n\n private parseImageRecord(raw: ImageRecord): ImageRecord {\n return {\n ...raw,\n createdAt: new Date(raw.createdAt),\n };\n }\n\n private parseSessionRecord(raw: SessionRecord): SessionRecord {\n return {\n ...raw,\n createdAt: new Date(raw.createdAt),\n updatedAt: new Date(raw.updatedAt),\n };\n }\n\n private parseMessageRecord(raw: MessageRecord): MessageRecord {\n return {\n ...raw,\n createdAt: new Date(raw.createdAt),\n };\n }\n\n private parseContainerRecord(raw: ContainerRecord): ContainerRecord {\n return {\n ...raw,\n // ContainerRecord uses number timestamps, no conversion needed\n };\n }\n}\n","/**\n * BrowserLogger - Styled console logger for browsers\n *\n * Uses CSS styling for beautiful console output in browser DevTools.\n * Provides colorful, grouped logs with timestamps.\n */\n\nimport type { Logger, LogContext, LogLevel } from \"@agentxjs/types\";\nimport { LogLevel as LogLevelEnum } from \"@agentxjs/types\";\n\nexport interface BrowserLoggerOptions {\n level?: LogLevel;\n collapsed?: boolean; // Use console.groupCollapsed for context\n}\n\nexport class BrowserLogger implements Logger {\n readonly name: string;\n readonly level: LogLevel;\n private readonly collapsed: boolean;\n\n // CSS styles for different log levels\n private static readonly STYLES = {\n DEBUG: \"color: #6B7280; font-weight: normal;\", // gray\n INFO: \"color: #10B981; font-weight: normal;\", // green\n WARN: \"color: #F59E0B; font-weight: bold;\", // amber\n ERROR: \"color: #EF4444; font-weight: bold;\", // red\n TIMESTAMP: \"color: #9CA3AF; font-weight: normal;\", // light gray\n NAME: \"color: #8B5CF6; font-weight: normal;\", // purple\n MESSAGE: \"color: inherit; font-weight: normal;\",\n };\n\n // Badge styles for level indicators\n private static readonly BADGE_STYLES = {\n DEBUG:\n \"background: #E5E7EB; color: #374151; padding: 2px 6px; border-radius: 3px; font-size: 11px;\",\n INFO: \"background: #D1FAE5; color: #065F46; padding: 2px 6px; border-radius: 3px; font-size: 11px;\",\n WARN: \"background: #FEF3C7; color: #92400E; padding: 2px 6px; border-radius: 3px; font-size: 11px;\",\n ERROR:\n \"background: #FEE2E2; color: #991B1B; padding: 2px 6px; border-radius: 3px; font-size: 11px;\",\n };\n\n constructor(name: string, options: BrowserLoggerOptions = {}) {\n this.name = name;\n this.level = options.level ?? LogLevelEnum.INFO;\n this.collapsed = options.collapsed ?? 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.level <= LogLevelEnum.DEBUG;\n }\n\n isInfoEnabled(): boolean {\n return this.level <= LogLevelEnum.INFO;\n }\n\n isWarnEnabled(): boolean {\n return this.level <= LogLevelEnum.WARN;\n }\n\n isErrorEnabled(): boolean {\n return this.level <= LogLevelEnum.ERROR;\n }\n\n private log(level: string, message: string, context?: LogContext): void {\n const timestamp = new Date().toLocaleTimeString();\n const consoleMethod = this.getConsoleMethod(level);\n const badgeStyle = BrowserLogger.BADGE_STYLES[level as keyof typeof BrowserLogger.BADGE_STYLES];\n\n // Format: [TIME] [LEVEL] [NAME] message\n const format = `%c${timestamp} %c${level}%c %c[${this.name}]%c ${message}`;\n const styles = [\n BrowserLogger.STYLES.TIMESTAMP,\n badgeStyle,\n \"\", // reset after badge\n BrowserLogger.STYLES.NAME,\n BrowserLogger.STYLES.MESSAGE,\n ];\n\n if (context && Object.keys(context).length > 0) {\n // Use grouping for context\n const groupMethod = this.collapsed ? console.groupCollapsed : console.group;\n groupMethod.call(console, format, ...styles);\n console.log(\"Context:\", context);\n console.groupEnd();\n } else {\n consoleMethod(format, ...styles);\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","/**\n * BrowserLoggerFactory - Factory for creating BrowserLogger instances\n *\n * Creates styled console loggers for browser environments.\n * Used by SSERuntime to provide browser-optimized logging.\n */\n\nimport type { Logger, LoggerFactory, LogLevel } from \"@agentxjs/types\";\nimport { BrowserLogger, type BrowserLoggerOptions } from \"./BrowserLogger\";\n\nexport interface BrowserLoggerFactoryOptions {\n level?: LogLevel;\n collapsed?: boolean;\n}\n\nexport class BrowserLoggerFactory implements LoggerFactory {\n private readonly options: BrowserLoggerOptions;\n private readonly loggers: Map<string, BrowserLogger> = new Map();\n\n constructor(options: BrowserLoggerFactoryOptions = {}) {\n this.options = options;\n }\n\n getLogger(name: string): Logger {\n if (this.loggers.has(name)) {\n return this.loggers.get(name)!;\n }\n\n const logger = new BrowserLogger(name, this.options);\n this.loggers.set(name, logger);\n return logger;\n }\n}\n","/**\n * RemoteAgentIdResolver - Resolves agent ID from remote server\n *\n * Calls server API to create agent and returns server's agent ID.\n * This ensures browser and server use the same agentId.\n */\n\nimport type { AgentIdResolver } from \"@agentxjs/types\";\nimport { createHttpClient, type KyInstance } from \"~/managers/remote/HttpClient\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"agentx/RemoteAgentIdResolver\");\n\nexport interface RemoteAgentIdResolverOptions {\n serverUrl: string;\n headers?: Record<string, string>;\n}\n\ninterface RunImageResponse {\n agentId: string;\n}\n\ninterface ResumeSessionResponse {\n agentId: string;\n}\n\n/**\n * Remote implementation of AgentIdResolver\n *\n * Calls server API to create agent before local agent is created.\n */\nexport class RemoteAgentIdResolver implements AgentIdResolver {\n private readonly client: KyInstance;\n\n constructor(options: RemoteAgentIdResolverOptions) {\n this.client = createHttpClient({\n baseUrl: options.serverUrl,\n headers: options.headers,\n });\n }\n\n async resolveForRun(imageId: string, containerId: string): Promise<string> {\n logger.debug(\"Resolving agent ID for run\", { imageId, containerId });\n\n const response = await this.client\n .post(`images/${imageId}/run`, {\n json: { containerId },\n })\n .json<RunImageResponse>();\n\n logger.info(\"Agent ID resolved for run\", { imageId, agentId: response.agentId });\n return response.agentId;\n }\n\n async resolveForResume(sessionId: string, containerId: string): Promise<string> {\n logger.debug(\"Resolving agent ID for resume\", { sessionId, containerId });\n\n const response = await this.client\n .post(`sessions/${sessionId}/resume`, {\n json: { containerId },\n })\n .json<ResumeSessionResponse>();\n\n logger.info(\"Agent ID resolved for resume\", { sessionId, agentId: response.agentId });\n return response.agentId;\n }\n}\n","/**\n * SSERuntime - Browser Runtime implementation\n *\n * \"Define Once, Run Anywhere\"\n *\n * Provides Runtime for browser that connects to remote AgentX server via SSE.\n * Uses the same API as NodeRuntime, enabling unified code across platforms.\n *\n * @example\n * ```typescript\n * import { createAgentX } from \"agentxjs\";\n * import { createSSERuntime } from \"agentxjs/client\";\n * import { defineAgent } from \"agentxjs\";\n *\n * const MyAgent = defineAgent({\n * name: \"Assistant\",\n * systemPrompt: \"You are a helpful assistant\",\n * });\n *\n * // Browser: connect to remote server\n * const runtime = createSSERuntime({ serverUrl: \"http://localhost:5200/agentx\" });\n * const agentx = createAgentX(runtime);\n * const agent = agentx.agents.create(MyAgent);\n *\n * // Same API as server-side!\n * agent.on(\"assistant_message\", (event) => {\n * console.log(event.data.content);\n * });\n *\n * await agent.receive(\"Hello!\");\n * ```\n */\n\nimport type {\n Runtime,\n Sandbox,\n RuntimeDriver,\n AgentContext,\n AgentDefinition,\n Repository,\n LoggerFactory,\n Logger,\n AgentIdResolver,\n} from \"@agentxjs/types\";\nimport { setLoggerFactory } from \"@agentxjs/common\";\nimport { createSSEDriver } from \"./SSEDriver\";\nimport { RemoteRepository } from \"./repository\";\nimport { BrowserLoggerFactory } from \"./logger\";\nimport { RemoteAgentIdResolver } from \"./RemoteAgentIdResolver\";\n\n// ============================================================================\n// NoopSandbox - Browser doesn't need local resources\n// ============================================================================\n\nconst noopSandbox: Sandbox = {\n name: \"browser-noop\",\n workspace: {\n id: \"noop\",\n name: \"noop\",\n path: \"\", // Browser has no local workspace\n },\n llm: {\n name: \"noop\",\n provide: () => ({}),\n },\n};\n\n// ============================================================================\n// SSERuntime - Browser Runtime implementation\n// ============================================================================\n\n/**\n * SSERuntime configuration\n */\nexport interface SSERuntimeConfig {\n /**\n * Server base URL (e.g., \"http://localhost:5200/agentx\")\n */\n serverUrl: string;\n\n /**\n * Optional request headers (for auth, etc.)\n * Note: These headers are used for HTTP requests (POST, DELETE, etc.)\n * but NOT for SSE connections (EventSource doesn't support headers).\n * For SSE auth, use sseParams to pass token via query string.\n */\n headers?: Record<string, string>;\n\n /**\n * Optional query parameters to append to SSE URL.\n * Use this for authentication since EventSource doesn't support headers.\n *\n * @example\n * ```typescript\n * createSSERuntime({\n * serverUrl: \"http://localhost:5200/agentx\",\n * headers: { Authorization: \"Bearer xxx\" }, // For HTTP requests\n * sseParams: { token: \"xxx\" }, // For SSE connections\n * });\n * ```\n */\n sseParams?: Record<string, string>;\n}\n\n/**\n * SSERuntime - Runtime for browser with SSE driver\n *\n * Connects to remote AgentX server via SSE.\n * All resources (LLM, etc.) are provided by the server.\n *\n * Uses RemoteContainer which calls server POST /agents to create agents.\n * This ensures browser and server use the same agentId.\n */\nclass SSERuntime implements Runtime {\n readonly name = \"sse\";\n readonly repository: Repository;\n readonly loggerFactory: LoggerFactory;\n readonly agentIdResolver: AgentIdResolver;\n\n private readonly serverUrl: string;\n private readonly headers: Record<string, string>;\n private readonly sseParams: Record<string, string>;\n\n constructor(config: SSERuntimeConfig) {\n this.serverUrl = config.serverUrl.replace(/\\/+$/, \"\"); // Remove trailing slash\n this.headers = config.headers ?? {};\n this.sseParams = config.sseParams ?? {};\n\n // Create and configure BrowserLoggerFactory\n this.loggerFactory = new BrowserLoggerFactory({\n collapsed: true,\n });\n\n // Set as global logger factory\n setLoggerFactory(this.loggerFactory);\n\n this.repository = new RemoteRepository({\n serverUrl: this.serverUrl,\n headers: this.headers,\n });\n\n // Create agent ID resolver for remote agent creation\n this.agentIdResolver = new RemoteAgentIdResolver({\n serverUrl: this.serverUrl,\n headers: this.headers,\n });\n }\n\n createSandbox(_containerId: string): Sandbox {\n // Browser doesn't need local resources\n return noopSandbox;\n }\n\n createDriver(\n _definition: AgentDefinition,\n context: AgentContext,\n _sandbox: Sandbox\n ): RuntimeDriver {\n // context.agentId is already resolved by RemoteContainer\n // which called POST /agents on server - so it's the server's agentId\n const driver = createSSEDriver({\n serverUrl: this.serverUrl,\n agentId: context.agentId,\n headers: this.headers,\n sseParams: this.sseParams,\n });\n\n // SSEDriver implements AgentDriver, wrap it as RuntimeDriver\n return {\n ...driver,\n sandbox: noopSandbox,\n };\n }\n\n createLogger(name: string): Logger {\n return this.loggerFactory.getLogger(name);\n }\n}\n\n// ============================================================================\n// Factory function\n// ============================================================================\n\n/**\n * Create SSE Runtime for browser\n *\n * @example\n * ```typescript\n * import { createAgentX } from \"agentxjs\";\n * import { sseRuntime } from \"agentxjs/runtime/sse\";\n *\n * createAgentX(sseRuntime({\n * serverUrl: \"http://localhost:5200/agentx\",\n * headers: { Authorization: \"Bearer xxx\" },\n * }));\n * ```\n */\nexport function sseRuntime(config: SSERuntimeConfig): Runtime {\n return new SSERuntime(config);\n}\n\n/**\n * @deprecated Use `sseRuntime()` instead for consistency with `nodeRuntime()`\n */\nexport const createSSERuntime = sseRuntime;\n\n// Also export class for advanced use\nexport { SSERuntime };\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/runtime/sse/SSEDriver.ts","../../../src/managers/remote/HttpClient.ts","../../../src/runtime/sse/repository/RemoteRepository.ts","../../../src/runtime/sse/logger/BrowserLogger.ts","../../../src/runtime/sse/logger/BrowserLoggerFactory.ts","../../../src/runtime/sse/RemoteAgentIdResolver.ts","../../../src/runtime/sse/SSERuntime.ts"],"names":["STREAM_EVENT_TYPE_NAMES","ky","createLogger","LogLevelEnum","logger","setLoggerFactory"],"mappings":"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","file":"index.cjs","sourcesContent":["/* eslint-disable no-undef */\n/**\n * SSEDriver - Browser-side driver that connects to remote AgentX server via SSE\n *\n * This driver enables the client to use the full agentx stack (including AgentEngine)\n * by bridging SSE push events to the async generator pull model.\n *\n * @example\n * ```typescript\n * import { createSSERuntime } from \"agentxjs/client\";\n * import { createAgentX, defineAgent } from \"agentxjs\";\n *\n * const runtime = createSSERuntime({\n * serverUrl: \"http://localhost:5200/agentx\",\n * agentId: \"agent_123\"\n * });\n * const agentx = createAgentX(runtime);\n * const agent = agentx.agents.create(defineAgent({ name: \"Assistant\" }));\n *\n * agent.on(\"assistant_message\", (event) => {\n * console.log(event.data.content);\n * });\n *\n * await agent.receive(\"Hello!\");\n * ```\n */\n\nimport type { UserMessage, StreamEventType, AgentDriver } from \"@agentxjs/types\";\nimport { STREAM_EVENT_TYPE_NAMES } from \"@agentxjs/types\";\n\n/**\n * Persistent SSE connection manager\n *\n * Maintains a single SSE connection for the lifetime of the driver.\n * Bridges SSE push model to async generator pull model for each receive() call.\n */\nclass PersistentSSEConnection {\n private eventSource: EventSource | null = null;\n private messageQueue: StreamEventType[] = [];\n private activeIterators: Set<{\n resolve: (result: IteratorResult<StreamEventType>) => void;\n reject: (error: Error) => void;\n }> = new Set();\n private isDone = false;\n\n constructor(\n private readonly serverUrl: string,\n private readonly agentId: string,\n private readonly sseParams: Record<string, string> = {}\n ) {}\n\n /**\n * Initialize SSE connection\n */\n connect(): void {\n if (this.eventSource) {\n return; // Already connected\n }\n\n // Build SSE URL with optional query parameters (for auth, etc.)\n let sseUrl = `${this.serverUrl}/agents/${this.agentId}/sse`;\n if (Object.keys(this.sseParams).length > 0) {\n const params = new URLSearchParams(this.sseParams);\n sseUrl += `?${params.toString()}`;\n }\n this.eventSource = new EventSource(sseUrl);\n\n const handleEvent = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data) as StreamEventType;\n\n // Notify all active iterators\n if (this.activeIterators.size > 0) {\n const iterator = this.activeIterators.values().next().value;\n if (iterator) {\n this.activeIterators.delete(iterator);\n iterator.resolve({ value: data, done: false });\n }\n } else {\n // Queue event if no iterator is waiting\n this.messageQueue.push(data);\n }\n } catch {\n // Ignore parse errors\n }\n };\n\n const handleError = () => {\n this.isDone = true;\n this.eventSource?.close();\n this.eventSource = null;\n\n // Reject all waiting iterators\n for (const iterator of this.activeIterators) {\n iterator.reject(new Error(\"SSE connection error\"));\n }\n this.activeIterators.clear();\n };\n\n // Listen for all stream event types\n for (const eventType of STREAM_EVENT_TYPE_NAMES) {\n this.eventSource.addEventListener(eventType, handleEvent as any);\n }\n\n // Listen for error events (independent from stream events, transportable via SSE)\n this.eventSource.addEventListener(\"error\", handleEvent as any);\n\n // Also listen for generic message events (fallback)\n this.eventSource.onmessage = handleEvent;\n\n // Handle SSE connection errors (different from our ErrorEvent)\n this.eventSource.onerror = handleError;\n }\n\n /**\n * Create an async iterable for a single receive() call\n *\n * This iterator continues until a final message_stop is received (stopReason !== \"tool_use\").\n * For tool calls, this means it will span multiple message_start/message_stop cycles.\n * The SSE connection itself remains open for future receive() calls.\n */\n createIterator(): AsyncIterable<StreamEventType> {\n const connection = this;\n\n return {\n [Symbol.asyncIterator]() {\n let turnComplete = false;\n\n return {\n async next(): Promise<IteratorResult<StreamEventType>> {\n // Return queued events first\n if (connection.messageQueue.length > 0) {\n const event = connection.messageQueue.shift()!;\n\n // Check if turn is complete at message_stop\n // Continue if stopReason is \"tool_use\", stop otherwise\n if (event.type === \"message_stop\") {\n const stopReason = event.data.stopReason;\n if (stopReason !== \"tool_use\") {\n turnComplete = true;\n }\n }\n\n return { value: event, done: false };\n }\n\n // If turn is complete, end iteration (but keep connection open for next receive())\n if (turnComplete) {\n return { done: true, value: undefined as any };\n }\n\n // If connection died, end iteration\n if (connection.isDone) {\n return { done: true, value: undefined as any };\n }\n\n // Wait for next event\n return new Promise((resolve, reject) => {\n // Wrap resolve to check for completion\n const wrappedResolve = (result: IteratorResult<StreamEventType>) => {\n if (!result.done) {\n // Check if turn is complete at message_stop\n if (result.value.type === \"message_stop\") {\n const stopReason = result.value.data.stopReason;\n if (stopReason !== \"tool_use\") {\n turnComplete = true;\n }\n }\n }\n resolve(result);\n };\n\n const iterator = { resolve: wrappedResolve, reject };\n connection.activeIterators.add(iterator);\n });\n },\n\n async return(): Promise<IteratorResult<StreamEventType>> {\n // Cleanup this iterator (but keep connection alive)\n return { done: true, value: undefined as any };\n },\n };\n },\n };\n }\n\n /**\n * Close the connection\n */\n close(): void {\n this.isDone = true;\n\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n\n // Reject all waiting iterators\n for (const iterator of this.activeIterators) {\n iterator.reject(new Error(\"Connection closed\"));\n }\n this.activeIterators.clear();\n this.messageQueue = [];\n }\n}\n\n/**\n * SSEDriver configuration\n */\nexport interface SSEDriverConfig {\n serverUrl: string;\n agentId: string;\n headers?: Record<string, string>;\n /**\n * Query parameters to append to SSE URL.\n * Use this for authentication since EventSource doesn't support headers.\n */\n sseParams?: Record<string, string>;\n}\n\n/**\n * Create an SSEDriver instance\n *\n * Factory function for browser-side SSE driver.\n */\nexport function createSSEDriver(config: SSEDriverConfig): AgentDriver {\n const { serverUrl, agentId, headers = {}, sseParams = {} } = config;\n let connection: PersistentSSEConnection | null = null;\n\n return {\n name: \"SSEDriver\",\n\n async *receive(message: UserMessage): AsyncIterable<StreamEventType> {\n // 1. Ensure SSE connection is established\n if (!connection) {\n connection = new PersistentSSEConnection(serverUrl, agentId, sseParams);\n connection.connect();\n }\n\n // 2. Send message to server via HTTP POST\n const messageUrl = `${serverUrl}/agents/${agentId}/messages`;\n const response = await fetch(messageUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify({\n content: typeof message.content === \"string\" ? message.content : message.content,\n }),\n });\n\n if (!response.ok) {\n const errorBody = (await response.json().catch(() => ({}))) as {\n error?: { message?: string };\n };\n throw new Error(errorBody.error?.message || `HTTP ${response.status}`);\n }\n\n // 3. Yield events from persistent SSE connection\n yield* connection.createIterator();\n },\n\n interrupt(): void {\n // Call server interrupt endpoint (fire-and-forget)\n const interruptUrl = `${serverUrl}/agents/${agentId}/interrupt`;\n fetch(interruptUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n }).catch(() => {\n // Ignore errors - interrupt is best-effort\n });\n },\n };\n}\n","/**\n * HttpClient - ky-based HTTP client for Remote managers\n */\n\nimport ky, { type KyInstance } from \"ky\";\n\n/**\n * HTTP client options\n */\nexport interface HttpClientOptions {\n baseUrl: string;\n headers?: Record<string, string>;\n timeout?: number;\n}\n\n/**\n * API error from server\n */\nexport class ApiError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly details?: unknown\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\n/**\n * Create HTTP client instance\n */\nexport function createHttpClient(options: HttpClientOptions): KyInstance {\n return ky.create({\n prefixUrl: options.baseUrl.replace(/\\/+$/, \"\"),\n headers: options.headers,\n timeout: options.timeout || 30000,\n hooks: {\n afterResponse: [\n async (_request, _options, response) => {\n if (!response.ok) {\n const data = (await response.json().catch(() => ({}))) as {\n error?: { code?: string; message?: string; details?: unknown };\n };\n throw new ApiError(\n data.error?.code || \"UNKNOWN_ERROR\",\n data.error?.message || `Request failed: ${response.status}`,\n data.error?.details\n );\n }\n return response;\n },\n ],\n },\n });\n}\n\nexport type { KyInstance };\n","/**\n * RemoteRepository - HTTP-based repository implementation\n *\n * Communicates with remote AgentX server for persistence.\n *\n * Part of Docker-style layered architecture:\n * Definition → build → Image → run → Agent\n * ↓\n * Session (external wrapper)\n */\n\nimport type {\n Repository,\n DefinitionRecord,\n ImageRecord,\n SessionRecord,\n MessageRecord,\n ContainerRecord,\n} from \"@agentxjs/types\";\nimport { createLogger } from \"@agentxjs/common\";\nimport { createHttpClient, type KyInstance } from \"~/managers/remote/HttpClient\";\n\nconst logger = createLogger(\"agentx/RemoteRepository\");\n\nexport interface RemoteRepositoryOptions {\n serverUrl: string;\n headers?: Record<string, string>;\n}\n\nexport class RemoteRepository implements Repository {\n private readonly client: KyInstance;\n\n constructor(options: RemoteRepositoryOptions) {\n this.client = createHttpClient({\n baseUrl: options.serverUrl,\n headers: options.headers,\n });\n logger.debug(\"RemoteRepository created\", { serverUrl: options.serverUrl });\n }\n\n // ==================== Definition ====================\n\n async saveDefinition(record: DefinitionRecord): Promise<void> {\n await this.client.put(`definitions/${record.name}`, { json: record });\n }\n\n async findDefinitionByName(name: string): Promise<DefinitionRecord | null> {\n try {\n const result = await this.client.get(`definitions/${name}`).json<DefinitionRecord>();\n return this.parseDefinitionRecord(result);\n } catch (error: unknown) {\n if (this.isNotFound(error)) return null;\n throw error;\n }\n }\n\n async findAllDefinitions(): Promise<DefinitionRecord[]> {\n const result = await this.client.get(\"definitions\").json<DefinitionRecord[]>();\n return result.map((r) => this.parseDefinitionRecord(r));\n }\n\n async deleteDefinition(name: string): Promise<void> {\n await this.client.delete(`definitions/${name}`);\n }\n\n async definitionExists(name: string): Promise<boolean> {\n try {\n await this.client.head(`definitions/${name}`);\n return true;\n } catch {\n return false;\n }\n }\n\n // ==================== Image ====================\n\n async saveImage(record: ImageRecord): Promise<void> {\n await this.client.put(`images/${record.imageId}`, { json: record });\n }\n\n async findImageById(imageId: string): Promise<ImageRecord | null> {\n try {\n const result = await this.client.get(`images/${imageId}`).json<ImageRecord>();\n return this.parseImageRecord(result);\n } catch (error: unknown) {\n if (this.isNotFound(error)) return null;\n throw error;\n }\n }\n\n async findAllImages(): Promise<ImageRecord[]> {\n const result = await this.client.get(\"images\").json<ImageRecord[]>();\n return result.map((r) => this.parseImageRecord(r));\n }\n\n async deleteImage(imageId: string): Promise<void> {\n await this.client.delete(`images/${imageId}`);\n }\n\n async imageExists(imageId: string): Promise<boolean> {\n try {\n await this.client.head(`images/${imageId}`);\n return true;\n } catch {\n return false;\n }\n }\n\n // ==================== Session ====================\n\n async saveSession(record: SessionRecord): Promise<void> {\n await this.client.put(`sessions/${record.sessionId}`, { json: record });\n }\n\n async findSessionById(sessionId: string): Promise<SessionRecord | null> {\n try {\n const result = await this.client.get(`sessions/${sessionId}`).json<SessionRecord>();\n return this.parseSessionRecord(result);\n } catch (error: unknown) {\n if (this.isNotFound(error)) return null;\n throw error;\n }\n }\n\n async findSessionsByImageId(imageId: string): Promise<SessionRecord[]> {\n const result = await this.client.get(`images/${imageId}/sessions`).json<SessionRecord[]>();\n return result.map((r) => this.parseSessionRecord(r));\n }\n\n async findSessionsByUserId(userId: string): Promise<SessionRecord[]> {\n const result = await this.client.get(`users/${userId}/sessions`).json<SessionRecord[]>();\n return result.map((r) => this.parseSessionRecord(r));\n }\n\n async findAllSessions(): Promise<SessionRecord[]> {\n const result = await this.client.get(\"sessions\").json<SessionRecord[]>();\n return result.map((r) => this.parseSessionRecord(r));\n }\n\n async deleteSession(sessionId: string): Promise<void> {\n await this.client.delete(`sessions/${sessionId}`);\n }\n\n async deleteSessionsByImageId(imageId: string): Promise<void> {\n await this.client.delete(`images/${imageId}/sessions`);\n }\n\n async sessionExists(sessionId: string): Promise<boolean> {\n try {\n await this.client.head(`sessions/${sessionId}`);\n return true;\n } catch {\n return false;\n }\n }\n\n // ==================== Message ====================\n\n /**\n * Save message - noop in browser\n *\n * Messages are persisted by server-side SessionCollector.\n * Browser-side calls this but it does nothing to avoid duplicate saves.\n */\n async saveMessage(_record: MessageRecord): Promise<void> {\n // Noop - server handles persistence via SessionCollector\n logger.debug(\"saveMessage called (noop in browser)\");\n }\n\n async findMessageById(messageId: string): Promise<MessageRecord | null> {\n try {\n const result = await this.client.get(`messages/${messageId}`).json<MessageRecord>();\n return this.parseMessageRecord(result);\n } catch (error: unknown) {\n if (this.isNotFound(error)) return null;\n throw error;\n }\n }\n\n async findMessagesBySessionId(sessionId: string): Promise<MessageRecord[]> {\n const result = await this.client.get(`sessions/${sessionId}/messages`).json<MessageRecord[]>();\n return result.map((r) => this.parseMessageRecord(r));\n }\n\n async deleteMessage(messageId: string): Promise<void> {\n await this.client.delete(`messages/${messageId}`);\n }\n\n async deleteMessagesBySessionId(sessionId: string): Promise<void> {\n await this.client.delete(`sessions/${sessionId}/messages`);\n }\n\n async countMessagesBySessionId(sessionId: string): Promise<number> {\n const result = await this.client\n .get(`sessions/${sessionId}/messages/count`)\n .json<{ count: number }>();\n return result.count;\n }\n\n // ==================== Container ====================\n\n async saveContainer(record: ContainerRecord): Promise<void> {\n await this.client.put(`containers/${record.containerId}`, { json: record });\n }\n\n async findContainerById(containerId: string): Promise<ContainerRecord | null> {\n try {\n const result = await this.client.get(`containers/${containerId}`).json<ContainerRecord>();\n return this.parseContainerRecord(result);\n } catch (error: unknown) {\n if (this.isNotFound(error)) return null;\n throw error;\n }\n }\n\n async findAllContainers(): Promise<ContainerRecord[]> {\n const result = await this.client.get(\"containers\").json<ContainerRecord[]>();\n return result.map((r) => this.parseContainerRecord(r));\n }\n\n async deleteContainer(containerId: string): Promise<void> {\n await this.client.delete(`containers/${containerId}`);\n }\n\n async containerExists(containerId: string): Promise<boolean> {\n try {\n await this.client.head(`containers/${containerId}`);\n return true;\n } catch {\n return false;\n }\n }\n\n // ==================== Helpers ====================\n\n private isNotFound(error: unknown): boolean {\n return (error as { response?: { status: number } })?.response?.status === 404;\n }\n\n private parseDefinitionRecord(raw: DefinitionRecord): DefinitionRecord {\n return {\n ...raw,\n createdAt: new Date(raw.createdAt),\n updatedAt: new Date(raw.updatedAt),\n };\n }\n\n private parseImageRecord(raw: ImageRecord): ImageRecord {\n return {\n ...raw,\n createdAt: new Date(raw.createdAt),\n };\n }\n\n private parseSessionRecord(raw: SessionRecord): SessionRecord {\n return {\n ...raw,\n createdAt: new Date(raw.createdAt),\n updatedAt: new Date(raw.updatedAt),\n };\n }\n\n private parseMessageRecord(raw: MessageRecord): MessageRecord {\n return {\n ...raw,\n createdAt: new Date(raw.createdAt),\n };\n }\n\n private parseContainerRecord(raw: ContainerRecord): ContainerRecord {\n return {\n ...raw,\n // ContainerRecord uses number timestamps, no conversion needed\n };\n }\n}\n","/**\n * BrowserLogger - Styled console logger for browsers\n *\n * Uses CSS styling for beautiful console output in browser DevTools.\n * Provides colorful, grouped logs with timestamps.\n */\n\nimport type { Logger, LogContext, LogLevel } from \"@agentxjs/types\";\nimport { LogLevel as LogLevelEnum } from \"@agentxjs/types\";\n\nexport interface BrowserLoggerOptions {\n level?: LogLevel;\n collapsed?: boolean; // Use console.groupCollapsed for context\n}\n\nexport class BrowserLogger implements Logger {\n readonly name: string;\n readonly level: LogLevel;\n private readonly collapsed: boolean;\n\n // CSS styles for different log levels\n private static readonly STYLES = {\n DEBUG: \"color: #6B7280; font-weight: normal;\", // gray\n INFO: \"color: #10B981; font-weight: normal;\", // green\n WARN: \"color: #F59E0B; font-weight: bold;\", // amber\n ERROR: \"color: #EF4444; font-weight: bold;\", // red\n TIMESTAMP: \"color: #9CA3AF; font-weight: normal;\", // light gray\n NAME: \"color: #8B5CF6; font-weight: normal;\", // purple\n MESSAGE: \"color: inherit; font-weight: normal;\",\n };\n\n // Badge styles for level indicators\n private static readonly BADGE_STYLES = {\n DEBUG:\n \"background: #E5E7EB; color: #374151; padding: 2px 6px; border-radius: 3px; font-size: 11px;\",\n INFO: \"background: #D1FAE5; color: #065F46; padding: 2px 6px; border-radius: 3px; font-size: 11px;\",\n WARN: \"background: #FEF3C7; color: #92400E; padding: 2px 6px; border-radius: 3px; font-size: 11px;\",\n ERROR:\n \"background: #FEE2E2; color: #991B1B; padding: 2px 6px; border-radius: 3px; font-size: 11px;\",\n };\n\n constructor(name: string, options: BrowserLoggerOptions = {}) {\n this.name = name;\n this.level = options.level ?? LogLevelEnum.INFO;\n this.collapsed = options.collapsed ?? 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.level <= LogLevelEnum.DEBUG;\n }\n\n isInfoEnabled(): boolean {\n return this.level <= LogLevelEnum.INFO;\n }\n\n isWarnEnabled(): boolean {\n return this.level <= LogLevelEnum.WARN;\n }\n\n isErrorEnabled(): boolean {\n return this.level <= LogLevelEnum.ERROR;\n }\n\n private log(level: string, message: string, context?: LogContext): void {\n const timestamp = new Date().toLocaleTimeString();\n const consoleMethod = this.getConsoleMethod(level);\n const badgeStyle = BrowserLogger.BADGE_STYLES[level as keyof typeof BrowserLogger.BADGE_STYLES];\n\n // Format: [TIME] [LEVEL] [NAME] message\n const format = `%c${timestamp} %c${level}%c %c[${this.name}]%c ${message}`;\n const styles = [\n BrowserLogger.STYLES.TIMESTAMP,\n badgeStyle,\n \"\", // reset after badge\n BrowserLogger.STYLES.NAME,\n BrowserLogger.STYLES.MESSAGE,\n ];\n\n if (context && Object.keys(context).length > 0) {\n // Use grouping for context\n const groupMethod = this.collapsed ? console.groupCollapsed : console.group;\n groupMethod.call(console, format, ...styles);\n console.log(\"Context:\", context);\n console.groupEnd();\n } else {\n consoleMethod(format, ...styles);\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","/**\n * BrowserLoggerFactory - Factory for creating BrowserLogger instances\n *\n * Creates styled console loggers for browser environments.\n * Used by SSERuntime to provide browser-optimized logging.\n */\n\nimport type { Logger, LoggerFactory, LogLevel } from \"@agentxjs/types\";\nimport { BrowserLogger, type BrowserLoggerOptions } from \"./BrowserLogger\";\n\nexport interface BrowserLoggerFactoryOptions {\n level?: LogLevel;\n collapsed?: boolean;\n}\n\nexport class BrowserLoggerFactory implements LoggerFactory {\n private readonly options: BrowserLoggerOptions;\n private readonly loggers: Map<string, BrowserLogger> = new Map();\n\n constructor(options: BrowserLoggerFactoryOptions = {}) {\n this.options = options;\n }\n\n getLogger(name: string): Logger {\n if (this.loggers.has(name)) {\n return this.loggers.get(name)!;\n }\n\n const logger = new BrowserLogger(name, this.options);\n this.loggers.set(name, logger);\n return logger;\n }\n}\n","/**\n * RemoteAgentIdResolver - Resolves agent ID from remote server\n *\n * Calls server API to create agent and returns server's agent ID.\n * This ensures browser and server use the same agentId.\n */\n\nimport type { AgentIdResolver } from \"@agentxjs/types\";\nimport { createHttpClient, type KyInstance } from \"~/managers/remote/HttpClient\";\nimport { createLogger } from \"@agentxjs/common\";\n\nconst logger = createLogger(\"agentx/RemoteAgentIdResolver\");\n\nexport interface RemoteAgentIdResolverOptions {\n serverUrl: string;\n headers?: Record<string, string>;\n}\n\ninterface RunImageResponse {\n agentId: string;\n}\n\ninterface ResumeSessionResponse {\n agentId: string;\n}\n\n/**\n * Remote implementation of AgentIdResolver\n *\n * Calls server API to create agent before local agent is created.\n */\nexport class RemoteAgentIdResolver implements AgentIdResolver {\n private readonly client: KyInstance;\n\n constructor(options: RemoteAgentIdResolverOptions) {\n this.client = createHttpClient({\n baseUrl: options.serverUrl,\n headers: options.headers,\n });\n }\n\n async resolveForRun(imageId: string, containerId: string): Promise<string> {\n logger.debug(\"Resolving agent ID for run\", { imageId, containerId });\n\n const response = await this.client\n .post(`images/${imageId}/run`, {\n json: { containerId },\n })\n .json<RunImageResponse>();\n\n logger.info(\"Agent ID resolved for run\", { imageId, agentId: response.agentId });\n return response.agentId;\n }\n\n async resolveForResume(sessionId: string, containerId: string): Promise<string> {\n logger.debug(\"Resolving agent ID for resume\", { sessionId, containerId });\n\n const response = await this.client\n .post(`sessions/${sessionId}/resume`, {\n json: { containerId },\n })\n .json<ResumeSessionResponse>();\n\n logger.info(\"Agent ID resolved for resume\", { sessionId, agentId: response.agentId });\n return response.agentId;\n }\n}\n","/**\n * SSERuntime - Browser Runtime implementation\n *\n * \"Define Once, Run Anywhere\"\n *\n * Provides Runtime for browser that connects to remote AgentX server via SSE.\n * Uses the same API as NodeRuntime, enabling unified code across platforms.\n *\n * @example\n * ```typescript\n * import { createAgentX } from \"agentxjs\";\n * import { createSSERuntime } from \"agentxjs/client\";\n * import { defineAgent } from \"agentxjs\";\n *\n * const MyAgent = defineAgent({\n * name: \"Assistant\",\n * systemPrompt: \"You are a helpful assistant\",\n * });\n *\n * // Browser: connect to remote server\n * const runtime = createSSERuntime({ serverUrl: \"http://localhost:5200/agentx\" });\n * const agentx = createAgentX(runtime);\n * const agent = agentx.agents.create(MyAgent);\n *\n * // Same API as server-side!\n * agent.on(\"assistant_message\", (event) => {\n * console.log(event.data.content);\n * });\n *\n * await agent.receive(\"Hello!\");\n * ```\n */\n\nimport type {\n Runtime,\n Sandbox,\n RuntimeDriver,\n AgentContext,\n AgentDefinition,\n Repository,\n LoggerFactory,\n Logger,\n AgentIdResolver,\n} from \"@agentxjs/types\";\nimport { setLoggerFactory } from \"@agentxjs/common\";\nimport { createSSEDriver } from \"./SSEDriver\";\nimport { RemoteRepository } from \"./repository\";\nimport { BrowserLoggerFactory } from \"./logger\";\nimport { RemoteAgentIdResolver } from \"./RemoteAgentIdResolver\";\n\n// ============================================================================\n// NoopSandbox - Browser doesn't need local resources\n// ============================================================================\n\nconst noopSandbox: Sandbox = {\n name: \"browser-noop\",\n workspace: {\n id: \"noop\",\n name: \"noop\",\n path: \"\", // Browser has no local workspace\n },\n llm: {\n name: \"noop\",\n provide: () => ({}),\n },\n};\n\n// ============================================================================\n// SSERuntime - Browser Runtime implementation\n// ============================================================================\n\n/**\n * SSERuntime configuration\n */\nexport interface SSERuntimeConfig {\n /**\n * Server base URL (e.g., \"http://localhost:5200/agentx\")\n */\n serverUrl: string;\n\n /**\n * Optional request headers (for auth, etc.)\n * Note: These headers are used for HTTP requests (POST, DELETE, etc.)\n * but NOT for SSE connections (EventSource doesn't support headers).\n * For SSE auth, use sseParams to pass token via query string.\n */\n headers?: Record<string, string>;\n\n /**\n * Optional query parameters to append to SSE URL.\n * Use this for authentication since EventSource doesn't support headers.\n *\n * @example\n * ```typescript\n * createSSERuntime({\n * serverUrl: \"http://localhost:5200/agentx\",\n * headers: { Authorization: \"Bearer xxx\" }, // For HTTP requests\n * sseParams: { token: \"xxx\" }, // For SSE connections\n * });\n * ```\n */\n sseParams?: Record<string, string>;\n}\n\n/**\n * SSERuntime - Runtime for browser with SSE driver\n *\n * Connects to remote AgentX server via SSE.\n * All resources (LLM, etc.) are provided by the server.\n *\n * Uses RemoteContainer which calls server POST /agents to create agents.\n * This ensures browser and server use the same agentId.\n */\nclass SSERuntime implements Runtime {\n readonly name = \"sse\";\n readonly repository: Repository;\n readonly loggerFactory: LoggerFactory;\n readonly agentIdResolver: AgentIdResolver;\n\n private readonly serverUrl: string;\n private readonly headers: Record<string, string>;\n private readonly sseParams: Record<string, string>;\n\n constructor(config: SSERuntimeConfig) {\n this.serverUrl = config.serverUrl.replace(/\\/+$/, \"\"); // Remove trailing slash\n this.headers = config.headers ?? {};\n this.sseParams = config.sseParams ?? {};\n\n // Create and configure BrowserLoggerFactory\n this.loggerFactory = new BrowserLoggerFactory({\n collapsed: true,\n });\n\n // Set as global logger factory\n setLoggerFactory(this.loggerFactory);\n\n this.repository = new RemoteRepository({\n serverUrl: this.serverUrl,\n headers: this.headers,\n });\n\n // Create agent ID resolver for remote agent creation\n this.agentIdResolver = new RemoteAgentIdResolver({\n serverUrl: this.serverUrl,\n headers: this.headers,\n });\n }\n\n createSandbox(_containerId: string): Sandbox {\n // Browser doesn't need local resources\n return noopSandbox;\n }\n\n createDriver(\n _definition: AgentDefinition,\n context: AgentContext,\n _sandbox: Sandbox\n ): RuntimeDriver {\n // context.agentId is already resolved by RemoteContainer\n // which called POST /agents on server - so it's the server's agentId\n const driver = createSSEDriver({\n serverUrl: this.serverUrl,\n agentId: context.agentId,\n headers: this.headers,\n sseParams: this.sseParams,\n });\n\n // SSEDriver implements AgentDriver, wrap it as RuntimeDriver\n return {\n ...driver,\n sandbox: noopSandbox,\n };\n }\n\n createLogger(name: string): Logger {\n return this.loggerFactory.getLogger(name);\n }\n}\n\n// ============================================================================\n// Factory function\n// ============================================================================\n\n/**\n * Create SSE Runtime for browser\n *\n * @example\n * ```typescript\n * import { createAgentX } from \"agentxjs\";\n * import { sseRuntime } from \"agentxjs/runtime/sse\";\n *\n * createAgentX(sseRuntime({\n * serverUrl: \"http://localhost:5200/agentx\",\n * headers: { Authorization: \"Bearer xxx\" },\n * }));\n * ```\n */\nexport function sseRuntime(config: SSERuntimeConfig): Runtime {\n return new SSERuntime(config);\n}\n\n/**\n * @deprecated Use `sseRuntime()` instead for consistency with `nodeRuntime()`\n */\nexport const createSSERuntime = sseRuntime;\n\n// Also export class for advanced use\nexport { SSERuntime };\n"]}
|