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
@@ -1,4 +1,5 @@
1
- import { cpus, totalmem, hostname } from "node:os";
1
+ import { cpus, totalmem, freemem, hostname, loadavg } from "node:os";
2
+ import { execSync } from "node:child_process";
2
3
  import { IMessageAdapter } from "./adapters/imessage.js";
3
4
  import { TelegramAdapter } from "./adapters/telegram.js";
4
5
  import { DiscordAdapter } from "./adapters/discord.js";
@@ -14,446 +15,528 @@ import { PortalManager } from "./portal/index.js";
14
15
  const HEARTBEAT_INTERVAL_MS = 60_000;
15
16
  const POLL_INTERVAL_MS = 2_000;
16
17
  const VERSION = "1.1.0";
18
+
17
19
  // Retry configuration
18
20
  const MAX_RELAY_RETRIES = 3;
19
21
  const INITIAL_RETRY_DELAY_MS = 1_000;
20
22
  const MAX_RETRY_DELAY_MS = 30_000;
21
23
  export class NodeRuntime {
22
- config;
23
- adapters = new Map();
24
- heartbeatTimer = null;
25
- pollTimers = new Map();
26
- running = false;
27
- startedAt = null;
28
- // Connection health tracking
29
- status = "starting";
30
- consecutiveServerFailures = 0;
31
- lastServerContact = null;
32
- heartbeatsSent = 0;
33
- heartbeatsFailed = 0;
34
- messagesRelayed = 0;
35
- messagesFailed = 0;
36
- // Server gateway connection
37
- gatewayClient = null;
38
- // Screen capture service (macOS only)
39
- screenCapture = null;
40
- // Portal manager (node-to-node connectivity)
41
- portalManager = null;
42
- constructor(config) {
43
- this.config = config;
24
+ adapters = new Map();
25
+ heartbeatTimer = null;
26
+ pollTimers = new Map();
27
+ running = false;
28
+ startedAt = null;
29
+
30
+ // Connection health tracking
31
+ status = "starting";
32
+ consecutiveServerFailures = 0;
33
+ lastServerContact = null;
34
+ heartbeatsSent = 0;
35
+ heartbeatsFailed = 0;
36
+ messagesRelayed = 0;
37
+ messagesFailed = 0;
38
+
39
+ // Server gateway connection
40
+ gatewayClient = null;
41
+
42
+ // Screen capture service (macOS only)
43
+ screenCapture = null;
44
+
45
+ // Portal manager (node-to-node connectivity)
46
+ portalManager = null;
47
+ constructor(config) {
48
+ this.config = config;
49
+ }
50
+ getStats() {
51
+ const adapterStats = {};
52
+ for (const [id, adapter] of this.adapters) {
53
+ const s = adapter.getStats();
54
+ adapterStats[id] = {
55
+ type: adapter.type,
56
+ running: adapter.isRunning(),
57
+ messages_in: s.messages_in,
58
+ messages_out: s.messages_out,
59
+ errors: s.errors
60
+ };
44
61
  }
45
- getStats() {
46
- const adapterStats = {};
47
- for (const [id, adapter] of this.adapters) {
48
- const s = adapter.getStats();
49
- adapterStats[id] = {
50
- type: adapter.type,
51
- running: adapter.isRunning(),
52
- messages_in: s.messages_in,
53
- messages_out: s.messages_out,
54
- errors: s.errors,
55
- };
56
- }
62
+ return {
63
+ status: this.status,
64
+ uptime_seconds: this.startedAt ? Math.floor((Date.now() - this.startedAt.getTime()) / 1000) : 0,
65
+ heartbeats_sent: this.heartbeatsSent,
66
+ heartbeats_failed: this.heartbeatsFailed,
67
+ messages_relayed: this.messagesRelayed,
68
+ messages_failed: this.messagesFailed,
69
+ consecutive_server_failures: this.consecutiveServerFailures,
70
+ last_server_contact: this.lastServerContact?.toISOString() || null,
71
+ adapters: adapterStats
72
+ };
73
+ }
74
+ async start() {
75
+ this.running = true;
76
+ this.startedAt = new Date();
77
+ this.status = "starting";
78
+ addBreadcrumb("node", `Starting node ${this.config.node_id} v${VERSION}`, "info");
79
+ console.log(`[node] Starting WhaleNode "${this.config.node_id}" v${VERSION}...`);
80
+
81
+ // Start heartbeat — initial heartbeat validates server connectivity
82
+ const heartbeatOk = await this.sendHeartbeat();
83
+ this.status = heartbeatOk ? "connected" : "degraded";
84
+ this.heartbeatTimer = setInterval(() => this.sendHeartbeat(), HEARTBEAT_INTERVAL_MS);
85
+
86
+ // Initialize adapters for each channel
87
+ for (const ch of this.config.channels) {
88
+ await this.startAdapter(ch);
89
+ }
90
+
91
+ // Connect to server gateway for receiving commands
92
+ this.gatewayClient = new GatewayClient({
93
+ serverUrl: this.config.server_url,
94
+ apiKey: this.config.api_key,
95
+ version: VERSION
96
+ });
97
+
98
+ // Register exec command handler
99
+ this.gatewayClient.onCommand("exec", async msg => {
100
+ const {
101
+ execSync
102
+ } = await import("node:child_process");
103
+ try {
104
+ const stdout = execSync(msg.command, {
105
+ timeout: msg.timeout || 30_000,
106
+ cwd: process.env.HOME,
107
+ encoding: "utf-8",
108
+ maxBuffer: 512 * 1024
109
+ });
57
110
  return {
58
- status: this.status,
59
- uptime_seconds: this.startedAt ? Math.floor((Date.now() - this.startedAt.getTime()) / 1000) : 0,
60
- heartbeats_sent: this.heartbeatsSent,
61
- heartbeats_failed: this.heartbeatsFailed,
62
- messages_relayed: this.messagesRelayed,
63
- messages_failed: this.messagesFailed,
64
- consecutive_server_failures: this.consecutiveServerFailures,
65
- last_server_contact: this.lastServerContact?.toISOString() || null,
66
- adapters: adapterStats,
111
+ stdout,
112
+ exit_code: 0
113
+ };
114
+ } catch (err) {
115
+ return {
116
+ stdout: err.stdout || "",
117
+ stderr: err.stderr || err.message,
118
+ exit_code: err.status || 1
119
+ };
120
+ }
121
+ });
122
+
123
+ // Register remote desktop command handler on gateway — forward input events
124
+ this.gatewayClient.onCommand("remote_desktop", async msg => {
125
+ if (!this.screenCapture) {
126
+ return {
127
+ error: "Screen capture not enabled"
67
128
  };
129
+ }
130
+ if (msg.type === "input") {
131
+ this.screenCapture.injectInput(msg);
132
+ return null;
133
+ }
134
+ // Return capture status for session requests
135
+ return {
136
+ type: "remote_desktop_response",
137
+ success: true,
138
+ ...this.screenCapture.getStatus()
139
+ };
140
+ });
141
+ this.gatewayClient.start();
142
+
143
+ // Start screen capture service (macOS only)
144
+ if (process.platform === "darwin" && this.config.remote_desktop?.enabled !== false) {
145
+ try {
146
+ this.screenCapture = new ScreenCaptureService(this.config.remote_desktop || {});
147
+ await this.screenCapture.start();
148
+ } catch (err) {
149
+ console.warn("[node] Screen capture failed to start:", err.message);
150
+ }
68
151
  }
69
- async start() {
70
- this.running = true;
71
- this.startedAt = new Date();
72
- this.status = "starting";
73
- addBreadcrumb("node", `Starting node ${this.config.node_id} v${VERSION}`, "info");
74
- console.log(`[node] Starting WhaleNode "${this.config.node_id}" v${VERSION}...`);
75
- // Start heartbeat — initial heartbeat validates server connectivity
76
- const heartbeatOk = await this.sendHeartbeat();
77
- this.status = heartbeatOk ? "connected" : "degraded";
78
- this.heartbeatTimer = setInterval(() => this.sendHeartbeat(), HEARTBEAT_INTERVAL_MS);
79
- // Initialize adapters for each channel
80
- for (const ch of this.config.channels) {
81
- await this.startAdapter(ch);
82
- }
83
- // Connect to server gateway for receiving commands
84
- this.gatewayClient = new GatewayClient({
85
- serverUrl: this.config.server_url,
86
- apiKey: this.config.api_key,
87
- version: VERSION,
88
- });
89
- // Register exec command handler
90
- this.gatewayClient.onCommand("exec", async (msg) => {
91
- const { execSync } = await import("node:child_process");
92
- try {
93
- const stdout = execSync(msg.command, {
94
- timeout: msg.timeout || 30_000,
95
- cwd: process.env.HOME,
96
- encoding: "utf-8",
97
- maxBuffer: 512 * 1024,
98
- });
99
- return { stdout, exit_code: 0 };
100
- }
101
- catch (err) {
102
- return {
103
- stdout: err.stdout || "",
104
- stderr: err.stderr || err.message,
105
- exit_code: err.status || 1,
106
- };
107
- }
108
- });
109
- // Register remote desktop command handler on gateway — forward input events
110
- this.gatewayClient.onCommand("remote_desktop", async (msg) => {
111
- if (!this.screenCapture) {
112
- return { error: "Screen capture not enabled" };
113
- }
114
- if (msg.type === "input") {
115
- this.screenCapture.injectInput(msg);
116
- return null;
117
- }
118
- // Return capture status for session requests
119
- return {
120
- type: "remote_desktop_response",
121
- success: true,
122
- ...this.screenCapture.getStatus(),
123
- };
124
- });
125
- this.gatewayClient.start();
126
- // Start screen capture service (macOS only)
127
- if (process.platform === "darwin" && this.config.remote_desktop?.enabled !== false) {
128
- try {
129
- this.screenCapture = new ScreenCaptureService(this.config.remote_desktop || {});
130
- await this.screenCapture.start();
131
- }
132
- catch (err) {
133
- console.warn("[node] Screen capture failed to start:", err.message);
134
- }
135
- }
136
- // Initialize portal manager
137
- try {
138
- const portalConfig = this.config.portal || {};
139
- this.portalManager = new PortalManager({
140
- nodeConfig: this.config,
141
- gateway: this.gatewayClient,
142
- screenCapture: this.screenCapture,
143
- receiveDir: portalConfig.receive_dir,
144
- autoAcceptAdmins: portalConfig.auto_accept_admins !== false,
145
- maxSessions: portalConfig.max_sessions || 5,
146
- });
147
- console.log("[node] Portal handler registered");
148
- }
149
- catch (err) {
150
- console.warn("[node] Portal handler failed to initialize:", err.message);
151
- }
152
- // Handle graceful shutdown
153
- process.on("SIGTERM", () => this.stop());
154
- process.on("SIGINT", () => this.stop());
155
- console.log(`[node] Running with ${this.adapters.size} channel adapter(s). Gateway: connecting. Press Ctrl+C to stop.`);
152
+
153
+ // Initialize portal manager
154
+ try {
155
+ const portalConfig = this.config.portal || {};
156
+ this.portalManager = new PortalManager({
157
+ nodeConfig: this.config,
158
+ gateway: this.gatewayClient,
159
+ screenCapture: this.screenCapture,
160
+ receiveDir: portalConfig.receive_dir,
161
+ autoAcceptAdmins: portalConfig.auto_accept_admins !== false,
162
+ maxSessions: portalConfig.max_sessions || 5
163
+ });
164
+ console.log("[node] Portal handler registered");
165
+ } catch (err) {
166
+ console.warn("[node] Portal handler failed to initialize:", err.message);
156
167
  }
157
- async stop() {
158
- console.log(`[node] Shutting down...`);
159
- this.running = false;
160
- this.status = "disconnected";
161
- if (this.heartbeatTimer)
162
- clearInterval(this.heartbeatTimer);
163
- for (const [, timer] of this.pollTimers)
164
- clearInterval(timer);
165
- // Stop portal sessions
166
- if (this.portalManager) {
167
- this.portalManager.closeAll();
168
- this.portalManager = null;
169
- }
170
- // Stop screen capture
171
- if (this.screenCapture) {
172
- await this.screenCapture.stop();
173
- this.screenCapture = null;
174
- }
175
- // Disconnect from server gateway
176
- if (this.gatewayClient)
177
- this.gatewayClient.stop();
178
- for (const [name, adapter] of this.adapters) {
179
- console.log(`[node] Stopping adapter: ${name}`);
180
- await adapter.stop();
181
- }
182
- console.log(`[node] Stopped.`);
183
- process.exit(0);
168
+
169
+ // Handle graceful shutdown
170
+ process.on("SIGTERM", () => this.stop());
171
+ process.on("SIGINT", () => this.stop());
172
+ console.log(`[node] Running with ${this.adapters.size} channel adapter(s). Gateway: connecting. Press Ctrl+C to stop.`);
173
+ }
174
+ async stop() {
175
+ console.log(`[node] Shutting down...`);
176
+ this.running = false;
177
+ this.status = "disconnected";
178
+ if (this.heartbeatTimer) clearInterval(this.heartbeatTimer);
179
+ for (const [, timer] of this.pollTimers) clearInterval(timer);
180
+
181
+ // Stop portal sessions
182
+ if (this.portalManager) {
183
+ this.portalManager.closeAll();
184
+ this.portalManager = null;
184
185
  }
185
- /**
186
- * Get a channel adapter by ID.
187
- */
188
- getAdapter(channelId) {
189
- return this.adapters.get(channelId);
186
+
187
+ // Stop screen capture
188
+ if (this.screenCapture) {
189
+ await this.screenCapture.stop();
190
+ this.screenCapture = null;
190
191
  }
191
- async startAdapter(ch) {
192
- let adapter;
193
- switch (ch.type) {
194
- case "imessage":
195
- adapter = new IMessageAdapter(ch.name, ch.config);
196
- break;
197
- case "telegram":
198
- adapter = new TelegramAdapter(ch.name, ch.config);
199
- break;
200
- case "discord":
201
- adapter = new DiscordAdapter(ch.name, ch.config);
202
- break;
203
- case "slack":
204
- adapter = new SlackAdapter(ch.name, ch.config);
205
- break;
206
- case "webchat":
207
- adapter = new WebchatAdapter(ch.name, ch.config);
208
- break;
209
- case "whatsapp":
210
- adapter = new WhatsAppAdapter(ch.name, ch.config);
211
- break;
212
- case "sms":
213
- adapter = new SmsAdapter(ch.name, ch.config);
214
- break;
215
- case "email":
216
- adapter = new EmailAdapter(ch.name, ch.config);
217
- break;
218
- default:
219
- console.warn(`[node] Unknown channel type: ${ch.type}`);
220
- return;
221
- }
222
- // Wire up inbound message handler — relay to server and deliver agent response
223
- adapter.setMessageHandler(async (msg) => {
224
- await this.relayAndDeliver(ch.id, msg);
225
- });
226
- await adapter.start();
227
- this.adapters.set(ch.id, adapter);
228
- // Start polling for queued outbound messages (async agent responses)
229
- const pollTimer = setInterval(() => this.pollOutbound(ch.id, adapter), POLL_INTERVAL_MS);
230
- this.pollTimers.set(ch.id, pollTimer);
231
- console.log(`[node] Adapter started: ${ch.type} "${ch.name}"`);
192
+
193
+ // Disconnect from server gateway
194
+ if (this.gatewayClient) this.gatewayClient.stop();
195
+ for (const [name, adapter] of this.adapters) {
196
+ console.log(`[node] Stopping adapter: ${name}`);
197
+ await adapter.stop();
232
198
  }
233
- /** Fetch with retry and exponential backoff */
234
- async fetchWithRetry(url, options, maxRetries = MAX_RELAY_RETRIES) {
235
- let lastError = null;
236
- for (let attempt = 0; attempt <= maxRetries; attempt++) {
237
- try {
238
- const res = await fetch(url, {
239
- ...options,
240
- signal: AbortSignal.timeout(30_000), // 30s timeout per attempt
241
- });
242
- // Retry on 5xx (server errors, including Cloudflare 520/522/524)
243
- if (res.status >= 500 && attempt < maxRetries) {
244
- const delay = Math.min(INITIAL_RETRY_DELAY_MS * Math.pow(2, attempt), MAX_RETRY_DELAY_MS);
245
- console.warn(`[fetch] ${res.status} from ${url}, retrying in ${delay}ms (attempt ${attempt + 1}/${maxRetries})`);
246
- await sleep(delay);
247
- continue;
248
- }
249
- // Success or non-retryable error — update health tracking
250
- this.recordServerContact(res.ok);
251
- return res;
252
- }
253
- catch (err) {
254
- lastError = err;
255
- if (attempt < maxRetries) {
256
- const delay = Math.min(INITIAL_RETRY_DELAY_MS * Math.pow(2, attempt), MAX_RETRY_DELAY_MS);
257
- console.warn(`[fetch] Error: ${lastError.message}, retrying in ${delay}ms (attempt ${attempt + 1}/${maxRetries})`);
258
- await sleep(delay);
259
- }
260
- }
261
- }
262
- this.recordServerContact(false);
263
- throw lastError || new Error("Fetch failed after retries");
199
+ console.log(`[node] Stopped.`);
200
+ process.exit(0);
201
+ }
202
+
203
+ /**
204
+ * Get a channel adapter by ID.
205
+ */
206
+ getAdapter(channelId) {
207
+ return this.adapters.get(channelId);
208
+ }
209
+ async startAdapter(ch) {
210
+ let adapter;
211
+ switch (ch.type) {
212
+ case "imessage":
213
+ adapter = new IMessageAdapter(ch.name, ch.config);
214
+ break;
215
+ case "telegram":
216
+ adapter = new TelegramAdapter(ch.name, ch.config);
217
+ break;
218
+ case "discord":
219
+ adapter = new DiscordAdapter(ch.name, ch.config);
220
+ break;
221
+ case "slack":
222
+ adapter = new SlackAdapter(ch.name, ch.config);
223
+ break;
224
+ case "webchat":
225
+ adapter = new WebchatAdapter(ch.name, ch.config);
226
+ break;
227
+ case "whatsapp":
228
+ adapter = new WhatsAppAdapter(ch.name, ch.config);
229
+ break;
230
+ case "sms":
231
+ adapter = new SmsAdapter(ch.name, ch.config);
232
+ break;
233
+ case "email":
234
+ adapter = new EmailAdapter(ch.name, ch.config);
235
+ break;
236
+ default:
237
+ console.warn(`[node] Unknown channel type: ${ch.type}`);
238
+ return;
264
239
  }
265
- /** Track server connectivity health */
266
- recordServerContact(success) {
267
- if (success) {
268
- this.consecutiveServerFailures = 0;
269
- this.lastServerContact = new Date();
270
- if (this.status === "degraded" || this.status === "disconnected") {
271
- console.log(`[node] Server connectivity restored`);
272
- this.status = "connected";
273
- }
240
+
241
+ // Wire up inbound message handler — relay to server and deliver agent response
242
+ adapter.setMessageHandler(async msg => {
243
+ await this.relayAndDeliver(ch.id, msg);
244
+ });
245
+ await adapter.start();
246
+ this.adapters.set(ch.id, adapter);
247
+
248
+ // Start polling for queued outbound messages (async agent responses)
249
+ const pollTimer = setInterval(() => this.pollOutbound(ch.id, adapter), POLL_INTERVAL_MS);
250
+ this.pollTimers.set(ch.id, pollTimer);
251
+ console.log(`[node] Adapter started: ${ch.type} "${ch.name}"`);
252
+ }
253
+
254
+ /** Fetch with retry and exponential backoff */
255
+ async fetchWithRetry(url, options, maxRetries = MAX_RELAY_RETRIES) {
256
+ let lastError = null;
257
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
258
+ try {
259
+ const res = await fetch(url, {
260
+ ...options,
261
+ signal: AbortSignal.timeout(30_000) // 30s timeout per attempt
262
+ });
263
+
264
+ // Retry on 5xx (server errors, including Cloudflare 520/522/524)
265
+ if (res.status >= 500 && attempt < maxRetries) {
266
+ const delay = Math.min(INITIAL_RETRY_DELAY_MS * Math.pow(2, attempt), MAX_RETRY_DELAY_MS);
267
+ console.warn(`[fetch] ${res.status} from ${url}, retrying in ${delay}ms (attempt ${attempt + 1}/${maxRetries})`);
268
+ await sleep(delay);
269
+ continue;
274
270
  }
275
- else {
276
- this.consecutiveServerFailures++;
277
- if (this.consecutiveServerFailures >= 3 && this.status === "connected") {
278
- console.warn(`[node] Server connectivity degraded (${this.consecutiveServerFailures} consecutive failures)`);
279
- this.status = "degraded";
280
- }
281
- if (this.consecutiveServerFailures >= 10 && this.status !== "disconnected") {
282
- console.error(`[node] Server appears unreachable (${this.consecutiveServerFailures} consecutive failures)`);
283
- this.status = "disconnected";
284
- }
271
+
272
+ // Success or non-retryable error — update health tracking
273
+ this.recordServerContact(res.ok);
274
+ return res;
275
+ } catch (err) {
276
+ lastError = err;
277
+ if (attempt < maxRetries) {
278
+ const delay = Math.min(INITIAL_RETRY_DELAY_MS * Math.pow(2, attempt), MAX_RETRY_DELAY_MS);
279
+ console.warn(`[fetch] Error: ${lastError.message}, retrying in ${delay}ms (attempt ${attempt + 1}/${maxRetries})`);
280
+ await sleep(delay);
285
281
  }
282
+ }
286
283
  }
287
- /** Poll for undelivered outbound messages and deliver via adapter */
288
- async pollOutbound(channelId, adapter) {
289
- if (!this.running)
290
- return;
291
- try {
292
- const url = `${this.config.server_url}/channels/${channelId}/messages?undelivered=true&limit=10`;
293
- const res = await this.fetchWithRetry(url, {
294
- method: "GET",
295
- headers: {
296
- Authorization: `Bearer ${this.config.api_key}`,
297
- },
298
- }, 1); // Only 1 retry for polling (runs every 2s anyway)
299
- if (!res.ok)
300
- return;
301
- const data = await res.json();
302
- if (!data.success || !data.messages?.length)
303
- return;
304
- for (const msg of data.messages) {
305
- const outMsg = {
306
- id: msg.id,
307
- content: msg.content || "",
308
- sender_id: msg.sender_id || "agent",
309
- conversation_id: msg.conversation_id,
310
- metadata: msg.metadata,
311
- };
312
- const delivered = await adapter.sendMessage(outMsg);
313
- if (delivered) {
314
- await this.markDelivered(channelId, msg.id);
315
- console.log(`[poll] Delivered queued message ${msg.id}`);
316
- }
317
- }
318
- }
319
- catch {
320
- // Silent — polling errors are expected during connectivity blips
321
- }
284
+ this.recordServerContact(false);
285
+ throw lastError || new Error("Fetch failed after retries");
286
+ }
287
+
288
+ /** Track server connectivity health */
289
+ recordServerContact(success) {
290
+ if (success) {
291
+ this.consecutiveServerFailures = 0;
292
+ this.lastServerContact = new Date();
293
+ if (this.status === "degraded" || this.status === "disconnected") {
294
+ console.log(`[node] Server connectivity restored`);
295
+ this.status = "connected";
296
+ }
297
+ } else {
298
+ this.consecutiveServerFailures++;
299
+ if (this.consecutiveServerFailures >= 3 && this.status === "connected") {
300
+ console.warn(`[node] Server connectivity degraded (${this.consecutiveServerFailures} consecutive failures)`);
301
+ this.status = "degraded";
302
+ }
303
+ if (this.consecutiveServerFailures >= 10 && this.status !== "disconnected") {
304
+ console.error(`[node] Server appears unreachable (${this.consecutiveServerFailures} consecutive failures)`);
305
+ this.status = "disconnected";
306
+ }
322
307
  }
323
- /** Relay inbound and deliver response synchronously with retry */
324
- async relayAndDeliver(channelId, msg) {
325
- try {
326
- const res = await this.fetchWithRetry(`${this.config.server_url}/channels/${channelId}/messages`, {
327
- method: "POST",
328
- headers: {
329
- "Content-Type": "application/json",
330
- Authorization: `Bearer ${this.config.api_key}`,
331
- },
332
- body: JSON.stringify({
333
- direction: "inbound",
334
- ...msg,
335
- }),
336
- });
337
- const data = await res.json();
338
- this.messagesRelayed++;
339
- if (data.success && data.agent_response) {
340
- const adapter = this.adapters.get(channelId);
341
- if (adapter) {
342
- const outMsg = {
343
- id: data.agent_response.id,
344
- content: data.agent_response.content,
345
- sender_id: "agent",
346
- conversation_id: data.conversation_id || data.agent_response.conversation_id,
347
- metadata: msg.metadata,
348
- };
349
- const delivered = await adapter.sendMessage(outMsg);
350
- if (delivered) {
351
- await this.markDelivered(channelId, data.agent_response.id);
352
- }
353
- }
354
- }
308
+ }
309
+
310
+ /** Poll for undelivered outbound messages and deliver via adapter */
311
+ async pollOutbound(channelId, adapter) {
312
+ if (!this.running) return;
313
+ try {
314
+ const url = `${this.config.server_url}/channels/${channelId}/messages?undelivered=true&limit=10`;
315
+ const res = await this.fetchWithRetry(url, {
316
+ method: "GET",
317
+ headers: {
318
+ Authorization: `Bearer ${this.config.api_key}`
355
319
  }
356
- catch (err) {
357
- this.messagesFailed++;
358
- console.error(`[relay] Failed after retries:`, err.message);
359
- captureError({
360
- error: err instanceof Error ? err : new Error(String(err)),
361
- severity: "error",
362
- tags: { source: "whale-node", operation: "relay", node_id: this.config.node_id, channel_id: channelId },
363
- });
320
+ }, 1); // Only 1 retry for polling (runs every 2s anyway)
321
+
322
+ if (!res.ok) return;
323
+ const data = await res.json();
324
+ if (!data.success || !data.messages?.length) return;
325
+ for (const msg of data.messages) {
326
+ const outMsg = {
327
+ id: msg.id,
328
+ content: msg.content || "",
329
+ sender_id: msg.sender_id || "agent",
330
+ conversation_id: msg.conversation_id,
331
+ metadata: msg.metadata
332
+ };
333
+ const delivered = await adapter.sendMessage(outMsg);
334
+ if (delivered) {
335
+ await this.markDelivered(channelId, msg.id);
336
+ console.log(`[poll] Delivered queued message ${msg.id}`);
364
337
  }
338
+ }
339
+ } catch {
340
+ // Silent — polling errors are expected during connectivity blips
365
341
  }
366
- async markDelivered(channelId, messageId) {
367
- try {
368
- await this.fetchWithRetry(`${this.config.server_url}/channels/${channelId}/messages/${messageId}/delivered`, {
369
- method: "POST",
370
- headers: {
371
- "Content-Type": "application/json",
372
- Authorization: `Bearer ${this.config.api_key}`,
373
- },
374
- }, 1);
342
+ }
343
+
344
+ /** Relay inbound and deliver response synchronously with retry */
345
+ async relayAndDeliver(channelId, msg) {
346
+ try {
347
+ const res = await this.fetchWithRetry(`${this.config.server_url}/channels/${channelId}/messages`, {
348
+ method: "POST",
349
+ headers: {
350
+ "Content-Type": "application/json",
351
+ Authorization: `Bearer ${this.config.api_key}`
352
+ },
353
+ body: JSON.stringify({
354
+ direction: "inbound",
355
+ ...msg
356
+ })
357
+ });
358
+ const data = await res.json();
359
+ this.messagesRelayed++;
360
+ if (data.success && data.agent_response) {
361
+ const adapter = this.adapters.get(channelId);
362
+ if (adapter) {
363
+ const outMsg = {
364
+ id: data.agent_response.id,
365
+ content: data.agent_response.content,
366
+ sender_id: "agent",
367
+ conversation_id: data.conversation_id || data.agent_response.conversation_id,
368
+ metadata: msg.metadata
369
+ };
370
+ const delivered = await adapter.sendMessage(outMsg);
371
+ if (delivered) {
372
+ await this.markDelivered(channelId, data.agent_response.id);
373
+ }
375
374
  }
376
- catch {
377
- // Best effort — message was already delivered to user
375
+ }
376
+ } catch (err) {
377
+ this.messagesFailed++;
378
+ console.error(`[relay] Failed after retries:`, err.message);
379
+ captureError({
380
+ error: err instanceof Error ? err : new Error(String(err)),
381
+ severity: "error",
382
+ tags: {
383
+ source: "whale-node",
384
+ operation: "relay",
385
+ node_id: this.config.node_id,
386
+ channel_id: channelId
378
387
  }
388
+ });
379
389
  }
380
- async sendHeartbeat() {
381
- try {
382
- const channelStatuses = Array.from(this.adapters.entries()).map(([, adapter]) => {
383
- const base = {
384
- type: adapter.type,
385
- name: adapter.name,
386
- status: adapter.isRunning() ? "active" : "error",
387
- stats: adapter.getStats(),
388
- };
389
- // Include diagnostics for iMessage adapters
390
- if (adapter.type === "imessage" && "getLastError" in adapter) {
391
- const imsg = adapter;
392
- base.last_error = imsg.getLastError();
393
- base.restart_attempts = imsg.getRestartAttempts();
394
- }
395
- return base;
396
- });
397
- const res = await this.fetchWithRetry(`${this.config.server_url}/nodes/heartbeat`, {
398
- method: "POST",
399
- headers: {
400
- "Content-Type": "application/json",
401
- Authorization: `Bearer ${this.config.api_key}`,
402
- },
403
- body: JSON.stringify({
404
- hardware: getHardwareInfo(),
405
- capabilities: getCapabilities(),
406
- version: VERSION,
407
- channels: channelStatuses,
408
- runtime_stats: {
409
- uptime_seconds: this.startedAt ? Math.floor((Date.now() - this.startedAt.getTime()) / 1000) : 0,
410
- messages_relayed: this.messagesRelayed,
411
- messages_failed: this.messagesFailed,
412
- status: this.status,
413
- },
414
- }),
415
- }, 2);
416
- if (res.ok) {
417
- this.heartbeatsSent++;
418
- return true;
419
- }
420
- console.warn(`[heartbeat] Server returned ${res.status}`);
421
- this.heartbeatsFailed++;
422
- return false;
390
+ }
391
+ async markDelivered(channelId, messageId) {
392
+ try {
393
+ await this.fetchWithRetry(`${this.config.server_url}/channels/${channelId}/messages/${messageId}/delivered`, {
394
+ method: "POST",
395
+ headers: {
396
+ "Content-Type": "application/json",
397
+ Authorization: `Bearer ${this.config.api_key}`
423
398
  }
424
- catch (err) {
425
- console.warn(`[heartbeat] Failed:`, err.message);
426
- this.heartbeatsFailed++;
427
- // Only capture after multiple consecutive failures to avoid noise
428
- if (this.consecutiveServerFailures >= 3) {
429
- captureError({
430
- error: err instanceof Error ? err : new Error(String(err)),
431
- severity: "warning",
432
- tags: { source: "whale-node", operation: "heartbeat", node_id: this.config.node_id, failures: String(this.consecutiveServerFailures) },
433
- });
434
- }
435
- return false;
399
+ }, 1 // 1 retry for delivery confirmation
400
+ );
401
+ } catch {
402
+ // Best effort message was already delivered to user
403
+ }
404
+ }
405
+ async sendHeartbeat() {
406
+ try {
407
+ const channelStatuses = Array.from(this.adapters.entries()).map(([, adapter]) => {
408
+ const base = {
409
+ type: adapter.type,
410
+ name: adapter.name,
411
+ status: adapter.isRunning() ? "active" : "error",
412
+ stats: adapter.getStats()
413
+ };
414
+ // Include diagnostics for iMessage adapters
415
+ if (adapter.type === "imessage" && "getLastError" in adapter) {
416
+ const imsg = adapter;
417
+ base.last_error = imsg.getLastError();
418
+ base.restart_attempts = imsg.getRestartAttempts();
436
419
  }
420
+ return base;
421
+ });
422
+ const res = await this.fetchWithRetry(`${this.config.server_url}/nodes/heartbeat`, {
423
+ method: "POST",
424
+ headers: {
425
+ "Content-Type": "application/json",
426
+ Authorization: `Bearer ${this.config.api_key}`
427
+ },
428
+ body: JSON.stringify({
429
+ hardware: getHardwareInfo(),
430
+ capabilities: getCapabilities(),
431
+ version: VERSION,
432
+ channels: channelStatuses,
433
+ runtime_stats: {
434
+ uptime_seconds: this.startedAt ? Math.floor((Date.now() - this.startedAt.getTime()) / 1000) : 0,
435
+ messages_relayed: this.messagesRelayed,
436
+ messages_failed: this.messagesFailed,
437
+ status: this.status
438
+ }
439
+ })
440
+ }, 2 // 2 retries for heartbeat
441
+ );
442
+ if (res.ok) {
443
+ this.heartbeatsSent++;
444
+ return true;
445
+ }
446
+ console.warn(`[heartbeat] Server returned ${res.status}`);
447
+ this.heartbeatsFailed++;
448
+ return false;
449
+ } catch (err) {
450
+ console.warn(`[heartbeat] Failed:`, err.message);
451
+ this.heartbeatsFailed++;
452
+ // Only capture after multiple consecutive failures to avoid noise
453
+ if (this.consecutiveServerFailures >= 3) {
454
+ captureError({
455
+ error: err instanceof Error ? err : new Error(String(err)),
456
+ severity: "warning",
457
+ tags: {
458
+ source: "whale-node",
459
+ operation: "heartbeat",
460
+ node_id: this.config.node_id,
461
+ failures: String(this.consecutiveServerFailures)
462
+ }
463
+ });
464
+ }
465
+ return false;
437
466
  }
467
+ }
438
468
  }
439
469
  function sleep(ms) {
440
- return new Promise(resolve => setTimeout(resolve, ms));
470
+ return new Promise(resolve => setTimeout(resolve, ms));
441
471
  }
442
472
  function getHardwareInfo() {
443
- return {
444
- os: process.platform === "darwin" ? "macOS" : process.platform,
445
- arch: process.arch,
446
- cpu: cpus()[0]?.model || "unknown",
447
- cores: cpus().length,
448
- ram_gb: Math.round(totalmem() / (1024 ** 3)),
449
- hostname: hostname(),
450
- };
473
+ const totalMem = totalmem();
474
+ const freeMem = freemem();
475
+ const usedMem = totalMem - freeMem;
476
+ return {
477
+ // Static specs
478
+ os: process.platform === "darwin" ? "macOS" : process.platform,
479
+ arch: process.arch,
480
+ cpu: cpus()[0]?.model || "unknown",
481
+ cores: cpus().length,
482
+ ram_gb: Math.round(totalMem / 1024 ** 3),
483
+ hostname: hostname(),
484
+ // Live utilization
485
+ mem_used_gb: parseFloat((usedMem / 1024 ** 3).toFixed(1)),
486
+ mem_free_gb: parseFloat((freeMem / 1024 ** 3).toFixed(1)),
487
+ mem_usage_percent: Math.round(usedMem / totalMem * 100),
488
+ cpu_usage_percent: getCpuUsagePercent(),
489
+ load_avg_1m: parseFloat(loadavg()[0].toFixed(2)),
490
+ disk_usage_percent: getDiskUsagePercent()
491
+ };
451
492
  }
452
- function getCapabilities() {
453
- const caps = ["messaging", "discord", "slack", "telegram", "webchat", "whatsapp", "sms", "email", "portal"];
454
- if (process.platform === "darwin") {
455
- caps.push("imessage");
456
- caps.push("remote_desktop");
493
+
494
+ /** Calculate CPU usage from per-core idle vs total ticks */
495
+ function getCpuUsagePercent() {
496
+ const cores = cpus();
497
+ let totalIdle = 0;
498
+ let totalTick = 0;
499
+ for (const core of cores) {
500
+ const {
501
+ user,
502
+ nice,
503
+ sys,
504
+ idle,
505
+ irq
506
+ } = core.times;
507
+ totalTick += user + nice + sys + idle + irq;
508
+ totalIdle += idle;
509
+ }
510
+ return totalTick > 0 ? Math.round((totalTick - totalIdle) / totalTick * 100) : 0;
511
+ }
512
+
513
+ /** Get root disk usage percent (works on macOS + Linux) */
514
+ function getDiskUsagePercent() {
515
+ try {
516
+ const output = execSync("df -k / | tail -1", {
517
+ timeout: 3000
518
+ }).toString().trim();
519
+ const parts = output.split(/\s+/);
520
+ // df output: Filesystem 1K-blocks Used Available Use% Mounted
521
+ const capacityStr = parts.find(p => p.endsWith("%"));
522
+ if (capacityStr) return parseInt(capacityStr, 10);
523
+ // Fallback: compute from used/available
524
+ if (parts.length >= 4) {
525
+ const used = parseInt(parts[2], 10);
526
+ const available = parseInt(parts[3], 10);
527
+ if (used + available > 0) return Math.round(used / (used + available) * 100);
457
528
  }
458
- return caps;
529
+ return 0;
530
+ } catch {
531
+ return 0;
532
+ }
533
+ }
534
+ function getCapabilities() {
535
+ const caps = ["messaging", "discord", "slack", "telegram", "webchat", "whatsapp", "sms", "email", "portal"];
536
+ if (process.platform === "darwin") {
537
+ caps.push("imessage");
538
+ caps.push("remote_desktop");
539
+ }
540
+ return caps;
459
541
  }
542
+ //# sourceMappingURL=runtime.js.map