@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,100 @@
1
+ /**
2
+ * Jobs router — migrated from REST `/api/jobs*`.
3
+ *
4
+ * Ported verbatim from the legacy http-api.ts handlers (`handleJobsRoot`,
5
+ * `handleJobById`, `handleJobCancel`, and the inline `/running/all` handler).
6
+ * User ownership is enforced on every procedure — a job whose `user_id`
7
+ * doesn't match `ctx.userId` is indistinguishable from a missing one.
8
+ *
9
+ * The trigger stubs (`/api/jobs/triggers/*`) stay on REST — they're
10
+ * 501-placeholders for a feature that isn't available in standalone mode.
11
+ */
12
+ import { Job } from "@nodetool-ai/models";
13
+ import { ApiErrorCode } from "../../error-codes.js";
14
+ import { router } from "../index.js";
15
+ import { protectedProcedure } from "../middleware.js";
16
+ import { throwApiError } from "../error-formatter.js";
17
+ import { listInput, listOutput, runningAllOutput, getInput, jobResponse, deleteInput, deleteOutput, cancelInput, cancelOutput } from "@nodetool-ai/protocol/api-schemas/jobs.js";
18
+ function toJobResponse(job) {
19
+ return {
20
+ id: job.id,
21
+ user_id: job.user_id,
22
+ job_type: "workflow",
23
+ status: job.status,
24
+ workflow_id: job.workflow_id,
25
+ started_at: job.started_at ?? null,
26
+ finished_at: job.finished_at ?? null,
27
+ error: job.error ?? null,
28
+ cost: null
29
+ };
30
+ }
31
+ function toBackgroundJobResponse(job) {
32
+ return {
33
+ job_id: job.id,
34
+ status: job.status,
35
+ workflow_id: job.workflow_id,
36
+ created_at: job.started_at ?? null,
37
+ is_running: job.status === "running" || job.status === "scheduled",
38
+ is_completed: job.status === "completed" ||
39
+ job.status === "failed" ||
40
+ job.status === "cancelled"
41
+ };
42
+ }
43
+ export const jobsRouter = router({
44
+ list: protectedProcedure
45
+ .input(listInput)
46
+ .output(listOutput)
47
+ .query(async ({ ctx, input }) => {
48
+ const [jobs, nextStartKey] = await Job.paginate(ctx.userId, {
49
+ limit: input.limit,
50
+ workflowId: input.workflow_id
51
+ });
52
+ return {
53
+ jobs: jobs.map((j) => toJobResponse(j)),
54
+ next_start_key: nextStartKey || null
55
+ };
56
+ }),
57
+ // GET /api/jobs/running/all — returns only running/scheduled jobs
58
+ // (legacy paginated with limit=500 then filtered).
59
+ runningAll: protectedProcedure
60
+ .output(runningAllOutput)
61
+ .query(async ({ ctx }) => {
62
+ const [jobs] = await Job.paginate(ctx.userId, { limit: 500 });
63
+ const running = jobs.filter((j) => j.status === "running" || j.status === "scheduled");
64
+ return running.map((j) => toBackgroundJobResponse(j));
65
+ }),
66
+ get: protectedProcedure
67
+ .input(getInput)
68
+ .output(jobResponse)
69
+ .query(async ({ ctx, input }) => {
70
+ const job = (await Job.get(input.id));
71
+ if (!job || job.user_id !== ctx.userId) {
72
+ throwApiError(ApiErrorCode.NOT_FOUND, "Job not found");
73
+ }
74
+ return toJobResponse(job);
75
+ }),
76
+ delete: protectedProcedure
77
+ .input(deleteInput)
78
+ .output(deleteOutput)
79
+ .mutation(async ({ ctx, input }) => {
80
+ const job = (await Job.get(input.id));
81
+ if (!job || job.user_id !== ctx.userId) {
82
+ throwApiError(ApiErrorCode.NOT_FOUND, "Job not found");
83
+ }
84
+ await job.delete();
85
+ return { ok: true };
86
+ }),
87
+ cancel: protectedProcedure
88
+ .input(cancelInput)
89
+ .output(cancelOutput)
90
+ .mutation(async ({ ctx, input }) => {
91
+ const job = (await Job.get(input.id));
92
+ if (!job || job.user_id !== ctx.userId) {
93
+ throwApiError(ApiErrorCode.NOT_FOUND, "Job not found");
94
+ }
95
+ job.markCancelled();
96
+ await job.save();
97
+ return toBackgroundJobResponse(job);
98
+ })
99
+ });
100
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../../src/trpc/routers/jobs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * MCP Config router — migrated from REST `/api/mcp/*`.
3
+ *
4
+ * Manages NodeTool MCP server installation in AI coding assistants
5
+ * (Claude Code, Codex, OpenCode). The procedures mutate user config files
6
+ * on the local filesystem, so they are disabled in production via
7
+ * `NODETOOL_ENV=production` → SERVICE_UNAVAILABLE.
8
+ *
9
+ * The router is always registered on `appRouter` so the type surface stays
10
+ * consistent for clients; the production guard is applied inside each
11
+ * procedure.
12
+ */
13
+ export declare const mcpConfigRouter: import("@trpc/server").TRPCBuiltRouter<{
14
+ ctx: import("../context.js").Context;
15
+ meta: object;
16
+ errorShape: import("../error-formatter.js").ApiErrorShape;
17
+ transformer: true;
18
+ }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
19
+ status: import("@trpc/server").TRPCQueryProcedure<{
20
+ input: void;
21
+ output: {
22
+ targets: {
23
+ target: "claude" | "codex" | "opencode";
24
+ label: string;
25
+ installed: boolean;
26
+ url: string | null;
27
+ configPath: string | null;
28
+ }[];
29
+ defaultUrl: string;
30
+ };
31
+ meta: object;
32
+ }>;
33
+ install: import("@trpc/server").TRPCMutationProcedure<{
34
+ input: {
35
+ targets?: ("claude" | "codex" | "opencode")[] | undefined;
36
+ url?: string | undefined;
37
+ };
38
+ output: {
39
+ results: ({
40
+ target: "claude" | "codex" | "opencode";
41
+ label: string;
42
+ success: true;
43
+ configPath: string;
44
+ } | {
45
+ target: "claude" | "codex" | "opencode";
46
+ label: string;
47
+ success: false;
48
+ error: string;
49
+ })[];
50
+ url: string;
51
+ };
52
+ meta: object;
53
+ }>;
54
+ uninstall: import("@trpc/server").TRPCMutationProcedure<{
55
+ input: {
56
+ targets?: ("claude" | "codex" | "opencode")[] | undefined;
57
+ };
58
+ output: {
59
+ results: {
60
+ target: "claude" | "codex" | "opencode";
61
+ label: string;
62
+ removed: boolean;
63
+ error?: string | undefined;
64
+ }[];
65
+ };
66
+ meta: object;
67
+ }>;
68
+ }>>;
69
+ //# sourceMappingURL=mcp-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../../src/trpc/routers/mcp-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA0PH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0D1B,CAAC"}
@@ -0,0 +1,290 @@
1
+ /**
2
+ * MCP Config router — migrated from REST `/api/mcp/*`.
3
+ *
4
+ * Manages NodeTool MCP server installation in AI coding assistants
5
+ * (Claude Code, Codex, OpenCode). The procedures mutate user config files
6
+ * on the local filesystem, so they are disabled in production via
7
+ * `NODETOOL_ENV=production` → SERVICE_UNAVAILABLE.
8
+ *
9
+ * The router is always registered on `appRouter` so the type surface stays
10
+ * consistent for clients; the production guard is applied inside each
11
+ * procedure.
12
+ */
13
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
14
+ import { join } from "node:path";
15
+ import { homedir } from "node:os";
16
+ import { ApiErrorCode } from "../../error-codes.js";
17
+ import { router } from "../index.js";
18
+ import { protectedProcedure } from "../middleware.js";
19
+ import { throwApiError } from "../error-formatter.js";
20
+ import { mcpTarget, statusOutput, installInput, installOutput, uninstallInput, uninstallOutput } from "@nodetool-ai/protocol/api-schemas/mcp-config.js";
21
+ const ALL_TARGETS = ["claude", "codex", "opencode"];
22
+ const TARGET_LABELS = {
23
+ claude: "Claude Code",
24
+ codex: "Codex",
25
+ opencode: "OpenCode"
26
+ };
27
+ const NODETOOL_MCP_BEGIN = "# BEGIN NODETOOL MCP";
28
+ const NODETOOL_MCP_END = "# END NODETOOL MCP";
29
+ // ── Helpers ──────────────────────────────────────────────────────
30
+ /** Guard: MCP config is disabled in production. */
31
+ function requireNonProduction() {
32
+ if (process.env["NODETOOL_ENV"] === "production") {
33
+ throwApiError(ApiErrorCode.SERVICE_UNAVAILABLE, "MCP configuration is not available in production");
34
+ }
35
+ }
36
+ function defaultMcpUrl() {
37
+ const port = Number(process.env["PORT"] ?? 7777);
38
+ const tlsEnabled = Boolean(process.env["TLS_CERT"] && process.env["TLS_KEY"]);
39
+ return `${tlsEnabled ? "https" : "http"}://127.0.0.1:${port}/mcp`;
40
+ }
41
+ function getStatus(target) {
42
+ const home = homedir();
43
+ const base = {
44
+ target,
45
+ label: TARGET_LABELS[target],
46
+ installed: false,
47
+ url: null,
48
+ configPath: null
49
+ };
50
+ switch (target) {
51
+ case "claude": {
52
+ const p = join(home, ".claude.json");
53
+ base.configPath = p;
54
+ if (existsSync(p)) {
55
+ try {
56
+ const config = JSON.parse(readFileSync(p, "utf8"));
57
+ const srv = config?.projects?.[home]?.mcpServers?.nodetool;
58
+ if (srv) {
59
+ base.installed = true;
60
+ base.url = srv.url ?? null;
61
+ }
62
+ }
63
+ catch {
64
+ /* ignore parse errors */
65
+ }
66
+ }
67
+ break;
68
+ }
69
+ case "codex": {
70
+ const p = join(home, ".codex", "config.toml");
71
+ base.configPath = p;
72
+ if (existsSync(p)) {
73
+ try {
74
+ const content = readFileSync(p, "utf8");
75
+ const m = /# BEGIN NODETOOL MCP[\s\S]*?url\s*=\s*"([^"]*)"/.exec(content);
76
+ if (m) {
77
+ base.installed = true;
78
+ base.url = m[1] ?? null;
79
+ }
80
+ }
81
+ catch {
82
+ /* ignore */
83
+ }
84
+ }
85
+ break;
86
+ }
87
+ case "opencode": {
88
+ const p = join(home, ".config", "opencode", "opencode.json");
89
+ base.configPath = p;
90
+ if (existsSync(p)) {
91
+ try {
92
+ const config = JSON.parse(readFileSync(p, "utf8"));
93
+ if (config?.mcp?.nodetool) {
94
+ base.installed = true;
95
+ base.url = config.mcp.nodetool.url ?? null;
96
+ }
97
+ }
98
+ catch {
99
+ /* ignore */
100
+ }
101
+ }
102
+ break;
103
+ }
104
+ }
105
+ return base;
106
+ }
107
+ function installTarget(target, mcpUrl) {
108
+ const home = homedir();
109
+ switch (target) {
110
+ case "claude": {
111
+ const p = join(home, ".claude.json");
112
+ let config = {};
113
+ if (existsSync(p)) {
114
+ config = JSON.parse(readFileSync(p, "utf8"));
115
+ }
116
+ const projects = (config["projects"] ?? {});
117
+ const global = projects[home] ?? {};
118
+ const servers = (global["mcpServers"] ?? {});
119
+ servers["nodetool"] = { type: "http", url: mcpUrl };
120
+ global["mcpServers"] = servers;
121
+ projects[home] = global;
122
+ config["projects"] = projects;
123
+ writeFileSync(p, JSON.stringify(config, null, 2) + "\n");
124
+ return p;
125
+ }
126
+ case "codex": {
127
+ const dir = join(home, ".codex");
128
+ const p = join(dir, "config.toml");
129
+ mkdirSync(dir, { recursive: true });
130
+ const block = [
131
+ NODETOOL_MCP_BEGIN,
132
+ "[mcp_servers.nodetool]",
133
+ `url = "${mcpUrl}"`,
134
+ "startup_timeout_sec = 20",
135
+ "tool_timeout_sec = 60",
136
+ "enabled = true",
137
+ "required = true",
138
+ NODETOOL_MCP_END
139
+ ].join("\n");
140
+ let content = "";
141
+ if (existsSync(p)) {
142
+ content = readFileSync(p, "utf8");
143
+ const re = new RegExp(`${NODETOOL_MCP_BEGIN}[\\s\\S]*?${NODETOOL_MCP_END}\\n?`);
144
+ content = re.test(content)
145
+ ? content.replace(re, block + "\n")
146
+ : content.trimEnd() + "\n\n" + block + "\n";
147
+ }
148
+ else {
149
+ content = block + "\n";
150
+ }
151
+ writeFileSync(p, content);
152
+ return p;
153
+ }
154
+ case "opencode": {
155
+ const dir = join(home, ".config", "opencode");
156
+ const p = join(dir, "opencode.json");
157
+ mkdirSync(dir, { recursive: true });
158
+ let config = {};
159
+ if (existsSync(p)) {
160
+ config = JSON.parse(readFileSync(p, "utf8"));
161
+ }
162
+ const mcp = (config["mcp"] ?? {});
163
+ mcp["nodetool"] = { type: "remote", url: mcpUrl };
164
+ config["mcp"] = mcp;
165
+ writeFileSync(p, JSON.stringify(config, null, 2) + "\n");
166
+ return p;
167
+ }
168
+ }
169
+ }
170
+ function uninstallTarget(target) {
171
+ const home = homedir();
172
+ switch (target) {
173
+ case "claude": {
174
+ const p = join(home, ".claude.json");
175
+ if (!existsSync(p))
176
+ return false;
177
+ try {
178
+ const config = JSON.parse(readFileSync(p, "utf8"));
179
+ const servers = config?.projects?.[home]?.mcpServers;
180
+ if (!servers || !("nodetool" in servers))
181
+ return false;
182
+ delete servers["nodetool"];
183
+ writeFileSync(p, JSON.stringify(config, null, 2) + "\n");
184
+ return true;
185
+ }
186
+ catch {
187
+ return false;
188
+ }
189
+ }
190
+ case "codex": {
191
+ const p = join(home, ".codex", "config.toml");
192
+ if (!existsSync(p))
193
+ return false;
194
+ try {
195
+ let content = readFileSync(p, "utf8");
196
+ const re = /# BEGIN NODETOOL MCP[\s\S]*?# END NODETOOL MCP\n?/;
197
+ if (!re.test(content))
198
+ return false;
199
+ content = content.replace(re, "").trimEnd() + "\n";
200
+ writeFileSync(p, content);
201
+ return true;
202
+ }
203
+ catch {
204
+ return false;
205
+ }
206
+ }
207
+ case "opencode": {
208
+ const p = join(home, ".config", "opencode", "opencode.json");
209
+ if (!existsSync(p))
210
+ return false;
211
+ try {
212
+ const config = JSON.parse(readFileSync(p, "utf8"));
213
+ if (!config?.mcp?.nodetool)
214
+ return false;
215
+ delete config.mcp.nodetool;
216
+ writeFileSync(p, JSON.stringify(config, null, 2) + "\n");
217
+ return true;
218
+ }
219
+ catch {
220
+ return false;
221
+ }
222
+ }
223
+ }
224
+ }
225
+ /** Filter an unknown input.targets array down to the valid McpTarget enum. */
226
+ function resolveTargets(raw) {
227
+ if (!raw || raw.length === 0)
228
+ return ALL_TARGETS;
229
+ // Zod already validated against the enum, but keep the guard for clarity.
230
+ return raw.filter((t) => mcpTarget.safeParse(t).success);
231
+ }
232
+ // ── Router ────────────────────────────────────────────────────────
233
+ export const mcpConfigRouter = router({
234
+ status: protectedProcedure.output(statusOutput).query(() => {
235
+ requireNonProduction();
236
+ const statuses = ALL_TARGETS.map(getStatus);
237
+ return { targets: statuses, defaultUrl: defaultMcpUrl() };
238
+ }),
239
+ install: protectedProcedure
240
+ .input(installInput)
241
+ .output(installOutput)
242
+ .mutation(({ input }) => {
243
+ requireNonProduction();
244
+ const targets = resolveTargets(input.targets);
245
+ const mcpUrl = input.url ?? defaultMcpUrl();
246
+ const results = targets.map((t) => {
247
+ try {
248
+ const configPath = installTarget(t, mcpUrl);
249
+ return {
250
+ target: t,
251
+ label: TARGET_LABELS[t],
252
+ success: true,
253
+ configPath
254
+ };
255
+ }
256
+ catch (e) {
257
+ return {
258
+ target: t,
259
+ label: TARGET_LABELS[t],
260
+ success: false,
261
+ error: String(e)
262
+ };
263
+ }
264
+ });
265
+ return { results, url: mcpUrl };
266
+ }),
267
+ uninstall: protectedProcedure
268
+ .input(uninstallInput)
269
+ .output(uninstallOutput)
270
+ .mutation(({ input }) => {
271
+ requireNonProduction();
272
+ const targets = resolveTargets(input.targets);
273
+ const results = targets.map((t) => {
274
+ try {
275
+ const removed = uninstallTarget(t);
276
+ return { target: t, label: TARGET_LABELS[t], removed };
277
+ }
278
+ catch (e) {
279
+ return {
280
+ target: t,
281
+ label: TARGET_LABELS[t],
282
+ removed: false,
283
+ error: String(e)
284
+ };
285
+ }
286
+ });
287
+ return { results };
288
+ })
289
+ });
290
+ //# sourceMappingURL=mcp-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../../src/trpc/routers/mcp-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Messages router — migrated from REST `/api/messages*`.
3
+ *
4
+ * Handlers previously lived inline in http-api.ts (`handleMessagesRoot`,
5
+ * `handleMessageById`). The logic is ported verbatim here; helpers that
6
+ * were useful only to those handlers (`toMessageResponse`, `MessageCreateBody`)
7
+ * move with them.
8
+ *
9
+ * User ownership is enforced in every procedure — a message whose `user_id`
10
+ * doesn't match `ctx.userId` is indistinguishable from a missing one (both
11
+ * throw NOT_FOUND) to avoid leaking existence.
12
+ */
13
+ export declare const messagesRouter: import("@trpc/server").TRPCBuiltRouter<{
14
+ ctx: import("../context.js").Context;
15
+ meta: object;
16
+ errorShape: import("../error-formatter.js").ApiErrorShape;
17
+ transformer: true;
18
+ }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
19
+ list: import("@trpc/server").TRPCQueryProcedure<{
20
+ input: {
21
+ thread_id: string;
22
+ limit?: number | undefined;
23
+ cursor?: string | undefined;
24
+ reverse?: boolean | undefined;
25
+ };
26
+ output: {
27
+ messages: {
28
+ type: "message";
29
+ id: string;
30
+ user_id: string;
31
+ thread_id: string;
32
+ role: string;
33
+ name: string | null;
34
+ content: string | Record<string, unknown> | unknown[] | null;
35
+ tool_calls: unknown[] | null;
36
+ tool_call_id: string | null;
37
+ created_at: string;
38
+ updated_at: string;
39
+ provider?: string | null | undefined;
40
+ model?: string | null | undefined;
41
+ cost?: number | null | undefined;
42
+ workflow_id?: string | null | undefined;
43
+ agent_execution_id?: string | null | undefined;
44
+ execution_event_type?: string | null | undefined;
45
+ workflow_target?: string | null | undefined;
46
+ media_generation?: Record<string, unknown> | null | undefined;
47
+ }[];
48
+ next: string | null;
49
+ };
50
+ meta: object;
51
+ }>;
52
+ create: import("@trpc/server").TRPCMutationProcedure<{
53
+ input: {
54
+ role: string;
55
+ content: string | Record<string, unknown> | unknown[] | null;
56
+ thread_id?: string | undefined;
57
+ name?: string | null | undefined;
58
+ tool_call_id?: string | null | undefined;
59
+ tool_calls?: unknown[] | null | undefined;
60
+ };
61
+ output: {
62
+ type: "message";
63
+ id: string;
64
+ user_id: string;
65
+ thread_id: string;
66
+ role: string;
67
+ name: string | null;
68
+ content: string | Record<string, unknown> | unknown[] | null;
69
+ tool_calls: unknown[] | null;
70
+ tool_call_id: string | null;
71
+ created_at: string;
72
+ updated_at: string;
73
+ provider?: string | null | undefined;
74
+ model?: string | null | undefined;
75
+ cost?: number | null | undefined;
76
+ workflow_id?: string | null | undefined;
77
+ agent_execution_id?: string | null | undefined;
78
+ execution_event_type?: string | null | undefined;
79
+ workflow_target?: string | null | undefined;
80
+ media_generation?: Record<string, unknown> | null | undefined;
81
+ };
82
+ meta: object;
83
+ }>;
84
+ get: import("@trpc/server").TRPCQueryProcedure<{
85
+ input: {
86
+ id: string;
87
+ };
88
+ output: {
89
+ type: "message";
90
+ id: string;
91
+ user_id: string;
92
+ thread_id: string;
93
+ role: string;
94
+ name: string | null;
95
+ content: string | Record<string, unknown> | unknown[] | null;
96
+ tool_calls: unknown[] | null;
97
+ tool_call_id: string | null;
98
+ created_at: string;
99
+ updated_at: string;
100
+ provider?: string | null | undefined;
101
+ model?: string | null | undefined;
102
+ cost?: number | null | undefined;
103
+ workflow_id?: string | null | undefined;
104
+ agent_execution_id?: string | null | undefined;
105
+ execution_event_type?: string | null | undefined;
106
+ workflow_target?: string | null | undefined;
107
+ media_generation?: Record<string, unknown> | null | undefined;
108
+ };
109
+ meta: object;
110
+ }>;
111
+ delete: import("@trpc/server").TRPCMutationProcedure<{
112
+ input: {
113
+ id: string;
114
+ };
115
+ output: {
116
+ ok: true;
117
+ };
118
+ meta: object;
119
+ }>;
120
+ }>>;
121
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/trpc/routers/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA+CH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwEzB,CAAC"}