@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,431 @@
1
+ import { createLogger } from "@nodetool-ai/config";
2
+ import { WsAdapter } from "../ws-adapter.js";
3
+ import { UnifiedWebSocketRunner } from "../unified-websocket-runner.js";
4
+ import { createGraphNodeTypeResolver } from "@nodetool-ai/node-sdk";
5
+ import { PythonNodeExecutor, getProvider } from "@nodetool-ai/runtime";
6
+ import { Tool } from "@nodetool-ai/agents";
7
+ import { randomUUID } from "node:crypto";
8
+ import { Workflow } from "@nodetool-ai/models";
9
+ import { WorkflowRunner } from "@nodetool-ai/kernel";
10
+ const log = createLogger("nodetool.websocket.ws");
11
+ /** Sanitize a name to match OpenAI's tool name pattern: ^[a-zA-Z0-9_-]+$ */
12
+ function sanitizeToolName(name) {
13
+ return name.replace(/[^a-zA-Z0-9_-]/g, "_");
14
+ }
15
+ /**
16
+ * Wraps a NodeTool node type (with expose_as_tool) as an agent Tool.
17
+ * Builds inputSchema from the node's properties and executes via the registry.
18
+ */
19
+ class NodeTypeTool extends Tool {
20
+ meta;
21
+ registry;
22
+ name;
23
+ description;
24
+ inputSchema;
25
+ constructor(meta, registry) {
26
+ super();
27
+ this.meta = meta;
28
+ this.registry = registry;
29
+ this.name = sanitizeToolName(meta.node_type);
30
+ this.description = meta.description || meta.title;
31
+ this.inputSchema = NodeTypeTool.buildSchema(meta.properties);
32
+ }
33
+ static typeToJsonSchema(prop) {
34
+ const t = prop.type.type;
35
+ if (prop.values && prop.values.length > 0) {
36
+ return { type: "string", enum: prop.values };
37
+ }
38
+ switch (t) {
39
+ case "str":
40
+ case "string":
41
+ return { type: "string" };
42
+ case "int":
43
+ case "integer":
44
+ return { type: "integer" };
45
+ case "float":
46
+ case "number":
47
+ return { type: "number" };
48
+ case "bool":
49
+ case "boolean":
50
+ return { type: "boolean" };
51
+ default:
52
+ return { type: "string" };
53
+ }
54
+ }
55
+ static buildSchema(properties) {
56
+ const props = {};
57
+ const required = [];
58
+ for (const p of properties) {
59
+ const schema = NodeTypeTool.typeToJsonSchema(p);
60
+ if (p.description)
61
+ schema.description = p.description;
62
+ if (p.default !== undefined)
63
+ schema.default = p.default;
64
+ props[p.name] = schema;
65
+ if (p.required && p.default === undefined) {
66
+ required.push(p.name);
67
+ }
68
+ }
69
+ return {
70
+ type: "object",
71
+ properties: props,
72
+ ...(required.length > 0 ? { required } : {})
73
+ };
74
+ }
75
+ async process(context, params) {
76
+ const executor = this.registry.resolve({
77
+ id: randomUUID(),
78
+ type: this.meta.node_type,
79
+ properties: params
80
+ });
81
+ return executor.process(params, context);
82
+ }
83
+ }
84
+ /**
85
+ * Wraps a workflow (run_mode="tool") as an agent Tool.
86
+ * Input nodes become tool parameters; output nodes become the result.
87
+ */
88
+ class WorkflowTool extends Tool {
89
+ workflow;
90
+ resolveExecutor;
91
+ name;
92
+ description;
93
+ inputSchema;
94
+ constructor(workflow, resolveExecutor) {
95
+ super();
96
+ this.workflow = workflow;
97
+ this.resolveExecutor = resolveExecutor;
98
+ this.name = sanitizeToolName(`workflow_${workflow.tool_name}`);
99
+ this.description = workflow.description || workflow.name;
100
+ this.inputSchema = WorkflowTool.buildSchema(workflow);
101
+ }
102
+ static buildSchema(workflow) {
103
+ const props = {};
104
+ const required = [];
105
+ const graph = workflow.getGraph();
106
+ for (const node of graph.nodes) {
107
+ const nodeType = node.type ?? "";
108
+ if (!nodeType.includes("input."))
109
+ continue;
110
+ const name = node.data?.name;
111
+ if (!name)
112
+ continue;
113
+ // Map input node types to JSON schema types
114
+ let type = "string";
115
+ if (nodeType.includes("IntegerInput"))
116
+ type = "integer";
117
+ else if (nodeType.includes("FloatInput") ||
118
+ nodeType.includes("NumberInput"))
119
+ type = "number";
120
+ else if (nodeType.includes("BooleanInput"))
121
+ type = "boolean";
122
+ props[name] = { type, description: name };
123
+ required.push(name);
124
+ }
125
+ return {
126
+ type: "object",
127
+ properties: props,
128
+ ...(required.length > 0 ? { required } : {})
129
+ };
130
+ }
131
+ async process(_context, params) {
132
+ const graph = this.workflow.getGraph();
133
+ const nodes = graph.nodes.map((n) => ({
134
+ id: n.id,
135
+ type: n.type,
136
+ properties: (n.data ?? n.properties ?? {})
137
+ }));
138
+ const edges = graph.edges.map((e) => ({
139
+ source: e.source,
140
+ sourceHandle: e.sourceHandle,
141
+ target: e.target,
142
+ targetHandle: e.targetHandle
143
+ }));
144
+ // Inject input values into input nodes
145
+ for (const node of nodes) {
146
+ if (!node.type.includes("input."))
147
+ continue;
148
+ const name = node.properties?.name;
149
+ if (name && name in params) {
150
+ node.properties.value = params[name];
151
+ }
152
+ }
153
+ const runner = new WorkflowRunner(`workflow-tool-${Date.now()}`, {
154
+ resolveExecutor: this.resolveExecutor
155
+ });
156
+ const result = await runner.run({ job_id: `workflow-tool-${Date.now()}`, params }, { nodes, edges });
157
+ const outputs = {};
158
+ for (const msg of result.messages) {
159
+ if (msg.type === "node_update") {
160
+ const nu = msg;
161
+ if (nu.status !== "completed")
162
+ continue;
163
+ const node = nodes.find((n) => n.id === nu.node_id);
164
+ if (node?.type.includes("output.")) {
165
+ const r = nu.result;
166
+ const outputName = node.properties?.name ??
167
+ nu.node_id;
168
+ outputs[outputName] = r;
169
+ }
170
+ }
171
+ }
172
+ const keys = Object.keys(outputs);
173
+ if (keys.length === 1)
174
+ return outputs[keys[0]];
175
+ return outputs;
176
+ }
177
+ }
178
+ async function resolveProvider(providerId, userId) {
179
+ return getProvider(providerId.toLowerCase(), userId);
180
+ }
181
+ const isProduction = process.env["NODETOOL_ENV"] === "production";
182
+ async function handleTjsDownload(socket, repoId, modelType, aborts) {
183
+ const tjs = await import("@nodetool-ai/transformers-js-nodes");
184
+ const abort = new AbortController();
185
+ aborts.set(repoId, abort);
186
+ // Track total/loaded across all files the TJS runtime touches.
187
+ const fileTotals = new Map();
188
+ const completedFiles = new Set();
189
+ const sendProgress = (status, error) => {
190
+ let downloadedBytes = 0;
191
+ let totalBytes = 0;
192
+ for (const { loaded, total } of fileTotals.values()) {
193
+ downloadedBytes += loaded;
194
+ totalBytes += total;
195
+ }
196
+ const payload = {
197
+ status,
198
+ repo_id: repoId,
199
+ path: null,
200
+ model_type: modelType,
201
+ downloaded_bytes: downloadedBytes,
202
+ total_bytes: totalBytes,
203
+ downloaded_files: completedFiles.size,
204
+ current_files: Array.from(fileTotals.keys()).filter((f) => !completedFiles.has(f)),
205
+ total_files: fileTotals.size
206
+ };
207
+ if (error)
208
+ payload["error"] = error;
209
+ try {
210
+ socket.send(JSON.stringify(payload));
211
+ }
212
+ catch {
213
+ /* socket gone */
214
+ }
215
+ };
216
+ sendProgress("start");
217
+ try {
218
+ await tjs.downloadTransformersJsModel(repoId, {
219
+ modelType,
220
+ signal: abort.signal,
221
+ onProgress: (info) => {
222
+ if (!info.file)
223
+ return;
224
+ if (info.status === "initiate" || info.status === "download") {
225
+ if (!fileTotals.has(info.file)) {
226
+ fileTotals.set(info.file, { loaded: 0, total: info.total ?? 0 });
227
+ }
228
+ }
229
+ else if (info.status === "progress") {
230
+ const entry = fileTotals.get(info.file) ?? { loaded: 0, total: 0 };
231
+ entry.loaded = info.loaded ?? entry.loaded;
232
+ entry.total = info.total ?? entry.total;
233
+ fileTotals.set(info.file, entry);
234
+ }
235
+ else if (info.status === "done") {
236
+ const entry = fileTotals.get(info.file) ?? { loaded: 0, total: 0 };
237
+ if (entry.total > 0 && entry.loaded < entry.total) {
238
+ entry.loaded = entry.total;
239
+ }
240
+ fileTotals.set(info.file, entry);
241
+ completedFiles.add(info.file);
242
+ }
243
+ sendProgress("progress");
244
+ }
245
+ });
246
+ sendProgress("completed");
247
+ }
248
+ catch (err) {
249
+ if (abort.signal.aborted) {
250
+ sendProgress("cancelled");
251
+ }
252
+ else {
253
+ const message = err instanceof Error ? err.message : String(err);
254
+ sendProgress("error", message);
255
+ }
256
+ }
257
+ finally {
258
+ aborts.delete(repoId);
259
+ }
260
+ }
261
+ const websocketPlugin = async (app, opts) => {
262
+ const { registry, pythonBridge, getPythonBridgeReady, ensurePythonBridge, toolClassMap } = opts;
263
+ const graphNodeTypeResolver = createGraphNodeTypeResolver(registry);
264
+ async function resolveTools(toolNames, userId) {
265
+ const tools = [];
266
+ for (const name of toolNames) {
267
+ // Agent tool classes (e.g. "google_search")
268
+ const cls = toolClassMap.get(name);
269
+ if (cls) {
270
+ tools.push(new cls());
271
+ continue;
272
+ }
273
+ // Workflow tools (e.g. "workflow_my_tool")
274
+ if (name.startsWith("workflow_")) {
275
+ const toolName = name.slice("workflow_".length);
276
+ const wf = await Workflow.findByToolName(userId, toolName);
277
+ if (wf) {
278
+ const resolveExecutor = (node) => {
279
+ return registry.resolve({
280
+ id: node.id,
281
+ type: node.type,
282
+ properties: node.data
283
+ });
284
+ };
285
+ tools.push(new WorkflowTool(wf, resolveExecutor));
286
+ log.info("Resolved workflow as tool", { toolName, workflowId: wf.id });
287
+ continue;
288
+ }
289
+ }
290
+ // Node types with expose_as_tool (e.g. "search.google.GoogleImages")
291
+ const meta = registry.getMetadata(name);
292
+ if (meta && meta.expose_as_tool) {
293
+ tools.push(new NodeTypeTool(meta, registry));
294
+ log.info("Resolved node type as tool", { nodeType: name });
295
+ }
296
+ }
297
+ return tools;
298
+ }
299
+ // Main workflow/chat WebSocket
300
+ app.get("/ws", { websocket: true }, (socket, req) => {
301
+ socket.on("error", (error) => {
302
+ log.error("WebSocket client error", error);
303
+ });
304
+ const runner = new UnifiedWebSocketRunner({
305
+ userId: req.userId ?? "1",
306
+ beforeRunJob: async (graph) => {
307
+ if (getPythonBridgeReady())
308
+ return;
309
+ const hasPythonNode = graph.nodes.some((n) => {
310
+ const type = typeof n.type === "string" ? n.type : "";
311
+ return registry.getMetadata(type) && !registry.has(type);
312
+ });
313
+ if (hasPythonNode) {
314
+ await ensurePythonBridge();
315
+ }
316
+ },
317
+ resolveExecutor: (node) => {
318
+ if (registry.has(node.type)) {
319
+ return registry.resolve(node);
320
+ }
321
+ if (getPythonBridgeReady() && pythonBridge.hasNodeType(node.type)) {
322
+ const meta = pythonBridge
323
+ .getNodeMetadata()
324
+ .find((n) => n.node_type === node.type);
325
+ const nodeRec = node;
326
+ const props = (nodeRec.properties ?? nodeRec.data ?? {});
327
+ return new PythonNodeExecutor(pythonBridge, node.type, props, Object.fromEntries((meta?.outputs ?? []).map((o) => [o.name, o.type.type])), meta?.required_settings ?? []);
328
+ }
329
+ if (registry.getMetadata(node.type) && !registry.has(node.type)) {
330
+ const stderrSummary = pythonBridge.getRecentStderrSummary?.() ?? null;
331
+ const loadErrors = pythonBridge.getLoadErrors?.() ?? [];
332
+ const matchingLoadError = loadErrors.find((entry) => entry.module.includes(node.type) ||
333
+ node.type.startsWith(entry.module.split(".").slice(2).join(".")));
334
+ throw new Error(getPythonBridgeReady()
335
+ ? `Python node "${node.type}" cannot execute: it is declared in metadata but was not loaded by the Python worker.${matchingLoadError ? ` Load error: ${matchingLoadError.module}: ${matchingLoadError.error}.` : stderrSummary ? ` Recent Python worker stderr: ${stderrSummary}` : " Check Python worker status/load errors for import failures."}`
336
+ : `Python node "${node.type}" cannot execute: Python worker is not connected.${stderrSummary ? ` Recent Python worker stderr: ${stderrSummary}` : ""}`);
337
+ }
338
+ return registry.resolve(node);
339
+ },
340
+ resolveNodeType: graphNodeTypeResolver,
341
+ resolveProvider,
342
+ resolveTools,
343
+ getNodeMetadata: (nodeType) => registry.getMetadata(nodeType),
344
+ validateNode: registry.createNodeValidator(),
345
+ nodeRegistry: registry
346
+ });
347
+ log.info("WebSocket client connected");
348
+ void runner.run(new WsAdapter(socket)).catch((error) => {
349
+ log.error("Runner crashed", error instanceof Error ? error : new Error(String(error)));
350
+ });
351
+ });
352
+ // Download WebSocket endpoint — local development only
353
+ if (!isProduction) {
354
+ // Download WebSocket (HuggingFace model downloads)
355
+ app.get("/ws/download", { websocket: true }, (socket, _req) => {
356
+ socket.on("error", (error) => {
357
+ log.error("Download WebSocket error", error);
358
+ });
359
+ log.info("Download WebSocket client connected");
360
+ import("@nodetool-ai/huggingface")
361
+ .then(({ getDownloadManager }) => {
362
+ // TJS downloads are bookkept here so cancel can abort them.
363
+ const tjsAborts = new Map();
364
+ socket.on("message", async (raw) => {
365
+ try {
366
+ const msg = JSON.parse(raw.toString());
367
+ if (msg.command === "start_download") {
368
+ const repoId = msg.repo_id ?? "";
369
+ const modelType = msg.model_type ?? null;
370
+ if (modelType && modelType.startsWith("tjs.")) {
371
+ await handleTjsDownload(socket, repoId, modelType, tjsAborts);
372
+ return;
373
+ }
374
+ const manager = await getDownloadManager();
375
+ await manager.startDownload(repoId, {
376
+ path: msg.path ?? null,
377
+ allowPatterns: msg.allow_patterns ?? null,
378
+ ignorePatterns: msg.ignore_patterns ?? null,
379
+ cacheDir: msg.cache_dir ?? null,
380
+ modelType,
381
+ onProgress: (update) => {
382
+ try {
383
+ socket.send(JSON.stringify(update));
384
+ }
385
+ catch {
386
+ /* gone */
387
+ }
388
+ }
389
+ });
390
+ }
391
+ else if (msg.command === "cancel_download") {
392
+ const id = msg.repo_id ?? msg.id ?? "";
393
+ const tjsAbort = tjsAborts.get(id);
394
+ if (tjsAbort) {
395
+ tjsAbort.abort();
396
+ tjsAborts.delete(id);
397
+ return;
398
+ }
399
+ const manager = await getDownloadManager();
400
+ manager.cancelDownload(id);
401
+ }
402
+ }
403
+ catch (err) {
404
+ const error = err instanceof Error ? err.message : String(err);
405
+ try {
406
+ socket.send(JSON.stringify({ status: "error", error }));
407
+ }
408
+ catch {
409
+ /* gone */
410
+ }
411
+ }
412
+ });
413
+ })
414
+ .catch((err) => {
415
+ log.error("Failed to load @nodetool-ai/huggingface", err instanceof Error ? err : new Error(String(err)));
416
+ try {
417
+ socket.send(JSON.stringify({
418
+ status: "error",
419
+ error: "Download module unavailable"
420
+ }));
421
+ socket.close();
422
+ }
423
+ catch {
424
+ /* socket already gone */
425
+ }
426
+ });
427
+ });
428
+ }
429
+ };
430
+ export default websocketPlugin;
431
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/plugins/websocket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Resolve asset IDs in message content to browser-accessible URLs.
3
+ *
4
+ * Media refs store an `asset_id` in the database. Before sending to a
5
+ * client, this module resolves each to a full URL via `buildAssetUrl`.
6
+ *
7
+ * For LLM providers use `resolveContentForProvider` instead, which maps
8
+ * asset_id directly to a file:// URI so no HTTP round-trip is needed.
9
+ */
10
+ /**
11
+ * Walk a message content array and resolve asset_id refs to file:// URIs
12
+ * suitable for LLM provider calls (reads directly from disk).
13
+ */
14
+ export declare function resolveContentForProvider(content: string | unknown[] | Record<string, unknown> | null): string | unknown[] | Record<string, unknown> | null;
15
+ /**
16
+ * Walk a message content array and resolve asset_id refs to URLs.
17
+ */
18
+ export declare function resolveContentUrls(content: string | unknown[] | Record<string, unknown> | null): string | unknown[] | Record<string, unknown> | null;
19
+ //# sourceMappingURL=resolve-media-urls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-media-urls.d.ts","sourceRoot":"","sources":["../src/resolve-media-urls.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmEH;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAC3D,MAAM,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAyBrD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAC3D,MAAM,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAyBrD"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Resolve asset IDs in message content to browser-accessible URLs.
3
+ *
4
+ * Media refs store an `asset_id` in the database. Before sending to a
5
+ * client, this module resolves each to a full URL via `buildAssetUrl`.
6
+ *
7
+ * For LLM providers use `resolveContentForProvider` instead, which maps
8
+ * asset_id directly to a file:// URI so no HTTP round-trip is needed.
9
+ */
10
+ import { buildAssetUrl, getAssetFilePath } from "@nodetool-ai/config";
11
+ import { pathToFileURL } from "node:url";
12
+ const MIME_TO_EXT = {
13
+ "image/png": "png",
14
+ "image/jpeg": "jpg",
15
+ "image/gif": "gif",
16
+ "image/webp": "webp",
17
+ "image/svg+xml": "svg",
18
+ "audio/mpeg": "mp3",
19
+ "audio/mp3": "mp3",
20
+ "audio/wav": "wav",
21
+ "audio/ogg": "ogg",
22
+ "video/mp4": "mp4",
23
+ "video/webm": "webm",
24
+ "application/pdf": "pdf"
25
+ };
26
+ function extFromMime(mime) {
27
+ if (!mime)
28
+ return "bin";
29
+ return MIME_TO_EXT[mime] ?? "bin";
30
+ }
31
+ function resolveAssetId(assetId, mimeType) {
32
+ return buildAssetUrl(`${assetId}.${extFromMime(mimeType)}`);
33
+ }
34
+ /**
35
+ * Resolve a media ref object: if it has an asset_id, derive uri from it.
36
+ */
37
+ function resolveRef(ref, fallbackMime) {
38
+ const resolved = { ...ref };
39
+ const mime = (resolved.mimeType ?? resolved.mime_type ?? resolved.content_type ?? fallbackMime);
40
+ if (typeof resolved.asset_id === "string" && resolved.asset_id) {
41
+ resolved.uri = resolveAssetId(resolved.asset_id, mime);
42
+ }
43
+ return resolved;
44
+ }
45
+ /**
46
+ * Resolve a media ref for an LLM provider call.
47
+ * Maps asset_id directly to a file:// URI so providers read from disk,
48
+ * not via an HTTP round-trip to the local server.
49
+ */
50
+ function resolveRefForProvider(ref, fallbackMime) {
51
+ const resolved = { ...ref };
52
+ const mime = (resolved.mimeType ?? resolved.mime_type ?? resolved.content_type ?? fallbackMime);
53
+ if (typeof resolved.asset_id === "string" && resolved.asset_id && !resolved.uri) {
54
+ const ext = extFromMime(mime);
55
+ const filePath = getAssetFilePath(`${resolved.asset_id}.${ext}`);
56
+ resolved.uri = pathToFileURL(filePath).href;
57
+ }
58
+ return resolved;
59
+ }
60
+ /**
61
+ * Walk a message content array and resolve asset_id refs to file:// URIs
62
+ * suitable for LLM provider calls (reads directly from disk).
63
+ */
64
+ export function resolveContentForProvider(content) {
65
+ if (!Array.isArray(content))
66
+ return content;
67
+ return content.map((block) => {
68
+ if (!block || typeof block !== "object")
69
+ return block;
70
+ const b = block;
71
+ if ((b.type === "image_url" || b.type === "image") &&
72
+ b.image &&
73
+ typeof b.image === "object") {
74
+ return { ...b, image: resolveRefForProvider(b.image, "image/png") };
75
+ }
76
+ if (b.type === "video" && b.video && typeof b.video === "object") {
77
+ return { ...b, video: resolveRefForProvider(b.video, "video/mp4") };
78
+ }
79
+ if (b.type === "audio" && b.audio && typeof b.audio === "object") {
80
+ return { ...b, audio: resolveRefForProvider(b.audio, "audio/wav") };
81
+ }
82
+ return block;
83
+ });
84
+ }
85
+ /**
86
+ * Walk a message content array and resolve asset_id refs to URLs.
87
+ */
88
+ export function resolveContentUrls(content) {
89
+ if (!Array.isArray(content))
90
+ return content;
91
+ return content.map((block) => {
92
+ if (!block || typeof block !== "object")
93
+ return block;
94
+ const b = block;
95
+ if ((b.type === "image_url" || b.type === "image") &&
96
+ b.image &&
97
+ typeof b.image === "object") {
98
+ return { ...b, image: resolveRef(b.image, "image/png") };
99
+ }
100
+ if (b.type === "video" && b.video && typeof b.video === "object") {
101
+ return { ...b, video: resolveRef(b.video, "video/mp4") };
102
+ }
103
+ if (b.type === "audio" && b.audio && typeof b.audio === "object") {
104
+ return { ...b, audio: resolveRef(b.audio, "audio/wav") };
105
+ }
106
+ return block;
107
+ });
108
+ }
109
+ //# sourceMappingURL=resolve-media-urls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-media-urls.js","sourceRoot":"","sources":["../src/resolve-media-urls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { FastifyPluginAsync } from "fastify";
2
+ import type { HttpApiOptions } from "../http-api.js";
3
+ interface RouteOptions {
4
+ apiOptions: HttpApiOptions;
5
+ }
6
+ /**
7
+ * Assets REST plugin — only binary + multipart endpoints remain here.
8
+ * JSON CRUD + list + search + by-filename + children + recursive moved to
9
+ * the tRPC `assets` router.
10
+ *
11
+ * Still served via REST:
12
+ * - POST /api/assets — multipart file upload
13
+ * - GET /api/assets/:id/thumbnail — binary thumbnail
14
+ * - POST /api/assets/:id/thumbnail — 501 stub
15
+ * - POST /api/assets/download — 501 stub (ZIP download)
16
+ * - GET /api/assets/packages — empty list stub
17
+ * - GET /api/assets/packages/:package — empty list stub
18
+ * - GET /api/assets/packages/:package/:asset — binary asset file stream
19
+ */
20
+ declare const assetsRoutes: FastifyPluginAsync<RouteOptions>;
21
+ export default assetsRoutes;
22
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/routes/assets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAQrD,UAAU,YAAY;IACpB,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED;;;;;;;;;;;;;GAaG;AACH,QAAA,MAAM,YAAY,EAAE,kBAAkB,CAAC,YAAY,CAkMlD,CAAC;AAEF,eAAe,YAAY,CAAC"}