@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,168 @@
1
+ import { bridge } from "../lib/bridge.js";
2
+ import { handleAssetsRoot, handleAssetThumbnail } from "../http-api.js";
3
+ import { loadPythonPackageMetadata } from "@nodetool-ai/node-sdk";
4
+ import { ApiErrorCode, apiError } from "../error-codes.js";
5
+ /**
6
+ * Assets REST plugin — only binary + multipart endpoints remain here.
7
+ * JSON CRUD + list + search + by-filename + children + recursive moved to
8
+ * the tRPC `assets` router.
9
+ *
10
+ * Still served via REST:
11
+ * - POST /api/assets — multipart file upload
12
+ * - GET /api/assets/:id/thumbnail — binary thumbnail
13
+ * - POST /api/assets/:id/thumbnail — 501 stub
14
+ * - POST /api/assets/download — 501 stub (ZIP download)
15
+ * - GET /api/assets/packages — empty list stub
16
+ * - GET /api/assets/packages/:package — empty list stub
17
+ * - GET /api/assets/packages/:package/:asset — binary asset file stream
18
+ */
19
+ const assetsRoutes = async (app, opts) => {
20
+ const { apiOptions } = opts;
21
+ // Stub: no package listing in standalone mode.
22
+ app.get("/api/assets/packages", async (_req, reply) => {
23
+ reply.send({ assets: [], next: null });
24
+ });
25
+ // Stub: ZIP download not available in standalone mode.
26
+ app.post("/api/assets/download", async (_req, reply) => {
27
+ reply
28
+ .status(501)
29
+ .send(apiError(ApiErrorCode.SERVICE_UNAVAILABLE, "ZIP download not available in standalone mode"));
30
+ });
31
+ // Per-package asset listing (stub) and binary file streaming.
32
+ app.get("/api/assets/packages/:packageName", async (_req, reply) => {
33
+ reply.send({ assets: [], next: null });
34
+ });
35
+ app.get("/api/assets/packages/:packageName/:assetName", async (req, reply) => {
36
+ const { packageName, assetName } = req.params;
37
+ await bridge(req, reply, async (_request) => {
38
+ let pkgName;
39
+ let aName;
40
+ try {
41
+ pkgName = decodeURIComponent(packageName);
42
+ aName = decodeURIComponent(assetName);
43
+ }
44
+ catch {
45
+ return new Response(JSON.stringify(apiError(ApiErrorCode.INVALID_INPUT, "Invalid URL encoding")), {
46
+ status: 400,
47
+ headers: { "content-type": "application/json" }
48
+ });
49
+ }
50
+ if (!pkgName ||
51
+ !aName ||
52
+ pkgName.includes("..") ||
53
+ aName.includes("..") ||
54
+ pkgName.includes("/") ||
55
+ aName.includes("/") ||
56
+ pkgName.includes("\\") ||
57
+ aName.includes("\\")) {
58
+ return new Response(JSON.stringify(apiError(ApiErrorCode.ASSET_NOT_FOUND, "Not found")), {
59
+ status: 404,
60
+ headers: { "content-type": "application/json" }
61
+ });
62
+ }
63
+ const loaded = loadPythonPackageMetadata({
64
+ roots: apiOptions.metadataRoots,
65
+ maxDepth: apiOptions.metadataMaxDepth
66
+ });
67
+ const pkg = loaded.packages.find((p) => p.name === pkgName);
68
+ if (!pkg || !pkg.sourceFolder) {
69
+ return new Response(JSON.stringify(apiError(ApiErrorCode.NOT_FOUND, `Package '${pkgName}' not found`)), {
70
+ status: 404,
71
+ headers: { "content-type": "application/json" }
72
+ });
73
+ }
74
+ const { createReadStream, statSync } = await import("node:fs");
75
+ const { extname, resolve } = await import("node:path");
76
+ const mimeTypes = {
77
+ ".jpg": "image/jpeg",
78
+ ".jpeg": "image/jpeg",
79
+ ".png": "image/png",
80
+ ".gif": "image/gif",
81
+ ".webp": "image/webp",
82
+ ".svg": "image/svg+xml",
83
+ ".mp3": "audio/mpeg",
84
+ ".mp4": "video/mp4",
85
+ ".webm": "video/webm",
86
+ ".json": "application/json",
87
+ ".txt": "text/plain"
88
+ };
89
+ const baseDir = resolve(`${pkg.sourceFolder}/nodetool/assets/${pkgName}`);
90
+ const assetPath = resolve(baseDir, aName);
91
+ // Prevent path traversal.
92
+ if (!assetPath.startsWith(baseDir + "/") && assetPath !== baseDir) {
93
+ return new Response(JSON.stringify(apiError(ApiErrorCode.ASSET_NOT_FOUND, "Not found")), {
94
+ status: 404,
95
+ headers: { "content-type": "application/json" }
96
+ });
97
+ }
98
+ let fileStat;
99
+ try {
100
+ fileStat = statSync(assetPath);
101
+ }
102
+ catch {
103
+ return new Response(JSON.stringify(apiError(ApiErrorCode.ASSET_NOT_FOUND, `Asset '${aName}' not found in package '${pkgName}'`)), {
104
+ status: 404,
105
+ headers: { "content-type": "application/json" }
106
+ });
107
+ }
108
+ const contentType = mimeTypes[extname(aName).toLowerCase()] ?? "application/octet-stream";
109
+ const stream = createReadStream(assetPath);
110
+ const webStream = new ReadableStream({
111
+ start(controller) {
112
+ stream.on("data", (chunk) => {
113
+ try {
114
+ controller.enqueue(chunk);
115
+ }
116
+ catch {
117
+ stream.destroy();
118
+ }
119
+ });
120
+ stream.on("end", () => {
121
+ try {
122
+ controller.close();
123
+ }
124
+ catch {
125
+ /* already closed */
126
+ }
127
+ });
128
+ stream.on("error", (err) => {
129
+ try {
130
+ controller.error(err);
131
+ }
132
+ catch {
133
+ /* already errored */
134
+ }
135
+ });
136
+ },
137
+ cancel() {
138
+ stream.destroy();
139
+ }
140
+ });
141
+ return new Response(webStream, {
142
+ status: 200,
143
+ headers: {
144
+ "content-type": contentType,
145
+ "content-length": String(fileStat.size),
146
+ "cache-control": "public, max-age=31536000, immutable",
147
+ etag: `"${pkgName}-${aName}-${fileStat.size}-${fileStat.mtimeMs}"`
148
+ }
149
+ });
150
+ });
151
+ });
152
+ // Binary thumbnail serving + POST stub.
153
+ app.get("/api/assets/:id/thumbnail", async (req, reply) => {
154
+ const { id } = req.params;
155
+ await bridge(req, reply, (request) => handleAssetThumbnail(request, decodeURIComponent(id), apiOptions));
156
+ });
157
+ app.post("/api/assets/:id/thumbnail", async (req, reply) => {
158
+ const { id } = req.params;
159
+ await bridge(req, reply, (request) => handleAssetThumbnail(request, decodeURIComponent(id), apiOptions));
160
+ });
161
+ // Multipart asset upload (file POST). The handler also accepts JSON bodies,
162
+ // but the tRPC `assets.create` procedure is the preferred path for JSON.
163
+ app.post("/api/assets", async (req, reply) => {
164
+ await bridge(req, reply, (request) => handleAssetsRoot(request, apiOptions));
165
+ });
166
+ };
167
+ export default assetsRoutes;
168
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/routes/assets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAM3D;;;;;;;;;;;;;GAaG;AACH,MAAM,YAAY,GAAqC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IACzE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAE5B,+CAA+C;IAC/C,GAAG,CAAC,GAAG,CAAC,sBAAsB,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QACpD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,uDAAuD;IACvD,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QACrD,KAAK;aACF,MAAM,CAAC,GAAG,CAAC;aACX,IAAI,CACH,QAAQ,CACN,YAAY,CAAC,mBAAmB,EAChC,+CAA+C,CAChD,CACF,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,8DAA8D;IAC9D,GAAG,CAAC,GAAG,CAAC,mCAAmC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QACjE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CACL,8CAA8C,EAC9C,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAGtC,CAAC;QACF,MAAM,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC1C,IAAI,OAAe,CAAC;YACpB,IAAI,KAAa,CAAC;YAClB,IAAI,CAAC;gBACH,OAAO,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;gBAC1C,KAAK,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CACZ,QAAQ,CAAC,YAAY,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAC7D,EACD;oBACE,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CACF,CAAC;YACJ,CAAC;YACD,IACE,CAAC,OAAO;gBACR,CAAC,KAAK;gBACN,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACtB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACrB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACnB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACtB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EACpB,CAAC;gBACD,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC,EACnE;oBACE,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CACF,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,GAAG,yBAAyB,CAAC;gBACvC,KAAK,EAAE,UAAU,CAAC,aAAa;gBAC/B,QAAQ,EAAE,UAAU,CAAC,gBAAgB;aACtC,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;YAC5D,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;gBAC9B,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CACZ,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,YAAY,OAAO,aAAa,CAAC,CACnE,EACD;oBACE,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CACF,CAAC;YACJ,CAAC;YACD,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YAC/D,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;YACvD,MAAM,SAAS,GAA2B;gBACxC,MAAM,EAAE,YAAY;gBACpB,OAAO,EAAE,YAAY;gBACrB,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,WAAW;gBACnB,OAAO,EAAE,YAAY;gBACrB,MAAM,EAAE,eAAe;gBACvB,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE,WAAW;gBACnB,OAAO,EAAE,YAAY;gBACrB,OAAO,EAAE,kBAAkB;gBAC3B,MAAM,EAAE,YAAY;aACrB,CAAC;YACF,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,GAAG,CAAC,YAAY,oBAAoB,OAAO,EAAE,CACjD,CAAC;YACF,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1C,0BAA0B;YAC1B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBAClE,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC,EACnE;oBACE,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CACF,CAAC;YACJ,CAAC;YACD,IAAI,QAA2C,CAAC;YAChD,IAAI,CAAC;gBACH,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CACZ,QAAQ,CACN,YAAY,CAAC,eAAe,EAC5B,UAAU,KAAK,2BAA2B,OAAO,GAAG,CACrD,CACF,EACD;oBACE,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CACF,CAAC;YACJ,CAAC;YACD,MAAM,WAAW,GACf,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,0BAA0B,CAAC;YACxE,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC;gBACnC,KAAK,CAAC,UAAU;oBACd,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;wBAC1B,IAAI,CAAC;4BACH,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;wBAC5B,CAAC;wBAAC,MAAM,CAAC;4BACP,MAAM,CAAC,OAAO,EAAE,CAAC;wBACnB,CAAC;oBACH,CAAC,CAAC,CAAC;oBACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;wBACpB,IAAI,CAAC;4BACH,UAAU,CAAC,KAAK,EAAE,CAAC;wBACrB,CAAC;wBAAC,MAAM,CAAC;4BACP,oBAAoB;wBACtB,CAAC;oBACH,CAAC,CAAC,CAAC;oBACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;wBACzB,IAAI,CAAC;4BACH,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBACxB,CAAC;wBAAC,MAAM,CAAC;4BACP,qBAAqB;wBACvB,CAAC;oBACH,CAAC,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM;oBACJ,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,CAAC;aACF,CAAC,CAAC;YACH,OAAO,IAAI,QAAQ,CAAC,SAAS,EAAE;gBAC7B,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE;oBACP,cAAc,EAAE,WAAW;oBAC3B,gBAAgB,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;oBACvC,eAAe,EAAE,qCAAqC;oBACtD,IAAI,EAAE,IAAI,OAAO,IAAI,KAAK,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,GAAG;iBACnE;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEF,wCAAwC;IACxC,GAAG,CAAC,GAAG,CAAC,2BAA2B,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACxD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CACnC,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAClE,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACzD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CACnC,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAClE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,yEAAyE;IACzE,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QAC3C,MAAM,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CACnC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CACtC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { FastifyPluginAsync } from "fastify";
2
+ import type { HttpApiOptions } from "../http-api.js";
3
+ interface RouteOptions {
4
+ apiOptions: HttpApiOptions;
5
+ }
6
+ /**
7
+ * Collections REST plugin — only the multipart file-upload endpoint remains.
8
+ * CRUD + query operations moved to the tRPC `collections` router.
9
+ *
10
+ * The wildcard route intentionally forwards all /api/collections/*
11
+ * paths so the handler can decide whether to respond (for /index) or return
12
+ * null (so we can 404).
13
+ */
14
+ declare const collectionsRoutes: FastifyPluginAsync<RouteOptions>;
15
+ export default collectionsRoutes;
16
+ //# sourceMappingURL=collections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../src/routes/collections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,UAAU,YAAY;IACpB,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,QAAA,MAAM,iBAAiB,EAAE,kBAAkB,CAAC,YAAY,CA8BvD,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { bridge } from "../lib/bridge.js";
2
+ import { handleCollectionRequest } from "../collection-api.js";
3
+ /**
4
+ * Collections REST plugin — only the multipart file-upload endpoint remains.
5
+ * CRUD + query operations moved to the tRPC `collections` router.
6
+ *
7
+ * The wildcard route intentionally forwards all /api/collections/*
8
+ * paths so the handler can decide whether to respond (for /index) or return
9
+ * null (so we can 404).
10
+ */
11
+ const collectionsRoutes = async (app, opts) => {
12
+ const { apiOptions } = opts;
13
+ app.all("/api/collections/*", async (req, reply) => {
14
+ const url = new URL(req.url, "http://localhost");
15
+ await bridge(req, reply, async (request) => {
16
+ const res = await handleCollectionRequest(request, url.pathname, apiOptions);
17
+ return (res ??
18
+ new Response(JSON.stringify({ detail: "Not found" }), {
19
+ status: 404,
20
+ headers: { "content-type": "application/json" }
21
+ }));
22
+ });
23
+ });
24
+ // Admin endpoints (stubs)
25
+ app.post("/admin/secrets/import", async (_req, reply) => {
26
+ reply
27
+ .status(501)
28
+ .send({ detail: "Secrets import not available in standalone mode" });
29
+ });
30
+ };
31
+ export default collectionsRoutes;
32
+ //# sourceMappingURL=collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/routes/collections.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAM/D;;;;;;;GAOG;AACH,MAAM,iBAAiB,GAAqC,KAAK,EAC/D,GAAG,EACH,IAAI,EACJ,EAAE;IACF,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAE5B,GAAG,CAAC,GAAG,CAAC,oBAAoB,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACjD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACjD,MAAM,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACzC,MAAM,GAAG,GAAG,MAAM,uBAAuB,CACvC,OAAO,EACP,GAAG,CAAC,QAAQ,EACZ,UAAU,CACX,CAAC;YACF,OAAO,CACL,GAAG;gBACH,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE;oBACpD,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QACtD,KAAK;aACF,MAAM,CAAC,GAAG,CAAC;aACX,IAAI,CAAC,EAAE,MAAM,EAAE,iDAAiD,EAAE,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Binary-only REST routes for the file browser.
3
+ * JSON ops (list, info) have moved to the tRPC `files` router.
4
+ */
5
+ import type { FastifyPluginAsync } from "fastify";
6
+ import type { HttpApiOptions } from "../http-api.js";
7
+ interface RouteOptions {
8
+ apiOptions: HttpApiOptions;
9
+ }
10
+ declare const filesRoutes: FastifyPluginAsync<RouteOptions>;
11
+ export default filesRoutes;
12
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/routes/files.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,UAAU,YAAY;IACpB,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED,QAAA,MAAM,WAAW,EAAE,kBAAkB,CAAC,YAAY,CAMjD,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { bridge } from "../lib/bridge.js";
2
+ import { handleFileRequest } from "../file-api.js";
3
+ const filesRoutes = async (app, _opts) => {
4
+ // Register all methods so unsupported verbs reach the handler and get the
5
+ // explicit 405 response instead of Fastify's default 404.
6
+ app.all("/api/files/download", async (req, reply) => {
7
+ await bridge(req, reply, (request) => handleFileRequest(request));
8
+ });
9
+ };
10
+ export default filesRoutes;
11
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/routes/files.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAMnD,MAAM,WAAW,GAAqC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;IACzE,0EAA0E;IAC1E,0DAA0D;IAC1D,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QAClD,MAAM,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { FastifyPluginAsync } from "fastify";
2
+ declare const healthRoute: FastifyPluginAsync;
3
+ export default healthRoute;
4
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAKlD,QAAA,MAAM,WAAW,EAAE,kBAwClB,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { getRawDb } from "@nodetool-ai/models";
2
+ const serverStartTime = Date.now();
3
+ const healthRoute = async (app) => {
4
+ /**
5
+ * GET /health — detailed health check.
6
+ * Returns 200 when all services are healthy, 503 when degraded.
7
+ * No authentication required.
8
+ */
9
+ app.get("/health", async (_req, reply) => {
10
+ let dbStatus = "ok";
11
+ try {
12
+ const raw = getRawDb();
13
+ // Fast integrity check — just verifies the connection is alive
14
+ raw.pragma("quick_check(1)");
15
+ }
16
+ catch {
17
+ dbStatus = "error";
18
+ }
19
+ const allOk = dbStatus === "ok";
20
+ const payload = {
21
+ status: allOk ? "ok" : "degraded",
22
+ timestamp: new Date().toISOString(),
23
+ uptime: Math.floor((Date.now() - serverStartTime) / 1000),
24
+ services: {
25
+ database: dbStatus,
26
+ server: "ok"
27
+ }
28
+ };
29
+ return reply.status(allOk ? 200 : 503).send(payload);
30
+ });
31
+ /**
32
+ * GET /ready — simple liveness probe.
33
+ * Always returns 200 if the server is accepting requests.
34
+ * No authentication required.
35
+ */
36
+ app.get("/ready", async (_req, reply) => {
37
+ return reply.status(200).send({ status: "ok" });
38
+ });
39
+ };
40
+ export default healthRoute;
41
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAEnC,MAAM,WAAW,GAAuB,KAAK,EAAE,GAAG,EAAE,EAAE;IACpD;;;;OAIG;IACH,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QACvC,IAAI,QAAQ,GAAmB,IAAI,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;YACvB,+DAA+D;YAC/D,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,OAAO,CAAC;QACrB,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,KAAK,IAAI,CAAC;QAEhC,MAAM,OAAO,GAAG;YACd,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU;YACjC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC;YACzD,QAAQ,EAAE;gBACR,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE,IAAa;aACtB;SACF,CAAC;QAEF,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH;;;;OAIG;IACH,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QACtC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { FastifyPluginAsync } from "fastify";
2
+ import type { HttpApiOptions } from "../http-api.js";
3
+ interface RouteOptions {
4
+ apiOptions: HttpApiOptions;
5
+ }
6
+ /**
7
+ * Jobs REST plugin — only the trigger-job stub routes remain here.
8
+ * CRUD + cancel + running-all moved to the tRPC `jobs` router.
9
+ *
10
+ * Trigger workflows aren't available in standalone mode — these endpoints
11
+ * return empty lists / 501s and are kept on REST to avoid polluting the
12
+ * tRPC type surface with stub-only procedures.
13
+ */
14
+ declare const jobsRoutes: FastifyPluginAsync<RouteOptions>;
15
+ export default jobsRoutes;
16
+ //# sourceMappingURL=jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/routes/jobs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAOrD,UAAU,YAAY;IACpB,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,QAAA,MAAM,UAAU,EAAE,kBAAkB,CAAC,YAAY,CAchD,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { bridge } from "../lib/bridge.js";
2
+ import { handleTriggersRunning, handleTriggerStart, handleTriggerStop } from "../http-api.js";
3
+ /**
4
+ * Jobs REST plugin — only the trigger-job stub routes remain here.
5
+ * CRUD + cancel + running-all moved to the tRPC `jobs` router.
6
+ *
7
+ * Trigger workflows aren't available in standalone mode — these endpoints
8
+ * return empty lists / 501s and are kept on REST to avoid polluting the
9
+ * tRPC type surface with stub-only procedures.
10
+ */
11
+ const jobsRoutes = async (app) => {
12
+ app.get("/api/jobs/triggers/running", async (req, reply) => {
13
+ await bridge(req, reply, (request) => handleTriggersRunning(request));
14
+ });
15
+ app.post("/api/jobs/triggers/:id/start", async (req, reply) => {
16
+ const { id } = req.params;
17
+ await bridge(req, reply, (request) => handleTriggerStart(request, id));
18
+ });
19
+ app.post("/api/jobs/triggers/:id/stop", async (req, reply) => {
20
+ const { id } = req.params;
21
+ await bridge(req, reply, (request) => handleTriggerStop(request, id));
22
+ });
23
+ };
24
+ export default jobsRoutes;
25
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/routes/jobs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AAMxB;;;;;;;GAOG;AACH,MAAM,UAAU,GAAqC,KAAK,EAAE,GAAG,EAAE,EAAE;IACjE,GAAG,CAAC,GAAG,CAAC,4BAA4B,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACzD,MAAM,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,8BAA8B,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QAC5D,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,6BAA6B,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QAC3D,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { FastifyPluginAsync } from "fastify";
2
+ import type { HttpApiOptions } from "../http-api.js";
3
+ interface RouteOptions {
4
+ apiOptions: HttpApiOptions;
5
+ }
6
+ declare const nodesRoutes: FastifyPluginAsync<RouteOptions>;
7
+ export default nodesRoutes;
8
+ //# sourceMappingURL=nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/routes/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKrD,UAAU,YAAY;IACpB,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED,QAAA,MAAM,WAAW,EAAE,kBAAkB,CAAC,YAAY,CAyGjD,CAAC;AAqCF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,124 @@
1
+ import { bridge } from "../lib/bridge.js";
2
+ import { handleNodeMetadata } from "../http-api.js";
3
+ import { resolveKieDynamicSchema } from "@nodetool-ai/base-nodes";
4
+ import { ApiErrorCode, apiError } from "../error-codes.js";
5
+ const nodesRoutes = async (app, opts) => {
6
+ const { apiOptions } = opts;
7
+ /**
8
+ * /api/nodes/metadata — stays as REST (public, consumed at client boot).
9
+ * Must NOT require authentication — the frontend calls this before auth.
10
+ */
11
+ app.get("/api/nodes/metadata", async (req, reply) => {
12
+ await bridge(req, reply, (request) => handleNodeMetadata(request, apiOptions));
13
+ });
14
+ /**
15
+ * Legacy alias for /api/nodes/metadata.
16
+ */
17
+ app.get("/api/node/metadata", async (req, reply) => {
18
+ await bridge(req, reply, (request) => handleNodeMetadata(request, apiOptions));
19
+ });
20
+ /**
21
+ * KIE dynamic schema resolution — stays as REST (fast, stateless, no auth needed).
22
+ */
23
+ app.post("/api/kie/resolve-dynamic-schema", async (req, reply) => {
24
+ const body = req.body;
25
+ const modelInfo = extractKieModelInfo(body);
26
+ if (typeof modelInfo !== "string" || !modelInfo.trim()) {
27
+ reply
28
+ .status(400)
29
+ .send(apiError(ApiErrorCode.INVALID_INPUT, "model_info must be a non-empty string"));
30
+ return;
31
+ }
32
+ try {
33
+ reply.send(resolveKieDynamicSchema(modelInfo.trim()));
34
+ }
35
+ catch (error) {
36
+ reply
37
+ .status(400)
38
+ .send(apiError(ApiErrorCode.INVALID_INPUT, error instanceof Error ? error.message : String(error)));
39
+ }
40
+ });
41
+ /**
42
+ * Proxy ComfyUI /object_info through the backend to avoid CORS issues
43
+ * with remote hosts (e.g. RunPod Pods).
44
+ */
45
+ app.get("/api/comfy/object_info", async (req, reply) => {
46
+ const host = req.query["host"]?.trim();
47
+ if (!host) {
48
+ reply.status(400).send({ error: "host query parameter is required" });
49
+ return;
50
+ }
51
+ // Validate and normalise the host into a safe URL (prevents SSRF via
52
+ // non-HTTP schemes such as file://, ftp://, etc.).
53
+ let parsedUrl;
54
+ try {
55
+ const raw = host.startsWith("http") ? host : `http://${host}`;
56
+ parsedUrl = new URL(raw);
57
+ }
58
+ catch {
59
+ reply.status(400).send({ error: "Invalid host URL" });
60
+ return;
61
+ }
62
+ if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
63
+ reply
64
+ .status(400)
65
+ .send({ error: "Only http and https hosts are supported" });
66
+ return;
67
+ }
68
+ // Trim any trailing slashes without backtracking regex (avoids ReDoS).
69
+ let base = parsedUrl.origin + parsedUrl.pathname;
70
+ let end = base.length;
71
+ while (end > 0 && base[end - 1] === "/")
72
+ end--;
73
+ base = base.slice(0, end);
74
+ try {
75
+ const resp = await fetch(`${base}/object_info`);
76
+ if (!resp.ok) {
77
+ reply
78
+ .status(resp.status)
79
+ .send({ error: `ComfyUI returned ${resp.status}` });
80
+ return;
81
+ }
82
+ const data = await resp.json();
83
+ reply.send(data);
84
+ }
85
+ catch (err) {
86
+ reply.status(502).send({
87
+ error: `Cannot reach ComfyUI at ${base}: ${err instanceof Error ? err.message : String(err)}`
88
+ });
89
+ }
90
+ });
91
+ };
92
+ function extractKieModelInfo(body) {
93
+ if (Buffer.isBuffer(body)) {
94
+ const text = body.toString("utf8").trim();
95
+ if (!text) {
96
+ return undefined;
97
+ }
98
+ try {
99
+ return extractKieModelInfo(JSON.parse(text));
100
+ }
101
+ catch {
102
+ return text;
103
+ }
104
+ }
105
+ if (typeof body === "string") {
106
+ try {
107
+ const parsed = JSON.parse(body);
108
+ return extractKieModelInfo(parsed);
109
+ }
110
+ catch {
111
+ return body;
112
+ }
113
+ }
114
+ if (!body || typeof body !== "object") {
115
+ return undefined;
116
+ }
117
+ const record = body;
118
+ return (record.model_info ??
119
+ record.modelInfo ??
120
+ extractKieModelInfo(record.properties) ??
121
+ extractKieModelInfo(record.body));
122
+ }
123
+ export default nodesRoutes;
124
+ //# sourceMappingURL=nodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../src/routes/nodes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { FastifyPluginAsync } from "fastify";
2
+ import type { HttpApiOptions } from "../http-api.js";
3
+ interface RouteOptions {
4
+ apiOptions: HttpApiOptions;
5
+ }
6
+ declare const oauthRoutes: FastifyPluginAsync<RouteOptions>;
7
+ export default oauthRoutes;
8
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/routes/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIrD,UAAU,YAAY;IACpB,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED,QAAA,MAAM,WAAW,EAAE,kBAAkB,CAAC,YAAY,CAkBjD,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { bridge } from "../lib/bridge.js";
2
+ import { handleOAuthRequest } from "../oauth-api.js";
3
+ import { getUserId } from "../http-api.js";
4
+ const oauthRoutes = async (app, opts) => {
5
+ const { apiOptions } = opts;
6
+ app.all("/api/oauth/*", async (req, reply) => {
7
+ const url = new URL(req.url, "http://localhost");
8
+ await bridge(req, reply, async (request) => {
9
+ const res = await handleOAuthRequest(request, url.pathname, () => getUserId(request, apiOptions.userIdHeader ?? "x-user-id"));
10
+ return (res ??
11
+ new Response(JSON.stringify({ detail: "Not found" }), {
12
+ status: 404,
13
+ headers: { "content-type": "application/json" }
14
+ }));
15
+ });
16
+ });
17
+ };
18
+ export default oauthRoutes;
19
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/routes/oauth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAM3C,MAAM,WAAW,GAAqC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IACxE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAE5B,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QAC3C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACjD,MAAM,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACzC,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CAC/D,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,YAAY,IAAI,WAAW,CAAC,CAC3D,CAAC;YACF,OAAO,CACL,GAAG;gBACH,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE;oBACpD,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { FastifyPluginAsync } from "fastify";
2
+ import type { HttpApiOptions } from "../http-api.js";
3
+ interface RouteOptions {
4
+ apiOptions: HttpApiOptions;
5
+ }
6
+ declare const openaiRoutes: FastifyPluginAsync<RouteOptions>;
7
+ export default openaiRoutes;
8
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/routes/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIrD,UAAU,YAAY;IACpB,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED,QAAA,MAAM,YAAY,EAAE,kBAAkB,CAAC,YAAY,CAsBlD,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { bridge } from "../lib/bridge.js";
2
+ import { handleOpenAIRequest } from "../openai-api.js";
3
+ import { getUserId } from "../http-api.js";
4
+ const openaiRoutes = async (app, opts) => {
5
+ const { apiOptions } = opts;
6
+ app.all("/v1/*", async (req, reply) => {
7
+ const url = new URL(req.url, "http://localhost");
8
+ await bridge(req, reply, async (request) => {
9
+ const userId = getUserId(request, apiOptions.userIdHeader ?? "x-user-id");
10
+ const res = await handleOpenAIRequest(request, url.pathname, userId, apiOptions.openai);
11
+ return (res ??
12
+ new Response(JSON.stringify({ detail: "Not found" }), {
13
+ status: 404,
14
+ headers: { "content-type": "application/json" }
15
+ }));
16
+ });
17
+ });
18
+ };
19
+ export default openaiRoutes;
20
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/routes/openai.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAM3C,MAAM,YAAY,GAAqC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IACzE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAE5B,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACpC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACjD,MAAM,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACzC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,YAAY,IAAI,WAAW,CAAC,CAAC;YAC1E,MAAM,GAAG,GAAG,MAAM,mBAAmB,CACnC,OAAO,EACP,GAAG,CAAC,QAAQ,EACZ,MAAM,EACN,UAAU,CAAC,MAAM,CAClB,CAAC;YACF,OAAO,CACL,GAAG;gBACH,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE;oBACpD,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Binary-only REST routes for storage.
3
+ * JSON ops (list, metadata, delete) have moved to the tRPC `storage` router.
4
+ */
5
+ import type { FastifyPluginAsync } from "fastify";
6
+ import type { HttpApiOptions } from "../http-api.js";
7
+ interface RouteOptions {
8
+ apiOptions: HttpApiOptions;
9
+ }
10
+ declare const storageRoutes: FastifyPluginAsync<RouteOptions>;
11
+ export default storageRoutes;
12
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/routes/storage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,UAAU,YAAY;IACpB,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED,QAAA,MAAM,aAAa,EAAE,kBAAkB,CAAC,YAAY,CASnD,CAAC;AAEF,eAAe,aAAa,CAAC"}