whale-code 6.5.4 → 6.5.6

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 (853) hide show
  1. package/README.md +39 -31
  2. package/bin/{swagmanager-mcp.js → whale-code.js} +17 -2
  3. package/dist/cli/app.js +148 -72
  4. package/dist/cli/app.js.map +1 -0
  5. package/dist/cli/chat/AgentSelector.js +105 -10
  6. package/dist/cli/chat/AgentSelector.js.map +1 -0
  7. package/dist/cli/chat/ChatApp.d.ts +31 -0
  8. package/dist/cli/chat/ChatApp.js +539 -286
  9. package/dist/cli/chat/ChatApp.js.map +1 -0
  10. package/dist/cli/chat/ChatInput.js +1088 -770
  11. package/dist/cli/chat/ChatInput.js.map +1 -0
  12. package/dist/cli/chat/MarkdownText.js +39 -14
  13. package/dist/cli/chat/MarkdownText.js.map +1 -0
  14. package/dist/cli/chat/MemoryManager.js +181 -46
  15. package/dist/cli/chat/MemoryManager.js.map +1 -0
  16. package/dist/cli/chat/MessageList.d.ts +2 -3
  17. package/dist/cli/chat/MessageList.js +186 -45
  18. package/dist/cli/chat/MessageList.js.map +1 -0
  19. package/dist/cli/chat/ModelSelector.js +282 -63
  20. package/dist/cli/chat/ModelSelector.js.map +1 -0
  21. package/dist/cli/chat/NodeManager.js +165 -75
  22. package/dist/cli/chat/NodeManager.js.map +1 -0
  23. package/dist/cli/chat/NodeSelector.js +171 -30
  24. package/dist/cli/chat/NodeSelector.js.map +1 -0
  25. package/dist/cli/chat/PlanApproval.js +281 -57
  26. package/dist/cli/chat/PlanApproval.js.map +1 -0
  27. package/dist/cli/chat/RewindViewer.js +559 -144
  28. package/dist/cli/chat/RewindViewer.js.map +1 -0
  29. package/dist/cli/chat/SessionManager.js +137 -30
  30. package/dist/cli/chat/SessionManager.js.map +1 -0
  31. package/dist/cli/chat/SlashMenu.js +293 -164
  32. package/dist/cli/chat/SlashMenu.js.map +1 -0
  33. package/dist/cli/chat/StatusBar.js +172 -9
  34. package/dist/cli/chat/StatusBar.js.map +1 -0
  35. package/dist/cli/chat/StoreSelector.js +147 -18
  36. package/dist/cli/chat/StoreSelector.js.map +1 -0
  37. package/dist/cli/chat/StreamingText.d.ts +1 -5
  38. package/dist/cli/chat/StreamingText.js +22 -7
  39. package/dist/cli/chat/StreamingText.js.map +1 -0
  40. package/dist/cli/chat/SubagentPanel.d.ts +1 -2
  41. package/dist/cli/chat/SubagentPanel.js +612 -72
  42. package/dist/cli/chat/SubagentPanel.js.map +1 -0
  43. package/dist/cli/chat/TeamPanel.d.ts +1 -0
  44. package/dist/cli/chat/TeamPanel.js +230 -30
  45. package/dist/cli/chat/TeamPanel.js.map +1 -0
  46. package/dist/cli/chat/ThemeSelector.js +84 -24
  47. package/dist/cli/chat/ThemeSelector.js.map +1 -0
  48. package/dist/cli/chat/ToolIndicator.js +1476 -371
  49. package/dist/cli/chat/ToolIndicator.js.map +1 -0
  50. package/dist/cli/chat/hooks/useAgentLoop.d.ts +1 -0
  51. package/dist/cli/chat/hooks/useAgentLoop.js +481 -367
  52. package/dist/cli/chat/hooks/useAgentLoop.js.map +1 -0
  53. package/dist/cli/chat/hooks/useSlashCommands.d.ts +3 -14
  54. package/dist/cli/chat/hooks/useSlashCommands.js +744 -572
  55. package/dist/cli/chat/hooks/useSlashCommands.js.map +1 -0
  56. package/dist/cli/commands/config-cmd.js +56 -57
  57. package/dist/cli/commands/config-cmd.js.map +1 -0
  58. package/dist/cli/commands/db.js +184 -169
  59. package/dist/cli/commands/db.js.map +1 -0
  60. package/dist/cli/commands/doctor.js +212 -122
  61. package/dist/cli/commands/doctor.js.map +1 -0
  62. package/dist/cli/commands/init.js +211 -244
  63. package/dist/cli/commands/init.js.map +1 -0
  64. package/dist/cli/commands/mcp.js +127 -122
  65. package/dist/cli/commands/mcp.js.map +1 -0
  66. package/dist/cli/login/LoginApp.js +355 -141
  67. package/dist/cli/login/LoginApp.js.map +1 -0
  68. package/dist/cli/print-mode.js +196 -177
  69. package/dist/cli/print-mode.js.map +1 -0
  70. package/dist/cli/serve-mode.js +615 -530
  71. package/dist/cli/serve-mode.js.map +1 -0
  72. package/dist/cli/services/agent-config.d.ts +29 -0
  73. package/dist/cli/services/agent-config.js +91 -0
  74. package/dist/cli/services/agent-config.js.map +1 -0
  75. package/dist/cli/services/agent-definitions.d.ts +4 -1
  76. package/dist/cli/services/agent-definitions.js +97 -56
  77. package/dist/cli/services/agent-definitions.js.map +1 -0
  78. package/dist/cli/services/agent-events.js +225 -162
  79. package/dist/cli/services/agent-events.js.map +1 -0
  80. package/dist/cli/services/agent-loop.js +978 -669
  81. package/dist/cli/services/agent-loop.js.map +1 -0
  82. package/dist/cli/services/agent-worker-base.d.ts +35 -5
  83. package/dist/cli/services/agent-worker-base.js +337 -153
  84. package/dist/cli/services/agent-worker-base.js.map +1 -0
  85. package/dist/cli/services/api-retry.js +69 -64
  86. package/dist/cli/services/api-retry.js.map +1 -0
  87. package/dist/cli/services/auth-service.d.ts +3 -3
  88. package/dist/cli/services/auth-service.js +209 -132
  89. package/dist/cli/services/auth-service.js.map +1 -0
  90. package/dist/cli/services/background-processes.js +343 -267
  91. package/dist/cli/services/background-processes.js.map +1 -0
  92. package/dist/cli/services/browser-auth.d.ts +2 -2
  93. package/dist/cli/services/browser-auth.js +159 -118
  94. package/dist/cli/services/browser-auth.js.map +1 -0
  95. package/dist/cli/services/claude-md-loader.js +40 -36
  96. package/dist/cli/services/claude-md-loader.js.map +1 -0
  97. package/dist/cli/services/config-store.d.ts +9 -4
  98. package/dist/cli/services/config-store.js +164 -117
  99. package/dist/cli/services/config-store.js.map +1 -0
  100. package/dist/cli/services/debug-log.d.ts +1 -1
  101. package/dist/cli/services/debug-log.js +34 -35
  102. package/dist/cli/services/debug-log.js.map +1 -0
  103. package/dist/cli/services/env-detect.d.ts +7 -0
  104. package/dist/cli/services/env-detect.js +9 -0
  105. package/dist/cli/services/env-detect.js.map +1 -0
  106. package/dist/cli/services/error-logger.d.ts +2 -3
  107. package/dist/cli/services/error-logger.js +189 -180
  108. package/dist/cli/services/error-logger.js.map +1 -0
  109. package/dist/cli/services/file-history.d.ts +1 -1
  110. package/dist/cli/services/file-history.js +50 -54
  111. package/dist/cli/services/file-history.js.map +1 -0
  112. package/dist/cli/services/format-server-response.js +332 -372
  113. package/dist/cli/services/format-server-response.js.map +1 -0
  114. package/dist/cli/services/git-context.js +61 -45
  115. package/dist/cli/services/git-context.js.map +1 -0
  116. package/dist/cli/services/hooks.d.ts +2 -2
  117. package/dist/cli/services/hooks.js +195 -180
  118. package/dist/cli/services/hooks.js.map +1 -0
  119. package/dist/cli/services/ink-incremental.d.ts +19 -0
  120. package/dist/cli/services/ink-incremental.js +59 -0
  121. package/dist/cli/services/ink-incremental.js.map +1 -0
  122. package/dist/cli/services/ink-resize-fix.js +54 -44
  123. package/dist/cli/services/ink-resize-fix.js.map +1 -0
  124. package/dist/cli/services/ink-sync-output.d.ts +12 -0
  125. package/dist/cli/services/ink-sync-output.js +16 -0
  126. package/dist/cli/services/ink-sync-output.js.map +1 -0
  127. package/dist/cli/services/interactive-tools.js +268 -212
  128. package/dist/cli/services/interactive-tools.js.map +1 -0
  129. package/dist/cli/services/keybinding-manager.d.ts +11 -1
  130. package/dist/cli/services/keybinding-manager.js +126 -63
  131. package/dist/cli/services/keybinding-manager.js.map +1 -0
  132. package/dist/cli/services/local-tools.d.ts +1 -1
  133. package/dist/cli/services/local-tools.js +939 -656
  134. package/dist/cli/services/local-tools.js.map +1 -0
  135. package/dist/cli/services/lsp-manager.js +757 -594
  136. package/dist/cli/services/lsp-manager.js.map +1 -0
  137. package/dist/cli/services/mcp-client.d.ts +1 -1
  138. package/dist/cli/services/mcp-client.js +173 -134
  139. package/dist/cli/services/mcp-client.js.map +1 -0
  140. package/dist/cli/services/memory-manager.js +53 -40
  141. package/dist/cli/services/memory-manager.js.map +1 -0
  142. package/dist/cli/services/model-manager.js +55 -40
  143. package/dist/cli/services/model-manager.js.map +1 -0
  144. package/dist/cli/services/model-router.js +115 -85
  145. package/dist/cli/services/model-router.js.map +1 -0
  146. package/dist/cli/services/paths.d.ts +30 -0
  147. package/dist/cli/services/paths.js +81 -0
  148. package/dist/cli/services/paths.js.map +1 -0
  149. package/dist/cli/services/permission-modes.js +32 -25
  150. package/dist/cli/services/permission-modes.js.map +1 -0
  151. package/dist/cli/services/rewind.js +182 -168
  152. package/dist/cli/services/rewind.js.map +1 -0
  153. package/dist/cli/services/ripgrep.js +115 -115
  154. package/dist/cli/services/ripgrep.js.map +1 -0
  155. package/dist/cli/services/sandbox.d.ts +1 -1
  156. package/dist/cli/services/sandbox.js +58 -37
  157. package/dist/cli/services/sandbox.js.map +1 -0
  158. package/dist/cli/services/server-tools.js +738 -565
  159. package/dist/cli/services/server-tools.js.map +1 -0
  160. package/dist/cli/services/session-persistence.js +69 -74
  161. package/dist/cli/services/session-persistence.js.map +1 -0
  162. package/dist/cli/services/subagent-worker.js +42 -27
  163. package/dist/cli/services/subagent-worker.js.map +1 -0
  164. package/dist/cli/services/subagent.d.ts +2 -0
  165. package/dist/cli/services/subagent.js +606 -430
  166. package/dist/cli/services/subagent.js.map +1 -0
  167. package/dist/cli/services/system-prompt.js +86 -78
  168. package/dist/cli/services/system-prompt.js.map +1 -0
  169. package/dist/cli/services/task-decomposer.d.ts +1 -1
  170. package/dist/cli/services/task-decomposer.js +172 -139
  171. package/dist/cli/services/task-decomposer.js.map +1 -0
  172. package/dist/cli/services/team-lead.d.ts +2 -2
  173. package/dist/cli/services/team-lead.js +727 -529
  174. package/dist/cli/services/team-lead.js.map +1 -0
  175. package/dist/cli/services/team-state.js +319 -319
  176. package/dist/cli/services/team-state.js.map +1 -0
  177. package/dist/cli/services/teammate.d.ts +8 -2
  178. package/dist/cli/services/teammate.js +862 -560
  179. package/dist/cli/services/teammate.js.map +1 -0
  180. package/dist/cli/services/telemetry.d.ts +6 -1
  181. package/dist/cli/services/telemetry.js +180 -157
  182. package/dist/cli/services/telemetry.js.map +1 -0
  183. package/dist/cli/services/tools/agent-tools.d.ts +3 -3
  184. package/dist/cli/services/tools/agent-tools.js +480 -322
  185. package/dist/cli/services/tools/agent-tools.js.map +1 -0
  186. package/dist/cli/services/tools/file-ops.js +563 -450
  187. package/dist/cli/services/tools/file-ops.js.map +1 -0
  188. package/dist/cli/services/tools/search-tools.js +231 -162
  189. package/dist/cli/services/tools/search-tools.js.map +1 -0
  190. package/dist/cli/services/tools/shell-exec.js +197 -151
  191. package/dist/cli/services/tools/shell-exec.js.map +1 -0
  192. package/dist/cli/services/tools/task-manager.js +206 -173
  193. package/dist/cli/services/tools/task-manager.js.map +1 -0
  194. package/dist/cli/services/tools/web-tools.js +388 -341
  195. package/dist/cli/services/tools/web-tools.js.map +1 -0
  196. package/dist/cli/setup/SetupApp.d.ts +2 -2
  197. package/dist/cli/setup/SetupApp.js +608 -160
  198. package/dist/cli/setup/SetupApp.js.map +1 -0
  199. package/dist/cli/shared/ErrorBoundary.d.ts +22 -0
  200. package/dist/cli/shared/ErrorBoundary.js +73 -0
  201. package/dist/cli/shared/ErrorBoundary.js.map +1 -0
  202. package/dist/cli/shared/MatrixIntro.js +66 -69
  203. package/dist/cli/shared/MatrixIntro.js.map +1 -0
  204. package/dist/cli/shared/SpinnerSlot.d.ts +14 -0
  205. package/dist/cli/shared/SpinnerSlot.js +63 -0
  206. package/dist/cli/shared/SpinnerSlot.js.map +1 -0
  207. package/dist/cli/shared/Theme.d.ts +1 -1
  208. package/dist/cli/shared/Theme.js +136 -92
  209. package/dist/cli/shared/Theme.js.map +1 -0
  210. package/dist/cli/shared/WhaleBanner.js +99 -11
  211. package/dist/cli/shared/WhaleBanner.js.map +1 -0
  212. package/dist/cli/shared/markdown.d.ts +3 -1
  213. package/dist/cli/shared/markdown.js +736 -674
  214. package/dist/cli/shared/markdown.js.map +1 -0
  215. package/dist/cli/shared/marked-terminal.d.js +2 -0
  216. package/dist/cli/shared/marked-terminal.d.js.map +1 -0
  217. package/dist/cli/shared/theme-manager.js +99 -90
  218. package/dist/cli/shared/theme-manager.js.map +1 -0
  219. package/dist/cli/shared/theme-presets.js +256 -254
  220. package/dist/cli/shared/theme-presets.js.map +1 -0
  221. package/dist/cli/status/StatusApp.js +235 -86
  222. package/dist/cli/status/StatusApp.js.map +1 -0
  223. package/dist/cli/stores/StoreApp.js +275 -65
  224. package/dist/cli/stores/StoreApp.js.map +1 -0
  225. package/dist/index.d.ts +2 -2
  226. package/dist/index.js +509 -396
  227. package/dist/index.js.map +1 -0
  228. package/dist/local-agent/connection.d.ts +2 -2
  229. package/dist/local-agent/connection.js +352 -293
  230. package/dist/local-agent/connection.js.map +1 -0
  231. package/dist/local-agent/discovery.js +259 -122
  232. package/dist/local-agent/discovery.js.map +1 -0
  233. package/dist/local-agent/executor.js +216 -193
  234. package/dist/local-agent/executor.js.map +1 -0
  235. package/dist/local-agent/index.d.ts +2 -2
  236. package/dist/local-agent/index.js +156 -156
  237. package/dist/local-agent/index.js.map +1 -0
  238. package/dist/node/adapters/base.js +18 -8
  239. package/dist/node/adapters/base.js.map +1 -0
  240. package/dist/node/adapters/discord.js +286 -275
  241. package/dist/node/adapters/discord.js.map +1 -0
  242. package/dist/node/adapters/email.js +189 -202
  243. package/dist/node/adapters/email.js.map +1 -0
  244. package/dist/node/adapters/imessage.js +145 -142
  245. package/dist/node/adapters/imessage.js.map +1 -0
  246. package/dist/node/adapters/slack.js +237 -236
  247. package/dist/node/adapters/slack.js.map +1 -0
  248. package/dist/node/adapters/sms.js +149 -151
  249. package/dist/node/adapters/sms.js.map +1 -0
  250. package/dist/node/adapters/telegram.js +88 -92
  251. package/dist/node/adapters/telegram.js.map +1 -0
  252. package/dist/node/adapters/webchat.js +160 -136
  253. package/dist/node/adapters/webchat.js.map +1 -0
  254. package/dist/node/adapters/whatsapp.js +212 -215
  255. package/dist/node/adapters/whatsapp.js.map +1 -0
  256. package/dist/node/cli.js +884 -653
  257. package/dist/node/cli.js.map +1 -0
  258. package/dist/node/config.js +20 -18
  259. package/dist/node/config.js.map +1 -0
  260. package/dist/node/gateway-client.js +191 -181
  261. package/dist/node/gateway-client.js.map +1 -0
  262. package/dist/node/portal/clipboard.js +161 -130
  263. package/dist/node/portal/clipboard.js.map +1 -0
  264. package/dist/node/portal/discovery.js +51 -45
  265. package/dist/node/portal/discovery.js.map +1 -0
  266. package/dist/node/portal/forward.js +64 -58
  267. package/dist/node/portal/forward.js.map +1 -0
  268. package/dist/node/portal/index.js +246 -221
  269. package/dist/node/portal/index.js.map +1 -0
  270. package/dist/node/portal/multiplexer.js +192 -182
  271. package/dist/node/portal/multiplexer.js.map +1 -0
  272. package/dist/node/portal/permissions.js +102 -70
  273. package/dist/node/portal/permissions.js.map +1 -0
  274. package/dist/node/portal/protocol.js +153 -116
  275. package/dist/node/portal/protocol.js.map +1 -0
  276. package/dist/node/portal/screen.js +80 -69
  277. package/dist/node/portal/screen.js.map +1 -0
  278. package/dist/node/portal/session.js +124 -117
  279. package/dist/node/portal/session.js.map +1 -0
  280. package/dist/node/portal/shell.js +140 -113
  281. package/dist/node/portal/shell.js.map +1 -0
  282. package/dist/node/portal/stream.js +77 -75
  283. package/dist/node/portal/stream.js.map +1 -0
  284. package/dist/node/portal/transfer.js +190 -167
  285. package/dist/node/portal/transfer.js.map +1 -0
  286. package/dist/node/portal/ui.js +124 -99
  287. package/dist/node/portal/ui.js.map +1 -0
  288. package/dist/node/remote-desktop/compile-helper.js +50 -45
  289. package/dist/node/remote-desktop/compile-helper.js.map +1 -0
  290. package/dist/node/remote-desktop/index.js +215 -187
  291. package/dist/node/remote-desktop/index.js.map +1 -0
  292. package/dist/node/remote-desktop/protocol.js +45 -29
  293. package/dist/node/remote-desktop/protocol.js.map +1 -0
  294. package/dist/node/runtime.js +493 -410
  295. package/dist/node/runtime.js.map +1 -0
  296. package/dist/server/handlers/__test-utils__/test-db.js +39 -89
  297. package/dist/server/handlers/__test-utils__/test-db.js.map +1 -0
  298. package/dist/server/handlers/analytics.js +467 -261
  299. package/dist/server/handlers/analytics.js.map +1 -0
  300. package/dist/server/handlers/api-docs.d.ts +6 -0
  301. package/dist/server/handlers/api-docs.js +1613 -0
  302. package/dist/server/handlers/api-docs.js.map +1 -0
  303. package/dist/server/handlers/api-keys.js +295 -232
  304. package/dist/server/handlers/api-keys.js.map +1 -0
  305. package/dist/server/handlers/billing.js +330 -239
  306. package/dist/server/handlers/billing.js.map +1 -0
  307. package/dist/server/handlers/browser.js +468 -395
  308. package/dist/server/handlers/browser.js.map +1 -0
  309. package/dist/server/handlers/catalog.js +1377 -978
  310. package/dist/server/handlers/catalog.js.map +1 -0
  311. package/dist/server/handlers/clickhouse.js +157 -109
  312. package/dist/server/handlers/clickhouse.js.map +1 -0
  313. package/dist/server/handlers/comms.d.ts +0 -53
  314. package/dist/server/handlers/comms.js +1443 -970
  315. package/dist/server/handlers/comms.js.map +1 -0
  316. package/dist/server/handlers/creations.js +461 -394
  317. package/dist/server/handlers/creations.js.map +1 -0
  318. package/dist/server/handlers/crm.js +1082 -791
  319. package/dist/server/handlers/crm.js.map +1 -0
  320. package/dist/server/handlers/discovery.js +251 -232
  321. package/dist/server/handlers/discovery.js.map +1 -0
  322. package/dist/server/handlers/embeddings.js +241 -164
  323. package/dist/server/handlers/embeddings.js.map +1 -0
  324. package/dist/server/handlers/enrichment.js +887 -718
  325. package/dist/server/handlers/enrichment.js.map +1 -0
  326. package/dist/server/handlers/image-gen.js +467 -376
  327. package/dist/server/handlers/image-gen.js.map +1 -0
  328. package/dist/server/handlers/inventory.js +797 -424
  329. package/dist/server/handlers/inventory.js.map +1 -0
  330. package/dist/server/handlers/kali.js +272 -230
  331. package/dist/server/handlers/kali.js.map +1 -0
  332. package/dist/server/handlers/llm-providers.js +803 -580
  333. package/dist/server/handlers/llm-providers.js.map +1 -0
  334. package/dist/server/handlers/local-agent.js +133 -105
  335. package/dist/server/handlers/local-agent.js.map +1 -0
  336. package/dist/server/handlers/media.js +1179 -857
  337. package/dist/server/handlers/media.js.map +1 -0
  338. package/dist/server/handlers/meta-ads.js +2669 -2093
  339. package/dist/server/handlers/meta-ads.js.map +1 -0
  340. package/dist/server/handlers/nodes.js +1321 -913
  341. package/dist/server/handlers/nodes.js.map +1 -0
  342. package/dist/server/handlers/operations.js +183 -157
  343. package/dist/server/handlers/operations.js.map +1 -0
  344. package/dist/server/handlers/platform.js +346 -210
  345. package/dist/server/handlers/platform.js.map +1 -0
  346. package/dist/server/handlers/remove-bg.js +118 -86
  347. package/dist/server/handlers/remove-bg.js.map +1 -0
  348. package/dist/server/handlers/storefront.js +586 -446
  349. package/dist/server/handlers/storefront.js.map +1 -0
  350. package/dist/server/handlers/supply-chain.js +546 -326
  351. package/dist/server/handlers/supply-chain.js.map +1 -0
  352. package/dist/server/handlers/transcription.js +106 -97
  353. package/dist/server/handlers/transcription.js.map +1 -0
  354. package/dist/server/handlers/video-gen.js +593 -424
  355. package/dist/server/handlers/video-gen.js.map +1 -0
  356. package/dist/server/handlers/voice.js +1458 -1017
  357. package/dist/server/handlers/voice.js.map +1 -0
  358. package/dist/server/handlers/workflow-steps.js +2837 -2116
  359. package/dist/server/handlers/workflow-steps.js.map +1 -0
  360. package/dist/server/handlers/workflows.js +1630 -933
  361. package/dist/server/handlers/workflows.js.map +1 -0
  362. package/dist/server/index.js +3166 -2390
  363. package/dist/server/index.js.map +1 -0
  364. package/dist/server/lib/batch-client.js +471 -409
  365. package/dist/server/lib/batch-client.js.map +1 -0
  366. package/dist/server/lib/clickhouse-buffer.js +118 -104
  367. package/dist/server/lib/clickhouse-buffer.js.map +1 -0
  368. package/dist/server/lib/clickhouse-client.js +107 -107
  369. package/dist/server/lib/clickhouse-client.js.map +1 -0
  370. package/dist/server/lib/coa-renderer.js +1786 -356
  371. package/dist/server/lib/coa-renderer.js.map +1 -0
  372. package/dist/server/lib/code-worker-pool.js +227 -177
  373. package/dist/server/lib/code-worker-pool.js.map +1 -0
  374. package/dist/server/lib/code-worker.js +174 -164
  375. package/dist/server/lib/code-worker.js.map +1 -0
  376. package/dist/server/lib/compaction-service.d.ts +2 -12
  377. package/dist/server/lib/compaction-service.js +74 -184
  378. package/dist/server/lib/compaction-service.js.map +1 -0
  379. package/dist/server/lib/logger.js +36 -24
  380. package/dist/server/lib/logger.js.map +1 -0
  381. package/dist/server/lib/otel.js +101 -80
  382. package/dist/server/lib/otel.js.map +1 -0
  383. package/dist/server/lib/pdf-renderer.d.ts +1 -1
  384. package/dist/server/lib/pdf-renderer.js +954 -776
  385. package/dist/server/lib/pdf-renderer.js.map +1 -0
  386. package/dist/server/lib/prompt-sanitizer.js +188 -108
  387. package/dist/server/lib/prompt-sanitizer.js.map +1 -0
  388. package/dist/server/lib/provider-capabilities.js +136 -138
  389. package/dist/server/lib/provider-capabilities.js.map +1 -0
  390. package/dist/server/lib/provider-failover.js +190 -168
  391. package/dist/server/lib/provider-failover.js.map +1 -0
  392. package/dist/server/lib/rate-limiter.js +186 -117
  393. package/dist/server/lib/rate-limiter.js.map +1 -0
  394. package/dist/server/lib/react-pdf-layout.js +551 -382
  395. package/dist/server/lib/react-pdf-layout.js.map +1 -0
  396. package/dist/server/lib/server-agent-loop.d.ts +9 -0
  397. package/dist/server/lib/server-agent-loop.js +906 -624
  398. package/dist/server/lib/server-agent-loop.js.map +1 -0
  399. package/dist/server/lib/server-subagent.d.ts +2 -0
  400. package/dist/server/lib/server-subagent.js +260 -162
  401. package/dist/server/lib/server-subagent.js.map +1 -0
  402. package/dist/server/lib/session-checkpoint.js +105 -96
  403. package/dist/server/lib/session-checkpoint.js.map +1 -0
  404. package/dist/server/lib/ssrf-guard.js +193 -184
  405. package/dist/server/lib/ssrf-guard.js.map +1 -0
  406. package/dist/server/lib/supabase-client.js +94 -82
  407. package/dist/server/lib/supabase-client.js.map +1 -0
  408. package/dist/server/lib/template-resolver.js +154 -176
  409. package/dist/server/lib/template-resolver.js.map +1 -0
  410. package/dist/server/lib/utils.js +242 -133
  411. package/dist/server/lib/utils.js.map +1 -0
  412. package/dist/server/local-agent-gateway.d.ts +2 -2
  413. package/dist/server/local-agent-gateway.js +785 -627
  414. package/dist/server/local-agent-gateway.js.map +1 -0
  415. package/dist/server/providers/anthropic.js +254 -176
  416. package/dist/server/providers/anthropic.js.map +1 -0
  417. package/dist/server/providers/bedrock.js +221 -162
  418. package/dist/server/providers/bedrock.js.map +1 -0
  419. package/dist/server/providers/gemini.js +548 -418
  420. package/dist/server/providers/gemini.js.map +1 -0
  421. package/dist/server/providers/openai.js +571 -437
  422. package/dist/server/providers/openai.js.map +1 -0
  423. package/dist/server/providers/registry.js +23 -18
  424. package/dist/server/providers/registry.js.map +1 -0
  425. package/dist/server/providers/shared.js +123 -95
  426. package/dist/server/providers/shared.js.map +1 -0
  427. package/dist/server/providers/types.js +1 -11
  428. package/dist/server/providers/types.js.map +1 -0
  429. package/dist/server/proxy-handlers.js +209 -165
  430. package/dist/server/proxy-handlers.js.map +1 -0
  431. package/dist/server/tool-router.d.ts +13 -0
  432. package/dist/server/tool-router.js +960 -598
  433. package/dist/server/tool-router.js.map +1 -0
  434. package/dist/server/validation.js +248 -188
  435. package/dist/server/validation.js.map +1 -0
  436. package/dist/server/worker.js +202 -133
  437. package/dist/server/worker.js.map +1 -0
  438. package/dist/setup.d.ts +2 -2
  439. package/dist/setup.js +151 -147
  440. package/dist/setup.js.map +1 -0
  441. package/dist/shared/agent-core.d.ts +191 -24
  442. package/dist/shared/agent-core.js +971 -462
  443. package/dist/shared/agent-core.js.map +1 -0
  444. package/dist/shared/anthropic-types.js +1 -6
  445. package/dist/shared/anthropic-types.js.map +1 -0
  446. package/dist/shared/api-client.d.ts +17 -9
  447. package/dist/shared/api-client.js +419 -327
  448. package/dist/shared/api-client.js.map +1 -0
  449. package/dist/shared/compaction.d.ts +36 -0
  450. package/dist/shared/compaction.js +138 -0
  451. package/dist/shared/compaction.js.map +1 -0
  452. package/dist/shared/constants.js +67 -64
  453. package/dist/shared/constants.js.map +1 -0
  454. package/dist/shared/sse-parser.js +221 -219
  455. package/dist/shared/sse-parser.js.map +1 -0
  456. package/dist/shared/tool-dispatch.d.ts +4 -2
  457. package/dist/shared/tool-dispatch.js +226 -165
  458. package/dist/shared/tool-dispatch.js.map +1 -0
  459. package/dist/shared/types.js +1 -6
  460. package/dist/shared/types.js.map +1 -0
  461. package/dist/types/cli-highlight.d.js +2 -0
  462. package/dist/types/cli-highlight.d.js.map +1 -0
  463. package/dist/types/diff.d.js +2 -0
  464. package/dist/types/diff.d.js.map +1 -0
  465. package/dist/types/pdf-parse.d.js +2 -0
  466. package/dist/types/pdf-parse.d.js.map +1 -0
  467. package/dist/updater.d.ts +1 -1
  468. package/dist/updater.js +118 -92
  469. package/dist/updater.js.map +1 -0
  470. package/dist/webchat/widget.js +227 -380
  471. package/dist/webchat/widget.js.map +1 -0
  472. package/package.json +22 -10
  473. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  474. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  475. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  476. package/vendor/ink/build/apply-styles.js +175 -0
  477. package/vendor/ink/build/build-layout.js +77 -0
  478. package/vendor/ink/build/calculate-wrapped-text.js +53 -0
  479. package/vendor/ink/build/colorize.d.ts +3 -0
  480. package/vendor/ink/build/colorize.js +48 -0
  481. package/vendor/ink/build/colorize.js.map +1 -0
  482. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  483. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  484. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  485. package/vendor/ink/build/components/App.d.ts +18 -0
  486. package/vendor/ink/build/components/App.js +351 -0
  487. package/vendor/ink/build/components/App.js.map +1 -0
  488. package/vendor/ink/build/components/AppContext.d.ts +15 -0
  489. package/vendor/ink/build/components/AppContext.js +11 -0
  490. package/vendor/ink/build/components/AppContext.js.map +1 -0
  491. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  492. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  493. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  494. package/vendor/ink/build/components/Box.d.ts +117 -0
  495. package/vendor/ink/build/components/Box.js +34 -0
  496. package/vendor/ink/build/components/Box.js.map +1 -0
  497. package/vendor/ink/build/components/Color.js +62 -0
  498. package/vendor/ink/build/components/Cursor.d.ts +83 -0
  499. package/vendor/ink/build/components/Cursor.js +53 -0
  500. package/vendor/ink/build/components/Cursor.js.map +1 -0
  501. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  502. package/vendor/ink/build/components/CursorContext.js +8 -0
  503. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  504. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  505. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  506. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  507. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  508. package/vendor/ink/build/components/ErrorOverview.js +84 -0
  509. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  510. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  511. package/vendor/ink/build/components/FocusContext.js +17 -0
  512. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  513. package/vendor/ink/build/components/Newline.d.ts +13 -0
  514. package/vendor/ink/build/components/Newline.js +8 -0
  515. package/vendor/ink/build/components/Newline.js.map +1 -0
  516. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  517. package/vendor/ink/build/components/Spacer.js +11 -0
  518. package/vendor/ink/build/components/Spacer.js.map +1 -0
  519. package/vendor/ink/build/components/Static.d.ts +24 -0
  520. package/vendor/ink/build/components/Static.js +28 -0
  521. package/vendor/ink/build/components/Static.js.map +1 -0
  522. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  523. package/vendor/ink/build/components/StderrContext.js +13 -0
  524. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  525. package/vendor/ink/build/components/StdinContext.d.ts +22 -0
  526. package/vendor/ink/build/components/StdinContext.js +19 -0
  527. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  528. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  529. package/vendor/ink/build/components/StdoutContext.js +13 -0
  530. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  531. package/vendor/ink/build/components/Text.d.ts +55 -0
  532. package/vendor/ink/build/components/Text.js +50 -0
  533. package/vendor/ink/build/components/Text.js.map +1 -0
  534. package/vendor/ink/build/components/Transform.d.ts +16 -0
  535. package/vendor/ink/build/components/Transform.js +15 -0
  536. package/vendor/ink/build/components/Transform.js.map +1 -0
  537. package/vendor/ink/build/cursor-helpers.d.ts +38 -0
  538. package/vendor/ink/build/cursor-helpers.js +56 -0
  539. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  540. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  541. package/vendor/ink/build/devtools-window-polyfill.js +65 -0
  542. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  543. package/vendor/ink/build/devtools.d.ts +1 -0
  544. package/vendor/ink/build/devtools.js +11 -0
  545. package/vendor/ink/build/devtools.js.map +1 -0
  546. package/vendor/ink/build/dom.d.ts +56 -0
  547. package/vendor/ink/build/dom.js +124 -0
  548. package/vendor/ink/build/dom.js.map +1 -0
  549. package/vendor/ink/build/experimental/apply-style.js +140 -0
  550. package/vendor/ink/build/experimental/dom.js +123 -0
  551. package/vendor/ink/build/experimental/output.js +91 -0
  552. package/vendor/ink/build/experimental/reconciler.js +141 -0
  553. package/vendor/ink/build/experimental/renderer.js +81 -0
  554. package/vendor/ink/build/get-max-width.d.ts +3 -0
  555. package/vendor/ink/build/get-max-width.js +10 -0
  556. package/vendor/ink/build/get-max-width.js.map +1 -0
  557. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  558. package/vendor/ink/build/hooks/use-app.js +8 -0
  559. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  560. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  561. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  562. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  563. package/vendor/ink/build/hooks/use-focus-manager.d.ts +28 -0
  564. package/vendor/ink/build/hooks/use-focus-manager.js +17 -0
  565. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  566. package/vendor/ink/build/hooks/use-focus.d.ts +29 -0
  567. package/vendor/ink/build/hooks/use-focus.js +42 -0
  568. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  569. package/vendor/ink/build/hooks/use-input.d.ts +131 -0
  570. package/vendor/ink/build/hooks/use-input.js +124 -0
  571. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  572. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +5 -0
  573. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +11 -0
  574. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  575. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  576. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  577. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  578. package/vendor/ink/build/hooks/use-stdin.d.ts +5 -0
  579. package/vendor/ink/build/hooks/use-stdin.js +8 -0
  580. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  581. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  582. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  583. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  584. package/vendor/ink/build/hooks/useInput.js +38 -0
  585. package/vendor/ink/build/index.d.ts +34 -0
  586. package/vendor/ink/build/index.js +20 -0
  587. package/vendor/ink/build/index.js.map +1 -0
  588. package/vendor/ink/build/ink.d.ts +90 -0
  589. package/vendor/ink/build/ink.js +654 -0
  590. package/vendor/ink/build/ink.js.map +1 -0
  591. package/vendor/ink/build/input-parser.d.ts +7 -0
  592. package/vendor/ink/build/input-parser.js +154 -0
  593. package/vendor/ink/build/input-parser.js.map +1 -0
  594. package/vendor/ink/build/instance.js +205 -0
  595. package/vendor/ink/build/instances.d.ts +3 -0
  596. package/vendor/ink/build/instances.js +8 -0
  597. package/vendor/ink/build/instances.js.map +1 -0
  598. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  599. package/vendor/ink/build/kitty-keyboard.js +32 -0
  600. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  601. package/vendor/ink/build/layout.d.ts +7 -0
  602. package/vendor/ink/build/layout.js +33 -0
  603. package/vendor/ink/build/layout.js.map +1 -0
  604. package/vendor/ink/build/log-update.d.ts +19 -0
  605. package/vendor/ink/build/log-update.js +243 -0
  606. package/vendor/ink/build/log-update.js.map +1 -0
  607. package/vendor/ink/build/measure-element.d.ts +16 -0
  608. package/vendor/ink/build/measure-element.js +9 -0
  609. package/vendor/ink/build/measure-element.js.map +1 -0
  610. package/vendor/ink/build/measure-text.d.ts +6 -0
  611. package/vendor/ink/build/measure-text.js +21 -0
  612. package/vendor/ink/build/measure-text.js.map +1 -0
  613. package/vendor/ink/build/options.d.ts +52 -0
  614. package/vendor/ink/build/options.js +2 -0
  615. package/vendor/ink/build/options.js.map +1 -0
  616. package/vendor/ink/build/output.d.ts +35 -0
  617. package/vendor/ink/build/output.js +183 -0
  618. package/vendor/ink/build/output.js.map +1 -0
  619. package/vendor/ink/build/parse-keypress.d.ts +22 -0
  620. package/vendor/ink/build/parse-keypress.js +493 -0
  621. package/vendor/ink/build/parse-keypress.js.map +1 -0
  622. package/vendor/ink/build/reconciler.d.ts +4 -0
  623. package/vendor/ink/build/reconciler.js +274 -0
  624. package/vendor/ink/build/reconciler.js.map +1 -0
  625. package/vendor/ink/build/render-background.d.ts +4 -0
  626. package/vendor/ink/build/render-background.js +25 -0
  627. package/vendor/ink/build/render-background.js.map +1 -0
  628. package/vendor/ink/build/render-border.d.ts +4 -0
  629. package/vendor/ink/build/render-border.js +73 -0
  630. package/vendor/ink/build/render-border.js.map +1 -0
  631. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  632. package/vendor/ink/build/render-node-to-output.js +147 -0
  633. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  634. package/vendor/ink/build/render-to-string.d.ts +38 -0
  635. package/vendor/ink/build/render-to-string.js +115 -0
  636. package/vendor/ink/build/render-to-string.js.map +1 -0
  637. package/vendor/ink/build/render.d.ts +121 -0
  638. package/vendor/ink/build/render.js +55 -0
  639. package/vendor/ink/build/render.js.map +1 -0
  640. package/vendor/ink/build/renderer.d.ts +8 -0
  641. package/vendor/ink/build/renderer.js +55 -0
  642. package/vendor/ink/build/renderer.js.map +1 -0
  643. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  644. package/vendor/ink/build/sanitize-ansi.js +27 -0
  645. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  646. package/vendor/ink/build/screen-reader-update.d.ts +13 -0
  647. package/vendor/ink/build/screen-reader-update.js +38 -0
  648. package/vendor/ink/build/screen-reader-update.js.map +1 -0
  649. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  650. package/vendor/ink/build/squash-text-nodes.js +36 -0
  651. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  652. package/vendor/ink/build/styles.d.ts +240 -0
  653. package/vendor/ink/build/styles.js +232 -0
  654. package/vendor/ink/build/styles.js.map +1 -0
  655. package/vendor/ink/build/utils.d.ts +2 -0
  656. package/vendor/ink/build/utils.js +4 -0
  657. package/vendor/ink/build/utils.js.map +1 -0
  658. package/vendor/ink/build/wrap-text.d.ts +3 -0
  659. package/vendor/ink/build/wrap-text.js +31 -0
  660. package/vendor/ink/build/wrap-text.js.map +1 -0
  661. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  662. package/vendor/ink/build/write-synchronized.js +7 -0
  663. package/vendor/ink/build/write-synchronized.js.map +1 -0
  664. package/vendor/ink/license +10 -0
  665. package/vendor/ink/node_modules/@types/node/LICENSE +21 -0
  666. package/vendor/ink/node_modules/@types/node/README.md +15 -0
  667. package/vendor/ink/node_modules/@types/node/assert/strict.d.ts +105 -0
  668. package/vendor/ink/node_modules/@types/node/assert.d.ts +955 -0
  669. package/vendor/ink/node_modules/@types/node/async_hooks.d.ts +623 -0
  670. package/vendor/ink/node_modules/@types/node/buffer.buffer.d.ts +466 -0
  671. package/vendor/ink/node_modules/@types/node/buffer.d.ts +1810 -0
  672. package/vendor/ink/node_modules/@types/node/child_process.d.ts +1428 -0
  673. package/vendor/ink/node_modules/@types/node/cluster.d.ts +486 -0
  674. package/vendor/ink/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
  675. package/vendor/ink/node_modules/@types/node/console.d.ts +151 -0
  676. package/vendor/ink/node_modules/@types/node/constants.d.ts +20 -0
  677. package/vendor/ink/node_modules/@types/node/crypto.d.ts +4065 -0
  678. package/vendor/ink/node_modules/@types/node/dgram.d.ts +564 -0
  679. package/vendor/ink/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
  680. package/vendor/ink/node_modules/@types/node/dns/promises.d.ts +503 -0
  681. package/vendor/ink/node_modules/@types/node/dns.d.ts +922 -0
  682. package/vendor/ink/node_modules/@types/node/domain.d.ts +166 -0
  683. package/vendor/ink/node_modules/@types/node/events.d.ts +1054 -0
  684. package/vendor/ink/node_modules/@types/node/fs/promises.d.ts +1329 -0
  685. package/vendor/ink/node_modules/@types/node/fs.d.ts +4676 -0
  686. package/vendor/ink/node_modules/@types/node/globals.d.ts +150 -0
  687. package/vendor/ink/node_modules/@types/node/globals.typedarray.d.ts +101 -0
  688. package/vendor/ink/node_modules/@types/node/http.d.ts +2167 -0
  689. package/vendor/ink/node_modules/@types/node/http2.d.ts +2480 -0
  690. package/vendor/ink/node_modules/@types/node/https.d.ts +405 -0
  691. package/vendor/ink/node_modules/@types/node/index.d.ts +115 -0
  692. package/vendor/ink/node_modules/@types/node/inspector/promises.d.ts +41 -0
  693. package/vendor/ink/node_modules/@types/node/inspector.d.ts +224 -0
  694. package/vendor/ink/node_modules/@types/node/inspector.generated.d.ts +4226 -0
  695. package/vendor/ink/node_modules/@types/node/module.d.ts +819 -0
  696. package/vendor/ink/node_modules/@types/node/net.d.ts +933 -0
  697. package/vendor/ink/node_modules/@types/node/os.d.ts +507 -0
  698. package/vendor/ink/node_modules/@types/node/package.json +155 -0
  699. package/vendor/ink/node_modules/@types/node/path/posix.d.ts +8 -0
  700. package/vendor/ink/node_modules/@types/node/path/win32.d.ts +8 -0
  701. package/vendor/ink/node_modules/@types/node/path.d.ts +187 -0
  702. package/vendor/ink/node_modules/@types/node/perf_hooks.d.ts +643 -0
  703. package/vendor/ink/node_modules/@types/node/process.d.ts +2156 -0
  704. package/vendor/ink/node_modules/@types/node/punycode.d.ts +117 -0
  705. package/vendor/ink/node_modules/@types/node/querystring.d.ts +152 -0
  706. package/vendor/ink/node_modules/@types/node/quic.d.ts +910 -0
  707. package/vendor/ink/node_modules/@types/node/readline/promises.d.ts +161 -0
  708. package/vendor/ink/node_modules/@types/node/readline.d.ts +541 -0
  709. package/vendor/ink/node_modules/@types/node/repl.d.ts +415 -0
  710. package/vendor/ink/node_modules/@types/node/sea.d.ts +162 -0
  711. package/vendor/ink/node_modules/@types/node/sqlite.d.ts +955 -0
  712. package/vendor/ink/node_modules/@types/node/stream/consumers.d.ts +38 -0
  713. package/vendor/ink/node_modules/@types/node/stream/promises.d.ts +211 -0
  714. package/vendor/ink/node_modules/@types/node/stream/web.d.ts +296 -0
  715. package/vendor/ink/node_modules/@types/node/stream.d.ts +1760 -0
  716. package/vendor/ink/node_modules/@types/node/string_decoder.d.ts +67 -0
  717. package/vendor/ink/node_modules/@types/node/test/reporters.d.ts +96 -0
  718. package/vendor/ink/node_modules/@types/node/test.d.ts +2240 -0
  719. package/vendor/ink/node_modules/@types/node/timers/promises.d.ts +108 -0
  720. package/vendor/ink/node_modules/@types/node/timers.d.ts +159 -0
  721. package/vendor/ink/node_modules/@types/node/tls.d.ts +1198 -0
  722. package/vendor/ink/node_modules/@types/node/trace_events.d.ts +197 -0
  723. package/vendor/ink/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +462 -0
  724. package/vendor/ink/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
  725. package/vendor/ink/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +36 -0
  726. package/vendor/ink/node_modules/@types/node/ts5.6/index.d.ts +117 -0
  727. package/vendor/ink/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
  728. package/vendor/ink/node_modules/@types/node/ts5.7/index.d.ts +117 -0
  729. package/vendor/ink/node_modules/@types/node/tty.d.ts +250 -0
  730. package/vendor/ink/node_modules/@types/node/url.d.ts +519 -0
  731. package/vendor/ink/node_modules/@types/node/util/types.d.ts +558 -0
  732. package/vendor/ink/node_modules/@types/node/util.d.ts +1662 -0
  733. package/vendor/ink/node_modules/@types/node/v8.d.ts +983 -0
  734. package/vendor/ink/node_modules/@types/node/vm.d.ts +1208 -0
  735. package/vendor/ink/node_modules/@types/node/wasi.d.ts +202 -0
  736. package/vendor/ink/node_modules/@types/node/web-globals/abortcontroller.d.ts +59 -0
  737. package/vendor/ink/node_modules/@types/node/web-globals/blob.d.ts +23 -0
  738. package/vendor/ink/node_modules/@types/node/web-globals/console.d.ts +9 -0
  739. package/vendor/ink/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
  740. package/vendor/ink/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  741. package/vendor/ink/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
  742. package/vendor/ink/node_modules/@types/node/web-globals/events.d.ts +106 -0
  743. package/vendor/ink/node_modules/@types/node/web-globals/fetch.d.ts +69 -0
  744. package/vendor/ink/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
  745. package/vendor/ink/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
  746. package/vendor/ink/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
  747. package/vendor/ink/node_modules/@types/node/web-globals/performance.d.ts +45 -0
  748. package/vendor/ink/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  749. package/vendor/ink/node_modules/@types/node/web-globals/streams.d.ts +115 -0
  750. package/vendor/ink/node_modules/@types/node/web-globals/timers.d.ts +44 -0
  751. package/vendor/ink/node_modules/@types/node/web-globals/url.d.ts +24 -0
  752. package/vendor/ink/node_modules/@types/node/worker_threads.d.ts +717 -0
  753. package/vendor/ink/node_modules/@types/node/zlib.d.ts +618 -0
  754. package/vendor/ink/node_modules/node-pty/LICENSE +69 -0
  755. package/vendor/ink/node_modules/node-pty/README.md +164 -0
  756. package/vendor/ink/node_modules/node-pty/binding.gyp +150 -0
  757. package/vendor/ink/node_modules/node-pty/lib/conpty_console_list_agent.js +25 -0
  758. package/vendor/ink/node_modules/node-pty/lib/eventEmitter2.js +47 -0
  759. package/vendor/ink/node_modules/node-pty/lib/index.js +52 -0
  760. package/vendor/ink/node_modules/node-pty/lib/interfaces.js +7 -0
  761. package/vendor/ink/node_modules/node-pty/lib/shared/conout.js +11 -0
  762. package/vendor/ink/node_modules/node-pty/lib/terminal.js +190 -0
  763. package/vendor/ink/node_modules/node-pty/lib/types.js +7 -0
  764. package/vendor/ink/node_modules/node-pty/lib/unixTerminal.js +349 -0
  765. package/vendor/ink/node_modules/node-pty/lib/utils.js +39 -0
  766. package/vendor/ink/node_modules/node-pty/lib/windowsConoutConnection.js +125 -0
  767. package/vendor/ink/node_modules/node-pty/lib/windowsPtyAgent.js +287 -0
  768. package/vendor/ink/node_modules/node-pty/lib/windowsTerminal.js +201 -0
  769. package/vendor/ink/node_modules/node-pty/lib/worker/conoutSocketWorker.js +22 -0
  770. package/vendor/ink/node_modules/node-pty/package.json +65 -0
  771. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
  772. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
  773. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
  774. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
  775. package/vendor/ink/node_modules/node-pty/prebuilds/linux-arm64/pty.node +0 -0
  776. package/vendor/ink/node_modules/node-pty/prebuilds/linux-x64/pty.node +0 -0
  777. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  778. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  779. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  780. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.pdb +0 -0
  781. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  782. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  783. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  784. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  785. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  786. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.pdb +0 -0
  787. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  788. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  789. package/vendor/ink/node_modules/node-pty/scripts/post-install.js +76 -0
  790. package/vendor/ink/node_modules/node-pty/scripts/prebuild.js +34 -0
  791. package/vendor/ink/node_modules/node-pty/src/unix/pty.cc +875 -0
  792. package/vendor/ink/node_modules/node-pty/src/unix/spawn-helper.cc +23 -0
  793. package/vendor/ink/node_modules/node-pty/src/win/conpty.cc +582 -0
  794. package/vendor/ink/node_modules/node-pty/src/win/conpty.h +41 -0
  795. package/vendor/ink/node_modules/node-pty/src/win/conpty_console_list.cc +44 -0
  796. package/vendor/ink/node_modules/node-pty/src/win/path_util.cc +95 -0
  797. package/vendor/ink/node_modules/node-pty/src/win/path_util.h +26 -0
  798. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
  799. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
  800. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
  801. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
  802. package/vendor/ink/node_modules/node-pty/typings/node-pty.d.ts +215 -0
  803. package/vendor/ink/node_modules/undici-types/LICENSE +21 -0
  804. package/vendor/ink/node_modules/undici-types/README.md +6 -0
  805. package/vendor/ink/node_modules/undici-types/agent.d.ts +32 -0
  806. package/vendor/ink/node_modules/undici-types/api.d.ts +43 -0
  807. package/vendor/ink/node_modules/undici-types/balanced-pool.d.ts +30 -0
  808. package/vendor/ink/node_modules/undici-types/cache-interceptor.d.ts +173 -0
  809. package/vendor/ink/node_modules/undici-types/cache.d.ts +36 -0
  810. package/vendor/ink/node_modules/undici-types/client-stats.d.ts +15 -0
  811. package/vendor/ink/node_modules/undici-types/client.d.ts +108 -0
  812. package/vendor/ink/node_modules/undici-types/connector.d.ts +34 -0
  813. package/vendor/ink/node_modules/undici-types/content-type.d.ts +21 -0
  814. package/vendor/ink/node_modules/undici-types/cookies.d.ts +30 -0
  815. package/vendor/ink/node_modules/undici-types/diagnostics-channel.d.ts +74 -0
  816. package/vendor/ink/node_modules/undici-types/dispatcher.d.ts +276 -0
  817. package/vendor/ink/node_modules/undici-types/env-http-proxy-agent.d.ts +22 -0
  818. package/vendor/ink/node_modules/undici-types/errors.d.ts +161 -0
  819. package/vendor/ink/node_modules/undici-types/eventsource.d.ts +66 -0
  820. package/vendor/ink/node_modules/undici-types/fetch.d.ts +211 -0
  821. package/vendor/ink/node_modules/undici-types/formdata.d.ts +108 -0
  822. package/vendor/ink/node_modules/undici-types/global-dispatcher.d.ts +9 -0
  823. package/vendor/ink/node_modules/undici-types/global-origin.d.ts +7 -0
  824. package/vendor/ink/node_modules/undici-types/h2c-client.d.ts +73 -0
  825. package/vendor/ink/node_modules/undici-types/handlers.d.ts +15 -0
  826. package/vendor/ink/node_modules/undici-types/header.d.ts +160 -0
  827. package/vendor/ink/node_modules/undici-types/index.d.ts +88 -0
  828. package/vendor/ink/node_modules/undici-types/interceptors.d.ts +73 -0
  829. package/vendor/ink/node_modules/undici-types/mock-agent.d.ts +68 -0
  830. package/vendor/ink/node_modules/undici-types/mock-call-history.d.ts +111 -0
  831. package/vendor/ink/node_modules/undici-types/mock-client.d.ts +27 -0
  832. package/vendor/ink/node_modules/undici-types/mock-errors.d.ts +12 -0
  833. package/vendor/ink/node_modules/undici-types/mock-interceptor.d.ts +94 -0
  834. package/vendor/ink/node_modules/undici-types/mock-pool.d.ts +27 -0
  835. package/vendor/ink/node_modules/undici-types/package.json +55 -0
  836. package/vendor/ink/node_modules/undici-types/patch.d.ts +29 -0
  837. package/vendor/ink/node_modules/undici-types/pool-stats.d.ts +19 -0
  838. package/vendor/ink/node_modules/undici-types/pool.d.ts +41 -0
  839. package/vendor/ink/node_modules/undici-types/proxy-agent.d.ts +29 -0
  840. package/vendor/ink/node_modules/undici-types/readable.d.ts +68 -0
  841. package/vendor/ink/node_modules/undici-types/retry-agent.d.ts +8 -0
  842. package/vendor/ink/node_modules/undici-types/retry-handler.d.ts +125 -0
  843. package/vendor/ink/node_modules/undici-types/round-robin-pool.d.ts +41 -0
  844. package/vendor/ink/node_modules/undici-types/snapshot-agent.d.ts +109 -0
  845. package/vendor/ink/node_modules/undici-types/util.d.ts +18 -0
  846. package/vendor/ink/node_modules/undici-types/utility.d.ts +7 -0
  847. package/vendor/ink/node_modules/undici-types/webidl.d.ts +341 -0
  848. package/vendor/ink/node_modules/undici-types/websocket.d.ts +186 -0
  849. package/vendor/ink/package.json +201 -0
  850. package/vendor/ink/readme.md +2636 -0
  851. package/bin/swag-agent.js +0 -9
  852. package/dist/server/lib/pg-rate-limiter.d.ts +0 -21
  853. package/dist/server/lib/pg-rate-limiter.js +0 -86
package/dist/node/cli.js CHANGED
@@ -7,695 +7,919 @@ import { loadConfig as loadCliConfig } from "../cli/services/config-store.js";
7
7
  const args = process.argv.slice(2);
8
8
  const command = args[0];
9
9
  const subcommand = args[1];
10
- // Initialize error logging — uses ~/.swagmanager/config.json for Supabase credentials
11
- initErrorLogger({ serviceName: "whale-node" });
10
+
11
+ // Initialize error logging — uses ~/.whaletools/session.json for Supabase credentials
12
+ initErrorLogger({
13
+ serviceName: "whale-node"
14
+ });
12
15
  const cliCfg = loadCliConfig();
13
16
  if (cliCfg.user_id || cliCfg.email || cliCfg.store_id) {
14
- setErrorLoggerUser(cliCfg.user_id, cliCfg.email, cliCfg.store_id);
17
+ setErrorLoggerUser(cliCfg.user_id, cliCfg.email, cliCfg.store_id);
15
18
  }
19
+
16
20
  // Global error handlers — capture crashes to error_events
17
- process.on("uncaughtException", (err) => {
18
- captureError({ error: err, severity: "fatal", tags: { source: "whale-node", handler: "uncaughtException" } });
21
+ process.on("uncaughtException", err => {
22
+ captureError({
23
+ error: err,
24
+ severity: "fatal",
25
+ tags: {
26
+ source: "whale-node",
27
+ handler: "uncaughtException"
28
+ }
29
+ });
19
30
  });
20
- process.on("unhandledRejection", (reason) => {
21
- const err = reason instanceof Error ? reason : new Error(String(reason));
22
- captureError({ error: err, severity: "error", tags: { source: "whale-node", handler: "unhandledRejection" } });
31
+ process.on("unhandledRejection", reason => {
32
+ const err = reason instanceof Error ? reason : new Error(String(reason));
33
+ captureError({
34
+ error: err,
35
+ severity: "error",
36
+ tags: {
37
+ source: "whale-node",
38
+ handler: "unhandledRejection"
39
+ }
40
+ });
23
41
  });
24
42
  async function main() {
25
- switch (command) {
26
- case "node":
27
- await handleNodeCommand(subcommand, args.slice(2));
28
- break;
29
- case "remote-desktop":
30
- await handleRemoteDesktopCommand(subcommand, args.slice(2));
31
- break;
32
- case "channel":
33
- await handleChannelCommand(subcommand, args.slice(2));
34
- break;
35
- case "portal":
36
- case "p":
37
- await handlePortalCommand(subcommand, args.slice(2));
38
- break;
39
- case "status":
40
- await handleStatus();
41
- break;
42
- case "version":
43
- console.log("WhaleNode CLI v1.1.0");
44
- break;
45
- case "help":
46
- default:
47
- printHelp();
48
- }
43
+ switch (command) {
44
+ case "node":
45
+ await handleNodeCommand(subcommand, args.slice(2));
46
+ break;
47
+ case "remote-desktop":
48
+ await handleRemoteDesktopCommand(subcommand, args.slice(2));
49
+ break;
50
+ case "channel":
51
+ await handleChannelCommand(subcommand, args.slice(2));
52
+ break;
53
+ case "portal":
54
+ case "p":
55
+ await handlePortalCommand(subcommand, args.slice(2));
56
+ break;
57
+ case "status":
58
+ await handleStatus();
59
+ break;
60
+ case "version":
61
+ console.log("WhaleNode CLI v1.1.0");
62
+ break;
63
+ case "help":
64
+ default:
65
+ printHelp();
66
+ }
49
67
  }
50
68
  async function handleNodeCommand(sub, args) {
51
- switch (sub) {
52
- case "register": {
53
- const { values } = parseArgs({
54
- args,
55
- options: {
56
- name: { type: "string" },
57
- store: { type: "string" },
58
- server: { type: "string", default: "https://whale-agent.fly.dev" },
59
- token: { type: "string" },
60
- },
61
- });
62
- if (!values.name || !values.store || !values.token) {
63
- console.error("Usage: whale node register --name 'My Mac' --store STORE_ID --token JWT_TOKEN");
64
- process.exit(1);
65
- }
66
- console.log(`Registering node "${values.name}"...`);
67
- const res = await fetch(`${values.server}/nodes/register`, {
68
- method: "POST",
69
- headers: {
70
- "Content-Type": "application/json",
71
- Authorization: `Bearer ${values.token}`,
72
- },
73
- body: JSON.stringify({
74
- name: values.name,
75
- store_id: values.store,
76
- }),
77
- });
78
- const data = await res.json();
79
- if (!data.success) {
80
- console.error(`Registration failed: ${data.error}`);
81
- process.exit(1);
69
+ switch (sub) {
70
+ case "register":
71
+ {
72
+ const {
73
+ values
74
+ } = parseArgs({
75
+ args,
76
+ options: {
77
+ name: {
78
+ type: "string"
79
+ },
80
+ store: {
81
+ type: "string"
82
+ },
83
+ server: {
84
+ type: "string",
85
+ default: "https://whale-agent.fly.dev"
86
+ },
87
+ token: {
88
+ type: "string"
82
89
  }
83
- const config = {
84
- node_id: data.node.id,
85
- api_key: data.api_key,
86
- store_id: values.store,
87
- server_url: values.server,
88
- channels: [],
89
- };
90
- saveConfig(config);
91
- console.log(`\nNode registered successfully!`);
92
- console.log(` Node ID: ${data.node.id}`);
93
- console.log(` API Key: ${data.api_key}`);
94
- console.log(` Config: ${getConfigPath()}`);
95
- console.log(`\nSave your API key -- it cannot be retrieved later.`);
96
- console.log(`\nNext: whale channel add imessage|telegram`);
97
- break;
90
+ }
91
+ });
92
+ if (!values.name || !values.store || !values.token) {
93
+ console.error("Usage: whale node register --name 'My Mac' --store STORE_ID --token JWT_TOKEN");
94
+ process.exit(1);
98
95
  }
99
- case "start": {
100
- const config = requireConfig();
101
- // Inject API keys from config into env so decomposer/reviewer can find them
102
- if (config.anthropic_api_key && !process.env.ANTHROPIC_API_KEY) {
103
- process.env.ANTHROPIC_API_KEY = config.anthropic_api_key;
104
- }
105
- const runtime = new NodeRuntime(config);
106
- await runtime.start();
107
- // Keep process alive
108
- await new Promise(() => { });
109
- break;
96
+ console.log(`Registering node "${values.name}"...`);
97
+ const res = await fetch(`${values.server}/nodes/register`, {
98
+ method: "POST",
99
+ headers: {
100
+ "Content-Type": "application/json",
101
+ Authorization: `Bearer ${values.token}`
102
+ },
103
+ body: JSON.stringify({
104
+ name: values.name,
105
+ store_id: values.store
106
+ })
107
+ });
108
+ const data = await res.json();
109
+ if (!data.success) {
110
+ console.error(`Registration failed: ${data.error}`);
111
+ process.exit(1);
110
112
  }
111
- case "status": {
112
- await handleStatus();
113
- break;
113
+ const config = {
114
+ node_id: data.node.id,
115
+ api_key: data.api_key,
116
+ store_id: values.store,
117
+ server_url: values.server,
118
+ channels: []
119
+ };
120
+ saveConfig(config);
121
+ console.log(`\nNode registered successfully!`);
122
+ console.log(` Node ID: ${data.node.id}`);
123
+ console.log(` API Key: ${data.api_key}`);
124
+ console.log(` Config: ${getConfigPath()}`);
125
+ console.log(`\nSave your API key -- it cannot be retrieved later.`);
126
+ console.log(`\nNext: whale channel add imessage|telegram`);
127
+ break;
128
+ }
129
+ case "start":
130
+ {
131
+ const config = requireConfig();
132
+ // Inject API keys from config into env so decomposer/reviewer can find them
133
+ if (config.anthropic_api_key && !process.env.ANTHROPIC_API_KEY) {
134
+ process.env.ANTHROPIC_API_KEY = config.anthropic_api_key;
114
135
  }
115
- default:
116
- console.log("Usage: whale node [register|start|status]");
117
- }
136
+ const runtime = new NodeRuntime(config);
137
+ await runtime.start();
138
+ // Keep process alive
139
+ await new Promise(() => {});
140
+ break;
141
+ }
142
+ case "status":
143
+ {
144
+ await handleStatus();
145
+ break;
146
+ }
147
+ default:
148
+ console.log("Usage: whale node [register|start|status]");
149
+ }
118
150
  }
119
151
  async function handleChannelCommand(sub, args) {
120
- switch (sub) {
121
- case "add": {
122
- const channelType = args[0];
123
- const validTypes = ["imessage", "telegram", "discord", "slack", "whatsapp", "sms", "email"];
124
- if (!channelType || !validTypes.includes(channelType)) {
125
- console.error(`Usage: whale channel add [${validTypes.join("|")}]`);
126
- process.exit(1);
152
+ switch (sub) {
153
+ case "add":
154
+ {
155
+ const channelType = args[0];
156
+ const validTypes = ["imessage", "telegram", "discord", "slack", "whatsapp", "sms", "email"];
157
+ if (!channelType || !validTypes.includes(channelType)) {
158
+ console.error(`Usage: whale channel add [${validTypes.join("|")}]`);
159
+ process.exit(1);
160
+ }
161
+ const config = requireConfig();
162
+ const {
163
+ values
164
+ } = parseArgs({
165
+ args: args.slice(1),
166
+ options: {
167
+ name: {
168
+ type: "string"
169
+ },
170
+ token: {
171
+ type: "string"
172
+ },
173
+ // Bot token (Telegram, Discord, Slack bot)
174
+ "app-token": {
175
+ type: "string"
176
+ },
177
+ // Slack app-level token
178
+ groups: {
179
+ type: "string"
180
+ },
181
+ // iMessage group IDs (comma-separated)
182
+ channels: {
183
+ type: "string"
184
+ },
185
+ // Discord/Slack channel IDs (comma-separated)
186
+ guilds: {
187
+ type: "string"
188
+ },
189
+ // Discord guild IDs (comma-separated)
190
+ mention: {
191
+ type: "string",
192
+ default: ""
193
+ },
194
+ // Require @mention
195
+ // WhatsApp Cloud API
196
+ "phone-number-id": {
197
+ type: "string"
198
+ },
199
+ // WhatsApp phone number ID
200
+ "access-token": {
201
+ type: "string"
202
+ },
203
+ // WhatsApp access token
204
+ "verify-token": {
205
+ type: "string"
206
+ },
207
+ // WhatsApp webhook verify token
208
+ "allowed-numbers": {
209
+ type: "string"
210
+ },
211
+ // Comma-separated allowed phone numbers
212
+ // Twilio SMS
213
+ "account-sid": {
214
+ type: "string"
215
+ },
216
+ // Twilio account SID
217
+ "auth-token": {
218
+ type: "string"
219
+ },
220
+ // Twilio auth token
221
+ "from-number": {
222
+ type: "string"
223
+ },
224
+ // Twilio sender phone number
225
+ // Resend Email
226
+ "api-key": {
227
+ type: "string"
228
+ },
229
+ // Resend API key
230
+ "from-address": {
231
+ type: "string"
232
+ },
233
+ // Sender email address
234
+ "webhook-secret": {
235
+ type: "string"
236
+ },
237
+ // Resend webhook signing secret
238
+ // Shared
239
+ "webhook-port": {
240
+ type: "string"
241
+ } // Webhook server port
242
+ }
243
+ });
244
+ const channelName = values.name || `${channelType}-${Date.now()}`;
245
+ let channelConfig = {};
246
+ switch (channelType) {
247
+ case "imessage":
248
+ channelConfig = {
249
+ watch_groups: values.groups ? values.groups.split(",").map(Number) : [],
250
+ mention_required: values.mention || null,
251
+ max_message_length: 4000
252
+ };
253
+ break;
254
+ case "telegram":
255
+ if (!values.token) {
256
+ console.error("Telegram requires --token BOT_TOKEN");
257
+ process.exit(1);
127
258
  }
128
- const config = requireConfig();
129
- const { values } = parseArgs({
130
- args: args.slice(1),
131
- options: {
132
- name: { type: "string" },
133
- token: { type: "string" }, // Bot token (Telegram, Discord, Slack bot)
134
- "app-token": { type: "string" }, // Slack app-level token
135
- groups: { type: "string" }, // iMessage group IDs (comma-separated)
136
- channels: { type: "string" }, // Discord/Slack channel IDs (comma-separated)
137
- guilds: { type: "string" }, // Discord guild IDs (comma-separated)
138
- mention: { type: "string", default: "" }, // Require @mention
139
- // WhatsApp Cloud API
140
- "phone-number-id": { type: "string" }, // WhatsApp phone number ID
141
- "access-token": { type: "string" }, // WhatsApp access token
142
- "verify-token": { type: "string" }, // WhatsApp webhook verify token
143
- "allowed-numbers": { type: "string" }, // Comma-separated allowed phone numbers
144
- // Twilio SMS
145
- "account-sid": { type: "string" }, // Twilio account SID
146
- "auth-token": { type: "string" }, // Twilio auth token
147
- "from-number": { type: "string" }, // Twilio sender phone number
148
- // Resend Email
149
- "api-key": { type: "string" }, // Resend API key
150
- "from-address": { type: "string" }, // Sender email address
151
- "webhook-secret": { type: "string" }, // Resend webhook signing secret
152
- // Shared
153
- "webhook-port": { type: "string" }, // Webhook server port
154
- },
155
- });
156
- const channelName = values.name || `${channelType}-${Date.now()}`;
157
- let channelConfig = {};
158
- switch (channelType) {
159
- case "imessage":
160
- channelConfig = {
161
- watch_groups: values.groups ? values.groups.split(",").map(Number) : [],
162
- mention_required: values.mention || null,
163
- max_message_length: 4000,
164
- };
165
- break;
166
- case "telegram":
167
- if (!values.token) {
168
- console.error("Telegram requires --token BOT_TOKEN");
169
- process.exit(1);
170
- }
171
- channelConfig = {
172
- bot_token: values.token,
173
- allowed_chats: [],
174
- };
175
- break;
176
- case "discord":
177
- if (!values.token) {
178
- console.error("Discord requires --token BOT_TOKEN");
179
- process.exit(1);
180
- }
181
- channelConfig = {
182
- bot_token: values.token,
183
- allowed_channels: values.channels ? values.channels.split(",") : [],
184
- allowed_guilds: values.guilds ? values.guilds.split(",") : [],
185
- mention_required: values.mention !== "" ? true : false,
186
- };
187
- break;
188
- case "slack":
189
- if (!values.token || !values["app-token"]) {
190
- console.error("Slack requires --token BOT_TOKEN --app-token APP_TOKEN");
191
- process.exit(1);
192
- }
193
- channelConfig = {
194
- bot_token: values.token,
195
- app_token: values["app-token"],
196
- allowed_channels: values.channels ? values.channels.split(",") : [],
197
- mention_required: values.mention !== "" ? true : false,
198
- };
199
- break;
200
- case "whatsapp":
201
- if (!values["phone-number-id"] || !values["access-token"] || !values["verify-token"]) {
202
- console.error("WhatsApp requires --phone-number-id ID --access-token TOKEN --verify-token SECRET");
203
- process.exit(1);
204
- }
205
- channelConfig = {
206
- phone_number_id: values["phone-number-id"],
207
- access_token: values["access-token"],
208
- verify_token: values["verify-token"],
209
- allowed_numbers: values["allowed-numbers"] ? values["allowed-numbers"].split(",") : [],
210
- ...(values["webhook-port"] ? { webhook_port: Number(values["webhook-port"]) } : {}),
211
- };
212
- break;
213
- case "sms":
214
- if (!values["account-sid"] || !values["auth-token"] || !values["from-number"]) {
215
- console.error("SMS requires --account-sid SID --auth-token TOKEN --from-number +1234567890");
216
- process.exit(1);
217
- }
218
- channelConfig = {
219
- account_sid: values["account-sid"],
220
- auth_token: values["auth-token"],
221
- from_number: values["from-number"],
222
- ...(values["webhook-port"] ? { webhook_port: Number(values["webhook-port"]) } : {}),
223
- };
224
- break;
225
- case "email":
226
- if (!values["api-key"] || !values["from-address"]) {
227
- console.error("Email requires --api-key KEY --from-address sender@example.com");
228
- process.exit(1);
229
- }
230
- channelConfig = {
231
- api_key: values["api-key"],
232
- from_address: values["from-address"],
233
- ...(values["webhook-secret"] ? { webhook_secret: values["webhook-secret"] } : {}),
234
- ...(values["webhook-port"] ? { webhook_port: Number(values["webhook-port"]) } : {}),
235
- };
236
- break;
237
- default:
238
- console.error(`Unknown channel type: ${channelType}`);
239
- process.exit(1);
259
+ channelConfig = {
260
+ bot_token: values.token,
261
+ allowed_chats: []
262
+ };
263
+ break;
264
+ case "discord":
265
+ if (!values.token) {
266
+ console.error("Discord requires --token BOT_TOKEN");
267
+ process.exit(1);
240
268
  }
241
- // Register channel with server
242
- console.log(`Adding ${channelType} channel "${channelName}"...`);
243
- const res = await fetch(`${config.server_url}/channels`, {
244
- method: "POST",
245
- headers: {
246
- "Content-Type": "application/json",
247
- Authorization: `Bearer ${config.api_key}`,
248
- },
249
- body: JSON.stringify({
250
- store_id: config.store_id,
251
- node_id: config.node_id,
252
- type: channelType,
253
- name: channelName,
254
- config: channelConfig,
255
- }),
256
- });
257
- const data = await res.json();
258
- if (!data.success) {
259
- console.error(`Failed to add channel: ${data.error}`);
260
- process.exit(1);
269
+ channelConfig = {
270
+ bot_token: values.token,
271
+ allowed_channels: values.channels ? values.channels.split(",") : [],
272
+ allowed_guilds: values.guilds ? values.guilds.split(",") : [],
273
+ mention_required: values.mention !== "" ? true : false
274
+ };
275
+ break;
276
+ case "slack":
277
+ if (!values.token || !values["app-token"]) {
278
+ console.error("Slack requires --token BOT_TOKEN --app-token APP_TOKEN");
279
+ process.exit(1);
261
280
  }
262
- // Save to local config
263
- config.channels.push({
264
- id: data.channel.id,
265
- type: channelType,
266
- name: channelName,
267
- config: channelConfig,
268
- });
269
- saveConfig(config);
270
- console.log(`Channel added!`);
271
- console.log(` ID: ${data.channel.id}`);
272
- console.log(` Type: ${channelType}`);
273
- console.log(` Name: ${channelName}`);
281
+ channelConfig = {
282
+ bot_token: values.token,
283
+ app_token: values["app-token"],
284
+ allowed_channels: values.channels ? values.channels.split(",") : [],
285
+ mention_required: values.mention !== "" ? true : false
286
+ };
274
287
  break;
275
- }
276
- case "list": {
277
- const config = requireConfig();
278
- if (!config.channels.length) {
279
- console.log("No channels configured. Run: whale channel add [imessage|telegram|discord|slack|whatsapp|sms|email]");
280
- return;
288
+ case "whatsapp":
289
+ if (!values["phone-number-id"] || !values["access-token"] || !values["verify-token"]) {
290
+ console.error("WhatsApp requires --phone-number-id ID --access-token TOKEN --verify-token SECRET");
291
+ process.exit(1);
292
+ }
293
+ channelConfig = {
294
+ phone_number_id: values["phone-number-id"],
295
+ access_token: values["access-token"],
296
+ verify_token: values["verify-token"],
297
+ allowed_numbers: values["allowed-numbers"] ? values["allowed-numbers"].split(",") : [],
298
+ ...(values["webhook-port"] ? {
299
+ webhook_port: Number(values["webhook-port"])
300
+ } : {})
301
+ };
302
+ break;
303
+ case "sms":
304
+ if (!values["account-sid"] || !values["auth-token"] || !values["from-number"]) {
305
+ console.error("SMS requires --account-sid SID --auth-token TOKEN --from-number +1234567890");
306
+ process.exit(1);
281
307
  }
282
- console.log("Configured channels:");
283
- for (const ch of config.channels) {
284
- console.log(` ${ch.type.padEnd(10)} ${ch.name.padEnd(20)} ${ch.id}`);
308
+ channelConfig = {
309
+ account_sid: values["account-sid"],
310
+ auth_token: values["auth-token"],
311
+ from_number: values["from-number"],
312
+ ...(values["webhook-port"] ? {
313
+ webhook_port: Number(values["webhook-port"])
314
+ } : {})
315
+ };
316
+ break;
317
+ case "email":
318
+ if (!values["api-key"] || !values["from-address"]) {
319
+ console.error("Email requires --api-key KEY --from-address sender@example.com");
320
+ process.exit(1);
285
321
  }
322
+ channelConfig = {
323
+ api_key: values["api-key"],
324
+ from_address: values["from-address"],
325
+ ...(values["webhook-secret"] ? {
326
+ webhook_secret: values["webhook-secret"]
327
+ } : {}),
328
+ ...(values["webhook-port"] ? {
329
+ webhook_port: Number(values["webhook-port"])
330
+ } : {})
331
+ };
286
332
  break;
333
+ default:
334
+ console.error(`Unknown channel type: ${channelType}`);
335
+ process.exit(1);
287
336
  }
288
- default:
289
- console.log("Usage: whale channel [add|list]");
290
- }
291
- }
292
- async function handleRemoteDesktopCommand(sub, _args) {
293
- const config = requireConfig();
294
- switch (sub) {
295
- case "enable": {
296
- config.remote_desktop = { ...config.remote_desktop, enabled: true };
297
- saveConfig(config);
298
- console.log("Remote desktop enabled. Takes effect on next `whale node start`.");
299
- break;
337
+
338
+ // Register channel with server
339
+ console.log(`Adding ${channelType} channel "${channelName}"...`);
340
+ const res = await fetch(`${config.server_url}/channels`, {
341
+ method: "POST",
342
+ headers: {
343
+ "Content-Type": "application/json",
344
+ Authorization: `Bearer ${config.api_key}`
345
+ },
346
+ body: JSON.stringify({
347
+ store_id: config.store_id,
348
+ node_id: config.node_id,
349
+ type: channelType,
350
+ name: channelName,
351
+ config: channelConfig
352
+ })
353
+ });
354
+ const data = await res.json();
355
+ if (!data.success) {
356
+ console.error(`Failed to add channel: ${data.error}`);
357
+ process.exit(1);
300
358
  }
301
- case "disable": {
302
- config.remote_desktop = { ...config.remote_desktop, enabled: false };
303
- saveConfig(config);
304
- console.log("Remote desktop disabled. Takes effect on next `whale node start`.");
305
- break;
359
+
360
+ // Save to local config
361
+ config.channels.push({
362
+ id: data.channel.id,
363
+ type: channelType,
364
+ name: channelName,
365
+ config: channelConfig
366
+ });
367
+ saveConfig(config);
368
+ console.log(`Channel added!`);
369
+ console.log(` ID: ${data.channel.id}`);
370
+ console.log(` Type: ${channelType}`);
371
+ console.log(` Name: ${channelName}`);
372
+ break;
373
+ }
374
+ case "list":
375
+ {
376
+ const config = requireConfig();
377
+ if (!config.channels.length) {
378
+ console.log("No channels configured. Run: whale channel add [imessage|telegram|discord|slack|whatsapp|sms|email]");
379
+ return;
306
380
  }
307
- case "status": {
308
- const rd = config.remote_desktop;
309
- console.log("Remote Desktop:");
310
- console.log(` Enabled: ${rd?.enabled !== false ? "yes" : "no"}`);
311
- console.log(` Port: ${rd?.port || 5900}`);
312
- console.log(` Max FPS: ${rd?.max_fps || 60}`);
313
- console.log(` Quality: ${rd?.quality || 0.6}`);
314
- if (process.platform !== "darwin") {
315
- console.log(` Platform: ${process.platform} (macOS required)`);
316
- }
317
- break;
381
+ console.log("Configured channels:");
382
+ for (const ch of config.channels) {
383
+ console.log(` ${ch.type.padEnd(10)} ${ch.name.padEnd(20)} ${ch.id}`);
318
384
  }
319
- default:
320
- console.log("Usage: whale remote-desktop [enable|disable|status]");
321
- }
385
+ break;
386
+ }
387
+ default:
388
+ console.log("Usage: whale channel [add|list]");
389
+ }
390
+ }
391
+ async function handleRemoteDesktopCommand(sub, _args) {
392
+ const config = requireConfig();
393
+ switch (sub) {
394
+ case "enable":
395
+ {
396
+ config.remote_desktop = {
397
+ ...config.remote_desktop,
398
+ enabled: true
399
+ };
400
+ saveConfig(config);
401
+ console.log("Remote desktop enabled. Takes effect on next `whale node start`.");
402
+ break;
403
+ }
404
+ case "disable":
405
+ {
406
+ config.remote_desktop = {
407
+ ...config.remote_desktop,
408
+ enabled: false
409
+ };
410
+ saveConfig(config);
411
+ console.log("Remote desktop disabled. Takes effect on next `whale node start`.");
412
+ break;
413
+ }
414
+ case "status":
415
+ {
416
+ const rd = config.remote_desktop;
417
+ console.log("Remote Desktop:");
418
+ console.log(` Enabled: ${rd?.enabled !== false ? "yes" : "no"}`);
419
+ console.log(` Port: ${rd?.port || 5900}`);
420
+ console.log(` Max FPS: ${rd?.max_fps || 60}`);
421
+ console.log(` Quality: ${rd?.quality || 0.6}`);
422
+ if (process.platform !== "darwin") {
423
+ console.log(` Platform: ${process.platform} (macOS required)`);
424
+ }
425
+ break;
426
+ }
427
+ default:
428
+ console.log("Usage: whale remote-desktop [enable|disable|status]");
429
+ }
322
430
  }
323
431
  async function handleStatus() {
324
- const config = loadConfig();
325
- if (!config) {
326
- console.log("Not configured. Run: whale node register --name 'My Mac' --store STORE_ID --token JWT");
327
- return;
328
- }
329
- console.log("WhaleNode Status:");
330
- console.log(` Node ID: ${config.node_id}`);
331
- console.log(` Store: ${config.store_id}`);
332
- console.log(` Server: ${config.server_url}`);
333
- console.log(` Channels: ${config.channels.length}`);
334
- console.log(` Config: ${getConfigPath()}`);
432
+ const config = loadConfig();
433
+ if (!config) {
434
+ console.log("Not configured. Run: whale node register --name 'My Mac' --store STORE_ID --token JWT");
435
+ return;
436
+ }
437
+ console.log("WhaleNode Status:");
438
+ console.log(` Node ID: ${config.node_id}`);
439
+ console.log(` Store: ${config.store_id}`);
440
+ console.log(` Server: ${config.server_url}`);
441
+ console.log(` Channels: ${config.channels.length}`);
442
+ console.log(` Config: ${getConfigPath()}`);
335
443
  }
444
+
336
445
  // ============================================================================
337
446
  // PORTAL COMMANDS
338
447
  // ============================================================================
448
+
339
449
  async function handlePortalCommand(sub, args) {
340
- const config = requireConfig();
341
- // Lazy imports — only load portal code when needed
342
- const { discoverNodes, findNode } = await import("./portal/discovery.js");
343
- const { printNodeList, printConnecting, printConnected, printDisconnected, printError, printProgress, showPortalMenu } = await import("./portal/ui.js");
344
- const discoveryOpts = {
345
- serverUrl: config.server_url,
346
- apiKey: config.api_key,
347
- storeId: config.store_id,
348
- };
349
- switch (sub) {
350
- case "ls":
351
- case "list": {
352
- const { values } = parseArgs({
353
- args,
354
- options: { all: { type: "boolean", short: "a", default: false } },
355
- });
356
- const nodes = await discoverNodes({ ...discoveryOpts, includeOffline: values.all });
357
- printNodeList(nodes, values.all);
358
- break;
359
- }
360
- case "sh":
361
- case "shell": {
362
- const nodeName = args[0];
363
- if (!nodeName) {
364
- console.error("Usage: whale portal sh <node> [--dir PATH] [-c COMMAND]");
365
- process.exit(1);
366
- }
367
- const { values } = parseArgs({
368
- args: args.slice(1),
369
- options: {
370
- dir: { type: "string" },
371
- c: { type: "string" },
372
- },
373
- });
374
- const node = await findNode(nodeName, discoveryOpts);
375
- if (!node) {
376
- printError(`Node "${nodeName}" not found or offline`);
377
- process.exit(1);
378
- }
379
- printConnecting(node.name);
380
- const { GatewayClient } = await import("./gateway-client.js");
381
- const { PortalManager } = await import("./portal/index.js");
382
- const { openShell } = await import("./portal/shell.js");
383
- const gateway = new GatewayClient({
384
- serverUrl: config.server_url,
385
- apiKey: config.api_key,
386
- capabilities: ["portal"],
387
- version: "1.1.0",
388
- });
389
- gateway.start();
390
- await waitForGateway(gateway);
391
- const portal = new PortalManager({ nodeConfig: config, gateway });
392
- const session = await portal.connect(node.id, ["shell"]);
393
- printConnected(node.hostname);
394
- const { cleanup } = await openShell(session, {
395
- cwd: values.dir,
396
- command: values.c,
397
- });
398
- // If single command mode, we're already done
399
- if (values.c) {
400
- cleanup();
401
- session.close();
402
- gateway.stop();
403
- break;
450
+ const config = requireConfig();
451
+
452
+ // Lazy imports only load portal code when needed
453
+ const {
454
+ discoverNodes,
455
+ findNode
456
+ } = await import("./portal/discovery.js");
457
+ const {
458
+ printNodeList,
459
+ printConnecting,
460
+ printConnected,
461
+ printDisconnected,
462
+ printError,
463
+ printProgress,
464
+ showPortalMenu
465
+ } = await import("./portal/ui.js");
466
+ const discoveryOpts = {
467
+ serverUrl: config.server_url,
468
+ apiKey: config.api_key,
469
+ storeId: config.store_id
470
+ };
471
+ switch (sub) {
472
+ case "ls":
473
+ case "list":
474
+ {
475
+ const {
476
+ values
477
+ } = parseArgs({
478
+ args,
479
+ options: {
480
+ all: {
481
+ type: "boolean",
482
+ short: "a",
483
+ default: false
404
484
  }
405
- // Wait for shell to close
406
- await new Promise((resolve) => {
407
- session.on("close", () => {
408
- cleanup();
409
- printDisconnected();
410
- resolve();
411
- });
412
- });
413
- gateway.stop();
414
- break;
485
+ }
486
+ });
487
+ const nodes = await discoverNodes({
488
+ ...discoveryOpts,
489
+ includeOffline: values.all
490
+ });
491
+ printNodeList(nodes, values.all);
492
+ break;
493
+ }
494
+ case "sh":
495
+ case "shell":
496
+ {
497
+ const nodeName = args[0];
498
+ if (!nodeName) {
499
+ console.error("Usage: whale portal sh <node> [--dir PATH] [-c COMMAND]");
500
+ process.exit(1);
415
501
  }
416
- case "push": {
417
- const localPath = args[0];
418
- const target = args[1];
419
- if (!localPath || !target) {
420
- console.error("Usage: whale portal push <local-path> <node>[:/remote/path]");
421
- process.exit(1);
422
- }
423
- const [nodeName, remotePath] = target.includes(":") ? target.split(":", 2) : [target, undefined];
424
- const node = await findNode(nodeName, discoveryOpts);
425
- if (!node) {
426
- printError(`Node "${nodeName}" not found or offline`);
427
- process.exit(1);
502
+ const {
503
+ values
504
+ } = parseArgs({
505
+ args: args.slice(1),
506
+ options: {
507
+ dir: {
508
+ type: "string"
509
+ },
510
+ c: {
511
+ type: "string"
428
512
  }
429
- printConnecting(node.name);
430
- const { GatewayClient } = await import("./gateway-client.js");
431
- const { PortalManager } = await import("./portal/index.js");
432
- const { pushFile } = await import("./portal/transfer.js");
433
- const gateway = new GatewayClient({
434
- serverUrl: config.server_url,
435
- apiKey: config.api_key,
436
- capabilities: ["portal"],
437
- version: "1.1.0",
438
- });
439
- gateway.start();
440
- await waitForGateway(gateway);
441
- const portal = new PortalManager({ nodeConfig: config, gateway });
442
- const session = await portal.connect(node.id, ["file"]);
443
- printConnected(node.hostname);
444
- await pushFile(session, localPath, remotePath, printProgress);
445
- console.log(`\nFile sent to ${node.name}`);
513
+ }
514
+ });
515
+ const node = await findNode(nodeName, discoveryOpts);
516
+ if (!node) {
517
+ printError(`Node "${nodeName}" not found or offline`);
518
+ process.exit(1);
519
+ }
520
+ printConnecting(node.name);
521
+ const {
522
+ GatewayClient
523
+ } = await import("./gateway-client.js");
524
+ const {
525
+ PortalManager
526
+ } = await import("./portal/index.js");
527
+ const {
528
+ openShell
529
+ } = await import("./portal/shell.js");
530
+ const gateway = new GatewayClient({
531
+ serverUrl: config.server_url,
532
+ apiKey: config.api_key,
533
+ capabilities: ["portal"],
534
+ version: "1.1.0"
535
+ });
536
+ gateway.start();
537
+ await waitForGateway(gateway);
538
+ const portal = new PortalManager({
539
+ nodeConfig: config,
540
+ gateway
541
+ });
542
+ const session = await portal.connect(node.id, ["shell"]);
543
+ printConnected(node.hostname);
544
+ const {
545
+ cleanup
546
+ } = await openShell(session, {
547
+ cwd: values.dir,
548
+ command: values.c
549
+ });
550
+
551
+ // If single command mode, we're already done
552
+ if (values.c) {
553
+ cleanup();
554
+ session.close();
555
+ gateway.stop();
556
+ break;
557
+ }
558
+
559
+ // Wait for shell to close
560
+ await new Promise(resolve => {
561
+ session.on("close", () => {
562
+ cleanup();
563
+ printDisconnected();
564
+ resolve();
565
+ });
566
+ });
567
+ gateway.stop();
568
+ break;
569
+ }
570
+ case "push":
571
+ {
572
+ const localPath = args[0];
573
+ const target = args[1];
574
+ if (!localPath || !target) {
575
+ console.error("Usage: whale portal push <local-path> <node>[:/remote/path]");
576
+ process.exit(1);
577
+ }
578
+ const [nodeName, remotePath] = target.includes(":") ? target.split(":", 2) : [target, undefined];
579
+ const node = await findNode(nodeName, discoveryOpts);
580
+ if (!node) {
581
+ printError(`Node "${nodeName}" not found or offline`);
582
+ process.exit(1);
583
+ }
584
+ printConnecting(node.name);
585
+ const {
586
+ GatewayClient
587
+ } = await import("./gateway-client.js");
588
+ const {
589
+ PortalManager
590
+ } = await import("./portal/index.js");
591
+ const {
592
+ pushFile
593
+ } = await import("./portal/transfer.js");
594
+ const gateway = new GatewayClient({
595
+ serverUrl: config.server_url,
596
+ apiKey: config.api_key,
597
+ capabilities: ["portal"],
598
+ version: "1.1.0"
599
+ });
600
+ gateway.start();
601
+ await waitForGateway(gateway);
602
+ const portal = new PortalManager({
603
+ nodeConfig: config,
604
+ gateway
605
+ });
606
+ const session = await portal.connect(node.id, ["file"]);
607
+ printConnected(node.hostname);
608
+ await pushFile(session, localPath, remotePath, printProgress);
609
+ console.log(`\nFile sent to ${node.name}`);
610
+ session.close();
611
+ gateway.stop();
612
+ break;
613
+ }
614
+ case "pull":
615
+ {
616
+ const source = args[0];
617
+ const localDir = args[1];
618
+ if (!source || !source.includes(":")) {
619
+ console.error("Usage: whale portal pull <node>:/path/to/file [local-dir]");
620
+ process.exit(1);
621
+ }
622
+ const [nodeName, remotePath] = source.split(":", 2);
623
+ const node = await findNode(nodeName, discoveryOpts);
624
+ if (!node) {
625
+ printError(`Node "${nodeName}" not found or offline`);
626
+ process.exit(1);
627
+ }
628
+ printConnecting(node.name);
629
+ const {
630
+ GatewayClient
631
+ } = await import("./gateway-client.js");
632
+ const {
633
+ PortalManager
634
+ } = await import("./portal/index.js");
635
+ const {
636
+ pullFile
637
+ } = await import("./portal/transfer.js");
638
+ const gateway = new GatewayClient({
639
+ serverUrl: config.server_url,
640
+ apiKey: config.api_key,
641
+ capabilities: ["portal"],
642
+ version: "1.1.0"
643
+ });
644
+ gateway.start();
645
+ await waitForGateway(gateway);
646
+ const portal = new PortalManager({
647
+ nodeConfig: config,
648
+ gateway
649
+ });
650
+ const session = await portal.connect(node.id, ["file"]);
651
+ printConnected(node.hostname);
652
+ const savedPath = await pullFile(session, remotePath, localDir, printProgress);
653
+ console.log(`\nFile saved to ${savedPath}`);
654
+ session.close();
655
+ gateway.stop();
656
+ break;
657
+ }
658
+ case "forward":
659
+ {
660
+ // Format: 8080:<node>:3000
661
+ const spec = args[0];
662
+ if (!spec) {
663
+ console.error("Usage: whale portal forward <local-port>:<node>:<remote-port>");
664
+ process.exit(1);
665
+ }
666
+ const parts = spec.split(":");
667
+ if (parts.length !== 3) {
668
+ console.error("Format: <local-port>:<node>:<remote-port>");
669
+ process.exit(1);
670
+ }
671
+ const localPort = parseInt(parts[0], 10);
672
+ const nodeName = parts[1];
673
+ const remotePort = parseInt(parts[2], 10);
674
+ const node = await findNode(nodeName, discoveryOpts);
675
+ if (!node) {
676
+ printError(`Node "${nodeName}" not found or offline`);
677
+ process.exit(1);
678
+ }
679
+ printConnecting(node.name);
680
+ const {
681
+ GatewayClient
682
+ } = await import("./gateway-client.js");
683
+ const {
684
+ PortalManager
685
+ } = await import("./portal/index.js");
686
+ const {
687
+ startForward
688
+ } = await import("./portal/forward.js");
689
+ const gateway = new GatewayClient({
690
+ serverUrl: config.server_url,
691
+ apiKey: config.api_key,
692
+ capabilities: ["portal"],
693
+ version: "1.1.0"
694
+ });
695
+ gateway.start();
696
+ await waitForGateway(gateway);
697
+ const portal = new PortalManager({
698
+ nodeConfig: config,
699
+ gateway
700
+ });
701
+ const session = await portal.connect(node.id, ["forward"]);
702
+ printConnected(node.hostname);
703
+ const info = await startForward(session, localPort, remotePort);
704
+ console.log(`Forwarding localhost:${info.localPort} → ${node.name}:${info.remotePort}`);
705
+ console.log("Press Ctrl+C to stop");
706
+ await new Promise(resolve => {
707
+ process.on("SIGINT", () => {
708
+ info.server.close();
446
709
  session.close();
447
710
  gateway.stop();
448
- break;
711
+ resolve();
712
+ });
713
+ });
714
+ break;
715
+ }
716
+ case "screen":
717
+ {
718
+ const nodeName = args[0];
719
+ if (!nodeName) {
720
+ console.error("Usage: whale portal screen <node> [--control]");
721
+ process.exit(1);
449
722
  }
450
- case "pull": {
451
- const source = args[0];
452
- const localDir = args[1];
453
- if (!source || !source.includes(":")) {
454
- console.error("Usage: whale portal pull <node>:/path/to/file [local-dir]");
455
- process.exit(1);
723
+ const {
724
+ values
725
+ } = parseArgs({
726
+ args: args.slice(1),
727
+ options: {
728
+ control: {
729
+ type: "boolean",
730
+ default: false
456
731
  }
457
- const [nodeName, remotePath] = source.split(":", 2);
458
- const node = await findNode(nodeName, discoveryOpts);
459
- if (!node) {
460
- printError(`Node "${nodeName}" not found or offline`);
461
- process.exit(1);
462
- }
463
- printConnecting(node.name);
464
- const { GatewayClient } = await import("./gateway-client.js");
465
- const { PortalManager } = await import("./portal/index.js");
466
- const { pullFile } = await import("./portal/transfer.js");
467
- const gateway = new GatewayClient({
468
- serverUrl: config.server_url,
469
- apiKey: config.api_key,
470
- capabilities: ["portal"],
471
- version: "1.1.0",
472
- });
473
- gateway.start();
474
- await waitForGateway(gateway);
475
- const portal = new PortalManager({ nodeConfig: config, gateway });
476
- const session = await portal.connect(node.id, ["file"]);
477
- printConnected(node.hostname);
478
- const savedPath = await pullFile(session, remotePath, localDir, printProgress);
479
- console.log(`\nFile saved to ${savedPath}`);
732
+ }
733
+ });
734
+ const node = await findNode(nodeName, discoveryOpts);
735
+ if (!node) {
736
+ printError(`Node "${nodeName}" not found or offline`);
737
+ process.exit(1);
738
+ }
739
+ printConnecting(node.name);
740
+ const {
741
+ GatewayClient
742
+ } = await import("./gateway-client.js");
743
+ const {
744
+ PortalManager
745
+ } = await import("./portal/index.js");
746
+ const {
747
+ openScreen
748
+ } = await import("./portal/screen.js");
749
+ const gateway = new GatewayClient({
750
+ serverUrl: config.server_url,
751
+ apiKey: config.api_key,
752
+ capabilities: ["portal"],
753
+ version: "1.1.0"
754
+ });
755
+ gateway.start();
756
+ await waitForGateway(gateway);
757
+ const portal = new PortalManager({
758
+ nodeConfig: config,
759
+ gateway
760
+ });
761
+ const session = await portal.connect(node.id, ["screen"]);
762
+ printConnected(node.hostname);
763
+ const {
764
+ stream,
765
+ cleanup
766
+ } = await openScreen(session, values.control ?? false);
767
+ console.log(`Screen share active${values.control ? " (control enabled)" : " (view only)"}`);
768
+ console.log("Press Ctrl+C to stop");
769
+ let frameCount = 0;
770
+ stream.on("data", () => {
771
+ frameCount++;
772
+ if (frameCount % 60 === 0) {
773
+ process.stderr.write(`\r Frames: ${frameCount}`);
774
+ }
775
+ });
776
+ await new Promise(resolve => {
777
+ process.on("SIGINT", () => {
778
+ cleanup();
480
779
  session.close();
481
780
  gateway.stop();
482
- break;
483
- }
484
- case "forward": {
485
- // Format: 8080:<node>:3000
486
- const spec = args[0];
487
- if (!spec) {
488
- console.error("Usage: whale portal forward <local-port>:<node>:<remote-port>");
489
- process.exit(1);
490
- }
491
- const parts = spec.split(":");
492
- if (parts.length !== 3) {
493
- console.error("Format: <local-port>:<node>:<remote-port>");
494
- process.exit(1);
495
- }
496
- const localPort = parseInt(parts[0], 10);
497
- const nodeName = parts[1];
498
- const remotePort = parseInt(parts[2], 10);
499
- const node = await findNode(nodeName, discoveryOpts);
500
- if (!node) {
501
- printError(`Node "${nodeName}" not found or offline`);
502
- process.exit(1);
781
+ console.log(`\n Total frames: ${frameCount}`);
782
+ resolve();
783
+ });
784
+ });
785
+ break;
786
+ }
787
+ case "clip":
788
+ case "clipboard":
789
+ {
790
+ const {
791
+ values: clipValues
792
+ } = parseArgs({
793
+ args,
794
+ options: {
795
+ from: {
796
+ type: "string"
797
+ },
798
+ sync: {
799
+ type: "string"
503
800
  }
504
- printConnecting(node.name);
505
- const { GatewayClient } = await import("./gateway-client.js");
506
- const { PortalManager } = await import("./portal/index.js");
507
- const { startForward } = await import("./portal/forward.js");
508
- const gateway = new GatewayClient({
509
- serverUrl: config.server_url,
510
- apiKey: config.api_key,
511
- capabilities: ["portal"],
512
- version: "1.1.0",
513
- });
514
- gateway.start();
515
- await waitForGateway(gateway);
516
- const portal = new PortalManager({ nodeConfig: config, gateway });
517
- const session = await portal.connect(node.id, ["forward"]);
518
- printConnected(node.hostname);
519
- const info = await startForward(session, localPort, remotePort);
520
- console.log(`Forwarding localhost:${info.localPort} → ${node.name}:${info.remotePort}`);
521
- console.log("Press Ctrl+C to stop");
522
- await new Promise((resolve) => {
523
- process.on("SIGINT", () => {
524
- info.server.close();
525
- session.close();
526
- gateway.stop();
527
- resolve();
528
- });
529
- });
530
- break;
801
+ },
802
+ allowPositionals: true
803
+ });
804
+ const positionals = args.filter(a => !a.startsWith("--"));
805
+ const nodeName = clipValues.from || clipValues.sync || positionals[0];
806
+ if (!nodeName) {
807
+ console.error("Usage: whale portal clip <node> | --from <node> | --sync <node>");
808
+ process.exit(1);
531
809
  }
532
- case "screen": {
533
- const nodeName = args[0];
534
- if (!nodeName) {
535
- console.error("Usage: whale portal screen <node> [--control]");
536
- process.exit(1);
537
- }
538
- const { values } = parseArgs({
539
- args: args.slice(1),
540
- options: { control: { type: "boolean", default: false } },
541
- });
542
- const node = await findNode(nodeName, discoveryOpts);
543
- if (!node) {
544
- printError(`Node "${nodeName}" not found or offline`);
545
- process.exit(1);
546
- }
547
- printConnecting(node.name);
548
- const { GatewayClient } = await import("./gateway-client.js");
549
- const { PortalManager } = await import("./portal/index.js");
550
- const { openScreen } = await import("./portal/screen.js");
551
- const gateway = new GatewayClient({
552
- serverUrl: config.server_url,
553
- apiKey: config.api_key,
554
- capabilities: ["portal"],
555
- version: "1.1.0",
556
- });
557
- gateway.start();
558
- await waitForGateway(gateway);
559
- const portal = new PortalManager({ nodeConfig: config, gateway });
560
- const session = await portal.connect(node.id, ["screen"]);
561
- printConnected(node.hostname);
562
- const { stream, cleanup } = await openScreen(session, values.control ?? false);
563
- console.log(`Screen share active${values.control ? " (control enabled)" : " (view only)"}`);
564
- console.log("Press Ctrl+C to stop");
565
- let frameCount = 0;
566
- stream.on("data", () => {
567
- frameCount++;
568
- if (frameCount % 60 === 0) {
569
- process.stderr.write(`\r Frames: ${frameCount}`);
570
- }
571
- });
572
- await new Promise((resolve) => {
573
- process.on("SIGINT", () => {
574
- cleanup();
575
- session.close();
576
- gateway.stop();
577
- console.log(`\n Total frames: ${frameCount}`);
578
- resolve();
579
- });
580
- });
581
- break;
810
+ const node = await findNode(nodeName, discoveryOpts);
811
+ if (!node) {
812
+ printError(`Node "${nodeName}" not found or offline`);
813
+ process.exit(1);
582
814
  }
583
- case "clip":
584
- case "clipboard": {
585
- const { values: clipValues } = parseArgs({
586
- args,
587
- options: {
588
- from: { type: "string" },
589
- sync: { type: "string" },
590
- },
591
- allowPositionals: true,
592
- });
593
- const positionals = args.filter(a => !a.startsWith("--"));
594
- const nodeName = clipValues.from || clipValues.sync || positionals[0];
595
- if (!nodeName) {
596
- console.error("Usage: whale portal clip <node> | --from <node> | --sync <node>");
597
- process.exit(1);
598
- }
599
- const node = await findNode(nodeName, discoveryOpts);
600
- if (!node) {
601
- printError(`Node "${nodeName}" not found or offline`);
602
- process.exit(1);
603
- }
604
- const { GatewayClient } = await import("./gateway-client.js");
605
- const { PortalManager } = await import("./portal/index.js");
606
- const { pushClipboard, pullClipboard, syncClipboard } = await import("./portal/clipboard.js");
607
- const gateway = new GatewayClient({
608
- serverUrl: config.server_url,
609
- apiKey: config.api_key,
610
- capabilities: ["portal"],
611
- version: "1.1.0",
815
+ const {
816
+ GatewayClient
817
+ } = await import("./gateway-client.js");
818
+ const {
819
+ PortalManager
820
+ } = await import("./portal/index.js");
821
+ const {
822
+ pushClipboard,
823
+ pullClipboard,
824
+ syncClipboard
825
+ } = await import("./portal/clipboard.js");
826
+ const gateway = new GatewayClient({
827
+ serverUrl: config.server_url,
828
+ apiKey: config.api_key,
829
+ capabilities: ["portal"],
830
+ version: "1.1.0"
831
+ });
832
+ gateway.start();
833
+ await waitForGateway(gateway);
834
+ const portal = new PortalManager({
835
+ nodeConfig: config,
836
+ gateway
837
+ });
838
+ const session = await portal.connect(node.id, ["clipboard"]);
839
+ if (clipValues.sync) {
840
+ const {
841
+ cleanup
842
+ } = await syncClipboard(session);
843
+ console.log(`Clipboard sync active with ${node.name}. Press Ctrl+C to stop.`);
844
+ await new Promise(resolve => {
845
+ process.on("SIGINT", () => {
846
+ cleanup();
847
+ session.close();
848
+ gateway.stop();
849
+ resolve();
612
850
  });
613
- gateway.start();
614
- await waitForGateway(gateway);
615
- const portal = new PortalManager({ nodeConfig: config, gateway });
616
- const session = await portal.connect(node.id, ["clipboard"]);
617
- if (clipValues.sync) {
618
- const { cleanup } = await syncClipboard(session);
619
- console.log(`Clipboard sync active with ${node.name}. Press Ctrl+C to stop.`);
620
- await new Promise((resolve) => {
621
- process.on("SIGINT", () => {
622
- cleanup();
623
- session.close();
624
- gateway.stop();
625
- resolve();
626
- });
627
- });
628
- }
629
- else if (clipValues.from) {
630
- const content = await pullClipboard(session);
631
- console.log(`Clipboard received from ${node.name} (${content.length} chars)`);
632
- session.close();
633
- gateway.stop();
634
- }
635
- else {
636
- await pushClipboard(session);
637
- console.log(`Clipboard sent to ${node.name}`);
638
- session.close();
639
- gateway.stop();
640
- }
641
- break;
851
+ });
852
+ } else if (clipValues.from) {
853
+ const content = await pullClipboard(session);
854
+ console.log(`Clipboard received from ${node.name} (${content.length} chars)`);
855
+ session.close();
856
+ gateway.stop();
857
+ } else {
858
+ await pushClipboard(session);
859
+ console.log(`Clipboard sent to ${node.name}`);
860
+ session.close();
861
+ gateway.stop();
642
862
  }
643
- case "status": {
644
- // Just show local session info from config
645
- console.log("Use `whale portal ls` to see online nodes.");
646
- console.log("Use `whale portal close <session-id>` to close a session.");
647
- break;
863
+ break;
864
+ }
865
+ case "status":
866
+ {
867
+ // Just show local session info from config
868
+ console.log("Use `whale portal ls` to see online nodes.");
869
+ console.log("Use `whale portal close <session-id>` to close a session.");
870
+ break;
871
+ }
872
+ case "close":
873
+ {
874
+ const sessionId = args[0];
875
+ if (!sessionId) {
876
+ console.error("Usage: whale portal close <session-id>");
877
+ process.exit(1);
648
878
  }
649
- case "close": {
650
- const sessionId = args[0];
651
- if (!sessionId) {
652
- console.error("Usage: whale portal close <session-id>");
653
- process.exit(1);
879
+ console.log(`Session ${sessionId} closed.`);
880
+ break;
881
+ }
882
+ default:
883
+ {
884
+ // If sub looks like a node name, open interactive menu
885
+ if (sub && !sub.startsWith("-")) {
886
+ const node = await findNode(sub, discoveryOpts);
887
+ if (node) {
888
+ const choice = await showPortalMenu(node.name);
889
+ if (choice === "quit") break;
890
+ // Re-dispatch based on menu choice
891
+ switch (choice) {
892
+ case "shell":
893
+ await handlePortalCommand("sh", [sub]);
894
+ break;
895
+ case "push":
896
+ console.log("Enter local path to push:");
897
+ // Fall through to push command with readline
898
+ break;
899
+ case "pull":
900
+ console.log("Enter remote path to pull:");
901
+ break;
902
+ case "forward":
903
+ console.log("Enter forward spec (local:remote):");
904
+ break;
905
+ case "screen":
906
+ await handlePortalCommand("screen", [sub]);
907
+ break;
908
+ case "clipboard":
909
+ await handlePortalCommand("clip", [sub]);
910
+ break;
911
+ default:
912
+ printError("Unknown menu option");
654
913
  }
655
- console.log(`Session ${sessionId} closed.`);
656
914
  break;
915
+ }
657
916
  }
658
- default: {
659
- // If sub looks like a node name, open interactive menu
660
- if (sub && !sub.startsWith("-")) {
661
- const node = await findNode(sub, discoveryOpts);
662
- if (node) {
663
- const choice = await showPortalMenu(node.name);
664
- if (choice === "quit")
665
- break;
666
- // Re-dispatch based on menu choice
667
- switch (choice) {
668
- case "shell":
669
- await handlePortalCommand("sh", [sub]);
670
- break;
671
- case "push":
672
- console.log("Enter local path to push:");
673
- // Fall through to push command with readline
674
- break;
675
- case "pull":
676
- console.log("Enter remote path to pull:");
677
- break;
678
- case "forward":
679
- console.log("Enter forward spec (local:remote):");
680
- break;
681
- case "screen":
682
- await handlePortalCommand("screen", [sub]);
683
- break;
684
- case "clipboard":
685
- await handlePortalCommand("clip", [sub]);
686
- break;
687
- default:
688
- printError("Unknown menu option");
689
- }
690
- break;
691
- }
692
- }
693
- printPortalHelp();
694
- }
695
- }
917
+ printPortalHelp();
918
+ }
919
+ }
696
920
  }
697
921
  function printPortalHelp() {
698
- console.log(`
922
+ console.log(`
699
923
  Whale Portal — node-to-node connectivity
700
924
 
701
925
  Commands:
@@ -714,22 +938,21 @@ Alias: whale p <anything> = whale portal <anything>
714
938
  `);
715
939
  }
716
940
  async function waitForGateway(gateway) {
717
- if (gateway.isConnected)
718
- return;
719
- return new Promise((resolve, reject) => {
720
- const timeout = setTimeout(() => reject(new Error("Gateway connection timed out")), 15_000);
721
- gateway.on("connected", () => {
722
- clearTimeout(timeout);
723
- resolve();
724
- });
725
- gateway.on("error", (err) => {
726
- clearTimeout(timeout);
727
- reject(new Error(`Gateway error: ${err}`));
728
- });
941
+ if (gateway.isConnected) return;
942
+ return new Promise((resolve, reject) => {
943
+ const timeout = setTimeout(() => reject(new Error("Gateway connection timed out")), 15_000);
944
+ gateway.on("connected", () => {
945
+ clearTimeout(timeout);
946
+ resolve();
729
947
  });
948
+ gateway.on("error", err => {
949
+ clearTimeout(timeout);
950
+ reject(new Error(`Gateway error: ${err}`));
951
+ });
952
+ });
730
953
  }
731
954
  function printHelp() {
732
- console.log(`
955
+ console.log(`
733
956
  WhaleNode CLI v1.1.0 — Bridge local channels to WhaleTools AI agents
734
957
 
735
958
  Commands:
@@ -769,8 +992,16 @@ Channel Types:
769
992
  `);
770
993
  }
771
994
  main().catch(err => {
772
- captureError({ error: err instanceof Error ? err : new Error(String(err)), severity: "fatal", tags: { source: "whale-node", handler: "main" } });
773
- console.error("Error:", err.message);
774
- // Give error logger a moment to flush before exit
775
- setTimeout(() => process.exit(1), 500);
995
+ captureError({
996
+ error: err instanceof Error ? err : new Error(String(err)),
997
+ severity: "fatal",
998
+ tags: {
999
+ source: "whale-node",
1000
+ handler: "main"
1001
+ }
1002
+ });
1003
+ console.error("Error:", err.message);
1004
+ // Give error logger a moment to flush before exit
1005
+ setTimeout(() => process.exit(1), 500);
776
1006
  });
1007
+ //# sourceMappingURL=cli.js.map