agentxjs 2.0.1 → 3.0.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/dist/index.js CHANGED
@@ -773,7 +773,7 @@ var RemoteClient = class {
773
773
  this.eventBus = new EventBusImpl();
774
774
  this.rpcClient = new RpcClient({
775
775
  url: config.serverUrl,
776
- createWebSocket: config.customPlatform?.webSocketFactory,
776
+ createWebSocket: config.customPlatform?.channelClient,
777
777
  timeout: config.timeout ?? 3e4,
778
778
  autoReconnect: config.autoReconnect ?? true,
779
779
  headers: config.headers,
@@ -839,7 +839,7 @@ async function createAgentX(config) {
839
839
  );
840
840
  }
841
841
  async function resolvePlatformForRemote(config) {
842
- if (config.customPlatform?.webSocketFactory) {
842
+ if (config.customPlatform?.channelClient) {
843
843
  return config;
844
844
  }
845
845
  if (typeof globalThis !== "undefined" && globalThis.window?.document !== void 0) {
@@ -851,7 +851,7 @@ async function resolvePlatformForRemote(config) {
851
851
  ...config,
852
852
  customPlatform: {
853
853
  ...config.customPlatform,
854
- webSocketFactory: createNodeWebSocket
854
+ channelClient: createNodeWebSocket
855
855
  }
856
856
  };
857
857
  } catch {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/LocalClient.ts","../src/namespaces/agents.ts","../src/namespaces/containers.ts","../src/namespaces/images.ts","../src/presentation/types.ts","../src/presentation/reducer.ts","../src/presentation/Presentation.ts","../src/namespaces/presentations.ts","../src/namespaces/sessions.ts","../src/RemoteClient.ts","../src/index.ts"],"sourcesContent":["/**\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 { BusEvent, BusEventHandler, EventBus, Unsubscribe } from \"@agentxjs/core/event\";\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport { createLogger } from \"commonxjs/logger\";\nimport { createLocalAgents } from \"./namespaces/agents\";\nimport { createLocalContainers } from \"./namespaces/containers\";\nimport { createLocalImages } from \"./namespaces/images\";\nimport { createPresentations } from \"./namespaces/presentations\";\nimport { createLocalSessions } from \"./namespaces/sessions\";\nimport type {\n AgentNamespace,\n AgentX,\n ContainerNamespace,\n ImageNamespace,\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 isDisposed = false;\n\n readonly containers: ContainerNamespace;\n readonly images: ImageNamespace;\n readonly agents: AgentNamespace;\n readonly sessions: SessionNamespace;\n readonly presentations: PresentationNamespace;\n\n constructor(runtime: AgentXRuntime) {\n this.runtime = runtime;\n const platform = runtime.platform;\n\n this.containers = createLocalContainers(platform);\n this.images = createLocalImages(platform);\n this.agents = createLocalAgents(runtime);\n this.sessions = createLocalSessions(runtime);\n this.presentations = createPresentations(this);\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 // ==================== 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 { 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}\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}\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.sessions.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.sessions.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.sessions.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 { 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 { createPresentations } from \"./namespaces/presentations\";\nimport { createRemoteSessions } from \"./namespaces/sessions\";\nimport type {\n AgentNamespace,\n AgentX,\n AgentXConfig,\n ContainerNamespace,\n ImageNamespace,\n PresentationNamespace,\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: AgentXConfig;\n private readonly eventBus: EventBus;\n private readonly rpcClient: RpcClient;\n\n readonly containers: ContainerNamespace;\n readonly images: ImageNamespace;\n readonly agents: AgentNamespace;\n readonly sessions: SessionNamespace;\n readonly presentations: PresentationNamespace;\n\n constructor(config: AgentXConfig) {\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?.webSocketFactory,\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.containers = createRemoteContainers(this.rpcClient);\n this.images = createRemoteImages(this.rpcClient, (sessionId) => this.subscribe(sessionId));\n this.agents = createRemoteAgents(this.rpcClient);\n this.sessions = createRemoteSessions(this.rpcClient);\n this.presentations = createPresentations(this);\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","/**\n * agentxjs - AgentX Client SDK\n *\n * Unified entry point supporting local and remote modes.\n *\n * @example Local mode (embedded runtime)\n * ```typescript\n * import { createAgentX } from \"agentxjs\";\n *\n * const agentx = await createAgentX({\n * apiKey: process.env.ANTHROPIC_API_KEY,\n * provider: \"anthropic\",\n * });\n *\n * await agentx.containers.create(\"my-app\");\n * const { record: image } = await agentx.images.create({\n * containerId: \"my-app\",\n * systemPrompt: \"You are helpful\",\n * });\n * const { agentId } = await agentx.agents.create({ imageId: image.imageId });\n *\n * agentx.on(\"text_delta\", (e) => process.stdout.write(e.data.text));\n * await agentx.sessions.send(agentId, \"Hello!\");\n * ```\n *\n * @example Remote mode (WebSocket client)\n * ```typescript\n * import { createAgentX } from \"agentxjs\";\n *\n * const agentx = await createAgentX({\n * serverUrl: \"ws://localhost:5200\",\n * });\n * ```\n */\n\nimport { LocalClient } from \"./LocalClient\";\nimport { RemoteClient } from \"./RemoteClient\";\nimport type { AgentX, AgentXConfig } from \"./types\";\n\n/**\n * Create an AgentX client\n *\n * Mode detection:\n * - `serverUrl` present → **Remote mode** (WebSocket client)\n * - `apiKey` present → **Local mode** (embedded Runtime + MonoDriver)\n *\n * @param config - Client configuration\n * @returns Connected AgentX client\n */\nexport async function createAgentX(config: AgentXConfig): Promise<AgentX> {\n if (config.serverUrl) {\n // Remote mode — resolve platform for WebSocket factory if needed\n const resolvedConfig = await resolvePlatformForRemote(config);\n const client = new RemoteClient(resolvedConfig);\n await client.connect();\n return client;\n }\n\n if (config.apiKey || config.createDriver || config.customPlatform) {\n // Local mode\n return createLocalClient(config);\n }\n\n throw new Error(\n \"Invalid AgentX config: provide either 'serverUrl' (remote mode) or 'apiKey' (local mode)\"\n );\n}\n\n/**\n * Resolve platform for remote mode\n *\n * In Node.js: auto-import node-platform to get webSocketFactory\n * In browser: no platform needed (native WebSocket is the default)\n */\nasync function resolvePlatformForRemote(config: AgentXConfig): Promise<AgentXConfig> {\n if (config.customPlatform?.webSocketFactory) {\n return config;\n }\n\n // In browser, native WebSocket works — no platform needed\n if (typeof globalThis !== \"undefined\" && (globalThis as any).window?.document !== undefined) {\n return config;\n }\n\n // Node.js — auto-resolve webSocketFactory from node-platform\n try {\n const { createNodeWebSocket } = await import(\"@agentxjs/node-platform/network\");\n return {\n ...config,\n customPlatform: {\n ...config.customPlatform,\n webSocketFactory: createNodeWebSocket,\n } as any,\n };\n } catch {\n // node-platform not available, fall back to global WebSocket\n return config;\n }\n}\n\n/**\n * Create a local client with embedded runtime\n */\nasync function createLocalClient(config: AgentXConfig): Promise<AgentX> {\n const { createAgentXRuntime } = await import(\"@agentxjs/core/runtime\");\n\n // Resolve platform\n let platform;\n if (config.customPlatform) {\n platform = config.customPlatform;\n } else {\n const { createNodePlatform } = await import(\"@agentxjs/node-platform\");\n platform = await createNodePlatform({\n dataPath: config.dataPath ?? \":memory:\",\n logLevel: config.logLevel ?? (config.debug ? \"debug\" : undefined),\n });\n }\n\n // Resolve createDriver\n let createDriver = config.createDriver;\n if (!createDriver) {\n const { createMonoDriver } = await import(\"@agentxjs/mono-driver\");\n createDriver = (driverConfig: import(\"@agentxjs/core/driver\").DriverConfig) => {\n const existingOptions = (driverConfig as any).options ?? {};\n return createMonoDriver({\n ...driverConfig,\n apiKey: config.apiKey ?? driverConfig.apiKey,\n baseUrl: config.baseUrl ?? driverConfig.baseUrl,\n model: config.model ?? driverConfig.model,\n options: {\n ...existingOptions,\n provider: config.provider ?? existingOptions.provider ?? \"anthropic\",\n },\n });\n };\n }\n\n // Create runtime\n const runtime = createAgentXRuntime(platform, createDriver);\n\n return new LocalClient(runtime);\n}\n\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\";\n// Re-export types\nexport type {\n AgentCreateResponse,\n AgentGetResponse,\n AgentInfo,\n AgentListResponse,\n AgentNamespace,\n AgentX,\n AgentXConfig,\n BaseResponse,\n ContainerCreateResponse,\n ContainerGetResponse,\n ContainerInfo,\n ContainerListResponse,\n ContainerNamespace,\n ImageCreateResponse,\n ImageGetResponse,\n ImageListResponse,\n ImageNamespace,\n ImageRecord,\n LLMProvider,\n MaybeAsync,\n MessageSendResponse,\n PresentationNamespace,\n SessionNamespace,\n} from \"./types\";\n"],"mappings":"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","names":["createLogger","logger","createLogger"]}
1
+ {"version":3,"sources":["../src/LocalClient.ts","../src/namespaces/agents.ts","../src/namespaces/containers.ts","../src/namespaces/images.ts","../src/presentation/types.ts","../src/presentation/reducer.ts","../src/presentation/Presentation.ts","../src/namespaces/presentations.ts","../src/namespaces/sessions.ts","../src/RemoteClient.ts","../src/index.ts"],"sourcesContent":["/**\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 { BusEvent, BusEventHandler, EventBus, Unsubscribe } from \"@agentxjs/core/event\";\nimport type { AgentXRuntime } from \"@agentxjs/core/runtime\";\nimport { createLogger } from \"commonxjs/logger\";\nimport { createLocalAgents } from \"./namespaces/agents\";\nimport { createLocalContainers } from \"./namespaces/containers\";\nimport { createLocalImages } from \"./namespaces/images\";\nimport { createPresentations } from \"./namespaces/presentations\";\nimport { createLocalSessions } from \"./namespaces/sessions\";\nimport type {\n AgentNamespace,\n AgentX,\n ContainerNamespace,\n ImageNamespace,\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 isDisposed = false;\n\n readonly containers: ContainerNamespace;\n readonly images: ImageNamespace;\n readonly agents: AgentNamespace;\n readonly sessions: SessionNamespace;\n readonly presentations: PresentationNamespace;\n\n constructor(runtime: AgentXRuntime) {\n this.runtime = runtime;\n const platform = runtime.platform;\n\n this.containers = createLocalContainers(platform);\n this.images = createLocalImages(platform);\n this.agents = createLocalAgents(runtime);\n this.sessions = createLocalSessions(runtime);\n this.presentations = createPresentations(this);\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 // ==================== 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 { 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}\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}\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.sessions.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.sessions.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.sessions.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 { 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 { createPresentations } from \"./namespaces/presentations\";\nimport { createRemoteSessions } from \"./namespaces/sessions\";\nimport type {\n AgentNamespace,\n AgentX,\n AgentXConfig,\n ContainerNamespace,\n ImageNamespace,\n PresentationNamespace,\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: AgentXConfig;\n private readonly eventBus: EventBus;\n private readonly rpcClient: RpcClient;\n\n readonly containers: ContainerNamespace;\n readonly images: ImageNamespace;\n readonly agents: AgentNamespace;\n readonly sessions: SessionNamespace;\n readonly presentations: PresentationNamespace;\n\n constructor(config: AgentXConfig) {\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.containers = createRemoteContainers(this.rpcClient);\n this.images = createRemoteImages(this.rpcClient, (sessionId) => this.subscribe(sessionId));\n this.agents = createRemoteAgents(this.rpcClient);\n this.sessions = createRemoteSessions(this.rpcClient);\n this.presentations = createPresentations(this);\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","/**\n * agentxjs - AgentX Client SDK\n *\n * Unified entry point supporting local and remote modes.\n *\n * @example Local mode (embedded runtime)\n * ```typescript\n * import { createAgentX } from \"agentxjs\";\n *\n * const agentx = await createAgentX({\n * apiKey: process.env.ANTHROPIC_API_KEY,\n * provider: \"anthropic\",\n * });\n *\n * await agentx.containers.create(\"my-app\");\n * const { record: image } = await agentx.images.create({\n * containerId: \"my-app\",\n * systemPrompt: \"You are helpful\",\n * });\n * const { agentId } = await agentx.agents.create({ imageId: image.imageId });\n *\n * agentx.on(\"text_delta\", (e) => process.stdout.write(e.data.text));\n * await agentx.sessions.send(agentId, \"Hello!\");\n * ```\n *\n * @example Remote mode (WebSocket client)\n * ```typescript\n * import { createAgentX } from \"agentxjs\";\n *\n * const agentx = await createAgentX({\n * serverUrl: \"ws://localhost:5200\",\n * });\n * ```\n */\n\nimport { LocalClient } from \"./LocalClient\";\nimport { RemoteClient } from \"./RemoteClient\";\nimport type { AgentX, AgentXConfig } from \"./types\";\n\n/**\n * Create an AgentX client\n *\n * Mode detection:\n * - `serverUrl` present → **Remote mode** (WebSocket client)\n * - `apiKey` present → **Local mode** (embedded Runtime + MonoDriver)\n *\n * @param config - Client configuration\n * @returns Connected AgentX client\n */\nexport async function createAgentX(config: AgentXConfig): Promise<AgentX> {\n if (config.serverUrl) {\n // Remote mode — resolve platform for WebSocket factory if needed\n const resolvedConfig = await resolvePlatformForRemote(config);\n const client = new RemoteClient(resolvedConfig);\n await client.connect();\n return client;\n }\n\n if (config.apiKey || config.createDriver || config.customPlatform) {\n // Local mode\n return createLocalClient(config);\n }\n\n throw new Error(\n \"Invalid AgentX config: provide either 'serverUrl' (remote mode) or 'apiKey' (local mode)\"\n );\n}\n\n/**\n * Resolve platform for remote mode\n *\n * In Node.js: auto-import node-platform to get channelClient\n * In browser: no platform needed (native WebSocket is the default)\n */\nasync function resolvePlatformForRemote(config: AgentXConfig): Promise<AgentXConfig> {\n if (config.customPlatform?.channelClient) {\n return config;\n }\n\n // In browser, native WebSocket works — no platform needed\n if (typeof globalThis !== \"undefined\" && (globalThis as any).window?.document !== undefined) {\n return config;\n }\n\n // Node.js — auto-resolve channelClient from node-platform\n try {\n const { createNodeWebSocket } = await import(\"@agentxjs/node-platform/network\");\n return {\n ...config,\n customPlatform: {\n ...config.customPlatform,\n channelClient: createNodeWebSocket,\n } as any,\n };\n } catch {\n // node-platform not available, fall back to global WebSocket\n return config;\n }\n}\n\n/**\n * Create a local client with embedded runtime\n */\nasync function createLocalClient(config: AgentXConfig): Promise<AgentX> {\n const { createAgentXRuntime } = await import(\"@agentxjs/core/runtime\");\n\n // Resolve platform\n let platform;\n if (config.customPlatform) {\n platform = config.customPlatform;\n } else {\n const { createNodePlatform } = await import(\"@agentxjs/node-platform\");\n platform = await createNodePlatform({\n dataPath: config.dataPath ?? \":memory:\",\n logLevel: config.logLevel ?? (config.debug ? \"debug\" : undefined),\n });\n }\n\n // Resolve createDriver\n let createDriver = config.createDriver;\n if (!createDriver) {\n const { createMonoDriver } = await import(\"@agentxjs/mono-driver\");\n createDriver = (driverConfig: import(\"@agentxjs/core/driver\").DriverConfig) => {\n const existingOptions = (driverConfig as any).options ?? {};\n return createMonoDriver({\n ...driverConfig,\n apiKey: config.apiKey ?? driverConfig.apiKey,\n baseUrl: config.baseUrl ?? driverConfig.baseUrl,\n model: config.model ?? driverConfig.model,\n options: {\n ...existingOptions,\n provider: config.provider ?? existingOptions.provider ?? \"anthropic\",\n },\n });\n };\n }\n\n // Create runtime\n const runtime = createAgentXRuntime(platform, createDriver);\n\n return new LocalClient(runtime);\n}\n\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\";\n// Re-export types\nexport type {\n AgentCreateResponse,\n AgentGetResponse,\n AgentInfo,\n AgentListResponse,\n AgentNamespace,\n AgentX,\n AgentXConfig,\n BaseResponse,\n ContainerCreateResponse,\n ContainerGetResponse,\n ContainerInfo,\n ContainerListResponse,\n ContainerNamespace,\n ImageCreateResponse,\n ImageGetResponse,\n ImageListResponse,\n ImageNamespace,\n ImageRecord,\n LLMProvider,\n MaybeAsync,\n MessageSendResponse,\n PresentationNamespace,\n SessionNamespace,\n} from \"./types\";\n"],"mappings":";AASA,SAAS,oBAAoB;;;ACQtB,SAAS,kBAAkB,SAAwC;AACxE,SAAO;AAAA,IACL,MAAM,OAAO,QAA6E;AAExF,YAAM,gBAAgB,QACnB,UAAU,EACV,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO,WAAW,EAAE,cAAc,SAAS;AAExE,UAAI,eAAe;AACjB,eAAO;AAAA,UACL,SAAS,cAAc;AAAA,UACvB,SAAS,cAAc;AAAA,UACvB,aAAa,cAAc;AAAA,UAC3B,WAAW,cAAc;AAAA,UACzB,WAAW;AAAA,QACb;AAAA,MACF;AAEA,YAAM,QAAQ,MAAM,QAAQ,YAAY;AAAA,QACtC,SAAS,OAAO;AAAA,QAChB,SAAS,OAAO;AAAA,MAClB,CAAC;AAED,aAAO;AAAA,QACL,SAAS,MAAM;AAAA,QACf,SAAS,MAAM;AAAA,QACf,aAAa,MAAM;AAAA,QACnB,WAAW,MAAM;AAAA,QACjB,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IAEA,MAAM,IAAI,SAA4C;AACpD,YAAM,QAAQ,QAAQ,SAAS,OAAO;AACtC,aAAO;AAAA,QACL,OAAO,QACH;AAAA,UACE,SAAS,MAAM;AAAA,UACf,SAAS,MAAM;AAAA,UACf,aAAa,MAAM;AAAA,UACnB,WAAW,MAAM;AAAA,UACjB,WAAW,MAAM;AAAA,QACnB,IACA;AAAA,QACJ,QAAQ,CAAC,CAAC;AAAA,QACV,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,aAAkD;AAC3D,YAAM,SAAS,cAAc,QAAQ,qBAAqB,WAAW,IAAI,QAAQ,UAAU;AAE3F,aAAO;AAAA,QACL,QAAQ,OAAO,IAAI,CAAC,OAAO;AAAA,UACzB,SAAS,EAAE;AAAA,UACX,SAAS,EAAE;AAAA,UACX,aAAa,EAAE;AAAA,UACf,WAAW,EAAE;AAAA,UACb,WAAW,EAAE;AAAA,QACf,EAAE;AAAA,QACF,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IAEA,MAAM,QAAQ,SAAwC;AACpD,YAAM,QAAQ,QAAQ,SAAS,OAAO;AACtC,UAAI,OAAO;AACT,cAAM,QAAQ,aAAa,OAAO;AAAA,MACpC;AACA,aAAO,EAAE,WAAW,GAAG;AAAA,IACzB;AAAA,EACF;AACF;AAKO,SAAS,mBAAmB,WAAsC;AACvE,SAAO;AAAA,IACL,MAAM,OAAO,QAA6E;AAExF,YAAM,SAAS,MAAM,UAAU,KAA0B,aAA0B;AAAA,QACjF,SAAS,OAAO;AAAA,QAChB,SAAS,OAAO;AAAA,MAClB,CAAC;AACD,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,IAAI,SAA4C;AACpD,YAAM,SAAS,MAAM,UAAU,KAAuB,aAAa,EAAE,QAAQ,CAAC;AAC9E,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,KAAK,aAAkD;AAC3D,YAAM,SAAS,MAAM,UAAU,KAAwB,cAAc,EAAE,YAAY,CAAC;AACpF,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,QAAQ,SAAwC;AACpD,YAAM,SAAS,MAAM,UAAU,KAAmB,iBAAiB,EAAE,QAAQ,CAAC;AAC9E,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,EACF;AACF;;;ACxGO,SAAS,sBAAsB,UAA8C;AAClF,SAAO;AAAA,IACL,MAAM,OAAO,aAAuD;AAClE,YAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,0BAA0B;AACxE,YAAM,EAAE,qBAAqB,iBAAiB,kBAAkB,IAAI;AAEpE,YAAM,YAAY,MAAM,qBAAqB,aAAa;AAAA,QACxD;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,aAAO,EAAE,aAAa,UAAU,aAAa,WAAW,GAAG;AAAA,IAC7D;AAAA,IAEA,MAAM,IAAI,aAAoD;AAC5D,YAAM,SAAS,MAAM,SAAS,oBAAoB,gBAAgB,WAAW;AAC7E,aAAO,EAAE,aAAa,QAAQ,WAAW,GAAG;AAAA,IAC9C;AAAA,IAEA,MAAM,OAAuC;AAC3C,YAAM,aAAa,MAAM,SAAS,oBAAoB,kBAAkB;AACxE,aAAO,EAAE,cAAc,WAAW,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG;AAAA,IAC7E;AAAA,EACF;AACF;AAKO,SAAS,uBAAuB,WAA0C;AAC/E,SAAO;AAAA,IACL,MAAM,OAAO,aAAuD;AAClE,YAAM,SAAS,MAAM,UAAU,KAA8B,oBAAoB;AAAA,QAC/E;AAAA,MACF,CAAC;AACD,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,IAAI,aAAoD;AAC5D,YAAM,SAAS,MAAM,UAAU,KAA2B,iBAAiB;AAAA,QACzE;AAAA,MACF,CAAC;AACD,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,OAAuC;AAC3C,YAAM,SAAS,MAAM,UAAU,KAA4B,kBAAkB,CAAC,CAAC;AAC/E,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,EACF;AACF;;;ACjDO,SAAS,kBAAkB,UAA0C;AAC1E,SAAO;AAAA,IACL,MAAM,OAAO,QAOoB;AAC/B,YAAM,EAAE,iBAAiB,kBAAkB,IAAI;AAC/C,YAAM,EAAE,YAAY,IAAI,MAAM,OAAO,sBAAsB;AAE3D,YAAM,QAAQ,MAAM;AAAA,QAClB;AAAA,UACE,aAAa,OAAO;AAAA,UACpB,MAAM,OAAO;AAAA,UACb,aAAa,OAAO;AAAA,UACpB,cAAc,OAAO;AAAA,UACrB,YAAY,OAAO;AAAA,UACnB,YAAY,OAAO;AAAA,QACrB;AAAA,QACA,EAAE,iBAAiB,kBAAkB;AAAA,MACvC;AAEA,aAAO;AAAA,QACL,QAAQ,MAAM,SAAS;AAAA,QACvB,iBAAiB,CAAC,MAAM,SAAS;AAAA,QACjC,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IAEA,MAAM,IAAI,SAA4C;AACpD,YAAM,SAAS,MAAM,SAAS,gBAAgB,cAAc,OAAO;AACnE,aAAO;AAAA,QACL;AAAA,QACA,iBAAiB,QAAQ,YAAY,CAAC,OAAO,SAAS,IAAI;AAAA,QAC1D,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,aAAkD;AAC3D,YAAM,UAAU,cACZ,MAAM,SAAS,gBAAgB,wBAAwB,WAAW,IAClE,MAAM,SAAS,gBAAgB,cAAc;AAEjD,aAAO;AAAA,QACL;AAAA,QACA,iBAAiB,QAAQ,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,QAC/C,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IAEA,MAAM,OACJ,SACA,SAK8B;AAC9B,YAAM,EAAE,UAAU,IAAI,MAAM,OAAO,sBAAsB;AACzD,YAAM,EAAE,iBAAiB,kBAAkB,IAAI;AAE/C,YAAM,QAAQ,MAAM,UAAU,SAAS,EAAE,iBAAiB,kBAAkB,CAAC;AAC7E,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE;AAAA,MAC/C;AAEA,YAAM,UAAU,MAAM,MAAM,OAAO,OAAO;AAC1C,aAAO,EAAE,QAAQ,QAAQ,SAAS,GAAG,WAAW,GAAG;AAAA,IACrD;AAAA,IAEA,MAAM,OAAO,SAAwC;AACnD,YAAM,EAAE,UAAU,IAAI,MAAM,OAAO,sBAAsB;AACzD,YAAM,EAAE,iBAAiB,kBAAkB,IAAI;AAE/C,YAAM,QAAQ,MAAM,UAAU,SAAS,EAAE,iBAAiB,kBAAkB,CAAC;AAC7E,UAAI,OAAO;AACT,cAAM,MAAM,OAAO;AAAA,MACrB;AAEA,aAAO,EAAE,WAAW,GAAG;AAAA,IACzB;AAAA,EACF;AACF;AAKO,SAAS,mBACd,WACA,aACgB;AAChB,SAAO;AAAA,IACL,MAAM,OAAO,QAOoB;AAC/B,YAAM,SAAS,MAAM,UAAU,KAA0B,gBAAgB,MAAM;AAG/E,UAAI,OAAO,iBAAiB;AAC1B,mBAAW,aAAa,OAAO,iBAAiB;AAC9C,sBAAY,SAAS;AAAA,QACvB;AAAA,MACF;AAEA,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,IAAI,SAA4C;AACpD,YAAM,SAAS,MAAM,UAAU,KAAuB,aAAa,EAAE,QAAQ,CAAC;AAG9E,UAAI,OAAO,iBAAiB;AAC1B,mBAAW,aAAa,OAAO,iBAAiB;AAC9C,sBAAY,SAAS;AAAA,QACvB;AAAA,MACF;AAEA,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,KAAK,aAAkD;AAC3D,YAAM,SAAS,MAAM,UAAU,KAAwB,cAAc,EAAE,YAAY,CAAC;AAGpF,UAAI,OAAO,iBAAiB;AAC1B,mBAAW,aAAa,OAAO,iBAAiB;AAC9C,sBAAY,SAAS;AAAA,QACvB;AAAA,MACF;AAEA,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,OACJ,SACA,SAK8B;AAC9B,YAAM,SAAS,MAAM,UAAU,KAA0B,gBAAgB;AAAA,QACvE;AAAA,QACA;AAAA,MACF,CAAC;AACD,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,OAAO,SAAwC;AACnD,YAAM,SAAS,MAAM,UAAU,KAAmB,gBAAgB,EAAE,QAAQ,CAAC;AAC7E,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,EACF;AACF;;;AC/DO,IAAM,2BAA8C;AAAA,EACzD,eAAe,CAAC;AAAA,EAChB,WAAW;AAAA,EACX,QAAQ;AACV;;;AC/BO,SAAS,oBAAoB,OAA0B,OAAoC;AAChG,UAAQ,MAAM,MAAM;AAAA;AAAA,IAElB,KAAK;AACH,aAAO,mBAAmB,OAAO,MAAM,IAAwB;AAAA,IAEjE,KAAK;AACH,aAAO,gBAAgB,OAAO,MAAM,IAAqB;AAAA,IAE3D,KAAK;AACH,aAAO,mBAAmB,OAAO,MAAM,IAAwB;AAAA,IAEjE,KAAK;AACH,aAAO,kBAAkB,OAAO,MAAM,IAAuB;AAAA,IAE/D,KAAK;AACH,aAAO,mBAAmB,OAAO,MAAM,IAAwB;AAAA,IAEjE,KAAK;AACH,aAAO,kBAAkB,OAAO,MAAM,IAAuB;AAAA;AAAA,IAG/D,KAAK;AACH,aAAO,wBAAwB,OAAO,MAAM,IAAyB;AAAA,IAEvE,KAAK;AACH,aAAO,YAAY,OAAO,MAAM,IAAiB;AAAA,IAEnD;AACE,aAAO;AAAA,EACX;AACF;AAMA,SAAS,mBAAmB,OAA0B,OAA4C;AAEhG,MAAI,gBAAgB,MAAM;AAC1B,MAAI,MAAM,aAAa,MAAM,UAAU,OAAO,SAAS,GAAG;AACxD,oBAAgB,CAAC,GAAG,eAAe,EAAE,GAAG,MAAM,WAAW,aAAa,MAAM,CAAC;AAAA,EAC/E;AAEA,QAAM,YAAmC;AAAA,IACvC,MAAM;AAAA,IACN,QAAQ,CAAC;AAAA,IACT,aAAa;AAAA,EACf;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,gBAAgB,OAA0B,MAAwC;AACzF,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,CAAC,GAAG,MAAM,UAAU,MAAM;AACzC,QAAM,YAAY,OAAO,OAAO,SAAS,CAAC;AAE1C,MAAI,aAAa,UAAU,SAAS,QAAQ;AAC1C,WAAO,OAAO,SAAS,CAAC,IAAI;AAAA,MAC1B,GAAG;AAAA,MACH,SAAS,UAAU,UAAU,KAAK;AAAA,IACpC;AAAA,EACF,OAAO;AACL,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,KAAK;AAAA,IAChB,CAAc;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW;AAAA,MACT,GAAG,MAAM;AAAA,MACT;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,mBAAmB,OAA0B,MAA2C;AAC/F,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AAGA,QAAM,YAAuB;AAAA,IAC3B,MAAM;AAAA,IACN,WAAW,KAAK;AAAA,IAChB,UAAU,KAAK;AAAA,IACf,WAAW,CAAC;AAAA,IACZ,QAAQ;AAAA,EACV;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW;AAAA,MACT,GAAG,MAAM;AAAA,MACT,QAAQ,CAAC,GAAG,MAAM,UAAU,QAAQ,SAAS;AAAA,IAC/C;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAOA,SAAS,kBAAkB,OAA0B,MAA0C;AAC7F,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,UAAU,OAAO,IAAI,CAAC,UAAiB;AAC1D,QAAI,MAAM,SAAS,UAAU,MAAM,cAAc,KAAK,YAAY;AAChE,aAAO;AAAA,QACL,GAAG;AAAA,QACH,WAAW,KAAK;AAAA,QAChB,QAAQ;AAAA,MACV;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AAED,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW;AAAA,MACT,GAAG,MAAM;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,OAA0B,MAA2C;AAC/F,MAAI,CAAC,MAAM,aAAa,CAAC,KAAK,OAAO;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,MAAM,UAAU;AAC7B,QAAM,QAAoB;AAAA,IACxB,cAAc,MAAM,eAAe,KAAK,KAAK,MAAM;AAAA,IACnD,eAAe,MAAM,gBAAgB,KAAK,KAAK,MAAM;AAAA,EACvD;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW;AAAA,MACT,GAAG,MAAM;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,OAA0B,MAA0C;AAC7F,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AAGA,MAAI,KAAK,eAAe,YAAY;AAClC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ;AAAA,IACV;AAAA,EACF;AAGA,QAAM,wBAA+C;AAAA,IACnD,GAAG,MAAM;AAAA,IACT,aAAa;AAAA,EACf;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,eAAe,CAAC,GAAG,MAAM,eAAe,qBAAqB;AAAA,IAC7D,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AACF;AASA,SAAS,wBACP,OACA,MACmB;AACnB,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,KAAK;AACxB,QAAM,SAAS,MAAM,UAAU,OAAO,IAAI,CAAC,UAAiB;AAC1D,QAAI,MAAM,SAAS,UAAU,MAAM,cAAc,YAAY;AAC3D,aAAO;AAAA,QACL,GAAG;AAAA,QACH,YAAY,uBAAuB,KAAK,WAAW,MAAM;AAAA,QACzD,QACE,KAAK,WAAW,OAAO,SAAS,gBAChC,KAAK,WAAW,OAAO,SAAS,gBAChC,KAAK,WAAW,OAAO,SAAS,qBAC5B,UACA;AAAA,MACR;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AAED,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW;AAAA,MACT,GAAG,MAAM;AAAA,MACT;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,YAAY,OAA0B,MAAoC;AACjF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,eAAe;AAAA,MACb,GAAG,MAAM;AAAA,MACT;AAAA,QACE,MAAM;AAAA,QACN,SAAS,KAAK;AAAA,MAChB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AACF;AAMO,SAAS,oBAAoB,OAA0B,SAAoC;AAChG,SAAO;AAAA,IACL,GAAG;AAAA,IACH,eAAe;AAAA,MACb,GAAG,MAAM;AAAA,MACT;AAAA,QACE,MAAM;AAAA,QACN,QAAQ,CAAC,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,qBAAwC;AACtD,SAAO,EAAE,GAAG,yBAAyB;AACvC;AAMA,SAAS,uBAAuB,QAAkC;AAChE,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,KAAK,UAAU,OAAO,KAAK;AAAA,IACpC,KAAK;AACH,aAAO,OAAO,UAAU;AAAA,IAC1B,KAAK;AACH,aAAO,OAAO,MACX,OAAO,CAAC,MAA2C,EAAE,SAAS,MAAM,EACpE,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,EAAE;AAAA,EACd;AACF;AAeO,SAAS,wBAAwB,UAAqC;AAC3E,QAAM,gBAAgC,CAAC;AACvC,MAAI,mBAAiD;AAErD,WAAS,iBAAiB;AACxB,QAAI,oBAAoB,iBAAiB,OAAO,SAAS,GAAG;AAC1D,oBAAc,KAAK,gBAAgB;AAAA,IACrC;AACA,uBAAmB;AAAA,EACrB;AAEA,aAAW,OAAO,UAAU;AAC1B,YAAQ,IAAI,SAAS;AAAA,MACnB,KAAK,QAAQ;AACX,uBAAe;AACf,cAAM,IAAI;AACV,cAAM,OACJ,OAAO,EAAE,YAAY,WACjB,EAAE,UACF,EAAE,QACC,OAAO,CAAC,MAA2C,EAAE,SAAS,MAAM,EACpE,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,EAAE;AAChB,sBAAc,KAAK;AAAA,UACjB,MAAM;AAAA,UACN,QAAQ,CAAC,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,QAC1C,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,aAAa;AAChB,YAAI,CAAC,kBAAkB;AACrB,6BAAmB,EAAE,MAAM,aAAa,QAAQ,CAAC,GAAG,aAAa,MAAM;AAAA,QACzE;AACA,cAAM,IAAI;AACV,YAAI,OAAO,EAAE,YAAY,UAAU;AACjC,cAAI,EAAE,SAAS;AACb,6BAAiB,OAAO,KAAK,EAAE,MAAM,QAAQ,SAAS,EAAE,QAAQ,CAAc;AAAA,UAChF;AAAA,QACF,OAAO;AAEL,qBAAW,QAAQ,EAAE,SAAS;AAC5B,gBAAI,KAAK,SAAS,QAAQ;AACxB,kBAAI,KAAK,MAAM;AACb,iCAAiB,OAAO,KAAK,EAAE,MAAM,QAAQ,SAAS,KAAK,KAAK,CAAc;AAAA,cAChF;AAAA,YACF,WAAW,KAAK,SAAS,aAAa;AACpC,oBAAM,KAAK;AACX,+BAAiB,OAAO,KAAK;AAAA,gBAC3B,MAAM;AAAA,gBACN,WAAW,GAAG;AAAA,gBACd,UAAU,GAAG;AAAA,gBACb,WAAW,GAAG;AAAA,gBACd,QAAQ;AAAA,cACV,CAAc;AAAA,YAChB;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAAA,MAEA,KAAK,eAAe;AAClB,cAAM,IAAI;AACV,YAAI,kBAAkB;AACpB,qBAAW,SAAS,iBAAiB,QAAQ;AAC3C,gBAAI,MAAM,SAAS,UAAU,MAAM,cAAc,EAAE,WAAW,IAAI;AAChE,oBAAM,aAAa,uBAAuB,EAAE,WAAW,MAAM;AAC7D,oBAAM,SACJ,EAAE,WAAW,OAAO,SAAS,gBAC7B,EAAE,WAAW,OAAO,SAAS,gBAC7B,EAAE,WAAW,OAAO,SAAS,qBACzB,UACA;AACN;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAAA,MAEA,KAAK,SAAS;AACZ,uBAAe;AACf,cAAM,IAAI;AACV,sBAAc,KAAK;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,EAAE;AAAA,QACb,CAAC;AACD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,iBAAe;AACf,SAAO;AACT;;;AC5bO,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiD,oBAAI,IAAI;AAAA,EACzD,gBAA+C,oBAAI,IAAI;AAAA,EACvD,mBAAuC;AAAA,EAE/C,YACE,QACA,SACA,SACA,sBACA;AACA,SAAK,SAAS;AACd,SAAK,UAAU;AACf,SAAK,QAAQ,sBAAsB,SAC/B,EAAE,GAAG,0BAA0B,eAAe,qBAAqB,IACnE,mBAAmB;AAGvB,QAAI,SAAS,UAAU;AACrB,WAAK,eAAe,IAAI,QAAQ,QAAQ;AAAA,IAC1C;AACA,QAAI,SAAS,SAAS;AACpB,WAAK,cAAc,IAAI,QAAQ,OAAO;AAAA,IACxC;AAGA,SAAK,kBAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,WAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,SAAiD;AACxD,SAAK,eAAe,IAAI,OAAO;AAE/B,YAAQ,KAAK,KAAK;AAClB,WAAO,MAAM;AACX,WAAK,eAAe,OAAO,OAAO;AAAA,IACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,SAAgD;AACtD,SAAK,cAAc,IAAI,OAAO;AAC9B,WAAO,MAAM;AACX,WAAK,cAAc,OAAO,OAAO;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,SAAgC;AAEzC,SAAK,QAAQ,oBAAoB,KAAK,OAAO,OAAO;AACpD,SAAK,OAAO;AAEZ,QAAI;AAEF,YAAM,KAAK,OAAO,SAAS,KAAK,KAAK,SAAS,OAAO;AAAA,IACvD,SAAS,OAAO;AACd,WAAK,YAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,IAC5E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAA2B;AAC/B,QAAI;AACF,YAAM,KAAK,OAAO,SAAS,UAAU,KAAK,OAAO;AAAA,IACnD,SAAS,OAAO;AACd,WAAK,YAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,IAC5E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,QAAQ,mBAAmB;AAChC,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,QAAI,KAAK,kBAAkB;AACzB,WAAK,iBAAiB;AACtB,WAAK,mBAAmB;AAAA,IAC1B;AACA,SAAK,eAAe,MAAM;AAC1B,SAAK,cAAc,MAAM;AAAA,EAC3B;AAAA;AAAA,EAIQ,oBAA0B;AAEhC,SAAK,mBAAmB,KAAK,OAAO,MAAM,CAAC,UAAoB;AAG7D,YAAM,mBAAmB;AACzB,YAAM,eAAe,iBAAiB,SAAS;AAG/C,UAAI,gBAAgB,iBAAiB,KAAK,SAAS;AACjD;AAAA,MACF;AAGA,YAAM,WAAW,oBAAoB,KAAK,OAAO,KAAK;AACtD,UAAI,aAAa,KAAK,OAAO;AAC3B,aAAK,QAAQ;AACb,aAAK,OAAO;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,SAAe;AACrB,eAAW,WAAW,KAAK,gBAAgB;AACzC,UAAI;AACF,gBAAQ,KAAK,KAAK;AAAA,MACpB,SAAS,OAAO;AACd,gBAAQ,MAAM,sCAAsC,KAAK;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,OAAoB;AACtC,eAAW,WAAW,KAAK,eAAe;AACxC,UAAI;AACF,gBAAQ,KAAK;AAAA,MACf,SAAS,GAAG;AACV,gBAAQ,MAAM,qCAAqC,CAAC;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AACF;;;ACnLO,SAAS,oBAAoB,QAAuC;AACzE,SAAO;AAAA,IACL,MAAM,OAAO,SAAiB,SAAsD;AAClF,YAAM,WAAW,MAAM,OAAO,SAAS,YAAY,OAAO;AAC1D,YAAM,gBAAgB,wBAAwB,QAAQ;AACtD,aAAO,IAAI,aAAa,QAAQ,SAAS,SAAS,aAAa;AAAA,IACjE;AAAA,EACF;AACF;;;ACTO,SAAS,oBAAoB,SAA0C;AAC5E,SAAO;AAAA,IACL,MAAM,KAAK,SAAiB,SAA2D;AACrF,YAAM,QAAQ,QAAQ,SAAS,OAAqC;AACpE,aAAO,EAAE,SAAS,WAAW,GAAG;AAAA,IAClC;AAAA,IAEA,MAAM,UAAU,SAAwC;AACtD,cAAQ,UAAU,OAAO;AACzB,aAAO,EAAE,WAAW,GAAG;AAAA,IACzB;AAAA,IAEA,MAAM,YAAY,SAAqC;AACrD,YAAM,QAAQ,QAAQ,SAAS,OAAO;AACtC,UAAI,CAAC,MAAO,QAAO,CAAC;AACpB,aAAO,QAAQ,SAAS,kBAAkB,YAAY,MAAM,SAAS;AAAA,IACvE;AAAA,EACF;AACF;AAKO,SAAS,qBAAqB,WAAwC;AAC3E,SAAO;AAAA,IACL,MAAM,KAAK,SAAiB,SAA2D;AACrF,YAAM,SAAS,MAAM,UAAU,KAA0B,gBAAgB;AAAA,QACvE;AAAA,QACA;AAAA,MACF,CAAC;AACD,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,UAAU,SAAwC;AACtD,YAAM,SAAS,MAAM,UAAU,KAAmB,mBAAmB,EAAE,QAAQ,CAAC;AAChF,aAAO,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,IACpC;AAAA,IAEA,MAAM,YAAY,SAAqC;AACrD,YAAM,WAAW,MAAM,UAAU,KAAkC,aAAa,EAAE,QAAQ,CAAC;AAC3F,UAAI,CAAC,SAAS,MAAO,QAAO,CAAC;AAC7B,YAAM,SAAS,MAAM,UAAU,KAA8B,kBAAkB;AAAA,QAC7E,SAAS,SAAS,MAAM;AAAA,MAC1B,CAAC;AACD,aAAO,OAAO,YAAY,CAAC;AAAA,IAC7B;AAAA,EACF;AACF;;;ARnCA,IAAM,SAAS,aAAa,oBAAoB;AAKzC,IAAM,cAAN,MAAoC;AAAA,EACxB;AAAA,EACT,aAAa;AAAA,EAEZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAAwB;AAClC,SAAK,UAAU;AACf,UAAM,WAAW,QAAQ;AAEzB,SAAK,aAAa,sBAAsB,QAAQ;AAChD,SAAK,SAAS,kBAAkB,QAAQ;AACxC,SAAK,SAAS,kBAAkB,OAAO;AACvC,SAAK,WAAW,oBAAoB,OAAO;AAC3C,SAAK,gBAAgB,oBAAoB,IAAI;AAE7C,WAAO,KAAK,yBAAyB;AAAA,EACvC;AAAA;AAAA,EAIA,IAAI,YAAqB;AACvB,WAAO,CAAC,KAAK;AAAA,EACf;AAAA,EAEA,IAAI,SAAmB;AACrB,WAAO,KAAK,QAAQ,SAAS;AAAA,EAC/B;AAAA;AAAA,EAIA,GAAqB,MAAS,SAA+D;AAC3F,WAAO,KAAK,QAAQ,SAAS,SAAS,GAAG,MAAM,OAAO;AAAA,EACxD;AAAA,EAEA,MAAM,SAAuC;AAC3C,WAAO,KAAK,QAAQ,SAAS,SAAS,MAAM,OAAO;AAAA,EACrD;AAAA,EAEA,UAAU,YAA0B;AAAA,EAEpC;AAAA;AAAA,EAIA,MAAM,aAA4B;AAAA,EAElC;AAAA,EAEA,MAAM,UAAyB;AAC7B,QAAI,KAAK,WAAY;AACrB,UAAM,KAAK,QAAQ,SAAS;AAC5B,SAAK,aAAa;AAClB,WAAO,KAAK,sBAAsB;AAAA,EACpC;AACF;;;AShFA,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,gBAAAA,qBAAoB;AAgB7B,IAAMC,UAASC,cAAa,qBAAqB;AAK1C,IAAM,eAAN,MAAqC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EAER;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAsB;AAChC,SAAK,SAAS;AACd,SAAK,WAAW,IAAI,aAAa;AAGjC,SAAK,YAAY,IAAI,UAAU;AAAA,MAC7B,KAAK,OAAO;AAAA,MACZ,iBAAiB,OAAO,gBAAgB;AAAA,MACxC,SAAS,OAAO,WAAW;AAAA,MAC3B,eAAe,OAAO,iBAAiB;AAAA,MACvC,SAAS,OAAO;AAAA,MAChB,OAAO;AAAA,IACT,CAAC;AAGD,SAAK,UAAU,cAAc,CAAC,OAAO,UAAU;AAC7C,MAAAD,QAAO,MAAM,yBAAyB,EAAE,OAAO,MAAM,MAAM,KAAK,CAAC;AACjE,WAAK,SAAS,KAAK,KAAiB;AAAA,IACtC,CAAC;AAGD,SAAK,aAAa,uBAAuB,KAAK,SAAS;AACvD,SAAK,SAAS,mBAAmB,KAAK,WAAW,CAAC,cAAc,KAAK,UAAU,SAAS,CAAC;AACzF,SAAK,SAAS,mBAAmB,KAAK,SAAS;AAC/C,SAAK,WAAW,qBAAqB,KAAK,SAAS;AACnD,SAAK,gBAAgB,oBAAoB,IAAI;AAAA,EAC/C;AAAA;AAAA,EAIA,IAAI,YAAqB;AACvB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,IAAI,SAAmB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAIA,MAAM,UAAyB;AAC7B,UAAM,KAAK,UAAU,QAAQ;AAC7B,IAAAA,QAAO,KAAK,uBAAuB,EAAE,KAAK,KAAK,OAAO,UAAU,CAAC;AAAA,EACnE;AAAA,EAEA,MAAM,aAA4B;AAChC,SAAK,UAAU,WAAW;AAC1B,IAAAA,QAAO,KAAK,0BAA0B;AAAA,EACxC;AAAA,EAEA,MAAM,UAAyB;AAC7B,SAAK,UAAU,QAAQ;AACvB,SAAK,SAAS,QAAQ;AACtB,IAAAA,QAAO,KAAK,uBAAuB;AAAA,EACrC;AAAA;AAAA,EAIA,GAAqB,MAAS,SAA+D;AAC3F,WAAO,KAAK,SAAS,GAAG,MAAM,OAAO;AAAA,EACvC;AAAA,EAEA,MAAM,SAAuC;AAC3C,WAAO,KAAK,SAAS,MAAM,OAAO;AAAA,EACpC;AAAA,EAEA,UAAU,WAAyB;AACjC,SAAK,UAAU,UAAU,SAAS;AAClC,IAAAA,QAAO,MAAM,yBAAyB,EAAE,UAAU,CAAC;AAAA,EACrD;AACF;;;AC/DA,eAAsB,aAAa,QAAuC;AACxE,MAAI,OAAO,WAAW;AAEpB,UAAM,iBAAiB,MAAM,yBAAyB,MAAM;AAC5D,UAAM,SAAS,IAAI,aAAa,cAAc;AAC9C,UAAM,OAAO,QAAQ;AACrB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,OAAO,gBAAgB,OAAO,gBAAgB;AAEjE,WAAO,kBAAkB,MAAM;AAAA,EACjC;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAQA,eAAe,yBAAyB,QAA6C;AACnF,MAAI,OAAO,gBAAgB,eAAe;AACxC,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,eAAe,eAAgB,WAAmB,QAAQ,aAAa,QAAW;AAC3F,WAAO;AAAA,EACT;AAGA,MAAI;AACF,UAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,iCAAiC;AAC9E,WAAO;AAAA,MACL,GAAG;AAAA,MACH,gBAAgB;AAAA,QACd,GAAG,OAAO;AAAA,QACV,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF,QAAQ;AAEN,WAAO;AAAA,EACT;AACF;AAKA,eAAe,kBAAkB,QAAuC;AACtE,QAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,wBAAwB;AAGrE,MAAI;AACJ,MAAI,OAAO,gBAAgB;AACzB,eAAW,OAAO;AAAA,EACpB,OAAO;AACL,UAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,yBAAyB;AACrE,eAAW,MAAM,mBAAmB;AAAA,MAClC,UAAU,OAAO,YAAY;AAAA,MAC7B,UAAU,OAAO,aAAa,OAAO,QAAQ,UAAU;AAAA,IACzD,CAAC;AAAA,EACH;AAGA,MAAI,eAAe,OAAO;AAC1B,MAAI,CAAC,cAAc;AACjB,UAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,uBAAuB;AACjE,mBAAe,CAAC,iBAA+D;AAC7E,YAAM,kBAAmB,aAAqB,WAAW,CAAC;AAC1D,aAAO,iBAAiB;AAAA,QACtB,GAAG;AAAA,QACH,QAAQ,OAAO,UAAU,aAAa;AAAA,QACtC,SAAS,OAAO,WAAW,aAAa;AAAA,QACxC,OAAO,OAAO,SAAS,aAAa;AAAA,QACpC,SAAS;AAAA,UACP,GAAG;AAAA,UACH,UAAU,OAAO,YAAY,gBAAgB,YAAY;AAAA,QAC3D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,UAAU,oBAAoB,UAAU,YAAY;AAE1D,SAAO,IAAI,YAAY,OAAO;AAChC;","names":["createLogger","logger","createLogger"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentxjs",
3
- "version": "2.0.1",
3
+ "version": "3.0.0",
4
4
  "description": "AgentX Client SDK - Local and remote AI agent management",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -25,15 +25,15 @@
25
25
  "bdd:developer": "bdd --tags @developer"
26
26
  },
27
27
  "dependencies": {
28
- "@agentxjs/core": "^2.0.1",
29
- "@agentxjs/mono-driver": "^2.0.1",
30
- "@agentxjs/node-platform": "^2.0.1",
28
+ "@agentxjs/core": "^3.0.0",
29
+ "@agentxjs/mono-driver": "^3.0.0",
30
+ "@agentxjs/node-platform": "^3.0.0",
31
31
  "reconnecting-websocket": "^4.4.0",
32
32
  "ws": "^8.18.0"
33
33
  },
34
34
  "devDependencies": {
35
- "@agentxjs/devtools": "^2.0.1",
36
- "@agentxjs/server": "^2.0.1",
35
+ "@agentxjs/devtools": "^3.0.0",
36
+ "@agentxjs/server": "^3.0.0",
37
37
  "@types/ws": "^8.5.10",
38
38
  "tsx": "^4.19.0",
39
39
  "typescript": "^5.3.3"
@@ -47,7 +47,7 @@ export class RemoteClient implements AgentX {
47
47
  // Create RPC client (WebSocket factory from platform if available)
48
48
  this.rpcClient = new RpcClient({
49
49
  url: config.serverUrl!,
50
- createWebSocket: config.customPlatform?.webSocketFactory,
50
+ createWebSocket: config.customPlatform?.channelClient,
51
51
  timeout: config.timeout ?? 30000,
52
52
  autoReconnect: config.autoReconnect ?? true,
53
53
  headers: config.headers as Record<string, string> | undefined,
package/src/index.ts CHANGED
@@ -69,11 +69,11 @@ export async function createAgentX(config: AgentXConfig): Promise<AgentX> {
69
69
  /**
70
70
  * Resolve platform for remote mode
71
71
  *
72
- * In Node.js: auto-import node-platform to get webSocketFactory
72
+ * In Node.js: auto-import node-platform to get channelClient
73
73
  * In browser: no platform needed (native WebSocket is the default)
74
74
  */
75
75
  async function resolvePlatformForRemote(config: AgentXConfig): Promise<AgentXConfig> {
76
- if (config.customPlatform?.webSocketFactory) {
76
+ if (config.customPlatform?.channelClient) {
77
77
  return config;
78
78
  }
79
79
 
@@ -82,14 +82,14 @@ async function resolvePlatformForRemote(config: AgentXConfig): Promise<AgentXCon
82
82
  return config;
83
83
  }
84
84
 
85
- // Node.js — auto-resolve webSocketFactory from node-platform
85
+ // Node.js — auto-resolve channelClient from node-platform
86
86
  try {
87
87
  const { createNodeWebSocket } = await import("@agentxjs/node-platform/network");
88
88
  return {
89
89
  ...config,
90
90
  customPlatform: {
91
91
  ...config.customPlatform,
92
- webSocketFactory: createNodeWebSocket,
92
+ channelClient: createNodeWebSocket,
93
93
  } as any,
94
94
  };
95
95
  } catch {