@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,47 @@
1
+ /**
2
+ * Agent runtime — manages Claude/Codex/OpenCode agent SDK sessions.
3
+ *
4
+ * Sessions live entirely in-process; renderers connect over WebSocket
5
+ * (see `socket-route.ts`) and provide a transport for streaming
6
+ * messages and bridging frontend tool execution.
7
+ */
8
+ import type { AgentTransport } from "./transport.js";
9
+ import type { AgentGetSessionMessagesRequest, AgentListSessionsRequest, AgentModelDescriptor, AgentModelsRequest, AgentSessionInfoEntry, AgentSessionOptions, AgentTranscriptMessage } from "./types.js";
10
+ export { SYSTEM_PROMPT, type AgentQuerySession, type AgentSdkProvider, } from "./sdk-provider.js";
11
+ /**
12
+ * AgentRuntime — manages all active agent sessions.
13
+ *
14
+ * One instance is shared per process. Each WebSocket connection routes its
15
+ * commands through this runtime; sessions are addressable by their sessionId
16
+ * from any connection (so a user can reconnect mid-stream), but every
17
+ * mutating operation is gated by the calling user's id — sessionIds are
18
+ * predictable (counter-based for the temp id; thread-id for LLM after the
19
+ * first turn) so the runtime must enforce ownership rather than rely on
20
+ * sessionId being a secret.
21
+ */
22
+ declare class AgentRuntime {
23
+ private readonly activeSessions;
24
+ /** Owning userId for each entry in `activeSessions`. */
25
+ private readonly sessionOwners;
26
+ private sessionCounter;
27
+ /**
28
+ * Throw a uniform "not yours" error so callers can't probe session ids.
29
+ * Returns the session if the caller owns it, otherwise throws.
30
+ */
31
+ private getOwnedSession;
32
+ createSession(options: AgentSessionOptions, userId: string): Promise<string>;
33
+ /**
34
+ * Send a message and stream replies through the given transport.
35
+ * Returns when the agent turn completes.
36
+ */
37
+ sendMessageStreaming(sessionId: string, message: string, transport: AgentTransport, userId: string): Promise<void>;
38
+ stopExecution(sessionId: string, userId: string): Promise<void>;
39
+ closeSession(sessionId: string, userId: string): void;
40
+ closeAllSessions(): void;
41
+ listModels(options: AgentModelsRequest, userId: string): Promise<AgentModelDescriptor[]>;
42
+ listSessionsForRequest(options: AgentListSessionsRequest, userId: string): Promise<AgentSessionInfoEntry[]>;
43
+ getSessionMessagesForRequest(options: AgentGetSessionMessagesRequest, userId: string): Promise<AgentTranscriptMessage[]>;
44
+ }
45
+ export declare function getAgentRuntime(): AgentRuntime;
46
+ export type { AgentRuntime };
47
+ //# sourceMappingURL=agent-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-runtime.d.ts","sourceRoot":"","sources":["../../src/agent/agent-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwCH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EACV,8BAA8B,EAC9B,wBAAwB,EAExB,oBAAoB,EAEpB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EAEvB,MAAM,YAAY,CAAC;AASpB,OAAO,EACL,aAAa,EACb,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC;AAshB3B;;;;;;;;;;GAUG;AACH,cAAM,YAAY;IAChB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwC;IACvE,wDAAwD;IACxD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,OAAO,CAAC,cAAc,CAAK;IAE3B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAcjB,aAAa,CACjB,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC;IA6ClB;;;OAGG;IACG,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,cAAc,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAwEV,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAcrD,gBAAgB,IAAI,IAAI;IAYlB,UAAU,CACd,OAAO,EAAE,kBAAkB,EAC3B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAK5B,sBAAsB,CAC1B,OAAO,EAAE,wBAAwB,EACjC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAW7B,4BAA4B,CAChC,OAAO,EAAE,8BAA8B,EACvC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,sBAAsB,EAAE,CAAC;CASrC;AAID,wBAAgB,eAAe,IAAI,YAAY,CAK9C;AAED,YAAY,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,577 @@
1
+ /**
2
+ * Agent runtime — manages Claude/Codex/OpenCode agent SDK sessions.
3
+ *
4
+ * Sessions live entirely in-process; renderers connect over WebSocket
5
+ * (see `socket-route.ts`) and provide a transport for streaming
6
+ * messages and bridging frontend tool execution.
7
+ */
8
+ import { randomUUID } from "node:crypto";
9
+ import { createLogger } from "@nodetool-ai/config";
10
+ import { query, listSessions, getSessionMessages, } from "@anthropic-ai/claude-agent-sdk";
11
+ import { uiToolSchemas } from "@nodetool-ai/protocol";
12
+ import { CodexQuerySession, listCodexModels, } from "./codex-agent.js";
13
+ import { OpenCodeQuerySession, listOpenCodeModels, listOpenCodeSessions, getOpenCodeSessionMessages, closeOpenCodeServer, } from "./opencode-agent.js";
14
+ import { PiQuerySession, listPiModels, listPiSessions, getPiSessionMessages, } from "./pi-agent.js";
15
+ import { stopMcpToolServer, } from "./mcp-tool-server.js";
16
+ import { LlmAgentSdkProvider } from "./llm-agent.js";
17
+ import { getLocalMcpServerUrl, setMcpFrontendTransport, } from "../mcp-server.js";
18
+ const log = createLogger("nodetool.websocket.agent.runtime");
19
+ // SYSTEM_PROMPT, AgentQuerySession, and AgentSdkProvider live in
20
+ // `sdk-provider.ts` to break a circular import: `llm-agent.ts` needs
21
+ // SYSTEM_PROMPT and the interfaces, and this file in turn imports
22
+ // LlmAgentSdkProvider from llm-agent.js. Re-exported here for the
23
+ // existing import sites.
24
+ export { SYSTEM_PROMPT, } from "./sdk-provider.js";
25
+ import { SYSTEM_PROMPT } from "./sdk-provider.js";
26
+ const CLAUDE_DISALLOWED_TOOLS = [
27
+ "Bash",
28
+ "Read",
29
+ "Write",
30
+ "Edit",
31
+ "Glob",
32
+ "Grep",
33
+ "NotebookEdit",
34
+ "TodoWrite",
35
+ "WebFetch",
36
+ "WebSearch",
37
+ "Task",
38
+ "TaskOutput",
39
+ ];
40
+ function getMissingFrontendTools(manifest) {
41
+ const manifestNames = new Set(manifest
42
+ .map((tool) => tool.name)
43
+ .filter((name) => typeof name === "string" && name.startsWith("ui_")));
44
+ return Object.keys(uiToolSchemas).filter((name) => !manifestNames.has(name));
45
+ }
46
+ function convertSdkMessage(msg, sessionId) {
47
+ const uuid = randomUUID();
48
+ if (msg.type === "assistant") {
49
+ const message = msg.message;
50
+ const content = message?.content;
51
+ if (!Array.isArray(content))
52
+ return null;
53
+ const textBlocks = [];
54
+ const toolCalls = [];
55
+ for (const block of content) {
56
+ if (!block || typeof block !== "object")
57
+ continue;
58
+ const b = block;
59
+ if (b.type === "text" && typeof b.text === "string") {
60
+ textBlocks.push({ type: "text", text: b.text });
61
+ }
62
+ else if (b.type === "tool_use" &&
63
+ typeof b.id === "string" &&
64
+ typeof b.name === "string") {
65
+ toolCalls.push({
66
+ id: b.id,
67
+ type: "function",
68
+ function: {
69
+ name: b.name,
70
+ arguments: JSON.stringify(b.input ?? {}),
71
+ },
72
+ });
73
+ }
74
+ }
75
+ if (textBlocks.length === 0 && toolCalls.length === 0)
76
+ return null;
77
+ return {
78
+ type: "assistant",
79
+ uuid,
80
+ session_id: sessionId,
81
+ content: textBlocks.length > 0 ? textBlocks : undefined,
82
+ tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
83
+ };
84
+ }
85
+ if (msg.type === "result") {
86
+ const subtype = msg.subtype;
87
+ if (subtype === "success") {
88
+ return {
89
+ type: "result",
90
+ uuid,
91
+ session_id: sessionId,
92
+ subtype: "success",
93
+ text: typeof msg.result === "string" ? msg.result : undefined,
94
+ };
95
+ }
96
+ return {
97
+ type: "result",
98
+ uuid,
99
+ session_id: sessionId,
100
+ subtype: subtype ?? "error",
101
+ is_error: true,
102
+ errors: Array.isArray(msg.errors)
103
+ ? msg.errors
104
+ : [String(msg.result ?? "Unknown error")],
105
+ };
106
+ }
107
+ if (msg.type === "system")
108
+ return null;
109
+ if (msg.type === "stream_event") {
110
+ const event = msg;
111
+ const partial = event.message;
112
+ const content = partial?.content;
113
+ if (Array.isArray(content)) {
114
+ const textBlocks = [];
115
+ for (const block of content) {
116
+ if (block && typeof block === "object") {
117
+ const b = block;
118
+ if (b.type === "text" && typeof b.text === "string") {
119
+ textBlocks.push({ type: "text", text: b.text });
120
+ }
121
+ }
122
+ }
123
+ if (textBlocks.length > 0) {
124
+ return {
125
+ type: "assistant",
126
+ uuid,
127
+ session_id: sessionId,
128
+ content: textBlocks,
129
+ };
130
+ }
131
+ }
132
+ return null;
133
+ }
134
+ return null;
135
+ }
136
+ class ClaudeAgentSession {
137
+ closed = false;
138
+ model;
139
+ workspacePath;
140
+ systemPrompt;
141
+ maxTurns;
142
+ resolvedSessionId;
143
+ inFlight = false;
144
+ activeQuery = null;
145
+ constructor(options) {
146
+ this.model = options.model;
147
+ this.workspacePath = options.workspacePath;
148
+ this.systemPrompt = options.systemPrompt ?? SYSTEM_PROMPT;
149
+ this.maxTurns = options.maxTurns ?? 50;
150
+ this.resolvedSessionId = options.resumeSessionId ?? null;
151
+ }
152
+ async send(message, _transport, sessionId, _manifest, onMessage, mcpServerUrl) {
153
+ if (this.closed) {
154
+ throw new Error("Cannot send to a closed session");
155
+ }
156
+ if (this.inFlight) {
157
+ throw new Error("A request is already in progress for this session");
158
+ }
159
+ this.inFlight = true;
160
+ try {
161
+ // The MCP tool server and its per-session transport mapping are owned
162
+ // by the runtime layer (see AgentRuntime.sendMessageStreaming). The
163
+ // session itself just consumes the URL it was handed.
164
+ const hasMcp = Boolean(mcpServerUrl);
165
+ const allowedTools = hasMcp
166
+ ? Object.keys(uiToolSchemas).map((n) => `mcp__nodetool-ui__${n}`)
167
+ : [];
168
+ const queryHandle = query({
169
+ prompt: message,
170
+ options: {
171
+ model: this.model,
172
+ cwd: this.workspacePath,
173
+ systemPrompt: {
174
+ type: "preset",
175
+ preset: "claude_code",
176
+ append: this.systemPrompt,
177
+ },
178
+ // The NodeTool system prompt, `CLAUDE_DISALLOWED_TOOLS`, and the
179
+ // per-session workspace sandbox are the guardrails here. We
180
+ // intentionally bypass Claude Code's interactive permission
181
+ // prompts because the agent is running headless on the NodeTool
182
+ // server and has no way to surface them. The allowed-tools list
183
+ // below is the actual whitelist of what it can do.
184
+ permissionMode: "bypassPermissions",
185
+ allowDangerouslySkipPermissions: true,
186
+ disallowedTools: CLAUDE_DISALLOWED_TOOLS,
187
+ allowedTools,
188
+ maxTurns: this.maxTurns,
189
+ ...(mcpServerUrl && {
190
+ mcpServers: {
191
+ "nodetool-ui": {
192
+ type: "http",
193
+ url: mcpServerUrl,
194
+ },
195
+ },
196
+ }),
197
+ ...(this.resolvedSessionId && { resume: this.resolvedSessionId }),
198
+ },
199
+ });
200
+ this.activeQuery = queryHandle;
201
+ const outputMessages = [];
202
+ for await (const msg of queryHandle) {
203
+ if (msg.type === "system" &&
204
+ msg.subtype === "init") {
205
+ this.resolvedSessionId = msg
206
+ .session_id;
207
+ }
208
+ const agentMsg = convertSdkMessage(msg, this.resolvedSessionId ?? sessionId);
209
+ if (!agentMsg)
210
+ continue;
211
+ outputMessages.push(agentMsg);
212
+ if (onMessage)
213
+ onMessage(agentMsg);
214
+ }
215
+ return outputMessages;
216
+ }
217
+ catch (error) {
218
+ const errorMsg = {
219
+ type: "result",
220
+ uuid: randomUUID(),
221
+ session_id: this.resolvedSessionId ?? sessionId,
222
+ subtype: "error",
223
+ is_error: true,
224
+ errors: [error instanceof Error ? error.message : String(error)],
225
+ };
226
+ if (onMessage)
227
+ onMessage(errorMsg);
228
+ return [errorMsg];
229
+ }
230
+ finally {
231
+ this.activeQuery = null;
232
+ this.inFlight = false;
233
+ }
234
+ }
235
+ async interrupt() {
236
+ if (this.activeQuery) {
237
+ this.activeQuery.interrupt();
238
+ }
239
+ }
240
+ close() {
241
+ if (this.closed)
242
+ return;
243
+ this.closed = true;
244
+ if (this.activeQuery) {
245
+ this.activeQuery.close();
246
+ this.activeQuery = null;
247
+ }
248
+ }
249
+ }
250
+ // AgentSdkProvider interface lives in `sdk-provider.ts` (re-exported at the
251
+ // top of this file) so the LLM provider can import it without creating a
252
+ // circular dependency back to this module.
253
+ const DEFAULT_CLAUDE_MODELS = [
254
+ {
255
+ id: "claude-sonnet-4-6",
256
+ label: "Claude Sonnet 4.6",
257
+ isDefault: true,
258
+ provider: "claude",
259
+ supportsMaxTurns: true,
260
+ },
261
+ {
262
+ id: "claude-opus-4-6",
263
+ label: "Claude Opus 4.6",
264
+ provider: "claude",
265
+ supportsMaxTurns: true,
266
+ },
267
+ {
268
+ id: "claude-haiku-4-5",
269
+ label: "Claude Haiku 4.5",
270
+ provider: "claude",
271
+ supportsMaxTurns: true,
272
+ },
273
+ ];
274
+ class ClaudeSdkProvider {
275
+ name = "claude";
276
+ async listModels(_userId, _workspacePath) {
277
+ return DEFAULT_CLAUDE_MODELS;
278
+ }
279
+ createSession(options) {
280
+ const systemPrompt = options.systemPrompt ?? SYSTEM_PROMPT;
281
+ return new ClaudeAgentSession({
282
+ ...options,
283
+ systemPrompt,
284
+ maxTurns: options.modelParams?.maxTurns,
285
+ });
286
+ }
287
+ async listSessions(options, _userId) {
288
+ try {
289
+ const sdkSessions = await listSessions({
290
+ dir: options.dir,
291
+ limit: options.limit ?? 50,
292
+ offset: options.offset ?? 0,
293
+ });
294
+ return sdkSessions.map((s) => ({
295
+ sessionId: s.sessionId,
296
+ summary: s.summary,
297
+ lastModified: s.lastModified,
298
+ cwd: s.cwd,
299
+ gitBranch: s.gitBranch,
300
+ customTitle: s.customTitle,
301
+ firstPrompt: s.firstPrompt,
302
+ createdAt: s.createdAt,
303
+ provider: "claude",
304
+ }));
305
+ }
306
+ catch (error) {
307
+ log.error("Failed to list Claude sessions", error instanceof Error ? error : new Error(String(error)));
308
+ return [];
309
+ }
310
+ }
311
+ async getSessionMessages(options, _userId) {
312
+ try {
313
+ const sdkMessages = await getSessionMessages(options.sessionId, { dir: options.dir });
314
+ return sdkMessages
315
+ .filter((m) => m.type === "user" || m.type === "assistant")
316
+ .map((m) => {
317
+ const msg = m.message;
318
+ let textContent = "";
319
+ if (typeof msg.content === "string") {
320
+ textContent = msg.content;
321
+ }
322
+ else if (Array.isArray(msg.content)) {
323
+ textContent = msg.content
324
+ .filter((block) => block.type === "text" && typeof block.text === "string")
325
+ .map((block) => block.text)
326
+ .join("\n");
327
+ }
328
+ return {
329
+ type: m.type,
330
+ uuid: m.uuid,
331
+ session_id: m.session_id,
332
+ text: textContent,
333
+ };
334
+ })
335
+ .filter((m) => m.text.length > 0);
336
+ }
337
+ catch (error) {
338
+ log.error("Failed to get Claude session messages", error instanceof Error ? error : new Error(String(error)));
339
+ return [];
340
+ }
341
+ }
342
+ }
343
+ class CodexSdkProvider {
344
+ name = "codex";
345
+ async listModels(_userId, _workspacePath) {
346
+ return listCodexModels();
347
+ }
348
+ createSession(options) {
349
+ return new CodexQuerySession({
350
+ ...options,
351
+ systemPrompt: options.systemPrompt ?? SYSTEM_PROMPT,
352
+ reasoningEffort: options.modelParams?.reasoningEffort,
353
+ });
354
+ }
355
+ async listSessions(_options, _userId) {
356
+ return [];
357
+ }
358
+ async getSessionMessages(_options, _userId) {
359
+ return [];
360
+ }
361
+ }
362
+ class OpenCodeSdkProvider {
363
+ name = "opencode";
364
+ async listModels(_userId, workspacePath) {
365
+ return listOpenCodeModels(workspacePath);
366
+ }
367
+ createSession(options) {
368
+ return new OpenCodeQuerySession({
369
+ ...options,
370
+ systemPrompt: options.systemPrompt ?? SYSTEM_PROMPT,
371
+ });
372
+ }
373
+ async listSessions(options, _userId) {
374
+ return listOpenCodeSessions(options);
375
+ }
376
+ async getSessionMessages(options, _userId) {
377
+ return getOpenCodeSessionMessages(options);
378
+ }
379
+ }
380
+ class PiSdkProvider {
381
+ name = "pi";
382
+ async listModels(_userId, _workspacePath) {
383
+ return listPiModels();
384
+ }
385
+ createSession(options) {
386
+ return new PiQuerySession({
387
+ ...options,
388
+ systemPrompt: options.systemPrompt ?? SYSTEM_PROMPT,
389
+ });
390
+ }
391
+ async listSessions(options, _userId) {
392
+ return listPiSessions(options);
393
+ }
394
+ async getSessionMessages(options, _userId) {
395
+ return getPiSessionMessages(options);
396
+ }
397
+ }
398
+ const providers = {
399
+ claude: new ClaudeSdkProvider(),
400
+ codex: new CodexSdkProvider(),
401
+ opencode: new OpenCodeSdkProvider(),
402
+ pi: new PiSdkProvider(),
403
+ llm: new LlmAgentSdkProvider(),
404
+ };
405
+ function getProvider(name) {
406
+ return providers[name ?? "claude"] ?? providers.claude;
407
+ }
408
+ /**
409
+ * AgentRuntime — manages all active agent sessions.
410
+ *
411
+ * One instance is shared per process. Each WebSocket connection routes its
412
+ * commands through this runtime; sessions are addressable by their sessionId
413
+ * from any connection (so a user can reconnect mid-stream), but every
414
+ * mutating operation is gated by the calling user's id — sessionIds are
415
+ * predictable (counter-based for the temp id; thread-id for LLM after the
416
+ * first turn) so the runtime must enforce ownership rather than rely on
417
+ * sessionId being a secret.
418
+ */
419
+ class AgentRuntime {
420
+ activeSessions = new Map();
421
+ /** Owning userId for each entry in `activeSessions`. */
422
+ sessionOwners = new Map();
423
+ sessionCounter = 0;
424
+ /**
425
+ * Throw a uniform "not yours" error so callers can't probe session ids.
426
+ * Returns the session if the caller owns it, otherwise throws.
427
+ */
428
+ getOwnedSession(sessionId, userId) {
429
+ const session = this.activeSessions.get(sessionId);
430
+ const owner = this.sessionOwners.get(sessionId);
431
+ if (!session || !owner || owner !== userId) {
432
+ // Same error whether the session doesn't exist or belongs to someone
433
+ // else — don't leak existence to other users.
434
+ throw new Error(`No active agent session with ID: ${sessionId}`);
435
+ }
436
+ return session;
437
+ }
438
+ async createSession(options, userId) {
439
+ if (!userId) {
440
+ throw new Error("createSession requires an authenticated userId — agent socket must be authenticated");
441
+ }
442
+ // The "llm" provider runs in-process with only ui_* tools — no file
443
+ // system access, so a workspace is irrelevant. Every other provider
444
+ // (CLI harness) must have one.
445
+ const requiresWorkspace = options.provider !== "llm";
446
+ if (requiresWorkspace) {
447
+ if (!options.resumeSessionId && !options.workspacePath) {
448
+ throw new Error("workspacePath is required when creating a new agent session");
449
+ }
450
+ if (!options.workspacePath) {
451
+ throw new Error("workspacePath is required");
452
+ }
453
+ }
454
+ const provider = getProvider(options.provider);
455
+ const tempId = `${provider.name}-session-${++this.sessionCounter}`;
456
+ const sessionMode = options.resumeSessionId ? "resuming" : "creating";
457
+ log.info(`${sessionMode} ${provider.name} agent session for user ${userId} with model: ${options.model}${options.workspacePath ? ` (workspace: ${options.workspacePath})` : ""}`);
458
+ const session = provider.createSession({
459
+ model: options.model,
460
+ workspacePath: options.workspacePath ?? "",
461
+ userId,
462
+ resumeSessionId: options.resumeSessionId,
463
+ modelParams: options.modelParams,
464
+ chatProviderId: options.chatProviderId,
465
+ });
466
+ this.activeSessions.set(tempId, session);
467
+ this.sessionOwners.set(tempId, userId);
468
+ log.info(`${provider.name} agent session created: ${tempId}`);
469
+ return tempId;
470
+ }
471
+ /**
472
+ * Send a message and stream replies through the given transport.
473
+ * Returns when the agent turn completes.
474
+ */
475
+ async sendMessageStreaming(sessionId, message, transport, userId) {
476
+ const session = this.getOwnedSession(sessionId, userId);
477
+ log.info(`Sending message to agent session ${sessionId} (streaming)`);
478
+ // Frontend UI tools are proxied through the shared /mcp endpoint using
479
+ // whichever renderer transport is currently active.
480
+ setMcpFrontendTransport(transport);
481
+ const mcpServerUrl = getLocalMcpServerUrl();
482
+ let frontendTools = [];
483
+ try {
484
+ frontendTools = await transport.requestToolManifest(sessionId);
485
+ log.debug(`Frontend tools manifest for session ${sessionId}: ${frontendTools.length} tool(s) [${frontendTools
486
+ .map((t) => t.name)
487
+ .join(", ")}]`);
488
+ const missingFrontendTools = getMissingFrontendTools(frontendTools);
489
+ if (missingFrontendTools.length > 0) {
490
+ throw new Error(`Renderer frontend tool manifest is incomplete for session ${sessionId}. Missing tools: ${missingFrontendTools.join(", ")}`);
491
+ }
492
+ }
493
+ catch (error) {
494
+ log.warn(`Failed to get frontend tools manifest: ${error instanceof Error ? error.message : String(error)}`);
495
+ throw error;
496
+ }
497
+ let messageCount = 0;
498
+ await session.send(message, transport, sessionId, frontendTools, (serialized) => {
499
+ if (serialized.session_id &&
500
+ serialized.session_id !== sessionId &&
501
+ !this.activeSessions.has(serialized.session_id)) {
502
+ // The SDK / LLM session resolved its real id (e.g. Claude session
503
+ // id, our DB thread id). Re-key under that id and stamp ownership
504
+ // so subsequent commands targeted at the real id stay scoped to
505
+ // the same user.
506
+ this.activeSessions.set(serialized.session_id, session);
507
+ this.sessionOwners.set(serialized.session_id, userId);
508
+ }
509
+ messageCount++;
510
+ transport.streamMessage(sessionId, serialized, false);
511
+ }, mcpServerUrl);
512
+ transport.streamMessage(sessionId, {
513
+ type: "system",
514
+ uuid: randomUUID(),
515
+ session_id: sessionId,
516
+ }, true);
517
+ log.info(`Agent session ${sessionId}: streamed ${messageCount} messages`);
518
+ }
519
+ async stopExecution(sessionId, userId) {
520
+ const session = this.getOwnedSession(sessionId, userId);
521
+ await session.interrupt();
522
+ }
523
+ closeSession(sessionId, userId) {
524
+ const session = this.activeSessions.get(sessionId);
525
+ const owner = this.sessionOwners.get(sessionId);
526
+ if (!session || owner !== userId)
527
+ return;
528
+ log.info(`Closing agent session: ${sessionId}`);
529
+ session.close();
530
+ for (const [id, s] of this.activeSessions.entries()) {
531
+ if (s === session) {
532
+ this.activeSessions.delete(id);
533
+ this.sessionOwners.delete(id);
534
+ }
535
+ }
536
+ }
537
+ closeAllSessions() {
538
+ const uniqueSessions = new Set(this.activeSessions.values());
539
+ for (const session of uniqueSessions) {
540
+ log.info("Closing agent session on shutdown");
541
+ session.close();
542
+ }
543
+ this.activeSessions.clear();
544
+ this.sessionOwners.clear();
545
+ closeOpenCodeServer();
546
+ stopMcpToolServer();
547
+ }
548
+ async listModels(options, userId) {
549
+ const provider = getProvider(options.provider);
550
+ return provider.listModels(userId, options.workspacePath);
551
+ }
552
+ async listSessionsForRequest(options, userId) {
553
+ if (options.provider) {
554
+ const provider = getProvider(options.provider);
555
+ return provider.listSessions(options, userId);
556
+ }
557
+ const results = await Promise.all(Object.values(providers).map((p) => p.listSessions(options, userId)));
558
+ return results.flat();
559
+ }
560
+ async getSessionMessagesForRequest(options, userId) {
561
+ for (const provider of Object.values(providers)) {
562
+ const messages = await provider.getSessionMessages(options, userId);
563
+ if (messages.length > 0) {
564
+ return messages;
565
+ }
566
+ }
567
+ return [];
568
+ }
569
+ }
570
+ let runtimeInstance = null;
571
+ export function getAgentRuntime() {
572
+ if (!runtimeInstance) {
573
+ runtimeInstance = new AgentRuntime();
574
+ }
575
+ return runtimeInstance;
576
+ }
577
+ //# sourceMappingURL=agent-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-runtime.js","sourceRoot":"","sources":["../../src/agent/agent-runtime.ts"],"names":[],"mappings":"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"}