agentxjs 2.9.0-dev-20260317060607 → 2.9.0-dev-20260317112104
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/{chunk-SFWLYRLB.js → chunk-TKYJYJS5.js} +21 -21
- package/dist/{chunk-SFWLYRLB.js.map → chunk-TKYJYJS5.js.map} +1 -1
- package/dist/index.d.ts +15 -15
- package/dist/index.js +28 -28
- package/dist/index.js.map +1 -1
- package/dist/{server-CFC6ONC6.js → server-N3SRHICW.js} +2 -2
- package/package.json +3 -3
- package/src/LocalClient.ts +10 -10
- package/src/handlers/__tests__/workspace-handler.test.ts +34 -34
- package/src/handlers/index.ts +2 -2
- package/src/handlers/workspace.ts +20 -20
- package/src/index.ts +3 -3
- package/src/namespaces/presentations.ts +7 -7
- package/src/presentation/Presentation.ts +16 -16
- package/src/presentation/__tests__/workspace-init.test.ts +20 -20
- package/src/presentation/__tests__/workspace.test.ts +17 -17
- package/src/presentation/index.ts +3 -3
- package/src/presentation/reducer.ts +1 -1
- package/src/presentation/types.ts +10 -10
- /package/dist/{server-CFC6ONC6.js.map → server-N3SRHICW.js.map} +0 -0
|
@@ -320,35 +320,35 @@ function registerMessageHandlers(registry) {
|
|
|
320
320
|
}
|
|
321
321
|
|
|
322
322
|
// src/handlers/workspace.ts
|
|
323
|
-
function
|
|
324
|
-
registry.register("
|
|
323
|
+
function registerOSHandlers(registry) {
|
|
324
|
+
registry.register("os.read", async (runtime, params) => {
|
|
325
325
|
const { imageId, path } = params;
|
|
326
|
-
const
|
|
327
|
-
if (!
|
|
326
|
+
const op = runtime.platform.osProvider;
|
|
327
|
+
if (!op) return err(-32e3, "OS not available");
|
|
328
328
|
const img = await runtime.platform.imageRepository.findImageById(imageId);
|
|
329
|
-
if (!img?.
|
|
330
|
-
const
|
|
331
|
-
const content = await
|
|
329
|
+
if (!img?.osId) return err(404, "Image has no OS");
|
|
330
|
+
const os = await op.create(img.osId);
|
|
331
|
+
const content = await os.fs.read(path);
|
|
332
332
|
return ok({ content });
|
|
333
333
|
});
|
|
334
|
-
registry.register("
|
|
334
|
+
registry.register("os.list", async (runtime, params) => {
|
|
335
335
|
const { imageId, path } = params;
|
|
336
|
-
const
|
|
337
|
-
if (!
|
|
336
|
+
const op = runtime.platform.osProvider;
|
|
337
|
+
if (!op) return err(-32e3, "OS not available");
|
|
338
338
|
const img = await runtime.platform.imageRepository.findImageById(imageId);
|
|
339
|
-
if (!img?.
|
|
340
|
-
const
|
|
341
|
-
const files = await
|
|
339
|
+
if (!img?.osId) return err(404, "Image has no OS");
|
|
340
|
+
const os = await op.create(img.osId);
|
|
341
|
+
const files = await os.fs.list(path ?? ".");
|
|
342
342
|
return ok({ files });
|
|
343
343
|
});
|
|
344
|
-
registry.register("
|
|
344
|
+
registry.register("os.write", async (runtime, params) => {
|
|
345
345
|
const { imageId, path, content } = params;
|
|
346
|
-
const
|
|
347
|
-
if (!
|
|
346
|
+
const op = runtime.platform.osProvider;
|
|
347
|
+
if (!op) return err(-32e3, "OS not available");
|
|
348
348
|
const img = await runtime.platform.imageRepository.findImageById(imageId);
|
|
349
|
-
if (!img?.
|
|
350
|
-
const
|
|
351
|
-
await
|
|
349
|
+
if (!img?.osId) return err(404, "Image has no OS");
|
|
350
|
+
const os = await op.create(img.osId);
|
|
351
|
+
await os.fs.write(path, content);
|
|
352
352
|
return ok({ success: true });
|
|
353
353
|
});
|
|
354
354
|
}
|
|
@@ -359,11 +359,11 @@ function registerAll(registry) {
|
|
|
359
359
|
registerInstanceHandlers(registry);
|
|
360
360
|
registerMessageHandlers(registry);
|
|
361
361
|
registerLLMHandlers(registry);
|
|
362
|
-
|
|
362
|
+
registerOSHandlers(registry);
|
|
363
363
|
}
|
|
364
364
|
|
|
365
365
|
export {
|
|
366
366
|
RpcHandlerRegistry,
|
|
367
367
|
registerAll
|
|
368
368
|
};
|
|
369
|
-
//# sourceMappingURL=chunk-
|
|
369
|
+
//# sourceMappingURL=chunk-TKYJYJS5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/RpcHandlerRegistry.ts","../src/handlers/image.ts","../src/handlers/instance.ts","../src/handlers/llm.ts","../src/handlers/message.ts","../src/handlers/workspace.ts","../src/handlers/index.ts"],"sourcesContent":["/**\n * RpcHandlerRegistry — single source of truth for RPC method → handler mapping.\n *\n * Register once, use everywhere. No more switch statements or mapping tables.\n *\n * @example\n * ```typescript\n * const registry = new RpcHandlerRegistry();\n * registry.register(\"workspace.read\", async (runtime, params) => {\n * const content = await workspace.read(params.path);\n * return ok(content);\n * });\n *\n * const response = await registry.handle(runtime, method, params);\n * ```\n */\n\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport { createLogger } from \"@deepracticex/logger\";\n\nconst logger = createLogger(\"agentx/RpcHandlerRegistry\");\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface RpcResult<T = unknown> {\n success: true;\n data: T;\n}\n\nexport interface RpcError {\n success: false;\n code: number;\n message: string;\n}\n\nexport type RpcResponse<T = unknown> = RpcResult<T> | RpcError;\n\n/** Handler function: receives runtime + params, returns response */\nexport type RpcHandler = (runtime: AgentXRuntime, params: unknown) => Promise<RpcResponse>;\n\n/** Helper to create success result */\nexport function ok<T>(data: T): RpcResult<T> {\n return { success: true, data };\n}\n\n/** Helper to create error result */\nexport function err(code: number, message: string): RpcError {\n return { success: false, code, message };\n}\n\n// ============================================================================\n// Registry\n// ============================================================================\n\nexport class RpcHandlerRegistry {\n private readonly handlers = new Map<string, RpcHandler>();\n\n /**\n * Register an RPC method handler\n */\n register(method: string, handler: RpcHandler): this {\n if (this.handlers.has(method)) {\n logger.warn(\"Overwriting existing handler\", { method });\n }\n this.handlers.set(method, handler);\n return this;\n }\n\n /**\n * Check if a method is registered\n */\n has(method: string): boolean {\n return this.handlers.has(method);\n }\n\n /**\n * Get all registered method names\n */\n methods(): string[] {\n return [...this.handlers.keys()];\n }\n\n /**\n * Handle an RPC request — dispatch to registered handler\n */\n async handle(runtime: AgentXRuntime, method: string, params: unknown): Promise<RpcResponse> {\n const handler = this.handlers.get(method);\n if (!handler) {\n return err(-32601, `Method not found: ${method}`);\n }\n\n try {\n return await handler(runtime, params);\n } catch (error) {\n logger.error(\"RPC handler error\", { method, error });\n return err(-32000, error instanceof Error ? error.message : String(error));\n }\n }\n}\n","/**\n * Image RPC Handlers\n */\n\nimport { DEFAULT_CONTAINER_ID } from \"@agentxjs/core/container\";\nimport type { RpcHandlerRegistry } from \"../RpcHandlerRegistry\";\nimport { err, ok } from \"../RpcHandlerRegistry\";\n\nexport function registerImageHandlers(registry: RpcHandlerRegistry): void {\n registry.register(\"image.create\", async (runtime, params) => {\n const {\n name,\n description,\n contextId,\n model,\n systemPrompt,\n mcpServers,\n thinking,\n providerOptions,\n customData,\n } = params as {\n name?: string;\n description?: string;\n contextId?: string;\n model?: string;\n systemPrompt?: string;\n mcpServers?: Record<string, unknown>;\n thinking?: string;\n providerOptions?: Record<string, unknown>;\n customData?: Record<string, unknown>;\n };\n\n const { imageRepository, sessionRepository } = runtime.platform;\n const { createImage } = await import(\"@agentxjs/core/image\");\n\n const image = await createImage(\n {\n containerId: DEFAULT_CONTAINER_ID,\n name,\n description,\n contextId,\n model,\n systemPrompt,\n mcpServers: mcpServers as any,\n thinking: thinking as any,\n providerOptions,\n customData,\n },\n { imageRepository, sessionRepository }\n );\n\n return ok({ record: image.toRecord() });\n });\n\n registry.register(\"image.get\", async (runtime, params) => {\n const { imageId } = params as { imageId: string };\n const record = await runtime.platform.imageRepository.findImageById(imageId);\n return ok({ record });\n });\n\n registry.register(\"image.list\", async (runtime, params) => {\n const { containerId } = params as { containerId?: string };\n const records = containerId\n ? await runtime.platform.imageRepository.findImagesByContainerId(containerId)\n : await runtime.platform.imageRepository.findAllImages();\n return ok({ records });\n });\n\n registry.register(\"image.delete\", async (runtime, params) => {\n const { imageId } = params as { imageId: string };\n const { loadImage } = await import(\"@agentxjs/core/image\");\n const { imageRepository, sessionRepository } = runtime.platform;\n const image = await loadImage(imageId, { imageRepository, sessionRepository });\n if (image) await image.delete();\n return ok({ imageId });\n });\n\n registry.register(\"image.run\", async (runtime, params) => {\n const { imageId, instanceId: requestedInstanceId } = params as {\n imageId: string;\n instanceId?: string;\n };\n\n const existingAgent = runtime\n .getAgents()\n .find((a) => a.imageId === imageId && a.lifecycle === \"running\");\n\n if (existingAgent) {\n return ok({\n imageId,\n instanceId: existingAgent.instanceId,\n sessionId: existingAgent.sessionId,\n containerId: existingAgent.containerId,\n reused: true,\n });\n }\n\n const agent = await runtime.createAgent({ imageId, instanceId: requestedInstanceId });\n return ok({\n imageId,\n instanceId: agent.instanceId,\n sessionId: agent.sessionId,\n containerId: agent.containerId,\n reused: false,\n });\n });\n\n registry.register(\"image.stop\", async (runtime, params) => {\n const { imageId } = params as { imageId: string };\n const agent = runtime\n .getAgents()\n .find((a) => a.imageId === imageId && a.lifecycle === \"running\");\n if (agent) await runtime.stopAgent(agent.instanceId);\n return ok({ imageId });\n });\n\n registry.register(\"image.update\", async (runtime, params) => {\n const { imageId, updates } = params as {\n imageId: string;\n updates: {\n name?: string;\n description?: string;\n model?: string;\n systemPrompt?: string;\n mcpServers?: Record<string, unknown>;\n thinking?: string;\n providerOptions?: Record<string, unknown>;\n customData?: Record<string, unknown>;\n };\n };\n\n const imageRecord = await runtime.platform.imageRepository.findImageById(imageId);\n if (!imageRecord) return err(404, `Image not found: ${imageId}`);\n\n const updatedRecord = {\n ...imageRecord,\n ...updates,\n updatedAt: Date.now(),\n };\n\n await runtime.platform.imageRepository.saveImage(updatedRecord);\n\n // If runtime config changed, restart the running agent\n const { model, systemPrompt, mcpServers, thinking, providerOptions } = updates;\n const hasRuntimeChanges =\n model !== undefined ||\n systemPrompt !== undefined ||\n mcpServers !== undefined ||\n thinking !== undefined ||\n providerOptions !== undefined;\n\n if (hasRuntimeChanges) {\n const runningAgent = runtime\n .getAgents()\n .find((a) => a.imageId === imageId && a.lifecycle === \"running\");\n if (runningAgent) {\n await runtime.destroyAgent(runningAgent.instanceId);\n await runtime.createAgent({ imageId });\n }\n }\n return ok({ record: updatedRecord });\n });\n\n registry.register(\"image.messages\", async (runtime, params) => {\n const { imageId } = params as { imageId: string };\n const imageRecord = await runtime.platform.imageRepository.findImageById(imageId);\n if (!imageRecord) return err(404, `Image not found: ${imageId}`);\n const messages = await runtime.platform.sessionRepository.getMessages(imageRecord.sessionId);\n return ok({ imageId, messages });\n });\n}\n","/**\n * Instance RPC Handlers\n */\n\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport type { RpcHandlerRegistry } from \"../RpcHandlerRegistry\";\nimport { ok } from \"../RpcHandlerRegistry\";\n\nasync function resolveInstanceId(\n runtime: AgentXRuntime,\n params: { instanceId?: string; imageId?: string }\n): Promise<string> {\n const { instanceId, imageId } = params;\n\n if (instanceId) {\n const agent = runtime.getAgent(instanceId);\n if (agent) return instanceId;\n }\n\n if (imageId) {\n const existing = runtime\n .getAgents()\n .find((a) => a.imageId === imageId && a.lifecycle === \"running\");\n if (existing) return existing.instanceId;\n const agent = await runtime.createAgent({ imageId });\n return agent.instanceId;\n }\n\n throw new Error(\"Either instanceId or imageId is required\");\n}\n\nexport function registerInstanceHandlers(registry: RpcHandlerRegistry): void {\n registry.register(\"instance.get\", async (runtime, params) => {\n const { instanceId } = params as { instanceId: string };\n const agent = runtime.getAgent(instanceId);\n return ok({\n agent: agent\n ? {\n instanceId: agent.instanceId,\n imageId: agent.imageId,\n containerId: agent.containerId,\n sessionId: agent.sessionId,\n lifecycle: agent.lifecycle,\n }\n : null,\n exists: !!agent,\n });\n });\n\n registry.register(\"instance.list\", async (runtime, params) => {\n const { containerId } = params as { containerId?: string };\n const agents = containerId ? runtime.getAgentsByContainer(containerId) : runtime.getAgents();\n return ok({\n agents: agents.map((a) => ({\n instanceId: a.instanceId,\n imageId: a.imageId,\n containerId: a.containerId,\n sessionId: a.sessionId,\n lifecycle: a.lifecycle,\n })),\n });\n });\n\n registry.register(\"instance.destroy\", async (runtime, params) => {\n const { instanceId } = params as { instanceId: string };\n const agent = runtime.getAgent(instanceId);\n if (!agent) return ok({ instanceId, success: false });\n await runtime.destroyAgent(instanceId);\n return ok({ instanceId, success: true });\n });\n\n registry.register(\"instance.destroyAll\", async (runtime, params) => {\n const { containerId } = params as { containerId: string };\n const agents = runtime.getAgentsByContainer(containerId);\n for (const agent of agents) {\n await runtime.destroyAgent(agent.instanceId);\n }\n return ok({ containerId });\n });\n\n registry.register(\"instance.interrupt\", async (runtime, params) => {\n const { instanceId, imageId } = params as { instanceId?: string; imageId?: string };\n const resolved = await resolveInstanceId(runtime, { instanceId, imageId });\n runtime.interrupt(resolved);\n return ok({ instanceId: resolved });\n });\n}\n\nexport { resolveInstanceId };\n","/**\n * LLM Provider RPC Handlers\n */\n\nimport { DEFAULT_CONTAINER_ID } from \"@agentxjs/core/container\";\nimport type { RpcHandlerRegistry } from \"../RpcHandlerRegistry\";\nimport { err, ok } from \"../RpcHandlerRegistry\";\n\nexport function registerLLMHandlers(registry: RpcHandlerRegistry): void {\n registry.register(\"llm.create\", async (runtime, params) => {\n const { name, vendor, protocol, apiKey, baseUrl, model } = params as {\n name: string;\n vendor: string;\n protocol: string;\n apiKey: string;\n baseUrl?: string;\n model?: string;\n };\n\n const repo = runtime.platform.llmProviderRepository;\n if (!repo) return err(-32000, \"LLM provider repository not available\");\n\n const { generateId } = await import(\"@deepracticex/id\");\n const now = Date.now();\n const record = {\n id: generateId(\"llm\"),\n containerId: DEFAULT_CONTAINER_ID,\n name,\n vendor,\n protocol: protocol as \"anthropic\" | \"openai\",\n apiKey,\n baseUrl,\n model,\n isDefault: false,\n createdAt: now,\n updatedAt: now,\n };\n\n await repo.saveLLMProvider(record);\n return ok({ record });\n });\n\n registry.register(\"llm.get\", async (runtime, params) => {\n const { id } = params as { id: string };\n const repo = runtime.platform.llmProviderRepository;\n if (!repo) return err(-32000, \"LLM provider repository not available\");\n const record = await repo.findLLMProviderById(id);\n return ok({ record });\n });\n\n registry.register(\"llm.list\", async (runtime, params) => {\n const { containerId } = params as { containerId: string };\n const repo = runtime.platform.llmProviderRepository;\n if (!repo) return err(-32000, \"LLM provider repository not available\");\n const records = await repo.findLLMProvidersByContainerId(containerId);\n return ok({ records });\n });\n\n registry.register(\"llm.update\", async (runtime, params) => {\n const { id, updates } = params as { id: string; updates: Record<string, unknown> };\n const repo = runtime.platform.llmProviderRepository;\n if (!repo) return err(-32000, \"LLM provider repository not available\");\n\n const existing = await repo.findLLMProviderById(id);\n if (!existing) return err(404, `LLM provider not found: ${id}`);\n\n const updated = {\n ...existing,\n ...updates,\n id: existing.id,\n containerId: existing.containerId,\n createdAt: existing.createdAt,\n updatedAt: Date.now(),\n };\n\n await repo.saveLLMProvider(updated);\n return ok({ record: updated });\n });\n\n registry.register(\"llm.delete\", async (runtime, params) => {\n const { id } = params as { id: string };\n const repo = runtime.platform.llmProviderRepository;\n if (!repo) return err(-32000, \"LLM provider repository not available\");\n await repo.deleteLLMProvider(id);\n return ok({ id });\n });\n\n registry.register(\"llm.default\", async (runtime, params) => {\n const { id, containerId } = params as { id?: string; containerId?: string };\n const repo = runtime.platform.llmProviderRepository;\n if (!repo) return err(-32000, \"LLM provider repository not available\");\n\n if (id) {\n await repo.setDefaultLLMProvider(id);\n return ok({ id });\n }\n if (containerId) {\n const record = await repo.findDefaultLLMProvider(containerId);\n return ok({ record });\n }\n return err(-32602, \"Either id or containerId is required\");\n });\n}\n","/**\n * Message RPC Handlers\n */\n\nimport type { UserContentPart } from \"@agentxjs/core/agent\";\nimport type { RpcHandlerRegistry } from \"../RpcHandlerRegistry\";\nimport { err, ok } from \"../RpcHandlerRegistry\";\nimport { resolveInstanceId } from \"./instance\";\n\nexport function registerMessageHandlers(registry: RpcHandlerRegistry): void {\n registry.register(\"message.send\", async (runtime, params) => {\n const { instanceId, imageId, content, options } = params as {\n instanceId?: string;\n imageId?: string;\n content: string | UserContentPart[];\n options?: import(\"@agentxjs/core/driver\").SendOptions;\n };\n const resolved = await resolveInstanceId(runtime, { instanceId, imageId });\n await runtime.receive(resolved, content, undefined, options);\n return ok({ instanceId: resolved, imageId });\n });\n\n registry.register(\"runtime.rewind\", async (runtime, params) => {\n const { instanceId, imageId, messageId } = params as {\n instanceId?: string;\n imageId?: string;\n messageId: string;\n };\n\n if (!messageId) return err(-32602, \"messageId is required\");\n\n const resolved = await resolveInstanceId(runtime, { instanceId, imageId });\n await runtime.rewind(resolved, messageId);\n return ok({ instanceId: resolved });\n });\n}\n","/**\n * Workspace RPC Handlers\n */\n\nimport type { RpcHandlerRegistry } from \"../RpcHandlerRegistry\";\nimport { err, ok } from \"../RpcHandlerRegistry\";\n\nexport function registerWorkspaceHandlers(registry: RpcHandlerRegistry): void {\n registry.register(\"workspace.read\", async (runtime, params) => {\n const { imageId, path } = params as { imageId: string; path: string };\n const wp = runtime.platform.workspaceProvider;\n if (!wp) return err(-32000, \"Workspace not available\");\n\n const img = await runtime.platform.imageRepository.findImageById(imageId);\n if (!img?.workspaceId) return err(404, \"Image has no workspace\");\n\n const ws = await wp.create(img.workspaceId);\n const content = await ws.read(path);\n return ok({ content });\n });\n\n registry.register(\"workspace.list\", async (runtime, params) => {\n const { imageId, path } = params as { imageId: string; path?: string };\n const wp = runtime.platform.workspaceProvider;\n if (!wp) return err(-32000, \"Workspace not available\");\n\n const img = await runtime.platform.imageRepository.findImageById(imageId);\n if (!img?.workspaceId) return err(404, \"Image has no workspace\");\n\n const ws = await wp.create(img.workspaceId);\n const files = await ws.list(path ?? \".\");\n return ok({ files });\n });\n\n registry.register(\"workspace.write\", async (runtime, params) => {\n const { imageId, path, content } = params as { imageId: string; path: string; content: string };\n const wp = runtime.platform.workspaceProvider;\n if (!wp) return err(-32000, \"Workspace not available\");\n\n const img = await runtime.platform.imageRepository.findImageById(imageId);\n if (!img?.workspaceId) return err(404, \"Image has no workspace\");\n\n const ws = await wp.create(img.workspaceId);\n await ws.write(path, content);\n return ok({ success: true });\n });\n}\n","/**\n * RPC Handlers — all method handlers registered in one place.\n *\n * To add a new RPC method:\n * 1. Write a handler function in the appropriate file\n * 2. Register it here with registerAll()\n * That's it. No types, mappings, or switch cases to update.\n */\n\nimport type { RpcHandlerRegistry } from \"../RpcHandlerRegistry\";\nimport { registerImageHandlers } from \"./image\";\nimport { registerInstanceHandlers } from \"./instance\";\nimport { registerLLMHandlers } from \"./llm\";\nimport { registerMessageHandlers } from \"./message\";\nimport { registerWorkspaceHandlers } from \"./workspace\";\n\n/**\n * Register all RPC handlers on the registry\n */\nexport function registerAll(registry: RpcHandlerRegistry): void {\n registerImageHandlers(registry);\n registerInstanceHandlers(registry);\n registerMessageHandlers(registry);\n registerLLMHandlers(registry);\n registerWorkspaceHandlers(registry);\n}\n"],"mappings":"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","names":["DEFAULT_CONTAINER_ID","DEFAULT_CONTAINER_ID"]}
|
|
1
|
+
{"version":3,"sources":["../src/RpcHandlerRegistry.ts","../src/handlers/image.ts","../src/handlers/instance.ts","../src/handlers/llm.ts","../src/handlers/message.ts","../src/handlers/workspace.ts","../src/handlers/index.ts"],"sourcesContent":["/**\n * RpcHandlerRegistry — single source of truth for RPC method → handler mapping.\n *\n * Register once, use everywhere. No more switch statements or mapping tables.\n *\n * @example\n * ```typescript\n * const registry = new RpcHandlerRegistry();\n * registry.register(\"workspace.read\", async (runtime, params) => {\n * const content = await workspace.read(params.path);\n * return ok(content);\n * });\n *\n * const response = await registry.handle(runtime, method, params);\n * ```\n */\n\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport { createLogger } from \"@deepracticex/logger\";\n\nconst logger = createLogger(\"agentx/RpcHandlerRegistry\");\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface RpcResult<T = unknown> {\n success: true;\n data: T;\n}\n\nexport interface RpcError {\n success: false;\n code: number;\n message: string;\n}\n\nexport type RpcResponse<T = unknown> = RpcResult<T> | RpcError;\n\n/** Handler function: receives runtime + params, returns response */\nexport type RpcHandler = (runtime: AgentXRuntime, params: unknown) => Promise<RpcResponse>;\n\n/** Helper to create success result */\nexport function ok<T>(data: T): RpcResult<T> {\n return { success: true, data };\n}\n\n/** Helper to create error result */\nexport function err(code: number, message: string): RpcError {\n return { success: false, code, message };\n}\n\n// ============================================================================\n// Registry\n// ============================================================================\n\nexport class RpcHandlerRegistry {\n private readonly handlers = new Map<string, RpcHandler>();\n\n /**\n * Register an RPC method handler\n */\n register(method: string, handler: RpcHandler): this {\n if (this.handlers.has(method)) {\n logger.warn(\"Overwriting existing handler\", { method });\n }\n this.handlers.set(method, handler);\n return this;\n }\n\n /**\n * Check if a method is registered\n */\n has(method: string): boolean {\n return this.handlers.has(method);\n }\n\n /**\n * Get all registered method names\n */\n methods(): string[] {\n return [...this.handlers.keys()];\n }\n\n /**\n * Handle an RPC request — dispatch to registered handler\n */\n async handle(runtime: AgentXRuntime, method: string, params: unknown): Promise<RpcResponse> {\n const handler = this.handlers.get(method);\n if (!handler) {\n return err(-32601, `Method not found: ${method}`);\n }\n\n try {\n return await handler(runtime, params);\n } catch (error) {\n logger.error(\"RPC handler error\", { method, error });\n return err(-32000, error instanceof Error ? error.message : String(error));\n }\n }\n}\n","/**\n * Image RPC Handlers\n */\n\nimport { DEFAULT_CONTAINER_ID } from \"@agentxjs/core/container\";\nimport type { RpcHandlerRegistry } from \"../RpcHandlerRegistry\";\nimport { err, ok } from \"../RpcHandlerRegistry\";\n\nexport function registerImageHandlers(registry: RpcHandlerRegistry): void {\n registry.register(\"image.create\", async (runtime, params) => {\n const {\n name,\n description,\n contextId,\n model,\n systemPrompt,\n mcpServers,\n thinking,\n providerOptions,\n customData,\n } = params as {\n name?: string;\n description?: string;\n contextId?: string;\n model?: string;\n systemPrompt?: string;\n mcpServers?: Record<string, unknown>;\n thinking?: string;\n providerOptions?: Record<string, unknown>;\n customData?: Record<string, unknown>;\n };\n\n const { imageRepository, sessionRepository } = runtime.platform;\n const { createImage } = await import(\"@agentxjs/core/image\");\n\n const image = await createImage(\n {\n containerId: DEFAULT_CONTAINER_ID,\n name,\n description,\n contextId,\n model,\n systemPrompt,\n mcpServers: mcpServers as any,\n thinking: thinking as any,\n providerOptions,\n customData,\n },\n { imageRepository, sessionRepository }\n );\n\n return ok({ record: image.toRecord() });\n });\n\n registry.register(\"image.get\", async (runtime, params) => {\n const { imageId } = params as { imageId: string };\n const record = await runtime.platform.imageRepository.findImageById(imageId);\n return ok({ record });\n });\n\n registry.register(\"image.list\", async (runtime, params) => {\n const { containerId } = params as { containerId?: string };\n const records = containerId\n ? await runtime.platform.imageRepository.findImagesByContainerId(containerId)\n : await runtime.platform.imageRepository.findAllImages();\n return ok({ records });\n });\n\n registry.register(\"image.delete\", async (runtime, params) => {\n const { imageId } = params as { imageId: string };\n const { loadImage } = await import(\"@agentxjs/core/image\");\n const { imageRepository, sessionRepository } = runtime.platform;\n const image = await loadImage(imageId, { imageRepository, sessionRepository });\n if (image) await image.delete();\n return ok({ imageId });\n });\n\n registry.register(\"image.run\", async (runtime, params) => {\n const { imageId, instanceId: requestedInstanceId } = params as {\n imageId: string;\n instanceId?: string;\n };\n\n const existingAgent = runtime\n .getAgents()\n .find((a) => a.imageId === imageId && a.lifecycle === \"running\");\n\n if (existingAgent) {\n return ok({\n imageId,\n instanceId: existingAgent.instanceId,\n sessionId: existingAgent.sessionId,\n containerId: existingAgent.containerId,\n reused: true,\n });\n }\n\n const agent = await runtime.createAgent({ imageId, instanceId: requestedInstanceId });\n return ok({\n imageId,\n instanceId: agent.instanceId,\n sessionId: agent.sessionId,\n containerId: agent.containerId,\n reused: false,\n });\n });\n\n registry.register(\"image.stop\", async (runtime, params) => {\n const { imageId } = params as { imageId: string };\n const agent = runtime\n .getAgents()\n .find((a) => a.imageId === imageId && a.lifecycle === \"running\");\n if (agent) await runtime.stopAgent(agent.instanceId);\n return ok({ imageId });\n });\n\n registry.register(\"image.update\", async (runtime, params) => {\n const { imageId, updates } = params as {\n imageId: string;\n updates: {\n name?: string;\n description?: string;\n model?: string;\n systemPrompt?: string;\n mcpServers?: Record<string, unknown>;\n thinking?: string;\n providerOptions?: Record<string, unknown>;\n customData?: Record<string, unknown>;\n };\n };\n\n const imageRecord = await runtime.platform.imageRepository.findImageById(imageId);\n if (!imageRecord) return err(404, `Image not found: ${imageId}`);\n\n const updatedRecord = {\n ...imageRecord,\n ...updates,\n updatedAt: Date.now(),\n };\n\n await runtime.platform.imageRepository.saveImage(updatedRecord);\n\n // If runtime config changed, restart the running agent\n const { model, systemPrompt, mcpServers, thinking, providerOptions } = updates;\n const hasRuntimeChanges =\n model !== undefined ||\n systemPrompt !== undefined ||\n mcpServers !== undefined ||\n thinking !== undefined ||\n providerOptions !== undefined;\n\n if (hasRuntimeChanges) {\n const runningAgent = runtime\n .getAgents()\n .find((a) => a.imageId === imageId && a.lifecycle === \"running\");\n if (runningAgent) {\n await runtime.destroyAgent(runningAgent.instanceId);\n await runtime.createAgent({ imageId });\n }\n }\n return ok({ record: updatedRecord });\n });\n\n registry.register(\"image.messages\", async (runtime, params) => {\n const { imageId } = params as { imageId: string };\n const imageRecord = await runtime.platform.imageRepository.findImageById(imageId);\n if (!imageRecord) return err(404, `Image not found: ${imageId}`);\n const messages = await runtime.platform.sessionRepository.getMessages(imageRecord.sessionId);\n return ok({ imageId, messages });\n });\n}\n","/**\n * Instance RPC Handlers\n */\n\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport type { RpcHandlerRegistry } from \"../RpcHandlerRegistry\";\nimport { ok } from \"../RpcHandlerRegistry\";\n\nasync function resolveInstanceId(\n runtime: AgentXRuntime,\n params: { instanceId?: string; imageId?: string }\n): Promise<string> {\n const { instanceId, imageId } = params;\n\n if (instanceId) {\n const agent = runtime.getAgent(instanceId);\n if (agent) return instanceId;\n }\n\n if (imageId) {\n const existing = runtime\n .getAgents()\n .find((a) => a.imageId === imageId && a.lifecycle === \"running\");\n if (existing) return existing.instanceId;\n const agent = await runtime.createAgent({ imageId });\n return agent.instanceId;\n }\n\n throw new Error(\"Either instanceId or imageId is required\");\n}\n\nexport function registerInstanceHandlers(registry: RpcHandlerRegistry): void {\n registry.register(\"instance.get\", async (runtime, params) => {\n const { instanceId } = params as { instanceId: string };\n const agent = runtime.getAgent(instanceId);\n return ok({\n agent: agent\n ? {\n instanceId: agent.instanceId,\n imageId: agent.imageId,\n containerId: agent.containerId,\n sessionId: agent.sessionId,\n lifecycle: agent.lifecycle,\n }\n : null,\n exists: !!agent,\n });\n });\n\n registry.register(\"instance.list\", async (runtime, params) => {\n const { containerId } = params as { containerId?: string };\n const agents = containerId ? runtime.getAgentsByContainer(containerId) : runtime.getAgents();\n return ok({\n agents: agents.map((a) => ({\n instanceId: a.instanceId,\n imageId: a.imageId,\n containerId: a.containerId,\n sessionId: a.sessionId,\n lifecycle: a.lifecycle,\n })),\n });\n });\n\n registry.register(\"instance.destroy\", async (runtime, params) => {\n const { instanceId } = params as { instanceId: string };\n const agent = runtime.getAgent(instanceId);\n if (!agent) return ok({ instanceId, success: false });\n await runtime.destroyAgent(instanceId);\n return ok({ instanceId, success: true });\n });\n\n registry.register(\"instance.destroyAll\", async (runtime, params) => {\n const { containerId } = params as { containerId: string };\n const agents = runtime.getAgentsByContainer(containerId);\n for (const agent of agents) {\n await runtime.destroyAgent(agent.instanceId);\n }\n return ok({ containerId });\n });\n\n registry.register(\"instance.interrupt\", async (runtime, params) => {\n const { instanceId, imageId } = params as { instanceId?: string; imageId?: string };\n const resolved = await resolveInstanceId(runtime, { instanceId, imageId });\n runtime.interrupt(resolved);\n return ok({ instanceId: resolved });\n });\n}\n\nexport { resolveInstanceId };\n","/**\n * LLM Provider RPC Handlers\n */\n\nimport { DEFAULT_CONTAINER_ID } from \"@agentxjs/core/container\";\nimport type { RpcHandlerRegistry } from \"../RpcHandlerRegistry\";\nimport { err, ok } from \"../RpcHandlerRegistry\";\n\nexport function registerLLMHandlers(registry: RpcHandlerRegistry): void {\n registry.register(\"llm.create\", async (runtime, params) => {\n const { name, vendor, protocol, apiKey, baseUrl, model } = params as {\n name: string;\n vendor: string;\n protocol: string;\n apiKey: string;\n baseUrl?: string;\n model?: string;\n };\n\n const repo = runtime.platform.llmProviderRepository;\n if (!repo) return err(-32000, \"LLM provider repository not available\");\n\n const { generateId } = await import(\"@deepracticex/id\");\n const now = Date.now();\n const record = {\n id: generateId(\"llm\"),\n containerId: DEFAULT_CONTAINER_ID,\n name,\n vendor,\n protocol: protocol as \"anthropic\" | \"openai\",\n apiKey,\n baseUrl,\n model,\n isDefault: false,\n createdAt: now,\n updatedAt: now,\n };\n\n await repo.saveLLMProvider(record);\n return ok({ record });\n });\n\n registry.register(\"llm.get\", async (runtime, params) => {\n const { id } = params as { id: string };\n const repo = runtime.platform.llmProviderRepository;\n if (!repo) return err(-32000, \"LLM provider repository not available\");\n const record = await repo.findLLMProviderById(id);\n return ok({ record });\n });\n\n registry.register(\"llm.list\", async (runtime, params) => {\n const { containerId } = params as { containerId: string };\n const repo = runtime.platform.llmProviderRepository;\n if (!repo) return err(-32000, \"LLM provider repository not available\");\n const records = await repo.findLLMProvidersByContainerId(containerId);\n return ok({ records });\n });\n\n registry.register(\"llm.update\", async (runtime, params) => {\n const { id, updates } = params as { id: string; updates: Record<string, unknown> };\n const repo = runtime.platform.llmProviderRepository;\n if (!repo) return err(-32000, \"LLM provider repository not available\");\n\n const existing = await repo.findLLMProviderById(id);\n if (!existing) return err(404, `LLM provider not found: ${id}`);\n\n const updated = {\n ...existing,\n ...updates,\n id: existing.id,\n containerId: existing.containerId,\n createdAt: existing.createdAt,\n updatedAt: Date.now(),\n };\n\n await repo.saveLLMProvider(updated);\n return ok({ record: updated });\n });\n\n registry.register(\"llm.delete\", async (runtime, params) => {\n const { id } = params as { id: string };\n const repo = runtime.platform.llmProviderRepository;\n if (!repo) return err(-32000, \"LLM provider repository not available\");\n await repo.deleteLLMProvider(id);\n return ok({ id });\n });\n\n registry.register(\"llm.default\", async (runtime, params) => {\n const { id, containerId } = params as { id?: string; containerId?: string };\n const repo = runtime.platform.llmProviderRepository;\n if (!repo) return err(-32000, \"LLM provider repository not available\");\n\n if (id) {\n await repo.setDefaultLLMProvider(id);\n return ok({ id });\n }\n if (containerId) {\n const record = await repo.findDefaultLLMProvider(containerId);\n return ok({ record });\n }\n return err(-32602, \"Either id or containerId is required\");\n });\n}\n","/**\n * Message RPC Handlers\n */\n\nimport type { UserContentPart } from \"@agentxjs/core/agent\";\nimport type { RpcHandlerRegistry } from \"../RpcHandlerRegistry\";\nimport { err, ok } from \"../RpcHandlerRegistry\";\nimport { resolveInstanceId } from \"./instance\";\n\nexport function registerMessageHandlers(registry: RpcHandlerRegistry): void {\n registry.register(\"message.send\", async (runtime, params) => {\n const { instanceId, imageId, content, options } = params as {\n instanceId?: string;\n imageId?: string;\n content: string | UserContentPart[];\n options?: import(\"@agentxjs/core/driver\").SendOptions;\n };\n const resolved = await resolveInstanceId(runtime, { instanceId, imageId });\n await runtime.receive(resolved, content, undefined, options);\n return ok({ instanceId: resolved, imageId });\n });\n\n registry.register(\"runtime.rewind\", async (runtime, params) => {\n const { instanceId, imageId, messageId } = params as {\n instanceId?: string;\n imageId?: string;\n messageId: string;\n };\n\n if (!messageId) return err(-32602, \"messageId is required\");\n\n const resolved = await resolveInstanceId(runtime, { instanceId, imageId });\n await runtime.rewind(resolved, messageId);\n return ok({ instanceId: resolved });\n });\n}\n","/**\n * OS RPC Handlers — exposes AgentOS file operations via RPC\n */\n\nimport type { RpcHandlerRegistry } from \"../RpcHandlerRegistry\";\nimport { err, ok } from \"../RpcHandlerRegistry\";\n\nexport function registerOSHandlers(registry: RpcHandlerRegistry): void {\n registry.register(\"os.read\", async (runtime, params) => {\n const { imageId, path } = params as { imageId: string; path: string };\n const op = runtime.platform.osProvider;\n if (!op) return err(-32000, \"OS not available\");\n\n const img = await runtime.platform.imageRepository.findImageById(imageId);\n if (!img?.osId) return err(404, \"Image has no OS\");\n\n const os = await op.create(img.osId);\n const content = await os.fs.read(path);\n return ok({ content });\n });\n\n registry.register(\"os.list\", async (runtime, params) => {\n const { imageId, path } = params as { imageId: string; path?: string };\n const op = runtime.platform.osProvider;\n if (!op) return err(-32000, \"OS not available\");\n\n const img = await runtime.platform.imageRepository.findImageById(imageId);\n if (!img?.osId) return err(404, \"Image has no OS\");\n\n const os = await op.create(img.osId);\n const files = await os.fs.list(path ?? \".\");\n return ok({ files });\n });\n\n registry.register(\"os.write\", async (runtime, params) => {\n const { imageId, path, content } = params as { imageId: string; path: string; content: string };\n const op = runtime.platform.osProvider;\n if (!op) return err(-32000, \"OS not available\");\n\n const img = await runtime.platform.imageRepository.findImageById(imageId);\n if (!img?.osId) return err(404, \"Image has no OS\");\n\n const os = await op.create(img.osId);\n await os.fs.write(path, content);\n return ok({ success: true });\n });\n}\n","/**\n * RPC Handlers — all method handlers registered in one place.\n *\n * To add a new RPC method:\n * 1. Write a handler function in the appropriate file\n * 2. Register it here with registerAll()\n * That's it. No types, mappings, or switch cases to update.\n */\n\nimport type { RpcHandlerRegistry } from \"../RpcHandlerRegistry\";\nimport { registerImageHandlers } from \"./image\";\nimport { registerInstanceHandlers } from \"./instance\";\nimport { registerLLMHandlers } from \"./llm\";\nimport { registerMessageHandlers } from \"./message\";\nimport { registerOSHandlers } from \"./workspace\";\n\n/**\n * Register all RPC handlers on the registry\n */\nexport function registerAll(registry: RpcHandlerRegistry): void {\n registerImageHandlers(registry);\n registerInstanceHandlers(registry);\n registerMessageHandlers(registry);\n registerLLMHandlers(registry);\n registerOSHandlers(registry);\n}\n"],"mappings":"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","names":["DEFAULT_CONTAINER_ID","DEFAULT_CONTAINER_ID"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -141,9 +141,9 @@ interface FileTreeEntry {
|
|
|
141
141
|
children?: FileTreeEntry[];
|
|
142
142
|
}
|
|
143
143
|
/**
|
|
144
|
-
*
|
|
144
|
+
* OS state — real-time file tree view
|
|
145
145
|
*/
|
|
146
|
-
interface
|
|
146
|
+
interface OSState {
|
|
147
147
|
/**
|
|
148
148
|
* Current file tree (recursive).
|
|
149
149
|
* Frontend just renders this tree directly.
|
|
@@ -151,10 +151,10 @@ interface WorkspaceState {
|
|
|
151
151
|
files: FileTreeEntry[];
|
|
152
152
|
}
|
|
153
153
|
/**
|
|
154
|
-
*
|
|
155
|
-
* Wraps the underlying
|
|
154
|
+
* PresentationOS — file operations exposed to the consumer.
|
|
155
|
+
* Wraps the underlying AgentOS with a simple API.
|
|
156
156
|
*/
|
|
157
|
-
interface
|
|
157
|
+
interface PresentationOS {
|
|
158
158
|
/** Read file content */
|
|
159
159
|
read(path: string): Promise<string>;
|
|
160
160
|
/** Write content to a file */
|
|
@@ -195,10 +195,10 @@ interface PresentationState {
|
|
|
195
195
|
*/
|
|
196
196
|
metrics: PresentationMetrics;
|
|
197
197
|
/**
|
|
198
|
-
*
|
|
199
|
-
* null when agent has no
|
|
198
|
+
* OS state — real-time file tree.
|
|
199
|
+
* null when agent has no OS.
|
|
200
200
|
*/
|
|
201
|
-
|
|
201
|
+
os: OSState | null;
|
|
202
202
|
}
|
|
203
203
|
declare const initialMetrics: PresentationMetrics;
|
|
204
204
|
/**
|
|
@@ -207,9 +207,9 @@ declare const initialMetrics: PresentationMetrics;
|
|
|
207
207
|
declare const initialPresentationState: PresentationState;
|
|
208
208
|
|
|
209
209
|
/**
|
|
210
|
-
*
|
|
210
|
+
* OS view — file tree + operations, unified.
|
|
211
211
|
*/
|
|
212
|
-
interface
|
|
212
|
+
interface OS {
|
|
213
213
|
/** Current file tree (real-time updates) */
|
|
214
214
|
readonly files: readonly FileTreeEntry[];
|
|
215
215
|
/** Read file content */
|
|
@@ -233,8 +233,8 @@ declare class Presentation {
|
|
|
233
233
|
private _listeners;
|
|
234
234
|
private _legacyHandlers;
|
|
235
235
|
private _eventUnsubscribe;
|
|
236
|
-
private
|
|
237
|
-
constructor(agentx: AgentX, instanceId: string, options?: PresentationOptions, initialConversations?: Conversation[],
|
|
236
|
+
private _osOps;
|
|
237
|
+
constructor(agentx: AgentX, instanceId: string, options?: PresentationOptions, initialConversations?: Conversation[], os?: PresentationOS | null);
|
|
238
238
|
/** All conversations (user, assistant, error) */
|
|
239
239
|
get conversations(): readonly Conversation[];
|
|
240
240
|
/** Current agent status */
|
|
@@ -243,8 +243,8 @@ declare class Presentation {
|
|
|
243
243
|
get connection(): ConnectionState;
|
|
244
244
|
/** Token usage and context metrics */
|
|
245
245
|
get metrics(): PresentationMetrics;
|
|
246
|
-
/**
|
|
247
|
-
get
|
|
246
|
+
/** OS — file tree + operations. null if agent has no OS. */
|
|
247
|
+
get os(): OS | null;
|
|
248
248
|
/**
|
|
249
249
|
* Subscribe to state changes.
|
|
250
250
|
* Compatible with React's useSyncExternalStore.
|
|
@@ -813,4 +813,4 @@ interface PlatformConfig {
|
|
|
813
813
|
*/
|
|
814
814
|
declare function createAgentX(config?: PlatformConfig): AgentXBuilder;
|
|
815
815
|
|
|
816
|
-
export { type AgentConfig, type AgentHandle, type AgentX, type AgentXBuilder, type AgentXServer, type AssistantConversation, type BaseResponse, type Block, type ChatNamespace, type ConnectOptions, type Conversation, type ErrorConversation, type FileBlock, type FileTreeEntry, type ImageBlock, type ImageCreateResponse, type ImageGetResponse, type ImageListResponse, type ImageNamespace, type ImageRecord, type ImageUpdateResponse, type InstanceCreateResponse, type InstanceGetResponse, type InstanceInfo, type InstanceListResponse, type LLMNamespace, type LLMProviderCreateResponse, type LLMProviderDefaultResponse, type LLMProviderGetResponse, type LLMProviderListResponse, type LLMProviderUpdateResponse, type MaybeAsync, type MessageSendResponse, type PlatformConfig, Presentation, type PresentationMetrics, type PresentationNamespace, type
|
|
816
|
+
export { type AgentConfig, type AgentHandle, type AgentX, type AgentXBuilder, type AgentXServer, type AssistantConversation, type BaseResponse, type Block, type ChatNamespace, type ConnectOptions, type Conversation, type ErrorConversation, type FileBlock, type FileTreeEntry, type ImageBlock, type ImageCreateResponse, type ImageGetResponse, type ImageListResponse, type ImageNamespace, type ImageRecord, type ImageUpdateResponse, type InstanceCreateResponse, type InstanceGetResponse, type InstanceInfo, type InstanceListResponse, type LLMNamespace, type LLMProviderCreateResponse, type LLMProviderDefaultResponse, type LLMProviderGetResponse, type LLMProviderListResponse, type LLMProviderUpdateResponse, type MaybeAsync, type MessageSendResponse, type OS, type OSState, type PlatformConfig, Presentation, type PresentationMetrics, type PresentationNamespace, type PresentationOS, type PresentationOptions, type PresentationState, type RuntimeNamespace, type ServeConfig, type SessionNamespace, type TextBlock, type ThinkingBlock, type ToolBlock, type UserConversation, addUserConversation, createAgentX, createInitialState, initialMetrics, initialPresentationState, messagesToConversations, presentationReducer };
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
RpcHandlerRegistry,
|
|
3
3
|
registerAll
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-TKYJYJS5.js";
|
|
5
5
|
|
|
6
6
|
// src/index.ts
|
|
7
7
|
import { createAgentXRuntime } from "@agentxjs/core/runtime";
|
|
@@ -301,7 +301,7 @@ var initialPresentationState = {
|
|
|
301
301
|
status: "idle",
|
|
302
302
|
connection: "connected",
|
|
303
303
|
metrics: initialMetrics,
|
|
304
|
-
|
|
304
|
+
os: null
|
|
305
305
|
};
|
|
306
306
|
|
|
307
307
|
// src/presentation/reducer.ts
|
|
@@ -584,7 +584,7 @@ function handleRewind(state, data) {
|
|
|
584
584
|
function handleWorkspaceTree(state, data) {
|
|
585
585
|
return {
|
|
586
586
|
...state,
|
|
587
|
-
|
|
587
|
+
os: { files: data.files }
|
|
588
588
|
};
|
|
589
589
|
}
|
|
590
590
|
function addUserConversation(state, content) {
|
|
@@ -746,19 +746,19 @@ var Presentation = class {
|
|
|
746
746
|
_listeners = /* @__PURE__ */ new Set();
|
|
747
747
|
_legacyHandlers = /* @__PURE__ */ new Set();
|
|
748
748
|
_eventUnsubscribe = null;
|
|
749
|
-
|
|
750
|
-
constructor(agentx, instanceId, options, initialConversations,
|
|
749
|
+
_osOps;
|
|
750
|
+
constructor(agentx, instanceId, options, initialConversations, os) {
|
|
751
751
|
this._agentx = agentx;
|
|
752
752
|
this._instanceId = instanceId;
|
|
753
|
-
this.
|
|
753
|
+
this._osOps = os ?? null;
|
|
754
754
|
this._state = initialConversations?.length ? { ...initialPresentationState, conversations: initialConversations } : createInitialState();
|
|
755
755
|
if (options?.onUpdate) {
|
|
756
756
|
this._legacyHandlers.add(options.onUpdate);
|
|
757
757
|
}
|
|
758
758
|
this._subscribeToEvents();
|
|
759
|
-
if (this.
|
|
760
|
-
this.
|
|
761
|
-
this._state = { ...this._state,
|
|
759
|
+
if (this._osOps) {
|
|
760
|
+
this._osOps.list(".").then((files) => {
|
|
761
|
+
this._state = { ...this._state, os: { files } };
|
|
762
762
|
this._notify();
|
|
763
763
|
});
|
|
764
764
|
}
|
|
@@ -780,14 +780,14 @@ var Presentation = class {
|
|
|
780
780
|
get metrics() {
|
|
781
781
|
return this._state.metrics;
|
|
782
782
|
}
|
|
783
|
-
/**
|
|
784
|
-
get
|
|
785
|
-
if (!this.
|
|
786
|
-
const ops = this.
|
|
787
|
-
const
|
|
783
|
+
/** OS — file tree + operations. null if agent has no OS. */
|
|
784
|
+
get os() {
|
|
785
|
+
if (!this._osOps) return null;
|
|
786
|
+
const ops = this._osOps;
|
|
787
|
+
const osState = this._state.os;
|
|
788
788
|
return {
|
|
789
789
|
get files() {
|
|
790
|
-
return
|
|
790
|
+
return osState?.files ?? [];
|
|
791
791
|
},
|
|
792
792
|
read: (path) => ops.read(path),
|
|
793
793
|
write: (path, content) => ops.write(path, content),
|
|
@@ -916,7 +916,7 @@ var Presentation = class {
|
|
|
916
916
|
};
|
|
917
917
|
|
|
918
918
|
// src/namespaces/presentations.ts
|
|
919
|
-
function createPresentations(agentx, sessionNs,
|
|
919
|
+
function createPresentations(agentx, sessionNs, osResolver) {
|
|
920
920
|
const instances = /* @__PURE__ */ new Map();
|
|
921
921
|
return {
|
|
922
922
|
async create(imageId, options) {
|
|
@@ -926,10 +926,10 @@ function createPresentations(agentx, sessionNs, workspaceResolver) {
|
|
|
926
926
|
if (options?.onError) existing.onError(options.onError);
|
|
927
927
|
return existing;
|
|
928
928
|
}
|
|
929
|
-
const
|
|
929
|
+
const os = osResolver ? await osResolver(imageId) : null;
|
|
930
930
|
const messages = await sessionNs.getMessages(imageId);
|
|
931
931
|
const conversations = messagesToConversations(messages);
|
|
932
|
-
const presentation = new Presentation(agentx, imageId, options, conversations,
|
|
932
|
+
const presentation = new Presentation(agentx, imageId, options, conversations, os);
|
|
933
933
|
instances.set(imageId, presentation);
|
|
934
934
|
const originalDispose = presentation.dispose.bind(presentation);
|
|
935
935
|
presentation.dispose = () => {
|
|
@@ -1029,22 +1029,22 @@ var LocalClient = class {
|
|
|
1029
1029
|
const image = createLocalImages(platform, agentxRuntime);
|
|
1030
1030
|
const session = createLocalSessions(agentxRuntime);
|
|
1031
1031
|
const llm = createLocalLLM(platform);
|
|
1032
|
-
const
|
|
1033
|
-
const
|
|
1034
|
-
if (!
|
|
1032
|
+
const osResolver = async (imageId) => {
|
|
1033
|
+
const op = platform.osProvider;
|
|
1034
|
+
if (!op) return null;
|
|
1035
1035
|
const img = await platform.imageRepository.findImageById(imageId);
|
|
1036
|
-
if (!img?.
|
|
1037
|
-
const
|
|
1036
|
+
if (!img?.osId) return null;
|
|
1037
|
+
const os = await op.create(img.osId);
|
|
1038
1038
|
return {
|
|
1039
|
-
read: (path) =>
|
|
1040
|
-
write: (path, content) =>
|
|
1039
|
+
read: (path) => os.fs.read(path),
|
|
1040
|
+
write: (path, content) => os.fs.write(path, content),
|
|
1041
1041
|
list: async (path) => {
|
|
1042
|
-
const entries = await
|
|
1042
|
+
const entries = await os.fs.list(path);
|
|
1043
1043
|
return entries.map((e) => ({ name: e.name, path: e.path, type: e.type }));
|
|
1044
1044
|
}
|
|
1045
1045
|
};
|
|
1046
1046
|
};
|
|
1047
|
-
const present = createPresentations(this, session,
|
|
1047
|
+
const present = createPresentations(this, session, osResolver);
|
|
1048
1048
|
this.runtime = { image, session, present, llm };
|
|
1049
1049
|
this.provider = llm;
|
|
1050
1050
|
this.chat = this.createChatNamespace();
|
|
@@ -1373,7 +1373,7 @@ function createAgentX(config) {
|
|
|
1373
1373
|
"serve() requires platform.channelServer. Ensure your platform supports server mode."
|
|
1374
1374
|
);
|
|
1375
1375
|
}
|
|
1376
|
-
const { createServer } = await import("./server-
|
|
1376
|
+
const { createServer } = await import("./server-N3SRHICW.js");
|
|
1377
1377
|
return createServer({
|
|
1378
1378
|
platform: config.platform,
|
|
1379
1379
|
createDriver: config.createDriver,
|