agentxjs 2.3.1 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -34
- package/dist/{chunk-X44CQZPK.js → chunk-7GW66EMD.js} +6 -4
- package/dist/chunk-7GW66EMD.js.map +1 -0
- package/dist/index.d.ts +123 -38
- package/dist/index.js +133 -46
- package/dist/index.js.map +1 -1
- package/dist/server-55XTEGMF.js +7 -0
- package/package.json +3 -3
- package/src/AgentHandle.ts +65 -0
- package/src/CommandHandler.ts +14 -7
- package/src/LocalClient.ts +58 -17
- package/src/RemoteClient.ts +60 -19
- package/src/index.ts +13 -20
- package/src/namespaces/presentations.ts +11 -6
- package/src/presentation/Presentation.ts +2 -2
- package/src/types.ts +146 -37
- package/dist/chunk-X44CQZPK.js.map +0 -1
- package/dist/server-BWI5JE4B.js +0 -7
- /package/dist/{server-BWI5JE4B.js.map → server-55XTEGMF.js.map} +0 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/LocalClient.ts","../src/namespaces/agents.ts","../src/namespaces/containers.ts","../src/namespaces/images.ts","../src/namespaces/llm.ts","../src/presentation/types.ts","../src/presentation/reducer.ts","../src/presentation/Presentation.ts","../src/namespaces/presentations.ts","../src/namespaces/sessions.ts","../src/RemoteClient.ts"],"sourcesContent":["/**\n * agentxjs - AgentX Client SDK\n *\n * Fluent API supporting local, remote, and server modes.\n *\n * @example Local mode\n * ```typescript\n * import { createAgentX } from \"agentxjs\";\n * import { nodePlatform } from \"@agentxjs/node-platform\";\n *\n * const ax = createAgentX(nodePlatform({ createDriver }));\n * await ax.agent.create({ imageId: \"...\" });\n * ```\n *\n * @example Remote mode\n * ```typescript\n * const ax = createAgentX();\n * const client = await ax.connect(\"ws://localhost:5200\");\n * ```\n *\n * @example Server mode\n * ```typescript\n * const ax = createAgentX(nodePlatform({ createDriver }));\n * const server = await ax.serve({ port: 5200 });\n * ```\n */\n\nimport type { CreateDriver } from \"@agentxjs/core/driver\";\nimport type { AgentXPlatform } from \"@agentxjs/core/runtime\";\nimport { createAgentXRuntime } from \"@agentxjs/core/runtime\";\nimport { LocalClient } from \"./LocalClient\";\nimport { RemoteClient } from \"./RemoteClient\";\nimport type { AgentX, AgentXBuilder, AgentXServer, ConnectOptions, ServeConfig } from \"./types\";\n\n/**\n * Platform configuration for createAgentX\n */\nexport interface PlatformConfig {\n platform: AgentXPlatform;\n createDriver: CreateDriver;\n}\n\n/**\n * Create an AgentX builder\n *\n * @param config - Platform configuration (optional). Without it, only connect() is available.\n * @returns AgentXBuilder — local AgentX + connect() + serve()\n */\nexport function createAgentX(config?: PlatformConfig): AgentXBuilder {\n let localClient: LocalClient | null = null;\n\n function getLocalClient(): LocalClient {\n if (localClient) return localClient;\n if (!config) {\n throw new Error(\n \"Local mode requires a platform. Pass a PlatformConfig to createAgentX(), or use connect() for remote mode.\"\n );\n }\n const runtime = createAgentXRuntime(config.platform, config.createDriver);\n localClient = new LocalClient(runtime);\n return localClient;\n }\n\n if (config) {\n getLocalClient();\n }\n\n return {\n get connected() {\n return localClient?.connected ?? false;\n },\n\n get events() {\n return getLocalClient().events;\n },\n\n get container() {\n return getLocalClient().container;\n },\n\n get image() {\n return getLocalClient().image;\n },\n\n get agent() {\n return getLocalClient().agent;\n },\n\n get session() {\n return getLocalClient().session;\n },\n\n get presentation() {\n return getLocalClient().presentation;\n },\n\n get llm() {\n return getLocalClient().llm;\n },\n\n on(type, handler) {\n return getLocalClient().on(type, handler);\n },\n\n onAny(handler) {\n return getLocalClient().onAny(handler);\n },\n\n subscribe(sessionId) {\n getLocalClient().subscribe(sessionId);\n },\n\n onError(handler) {\n return getLocalClient().onError(handler);\n },\n\n async disconnect() {\n await localClient?.disconnect();\n },\n\n async dispose() {\n await localClient?.dispose();\n localClient = null;\n },\n\n async connect(serverUrl: string, options?: ConnectOptions): Promise<AgentX> {\n const remoteClient = new RemoteClient({\n serverUrl,\n headers: options?.headers as Record<string, string> | undefined,\n context: options?.context,\n timeout: options?.timeout,\n autoReconnect: options?.autoReconnect,\n customPlatform: config?.platform,\n });\n await remoteClient.connect();\n return remoteClient;\n },\n\n async serve(serveConfig?: ServeConfig): Promise<AgentXServer> {\n if (!config) {\n throw new Error(\"serve() requires a platform. Pass a PlatformConfig to createAgentX().\");\n }\n if (!config.platform.channelServer) {\n throw new Error(\n \"serve() requires platform.channelServer. Ensure your platform supports server mode.\"\n );\n }\n\n const { createServer } = await import(\"./server\");\n return createServer({\n platform: config.platform,\n createDriver: config.createDriver,\n port: serveConfig?.port,\n host: serveConfig?.host,\n server: serveConfig?.server as any,\n wsPath: serveConfig?.wsPath,\n });\n },\n\n async rpc<T = unknown>(method: string, params?: unknown): Promise<T> {\n return getLocalClient().rpc<T>(method, params);\n },\n };\n}\n\nexport type { AgentXErrorCategory, AgentXErrorContext } from \"@agentxjs/core/error\";\n// Re-export error types\nexport { AgentXError, AgentXErrorCode } from \"@agentxjs/core/error\";\n// Re-export server\nexport { CommandHandler } from \"./CommandHandler\";\n// Re-export Presentation types and classes\nexport type {\n AssistantConversation,\n Block,\n Conversation,\n ErrorConversation,\n ImageBlock,\n PresentationErrorHandler,\n PresentationOptions,\n PresentationState,\n PresentationUpdateHandler,\n TextBlock,\n ToolBlock,\n UserConversation,\n} from \"./presentation\";\nexport {\n addUserConversation,\n createInitialState,\n initialPresentationState,\n messagesToConversations,\n Presentation,\n presentationReducer,\n} from \"./presentation\";\nexport { createServer, type ServerConfig } from \"./server\";\n// Re-export types\nexport type {\n AgentCreateResponse,\n AgentGetResponse,\n AgentInfo,\n AgentListResponse,\n AgentNamespace,\n AgentX,\n AgentXBuilder,\n AgentXServer,\n BaseResponse,\n ConnectOptions,\n ContainerCreateResponse,\n ContainerGetResponse,\n ContainerInfo,\n ContainerListResponse,\n ContainerNamespace,\n ImageCreateResponse,\n ImageGetResponse,\n ImageListResponse,\n ImageNamespace,\n ImageRecord,\n LLMNamespace,\n LLMProviderCreateResponse,\n LLMProviderDefaultResponse,\n LLMProviderGetResponse,\n LLMProviderListResponse,\n LLMProviderUpdateResponse,\n MaybeAsync,\n MessageSendResponse,\n PresentationNamespace,\n ServeConfig,\n SessionNamespace,\n} from \"./types\";\n","/**\n * LocalClient - AgentX client for local mode\n *\n * Runs an embedded Runtime + Driver directly, without WebSocket.\n * Implements the same AgentX interface as RemoteClient.\n */\n\nimport type { AgentXError } from \"@agentxjs/core/error\";\nimport type { BusEvent, BusEventHandler, EventBus, Unsubscribe } from \"@agentxjs/core/event\";\nimport type { RpcMethod } from \"@agentxjs/core/network\";\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport { createLogger } from \"commonxjs/logger\";\nimport { CommandHandler } from \"./CommandHandler\";\nimport { createLocalAgents } from \"./namespaces/agents\";\nimport { createLocalContainers } from \"./namespaces/containers\";\nimport { createLocalImages } from \"./namespaces/images\";\nimport { createLocalLLM } from \"./namespaces/llm\";\nimport { createPresentations } from \"./namespaces/presentations\";\nimport { createLocalSessions } from \"./namespaces/sessions\";\nimport type {\n AgentNamespace,\n AgentX,\n ContainerNamespace,\n ImageNamespace,\n LLMNamespace,\n PresentationNamespace,\n SessionNamespace,\n} from \"./types\";\n\nconst logger = createLogger(\"agentx/LocalClient\");\n\n/**\n * LocalClient - Embedded runtime implementation\n */\nexport class LocalClient implements AgentX {\n private readonly runtime: AgentXRuntime;\n private commandHandler: CommandHandler | null = null;\n private isDisposed = false;\n\n readonly container: ContainerNamespace;\n readonly image: ImageNamespace;\n readonly agent: AgentNamespace;\n readonly session: SessionNamespace;\n readonly presentation: PresentationNamespace;\n readonly llm: LLMNamespace;\n\n constructor(runtime: AgentXRuntime) {\n this.runtime = runtime;\n const platform = runtime.platform;\n\n this.container = createLocalContainers(platform);\n this.image = createLocalImages(platform);\n this.agent = createLocalAgents(runtime);\n this.session = createLocalSessions(runtime);\n this.presentation = createPresentations(this);\n this.llm = createLocalLLM(platform);\n\n logger.info(\"LocalClient initialized\");\n }\n\n // ==================== Properties ====================\n\n get connected(): boolean {\n return !this.isDisposed;\n }\n\n get events(): EventBus {\n return this.runtime.platform.eventBus;\n }\n\n // ==================== Event Subscription ====================\n\n on<T extends string>(type: T, handler: BusEventHandler<BusEvent & { type: T }>): Unsubscribe {\n return this.runtime.platform.eventBus.on(type, handler);\n }\n\n onAny(handler: BusEventHandler): Unsubscribe {\n return this.runtime.platform.eventBus.onAny(handler);\n }\n\n subscribe(_sessionId: string): void {\n // No-op for local mode - already subscribed via eventBus\n }\n\n // ==================== Error Handling ====================\n\n onError(handler: (error: AgentXError) => void): Unsubscribe {\n return this.runtime.platform.eventBus.on(\"agentx_error\", (event) => {\n handler(event.data as AgentXError);\n });\n }\n\n // ==================== RPC ====================\n\n async rpc<T = unknown>(method: string, params?: unknown): Promise<T> {\n if (!this.commandHandler) {\n this.commandHandler = new CommandHandler(this.runtime);\n }\n const result = await this.commandHandler.handle(method as RpcMethod, params);\n if (result.success) {\n return result.data as T;\n }\n throw new Error(result.message);\n }\n\n // ==================== Lifecycle ====================\n\n async disconnect(): Promise<void> {\n // No-op for local mode\n }\n\n async dispose(): Promise<void> {\n if (this.isDisposed) return;\n await this.runtime.shutdown();\n this.isDisposed = true;\n logger.info(\"LocalClient disposed\");\n }\n}\n","/**\n * Agent namespace factories\n */\n\nimport type { RpcClient, RpcMethod } from \"@agentxjs/core/network\";\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport type {\n AgentCreateResponse,\n AgentGetResponse,\n AgentListResponse,\n AgentNamespace,\n BaseResponse,\n} from \"../types\";\n\n/**\n * Create local agent namespace backed by embedded runtime\n */\nexport function createLocalAgents(runtime: AgentXRuntime): AgentNamespace {\n return {\n async create(params: { imageId: string; agentId?: string }): Promise<AgentCreateResponse> {\n // Reuse existing running agent for this image\n const existingAgent = runtime\n .getAgents()\n .find((a) => a.imageId === params.imageId && a.lifecycle === \"running\");\n\n if (existingAgent) {\n return {\n agentId: existingAgent.agentId,\n imageId: existingAgent.imageId,\n containerId: existingAgent.containerId,\n sessionId: existingAgent.sessionId,\n requestId: \"\",\n };\n }\n\n const agent = await runtime.createAgent({\n imageId: params.imageId,\n agentId: params.agentId,\n });\n\n return {\n agentId: agent.agentId,\n imageId: agent.imageId,\n containerId: agent.containerId,\n sessionId: agent.sessionId,\n requestId: \"\",\n };\n },\n\n async get(agentId: string): Promise<AgentGetResponse> {\n const agent = runtime.getAgent(agentId);\n return {\n agent: agent\n ? {\n agentId: agent.agentId,\n imageId: agent.imageId,\n containerId: agent.containerId,\n sessionId: agent.sessionId,\n lifecycle: agent.lifecycle,\n }\n : null,\n exists: !!agent,\n requestId: \"\",\n };\n },\n\n async list(containerId?: string): Promise<AgentListResponse> {\n const agents = containerId ? runtime.getAgentsByContainer(containerId) : runtime.getAgents();\n\n return {\n agents: agents.map((a) => ({\n agentId: a.agentId,\n imageId: a.imageId,\n containerId: a.containerId,\n sessionId: a.sessionId,\n lifecycle: a.lifecycle,\n })),\n requestId: \"\",\n };\n },\n\n async destroy(agentId: string): Promise<BaseResponse> {\n const agent = runtime.getAgent(agentId);\n if (agent) {\n await runtime.destroyAgent(agentId);\n }\n return { requestId: \"\" };\n },\n };\n}\n\n/**\n * Create remote agent namespace backed by RPC client\n */\nexport function createRemoteAgents(rpcClient: RpcClient): AgentNamespace {\n return {\n async create(params: { imageId: string; agentId?: string }): Promise<AgentCreateResponse> {\n // Agent creation via image.run RPC\n const result = await rpcClient.call<AgentCreateResponse>(\"image.run\" as RpcMethod, {\n imageId: params.imageId,\n agentId: params.agentId,\n });\n return { ...result, requestId: \"\" };\n },\n\n async get(agentId: string): Promise<AgentGetResponse> {\n const result = await rpcClient.call<AgentGetResponse>(\"agent.get\", { agentId });\n return { ...result, requestId: \"\" };\n },\n\n async list(containerId?: string): Promise<AgentListResponse> {\n const result = await rpcClient.call<AgentListResponse>(\"agent.list\", { containerId });\n return { ...result, requestId: \"\" };\n },\n\n async destroy(agentId: string): Promise<BaseResponse> {\n const result = await rpcClient.call<BaseResponse>(\"agent.destroy\", { agentId });\n return { ...result, requestId: \"\" };\n },\n };\n}\n","/**\n * Container namespace factories\n */\n\nimport type { RpcClient } from \"@agentxjs/core/network\";\nimport type { AgentXPlatform } from \"@agentxjs/core/runtime\";\nimport type {\n ContainerCreateResponse,\n ContainerGetResponse,\n ContainerListResponse,\n ContainerNamespace,\n} from \"../types\";\n\n/**\n * Create local container namespace backed by embedded runtime\n */\nexport function createLocalContainers(platform: AgentXPlatform): ContainerNamespace {\n return {\n async create(containerId: string): Promise<ContainerCreateResponse> {\n const { getOrCreateContainer } = await import(\"@agentxjs/core/container\");\n const { containerRepository, imageRepository, sessionRepository } = platform;\n\n const container = await getOrCreateContainer(containerId, {\n containerRepository,\n imageRepository,\n sessionRepository,\n });\n\n return { containerId: container.containerId, requestId: \"\" };\n },\n\n async get(containerId: string): Promise<ContainerGetResponse> {\n const exists = await platform.containerRepository.containerExists(containerId);\n return { containerId, exists, requestId: \"\" };\n },\n\n async list(): Promise<ContainerListResponse> {\n const containers = await platform.containerRepository.findAllContainers();\n return { containerIds: containers.map((c) => c.containerId), requestId: \"\" };\n },\n };\n}\n\n/**\n * Create remote container namespace backed by RPC client\n */\nexport function createRemoteContainers(rpcClient: RpcClient): ContainerNamespace {\n return {\n async create(containerId: string): Promise<ContainerCreateResponse> {\n const result = await rpcClient.call<ContainerCreateResponse>(\"container.create\", {\n containerId,\n });\n return { ...result, requestId: \"\" };\n },\n\n async get(containerId: string): Promise<ContainerGetResponse> {\n const result = await rpcClient.call<ContainerGetResponse>(\"container.get\", {\n containerId,\n });\n return { ...result, requestId: \"\" };\n },\n\n async list(): Promise<ContainerListResponse> {\n const result = await rpcClient.call<ContainerListResponse>(\"container.list\", {});\n return { ...result, requestId: \"\" };\n },\n };\n}\n","/**\n * Image namespace factories\n */\n\nimport type { Message } from \"@agentxjs/core/agent\";\nimport type { RpcClient } from \"@agentxjs/core/network\";\nimport type { AgentXPlatform } from \"@agentxjs/core/runtime\";\nimport type {\n BaseResponse,\n ImageCreateResponse,\n ImageGetResponse,\n ImageListResponse,\n ImageNamespace,\n ImageUpdateResponse,\n} from \"../types\";\n\n/**\n * Create local image namespace backed by embedded runtime\n */\nexport function createLocalImages(platform: AgentXPlatform): ImageNamespace {\n return {\n async create(params: {\n containerId: string;\n name?: string;\n description?: string;\n systemPrompt?: string;\n mcpServers?: Record<string, unknown>;\n customData?: Record<string, unknown>;\n }): Promise<ImageCreateResponse> {\n const { imageRepository, sessionRepository } = platform;\n const { createImage } = await import(\"@agentxjs/core/image\");\n\n const image = await createImage(\n {\n containerId: params.containerId,\n name: params.name,\n description: params.description,\n systemPrompt: params.systemPrompt,\n mcpServers: params.mcpServers as any,\n customData: params.customData,\n },\n { imageRepository, sessionRepository }\n );\n\n return {\n record: image.toRecord(),\n __subscriptions: [image.sessionId],\n requestId: \"\",\n };\n },\n\n async get(imageId: string): Promise<ImageGetResponse> {\n const record = await platform.imageRepository.findImageById(imageId);\n return {\n record,\n __subscriptions: record?.sessionId ? [record.sessionId] : undefined,\n requestId: \"\",\n };\n },\n\n async list(containerId?: string): Promise<ImageListResponse> {\n const records = containerId\n ? await platform.imageRepository.findImagesByContainerId(containerId)\n : await platform.imageRepository.findAllImages();\n\n return {\n records,\n __subscriptions: records.map((r) => r.sessionId),\n requestId: \"\",\n };\n },\n\n async update(\n imageId: string,\n updates: {\n name?: string;\n description?: string;\n customData?: Record<string, unknown>;\n }\n ): Promise<ImageUpdateResponse> {\n const { loadImage } = await import(\"@agentxjs/core/image\");\n const { imageRepository, sessionRepository } = platform;\n\n const image = await loadImage(imageId, { imageRepository, sessionRepository });\n if (!image) {\n throw new Error(`Image not found: ${imageId}`);\n }\n\n const updated = await image.update(updates);\n return { record: updated.toRecord(), requestId: \"\" };\n },\n\n async delete(imageId: string): Promise<BaseResponse> {\n const { loadImage } = await import(\"@agentxjs/core/image\");\n const { imageRepository, sessionRepository } = platform;\n\n const image = await loadImage(imageId, { imageRepository, sessionRepository });\n if (image) {\n await image.delete();\n }\n\n return { requestId: \"\" };\n },\n\n async getMessages(imageId: string): Promise<Message[]> {\n const imageRecord = await platform.imageRepository.findImageById(imageId);\n if (!imageRecord) return [];\n return platform.sessionRepository.getMessages(imageRecord.sessionId);\n },\n };\n}\n\n/**\n * Create remote image namespace backed by RPC client\n */\nexport function createRemoteImages(\n rpcClient: RpcClient,\n subscribeFn: (sessionId: string) => void\n): ImageNamespace {\n return {\n async create(params: {\n containerId: string;\n name?: string;\n description?: string;\n systemPrompt?: string;\n mcpServers?: Record<string, unknown>;\n customData?: Record<string, unknown>;\n }): Promise<ImageCreateResponse> {\n const result = await rpcClient.call<ImageCreateResponse>(\"image.create\", params);\n\n // Auto subscribe to session events\n if (result.__subscriptions) {\n for (const sessionId of result.__subscriptions) {\n subscribeFn(sessionId);\n }\n }\n\n return { ...result, requestId: \"\" };\n },\n\n async get(imageId: string): Promise<ImageGetResponse> {\n const result = await rpcClient.call<ImageGetResponse>(\"image.get\", { imageId });\n\n // Auto subscribe\n if (result.__subscriptions) {\n for (const sessionId of result.__subscriptions) {\n subscribeFn(sessionId);\n }\n }\n\n return { ...result, requestId: \"\" };\n },\n\n async list(containerId?: string): Promise<ImageListResponse> {\n const result = await rpcClient.call<ImageListResponse>(\"image.list\", { containerId });\n\n // Auto subscribe\n if (result.__subscriptions) {\n for (const sessionId of result.__subscriptions) {\n subscribeFn(sessionId);\n }\n }\n\n return { ...result, requestId: \"\" };\n },\n\n async update(\n imageId: string,\n updates: {\n name?: string;\n description?: string;\n customData?: Record<string, unknown>;\n }\n ): Promise<ImageUpdateResponse> {\n const result = await rpcClient.call<ImageUpdateResponse>(\"image.update\", {\n imageId,\n updates,\n });\n return { ...result, requestId: \"\" };\n },\n\n async delete(imageId: string): Promise<BaseResponse> {\n const result = await rpcClient.call<BaseResponse>(\"image.delete\", { imageId });\n return { ...result, requestId: \"\" };\n },\n\n async getMessages(imageId: string): Promise<Message[]> {\n const result = await rpcClient.call<{ messages: Message[] }>(\"image.messages\", { imageId });\n return result.messages ?? [];\n },\n };\n}\n","/**\n * LLM Provider namespace factories\n */\n\nimport type { RpcClient } from \"@agentxjs/core/network\";\nimport type { LLMProviderRecord } from \"@agentxjs/core/persistence\";\nimport type { AgentXPlatform } from \"@agentxjs/core/runtime\";\nimport { generateId } from \"@deepracticex/id\";\nimport type {\n BaseResponse,\n LLMNamespace,\n LLMProviderCreateResponse,\n LLMProviderDefaultResponse,\n LLMProviderGetResponse,\n LLMProviderListResponse,\n LLMProviderUpdateResponse,\n} from \"../types\";\n\n/**\n * Create local LLM namespace backed by platform repository\n */\nexport function createLocalLLM(platform: AgentXPlatform): LLMNamespace {\n const repo = platform.llmProviderRepository;\n if (!repo) {\n throw new Error(\"LLM provider repository not available on this platform\");\n }\n\n return {\n async create(params): Promise<LLMProviderCreateResponse> {\n const now = Date.now();\n const record: LLMProviderRecord = {\n id: generateId(\"llm\"),\n containerId: params.containerId,\n name: params.name,\n vendor: params.vendor,\n protocol: params.protocol,\n apiKey: params.apiKey,\n baseUrl: params.baseUrl,\n model: params.model,\n isDefault: false,\n createdAt: now,\n updatedAt: now,\n };\n\n await repo.saveLLMProvider(record);\n return { record, requestId: \"\" };\n },\n\n async get(id: string): Promise<LLMProviderGetResponse> {\n const record = await repo.findLLMProviderById(id);\n return { record, requestId: \"\" };\n },\n\n async list(containerId: string): Promise<LLMProviderListResponse> {\n const records = await repo.findLLMProvidersByContainerId(containerId);\n return { records, requestId: \"\" };\n },\n\n async update(id, updates): Promise<LLMProviderUpdateResponse> {\n const existing = await repo.findLLMProviderById(id);\n if (!existing) {\n throw new Error(`LLM provider not found: ${id}`);\n }\n\n const updated: LLMProviderRecord = {\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 { record: updated, requestId: \"\" };\n },\n\n async delete(id: string): Promise<BaseResponse> {\n await repo.deleteLLMProvider(id);\n return { requestId: \"\" };\n },\n\n async setDefault(id: string): Promise<BaseResponse> {\n await repo.setDefaultLLMProvider(id);\n return { requestId: \"\" };\n },\n\n async getDefault(containerId: string): Promise<LLMProviderDefaultResponse> {\n const record = await repo.findDefaultLLMProvider(containerId);\n return { record, requestId: \"\" };\n },\n };\n}\n\n/**\n * Create remote LLM namespace backed by RPC client\n */\nexport function createRemoteLLM(rpcClient: RpcClient): LLMNamespace {\n return {\n async create(params): Promise<LLMProviderCreateResponse> {\n const result = await rpcClient.call<LLMProviderCreateResponse>(\"llm.create\", params);\n return { ...result, requestId: \"\" };\n },\n\n async get(id: string): Promise<LLMProviderGetResponse> {\n const result = await rpcClient.call<LLMProviderGetResponse>(\"llm.get\", { id });\n return { ...result, requestId: \"\" };\n },\n\n async list(containerId: string): Promise<LLMProviderListResponse> {\n const result = await rpcClient.call<LLMProviderListResponse>(\"llm.list\", { containerId });\n return { ...result, requestId: \"\" };\n },\n\n async update(id, updates): Promise<LLMProviderUpdateResponse> {\n const result = await rpcClient.call<LLMProviderUpdateResponse>(\"llm.update\", {\n id,\n updates,\n });\n return { ...result, requestId: \"\" };\n },\n\n async delete(id: string): Promise<BaseResponse> {\n const result = await rpcClient.call<BaseResponse>(\"llm.delete\", { id });\n return { ...result, requestId: \"\" };\n },\n\n async setDefault(id: string): Promise<BaseResponse> {\n const result = await rpcClient.call<BaseResponse>(\"llm.default\", { id });\n return { ...result, requestId: \"\" };\n },\n\n async getDefault(containerId: string): Promise<LLMProviderDefaultResponse> {\n const result = await rpcClient.call<LLMProviderDefaultResponse>(\"llm.default\", {\n containerId,\n });\n return { ...result, requestId: \"\" };\n },\n };\n}\n","/**\n * Presentation Types\n *\n * UI-friendly data model aggregated from stream events.\n * This implements the Presentation Model pattern.\n */\n\n// ============================================================================\n// Block Types - Basic content units\n// ============================================================================\n\n/**\n * Text block\n */\nexport interface TextBlock {\n type: \"text\";\n content: string;\n}\n\n/**\n * Tool block - represents a tool call and its result\n */\nexport interface ToolBlock {\n type: \"tool\";\n toolUseId: string;\n toolName: string;\n toolInput: Record<string, unknown>;\n toolResult?: string;\n status: \"pending\" | \"running\" | \"completed\" | \"error\";\n}\n\n/**\n * Image block\n */\nexport interface ImageBlock {\n type: \"image\";\n url: string;\n alt?: string;\n}\n\n/**\n * All block types\n */\nexport type Block = TextBlock | ToolBlock | ImageBlock;\n\n// ============================================================================\n// Conversation Types - A single turn in the conversation\n// ============================================================================\n\n/**\n * User conversation\n */\nexport interface UserConversation {\n role: \"user\";\n blocks: Block[];\n}\n\n/**\n * Token usage for a message (one LLM call / step)\n */\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n}\n\n/**\n * Assistant conversation\n */\nexport interface AssistantConversation {\n role: \"assistant\";\n blocks: Block[];\n isStreaming: boolean;\n /** Accumulated token usage across all steps in this conversation */\n usage?: TokenUsage;\n}\n\n/**\n * Error conversation\n */\nexport interface ErrorConversation {\n role: \"error\";\n message: string;\n}\n\n/**\n * All conversation types\n */\nexport type Conversation = UserConversation | AssistantConversation | ErrorConversation;\n\n// ============================================================================\n// Presentation State\n// ============================================================================\n\n/**\n * Presentation state - the complete UI state\n */\nexport interface PresentationState {\n /**\n * All completed conversations\n */\n conversations: Conversation[];\n\n /**\n * Current streaming conversation (null if not streaming)\n */\n streaming: AssistantConversation | null;\n\n /**\n * Current status\n */\n status: \"idle\" | \"thinking\" | \"responding\" | \"executing\";\n}\n\n/**\n * Initial presentation state\n */\nexport const initialPresentationState: PresentationState = {\n conversations: [],\n streaming: null,\n status: \"idle\",\n};\n","/**\n * Presentation Reducer\n *\n * Aggregates events into PresentationState.\n * Pure function: (state, event) => newState\n *\n * Event consumption strategy:\n * - Stream layer: message_start, text_delta, tool_use_start, tool_use_stop, message_stop\n * (for real-time streaming display)\n * - Message layer: tool_result_message\n * (for tool execution results — arrives after message_stop)\n *\n * Tool calls are stream-level blocks within the assistant turn,\n * matching the mainstream API pattern (Anthropic, OpenAI).\n */\n\nimport type {\n AssistantMessage,\n ErrorMessage,\n Message,\n ToolCallPart,\n ToolResultMessage,\n ToolResultOutput,\n UserMessage,\n} from \"@agentxjs/core/agent\";\nimport type { BusEvent } from \"@agentxjs/core/event\";\nimport type {\n AssistantConversation,\n Block,\n Conversation,\n PresentationState,\n TextBlock,\n TokenUsage,\n ToolBlock,\n} from \"./types\";\nimport { initialPresentationState } from \"./types\";\n\n// ============================================================================\n// Event Data Types\n// ============================================================================\n\ninterface MessageStartData {\n messageId?: string;\n model?: string;\n}\n\ninterface TextDeltaData {\n text: string;\n}\n\ninterface ToolUseStartData {\n toolCallId: string;\n toolName: string;\n}\n\ninterface ToolUseStopData {\n toolCallId: string;\n toolName: string;\n input: Record<string, unknown>;\n}\n\ninterface MessageDeltaData {\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n}\n\ninterface MessageStopData {\n stopReason?: string;\n}\n\ninterface ErrorData {\n message: string;\n code?: string;\n}\n\n// ============================================================================\n// Reducer\n// ============================================================================\n\n/**\n * Reduce an event into presentation state.\n *\n * Consumes:\n * - Stream events: message_start, text_delta, tool_use_start, tool_use_stop, message_stop\n * - Message events: tool_result_message\n * - Error events: error\n */\nexport function presentationReducer(state: PresentationState, event: BusEvent): PresentationState {\n switch (event.type) {\n // Stream layer — real-time display\n case \"message_start\":\n return handleMessageStart(state, event.data as MessageStartData);\n\n case \"text_delta\":\n return handleTextDelta(state, event.data as TextDeltaData);\n\n case \"tool_use_start\":\n return handleToolUseStart(state, event.data as ToolUseStartData);\n\n case \"tool_use_stop\":\n return handleToolUseStop(state, event.data as ToolUseStopData);\n\n case \"message_delta\":\n return handleMessageDelta(state, event.data as MessageDeltaData);\n\n case \"message_stop\":\n return handleMessageStop(state, event.data as MessageStopData);\n\n // Message layer — tool results from Engine\n case \"tool_result_message\":\n return handleToolResultMessage(state, event.data as ToolResultMessage);\n\n case \"error\":\n return handleError(state, event.data as ErrorData);\n\n default:\n return state;\n }\n}\n\n// ============================================================================\n// Handlers\n// ============================================================================\n\nfunction handleMessageStart(state: PresentationState, _data: MessageStartData): PresentationState {\n // If streaming already exists (e.g. tool_use turn not yet flushed), flush it first\n let conversations = state.conversations;\n if (state.streaming && state.streaming.blocks.length > 0) {\n conversations = [...conversations, { ...state.streaming, isStreaming: false }];\n }\n\n const streaming: AssistantConversation = {\n role: \"assistant\",\n blocks: [],\n isStreaming: true,\n };\n\n return {\n ...state,\n conversations,\n streaming,\n status: \"thinking\",\n };\n}\n\nfunction handleTextDelta(state: PresentationState, data: TextDeltaData): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n const blocks = [...state.streaming.blocks];\n const lastBlock = blocks[blocks.length - 1];\n\n if (lastBlock && lastBlock.type === \"text\") {\n blocks[blocks.length - 1] = {\n ...lastBlock,\n content: lastBlock.content + data.text,\n };\n } else {\n blocks.push({\n type: \"text\",\n content: data.text,\n } as TextBlock);\n }\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n blocks,\n },\n status: \"responding\",\n };\n}\n\nfunction handleToolUseStart(state: PresentationState, data: ToolUseStartData): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n // Create a pending tool block — toolInput will be filled by tool_use_stop\n const toolBlock: ToolBlock = {\n type: \"tool\",\n toolUseId: data.toolCallId,\n toolName: data.toolName,\n toolInput: {},\n status: \"pending\",\n };\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n blocks: [...state.streaming.blocks, toolBlock],\n },\n status: \"executing\",\n };\n}\n\n/**\n * Handle tool_use_stop from stream layer.\n * Fills in the complete toolInput for the matching pending tool block.\n * The stream event carries the fully assembled input.\n */\nfunction handleToolUseStop(state: PresentationState, data: ToolUseStopData): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n const blocks = state.streaming.blocks.map((block): Block => {\n if (block.type === \"tool\" && block.toolUseId === data.toolCallId) {\n return {\n ...block,\n toolInput: data.input,\n status: \"running\",\n };\n }\n return block;\n });\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n blocks,\n },\n };\n}\n\nfunction handleMessageDelta(state: PresentationState, data: MessageDeltaData): PresentationState {\n if (!state.streaming || !data.usage) {\n return state;\n }\n\n const prev = state.streaming.usage;\n const usage: TokenUsage = {\n inputTokens: (prev?.inputTokens ?? 0) + data.usage.inputTokens,\n outputTokens: (prev?.outputTokens ?? 0) + data.usage.outputTokens,\n };\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n usage,\n },\n };\n}\n\nfunction handleMessageStop(state: PresentationState, data: MessageStopData): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n // tool_use stop → don't flush, tool results are still incoming\n if (data.stopReason === \"tool_use\") {\n return {\n ...state,\n status: \"executing\",\n };\n }\n\n // end_turn / max_tokens / etc → flush streaming to conversations\n const completedConversation: AssistantConversation = {\n ...state.streaming,\n isStreaming: false,\n };\n\n return {\n ...state,\n conversations: [...state.conversations, completedConversation],\n streaming: null,\n status: \"idle\",\n };\n}\n\n/**\n * Handle tool_result_message from Engine layer.\n * Fills in the toolResult for the matching tool block.\n *\n * Note: tool_result_message arrives after message_stop(tool_use),\n * but streaming is kept alive (not flushed) during tool_use turns.\n */\nfunction handleToolResultMessage(\n state: PresentationState,\n data: ToolResultMessage\n): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n const toolCallId = data.toolCallId;\n const blocks = state.streaming.blocks.map((block): Block => {\n if (block.type === \"tool\" && block.toolUseId === toolCallId) {\n return {\n ...block,\n toolResult: formatToolResultOutput(data.toolResult.output),\n status:\n data.toolResult.output.type === \"error-text\" ||\n data.toolResult.output.type === \"error-json\" ||\n data.toolResult.output.type === \"execution-denied\"\n ? \"error\"\n : \"completed\",\n };\n }\n return block;\n });\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n blocks,\n },\n status: \"responding\",\n };\n}\n\nfunction handleError(state: PresentationState, data: ErrorData): PresentationState {\n return {\n ...state,\n conversations: [\n ...state.conversations,\n {\n role: \"error\",\n message: data.message,\n },\n ],\n streaming: null,\n status: \"idle\",\n };\n}\n\n// ============================================================================\n// Helper: Add user conversation\n// ============================================================================\n\nexport function addUserConversation(state: PresentationState, content: string): PresentationState {\n return {\n ...state,\n conversations: [\n ...state.conversations,\n {\n role: \"user\",\n blocks: [{ type: \"text\", content }],\n },\n ],\n };\n}\n\nexport function createInitialState(): PresentationState {\n return { ...initialPresentationState };\n}\n\n// ============================================================================\n// Helper: Format tool result output\n// ============================================================================\n\nfunction formatToolResultOutput(output: ToolResultOutput): string {\n switch (output.type) {\n case \"text\":\n case \"error-text\":\n return output.value;\n case \"json\":\n case \"error-json\":\n return JSON.stringify(output.value);\n case \"execution-denied\":\n return output.reason ?? \"Execution denied\";\n case \"content\":\n return output.value\n .filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n }\n}\n\n// ============================================================================\n// Message → Conversation Converter\n// ============================================================================\n\n/**\n * Convert persisted Messages to Presentation Conversations.\n *\n * Groups consecutive assistant + tool-result messages\n * into a single AssistantConversation.\n *\n * Tool calls are now part of AssistantMessage.content (as ToolCallPart),\n * so we extract them directly from the assistant message.\n */\nexport function messagesToConversations(messages: Message[]): Conversation[] {\n const conversations: Conversation[] = [];\n let currentAssistant: AssistantConversation | null = null;\n\n function flushAssistant() {\n if (currentAssistant && currentAssistant.blocks.length > 0) {\n conversations.push(currentAssistant);\n }\n currentAssistant = null;\n }\n\n for (const msg of messages) {\n switch (msg.subtype) {\n case \"user\": {\n flushAssistant();\n const m = msg as UserMessage;\n const text =\n typeof m.content === \"string\"\n ? m.content\n : m.content\n .filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n conversations.push({\n role: \"user\",\n blocks: [{ type: \"text\", content: text }],\n });\n break;\n }\n\n case \"assistant\": {\n if (!currentAssistant) {\n currentAssistant = { role: \"assistant\", blocks: [], isStreaming: false };\n }\n const m = msg as AssistantMessage;\n if (typeof m.content === \"string\") {\n if (m.content) {\n currentAssistant.blocks.push({ type: \"text\", content: m.content } as TextBlock);\n }\n } else {\n // Extract text and tool call parts from content\n for (const part of m.content) {\n if (part.type === \"text\") {\n if (part.text) {\n currentAssistant.blocks.push({ type: \"text\", content: part.text } as TextBlock);\n }\n } else if (part.type === \"tool-call\") {\n const tc = part as ToolCallPart;\n currentAssistant.blocks.push({\n type: \"tool\",\n toolUseId: tc.id,\n toolName: tc.name,\n toolInput: tc.input,\n status: \"completed\",\n } as ToolBlock);\n }\n }\n }\n break;\n }\n\n case \"tool-result\": {\n const m = msg as ToolResultMessage;\n if (currentAssistant) {\n for (const block of currentAssistant.blocks) {\n if (block.type === \"tool\" && block.toolUseId === m.toolResult.id) {\n block.toolResult = formatToolResultOutput(m.toolResult.output);\n block.status =\n m.toolResult.output.type === \"error-text\" ||\n m.toolResult.output.type === \"error-json\" ||\n m.toolResult.output.type === \"execution-denied\"\n ? \"error\"\n : \"completed\";\n break;\n }\n }\n }\n break;\n }\n\n case \"error\": {\n flushAssistant();\n const m = msg as ErrorMessage;\n conversations.push({\n role: \"error\",\n message: m.content,\n });\n break;\n }\n }\n }\n\n flushAssistant();\n return conversations;\n}\n","/**\n * Presentation Class\n *\n * High-level API for UI integration.\n * Wraps AgentX client and provides presentation state management.\n */\n\nimport type { BusEvent, Unsubscribe } from \"@agentxjs/core/event\";\nimport type { AgentX } from \"../types\";\nimport { addUserConversation, createInitialState, presentationReducer } from \"./reducer\";\nimport type { Conversation, PresentationState } from \"./types\";\nimport { initialPresentationState } from \"./types\";\n\n/**\n * Presentation update handler\n */\nexport type PresentationUpdateHandler = (state: PresentationState) => void;\n\n/**\n * Presentation error handler\n */\nexport type PresentationErrorHandler = (error: Error) => void;\n\n/**\n * Presentation options\n */\nexport interface PresentationOptions {\n /**\n * Called on every state update\n */\n onUpdate?: PresentationUpdateHandler;\n\n /**\n * Called on errors\n */\n onError?: PresentationErrorHandler;\n}\n\n/**\n * Presentation - UI-friendly wrapper for AgentX\n */\nexport class Presentation {\n private agentx: AgentX;\n private agentId: string;\n private state: PresentationState;\n private updateHandlers: Set<PresentationUpdateHandler> = new Set();\n private errorHandlers: Set<PresentationErrorHandler> = new Set();\n private eventUnsubscribe: Unsubscribe | null = null;\n\n constructor(\n agentx: AgentX,\n agentId: string,\n options?: PresentationOptions,\n initialConversations?: Conversation[]\n ) {\n this.agentx = agentx;\n this.agentId = agentId;\n this.state = initialConversations?.length\n ? { ...initialPresentationState, conversations: initialConversations }\n : createInitialState();\n\n // Register initial handlers\n if (options?.onUpdate) {\n this.updateHandlers.add(options.onUpdate);\n }\n if (options?.onError) {\n this.errorHandlers.add(options.onError);\n }\n\n // Subscribe to all events\n this.subscribeToEvents();\n }\n\n /**\n * Get current state\n */\n getState(): PresentationState {\n return this.state;\n }\n\n /**\n * Subscribe to state updates\n */\n onUpdate(handler: PresentationUpdateHandler): Unsubscribe {\n this.updateHandlers.add(handler);\n // Immediately call with current state\n handler(this.state);\n return () => {\n this.updateHandlers.delete(handler);\n };\n }\n\n /**\n * Subscribe to errors\n */\n onError(handler: PresentationErrorHandler): Unsubscribe {\n this.errorHandlers.add(handler);\n return () => {\n this.errorHandlers.delete(handler);\n };\n }\n\n /**\n * Send a message\n */\n async send(content: string): Promise<void> {\n // Add user conversation\n this.state = addUserConversation(this.state, content);\n this.notify();\n\n try {\n // Send message via agentx\n await this.agentx.session.send(this.agentId, content);\n } catch (error) {\n this.notifyError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n /**\n * Interrupt current response\n */\n async interrupt(): Promise<void> {\n try {\n await this.agentx.session.interrupt(this.agentId);\n } catch (error) {\n this.notifyError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n /**\n * Reset state\n */\n reset(): void {\n this.state = createInitialState();\n this.notify();\n }\n\n /**\n * Dispose and cleanup\n */\n dispose(): void {\n if (this.eventUnsubscribe) {\n this.eventUnsubscribe();\n this.eventUnsubscribe = null;\n }\n this.updateHandlers.clear();\n this.errorHandlers.clear();\n }\n\n // ==================== Private ====================\n\n private subscribeToEvents(): void {\n // Subscribe to all events and filter by agentId\n this.eventUnsubscribe = this.agentx.onAny((event: BusEvent) => {\n // Filter events for this agent (if context is available)\n // Note: Events from server may or may not include context with agentId\n const eventWithContext = event as BusEvent & { context?: { agentId?: string } };\n const eventAgentId = eventWithContext.context?.agentId;\n\n // Only filter if event has agentId and it doesn't match\n if (eventAgentId && eventAgentId !== this.agentId) {\n return;\n }\n\n // Reduce event into state\n const newState = presentationReducer(this.state, event);\n if (newState !== this.state) {\n this.state = newState;\n this.notify();\n }\n });\n }\n\n private notify(): void {\n for (const handler of this.updateHandlers) {\n try {\n handler(this.state);\n } catch (error) {\n console.error(\"Presentation update handler error:\", error);\n }\n }\n }\n\n private notifyError(error: Error): void {\n for (const handler of this.errorHandlers) {\n try {\n handler(error);\n } catch (e) {\n console.error(\"Presentation error handler error:\", e);\n }\n }\n }\n}\n","/**\n * Presentation namespace factory\n *\n * Single factory for both local and remote modes —\n * Presentation only depends on the AgentX interface.\n */\n\nimport { messagesToConversations, Presentation, type PresentationOptions } from \"../presentation\";\nimport type { AgentX, PresentationNamespace } from \"../types\";\n\n/**\n * Create presentation namespace backed by any AgentX client\n */\nexport function createPresentations(agentx: AgentX): PresentationNamespace {\n return {\n async create(agentId: string, options?: PresentationOptions): Promise<Presentation> {\n const messages = await agentx.session.getMessages(agentId);\n const conversations = messagesToConversations(messages);\n return new Presentation(agentx, agentId, options, conversations);\n },\n };\n}\n","/**\n * Session namespace factories (messaging)\n */\n\nimport type { Message, UserContentPart } from \"@agentxjs/core/agent\";\nimport type { RpcClient } from \"@agentxjs/core/network\";\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport type { AgentInfo, BaseResponse, MessageSendResponse, SessionNamespace } from \"../types\";\n\n/**\n * Create local session namespace backed by embedded runtime\n */\nexport function createLocalSessions(runtime: AgentXRuntime): SessionNamespace {\n return {\n async send(agentId: string, content: string | unknown[]): Promise<MessageSendResponse> {\n await runtime.receive(agentId, content as string | UserContentPart[]);\n return { agentId, requestId: \"\" };\n },\n\n async interrupt(agentId: string): Promise<BaseResponse> {\n runtime.interrupt(agentId);\n return { requestId: \"\" };\n },\n\n async getMessages(agentId: string): Promise<Message[]> {\n const agent = runtime.getAgent(agentId);\n if (!agent) return [];\n return runtime.platform.sessionRepository.getMessages(agent.sessionId);\n },\n };\n}\n\n/**\n * Create remote session namespace backed by RPC client\n */\nexport function createRemoteSessions(rpcClient: RpcClient): SessionNamespace {\n return {\n async send(agentId: string, content: string | unknown[]): Promise<MessageSendResponse> {\n const result = await rpcClient.call<MessageSendResponse>(\"message.send\", {\n agentId,\n content,\n });\n return { ...result, requestId: \"\" };\n },\n\n async interrupt(agentId: string): Promise<BaseResponse> {\n const result = await rpcClient.call<BaseResponse>(\"agent.interrupt\", { agentId });\n return { ...result, requestId: \"\" };\n },\n\n async getMessages(agentId: string): Promise<Message[]> {\n const agentRes = await rpcClient.call<{ agent: AgentInfo | null }>(\"agent.get\", { agentId });\n if (!agentRes.agent) return [];\n const msgRes = await rpcClient.call<{ messages: Message[] }>(\"image.messages\", {\n imageId: agentRes.agent.imageId,\n });\n return msgRes.messages ?? [];\n },\n };\n}\n","/**\n * RemoteClient - AgentX client for remote server\n *\n * Uses RpcClient from @agentxjs/core/network for JSON-RPC communication.\n * This class focuses on business logic, not protocol details.\n */\n\nimport type { AgentXError } from \"@agentxjs/core/error\";\nimport type { BusEvent, BusEventHandler, EventBus, Unsubscribe } from \"@agentxjs/core/event\";\nimport { EventBusImpl } from \"@agentxjs/core/event\";\nimport { RpcClient } from \"@agentxjs/core/network\";\nimport { createLogger } from \"commonxjs/logger\";\nimport { createRemoteAgents } from \"./namespaces/agents\";\nimport { createRemoteContainers } from \"./namespaces/containers\";\nimport { createRemoteImages } from \"./namespaces/images\";\nimport { createRemoteLLM } from \"./namespaces/llm\";\nimport { createPresentations } from \"./namespaces/presentations\";\nimport { createRemoteSessions } from \"./namespaces/sessions\";\nimport type {\n AgentNamespace,\n AgentX,\n ContainerNamespace,\n ImageNamespace,\n LLMNamespace,\n PresentationNamespace,\n RemoteClientConfig,\n SessionNamespace,\n} from \"./types\";\n\nconst logger = createLogger(\"agentx/RemoteClient\");\n\n/**\n * RemoteClient implementation using JSON-RPC 2.0\n */\nexport class RemoteClient implements AgentX {\n private readonly config: RemoteClientConfig;\n private readonly eventBus: EventBus;\n private readonly rpcClient: RpcClient;\n\n readonly container: ContainerNamespace;\n readonly image: ImageNamespace;\n readonly agent: AgentNamespace;\n readonly session: SessionNamespace;\n readonly presentation: PresentationNamespace;\n readonly llm: LLMNamespace;\n\n constructor(config: RemoteClientConfig) {\n this.config = config;\n this.eventBus = new EventBusImpl();\n\n // Create RPC client (WebSocket factory from platform if available)\n this.rpcClient = new RpcClient({\n url: config.serverUrl,\n createWebSocket: config.customPlatform?.channelClient,\n timeout: config.timeout ?? 30000,\n autoReconnect: config.autoReconnect ?? true,\n headers: config.headers as Record<string, string> | undefined,\n debug: false,\n });\n\n // Forward stream events to internal event bus\n this.rpcClient.onStreamEvent((topic, event) => {\n logger.debug(\"Received stream event\", { topic, type: event.type });\n this.eventBus.emit(event as BusEvent);\n });\n\n // Assemble namespaces\n this.container = createRemoteContainers(this.rpcClient);\n this.image = createRemoteImages(this.rpcClient, (sessionId) => this.subscribe(sessionId));\n this.agent = createRemoteAgents(this.rpcClient);\n this.session = createRemoteSessions(this.rpcClient);\n this.presentation = createPresentations(this);\n this.llm = createRemoteLLM(this.rpcClient);\n }\n\n // ==================== Properties ====================\n\n get connected(): boolean {\n return this.rpcClient.connected;\n }\n\n get events(): EventBus {\n return this.eventBus;\n }\n\n // ==================== Connection ====================\n\n async connect(): Promise<void> {\n await this.rpcClient.connect();\n logger.info(\"Connected to server\", { url: this.config.serverUrl });\n }\n\n async disconnect(): Promise<void> {\n this.rpcClient.disconnect();\n logger.info(\"Disconnected from server\");\n }\n\n async dispose(): Promise<void> {\n this.rpcClient.dispose();\n this.eventBus.destroy();\n logger.info(\"RemoteClient disposed\");\n }\n\n // ==================== Event Subscription ====================\n\n on<T extends string>(type: T, handler: BusEventHandler<BusEvent & { type: T }>): Unsubscribe {\n return this.eventBus.on(type, handler);\n }\n\n onAny(handler: BusEventHandler): Unsubscribe {\n return this.eventBus.onAny(handler);\n }\n\n subscribe(sessionId: string): void {\n this.rpcClient.subscribe(sessionId);\n logger.debug(\"Subscribed to session\", { sessionId });\n }\n\n // ==================== Error Handling ====================\n\n onError(handler: (error: AgentXError) => void): Unsubscribe {\n return this.eventBus.on(\"agentx_error\", (event) => {\n handler(event.data as AgentXError);\n });\n }\n\n // ==================== RPC ====================\n\n async rpc<T = unknown>(method: string, params?: unknown): Promise<T> {\n return this.rpcClient.call<T>(method, params);\n }\n}\n"],"mappings":"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","names":["createLogger","logger","createLogger","createServer"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/LocalClient.ts","../src/AgentHandle.ts","../src/namespaces/agents.ts","../src/namespaces/containers.ts","../src/namespaces/images.ts","../src/namespaces/llm.ts","../src/presentation/types.ts","../src/presentation/reducer.ts","../src/presentation/Presentation.ts","../src/namespaces/presentations.ts","../src/namespaces/sessions.ts","../src/RemoteClient.ts"],"sourcesContent":["/**\n * agentxjs - AgentX Client SDK\n *\n * Fluent API supporting local, remote, and server modes.\n *\n * @example Local mode\n * ```typescript\n * import { createAgentX } from \"agentxjs\";\n * import { nodePlatform } from \"@agentxjs/node-platform\";\n *\n * const ax = createAgentX(nodePlatform({ createDriver }));\n * const agent = await ax.create({ name: \"Aristotle\", embody: { model: \"claude-sonnet-4-6\" } });\n * await agent.send(\"Hello!\");\n * ```\n *\n * @example Remote mode\n * ```typescript\n * const ax = createAgentX();\n * const client = await ax.connect(\"ws://localhost:5200\");\n * ```\n *\n * @example Server mode\n * ```typescript\n * const ax = createAgentX(nodePlatform({ createDriver }));\n * const server = await ax.serve({ port: 5200 });\n * ```\n */\n\nimport type { CreateDriver } from \"@agentxjs/core/driver\";\nimport type { AgentXPlatform } from \"@agentxjs/core/runtime\";\nimport { createAgentXRuntime } from \"@agentxjs/core/runtime\";\nimport { LocalClient } from \"./LocalClient\";\nimport { RemoteClient } from \"./RemoteClient\";\nimport type { AgentX, AgentXBuilder, AgentXServer, ConnectOptions, ServeConfig } from \"./types\";\n\n/**\n * Platform configuration for createAgentX\n */\nexport interface PlatformConfig {\n platform: AgentXPlatform;\n createDriver: CreateDriver;\n}\n\n/**\n * Create an AgentX builder\n *\n * @param config - Platform configuration (optional). Without it, only connect() is available.\n * @returns AgentXBuilder — local AgentX + connect() + serve()\n */\nexport function createAgentX(config?: PlatformConfig): AgentXBuilder {\n let localClient: LocalClient | null = null;\n\n function getLocalClient(): LocalClient {\n if (localClient) return localClient;\n if (!config) {\n throw new Error(\n \"Local mode requires a platform. Pass a PlatformConfig to createAgentX(), or use connect() for remote mode.\"\n );\n }\n const runtime = createAgentXRuntime(config.platform, config.createDriver);\n localClient = new LocalClient(runtime);\n return localClient;\n }\n\n if (config) {\n getLocalClient();\n }\n\n return {\n get connected() {\n return localClient?.connected ?? false;\n },\n\n get events() {\n return getLocalClient().events;\n },\n\n get instance() {\n return getLocalClient().instance;\n },\n\n get provider() {\n return getLocalClient().provider;\n },\n\n // Top-level Agent API\n create: (params) => getLocalClient().create(params),\n list: () => getLocalClient().list(),\n get: (agentId) => getLocalClient().get(agentId),\n\n on(type, handler) {\n return getLocalClient().on(type, handler);\n },\n\n onAny(handler) {\n return getLocalClient().onAny(handler);\n },\n\n subscribe(sessionId) {\n getLocalClient().subscribe(sessionId);\n },\n\n onError(handler) {\n return getLocalClient().onError(handler);\n },\n\n async disconnect() {\n await localClient?.disconnect();\n },\n\n async dispose() {\n await localClient?.dispose();\n localClient = null;\n },\n\n async connect(serverUrl: string, options?: ConnectOptions): Promise<AgentX> {\n const remoteClient = new RemoteClient({\n serverUrl,\n headers: options?.headers as Record<string, string> | undefined,\n context: options?.context,\n timeout: options?.timeout,\n autoReconnect: options?.autoReconnect,\n customPlatform: config?.platform,\n });\n await remoteClient.connect();\n return remoteClient;\n },\n\n async serve(serveConfig?: ServeConfig): Promise<AgentXServer> {\n if (!config) {\n throw new Error(\"serve() requires a platform. Pass a PlatformConfig to createAgentX().\");\n }\n if (!config.platform.channelServer) {\n throw new Error(\n \"serve() requires platform.channelServer. Ensure your platform supports server mode.\"\n );\n }\n\n const { createServer } = await import(\"./server\");\n return createServer({\n platform: config.platform,\n createDriver: config.createDriver,\n port: serveConfig?.port,\n host: serveConfig?.host,\n server: serveConfig?.server as any,\n wsPath: serveConfig?.wsPath,\n });\n },\n\n async rpc<T = unknown>(method: string, params?: unknown): Promise<T> {\n return getLocalClient().rpc<T>(method, params);\n },\n };\n}\n\nexport type { AgentXErrorCategory, AgentXErrorContext } from \"@agentxjs/core/error\";\n// Re-export error types\nexport { AgentXError, AgentXErrorCode } from \"@agentxjs/core/error\";\n// Re-export server\nexport { CommandHandler } from \"./CommandHandler\";\n// Re-export Presentation types and classes\nexport type {\n AssistantConversation,\n Block,\n Conversation,\n ErrorConversation,\n ImageBlock,\n PresentationErrorHandler,\n PresentationOptions,\n PresentationState,\n PresentationUpdateHandler,\n TextBlock,\n ToolBlock,\n UserConversation,\n} from \"./presentation\";\nexport {\n addUserConversation,\n createInitialState,\n initialPresentationState,\n messagesToConversations,\n Presentation,\n presentationReducer,\n} from \"./presentation\";\nexport { createServer, type ServerConfig } from \"./server\";\n// Re-export types\nexport type {\n AgentCreateResponse,\n AgentGetResponse,\n AgentHandle,\n AgentInfo,\n AgentListResponse,\n AgentNamespace,\n AgentX,\n AgentXBuilder,\n AgentXServer,\n BaseResponse,\n ConnectOptions,\n ContainerCreateResponse,\n ContainerGetResponse,\n ContainerInfo,\n ContainerListResponse,\n ContainerNamespace,\n Embodiment,\n ImageCreateResponse,\n ImageGetResponse,\n ImageListResponse,\n ImageNamespace,\n ImageRecord,\n InstanceNamespace,\n LLMNamespace,\n LLMProviderCreateResponse,\n LLMProviderDefaultResponse,\n LLMProviderGetResponse,\n LLMProviderListResponse,\n LLMProviderUpdateResponse,\n MaybeAsync,\n MessageSendResponse,\n PresentationNamespace,\n ServeConfig,\n SessionNamespace,\n} from \"./types\";\n","/**\n * LocalClient - AgentX client for local mode\n *\n * Runs an embedded Runtime + Driver directly, without WebSocket.\n * Implements the same AgentX interface as RemoteClient.\n */\n\nimport type { AgentXError } from \"@agentxjs/core/error\";\nimport type { BusEvent, BusEventHandler, EventBus, Unsubscribe } from \"@agentxjs/core/event\";\nimport type { RpcMethod } from \"@agentxjs/core/network\";\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport { createLogger } from \"commonxjs/logger\";\nimport { AgentHandleImpl } from \"./AgentHandle\";\nimport { CommandHandler } from \"./CommandHandler\";\nimport { createLocalAgents } from \"./namespaces/agents\";\nimport { createLocalContainers } from \"./namespaces/containers\";\nimport { createLocalImages } from \"./namespaces/images\";\nimport { createLocalLLM } from \"./namespaces/llm\";\nimport { createPresentations } from \"./namespaces/presentations\";\nimport { createLocalSessions } from \"./namespaces/sessions\";\nimport type {\n AgentHandle,\n AgentX,\n Embodiment,\n ImageListResponse,\n InstanceNamespace,\n LLMNamespace,\n} from \"./types\";\n\nconst logger = createLogger(\"agentx/LocalClient\");\n\n/**\n * LocalClient - Embedded runtime implementation\n */\nexport class LocalClient implements AgentX {\n private readonly runtime: AgentXRuntime;\n private commandHandler: CommandHandler | null = null;\n private isDisposed = false;\n\n readonly instance: InstanceNamespace;\n readonly provider: LLMNamespace;\n\n constructor(runtime: AgentXRuntime) {\n this.runtime = runtime;\n const platform = runtime.platform;\n\n const container = createLocalContainers(platform);\n const image = createLocalImages(platform);\n const agent = createLocalAgents(runtime);\n const session = createLocalSessions(runtime);\n const llm = createLocalLLM(platform);\n const present = createPresentations(this, image);\n\n this.instance = { container, image, agent, session, present, llm };\n this.provider = llm;\n\n logger.info(\"LocalClient initialized\");\n }\n\n // ==================== Properties ====================\n\n get connected(): boolean {\n return !this.isDisposed;\n }\n\n get events(): EventBus {\n return this.runtime.platform.eventBus;\n }\n\n // ==================== Top-level Agent API ====================\n\n async create(params: {\n name?: string;\n description?: string;\n contextId?: string;\n embody?: Embodiment;\n customData?: Record<string, unknown>;\n }): Promise<AgentHandle> {\n const containerId = \"default\";\n const imgRes = await this.instance.image.create({ containerId, ...params });\n const agentRes = await this.instance.agent.create({ imageId: imgRes.record.imageId });\n return new AgentHandleImpl(\n {\n agentId: agentRes.agentId,\n imageId: agentRes.imageId,\n containerId: agentRes.containerId,\n sessionId: agentRes.sessionId,\n },\n this.instance\n );\n }\n\n async list(): Promise<ImageListResponse> {\n return this.instance.image.list();\n }\n\n async get(agentId: string): Promise<AgentHandle | null> {\n const res = await this.instance.image.get(agentId);\n if (!res.record) return null;\n const r = res.record;\n return new AgentHandleImpl(\n {\n agentId: r.imageId,\n imageId: r.imageId,\n containerId: r.containerId,\n sessionId: r.sessionId,\n },\n this.instance\n );\n }\n\n // ==================== Event Subscription ====================\n\n on<T extends string>(type: T, handler: BusEventHandler<BusEvent & { type: T }>): Unsubscribe {\n return this.runtime.platform.eventBus.on(type, handler);\n }\n\n onAny(handler: BusEventHandler): Unsubscribe {\n return this.runtime.platform.eventBus.onAny(handler);\n }\n\n subscribe(_sessionId: string): void {\n // No-op for local mode - already subscribed via eventBus\n }\n\n // ==================== Error Handling ====================\n\n onError(handler: (error: AgentXError) => void): Unsubscribe {\n return this.runtime.platform.eventBus.on(\"agentx_error\", (event) => {\n handler(event.data as AgentXError);\n });\n }\n\n // ==================== RPC ====================\n\n async rpc<T = unknown>(method: string, params?: unknown): Promise<T> {\n if (!this.commandHandler) {\n this.commandHandler = new CommandHandler(this.runtime);\n }\n const result = await this.commandHandler.handle(method as RpcMethod, params);\n if (result.success) {\n return result.data as T;\n }\n throw new Error(result.message);\n }\n\n // ==================== Lifecycle ====================\n\n async disconnect(): Promise<void> {\n // No-op for local mode\n }\n\n async dispose(): Promise<void> {\n if (this.isDisposed) return;\n await this.runtime.shutdown();\n this.isDisposed = true;\n logger.info(\"LocalClient disposed\");\n }\n}\n","/**\n * AgentHandle — live reference to a created agent.\n *\n * Wraps identity (IDs) + delegates operations to instance namespaces.\n */\n\nimport type { Message } from \"@agentxjs/core/agent\";\nimport type { Presentation, PresentationOptions } from \"./presentation\";\nimport type {\n AgentHandle,\n BaseResponse,\n Embodiment,\n InstanceNamespace,\n MessageSendResponse,\n} from \"./types\";\n\nexport class AgentHandleImpl implements AgentHandle {\n readonly agentId: string;\n readonly imageId: string;\n readonly containerId: string;\n readonly sessionId: string;\n\n private readonly ns: InstanceNamespace;\n\n constructor(\n ids: { agentId: string; imageId: string; containerId: string; sessionId: string },\n ns: InstanceNamespace\n ) {\n this.agentId = ids.agentId;\n this.imageId = ids.imageId;\n this.containerId = ids.containerId;\n this.sessionId = ids.sessionId;\n this.ns = ns;\n }\n\n async send(content: string | unknown[]): Promise<MessageSendResponse> {\n return this.ns.session.send(this.agentId, content);\n }\n\n async interrupt(): Promise<BaseResponse> {\n return this.ns.session.interrupt(this.agentId);\n }\n\n async history(): Promise<Message[]> {\n return this.ns.image.getMessages(this.imageId);\n }\n\n async present(options?: PresentationOptions): Promise<Presentation> {\n return this.ns.present.create(this.agentId, options);\n }\n\n async update(updates: {\n name?: string;\n description?: string;\n embody?: Embodiment;\n customData?: Record<string, unknown>;\n }): Promise<void> {\n await this.ns.image.update(this.imageId, updates);\n }\n\n async delete(): Promise<void> {\n await this.ns.agent.destroy(this.agentId);\n await this.ns.image.delete(this.imageId);\n }\n}\n","/**\n * Agent namespace factories\n */\n\nimport type { RpcClient, RpcMethod } from \"@agentxjs/core/network\";\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport type {\n AgentCreateResponse,\n AgentGetResponse,\n AgentListResponse,\n AgentNamespace,\n BaseResponse,\n} from \"../types\";\n\n/**\n * Create local agent namespace backed by embedded runtime\n */\nexport function createLocalAgents(runtime: AgentXRuntime): AgentNamespace {\n return {\n async create(params: { imageId: string; agentId?: string }): Promise<AgentCreateResponse> {\n // Reuse existing running agent for this image\n const existingAgent = runtime\n .getAgents()\n .find((a) => a.imageId === params.imageId && a.lifecycle === \"running\");\n\n if (existingAgent) {\n return {\n agentId: existingAgent.agentId,\n imageId: existingAgent.imageId,\n containerId: existingAgent.containerId,\n sessionId: existingAgent.sessionId,\n requestId: \"\",\n };\n }\n\n const agent = await runtime.createAgent({\n imageId: params.imageId,\n agentId: params.agentId,\n });\n\n return {\n agentId: agent.agentId,\n imageId: agent.imageId,\n containerId: agent.containerId,\n sessionId: agent.sessionId,\n requestId: \"\",\n };\n },\n\n async get(agentId: string): Promise<AgentGetResponse> {\n const agent = runtime.getAgent(agentId);\n return {\n agent: agent\n ? {\n agentId: agent.agentId,\n imageId: agent.imageId,\n containerId: agent.containerId,\n sessionId: agent.sessionId,\n lifecycle: agent.lifecycle,\n }\n : null,\n exists: !!agent,\n requestId: \"\",\n };\n },\n\n async list(containerId?: string): Promise<AgentListResponse> {\n const agents = containerId ? runtime.getAgentsByContainer(containerId) : runtime.getAgents();\n\n return {\n agents: agents.map((a) => ({\n agentId: a.agentId,\n imageId: a.imageId,\n containerId: a.containerId,\n sessionId: a.sessionId,\n lifecycle: a.lifecycle,\n })),\n requestId: \"\",\n };\n },\n\n async destroy(agentId: string): Promise<BaseResponse> {\n const agent = runtime.getAgent(agentId);\n if (agent) {\n await runtime.destroyAgent(agentId);\n }\n return { requestId: \"\" };\n },\n };\n}\n\n/**\n * Create remote agent namespace backed by RPC client\n */\nexport function createRemoteAgents(rpcClient: RpcClient): AgentNamespace {\n return {\n async create(params: { imageId: string; agentId?: string }): Promise<AgentCreateResponse> {\n // Agent creation via image.run RPC\n const result = await rpcClient.call<AgentCreateResponse>(\"image.run\" as RpcMethod, {\n imageId: params.imageId,\n agentId: params.agentId,\n });\n return { ...result, requestId: \"\" };\n },\n\n async get(agentId: string): Promise<AgentGetResponse> {\n const result = await rpcClient.call<AgentGetResponse>(\"agent.get\", { agentId });\n return { ...result, requestId: \"\" };\n },\n\n async list(containerId?: string): Promise<AgentListResponse> {\n const result = await rpcClient.call<AgentListResponse>(\"agent.list\", { containerId });\n return { ...result, requestId: \"\" };\n },\n\n async destroy(agentId: string): Promise<BaseResponse> {\n const result = await rpcClient.call<BaseResponse>(\"agent.destroy\", { agentId });\n return { ...result, requestId: \"\" };\n },\n };\n}\n","/**\n * Container namespace factories\n */\n\nimport type { RpcClient } from \"@agentxjs/core/network\";\nimport type { AgentXPlatform } from \"@agentxjs/core/runtime\";\nimport type {\n ContainerCreateResponse,\n ContainerGetResponse,\n ContainerListResponse,\n ContainerNamespace,\n} from \"../types\";\n\n/**\n * Create local container namespace backed by embedded runtime\n */\nexport function createLocalContainers(platform: AgentXPlatform): ContainerNamespace {\n return {\n async create(containerId: string): Promise<ContainerCreateResponse> {\n const { getOrCreateContainer } = await import(\"@agentxjs/core/container\");\n const { containerRepository, imageRepository, sessionRepository } = platform;\n\n const container = await getOrCreateContainer(containerId, {\n containerRepository,\n imageRepository,\n sessionRepository,\n });\n\n return { containerId: container.containerId, requestId: \"\" };\n },\n\n async get(containerId: string): Promise<ContainerGetResponse> {\n const exists = await platform.containerRepository.containerExists(containerId);\n return { containerId, exists, requestId: \"\" };\n },\n\n async list(): Promise<ContainerListResponse> {\n const containers = await platform.containerRepository.findAllContainers();\n return { containerIds: containers.map((c) => c.containerId), requestId: \"\" };\n },\n };\n}\n\n/**\n * Create remote container namespace backed by RPC client\n */\nexport function createRemoteContainers(rpcClient: RpcClient): ContainerNamespace {\n return {\n async create(containerId: string): Promise<ContainerCreateResponse> {\n const result = await rpcClient.call<ContainerCreateResponse>(\"container.create\", {\n containerId,\n });\n return { ...result, requestId: \"\" };\n },\n\n async get(containerId: string): Promise<ContainerGetResponse> {\n const result = await rpcClient.call<ContainerGetResponse>(\"container.get\", {\n containerId,\n });\n return { ...result, requestId: \"\" };\n },\n\n async list(): Promise<ContainerListResponse> {\n const result = await rpcClient.call<ContainerListResponse>(\"container.list\", {});\n return { ...result, requestId: \"\" };\n },\n };\n}\n","/**\n * Image namespace factories\n */\n\nimport type { Message } from \"@agentxjs/core/agent\";\nimport type { RpcClient } from \"@agentxjs/core/network\";\nimport type { AgentXPlatform } from \"@agentxjs/core/runtime\";\nimport type {\n BaseResponse,\n ImageCreateResponse,\n ImageGetResponse,\n ImageListResponse,\n ImageNamespace,\n ImageUpdateResponse,\n} from \"../types\";\n\n/**\n * Create local image namespace backed by embedded runtime\n */\nexport function createLocalImages(platform: AgentXPlatform): ImageNamespace {\n return {\n async create(params: {\n containerId: string;\n name?: string;\n description?: string;\n systemPrompt?: string;\n mcpServers?: Record<string, unknown>;\n customData?: Record<string, unknown>;\n }): Promise<ImageCreateResponse> {\n const { imageRepository, sessionRepository } = platform;\n const { createImage } = await import(\"@agentxjs/core/image\");\n\n const image = await createImage(\n {\n containerId: params.containerId,\n name: params.name,\n description: params.description,\n systemPrompt: params.systemPrompt,\n mcpServers: params.mcpServers as any,\n customData: params.customData,\n },\n { imageRepository, sessionRepository }\n );\n\n return {\n record: image.toRecord(),\n __subscriptions: [image.sessionId],\n requestId: \"\",\n };\n },\n\n async get(imageId: string): Promise<ImageGetResponse> {\n const record = await platform.imageRepository.findImageById(imageId);\n return {\n record,\n __subscriptions: record?.sessionId ? [record.sessionId] : undefined,\n requestId: \"\",\n };\n },\n\n async list(containerId?: string): Promise<ImageListResponse> {\n const records = containerId\n ? await platform.imageRepository.findImagesByContainerId(containerId)\n : await platform.imageRepository.findAllImages();\n\n return {\n records,\n __subscriptions: records.map((r) => r.sessionId),\n requestId: \"\",\n };\n },\n\n async update(\n imageId: string,\n updates: {\n name?: string;\n description?: string;\n customData?: Record<string, unknown>;\n }\n ): Promise<ImageUpdateResponse> {\n const { loadImage } = await import(\"@agentxjs/core/image\");\n const { imageRepository, sessionRepository } = platform;\n\n const image = await loadImage(imageId, { imageRepository, sessionRepository });\n if (!image) {\n throw new Error(`Image not found: ${imageId}`);\n }\n\n const updated = await image.update(updates);\n return { record: updated.toRecord(), requestId: \"\" };\n },\n\n async delete(imageId: string): Promise<BaseResponse> {\n const { loadImage } = await import(\"@agentxjs/core/image\");\n const { imageRepository, sessionRepository } = platform;\n\n const image = await loadImage(imageId, { imageRepository, sessionRepository });\n if (image) {\n await image.delete();\n }\n\n return { requestId: \"\" };\n },\n\n async getMessages(imageId: string): Promise<Message[]> {\n const imageRecord = await platform.imageRepository.findImageById(imageId);\n if (!imageRecord) return [];\n return platform.sessionRepository.getMessages(imageRecord.sessionId);\n },\n };\n}\n\n/**\n * Create remote image namespace backed by RPC client\n */\nexport function createRemoteImages(\n rpcClient: RpcClient,\n subscribeFn: (sessionId: string) => void\n): ImageNamespace {\n return {\n async create(params: {\n containerId: string;\n name?: string;\n description?: string;\n systemPrompt?: string;\n mcpServers?: Record<string, unknown>;\n customData?: Record<string, unknown>;\n }): Promise<ImageCreateResponse> {\n const result = await rpcClient.call<ImageCreateResponse>(\"image.create\", params);\n\n // Auto subscribe to session events\n if (result.__subscriptions) {\n for (const sessionId of result.__subscriptions) {\n subscribeFn(sessionId);\n }\n }\n\n return { ...result, requestId: \"\" };\n },\n\n async get(imageId: string): Promise<ImageGetResponse> {\n const result = await rpcClient.call<ImageGetResponse>(\"image.get\", { imageId });\n\n // Auto subscribe\n if (result.__subscriptions) {\n for (const sessionId of result.__subscriptions) {\n subscribeFn(sessionId);\n }\n }\n\n return { ...result, requestId: \"\" };\n },\n\n async list(containerId?: string): Promise<ImageListResponse> {\n const result = await rpcClient.call<ImageListResponse>(\"image.list\", { containerId });\n\n // Auto subscribe\n if (result.__subscriptions) {\n for (const sessionId of result.__subscriptions) {\n subscribeFn(sessionId);\n }\n }\n\n return { ...result, requestId: \"\" };\n },\n\n async update(\n imageId: string,\n updates: {\n name?: string;\n description?: string;\n customData?: Record<string, unknown>;\n }\n ): Promise<ImageUpdateResponse> {\n const result = await rpcClient.call<ImageUpdateResponse>(\"image.update\", {\n imageId,\n updates,\n });\n return { ...result, requestId: \"\" };\n },\n\n async delete(imageId: string): Promise<BaseResponse> {\n const result = await rpcClient.call<BaseResponse>(\"image.delete\", { imageId });\n return { ...result, requestId: \"\" };\n },\n\n async getMessages(imageId: string): Promise<Message[]> {\n const result = await rpcClient.call<{ messages: Message[] }>(\"image.messages\", { imageId });\n return result.messages ?? [];\n },\n };\n}\n","/**\n * LLM Provider namespace factories\n */\n\nimport type { RpcClient } from \"@agentxjs/core/network\";\nimport type { LLMProviderRecord } from \"@agentxjs/core/persistence\";\nimport type { AgentXPlatform } from \"@agentxjs/core/runtime\";\nimport { generateId } from \"@deepracticex/id\";\nimport type {\n BaseResponse,\n LLMNamespace,\n LLMProviderCreateResponse,\n LLMProviderDefaultResponse,\n LLMProviderGetResponse,\n LLMProviderListResponse,\n LLMProviderUpdateResponse,\n} from \"../types\";\n\n/**\n * Create local LLM namespace backed by platform repository\n */\nexport function createLocalLLM(platform: AgentXPlatform): LLMNamespace {\n const repo = platform.llmProviderRepository;\n if (!repo) {\n throw new Error(\"LLM provider repository not available on this platform\");\n }\n\n return {\n async create(params): Promise<LLMProviderCreateResponse> {\n const now = Date.now();\n const record: LLMProviderRecord = {\n id: generateId(\"llm\"),\n containerId: params.containerId,\n name: params.name,\n vendor: params.vendor,\n protocol: params.protocol,\n apiKey: params.apiKey,\n baseUrl: params.baseUrl,\n model: params.model,\n isDefault: false,\n createdAt: now,\n updatedAt: now,\n };\n\n await repo.saveLLMProvider(record);\n return { record, requestId: \"\" };\n },\n\n async get(id: string): Promise<LLMProviderGetResponse> {\n const record = await repo.findLLMProviderById(id);\n return { record, requestId: \"\" };\n },\n\n async list(containerId: string): Promise<LLMProviderListResponse> {\n const records = await repo.findLLMProvidersByContainerId(containerId);\n return { records, requestId: \"\" };\n },\n\n async update(id, updates): Promise<LLMProviderUpdateResponse> {\n const existing = await repo.findLLMProviderById(id);\n if (!existing) {\n throw new Error(`LLM provider not found: ${id}`);\n }\n\n const updated: LLMProviderRecord = {\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 { record: updated, requestId: \"\" };\n },\n\n async delete(id: string): Promise<BaseResponse> {\n await repo.deleteLLMProvider(id);\n return { requestId: \"\" };\n },\n\n async setDefault(id: string): Promise<BaseResponse> {\n await repo.setDefaultLLMProvider(id);\n return { requestId: \"\" };\n },\n\n async getDefault(containerId: string): Promise<LLMProviderDefaultResponse> {\n const record = await repo.findDefaultLLMProvider(containerId);\n return { record, requestId: \"\" };\n },\n };\n}\n\n/**\n * Create remote LLM namespace backed by RPC client\n */\nexport function createRemoteLLM(rpcClient: RpcClient): LLMNamespace {\n return {\n async create(params): Promise<LLMProviderCreateResponse> {\n const result = await rpcClient.call<LLMProviderCreateResponse>(\"llm.create\", params);\n return { ...result, requestId: \"\" };\n },\n\n async get(id: string): Promise<LLMProviderGetResponse> {\n const result = await rpcClient.call<LLMProviderGetResponse>(\"llm.get\", { id });\n return { ...result, requestId: \"\" };\n },\n\n async list(containerId: string): Promise<LLMProviderListResponse> {\n const result = await rpcClient.call<LLMProviderListResponse>(\"llm.list\", { containerId });\n return { ...result, requestId: \"\" };\n },\n\n async update(id, updates): Promise<LLMProviderUpdateResponse> {\n const result = await rpcClient.call<LLMProviderUpdateResponse>(\"llm.update\", {\n id,\n updates,\n });\n return { ...result, requestId: \"\" };\n },\n\n async delete(id: string): Promise<BaseResponse> {\n const result = await rpcClient.call<BaseResponse>(\"llm.delete\", { id });\n return { ...result, requestId: \"\" };\n },\n\n async setDefault(id: string): Promise<BaseResponse> {\n const result = await rpcClient.call<BaseResponse>(\"llm.default\", { id });\n return { ...result, requestId: \"\" };\n },\n\n async getDefault(containerId: string): Promise<LLMProviderDefaultResponse> {\n const result = await rpcClient.call<LLMProviderDefaultResponse>(\"llm.default\", {\n containerId,\n });\n return { ...result, requestId: \"\" };\n },\n };\n}\n","/**\n * Presentation Types\n *\n * UI-friendly data model aggregated from stream events.\n * This implements the Presentation Model pattern.\n */\n\n// ============================================================================\n// Block Types - Basic content units\n// ============================================================================\n\n/**\n * Text block\n */\nexport interface TextBlock {\n type: \"text\";\n content: string;\n}\n\n/**\n * Tool block - represents a tool call and its result\n */\nexport interface ToolBlock {\n type: \"tool\";\n toolUseId: string;\n toolName: string;\n toolInput: Record<string, unknown>;\n toolResult?: string;\n status: \"pending\" | \"running\" | \"completed\" | \"error\";\n}\n\n/**\n * Image block\n */\nexport interface ImageBlock {\n type: \"image\";\n url: string;\n alt?: string;\n}\n\n/**\n * All block types\n */\nexport type Block = TextBlock | ToolBlock | ImageBlock;\n\n// ============================================================================\n// Conversation Types - A single turn in the conversation\n// ============================================================================\n\n/**\n * User conversation\n */\nexport interface UserConversation {\n role: \"user\";\n blocks: Block[];\n}\n\n/**\n * Token usage for a message (one LLM call / step)\n */\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n}\n\n/**\n * Assistant conversation\n */\nexport interface AssistantConversation {\n role: \"assistant\";\n blocks: Block[];\n isStreaming: boolean;\n /** Accumulated token usage across all steps in this conversation */\n usage?: TokenUsage;\n}\n\n/**\n * Error conversation\n */\nexport interface ErrorConversation {\n role: \"error\";\n message: string;\n}\n\n/**\n * All conversation types\n */\nexport type Conversation = UserConversation | AssistantConversation | ErrorConversation;\n\n// ============================================================================\n// Presentation State\n// ============================================================================\n\n/**\n * Presentation state - the complete UI state\n */\nexport interface PresentationState {\n /**\n * All completed conversations\n */\n conversations: Conversation[];\n\n /**\n * Current streaming conversation (null if not streaming)\n */\n streaming: AssistantConversation | null;\n\n /**\n * Current status\n */\n status: \"idle\" | \"thinking\" | \"responding\" | \"executing\";\n}\n\n/**\n * Initial presentation state\n */\nexport const initialPresentationState: PresentationState = {\n conversations: [],\n streaming: null,\n status: \"idle\",\n};\n","/**\n * Presentation Reducer\n *\n * Aggregates events into PresentationState.\n * Pure function: (state, event) => newState\n *\n * Event consumption strategy:\n * - Stream layer: message_start, text_delta, tool_use_start, tool_use_stop, message_stop\n * (for real-time streaming display)\n * - Message layer: tool_result_message\n * (for tool execution results — arrives after message_stop)\n *\n * Tool calls are stream-level blocks within the assistant turn,\n * matching the mainstream API pattern (Anthropic, OpenAI).\n */\n\nimport type {\n AssistantMessage,\n ErrorMessage,\n Message,\n ToolCallPart,\n ToolResultMessage,\n ToolResultOutput,\n UserMessage,\n} from \"@agentxjs/core/agent\";\nimport type { BusEvent } from \"@agentxjs/core/event\";\nimport type {\n AssistantConversation,\n Block,\n Conversation,\n PresentationState,\n TextBlock,\n TokenUsage,\n ToolBlock,\n} from \"./types\";\nimport { initialPresentationState } from \"./types\";\n\n// ============================================================================\n// Event Data Types\n// ============================================================================\n\ninterface MessageStartData {\n messageId?: string;\n model?: string;\n}\n\ninterface TextDeltaData {\n text: string;\n}\n\ninterface ToolUseStartData {\n toolCallId: string;\n toolName: string;\n}\n\ninterface ToolUseStopData {\n toolCallId: string;\n toolName: string;\n input: Record<string, unknown>;\n}\n\ninterface MessageDeltaData {\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n}\n\ninterface MessageStopData {\n stopReason?: string;\n}\n\ninterface ErrorData {\n message: string;\n code?: string;\n}\n\n// ============================================================================\n// Reducer\n// ============================================================================\n\n/**\n * Reduce an event into presentation state.\n *\n * Consumes:\n * - Stream events: message_start, text_delta, tool_use_start, tool_use_stop, message_stop\n * - Message events: tool_result_message\n * - Error events: error\n */\nexport function presentationReducer(state: PresentationState, event: BusEvent): PresentationState {\n switch (event.type) {\n // Stream layer — real-time display\n case \"message_start\":\n return handleMessageStart(state, event.data as MessageStartData);\n\n case \"text_delta\":\n return handleTextDelta(state, event.data as TextDeltaData);\n\n case \"tool_use_start\":\n return handleToolUseStart(state, event.data as ToolUseStartData);\n\n case \"tool_use_stop\":\n return handleToolUseStop(state, event.data as ToolUseStopData);\n\n case \"message_delta\":\n return handleMessageDelta(state, event.data as MessageDeltaData);\n\n case \"message_stop\":\n return handleMessageStop(state, event.data as MessageStopData);\n\n // Message layer — tool results from Engine\n case \"tool_result_message\":\n return handleToolResultMessage(state, event.data as ToolResultMessage);\n\n case \"error\":\n return handleError(state, event.data as ErrorData);\n\n default:\n return state;\n }\n}\n\n// ============================================================================\n// Handlers\n// ============================================================================\n\nfunction handleMessageStart(state: PresentationState, _data: MessageStartData): PresentationState {\n // If streaming already exists (e.g. tool_use turn not yet flushed), flush it first\n let conversations = state.conversations;\n if (state.streaming && state.streaming.blocks.length > 0) {\n conversations = [...conversations, { ...state.streaming, isStreaming: false }];\n }\n\n const streaming: AssistantConversation = {\n role: \"assistant\",\n blocks: [],\n isStreaming: true,\n };\n\n return {\n ...state,\n conversations,\n streaming,\n status: \"thinking\",\n };\n}\n\nfunction handleTextDelta(state: PresentationState, data: TextDeltaData): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n const blocks = [...state.streaming.blocks];\n const lastBlock = blocks[blocks.length - 1];\n\n if (lastBlock && lastBlock.type === \"text\") {\n blocks[blocks.length - 1] = {\n ...lastBlock,\n content: lastBlock.content + data.text,\n };\n } else {\n blocks.push({\n type: \"text\",\n content: data.text,\n } as TextBlock);\n }\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n blocks,\n },\n status: \"responding\",\n };\n}\n\nfunction handleToolUseStart(state: PresentationState, data: ToolUseStartData): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n // Create a pending tool block — toolInput will be filled by tool_use_stop\n const toolBlock: ToolBlock = {\n type: \"tool\",\n toolUseId: data.toolCallId,\n toolName: data.toolName,\n toolInput: {},\n status: \"pending\",\n };\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n blocks: [...state.streaming.blocks, toolBlock],\n },\n status: \"executing\",\n };\n}\n\n/**\n * Handle tool_use_stop from stream layer.\n * Fills in the complete toolInput for the matching pending tool block.\n * The stream event carries the fully assembled input.\n */\nfunction handleToolUseStop(state: PresentationState, data: ToolUseStopData): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n const blocks = state.streaming.blocks.map((block): Block => {\n if (block.type === \"tool\" && block.toolUseId === data.toolCallId) {\n return {\n ...block,\n toolInput: data.input,\n status: \"running\",\n };\n }\n return block;\n });\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n blocks,\n },\n };\n}\n\nfunction handleMessageDelta(state: PresentationState, data: MessageDeltaData): PresentationState {\n if (!state.streaming || !data.usage) {\n return state;\n }\n\n const prev = state.streaming.usage;\n const usage: TokenUsage = {\n inputTokens: (prev?.inputTokens ?? 0) + data.usage.inputTokens,\n outputTokens: (prev?.outputTokens ?? 0) + data.usage.outputTokens,\n };\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n usage,\n },\n };\n}\n\nfunction handleMessageStop(state: PresentationState, data: MessageStopData): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n // tool_use stop → don't flush, tool results are still incoming\n if (data.stopReason === \"tool_use\") {\n return {\n ...state,\n status: \"executing\",\n };\n }\n\n // end_turn / max_tokens / etc → flush streaming to conversations\n const completedConversation: AssistantConversation = {\n ...state.streaming,\n isStreaming: false,\n };\n\n return {\n ...state,\n conversations: [...state.conversations, completedConversation],\n streaming: null,\n status: \"idle\",\n };\n}\n\n/**\n * Handle tool_result_message from Engine layer.\n * Fills in the toolResult for the matching tool block.\n *\n * Note: tool_result_message arrives after message_stop(tool_use),\n * but streaming is kept alive (not flushed) during tool_use turns.\n */\nfunction handleToolResultMessage(\n state: PresentationState,\n data: ToolResultMessage\n): PresentationState {\n if (!state.streaming) {\n return state;\n }\n\n const toolCallId = data.toolCallId;\n const blocks = state.streaming.blocks.map((block): Block => {\n if (block.type === \"tool\" && block.toolUseId === toolCallId) {\n return {\n ...block,\n toolResult: formatToolResultOutput(data.toolResult.output),\n status:\n data.toolResult.output.type === \"error-text\" ||\n data.toolResult.output.type === \"error-json\" ||\n data.toolResult.output.type === \"execution-denied\"\n ? \"error\"\n : \"completed\",\n };\n }\n return block;\n });\n\n return {\n ...state,\n streaming: {\n ...state.streaming,\n blocks,\n },\n status: \"responding\",\n };\n}\n\nfunction handleError(state: PresentationState, data: ErrorData): PresentationState {\n return {\n ...state,\n conversations: [\n ...state.conversations,\n {\n role: \"error\",\n message: data.message,\n },\n ],\n streaming: null,\n status: \"idle\",\n };\n}\n\n// ============================================================================\n// Helper: Add user conversation\n// ============================================================================\n\nexport function addUserConversation(state: PresentationState, content: string): PresentationState {\n return {\n ...state,\n conversations: [\n ...state.conversations,\n {\n role: \"user\",\n blocks: [{ type: \"text\", content }],\n },\n ],\n };\n}\n\nexport function createInitialState(): PresentationState {\n return { ...initialPresentationState };\n}\n\n// ============================================================================\n// Helper: Format tool result output\n// ============================================================================\n\nfunction formatToolResultOutput(output: ToolResultOutput): string {\n switch (output.type) {\n case \"text\":\n case \"error-text\":\n return output.value;\n case \"json\":\n case \"error-json\":\n return JSON.stringify(output.value);\n case \"execution-denied\":\n return output.reason ?? \"Execution denied\";\n case \"content\":\n return output.value\n .filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n }\n}\n\n// ============================================================================\n// Message → Conversation Converter\n// ============================================================================\n\n/**\n * Convert persisted Messages to Presentation Conversations.\n *\n * Groups consecutive assistant + tool-result messages\n * into a single AssistantConversation.\n *\n * Tool calls are now part of AssistantMessage.content (as ToolCallPart),\n * so we extract them directly from the assistant message.\n */\nexport function messagesToConversations(messages: Message[]): Conversation[] {\n const conversations: Conversation[] = [];\n let currentAssistant: AssistantConversation | null = null;\n\n function flushAssistant() {\n if (currentAssistant && currentAssistant.blocks.length > 0) {\n conversations.push(currentAssistant);\n }\n currentAssistant = null;\n }\n\n for (const msg of messages) {\n switch (msg.subtype) {\n case \"user\": {\n flushAssistant();\n const m = msg as UserMessage;\n const text =\n typeof m.content === \"string\"\n ? m.content\n : m.content\n .filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n conversations.push({\n role: \"user\",\n blocks: [{ type: \"text\", content: text }],\n });\n break;\n }\n\n case \"assistant\": {\n if (!currentAssistant) {\n currentAssistant = { role: \"assistant\", blocks: [], isStreaming: false };\n }\n const m = msg as AssistantMessage;\n if (typeof m.content === \"string\") {\n if (m.content) {\n currentAssistant.blocks.push({ type: \"text\", content: m.content } as TextBlock);\n }\n } else {\n // Extract text and tool call parts from content\n for (const part of m.content) {\n if (part.type === \"text\") {\n if (part.text) {\n currentAssistant.blocks.push({ type: \"text\", content: part.text } as TextBlock);\n }\n } else if (part.type === \"tool-call\") {\n const tc = part as ToolCallPart;\n currentAssistant.blocks.push({\n type: \"tool\",\n toolUseId: tc.id,\n toolName: tc.name,\n toolInput: tc.input,\n status: \"completed\",\n } as ToolBlock);\n }\n }\n }\n break;\n }\n\n case \"tool-result\": {\n const m = msg as ToolResultMessage;\n if (currentAssistant) {\n for (const block of currentAssistant.blocks) {\n if (block.type === \"tool\" && block.toolUseId === m.toolResult.id) {\n block.toolResult = formatToolResultOutput(m.toolResult.output);\n block.status =\n m.toolResult.output.type === \"error-text\" ||\n m.toolResult.output.type === \"error-json\" ||\n m.toolResult.output.type === \"execution-denied\"\n ? \"error\"\n : \"completed\";\n break;\n }\n }\n }\n break;\n }\n\n case \"error\": {\n flushAssistant();\n const m = msg as ErrorMessage;\n conversations.push({\n role: \"error\",\n message: m.content,\n });\n break;\n }\n }\n }\n\n flushAssistant();\n return conversations;\n}\n","/**\n * Presentation Class\n *\n * High-level API for UI integration.\n * Wraps AgentX client and provides presentation state management.\n */\n\nimport type { BusEvent, Unsubscribe } from \"@agentxjs/core/event\";\nimport type { AgentX } from \"../types\";\nimport { addUserConversation, createInitialState, presentationReducer } from \"./reducer\";\nimport type { Conversation, PresentationState } from \"./types\";\nimport { initialPresentationState } from \"./types\";\n\n/**\n * Presentation update handler\n */\nexport type PresentationUpdateHandler = (state: PresentationState) => void;\n\n/**\n * Presentation error handler\n */\nexport type PresentationErrorHandler = (error: Error) => void;\n\n/**\n * Presentation options\n */\nexport interface PresentationOptions {\n /**\n * Called on every state update\n */\n onUpdate?: PresentationUpdateHandler;\n\n /**\n * Called on errors\n */\n onError?: PresentationErrorHandler;\n}\n\n/**\n * Presentation - UI-friendly wrapper for AgentX\n */\nexport class Presentation {\n private agentx: AgentX;\n private agentId: string;\n private state: PresentationState;\n private updateHandlers: Set<PresentationUpdateHandler> = new Set();\n private errorHandlers: Set<PresentationErrorHandler> = new Set();\n private eventUnsubscribe: Unsubscribe | null = null;\n\n constructor(\n agentx: AgentX,\n agentId: string,\n options?: PresentationOptions,\n initialConversations?: Conversation[]\n ) {\n this.agentx = agentx;\n this.agentId = agentId;\n this.state = initialConversations?.length\n ? { ...initialPresentationState, conversations: initialConversations }\n : createInitialState();\n\n // Register initial handlers\n if (options?.onUpdate) {\n this.updateHandlers.add(options.onUpdate);\n }\n if (options?.onError) {\n this.errorHandlers.add(options.onError);\n }\n\n // Subscribe to all events\n this.subscribeToEvents();\n }\n\n /**\n * Get current state\n */\n getState(): PresentationState {\n return this.state;\n }\n\n /**\n * Subscribe to state updates\n */\n onUpdate(handler: PresentationUpdateHandler): Unsubscribe {\n this.updateHandlers.add(handler);\n // Immediately call with current state\n handler(this.state);\n return () => {\n this.updateHandlers.delete(handler);\n };\n }\n\n /**\n * Subscribe to errors\n */\n onError(handler: PresentationErrorHandler): Unsubscribe {\n this.errorHandlers.add(handler);\n return () => {\n this.errorHandlers.delete(handler);\n };\n }\n\n /**\n * Send a message\n */\n async send(content: string): Promise<void> {\n // Add user conversation\n this.state = addUserConversation(this.state, content);\n this.notify();\n\n try {\n // Send message via agentx\n await this.agentx.instance.session.send(this.agentId, content);\n } catch (error) {\n this.notifyError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n /**\n * Interrupt current response\n */\n async interrupt(): Promise<void> {\n try {\n await this.agentx.instance.session.interrupt(this.agentId);\n } catch (error) {\n this.notifyError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n /**\n * Reset state\n */\n reset(): void {\n this.state = createInitialState();\n this.notify();\n }\n\n /**\n * Dispose and cleanup\n */\n dispose(): void {\n if (this.eventUnsubscribe) {\n this.eventUnsubscribe();\n this.eventUnsubscribe = null;\n }\n this.updateHandlers.clear();\n this.errorHandlers.clear();\n }\n\n // ==================== Private ====================\n\n private subscribeToEvents(): void {\n // Subscribe to all events and filter by agentId\n this.eventUnsubscribe = this.agentx.onAny((event: BusEvent) => {\n // Filter events for this agent (if context is available)\n // Note: Events from server may or may not include context with agentId\n const eventWithContext = event as BusEvent & { context?: { agentId?: string } };\n const eventAgentId = eventWithContext.context?.agentId;\n\n // Only filter if event has agentId and it doesn't match\n if (eventAgentId && eventAgentId !== this.agentId) {\n return;\n }\n\n // Reduce event into state\n const newState = presentationReducer(this.state, event);\n if (newState !== this.state) {\n this.state = newState;\n this.notify();\n }\n });\n }\n\n private notify(): void {\n for (const handler of this.updateHandlers) {\n try {\n handler(this.state);\n } catch (error) {\n console.error(\"Presentation update handler error:\", error);\n }\n }\n }\n\n private notifyError(error: Error): void {\n for (const handler of this.errorHandlers) {\n try {\n handler(error);\n } catch (e) {\n console.error(\"Presentation error handler error:\", e);\n }\n }\n }\n}\n","/**\n * Presentation namespace factory\n *\n * Single factory for both local and remote modes.\n */\n\nimport { messagesToConversations, Presentation, type PresentationOptions } from \"../presentation\";\nimport type { AgentX, ImageNamespace, PresentationNamespace } from \"../types\";\n\n/**\n * Create presentation namespace.\n *\n * Takes the full AgentX (for Presentation event wiring) and the ImageNamespace\n * (for message history), avoiding circular access to `instance` during construction.\n */\nexport function createPresentations(\n agentx: AgentX,\n imageNs: ImageNamespace\n): PresentationNamespace {\n return {\n async create(agentId: string, options?: PresentationOptions): Promise<Presentation> {\n const messages = await imageNs.getMessages(agentId);\n const conversations = messagesToConversations(messages);\n return new Presentation(agentx, agentId, options, conversations);\n },\n };\n}\n","/**\n * Session namespace factories (messaging)\n */\n\nimport type { Message, UserContentPart } from \"@agentxjs/core/agent\";\nimport type { RpcClient } from \"@agentxjs/core/network\";\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport type { AgentInfo, BaseResponse, MessageSendResponse, SessionNamespace } from \"../types\";\n\n/**\n * Create local session namespace backed by embedded runtime\n */\nexport function createLocalSessions(runtime: AgentXRuntime): SessionNamespace {\n return {\n async send(agentId: string, content: string | unknown[]): Promise<MessageSendResponse> {\n await runtime.receive(agentId, content as string | UserContentPart[]);\n return { agentId, requestId: \"\" };\n },\n\n async interrupt(agentId: string): Promise<BaseResponse> {\n runtime.interrupt(agentId);\n return { requestId: \"\" };\n },\n\n async getMessages(agentId: string): Promise<Message[]> {\n const agent = runtime.getAgent(agentId);\n if (!agent) return [];\n return runtime.platform.sessionRepository.getMessages(agent.sessionId);\n },\n };\n}\n\n/**\n * Create remote session namespace backed by RPC client\n */\nexport function createRemoteSessions(rpcClient: RpcClient): SessionNamespace {\n return {\n async send(agentId: string, content: string | unknown[]): Promise<MessageSendResponse> {\n const result = await rpcClient.call<MessageSendResponse>(\"message.send\", {\n agentId,\n content,\n });\n return { ...result, requestId: \"\" };\n },\n\n async interrupt(agentId: string): Promise<BaseResponse> {\n const result = await rpcClient.call<BaseResponse>(\"agent.interrupt\", { agentId });\n return { ...result, requestId: \"\" };\n },\n\n async getMessages(agentId: string): Promise<Message[]> {\n const agentRes = await rpcClient.call<{ agent: AgentInfo | null }>(\"agent.get\", { agentId });\n if (!agentRes.agent) return [];\n const msgRes = await rpcClient.call<{ messages: Message[] }>(\"image.messages\", {\n imageId: agentRes.agent.imageId,\n });\n return msgRes.messages ?? [];\n },\n };\n}\n","/**\n * RemoteClient - AgentX client for remote server\n *\n * Uses RpcClient from @agentxjs/core/network for JSON-RPC communication.\n * This class focuses on business logic, not protocol details.\n */\n\nimport type { AgentXError } from \"@agentxjs/core/error\";\nimport type { BusEvent, BusEventHandler, EventBus, Unsubscribe } from \"@agentxjs/core/event\";\nimport { EventBusImpl } from \"@agentxjs/core/event\";\nimport { RpcClient, type RpcMethod } from \"@agentxjs/core/network\";\nimport { createLogger } from \"commonxjs/logger\";\nimport { AgentHandleImpl } from \"./AgentHandle\";\nimport { createRemoteAgents } from \"./namespaces/agents\";\nimport { createRemoteContainers } from \"./namespaces/containers\";\nimport { createRemoteImages } from \"./namespaces/images\";\nimport { createRemoteLLM } from \"./namespaces/llm\";\nimport { createPresentations } from \"./namespaces/presentations\";\nimport { createRemoteSessions } from \"./namespaces/sessions\";\nimport type {\n AgentHandle,\n AgentX,\n Embodiment,\n ImageListResponse,\n InstanceNamespace,\n LLMNamespace,\n RemoteClientConfig,\n} from \"./types\";\n\nconst logger = createLogger(\"agentx/RemoteClient\");\n\n/**\n * RemoteClient implementation using JSON-RPC 2.0\n */\nexport class RemoteClient implements AgentX {\n private readonly config: RemoteClientConfig;\n private readonly eventBus: EventBus;\n private readonly rpcClient: RpcClient;\n\n readonly instance: InstanceNamespace;\n readonly provider: LLMNamespace;\n\n constructor(config: RemoteClientConfig) {\n this.config = config;\n this.eventBus = new EventBusImpl();\n\n // Create RPC client (WebSocket factory from platform if available)\n this.rpcClient = new RpcClient({\n url: config.serverUrl,\n createWebSocket: config.customPlatform?.channelClient,\n timeout: config.timeout ?? 30000,\n autoReconnect: config.autoReconnect ?? true,\n headers: config.headers as Record<string, string> | undefined,\n debug: false,\n });\n\n // Forward stream events to internal event bus\n this.rpcClient.onStreamEvent((topic, event) => {\n logger.debug(\"Received stream event\", { topic, type: event.type });\n this.eventBus.emit(event as BusEvent);\n });\n\n // Assemble namespaces\n const container = createRemoteContainers(this.rpcClient);\n const image = createRemoteImages(this.rpcClient, (sessionId) => this.subscribe(sessionId));\n const agent = createRemoteAgents(this.rpcClient);\n const session = createRemoteSessions(this.rpcClient);\n const llm = createRemoteLLM(this.rpcClient);\n const present = createPresentations(this, image);\n\n this.instance = { container, image, agent, session, present, llm };\n this.provider = llm;\n }\n\n // ==================== Properties ====================\n\n get connected(): boolean {\n return this.rpcClient.connected;\n }\n\n get events(): EventBus {\n return this.eventBus;\n }\n\n // ==================== Top-level Agent API ====================\n\n async create(params: {\n name?: string;\n description?: string;\n contextId?: string;\n embody?: Embodiment;\n customData?: Record<string, unknown>;\n }): Promise<AgentHandle> {\n const containerId = \"default\";\n const imgRes = await this.instance.image.create({ containerId, ...params });\n const agentRes = await this.instance.agent.create({ imageId: imgRes.record.imageId });\n return new AgentHandleImpl(\n {\n agentId: agentRes.agentId,\n imageId: agentRes.imageId,\n containerId: agentRes.containerId,\n sessionId: agentRes.sessionId,\n },\n this.instance\n );\n }\n\n async list(): Promise<ImageListResponse> {\n return this.instance.image.list();\n }\n\n async get(agentId: string): Promise<AgentHandle | null> {\n const res = await this.instance.image.get(agentId);\n if (!res.record) return null;\n const r = res.record;\n return new AgentHandleImpl(\n {\n agentId: r.imageId,\n imageId: r.imageId,\n containerId: r.containerId,\n sessionId: r.sessionId,\n },\n this.instance\n );\n }\n\n // ==================== Connection ====================\n\n async connect(): Promise<void> {\n await this.rpcClient.connect();\n logger.info(\"Connected to server\", { url: this.config.serverUrl });\n }\n\n async disconnect(): Promise<void> {\n this.rpcClient.disconnect();\n logger.info(\"Disconnected from server\");\n }\n\n async dispose(): Promise<void> {\n this.rpcClient.dispose();\n this.eventBus.destroy();\n logger.info(\"RemoteClient disposed\");\n }\n\n // ==================== Event Subscription ====================\n\n on<T extends string>(type: T, handler: BusEventHandler<BusEvent & { type: T }>): Unsubscribe {\n return this.eventBus.on(type, handler);\n }\n\n onAny(handler: BusEventHandler): Unsubscribe {\n return this.eventBus.onAny(handler);\n }\n\n subscribe(sessionId: string): void {\n this.rpcClient.subscribe(sessionId);\n logger.debug(\"Subscribed to session\", { sessionId });\n }\n\n // ==================== Error Handling ====================\n\n onError(handler: (error: AgentXError) => void): Unsubscribe {\n return this.eventBus.on(\"agentx_error\", (event) => {\n handler(event.data as AgentXError);\n });\n }\n\n // ==================== RPC ====================\n\n async rpc<T = unknown>(method: string, params?: unknown): Promise<T> {\n return this.rpcClient.call<T>(method as RpcMethod, params);\n }\n}\n"],"mappings":"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","names":["createLogger","logger","createLogger","createServer"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentxjs",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "AgentX Client SDK - Local and remote AI agent management",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -23,12 +23,12 @@
|
|
|
23
23
|
"test": "bun test bdd/"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@agentxjs/core": "^2.
|
|
26
|
+
"@agentxjs/core": "^2.5.0",
|
|
27
27
|
"@deepracticex/id": "^0.2.0",
|
|
28
28
|
"@deepracticex/logger": "^1.2.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@agentxjs/devtools": "^2.
|
|
31
|
+
"@agentxjs/devtools": "^2.5.0",
|
|
32
32
|
"@deepracticex/bdd": "^0.3.0",
|
|
33
33
|
"tsx": "^4.19.0",
|
|
34
34
|
"typescript": "^5.3.3"
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentHandle — live reference to a created agent.
|
|
3
|
+
*
|
|
4
|
+
* Wraps identity (IDs) + delegates operations to instance namespaces.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { Message } from "@agentxjs/core/agent";
|
|
8
|
+
import type { Presentation, PresentationOptions } from "./presentation";
|
|
9
|
+
import type {
|
|
10
|
+
AgentHandle,
|
|
11
|
+
BaseResponse,
|
|
12
|
+
Embodiment,
|
|
13
|
+
InstanceNamespace,
|
|
14
|
+
MessageSendResponse,
|
|
15
|
+
} from "./types";
|
|
16
|
+
|
|
17
|
+
export class AgentHandleImpl implements AgentHandle {
|
|
18
|
+
readonly agentId: string;
|
|
19
|
+
readonly imageId: string;
|
|
20
|
+
readonly containerId: string;
|
|
21
|
+
readonly sessionId: string;
|
|
22
|
+
|
|
23
|
+
private readonly ns: InstanceNamespace;
|
|
24
|
+
|
|
25
|
+
constructor(
|
|
26
|
+
ids: { agentId: string; imageId: string; containerId: string; sessionId: string },
|
|
27
|
+
ns: InstanceNamespace
|
|
28
|
+
) {
|
|
29
|
+
this.agentId = ids.agentId;
|
|
30
|
+
this.imageId = ids.imageId;
|
|
31
|
+
this.containerId = ids.containerId;
|
|
32
|
+
this.sessionId = ids.sessionId;
|
|
33
|
+
this.ns = ns;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async send(content: string | unknown[]): Promise<MessageSendResponse> {
|
|
37
|
+
return this.ns.session.send(this.agentId, content);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async interrupt(): Promise<BaseResponse> {
|
|
41
|
+
return this.ns.session.interrupt(this.agentId);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async history(): Promise<Message[]> {
|
|
45
|
+
return this.ns.image.getMessages(this.imageId);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async present(options?: PresentationOptions): Promise<Presentation> {
|
|
49
|
+
return this.ns.present.create(this.agentId, options);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async update(updates: {
|
|
53
|
+
name?: string;
|
|
54
|
+
description?: string;
|
|
55
|
+
embody?: Embodiment;
|
|
56
|
+
customData?: Record<string, unknown>;
|
|
57
|
+
}): Promise<void> {
|
|
58
|
+
await this.ns.image.update(this.imageId, updates);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async delete(): Promise<void> {
|
|
62
|
+
await this.ns.agent.destroy(this.agentId);
|
|
63
|
+
await this.ns.image.delete(this.imageId);
|
|
64
|
+
}
|
|
65
|
+
}
|
package/src/CommandHandler.ts
CHANGED
|
@@ -158,12 +158,12 @@ export class CommandHandler {
|
|
|
158
158
|
// ==================== Image Commands ====================
|
|
159
159
|
|
|
160
160
|
private async handleImageCreate(params: unknown): Promise<RpcResponse> {
|
|
161
|
-
const { containerId, name, description,
|
|
161
|
+
const { containerId, name, description, contextId, embody, customData } = params as {
|
|
162
162
|
containerId: string;
|
|
163
163
|
name?: string;
|
|
164
164
|
description?: string;
|
|
165
|
-
|
|
166
|
-
|
|
165
|
+
contextId?: string;
|
|
166
|
+
embody?: import("@agentxjs/core/persistence").Embodiment;
|
|
167
167
|
customData?: Record<string, unknown>;
|
|
168
168
|
};
|
|
169
169
|
|
|
@@ -171,7 +171,7 @@ export class CommandHandler {
|
|
|
171
171
|
const { createImage } = await import("@agentxjs/core/image");
|
|
172
172
|
|
|
173
173
|
const image = await createImage(
|
|
174
|
-
{ containerId, name, description,
|
|
174
|
+
{ containerId, name, description, contextId, embody, customData },
|
|
175
175
|
{ imageRepository, sessionRepository }
|
|
176
176
|
);
|
|
177
177
|
|
|
@@ -280,7 +280,12 @@ export class CommandHandler {
|
|
|
280
280
|
private async handleImageUpdate(params: unknown): Promise<RpcResponse> {
|
|
281
281
|
const { imageId, updates } = params as {
|
|
282
282
|
imageId: string;
|
|
283
|
-
updates: {
|
|
283
|
+
updates: {
|
|
284
|
+
name?: string;
|
|
285
|
+
description?: string;
|
|
286
|
+
embody?: import("@agentxjs/core/persistence").Embodiment;
|
|
287
|
+
customData?: Record<string, unknown>;
|
|
288
|
+
};
|
|
284
289
|
};
|
|
285
290
|
|
|
286
291
|
// Get existing image
|
|
@@ -289,10 +294,12 @@ export class CommandHandler {
|
|
|
289
294
|
return err(404, `Image not found: ${imageId}`);
|
|
290
295
|
}
|
|
291
296
|
|
|
292
|
-
// Update image record
|
|
297
|
+
// Update image record (embody is merged, not replaced)
|
|
298
|
+
const { embody: embodyUpdates, ...otherUpdates } = updates;
|
|
293
299
|
const updatedRecord = {
|
|
294
300
|
...imageRecord,
|
|
295
|
-
...
|
|
301
|
+
...otherUpdates,
|
|
302
|
+
embody: embodyUpdates ? { ...imageRecord.embody, ...embodyUpdates } : imageRecord.embody,
|
|
296
303
|
updatedAt: Date.now(),
|
|
297
304
|
};
|
|
298
305
|
|