@nebulaos/client 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/config/client-config.ts","../src/errors/client-errors.ts","../src/registry/registry.ts","../src/connection/server-connection.ts","../src/logger/time.ts","../src/logger/summaries.ts","../src/client.ts","../src/telemetry/http-telemetry-exporter.ts","../src/domain-events/http-domain-events-exporter.ts","../src/logger/client-debug.ts","../src/tracing/setup.ts","../src/tracing/otel-provider.ts","../src/http/instrumented-http-client.ts","../src/telemetry/telemetry.service.ts","../src/telemetry/batcher.ts","../src/telemetry/socket-telemetry-exporter.ts","../src/memory/db-memory.ts","../src/prompts/prompt-capture.ts","../src/rag/rag-client.ts"],"sourcesContent":["export * from \"./client\";\r\nexport * from \"./telemetry\";\r\nexport * from \"./tracing\";\r\nexport * from \"./domain-events\";\r\nexport * from \"./memory\";\r\nexport * from \"./prompts\";\r\nexport * from \"./rag\";\r\nexport * from \"./config/client-config\";\r\nexport * from \"./errors/client-errors\";\r\nexport * from \"./http/index.js\";\r\nexport type { AgentFactory, AgentOrFactory } from \"./registry/registry\";\r\n\r\n","import type { BaseAgent } from \"@nebulaos/core\";\nimport type { Tool } from \"@nebulaos/core\";\nimport type { Workflow } from \"@nebulaos/core\";\nimport type { LogLevel } from \"@nebulaos/core\";\nimport { z } from \"zod\";\nimport type { AgentOrFactory } from \"../registry/registry.js\";\n\nexport const serverConfigSchema = z.object({\n url: z.string().min(1),\n apiKey: z.string().min(1),\n batchSize: z.number().int().positive().optional(),\n flushInterval: z.number().int().positive().optional(),\n});\n\nexport type ServerConfig = z.infer<typeof serverConfigSchema>;\n\nexport const otelTracingConfigSchema = z.object({\n /** OTLP HTTP endpoint. Defaults to http://localhost:4318/v1/traces */\n otlpEndpoint: z.string().optional(),\n});\n\nexport type OTelTracingClientConfig = z.infer<typeof otelTracingConfigSchema>;\n\nexport const clientConfigSchema = z.object({\n /**\n * @deprecated clientId is now automatically extracted from the API key.\n * This field is optional and only used for local identification/logging.\n */\n clientId: z.string().min(1).optional(),\n /**\n * List of agents to register. Can be either:\n * - Agent instances (backwards compatible, but may cause memory leakage between executions)\n * - Factory functions that return agent instances (recommended for proper isolation)\n */\n agents: z.array(z.custom<AgentOrFactory>()).optional(),\n tools: z.array(z.custom<Tool>()).optional(),\n workflows: z.array(z.custom<Workflow>()).optional(),\n server: serverConfigSchema.optional(),\n /**\n * OpenTelemetry tracing configuration.\n * When set, the client will set up an OTel TracerProvider and export\n * spans directly to the configured OTLP endpoint.\n */\n tracing: otelTracingConfigSchema.optional(),\n /**\n * Client-side log level (same semantics as @nebulaos/core ConsoleLogger).\n * When set to anything other than \"none\", the client will emit debug logs for\n * WS/HTTP communication (without full payloads).\n */\n logLevel: z.custom<LogLevel>().optional(),\n // Backwards compatibility (deprecated): prefer `logLevel`.\n debug: z\n .object({\n enabled: z.boolean().optional(),\n level: z.custom<LogLevel>().optional(),\n })\n .optional(),\n});\n\nexport type ClientConfig = z.infer<typeof clientConfigSchema>;\n","export class ClientError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly code: string,\r\n public readonly statusCode: number = 500,\r\n public readonly details?: unknown,\r\n ) {\r\n super(message);\r\n this.name = \"ClientError\";\r\n }\r\n}\r\n\r\nexport class RegistryError extends ClientError {\r\n constructor(message: string, details?: unknown) {\r\n super(message, \"REGISTRY_ERROR\", 400, details);\r\n this.name = \"RegistryError\";\r\n }\r\n}\r\n\r\nexport class NotFoundError extends ClientError {\r\n constructor(entity: \"agent\" | \"workflow\" | \"tool\", id: string) {\r\n super(`${entity} '${id}' not found`, \"NOT_FOUND\", 404);\r\n this.name = \"NotFoundError\";\r\n }\r\n}\r\n\r\nexport class AuthenticationError extends ClientError {\r\n constructor(message: string = \"Authentication failed: Invalid API key or missing credentials\", details?: unknown) {\r\n super(message, \"AUTHENTICATION_ERROR\", 401, details);\r\n this.name = \"AuthenticationError\";\r\n }\r\n}\r\n\r\nexport class ConnectionError extends ClientError {\r\n constructor(message: string, details?: unknown) {\r\n super(message, \"CONNECTION_ERROR\", 0, details);\r\n this.name = \"ConnectionError\";\r\n }\r\n}\r\n\r\n","import type { BaseAgent } from \"@nebulaos/core\";\nimport type { Tool } from \"@nebulaos/core\";\nimport type { Workflow } from \"@nebulaos/core\";\nimport type { IHttpClient } from \"@nebulaos/types\";\nimport { NotFoundError, RegistryError } from \"../errors/client-errors.js\";\n\n/**\n * Factory function that creates a new agent instance.\n * Used to avoid memory/context leakage between executions.\n */\nexport type AgentFactory = () => BaseAgent;\n\n/**\n * Input that can be either an agent instance (backwards compat) or a factory function.\n */\nexport type AgentOrFactory = BaseAgent | AgentFactory;\n\n/**\n * Internal entry storing an agent factory and cached metadata.\n */\ninterface AgentEntry {\n factory: AgentFactory;\n /** Cached id for lookups (resolved from a sample instance) */\n id: string;\n /** Cached name for lookups (resolved from a sample instance) */\n name: string;\n}\n\nexport class Registry {\n private readonly agentsById = new Map<string, AgentEntry>();\n private readonly agentsByName = new Map<string, AgentEntry>();\n private readonly workflows = new Map<string, Workflow>();\n private readonly toolsById = new Map<string, Tool>();\n private httpClient?: IHttpClient;\n\n /**\n * Sets the HTTP client to be injected into agents for tool execution.\n */\n setHttpClient(client: IHttpClient): void {\n this.httpClient = client;\n }\n\n /**\n * Registers an agent factory or instance.\n *\n * If an instance is passed directly (backwards compatibility), it will be wrapped\n * in a factory that always returns the same instance. For proper isolation between\n * executions, prefer passing a factory function.\n *\n * @param agentOrFactory - Agent instance or factory function\n */\n registerAgent(agentOrFactory: AgentOrFactory): void {\n let factory: AgentFactory;\n let sampleAgent: BaseAgent;\n\n if (typeof agentOrFactory === \"function\") {\n // It's a factory function - use it and create a sample for metadata\n factory = agentOrFactory;\n sampleAgent = factory();\n } else {\n // It's an instance - wrap in a factory for backwards compatibility\n // NOTE: This still shares the same instance (memory leak risk).\n // Users should migrate to factory pattern for proper isolation.\n const instance = agentOrFactory;\n factory = () => instance;\n sampleAgent = instance;\n }\n\n const id =\n \"id\" in (sampleAgent as any) &&\n typeof (sampleAgent as any).id === \"string\" &&\n (sampleAgent as any).id\n ? ((sampleAgent as any).id as string)\n : sampleAgent.name;\n\n if (this.agentsById.has(id)) {\n throw new RegistryError(`Agent '${id}' already registered`);\n }\n // Keep compatibility with lookups by name (older protocol).\n if (this.agentsByName.has(sampleAgent.name)) {\n throw new RegistryError(`Agent name '${sampleAgent.name}' already registered`);\n }\n\n const entry: AgentEntry = {\n factory,\n id,\n name: sampleAgent.name,\n };\n\n this.agentsById.set(id, entry);\n this.agentsByName.set(sampleAgent.name, entry);\n }\n\n registerWorkflow(workflow: Workflow): void {\n const workflowId = workflow.id;\n if (!workflowId) {\n throw new RegistryError(\"Workflow id is required to register workflow\");\n }\n if (this.workflows.has(workflowId)) {\n throw new RegistryError(`Workflow '${workflowId}' already registered`);\n }\n this.workflows.set(workflowId, workflow);\n }\n\n registerTool(tool: Tool): void {\n const id = (tool as any)?.id;\n if (!id || typeof id !== \"string\") {\n throw new RegistryError(\"Tool id is required to register tool\");\n }\n if (this.toolsById.has(id)) {\n throw new RegistryError(`Tool '${id}' already registered`);\n }\n this.toolsById.set(id, tool);\n }\n\n /**\n * Gets a new agent instance by id or name.\n *\n * Each call creates a fresh instance via the registered factory,\n * ensuring no memory/context leakage between executions.\n *\n * @param idOrName - Agent id or name\n * @returns A new agent instance\n */\n getAgent(idOrName: string): BaseAgent {\n const entry = this.agentsById.get(idOrName) ?? this.agentsByName.get(idOrName);\n if (!entry) {\n throw new NotFoundError(\"agent\", idOrName);\n }\n // Call factory to create a fresh instance for this execution\n const agent = entry.factory();\n\n // Inject HTTP client if available (Agent class has setHttpClient method)\n if (this.httpClient && typeof (agent as any).setHttpClient === \"function\") {\n (agent as any).setHttpClient(this.httpClient);\n }\n\n return agent;\n }\n\n getWorkflow(id: string): Workflow {\n const workflow = this.workflows.get(id);\n if (!workflow) {\n throw new NotFoundError(\"workflow\", id);\n }\n return workflow;\n }\n\n getTool(id: string): Tool {\n const tool = this.toolsById.get(id);\n if (!tool) {\n throw new NotFoundError(\"tool\", id);\n }\n return tool;\n }\n\n /**\n * Lists all registered agents by creating a sample instance of each.\n *\n * Used for Cloud registration where we need agent metadata (name, id, tools, etc).\n * Creates one instance per agent to extract metadata.\n *\n * @returns Array of agent instances (one per registered agent)\n */\n listAgents(): BaseAgent[] {\n // Create a sample instance of each agent to get metadata\n return Array.from(this.agentsById.values()).map((entry) => entry.factory());\n }\n\n listTools(): Tool[] {\n return Array.from(this.toolsById.values());\n }\n\n listWorkflows(): Workflow[] {\n return Array.from(this.workflows.values());\n }\n}\n\n","import { io, Socket } from \"socket.io-client\";\nimport { v4 as uuid } from \"uuid\";\nimport type { BaseAgent, Tool, Workflow } from \"@nebulaos/core\";\nimport { ExecutionContext, Tracing } from \"@nebulaos/core\";\nimport type { ILogger } from \"@nebulaos/core\";\nimport type { ZodSchema } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport type {\n AgentCommandPayload,\n ClientToServerEvents,\n CommandError,\n CommandResponse,\n RegisterClientPayload,\n RegisterResponse,\n ServerToClientEvents,\n ShutdownResponse,\n ToolCommandPayload,\n WorkflowCommandPayload,\n} from \"./types.js\";\nimport type { Registry } from \"../registry/registry.js\";\nimport { AuthenticationError, ConnectionError } from \"../errors/client-errors.js\";\nimport { nowMs, durationMs } from \"../logger/time.js\";\nimport { summarizeValue } from \"../logger/summaries.js\";\n\n// =============================================================================\n// Type Helpers for Internal Access\n// =============================================================================\n\n/**\n * Workflow with internal node access (for definition building).\n */\ninterface WorkflowWithInternalNodes {\n __internalNodes(): readonly InternalNode[];\n describe(): {\n workflowId: string;\n name?: string;\n description?: string;\n version: string;\n nodes: Array<{\n id: string;\n displayName: string;\n type: string;\n metadata?: Record<string, unknown>;\n agentName?: string;\n agentId?: string;\n }>;\n edges: Array<{\n from: string;\n to: string;\n type: string;\n label?: string;\n }>;\n };\n}\n\n/**\n * Internal node structure from Workflow graph.\n */\ntype InternalNode =\n | {\n id: string;\n displayName: string;\n type: \"start\" | \"step\" | \"finish\";\n handler: unknown;\n }\n | {\n id: string;\n displayName: string;\n type: \"agent\";\n agent: BaseAgent;\n toInput?: unknown;\n }\n | {\n id: string;\n displayName: string;\n type: \"branch\";\n selector: unknown;\n branches: Record<string, Workflow>;\n }\n | {\n id: string;\n displayName: string;\n type: \"parallel\";\n workflows: Workflow[];\n };\n\n/**\n * Workflow definition structure.\n */\ninterface WorkflowDefinition {\n workflowId: string;\n name?: string;\n description?: string;\n version: string;\n nodes: WorkflowDefinitionNode[];\n edges: WorkflowDefinitionEdge[];\n}\n\n/**\n * Workflow definition node.\n */\ninterface WorkflowDefinitionNode {\n id: string;\n displayName: string;\n type: string;\n metadata?: Record<string, unknown>;\n agentName?: string;\n agentId?: string;\n}\n\n/**\n * Workflow definition edge.\n */\ninterface WorkflowDefinitionEdge {\n from: string;\n to: string;\n type: string;\n label?: string;\n}\n\n/**\n * Agent with config access (for definition building).\n * This is a type-safe way to access config on agents that have it.\n */\ntype AgentWithConfig = BaseAgent & {\n config: AgentConfig;\n};\n\n/**\n * Agent configuration structure.\n */\ninterface AgentConfig {\n id: string;\n name: string;\n model: IModel;\n memory: unknown;\n instructions: AgentInstruction;\n tools?: Tool[];\n maxSteps?: number;\n piiMasker?: unknown;\n interceptors?: {\n request?: RequestInterceptor[];\n response?: ResponseInterceptor[];\n };\n logger?: unknown;\n logLevel?: string;\n}\n\n/**\n * Model interface for extracting provider/model info.\n */\ninterface IModel {\n providerName: string;\n modelName: string;\n capabilities?: ModelCapabilities;\n}\n\n/**\n * Model capabilities.\n */\ninterface ModelCapabilities {\n inputFiles?: {\n mimeTypes: readonly string[] | \"any\";\n sources: ReadonlyArray<string>;\n };\n}\n\n/**\n * Agent instruction (string or resolvable).\n */\ntype AgentInstruction = string | { resolve(): Promise<string> };\n\n/**\n * Request interceptor function.\n */\ntype RequestInterceptor = (...args: unknown[]) => unknown;\n\n/**\n * Response interceptor function.\n */\ntype ResponseInterceptor = (...args: unknown[]) => unknown;\n\nexport interface ServerConnectionConfig {\n url: string;\n apiKey: string;\n /**\n * Stable semantic id defined by the developer/runtime deployment.\n * This value MUST be stable across restarts, otherwise the Cloud will treat it as a new client.\n */\n clientId: string;\n /**\n * Unique instance identifier for this running process/container/VM.\n * Defaults to a random UUID if not provided.\n */\n instanceId?: string;\n /**\n * Optional: snapshot interval for presence/availability refresh.\n * Defaults to 60 seconds.\n */\n snapshotIntervalMs?: number;\n}\n\nexport class ServerConnection {\n private socket: Socket<ServerToClientEvents, ClientToServerEvents>;\n private reconnectAttempts = 0;\n private registry?: Registry;\n private agents: BaseAgent[] = [];\n private tools: Tool[] = [];\n private workflows: Workflow[] = [];\n private snapshotTimer?: ReturnType<typeof setInterval>;\n private connectionAttempted = false;\n private lastConnectError: Error | null = null;\n private hasAuthenticated = false;\n private readonly logger?: ILogger;\n private readonly commandStarts = new Map<string, number>();\n\n private readonly clientId: string;\n private readonly instanceId: string;\n\n constructor(\n private readonly config: ServerConnectionConfig,\n logger?: ILogger,\n ) {\n this.clientId = config.clientId;\n this.instanceId = config.instanceId ?? uuid();\n this.logger = logger;\n this.socket = this.createSocket();\n }\n\n /**\n * Sets the registry for executing agents and workflows.\n */\n setRegistry(registry: Registry): void {\n this.registry = registry;\n }\n\n /**\n * Stores agents and workflows for registration.\n */\n registerResources(agents: BaseAgent[], tools: Tool[], workflows: Workflow[]): void {\n this.agents = agents;\n this.tools = tools;\n this.workflows = workflows;\n }\n\n private collectAgentsFromWorkflows(): BaseAgent[] {\n const out: BaseAgent[] = [];\n const seen = new Set<string>();\n\n for (const workflow of this.workflows) {\n const workflowWithNodes = workflow as unknown as WorkflowWithInternalNodes;\n if (typeof workflowWithNodes.__internalNodes !== \"function\") continue;\n\n const nodes = workflowWithNodes.__internalNodes();\n if (!Array.isArray(nodes)) continue;\n\n for (const node of nodes) {\n if (node.type !== \"agent\") continue;\n const agentNode = node as Extract<InternalNode, { type: \"agent\" }>;\n const agent = agentNode.agent;\n if (!agent) continue;\n\n const id = agent.id ?? agent.name;\n if (!id) continue;\n if (seen.has(id)) continue;\n seen.add(id);\n out.push(agent);\n }\n }\n\n return out;\n }\n\n private collectToolsFromAgents(agents: BaseAgent[]): Tool[] {\n const out: Tool[] = [];\n const seen = new Set<string>();\n\n for (const agent of agents) {\n const agentWithConfig = agent as unknown as Partial<AgentWithConfig>;\n const config = agentWithConfig.config;\n if (!config || typeof config !== \"object\") continue;\n\n const tools = Array.isArray(config.tools) ? config.tools : [];\n for (const tool of tools) {\n if (!tool || typeof tool.id !== \"string\") continue;\n if (seen.has(tool.id)) continue;\n seen.add(tool.id);\n out.push(tool);\n }\n }\n\n return out;\n }\n\n /**\n * Creates and configures the Socket.IO client.\n */\n private createSocket(): Socket<ServerToClientEvents, ClientToServerEvents> {\n const socket = io(`${this.config.url}/runtime`, {\n auth: { token: this.config.apiKey },\n reconnection: true,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 5000,\n transports: [\"websocket\"],\n });\n\n this.setupEventHandlers(socket);\n return socket;\n }\n\n /**\n * Sets up Socket.IO event handlers\n */\n private setupEventHandlers(socket: Socket<ServerToClientEvents, ClientToServerEvents>): void {\n socket.on(\"connect\", () => {\n if (this.logger) {\n this.logger.info(\"WS connected\", { url: this.config.url, transport: \"websocket\" });\n } else {\n console.log(\"✅ Connected to NebulaOS Cloud\");\n }\n this.reconnectAttempts = 0;\n this.lastConnectError = null;\n // Transport connected does not guarantee auth was accepted.\n this.hasAuthenticated = false;\n });\n\n socket.on(\"disconnect\", (reason: string) => {\n // Log disconnect with context\n if (!this.hasAuthenticated && reason === \"io server disconnect\") {\n if (this.logger) {\n this.logger.error(\"WS rejected by server (likely auth failure)\", { reason });\n } else {\n console.error(\n `🔐 Connection rejected by server (likely authentication failure). ` +\n `Please check your NEBULAOS_API_KEY environment variable. ` +\n `(Reason: ${reason})`,\n );\n }\n } else {\n if (this.logger) {\n this.logger.warn(\"WS disconnected\", { reason });\n } else {\n console.warn(`⚠️ Disconnected: ${reason}`);\n }\n }\n });\n\n socket.on(\"connect_error\", (error: Error) => {\n this.reconnectAttempts++;\n this.lastConnectError = error;\n\n const rawMessage = error instanceof Error ? error.message : String(error);\n const rawStack = error instanceof Error ? error.stack : undefined;\n\n // Socket.IO may include server-provided details in `error.data`.\n const errorWithData = error as Error & { data?: { message?: string; error?: string } };\n const serverData = errorWithData.data;\n const serverMessage =\n typeof serverData?.message === \"string\"\n ? serverData.message\n : typeof serverData?.error === \"string\"\n ? serverData.error\n : undefined;\n\n // Heuristic only for hints (never replaces the original error).\n const lower = rawMessage.toLowerCase();\n const looksLikeAuth =\n lower.includes(\"authorization\") ||\n lower.includes(\"token\") ||\n lower.includes(\"unauthorized\") ||\n lower.includes(\"authentication\") ||\n lower.includes(\"api key\") ||\n lower.includes(\"invalid\");\n\n const meta = {\n url: this.config.url,\n attempt: this.reconnectAttempts,\n serverMessage,\n serverData,\n // Preserve raw stack for debugging (dev use)\n stack: rawStack,\n hint: looksLikeAuth\n ? \"Looks like auth failure. Check NEBULAOS_API_KEY.\"\n : \"See error details above (network/DNS/URL/CORS).\",\n };\n if (this.logger) {\n this.logger.error(`WS connect_error: ${rawMessage}`, meta);\n } else {\n console.error(`❌ connect_error (attempt ${this.reconnectAttempts}): ${rawMessage}`, meta);\n }\n });\n\n // Cloud emits this after auth succeeds; we always (re)register on connect.\n socket.on(\"client:online\", () => {\n this.hasAuthenticated = true;\n if (this.logger) {\n this.logger.info(\"WS authenticated (client:online)\");\n }\n void this.registerFull();\n });\n\n // Command handlers\n socket.on(\n \"command:execute:agent\",\n (payload: AgentCommandPayload) => void this.handleAgentCommand(payload),\n );\n socket.on(\n \"command:execute:workflow\",\n (payload: WorkflowCommandPayload) => void this.handleWorkflowCommand(payload),\n );\n socket.on(\n \"command:execute:tool\",\n (payload: ToolCommandPayload) => void this.handleToolCommand(payload),\n );\n }\n\n /**\n * Handles agent execution commands from the server\n */\n private async handleAgentCommand(payload: AgentCommandPayload): Promise<void> {\n const startedAt = nowMs();\n this.commandStarts.set(payload.commandId, startedAt);\n if (this.logger) {\n this.logger.info(\"Command received\", {\n type: payload.type,\n target: payload.targetName,\n commandId: payload.commandId,\n executionId: payload.executionId,\n input: summarizeValue(payload.input),\n });\n } else {\n console.log(`📥 Received agent execution command: ${payload.targetName}`);\n }\n\n if (!this.registry) {\n this.sendError(payload.commandId, {\n code: \"REGISTRY_NOT_SET\",\n message: \"Registry not configured\",\n });\n return;\n }\n\n try {\n const agent = this.registry.getAgent(payload.targetName);\n // IMPORTANT:\n // - Cloud uses `payload.executionId` as the stable execution identifier.\n // - We pass it as `executionId` to agent.execute() so the agent's telemetry span uses it.\n //\n // Input handling:\n // - String: pass as-is\n // - Array (ContentPart[]): pass directly for multimodal support\n // - Object: stringify for backward compatibility\n let agentInput: string | unknown[] | undefined;\n if (payload.input) {\n if (typeof payload.input === \"string\") {\n agentInput = payload.input;\n } else if (Array.isArray(payload.input)) {\n // Multimodal content parts - pass directly\n agentInput = payload.input;\n } else {\n agentInput = JSON.stringify(payload.input);\n }\n }\n\n const options =\n payload.options && typeof payload.options === \"object\"\n ? { ...payload.options, executionId: payload.executionId }\n : { executionId: payload.executionId };\n const result = await ExecutionContext.run(\n {\n executionId: payload.executionId,\n rootExecutionId: payload.executionId,\n parentExecutionId: undefined,\n },\n async () => agent.execute(agentInput as never, options as never),\n );\n\n this.sendResponse(payload.commandId, payload.executionId, result);\n if (this.logger) {\n this.logger.info(\"Command handled\", {\n commandId: payload.commandId,\n executionId: payload.executionId,\n durationMs: Number(durationMs(startedAt).toFixed(2)),\n });\n }\n } catch (error) {\n this.sendError(payload.commandId, {\n code: \"AGENT_EXECUTION_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n details: error,\n });\n }\n }\n\n /**\n * Handles workflow execution commands from the server\n */\n private async handleWorkflowCommand(payload: WorkflowCommandPayload): Promise<void> {\n const startedAt = nowMs();\n this.commandStarts.set(payload.commandId, startedAt);\n if (this.logger) {\n this.logger.info(\"Command received\", {\n type: payload.type,\n target: payload.targetName,\n commandId: payload.commandId,\n executionId: payload.executionId,\n input: summarizeValue(payload.input),\n });\n } else {\n console.log(`📥 Received workflow execution command: ${payload.targetName}`);\n }\n\n if (!this.registry) {\n this.sendError(payload.commandId, {\n code: \"REGISTRY_NOT_SET\",\n message: \"Registry not configured\",\n });\n return;\n }\n\n try {\n const workflow = this.registry.getWorkflow(payload.targetName);\n // IMPORTANT: force the SDK workflow executionId to match Cloud executionId.\n // This makes Tempo queries by executionId work.\n const result = await ExecutionContext.run(\n {\n executionId: payload.executionId,\n rootExecutionId: payload.executionId,\n parentExecutionId: undefined,\n },\n async () =>\n workflow.run(\n payload.input as never,\n { executionId: payload.executionId } as never,\n ),\n );\n this.sendResponse(payload.commandId, payload.executionId, result);\n if (this.logger) {\n this.logger.info(\"Command handled\", {\n commandId: payload.commandId,\n executionId: payload.executionId,\n durationMs: Number(durationMs(startedAt).toFixed(2)),\n });\n }\n } catch (error) {\n this.sendError(payload.commandId, {\n code: \"WORKFLOW_EXECUTION_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n details: error,\n });\n }\n }\n\n /**\n * Handles tool execution commands from the server.\n */\n private async handleToolCommand(payload: ToolCommandPayload): Promise<void> {\n const startedAt = nowMs();\n this.commandStarts.set(payload.commandId, startedAt);\n if (this.logger) {\n this.logger.info(\"Command received\", {\n type: payload.type,\n target: payload.targetName,\n commandId: payload.commandId,\n executionId: payload.executionId,\n input: summarizeValue(payload.input),\n });\n } else {\n console.log(`📥 Received tool execution command: ${payload.targetName}`);\n }\n\n if (!this.registry) {\n this.sendError(payload.commandId, {\n code: \"REGISTRY_NOT_SET\",\n message: \"Registry not configured\",\n });\n return;\n }\n\n try {\n const tool = this.registry.getTool(payload.targetName);\n\n const result = await ExecutionContext.run(\n {\n executionId: payload.executionId,\n rootExecutionId: payload.executionId,\n parentExecutionId: undefined,\n },\n async () =>\n Tracing.withSpan(\n {\n kind: \"tool\",\n name: `tool:${tool.id}`,\n executionId: payload.executionId,\n data: {\n toolId: tool.id,\n },\n },\n async () => {\n // Tools validate input via inputSchema; we pass the payload as-is.\n // NOTE: the tool handler signature is (ctx, input). For direct runtime execution, ctx is empty.\n return tool.execute({}, payload.input);\n },\n ),\n );\n\n this.sendResponse(payload.commandId, payload.executionId, result);\n if (this.logger) {\n this.logger.info(\"Command handled\", {\n commandId: payload.commandId,\n executionId: payload.executionId,\n durationMs: Number(durationMs(startedAt).toFixed(2)),\n });\n }\n } catch (error) {\n this.sendError(payload.commandId, {\n code: \"TOOL_EXECUTION_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n details: error,\n });\n }\n }\n\n /**\n * Executes an agent and waits for completion\n */\n // NOTE:\n // We intentionally removed the previous \"wait for start event to resolve executionId\" logic.\n // Cloud already provides a stable `payload.executionId` and expects it back in `command:response`.\n\n /**\n * Sends a successful command response to the server\n */\n private sendResponse(commandId: string, executionId: string, result: unknown): void {\n const response: CommandResponse = {\n commandId,\n executionId,\n result,\n };\n\n this.socket.emit(\"command:response\", response);\n const startedAt = this.commandStarts.get(commandId);\n if (this.logger) {\n this.logger.info(\"Command response sent\", {\n commandId,\n executionId,\n durationMs: startedAt ? Number(durationMs(startedAt).toFixed(2)) : undefined,\n result: summarizeValue(result),\n });\n } else {\n console.log(`✅ Sent response for command ${commandId}`);\n }\n }\n\n /**\n * Sends an error response to the server\n */\n private sendError(\n commandId: string,\n error: { code: string; message: string; details?: unknown },\n ): void {\n const errorResponse: CommandError = {\n commandId,\n error,\n };\n\n this.socket.emit(\"command:error\", errorResponse);\n const startedAt = this.commandStarts.get(commandId);\n if (this.logger) {\n this.logger.error(\"Command error sent\", {\n commandId,\n durationMs: startedAt ? Number(durationMs(startedAt).toFixed(2)) : undefined,\n code: error.code,\n message: error.message,\n });\n } else {\n console.error(`❌ Sent error for command ${commandId}:`, error.message);\n }\n }\n\n /**\n * Gets the stable ID for an agent (id if available, otherwise name).\n */\n private getAgentId(agent: BaseAgent): string {\n return agent.id ?? agent.name;\n }\n\n /**\n * Gets the description from an agent if available.\n */\n private getAgentDescription(agent: BaseAgent): string | undefined {\n const agentWithConfig = agent as unknown as Partial<AgentWithConfig>;\n const config = agentWithConfig.config;\n if (config && typeof config === \"object\" && \"description\" in config) {\n return typeof config.description === \"string\" ? config.description : undefined;\n }\n return undefined;\n }\n\n /**\n * Builds the Cloud registration payload (RegisterClientDto compatible).\n */\n private async buildRegisterPayload(input: {\n includeDefinitions: boolean;\n }): Promise<RegisterClientPayload> {\n // Auto-discover agents referenced inside workflows so UI can inspect them\n // without requiring the user to duplicate them in `NebulaClient({ agents: [...] })`.\n const workflowAgents = this.collectAgentsFromWorkflows();\n const agents = [...this.agents];\n for (const agent of workflowAgents) {\n const id = this.getAgentId(agent);\n const exists = agents.some((x) => this.getAgentId(x) === id);\n if (!exists) agents.push(agent);\n }\n\n // Auto-discover tools from all agents (including workflow-only agents).\n const agentTools = this.collectToolsFromAgents(agents);\n const tools = [...this.tools];\n for (const tool of agentTools) {\n if (tools.some((x) => x.id === tool.id)) continue;\n tools.push(tool);\n }\n\n const resources: Array<\n | {\n type: \"agent\";\n runtimeResourceId: string;\n displayName: string;\n kind: string;\n description?: string;\n definition?: Record<string, unknown>;\n }\n | {\n type: \"workflow\";\n runtimeResourceId: string;\n displayName: string;\n description?: string;\n definition?: Record<string, unknown>;\n }\n | {\n type: \"tool\";\n runtimeResourceId: string;\n displayName: string;\n description?: string;\n definition?: Record<string, unknown>;\n }\n > = [\n ...agents.map((agent) => {\n const runtimeResourceId = this.getAgentId(agent);\n const description = this.getAgentDescription(agent);\n\n return {\n type: \"agent\" as const,\n runtimeResourceId,\n displayName: agent.name,\n kind: agent.kind,\n description,\n };\n }),\n ...this.workflows.map((workflow) => {\n const definition = input.includeDefinitions\n ? this.buildWorkflowDefinition(workflow)\n : undefined;\n return {\n type: \"workflow\" as const,\n runtimeResourceId: workflow.id,\n displayName: workflow.name ?? workflow.id,\n description: workflow.description,\n ...(definition ? { definition } : {}),\n };\n }),\n ...tools.map((tool) => {\n const definition = input.includeDefinitions ? this.buildToolDefinition(tool) : undefined;\n return {\n type: \"tool\" as const,\n runtimeResourceId: tool.id,\n displayName: tool.id,\n description: tool.description,\n ...(definition ? { definition } : {}),\n };\n }),\n ];\n\n // Fill agent definitions asynchronously (instructions may require resolving).\n if (input.includeDefinitions) {\n await Promise.all(\n resources\n .filter((r): r is Extract<typeof r, { type: \"agent\" }> => r.type === \"agent\")\n .map(async (r) => {\n const agent = agents.find((a) => this.getAgentId(a) === r.runtimeResourceId);\n if (!agent) return;\n const def = await this.buildAgentDefinition(agent);\n if (def) r.definition = def;\n }),\n );\n }\n\n return {\n instanceId: this.instanceId,\n // Dedupe by (type + runtimeResourceId) to avoid duplicates when tools are discovered from multiple sources.\n resources: resources.filter((r, idx, arr) => {\n const key = `${r.type}:${r.runtimeResourceId}`;\n return idx === arr.findIndex((x) => `${x.type}:${x.runtimeResourceId}` === key);\n }),\n };\n }\n\n private isZodSchema(value: unknown): value is ZodSchema<unknown> {\n return (\n !!value &&\n typeof value === \"object\" &&\n \"safeParse\" in value &&\n typeof (value as { safeParse?: unknown }).safeParse === \"function\"\n );\n }\n\n private isInstructionResolvable(value: unknown): value is { resolve: () => Promise<string> } {\n return (\n !!value &&\n typeof value === \"object\" &&\n \"resolve\" in value &&\n typeof (value as { resolve?: unknown }).resolve === \"function\"\n );\n }\n\n /**\n * Agent definition payload for Cloud persistence + UI inspection.\n *\n * IMPORTANT:\n * - Do NOT embed tool schemas here; tools are registered as independent resources.\n * - We only reference tool ids to avoid duplication.\n */\n private async buildAgentDefinition(\n agent: BaseAgent,\n ): Promise<Record<string, unknown> | undefined> {\n const agentWithConfig = agent as unknown as Partial<AgentWithConfig>;\n const config = agentWithConfig.config;\n if (!config || typeof config !== \"object\") return undefined;\n\n const model = config.model;\n const instructions = config.instructions;\n const tools = Array.isArray(config.tools) ? config.tools : [];\n const interceptors = config.interceptors;\n\n let instructionsText = \"\";\n if (typeof instructions === \"string\") {\n instructionsText = instructions;\n } else if (this.isInstructionResolvable(instructions)) {\n instructionsText = await instructions.resolve();\n }\n\n const requestInterceptorNames =\n interceptors?.request?.map((fn) => {\n if (typeof fn === \"function\" && fn.name) {\n return fn.name;\n }\n return \"anonymous\";\n }) ?? [];\n const responseInterceptorNames =\n interceptors?.response?.map((fn) => {\n if (typeof fn === \"function\" && fn.name) {\n return fn.name;\n }\n return \"anonymous\";\n }) ?? [];\n\n const modelInfo =\n model && typeof model === \"object\" && \"providerName\" in model && \"modelName\" in model\n ? {\n provider: (model as IModel).providerName,\n model: (model as IModel).modelName,\n capabilities: (model as IModel).capabilities,\n }\n : undefined;\n\n return {\n schemaVersion: 1,\n resourceType: \"agent\",\n agentId: agent.id ?? agent.name,\n agentName: agent.name,\n kind: agent.kind,\n model: modelInfo,\n instructionsText,\n toolIds: tools.map((t) => t.id),\n interceptors: {\n request: requestInterceptorNames,\n response: responseInterceptorNames,\n },\n };\n }\n\n /**\n * Builds a workflow definition payload suitable for Cloud persistence + UI graph rendering.\n *\n * The base definition comes from `workflow.describe()` (graph nodes/edges).\n * If the workflow was created with an input Zod schema, we also attach `inputSchema`\n * as a JSON Schema object so the UI can render an input form.\n */\n private buildWorkflowDefinition(workflow: Workflow): Record<string, unknown> | undefined {\n const workflowWithNodes = workflow as unknown as Partial<WorkflowWithInternalNodes>;\n if (typeof workflowWithNodes.describe !== \"function\") return undefined;\n\n const base = workflowWithNodes.describe();\n if (!base || typeof base !== \"object\") return undefined;\n\n // Try to access inputSchema from workflow config (it's private, so we use type assertion)\n const workflowUnknown = workflow as unknown;\n const workflowWithConfig =\n workflowUnknown &&\n typeof workflowUnknown === \"object\" &&\n \"config\" in workflowUnknown &&\n typeof (workflowUnknown as { config?: unknown }).config === \"object\"\n ? (workflowUnknown as { config: { inputSchema?: unknown } }).config?.inputSchema\n : undefined;\n\n const inputSchemaCandidate = workflowWithConfig;\n const withSchemas = this.isZodSchema(inputSchemaCandidate)\n ? { ...base, inputSchema: zodToJsonSchema(inputSchemaCandidate) }\n : base;\n\n // Collect refs (agents) from nodes when available (agentId preferred).\n const nodes = Array.isArray((withSchemas as WorkflowDefinition).nodes)\n ? (withSchemas as WorkflowDefinition).nodes\n : undefined;\n const agentIds = Array.isArray(nodes)\n ? nodes\n .map((n) => (typeof n?.agentId === \"string\" && n.agentId ? n.agentId : undefined))\n .filter((x): x is string => !!x)\n : [];\n\n return {\n ...withSchemas,\n schemaVersion: 1,\n resourceType: \"workflow\",\n refs: {\n agents: Array.from(new Set(agentIds)),\n tools: [],\n workflows: [],\n },\n };\n }\n\n private buildToolDefinition(tool: Tool): Record<string, unknown> | undefined {\n const inputSchemaCandidate = tool.inputSchema;\n const inputSchema = this.isZodSchema(inputSchemaCandidate)\n ? zodToJsonSchema(inputSchemaCandidate)\n : undefined;\n\n return {\n schemaVersion: 1,\n resourceType: \"tool\",\n toolId: tool.id,\n description: tool.description,\n ...(inputSchema ? { inputSchema } : {}),\n outputType: \"unknown\",\n };\n }\n\n /**\n * Full registration (discovery) call. This is idempotent on the Cloud side.\n */\n private async registerFull(): Promise<void> {\n const payload = await this.buildRegisterPayload({ includeDefinitions: true });\n const start = nowMs();\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(\n new ConnectionError(\n \"Registration timeout: Server did not respond to registration request. \" +\n \"Please check your connection and try again.\",\n ),\n );\n }, 10_000);\n\n this.socket.emit(\"client:register:full\", payload, (response: RegisterResponse) => {\n clearTimeout(timeout);\n\n if (response.success) {\n const defCount = payload.resources.filter((r) => !!r.definition).length;\n const agentDefCount = payload.resources.filter(\n (r) => r.type === \"agent\" && !!r.definition,\n ).length;\n const workflowDefCount = payload.resources.filter(\n (r) => r.type === \"workflow\" && !!r.definition,\n ).length;\n const toolDefCount = payload.resources.filter(\n (r) => r.type === \"tool\" && !!r.definition,\n ).length;\n if (this.logger) {\n this.logger.info(\"Client registered\", {\n clientId: this.clientId,\n instanceId: payload.instanceId,\n resources: payload.resources.length,\n definitions: {\n total: defCount,\n agents: agentDefCount,\n workflows: workflowDefCount,\n tools: toolDefCount,\n },\n durationMs: Number(durationMs(start).toFixed(2)),\n });\n } else {\n console.log(\n `✅ Client registered successfully: ${this.clientId} (${payload.instanceId})`,\n );\n console.log(` - ${payload.resources.length} resources registered`);\n console.log(\n ` - definitions: total=${defCount}, agents=${agentDefCount}, workflows=${workflowDefCount}, tools=${toolDefCount}`,\n );\n }\n resolve();\n return;\n }\n\n const errorMessage = response.error ?? \"Unknown registration error\";\n\n // Check if it's an auth error\n if (\n errorMessage.includes(\"authentication\") ||\n errorMessage.includes(\"Unauthorized\") ||\n errorMessage.includes(\"token\") ||\n errorMessage.includes(\"API key\")\n ) {\n reject(\n new AuthenticationError(\n `Registration failed: ${errorMessage}. ` +\n `Please check your NEBULAOS_API_KEY environment variable.`,\n ),\n );\n return;\n }\n\n // Generic registration error\n reject(\n new ConnectionError(\n `Registration failed: ${errorMessage}. ` +\n `Please check your connection and configuration.`,\n ),\n );\n });\n });\n }\n\n private startSnapshotLoop(): void {\n const intervalMs = this.config.snapshotIntervalMs ?? 60_000;\n if (this.snapshotTimer) clearInterval(this.snapshotTimer);\n this.snapshotTimer = setInterval(() => {\n if (!this.socket.connected) return;\n // Snapshot is best-effort and should remain lightweight (no definitions).\n void this.buildRegisterPayload({ includeDefinitions: false }).then((payload) => {\n this.socket.emit(\"client:snapshot\", payload);\n });\n }, intervalMs);\n }\n\n /**\n * Connects to the Cloud runtime.\n */\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this.socket.connected) {\n resolve();\n return;\n }\n\n this.connectionAttempted = true;\n this.hasAuthenticated = false;\n let resolved = false;\n let authTimeout: ReturnType<typeof setTimeout> | undefined;\n\n const timeout = setTimeout(() => {\n if (resolved) return;\n resolved = true;\n this.connectionAttempted = false;\n reject(\n new ConnectionError(\n `Connection timeout after 10 seconds. ` +\n `Please check your NEBULAOS_URL (${this.config.url}) and ensure the server is running.`,\n ),\n );\n }, 10_000);\n\n const cleanup = () => {\n clearTimeout(timeout);\n if (authTimeout) clearTimeout(authTimeout);\n this.socket.off(\"connect\", connectHandler);\n this.socket.off(\"connect_error\", errorHandler);\n this.socket.off(\"disconnect\", disconnectHandler);\n this.socket.off(\"client:online\", onlineHandler);\n };\n\n // We consider the connection \"ready\" only after the server emits `client:online`.\n const onlineHandler = () => {\n if (resolved) return;\n resolved = true;\n cleanup();\n this.connectionAttempted = false;\n this.hasAuthenticated = true;\n this.startSnapshotLoop();\n resolve();\n };\n\n // Handle successful transport connection (wait for auth ack)\n const connectHandler = () => {\n // Clear the transport timeout and wait briefly for auth.\n clearTimeout(timeout);\n authTimeout = setTimeout(() => {\n if (resolved) return;\n resolved = true;\n cleanup();\n this.connectionAttempted = false;\n reject(\n new AuthenticationError(\n `Connected but authentication was not confirmed by server. ` +\n `Please check your NEBULAOS_API_KEY environment variable.`,\n ),\n );\n }, 2_500);\n };\n\n // Handle disconnect during connection attempt (likely auth failure)\n const disconnectHandler = (reason: string) => {\n if (resolved) return;\n\n // If we get disconnected immediately after attempting to connect, it's likely auth failure\n if (this.connectionAttempted && reason === \"io server disconnect\") {\n resolved = true;\n cleanup();\n this.connectionAttempted = false;\n\n // Check if we have a more specific error from connect_error\n if (this.lastConnectError) {\n const errorMsg = this.lastConnectError.message.toLowerCase();\n if (\n errorMsg.includes(\"authorization\") ||\n errorMsg.includes(\"token\") ||\n errorMsg.includes(\"unauthorized\") ||\n errorMsg.includes(\"authentication\") ||\n errorMsg.includes(\"api key\") ||\n errorMsg.includes(\"invalid\")\n ) {\n reject(\n new AuthenticationError(\n `Authentication failed: Invalid API key or missing credentials. ` +\n `Please check your NEBULAOS_API_KEY environment variable. ` +\n `(Error: ${this.lastConnectError.message})`,\n ),\n );\n return;\n }\n }\n\n reject(\n new AuthenticationError(\n `Connection rejected by server: Invalid API key or missing credentials. ` +\n `Please check your NEBULAOS_API_KEY environment variable. ` +\n `(Disconnect reason: ${reason})`,\n ),\n );\n return;\n }\n };\n\n // Handle connection errors with better messages\n const errorHandler = (error: Error) => {\n if (resolved) return;\n\n // Check if it's an auth error\n const errorMsg = error.message.toLowerCase();\n if (\n errorMsg.includes(\"authorization\") ||\n errorMsg.includes(\"token\") ||\n errorMsg.includes(\"unauthorized\") ||\n errorMsg.includes(\"authentication\") ||\n errorMsg.includes(\"api key\") ||\n errorMsg.includes(\"invalid\")\n ) {\n resolved = true;\n cleanup();\n this.connectionAttempted = false;\n reject(\n new AuthenticationError(\n `Authentication failed: Invalid API key or missing credentials. ` +\n `Please check your NEBULAOS_API_KEY environment variable. ` +\n `(Server error: ${error.message})`,\n ),\n );\n return;\n }\n\n // Check if it's a connection error\n if (errorMsg.includes(\"timeout\") || errorMsg.includes(\"econnrefused\")) {\n resolved = true;\n cleanup();\n this.connectionAttempted = false;\n reject(\n new ConnectionError(\n `Connection failed: Unable to reach NebulaOS Cloud at ${this.config.url}. ` +\n `Please check your NEBULAOS_URL environment variable and ensure the server is running. ` +\n `(Error: ${error.message})`,\n ),\n );\n return;\n }\n\n // For other errors, wait a bit to see if we get disconnected (auth failure)\n // Otherwise reject after a short delay\n setTimeout(() => {\n if (!resolved) {\n resolved = true;\n cleanup();\n this.connectionAttempted = false;\n reject(\n new ConnectionError(\n `Connection error: ${error.message}. ` +\n `Please check your NEBULAOS_URL (${this.config.url}) and NEBULAOS_API_KEY.`,\n ),\n );\n }\n }, 1000);\n };\n\n this.socket.once(\"connect\", connectHandler);\n this.socket.once(\"connect_error\", errorHandler);\n this.socket.once(\"disconnect\", disconnectHandler);\n this.socket.once(\"client:online\", onlineHandler);\n this.socket.connect();\n });\n }\n\n /**\n * Disconnects from the server gracefully\n */\n async disconnect(): Promise<void> {\n console.log(\"🛑 Disconnecting from NebulaOS Cloud...\");\n\n if (this.snapshotTimer) clearInterval(this.snapshotTimer);\n this.snapshotTimer = undefined;\n\n if (this.socket.connected) {\n await this.sendShutdownNotice({ reason: \"disconnect()\" });\n this.socket.disconnect();\n }\n\n console.log(\"👋 Disconnected\");\n }\n\n /**\n * Best-effort shutdown notice to allow the Cloud to immediately clean up instance availability.\n * Never throws: disconnect must be resilient.\n */\n private async sendShutdownNotice(input: { reason?: string }): Promise<void> {\n const payload = {\n instanceId: this.instanceId,\n ...(input.reason ? { reason: input.reason } : {}),\n };\n\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => resolve(), 1500);\n try {\n this.socket.emit(\"client:shutdown\", payload, (_response: ShutdownResponse) => {\n clearTimeout(timeout);\n // Best-effort: ignore response contents.\n resolve();\n });\n } catch {\n clearTimeout(timeout);\n resolve();\n }\n });\n }\n\n /**\n * Checks if the client is connected\n */\n isConnected(): boolean {\n return this.socket.connected;\n }\n\n /**\n * Returns the client ID\n */\n getClientId(): string {\n return this.clientId;\n }\n\n getInstanceId(): string {\n return this.instanceId;\n }\n\n /**\n * Returns the socket instance for telemetry\n */\n getSocket(): Socket<ServerToClientEvents, ClientToServerEvents> {\n return this.socket;\n }\n}\n","export function nowMs(): number {\r\n // Prefer high-resolution time for durations when available.\r\n // performance is available in Node 18+ (global).\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const anyGlobal = globalThis as any;\r\n if (anyGlobal?.performance?.now) return anyGlobal.performance.now() as number;\r\n return Date.now();\r\n}\r\n\r\nexport function durationMs(startMs: number): number {\r\n return Math.max(0, nowMs() - startMs);\r\n}\r\n\r\n","import type { NebulaEvent } from \"@nebulaos/core\";\nimport type { TelemetryEventV1 } from \"@nebulaos/types\";\n\nexport function summarizeValue(value: unknown): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (typeof value === \"string\") return `string(len=${value.length})`;\n if (typeof value === \"number\") return \"number\";\n if (typeof value === \"boolean\") return \"boolean\";\n if (Array.isArray(value)) return `array(len=${value.length})`;\n if (typeof value === \"object\") return `object(keys=${Object.keys(value as any).length})`;\n return typeof value;\n}\n\nexport function summarizeDomainEvent(event: NebulaEvent): Record<string, unknown> {\n return {\n type: event.type,\n executionId: event.executionId,\n rootExecutionId: (event as any).rootExecutionId,\n parentExecutionId: (event as any).parentExecutionId,\n correlationId: (event as any).correlationId,\n traceId: event.trace?.traceId,\n spanId: event.trace?.spanId,\n parentSpanId: event.trace?.parentSpanId,\n };\n}\n\nexport function summarizeTelemetryEvent(event: TelemetryEventV1): Record<string, unknown> {\n return {\n type: event.type,\n executionId: event.executionId,\n correlationId: event.correlationId,\n traceId: event.trace?.traceId,\n spanId: event.trace?.spanId,\n parentSpanId: event.trace?.parentSpanId,\n spanKind: (event as any).span?.kind,\n spanName: (event as any).span?.name,\n };\n}\n\nexport function summarizeDomainBatch(events: NebulaEvent[]): Record<string, unknown> {\n const counts: Record<string, number> = {};\n for (const e of events) {\n counts[e.type] = (counts[e.type] ?? 0) + 1;\n }\n const topTypes = Object.entries(counts)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 6)\n .map(([type, count]) => `${type}×${count}`);\n\n return {\n count: events.length,\n topTypes: topTypes.join(\", \"),\n };\n}\n\n","import { clientConfigSchema, type ClientConfig } from \"./config/client-config.js\";\nimport { Registry } from \"./registry/registry.js\";\nimport { ServerConnection } from \"./connection/server-connection.js\";\nimport { ConsoleLogger, DomainEvents, Tracing, type ILogger } from \"@nebulaos/core\";\nimport { HttpTelemetryExporter } from \"./telemetry/http-telemetry-exporter.js\";\nimport { HttpDomainEventsExporter } from \"./domain-events/http-domain-events-exporter.js\";\nimport { resolveClientDebugConfig } from \"./logger/client-debug.js\";\nimport { v4 as uuid } from \"uuid\";\nimport { setupOTelTracing } from \"./tracing/setup.js\";\nimport { OTelTracingProvider } from \"./tracing/otel-provider.js\";\nimport { InstrumentedHttpClient } from \"./http/instrumented-http-client.js\";\n\nexport class NebulaClient {\n private readonly registry: Registry;\n private readonly serverConnection?: ServerConnection;\n private readonly telemetryExporter?: HttpTelemetryExporter;\n private readonly domainEventsExporter?: HttpDomainEventsExporter;\n private readonly logger?: ILogger;\n\n constructor(private readonly config: ClientConfig) {\n clientConfigSchema.parse(config);\n\n // Generate clientId if not provided (used for local identification and logging)\n if (!config.clientId) {\n config.clientId = `client-${uuid()}`;\n }\n\n // Set Client context for skills to access API key and server URL\n if (config.server) {\n this.setGlobalClientContext(config.server.apiKey, config.server.url);\n }\n\n this.registry = new Registry();\n // Inject HTTP client for tool execution context\n this.registry.setHttpClient(new InstrumentedHttpClient());\n\n config.agents?.forEach((agent) => this.registry.registerAgent(agent));\n config.tools?.forEach((tool) => this.registry.registerTool(tool));\n config.workflows?.forEach((workflow) => this.registry.registerWorkflow(workflow));\n\n if (config.server) {\n const debug = resolveClientDebugConfig({\n logLevel: config.logLevel,\n // deprecated:\n enabled: config.debug?.enabled,\n level: config.debug?.level,\n });\n if (debug.enabled) {\n this.logger = new ConsoleLogger(debug.level, \"nebulaos/client\");\n this.logger.info(\n \"Client debug enabled\",\n { level: debug.level, ws: true, http: true },\n );\n }\n\n this.serverConnection = new ServerConnection({\n url: config.server.url,\n apiKey: config.server.apiKey,\n clientId: config.clientId,\n }, this.logger);\n\n // Set registry on connection so it can execute agents/workflows\n this.serverConnection.setRegistry(this.registry);\n\n this.telemetryExporter = new HttpTelemetryExporter(\n {\n cloudUrl: config.server.url,\n apiKey: config.server.apiKey,\n clientId: config.clientId,\n },\n {\n timeoutMs: 2000,\n },\n this.logger,\n );\n\n Tracing.setExporter(this.telemetryExporter);\n\n // Set up OpenTelemetry tracing for W3C-compliant span IDs and context propagation\n // Spans are exported via telemetry events to the backend (not directly to collector)\n setupOTelTracing({\n serviceName: config.clientId ?? \"nebulaos-client\",\n });\n const otelProvider = new OTelTracingProvider(\n config.clientId ?? \"nebulaos-client\",\n this.telemetryExporter,\n );\n Tracing.setProvider(otelProvider);\n\n this.domainEventsExporter = new HttpDomainEventsExporter(\n {\n cloudUrl: config.server.url,\n apiKey: config.server.apiKey,\n clientId: config.clientId,\n },\n {\n timeoutMs: 2000,\n },\n this.logger,\n );\n DomainEvents.setExporter(this.domainEventsExporter);\n }\n }\n\n registerAgent(agent: Parameters<Registry[\"registerAgent\"]>[0]): void {\n this.registry.registerAgent(agent);\n }\n\n registerTool(tool: Parameters<Registry[\"registerTool\"]>[0]): void {\n this.registry.registerTool(tool);\n }\n\n registerWorkflow(workflow: Parameters<Registry[\"registerWorkflow\"]>[0]): void {\n this.registry.registerWorkflow(workflow);\n }\n\n async start(): Promise<void> {\n if (this.serverConnection) {\n // Store agents/workflows in connection (will auto-register on connect)\n this.serverConnection.registerResources(\n this.registry.listAgents(),\n this.registry.listTools(),\n this.registry.listWorkflows()\n );\n\n // Connect to server (will trigger auto-registration)\n try {\n await this.serverConnection.connect();\n } catch (error) {\n // Re-throw with clearer context\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Failed to connect to NebulaOS Cloud: ${String(error)}`);\n }\n }\n }\n\n async stop(): Promise<void> {\n await this.serverConnection?.disconnect();\n }\n\n getClientId(): string | undefined {\n return this.serverConnection?.getClientId();\n }\n\n isConnected(): boolean {\n return this.serverConnection?.isConnected() ?? false;\n }\n\n /**\n * Sets global client context for skills to access API key and server URL\n * This allows skills like RagOpenAISkill to automatically use the client's credentials\n */\n private setGlobalClientContext(apiKey: string, serverUrl: string): void {\n try {\n // Try to import and set context for @nebulaos/rag-openai-skill if it's available\n // Using dynamic import to avoid hard dependency\n import(\"@nebulaos/rag-openai-skill\")\n .then((module) => {\n if (module.ClientContext) {\n module.ClientContext.setApiKey(apiKey);\n module.ClientContext.setServerUrl(serverUrl);\n }\n })\n .catch(() => {\n // Silently ignore if package is not installed\n // This is expected when rag-openai-skill is not being used\n });\n } catch {\n // Silently ignore errors - skill packages are optional\n }\n }\n}\n","import axios from \"axios\";\nimport type { ITelemetryExporter, TelemetryEventV1 } from \"@nebulaos/types\";\nimport type { ILogger } from \"@nebulaos/core\";\nimport { nowMs, durationMs } from \"../logger/time.js\";\nimport { summarizeTelemetryEvent } from \"../logger/summaries.js\";\n\nexport interface HttpTelemetryExporterConfig {\n /**\n * Request timeout for telemetry POSTs (ms).\n * Telemetry must never block execution, so keep this low.\n */\n timeoutMs?: number;\n}\n\nexport class HttpTelemetryExporter implements ITelemetryExporter {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n\n constructor(\n private readonly input: {\n cloudUrl: string;\n apiKey?: string;\n clientId: string;\n },\n config: HttpTelemetryExporterConfig = {},\n private readonly logger?: ILogger,\n ) {\n this.baseUrl = input.cloudUrl.replace(/\\/+$/, \"\");\n this.timeoutMs = config.timeoutMs ?? 2000;\n }\n\n async exportBatch(events: TelemetryEventV1[]): Promise<void> {\n // 1 event per request (as requested). Best-effort only.\n for (const event of events) {\n await this.sendSingle(event);\n }\n }\n\n private async sendSingle(event: TelemetryEventV1): Promise<void> {\n const url = `${this.baseUrl}/telemetry/events`;\n const start = nowMs();\n\n try {\n const res = await axios.post(\n url,\n { events: [event] },\n {\n timeout: this.timeoutMs,\n headers: {\n \"Content-Type\": \"application/json\",\n ...(this.input.apiKey ? { Authorization: `Bearer ${this.input.apiKey}` } : {}),\n },\n // Telemetry should never throw due to non-2xx.\n validateStatus: () => true,\n },\n );\n if (this.logger) {\n this.logger.debug(\n \"HTTP telemetry sent\",\n {\n method: \"POST\",\n path: \"/telemetry/events\",\n status: res.status,\n durationMs: Number(durationMs(start).toFixed(2)),\n timeoutMs: this.timeoutMs,\n event: summarizeTelemetryEvent(event),\n },\n );\n }\n } catch (err) {\n // Telemetry must never break execution.\n if (this.logger) {\n const message = err instanceof Error ? err.message : String(err);\n this.logger.warn(\n \"HTTP telemetry failed (best-effort)\",\n {\n method: \"POST\",\n path: \"/telemetry/events\",\n durationMs: Number(durationMs(start).toFixed(2)),\n timeoutMs: this.timeoutMs,\n error: message,\n event: summarizeTelemetryEvent(event),\n },\n );\n }\n }\n }\n}\n\n\n\n\n","import axios from \"axios\";\nimport type { IDomainEventsExporter, NebulaEvent } from \"@nebulaos/core\";\nimport type { ILogger } from \"@nebulaos/core\";\nimport { nowMs, durationMs } from \"../logger/time.js\";\nimport { summarizeDomainBatch, summarizeDomainEvent } from \"../logger/summaries.js\";\n\nexport interface HttpDomainEventsExporterConfig {\n /**\n * Request timeout for domain events POSTs (ms).\n * Domain events must never block execution, so keep this low.\n */\n timeoutMs?: number;\n}\n\nexport class HttpDomainEventsExporter implements IDomainEventsExporter {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n\n constructor(\n private readonly input: {\n cloudUrl: string;\n apiKey?: string;\n clientId: string;\n },\n config: HttpDomainEventsExporterConfig = {},\n private readonly logger?: ILogger,\n ) {\n this.baseUrl = input.cloudUrl.replace(/\\/+$/, \"\");\n this.timeoutMs = config.timeoutMs ?? 2000;\n }\n\n async exportBatch(events: NebulaEvent[]): Promise<void> {\n if (events.length === 0) return;\n const url = `${this.baseUrl}/execution/events`;\n const start = nowMs();\n\n try {\n const res = await axios.post(\n url,\n { events },\n {\n timeout: this.timeoutMs,\n headers: {\n \"Content-Type\": \"application/json\",\n ...(this.input.apiKey ? { Authorization: `Bearer ${this.input.apiKey}` } : {}),\n },\n // Domain events should never throw due to non-2xx.\n validateStatus: () => true,\n },\n );\n if (this.logger) {\n this.logger.debug(\n \"HTTP domain events sent\",\n {\n method: \"POST\",\n path: \"/execution/events\",\n status: res.status,\n durationMs: Number(durationMs(start).toFixed(2)),\n timeoutMs: this.timeoutMs,\n batch: summarizeDomainBatch(events),\n sample: events.slice(0, 3).map((e) => summarizeDomainEvent(e)),\n },\n );\n }\n } catch {\n // Domain events must never break execution.\n if (this.logger) {\n this.logger.warn(\n \"HTTP domain events failed (best-effort)\",\n {\n method: \"POST\",\n path: \"/execution/events\",\n durationMs: Number(durationMs(start).toFixed(2)),\n timeoutMs: this.timeoutMs,\n batch: summarizeDomainBatch(events),\n sample: events.slice(0, 3).map((e) => summarizeDomainEvent(e)),\n },\n );\n }\n }\n }\n}\n\n","import type { LogLevel } from \"@nebulaos/core\";\n\nexport type ClientDebugMode = \"off\" | \"info\" | \"debug\";\n\nexport type ClientDebugConfig = {\n enabled: boolean;\n level: LogLevel;\n};\n\nfunction parseBool(value: string | undefined): boolean {\n if (!value) return false;\n const v = value.trim().toLowerCase();\n return v === \"1\" || v === \"true\" || v === \"yes\" || v === \"on\";\n}\n\n/**\n * Resolves debug config from explicit config + env.\n *\n * Env var supported:\n * - NEBULAOS_CLIENT_DEBUG=1|true|debug|info|off\n */\nexport function resolveClientDebugConfig(input?: {\n logLevel?: LogLevel;\n // deprecated:\n enabled?: boolean;\n level?: LogLevel;\n}): ClientDebugConfig {\n const env = process.env.NEBULAOS_CLIENT_DEBUG?.trim().toLowerCase();\n\n // Env overrides config when explicitly set.\n if (env) {\n if (env === \"off\" || env === \"0\" || env === \"false\") {\n return { enabled: false, level: \"none\" };\n }\n if (env === \"debug\") {\n return { enabled: true, level: \"debug\" };\n }\n if (env === \"info\") {\n return { enabled: true, level: \"info\" };\n }\n if (parseBool(env)) {\n return { enabled: true, level: \"debug\" };\n }\n }\n\n // Prefer `logLevel` (new API).\n if (input?.logLevel) {\n return {\n enabled: input.logLevel !== \"none\",\n level: input.logLevel,\n };\n }\n\n // Back-compat (old API).\n const enabled = input?.enabled ?? false;\n const level = input?.level ?? (enabled ? \"debug\" : \"none\");\n\n return { enabled, level };\n}\n\n","import { BasicTracerProvider } from \"@opentelemetry/sdk-trace-base\";\r\nimport { Resource } from \"@opentelemetry/resources\";\r\nimport { AsyncLocalStorageContextManager } from \"@opentelemetry/context-async-hooks\";\r\nimport { HttpInstrumentation } from \"@opentelemetry/instrumentation-http\";\r\nimport { registerInstrumentations } from \"@opentelemetry/instrumentation\";\r\n\r\nexport interface OTelTracingConfig {\r\n serviceName: string;\r\n}\r\n\r\n/**\r\n * Sets up the global OTel TracerProvider for context propagation.\r\n *\r\n * NOTE: The SDK does NOT export spans directly to the collector.\r\n * Instead, spans are sent as telemetry events to the backend, which\r\n * then exports them to the collector preserving the original spanIds.\r\n *\r\n * This setup only registers the TracerProvider so that:\r\n * - Spans get proper W3C-compliant IDs\r\n * - Context propagation works correctly (parent-child relationships)\r\n * - trace.getTracer() returns instrumented tracers\r\n */\r\nexport function setupOTelTracing(config: OTelTracingConfig): void {\r\n const resource = new Resource({\r\n \"service.name\": config.serviceName,\r\n });\r\n\r\n const provider = new BasicTracerProvider({ resource });\r\n // No SpanProcessor/Exporter - backend handles export via telemetry events\r\n provider.register({\r\n contextManager: new AsyncLocalStorageContextManager(),\r\n });\r\n\r\n registerInstrumentations({\r\n tracerProvider: provider,\r\n instrumentations: [\r\n new HttpInstrumentation(),\r\n ],\r\n });\r\n}\r\n","import { context, trace, SpanStatusCode, type Tracer, type Span } from \"@opentelemetry/api\";\nimport {\n type ITracingProvider,\n type SpanStartInput,\n ActiveSpan,\n type TracingContext,\n} from \"@nebulaos/core\";\nimport type { ITelemetryExporter, TelemetryEventV1 } from \"@nebulaos/types\";\n\n/**\n * OpenTelemetry-backed implementation of ITracingProvider.\n *\n * OTel internally may represent span/trace IDs in base64 (e.g. when\n * propagated over binary protocols). This provider normalises every ID\n * to the W3C hex format expected by the rest of the SDK before handing\n * them to ActiveSpan / TracingContext.\n */\nexport class OTelTracingProvider implements ITracingProvider {\n private readonly tracer: Tracer;\n\n constructor(\n serviceName: string,\n private readonly exporter: ITelemetryExporter,\n ) {\n this.tracer = trace.getTracer(serviceName);\n }\n\n /**\n * Ensures an OTel ID string is in W3C lowercase hex format.\n *\n * If the value is already valid hex of the expected length it is returned\n * as-is. Otherwise we assume it is base64-encoded and convert it.\n *\n * @param id Raw ID from OTel spanContext()\n * @param hexLen Expected hex length (16 for spanId, 32 for traceId)\n */\n private ensureW3cHex(id: string | undefined, hexLen: 16 | 32): string | undefined {\n if (!id) return undefined;\n\n // Already valid W3C hex?\n const hexRegex = hexLen === 16 ? /^[0-9a-f]{16}$/ : /^[0-9a-f]{32}$/;\n if (hexRegex.test(id)) return id;\n\n // Try base64 → hex conversion\n try {\n const hex = Buffer.from(id, \"base64\").toString(\"hex\");\n return hex.slice(0, hexLen).padStart(hexLen, \"0\");\n } catch {\n return undefined;\n }\n }\n\n startSpan(input: SpanStartInput): ActiveSpan {\n const parentCtx = context.active();\n const parentSpan = trace.getSpan(parentCtx);\n\n const otelSpan = this.tracer.startSpan(\n `${input.kind}:${input.name}`,\n {\n attributes: {\n \"nebula.span.kind\": input.kind,\n \"nebula.span.name\": input.name,\n ...(input.correlationId ? { \"nebula.correlationId\": input.correlationId } : {}),\n ...(input.executionId ? { \"nebula.executionId\": input.executionId } : {}),\n },\n },\n parentCtx,\n );\n\n const spanContext = otelSpan.spanContext();\n const traceId = this.ensureW3cHex(spanContext.traceId, 32) ?? spanContext.traceId;\n const spanId = this.ensureW3cHex(spanContext.spanId, 16) ?? spanContext.spanId;\n const parentSpanId = this.ensureW3cHex(parentSpan?.spanContext().spanId, 16);\n\n // Store otelSpan reference so we can end it later\n const activeSpan = new OTelActiveSpan(\n traceId,\n spanId,\n parentSpanId,\n input.kind,\n input.name,\n input.correlationId,\n input.executionId,\n this.exporter,\n otelSpan,\n );\n\n // Export telemetry:span:start event (fire-and-forget)\n const startEvent: TelemetryEventV1 = {\n v: 1,\n type: \"telemetry:span:start\",\n timestamp: new Date().toISOString(),\n trace: { traceId, spanId, parentSpanId },\n correlationId: input.correlationId,\n executionId: input.executionId,\n span: {\n kind: input.kind,\n name: input.name,\n data: (input.data ?? {}) as any,\n } as any,\n };\n\n this.exporter.exportBatch([startEvent]).catch(() => {\n // Telemetry must never break execution\n });\n\n return activeSpan;\n }\n\n getContext(): TracingContext | undefined {\n const span = trace.getSpan(context.active());\n if (!span) return undefined;\n\n const sc = span.spanContext();\n return {\n traceId: this.ensureW3cHex(sc.traceId, 32) ?? sc.traceId,\n spanId: this.ensureW3cHex(sc.spanId, 16) ?? sc.spanId,\n };\n }\n\n async withSpan<T>(input: SpanStartInput, fn: (span: ActiveSpan) => Promise<T>): Promise<T> {\n const parentCtx = context.active();\n const parentSpan = trace.getSpan(parentCtx);\n\n const otelSpan = this.tracer.startSpan(\n `${input.kind}:${input.name}`,\n {\n attributes: {\n \"nebula.span.kind\": input.kind,\n \"nebula.span.name\": input.name,\n ...(input.correlationId ? { \"nebula.correlationId\": input.correlationId } : {}),\n ...(input.executionId ? { \"nebula.executionId\": input.executionId } : {}),\n },\n },\n parentCtx,\n );\n\n const spanContext = otelSpan.spanContext();\n const traceId = this.ensureW3cHex(spanContext.traceId, 32) ?? spanContext.traceId;\n const spanId = this.ensureW3cHex(spanContext.spanId, 16) ?? spanContext.spanId;\n const parentSpanId = this.ensureW3cHex(parentSpan?.spanContext().spanId, 16);\n\n const activeSpan = new OTelActiveSpan(\n traceId,\n spanId,\n parentSpanId,\n input.kind,\n input.name,\n input.correlationId,\n input.executionId,\n this.exporter,\n otelSpan,\n );\n\n // Export telemetry:span:start event\n const startEvent: TelemetryEventV1 = {\n v: 1,\n type: \"telemetry:span:start\",\n timestamp: new Date().toISOString(),\n trace: {\n traceId,\n spanId,\n parentSpanId,\n },\n correlationId: input.correlationId,\n executionId: input.executionId,\n span: {\n kind: input.kind,\n name: input.name,\n data: (input.data ?? {}) as any,\n } as any,\n };\n\n try {\n await this.exporter.exportBatch([startEvent]);\n } catch {\n // Telemetry must never break execution\n }\n\n // Run fn within the OTel context so child spans nest correctly\n const ctx = trace.setSpan(parentCtx, otelSpan);\n return context.with(ctx, async () => {\n try {\n const result = await fn(activeSpan);\n if (!activeSpan.isEnded) {\n await activeSpan.end({ status: \"success\" } as any);\n }\n return result;\n } catch (error) {\n await activeSpan.end({ status: \"error\" } as any);\n throw error;\n }\n });\n }\n}\n\n/**\n * Extended ActiveSpan that also ends the underlying OTel span.\n */\nclass OTelActiveSpan extends ActiveSpan {\n constructor(\n traceId: string,\n spanId: string,\n parentSpanId: string | undefined,\n kind: string,\n name: string,\n correlationId: string | undefined,\n executionId: string | undefined,\n exporter: ITelemetryExporter,\n private readonly otelSpan: Span,\n ) {\n super(traceId, spanId, parentSpanId, kind as any, name, correlationId, executionId, exporter);\n }\n\n override async end(input: Parameters<ActiveSpan[\"end\"]>[0]): Promise<void> {\n if (this.isEnded) return;\n\n // End the OTel span with the appropriate status\n if (input.status === \"error\") {\n this.otelSpan.setStatus({ code: SpanStatusCode.ERROR });\n } else {\n this.otelSpan.setStatus({ code: SpanStatusCode.OK });\n }\n this.otelSpan.end();\n\n // Delegate to the base ActiveSpan to export the telemetry event\n await super.end(input);\n }\n}\n","import { Tracing } from \"@nebulaos/core\";\nimport type { IHttpClient, HttpResponse } from \"@nebulaos/types\";\n\nexport interface HttpRequestOptions extends RequestInit {\n timeout?: number;\n}\n\nexport class InstrumentedHttpClient implements IHttpClient {\n async fetch<T = unknown>(url: string, options?: HttpRequestOptions): Promise<HttpResponse<T>> {\n const method = options?.method || \"GET\";\n const spanName = `http:${method} ${new URL(url).origin}`;\n\n return Tracing.withSpan(\n {\n kind: \"http\",\n name: spanName,\n data: {\n \"http.method\": method,\n \"http.url\": url,\n },\n },\n async (span) => {\n const startTime = Date.now();\n\n try {\n const response = await fetch(url, options);\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n let data: T;\n if (contentType.includes(\"application/json\")) {\n data = await response.json() as T;\n } else {\n data = await response.text() as unknown as T;\n }\n\n await span.end({\n status: response.ok ? \"success\" : \"error\",\n data: {\n \"http.status_code\": response.status,\n \"http.response_content_length\": response.headers.get(\"content-length\"),\n \"http.duration_ms\": Date.now() - startTime,\n },\n });\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n data,\n };\n } catch (error) {\n await span.end({\n status: \"error\",\n data: {\n \"http.error\": error instanceof Error ? error.message : String(error),\n \"http.duration_ms\": Date.now() - startTime,\n },\n });\n throw error;\n }\n }\n );\n }\n\n async get<T = unknown>(url: string, options?: Omit<HttpRequestOptions, \"method\">): Promise<HttpResponse<T>> {\n return this.fetch<T>(url, { ...options, method: \"GET\" });\n }\n\n async post<T = unknown>(url: string, body?: unknown, options?: Omit<HttpRequestOptions, \"method\" | \"body\">): Promise<HttpResponse<T>> {\n return this.fetch<T>(url, {\n ...options,\n method: \"POST\",\n body: body ? JSON.stringify(body) : undefined,\n headers: { \"Content-Type\": \"application/json\", ...options?.headers },\n });\n }\n}\n","export class TelemetryService {}\r\n\r\n","export class Batcher {}\r\n\r\n","import type { ITelemetryExporter, TelemetryEventV1 } from \"@nebulaos/types\";\nimport { ServerConnection } from \"../connection/server-connection.js\";\n\nexport interface SocketTelemetryExporterConfig {\n maxBatchSize?: number;\n flushIntervalMs?: number;\n}\n\nexport class SocketTelemetryExporter implements ITelemetryExporter {\n private readonly queue: TelemetryEventV1[] = [];\n private flushTimer: ReturnType<typeof setInterval> | undefined;\n private flushing = false;\n\n constructor(\n private readonly serverConnection: ServerConnection,\n private readonly config: SocketTelemetryExporterConfig = {}\n ) { }\n\n async exportBatch(events: TelemetryEventV1[]): Promise<void> {\n this.queue.push(...events);\n this.ensureTimer();\n await this.flushIfNeeded();\n }\n\n async flush(): Promise<void> {\n if (this.flushing) return;\n if (this.queue.length === 0) return;\n\n this.flushing = true;\n try {\n const maxBatchSize = this.config.maxBatchSize ?? 50;\n\n while (this.queue.length > 0) {\n const batch = this.queue.splice(0, maxBatchSize);\n await this.sendTelemetryBatch(batch);\n }\n } finally {\n this.flushing = false;\n }\n }\n\n stop(): void {\n if (this.flushTimer) clearInterval(this.flushTimer);\n this.flushTimer = undefined;\n }\n\n private async sendTelemetryBatch(events: TelemetryEventV1[]): Promise<void> {\n if (!this.serverConnection.isConnected()) {\n // Skip sending if not connected\n return;\n }\n\n const socket = this.serverConnection.getSocket();\n socket.emit(\"telemetry:batch\", {\n clientId: this.serverConnection.getClientId(),\n events,\n });\n }\n\n private ensureTimer(): void {\n if (this.flushTimer) return;\n const flushIntervalMs = this.config.flushIntervalMs ?? 500;\n this.flushTimer = setInterval(() => {\n void this.flush();\n }, flushIntervalMs);\n }\n\n private async flushIfNeeded(): Promise<void> {\n const maxBatchSize = this.config.maxBatchSize ?? 50;\n if (this.queue.length >= maxBatchSize) {\n await this.flush();\n }\n }\n}\n\n","import { IMemory } from \"@nebulaos/types\";\n\nexport class DBMemory implements IMemory {\n async get(_key: string, _sessionId?: string): Promise<unknown> { return null; }\n async set(_key: string, _value: unknown, _sessionId?: string, _ttl?: number): Promise<void> {}\n async delete(_key: string, _sessionId?: string): Promise<void> {}\n async clear(_sessionId?: string): Promise<void> {}\n async getHistory(_sessionId: string, _limit?: number) { return []; }\n}\n\n","export class PromptCapture {}\r\n\r\n","export class RAGClient {}\r\n\r\n"],"mappings":"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","names":["uuid","import_core","axios","import_axios","axios","import_uuid","import_core","import_core","uuid","module"]}