@nodetool-ai/websocket 0.7.0-rc.11

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.
Files changed (261) hide show
  1. package/dist/agent/agent-runtime.d.ts +47 -0
  2. package/dist/agent/agent-runtime.d.ts.map +1 -0
  3. package/dist/agent/agent-runtime.js +577 -0
  4. package/dist/agent/agent-runtime.js.map +1 -0
  5. package/dist/agent/codex-agent.d.ts +41 -0
  6. package/dist/agent/codex-agent.d.ts.map +1 -0
  7. package/dist/agent/codex-agent.js +334 -0
  8. package/dist/agent/codex-agent.js.map +1 -0
  9. package/dist/agent/index.d.ts +6 -0
  10. package/dist/agent/index.d.ts.map +1 -0
  11. package/dist/agent/index.js +4 -0
  12. package/dist/agent/index.js.map +1 -0
  13. package/dist/agent/llm-agent.d.ts +51 -0
  14. package/dist/agent/llm-agent.d.ts.map +1 -0
  15. package/dist/agent/llm-agent.js +526 -0
  16. package/dist/agent/llm-agent.js.map +1 -0
  17. package/dist/agent/mcp-tool-server.d.ts +33 -0
  18. package/dist/agent/mcp-tool-server.d.ts.map +1 -0
  19. package/dist/agent/mcp-tool-server.js +292 -0
  20. package/dist/agent/mcp-tool-server.js.map +1 -0
  21. package/dist/agent/opencode-agent.d.ts +32 -0
  22. package/dist/agent/opencode-agent.d.ts.map +1 -0
  23. package/dist/agent/opencode-agent.js +332 -0
  24. package/dist/agent/opencode-agent.js.map +1 -0
  25. package/dist/agent/pi-agent.d.ts +42 -0
  26. package/dist/agent/pi-agent.d.ts.map +1 -0
  27. package/dist/agent/pi-agent.js +429 -0
  28. package/dist/agent/pi-agent.js.map +1 -0
  29. package/dist/agent/sdk-provider.d.ts +46 -0
  30. package/dist/agent/sdk-provider.d.ts.map +1 -0
  31. package/dist/agent/sdk-provider.js +50 -0
  32. package/dist/agent/sdk-provider.js.map +1 -0
  33. package/dist/agent/socket-route.d.ts +11 -0
  34. package/dist/agent/socket-route.d.ts.map +1 -0
  35. package/dist/agent/socket-route.js +262 -0
  36. package/dist/agent/socket-route.js.map +1 -0
  37. package/dist/agent/transport.d.ts +39 -0
  38. package/dist/agent/transport.d.ts.map +1 -0
  39. package/dist/agent/transport.js +17 -0
  40. package/dist/agent/transport.js.map +1 -0
  41. package/dist/agent/types.d.ts +11 -0
  42. package/dist/agent/types.d.ts.map +1 -0
  43. package/dist/agent/types.js +10 -0
  44. package/dist/agent/types.js.map +1 -0
  45. package/dist/collection-api.d.ts +14 -0
  46. package/dist/collection-api.d.ts.map +1 -0
  47. package/dist/collection-api.js +75 -0
  48. package/dist/collection-api.js.map +1 -0
  49. package/dist/error-codes.d.ts +3 -0
  50. package/dist/error-codes.d.ts.map +1 -0
  51. package/dist/error-codes.js +2 -0
  52. package/dist/error-codes.js.map +1 -0
  53. package/dist/file-api.d.ts +12 -0
  54. package/dist/file-api.d.ts.map +1 -0
  55. package/dist/file-api.js +76 -0
  56. package/dist/file-api.js.map +1 -0
  57. package/dist/http-api.d.ts +94 -0
  58. package/dist/http-api.d.ts.map +1 -0
  59. package/dist/http-api.js +1472 -0
  60. package/dist/http-api.js.map +1 -0
  61. package/dist/index.d.ts +6 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +6 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/lib/asset-paths.d.ts +10 -0
  66. package/dist/lib/asset-paths.d.ts.map +1 -0
  67. package/dist/lib/asset-paths.js +45 -0
  68. package/dist/lib/asset-paths.js.map +1 -0
  69. package/dist/lib/bridge.d.ts +8 -0
  70. package/dist/lib/bridge.d.ts.map +1 -0
  71. package/dist/lib/bridge.js +70 -0
  72. package/dist/lib/bridge.js.map +1 -0
  73. package/dist/mcp-server.d.ts +32 -0
  74. package/dist/mcp-server.d.ts.map +1 -0
  75. package/dist/mcp-server.js +842 -0
  76. package/dist/mcp-server.js.map +1 -0
  77. package/dist/models-api.d.ts +12 -0
  78. package/dist/models-api.d.ts.map +1 -0
  79. package/dist/models-api.js +730 -0
  80. package/dist/models-api.js.map +1 -0
  81. package/dist/oauth-api.d.ts +28 -0
  82. package/dist/oauth-api.d.ts.map +1 -0
  83. package/dist/oauth-api.js +681 -0
  84. package/dist/oauth-api.js.map +1 -0
  85. package/dist/openai-api.d.ts +63 -0
  86. package/dist/openai-api.d.ts.map +1 -0
  87. package/dist/openai-api.js +359 -0
  88. package/dist/openai-api.js.map +1 -0
  89. package/dist/plugins/websocket.d.ts +14 -0
  90. package/dist/plugins/websocket.d.ts.map +1 -0
  91. package/dist/plugins/websocket.js +431 -0
  92. package/dist/plugins/websocket.js.map +1 -0
  93. package/dist/resolve-media-urls.d.ts +19 -0
  94. package/dist/resolve-media-urls.d.ts.map +1 -0
  95. package/dist/resolve-media-urls.js +109 -0
  96. package/dist/resolve-media-urls.js.map +1 -0
  97. package/dist/routes/assets.d.ts +22 -0
  98. package/dist/routes/assets.d.ts.map +1 -0
  99. package/dist/routes/assets.js +168 -0
  100. package/dist/routes/assets.js.map +1 -0
  101. package/dist/routes/collections.d.ts +16 -0
  102. package/dist/routes/collections.d.ts.map +1 -0
  103. package/dist/routes/collections.js +32 -0
  104. package/dist/routes/collections.js.map +1 -0
  105. package/dist/routes/files.d.ts +12 -0
  106. package/dist/routes/files.d.ts.map +1 -0
  107. package/dist/routes/files.js +11 -0
  108. package/dist/routes/files.js.map +1 -0
  109. package/dist/routes/health.d.ts +4 -0
  110. package/dist/routes/health.d.ts.map +1 -0
  111. package/dist/routes/health.js +41 -0
  112. package/dist/routes/health.js.map +1 -0
  113. package/dist/routes/jobs.d.ts +16 -0
  114. package/dist/routes/jobs.d.ts.map +1 -0
  115. package/dist/routes/jobs.js +25 -0
  116. package/dist/routes/jobs.js.map +1 -0
  117. package/dist/routes/nodes.d.ts +8 -0
  118. package/dist/routes/nodes.d.ts.map +1 -0
  119. package/dist/routes/nodes.js +124 -0
  120. package/dist/routes/nodes.js.map +1 -0
  121. package/dist/routes/oauth.d.ts +8 -0
  122. package/dist/routes/oauth.d.ts.map +1 -0
  123. package/dist/routes/oauth.js +19 -0
  124. package/dist/routes/oauth.js.map +1 -0
  125. package/dist/routes/openai.d.ts +8 -0
  126. package/dist/routes/openai.d.ts.map +1 -0
  127. package/dist/routes/openai.js +20 -0
  128. package/dist/routes/openai.js.map +1 -0
  129. package/dist/routes/storage.d.ts +12 -0
  130. package/dist/routes/storage.d.ts.map +1 -0
  131. package/dist/routes/storage.js +13 -0
  132. package/dist/routes/storage.js.map +1 -0
  133. package/dist/routes/workflows.d.ts +18 -0
  134. package/dist/routes/workflows.d.ts.map +1 -0
  135. package/dist/routes/workflows.js +25 -0
  136. package/dist/routes/workflows.js.map +1 -0
  137. package/dist/routes/workspace.d.ts +15 -0
  138. package/dist/routes/workspace.d.ts.map +1 -0
  139. package/dist/routes/workspace.js +24 -0
  140. package/dist/routes/workspace.js.map +1 -0
  141. package/dist/screenshot-server.d.ts +21 -0
  142. package/dist/screenshot-server.d.ts.map +1 -0
  143. package/dist/screenshot-server.js +222 -0
  144. package/dist/screenshot-server.js.map +1 -0
  145. package/dist/server.d.ts +10 -0
  146. package/dist/server.d.ts.map +1 -0
  147. package/dist/server.js +783 -0
  148. package/dist/server.js.map +1 -0
  149. package/dist/settings-registry.d.ts +29 -0
  150. package/dist/settings-registry.d.ts.map +1 -0
  151. package/dist/settings-registry.js +117 -0
  152. package/dist/settings-registry.js.map +1 -0
  153. package/dist/storage-api.d.ts +5 -0
  154. package/dist/storage-api.d.ts.map +1 -0
  155. package/dist/storage-api.js +221 -0
  156. package/dist/storage-api.js.map +1 -0
  157. package/dist/test-ui-server.d.ts +19 -0
  158. package/dist/test-ui-server.d.ts.map +1 -0
  159. package/dist/test-ui-server.js +1256 -0
  160. package/dist/test-ui-server.js.map +1 -0
  161. package/dist/trpc/context.d.ts +21 -0
  162. package/dist/trpc/context.d.ts.map +1 -0
  163. package/dist/trpc/context.js +10 -0
  164. package/dist/trpc/context.js.map +1 -0
  165. package/dist/trpc/error-formatter.d.ts +18 -0
  166. package/dist/trpc/error-formatter.d.ts.map +1 -0
  167. package/dist/trpc/error-formatter.js +41 -0
  168. package/dist/trpc/error-formatter.js.map +1 -0
  169. package/dist/trpc/index.d.ts +18 -0
  170. package/dist/trpc/index.d.ts.map +1 -0
  171. package/dist/trpc/index.js +13 -0
  172. package/dist/trpc/index.js.map +1 -0
  173. package/dist/trpc/middleware.d.ts +8 -0
  174. package/dist/trpc/middleware.d.ts.map +1 -0
  175. package/dist/trpc/middleware.js +12 -0
  176. package/dist/trpc/middleware.js.map +1 -0
  177. package/dist/trpc/router.d.ts +2543 -0
  178. package/dist/trpc/router.d.ts.map +1 -0
  179. package/dist/trpc/router.js +43 -0
  180. package/dist/trpc/router.js.map +1 -0
  181. package/dist/trpc/routers/assets.d.ts +229 -0
  182. package/dist/trpc/routers/assets.d.ts.map +1 -0
  183. package/dist/trpc/routers/assets.js +263 -0
  184. package/dist/trpc/routers/assets.js.map +1 -0
  185. package/dist/trpc/routers/collections.d.ts +88 -0
  186. package/dist/trpc/routers/collections.d.ts.map +1 -0
  187. package/dist/trpc/routers/collections.js +166 -0
  188. package/dist/trpc/routers/collections.js.map +1 -0
  189. package/dist/trpc/routers/costs.d.ts +129 -0
  190. package/dist/trpc/routers/costs.d.ts.map +1 -0
  191. package/dist/trpc/routers/costs.js +95 -0
  192. package/dist/trpc/routers/costs.js.map +1 -0
  193. package/dist/trpc/routers/files.d.ts +34 -0
  194. package/dist/trpc/routers/files.d.ts.map +1 -0
  195. package/dist/trpc/routers/files.js +92 -0
  196. package/dist/trpc/routers/files.js.map +1 -0
  197. package/dist/trpc/routers/jobs.d.ts +92 -0
  198. package/dist/trpc/routers/jobs.d.ts.map +1 -0
  199. package/dist/trpc/routers/jobs.js +100 -0
  200. package/dist/trpc/routers/jobs.js.map +1 -0
  201. package/dist/trpc/routers/mcp-config.d.ts +69 -0
  202. package/dist/trpc/routers/mcp-config.d.ts.map +1 -0
  203. package/dist/trpc/routers/mcp-config.js +290 -0
  204. package/dist/trpc/routers/mcp-config.js.map +1 -0
  205. package/dist/trpc/routers/messages.d.ts +121 -0
  206. package/dist/trpc/routers/messages.d.ts.map +1 -0
  207. package/dist/trpc/routers/messages.js +113 -0
  208. package/dist/trpc/routers/messages.js.map +1 -0
  209. package/dist/trpc/routers/models.d.ts +748 -0
  210. package/dist/trpc/routers/models.d.ts.map +1 -0
  211. package/dist/trpc/routers/models.js +1107 -0
  212. package/dist/trpc/routers/models.js.map +1 -0
  213. package/dist/trpc/routers/nodes.d.ts +48 -0
  214. package/dist/trpc/routers/nodes.d.ts.map +1 -0
  215. package/dist/trpc/routers/nodes.js +57 -0
  216. package/dist/trpc/routers/nodes.js.map +1 -0
  217. package/dist/trpc/routers/sandboxes.d.ts +64 -0
  218. package/dist/trpc/routers/sandboxes.d.ts.map +1 -0
  219. package/dist/trpc/routers/sandboxes.js +327 -0
  220. package/dist/trpc/routers/sandboxes.js.map +1 -0
  221. package/dist/trpc/routers/settings.d.ts +113 -0
  222. package/dist/trpc/routers/settings.d.ts.map +1 -0
  223. package/dist/trpc/routers/settings.js +193 -0
  224. package/dist/trpc/routers/settings.js.map +1 -0
  225. package/dist/trpc/routers/skills.d.ts +41 -0
  226. package/dist/trpc/routers/skills.d.ts.map +1 -0
  227. package/dist/trpc/routers/skills.js +194 -0
  228. package/dist/trpc/routers/skills.js.map +1 -0
  229. package/dist/trpc/routers/storage.d.ts +44 -0
  230. package/dist/trpc/routers/storage.d.ts.map +1 -0
  231. package/dist/trpc/routers/storage.js +153 -0
  232. package/dist/trpc/routers/storage.js.map +1 -0
  233. package/dist/trpc/routers/threads.d.ts +95 -0
  234. package/dist/trpc/routers/threads.d.ts.map +1 -0
  235. package/dist/trpc/routers/threads.js +150 -0
  236. package/dist/trpc/routers/threads.js.map +1 -0
  237. package/dist/trpc/routers/users.d.ts +79 -0
  238. package/dist/trpc/routers/users.d.ts.map +1 -0
  239. package/dist/trpc/routers/users.js +125 -0
  240. package/dist/trpc/routers/users.js.map +1 -0
  241. package/dist/trpc/routers/workflows.d.ts +681 -0
  242. package/dist/trpc/routers/workflows.d.ts.map +1 -0
  243. package/dist/trpc/routers/workflows.js +725 -0
  244. package/dist/trpc/routers/workflows.js.map +1 -0
  245. package/dist/trpc/routers/workspace.d.ts +127 -0
  246. package/dist/trpc/routers/workspace.d.ts.map +1 -0
  247. package/dist/trpc/routers/workspace.js +203 -0
  248. package/dist/trpc/routers/workspace.js.map +1 -0
  249. package/dist/unified-websocket-runner.d.ts +280 -0
  250. package/dist/unified-websocket-runner.d.ts.map +1 -0
  251. package/dist/unified-websocket-runner.js +3840 -0
  252. package/dist/unified-websocket-runner.js.map +1 -0
  253. package/dist/workspace-api.d.ts +14 -0
  254. package/dist/workspace-api.d.ts.map +1 -0
  255. package/dist/workspace-api.js +104 -0
  256. package/dist/workspace-api.js.map +1 -0
  257. package/dist/ws-adapter.d.ts +25 -0
  258. package/dist/ws-adapter.d.ts.map +1 -0
  259. package/dist/ws-adapter.js +63 -0
  260. package/dist/ws-adapter.js.map +1 -0
  261. package/package.json +92 -0
@@ -0,0 +1,280 @@
1
+ import { type NodeExecutor, type NodeTypeResolver, type NodeValidator } from "@nodetool-ai/kernel";
2
+ import type { BaseProvider } from "@nodetool-ai/runtime";
3
+ import type { WebSocketCommandEnvelope, WebSocketMode } from "@nodetool-ai/protocol";
4
+ import { Tool } from "@nodetool-ai/agents";
5
+ import type { NodeMetadata, NodeRegistry } from "@nodetool-ai/node-sdk";
6
+ export interface WebSocketReceiveFrame {
7
+ type: string;
8
+ bytes?: Uint8Array | null;
9
+ text?: string | null;
10
+ }
11
+ export interface WebSocketConnection {
12
+ accept(): Promise<void>;
13
+ receive(): Promise<WebSocketReceiveFrame>;
14
+ sendBytes(data: Uint8Array): Promise<void>;
15
+ sendText(data: string): Promise<void>;
16
+ close(code?: number, reason?: string): Promise<void>;
17
+ clientState?: "connected" | "disconnected";
18
+ applicationState?: "connected" | "disconnected";
19
+ }
20
+ export interface RunJobRequest {
21
+ job_id?: string;
22
+ workflow_id?: string;
23
+ user_id?: string;
24
+ auth_token?: string;
25
+ params?: Record<string, unknown>;
26
+ graph?: {
27
+ nodes: Array<Record<string, unknown>>;
28
+ edges: Array<Record<string, unknown>>;
29
+ };
30
+ explicit_types?: boolean;
31
+ settings?: Record<string, unknown>;
32
+ }
33
+ export interface UnifiedWebSocketRunnerOptions {
34
+ userId?: string;
35
+ authToken?: string;
36
+ defaultModel?: string;
37
+ defaultProvider?: string;
38
+ resolveExecutor: (node: {
39
+ id: string;
40
+ type: string;
41
+ [key: string]: unknown;
42
+ }) => NodeExecutor;
43
+ resolveNodeType?: NodeTypeResolver;
44
+ resolveProvider?: (providerId: string, userId: string) => Promise<BaseProvider>;
45
+ /** Resolve server-side Tool instances by name (for tool execution in chat). */
46
+ resolveTools?: (toolNames: string[], userId: string) => Promise<Tool[]>;
47
+ getSystemStats?: () => Record<string, unknown>;
48
+ workspaceResolver?: (workflowId: string, userId: string) => Promise<string | null>;
49
+ /** Called before a workflow job starts — used to lazily connect the Python bridge. */
50
+ beforeRunJob?: (graph: {
51
+ nodes: Array<Record<string, unknown>>;
52
+ }) => Promise<void>;
53
+ /** Resolve node metadata by type — used for auto_save_asset detection. */
54
+ getNodeMetadata?: (nodeType: string) => NodeMetadata | undefined;
55
+ /**
56
+ * Optional pre-flight per-node validator. Forwarded to WorkflowRunner so
57
+ * missing required fields and unset model selections abort the run before
58
+ * any actor is spawned. `NodeRegistry.createNodeValidator()` from
59
+ * `@nodetool-ai/node-sdk` produces a compatible callback.
60
+ */
61
+ validateNode?: NodeValidator;
62
+ /**
63
+ * Optional NodeRegistry. When supplied, agent-mode chat routes through the
64
+ * graph-native MultiModeAgent → GraphPlanner path, biasing node selection
65
+ * toward `nodetool.*` core nodes and exposing a `find_model` tool.
66
+ */
67
+ nodeRegistry?: NodeRegistry;
68
+ }
69
+ export declare class UnifiedWebSocketRunner {
70
+ websocket: WebSocketConnection | null;
71
+ mode: WebSocketMode;
72
+ userId: string | null;
73
+ authToken: string | null;
74
+ private defaultModel;
75
+ private defaultProvider;
76
+ private resolveExecutor;
77
+ private resolveNodeType?;
78
+ private resolveProvider?;
79
+ private resolveTools?;
80
+ private getSystemStats;
81
+ private workspaceResolver?;
82
+ private beforeRunJob?;
83
+ private getNodeMetadata?;
84
+ private validateNode?;
85
+ private nodeRegistry?;
86
+ private configuredProvidersCache;
87
+ private sendLock;
88
+ private activeJobs;
89
+ private currentTask;
90
+ private heartbeatTimer;
91
+ private statsTimer;
92
+ private chatRequestSeq;
93
+ private clientToolsManifest;
94
+ private toolBridge;
95
+ private observerRegistered;
96
+ private logError;
97
+ /**
98
+ * Extract text from message content that may be a string or array of content items.
99
+ * Mirrors Python's _extract_query_text / _extract_objective / _extract_text_content.
100
+ */
101
+ private extractTextContent;
102
+ /**
103
+ * Run one final LLM call to present structured agent results as readable
104
+ * markdown. Falls back to formatted JSON if the call fails.
105
+ */
106
+ private presentStructuredResults;
107
+ private inferOutputType;
108
+ private resolveOutputNodeForKey;
109
+ private sendOutputUpdates;
110
+ constructor(options: UnifiedWebSocketRunnerOptions);
111
+ connect(websocket: WebSocketConnection, userId?: string, authToken?: string): Promise<void>;
112
+ disconnect(): Promise<void>;
113
+ private serializeForJson;
114
+ sendMessage(message: Record<string, unknown>): Promise<void>;
115
+ receiveMessage(): Promise<Record<string, unknown> | null>;
116
+ /**
117
+ * Normalize a raw graph so that the kernel's NodeDescriptor contract is met.
118
+ * The web-UI / Python serialisation stores node properties under `data`;
119
+ * the kernel expects them under `properties`.
120
+ */
121
+ private normalizeGraph;
122
+ private hydrateGraph;
123
+ private getRawGraph;
124
+ /**
125
+ * Surface a clean terminal job_update when pre-run setup fails (typically
126
+ * because the Python bridge could not start). Without this the error would
127
+ * bubble up to handleCommand and be sent as a generic `invalid_command`
128
+ * envelope, which the UI does not associate with the job — the workflow
129
+ * appears to spin forever instead of failing.
130
+ */
131
+ private emitBeforeRunFailure;
132
+ runJob(req: RunJobRequest): Promise<void>;
133
+ /**
134
+ * Execute a ComfyUI workflow via the comfy executor (local or RunPod).
135
+ */
136
+ private runComfyJob;
137
+ private streamJobMessages;
138
+ reconnectJob(jobId: string, workflowId?: string): Promise<void>;
139
+ resumeJob(jobId: string, workflowId?: string): Promise<void>;
140
+ cancelJob(jobId: string, workflowId?: string): Promise<Record<string, unknown>>;
141
+ getStatus(jobId?: string): Record<string, unknown>;
142
+ clearModels(): Promise<Record<string, unknown>>;
143
+ private ensureThreadExists;
144
+ private dbMessageToProviderMessage;
145
+ /**
146
+ * Save a message dict to the database.
147
+ * Mirrors Python's _save_message_to_db_async: pops id, type, user_id before create.
148
+ */
149
+ private saveMessageToDb;
150
+ /**
151
+ * Recursively process tool results, handling asset-like objects.
152
+ * Mirrors Python's RegularChatProcessor._process_tool_result().
153
+ *
154
+ * - Asset-like objects (have type + uri/data): materialized via storage
155
+ * - Date/datetime: converted to ISO string
156
+ * - Arrays/objects: recursed into
157
+ * - Primitives: returned as-is
158
+ */
159
+ private processToolResult;
160
+ /**
161
+ * Query vector store collections and return concatenated context string.
162
+ * Mirrors Python's RegularChatProcessor._query_collections().
163
+ */
164
+ private queryCollections;
165
+ /**
166
+ * Add collection context as a system message before the last user message.
167
+ * Mirrors Python's RegularChatProcessor._add_collection_context().
168
+ */
169
+ private addCollectionContext;
170
+ /**
171
+ * Handle an incoming chat message.
172
+ *
173
+ * Mirrors Python's full 3-layer flow:
174
+ * handle_chat_message → handle_message_impl → process_messages
175
+ * → _run_processor + RegularChatProcessor.process()
176
+ *
177
+ * The processor sends messages to a queue. _run_processor reads them:
178
+ * - type === "message" → persist to DB AND forward to client
179
+ * - anything else → forward to client only
180
+ *
181
+ * RegularChatProcessor.process():
182
+ * 1. Prepend system prompt if first message isn't system role
183
+ * 2. while True: messages_to_send = chat_history + unprocessed_messages
184
+ * 3. Stream chunks (type: "chunk") — forwarded to client (not persisted)
185
+ * 4. On tool call: build assistant Message + tool result Message (type: "message")
186
+ * → persisted to DB AND forwarded to client
187
+ * 5. If unprocessed_messages empty, break
188
+ * 6. Send done chunk + final assistant Message
189
+ */
190
+ handleChatMessage(data: Record<string, unknown>, requestSeq?: number): Promise<void>;
191
+ /**
192
+ * Log a provider call for cost tracking — mirrors Python's _log_provider_call().
193
+ * Best-effort: never throws, logs warnings on failure.
194
+ */
195
+ private _logProviderCall;
196
+ /**
197
+ * Detect message input node names from a workflow graph.
198
+ * Mirrors Python's WorkflowMessageProcessor._detect_message_input_names().
199
+ *
200
+ * Scans graph nodes for types ending in .MessageInput / .MessageListInput
201
+ * and returns their data.name values.
202
+ */
203
+ private detectMessageInputNames;
204
+ /**
205
+ * Convert workflow result dict into a response message with typed content.
206
+ * Mirrors Python's WorkflowMessageProcessor._create_response_message().
207
+ *
208
+ * Converts outputs to MessageContent items:
209
+ * - string → { type: "text", text }
210
+ * - list → { type: "text", text: joined }
211
+ * - dict with type "image"/"video"/"audio" → media content
212
+ * - other → { type: "text", text: stringified }
213
+ */
214
+ private createWorkflowResponseContent;
215
+ /**
216
+ * Handle a chat message that targets a workflow.
217
+ *
218
+ * Mirrors Python's process_messages_for_workflow → WorkflowMessageProcessor/
219
+ * ChatWorkflowMessageProcessor flow:
220
+ * 1. Load workflow from DB
221
+ * 2. Detect message input node names from graph
222
+ * 3. Prepare params (serialized message + history)
223
+ * 4. Run workflow via WorkflowRunner
224
+ * 5. Stream events (job_update, node_update, output_update)
225
+ * 6. Collect output_update results
226
+ * 7. Send done chunk + response message with typed content
227
+ */
228
+ /**
229
+ * Handle a chat_message with a `media_generation` payload by invoking the
230
+ * selected provider's textToImage / textToVideo API, storing the resulting
231
+ * asset(s), and returning them to the client as an assistant `Message`
232
+ * whose `content` is an array of `MessageImageContent` / `MessageVideoContent`
233
+ * blocks.
234
+ *
235
+ * The generated bytes are persisted via `ctx.storage.store()` so each
236
+ * output receives a stable URI the client can resolve as a server asset.
237
+ * The `media_generation` echo on the assistant message lets the UI render
238
+ * the generation header (model, variation count, resolution, etc.) in the
239
+ * conversation stream.
240
+ */
241
+ private handleMediaGenerationMessage;
242
+ /**
243
+ * Resolve the source image bytes for image-edit / image-to-video calls.
244
+ * Searches in priority order:
245
+ * 1. `media_generation.source_asset_id` → load from Asset storage
246
+ * 2. The first `image_url` content block on the user message
247
+ * (supports asset_id, http(s) uri, and inline data:base64 payloads)
248
+ * Returns `null` when no usable source image can be found.
249
+ */
250
+ private resolveSourceImageBytes;
251
+ private handleWorkflowMessage;
252
+ /**
253
+ * Build the map of configured BaseProvider instances for the given user.
254
+ * Cached per user — invalidate by clearing `configuredProvidersCache`.
255
+ * Used to expose `find_model` to the GraphPlanner agent so it can pick a
256
+ * real model+provider for generic AI nodes.
257
+ */
258
+ private getConfiguredProviders;
259
+ /**
260
+ * Handle agent mode messages.
261
+ * Mirrors Python's AgentMessageProcessor.process().
262
+ *
263
+ * Creates an Agent with the user's objective and streams execution events
264
+ * (Chunk, ToolCallUpdate, TaskUpdate, PlanningUpdate, LogUpdate, StepResult)
265
+ * to the client. Messages with type "message" are persisted to DB.
266
+ */
267
+ private handleAgentMessage;
268
+ handleInference(data: Record<string, unknown>, requestSeq: number): Promise<void>;
269
+ handleCommand(command: WebSocketCommandEnvelope): Promise<Record<string, unknown>>;
270
+ private startHeartbeat;
271
+ private stopHeartbeat;
272
+ private startStatsBroadcast;
273
+ private stopStatsBroadcast;
274
+ private registerObserver;
275
+ private unregisterObserver;
276
+ private onModelChange;
277
+ run(websocket: WebSocketConnection): Promise<void>;
278
+ receiveMessages(): Promise<void>;
279
+ }
280
+ //# sourceMappingURL=unified-websocket-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unified-websocket-runner.d.ts","sourceRoot":"","sources":["../src/unified-websocket-runner.ts"],"names":[],"mappings":"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"}