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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve-mode.js","names":["createServer","WebSocketServer","WebSocket","runAgentLoop","setModel","setPermissionMode","resetSessionState","getModel","estimateCostUsd","AgentEventEmitter","resolveConfig","createClient","getValidToken","createAuthenticatedClient","loadServerToolDefinitions","LOCAL_TOOL_DEFINITIONS","createRequire","require","import","meta","url","PKG_VERSION","version","supabase","supabaseCreatedAt","SUPABASE_TTL_MS","getSupabase","now","Date","config","supabaseUrl","supabaseKey","process","env","SUPABASE_SERVICE_ROLE_KEY","auth","autoRefreshToken","persistSession","token","createConversation","storeId","title","agentName","db","data","error","from","insert","store_id","substring","metadata","source","status","select","single","console","message","id","err","appendMessage","conversationId","role","content","tokenCount","toolNames","conversation_id","type","text","is_tool_use","length","tool_names","token_count","updateConversationMetadata","eq","existing","update","updated_at","toISOString","loadConversation","messages","listConversations","limit","order","ascending","map","c","agentId","agent_id","messageCount","turn_count","createdAt","created_at","updatedAt","getToolList","tools","t","push","name","description","category","serverTools","some","send","ws","readyState","OPEN","JSON","stringify","sendDebug","level","handleQuery","session","msg","opts","prompt","rawAttachments","attachments","images","filter","att","media_type","base64","mediaType","requestedConvId","clientHistory","conversationHistory","m","trim","model","conversation","abortController","AbortController","totalIn","totalOut","lastCostUsd","fullText","toolsUsed","startTime","emitter","forwardTypes","Set","eventHandler","event","has","on","callbacks","onText","onToolStart","input","includes","tool","onToolResult","success","result","_input","durationMs","wireResult","undefined","duration_ms","onUsage","input_tokens","output_tokens","_thinking_tokens","_model","costUsd","onDone","finalMessages","onError","onAutoCompact","before","after","tokensSaved","loopOpts","abortSignal","signal","maxTurns","maxBudgetUsd","effort","allowedTools","enabledTools","disallowedTools","fallbackModel","totalInputTokens","totalOutputTokens","totalCost","lastTurnTokens","output","lastToolCalls","lastDurationMs","usage","inputTokens","outputTokens","errorMsg","Error","String","aborted","off","handleConnection","verbose","log","toString","parse","abort","toolList","conversations","convs","convId","conv","runServeMode","permissionMode","port","host","server","req","res","method","writeHead","end","uptime","Math","floor","wss","shutdown","clients","forEach","client","close","exit","setTimeout","then","Promise","resolve","reject","code","listen","d","B","r"],"sources":["../../src/cli/serve-mode.ts"],"sourcesContent":["/**\n * Serve Mode — WebSocket agent server for WhaleChat desktop app\n *\n * Speaks the exact bidirectional JSON protocol that AgentClient.swift expects.\n * Runs the full agent loop with all local + server tools.\n *\n * Usage:\n * whale serve Start on default port 3847\n * whale serve --port 6090 Custom port\n * whale serve --host 0.0.0.0 Bind to all interfaces\n *\n * Protocol: WebSocket (ws://host:port)\n *\n * Client → Server messages:\n * query, abort, ping, get_tools, new_conversation, load_conversation, get_conversations\n *\n * Server → Client messages:\n * ready, started, text, tool_start, tool_result, done, error, aborted,\n * pong, tools, debug, conversation_created, conversations, conversation_loaded,\n * subagent_start, subagent_progress, subagent_done, subagent_tool_start, subagent_tool_end,\n * team_start, team_progress, team_task, team_done\n */\n\nimport { createServer } from \"http\";\nimport { WebSocketServer, WebSocket } from \"ws\";\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport {\n runAgentLoop,\n setModel,\n setPermissionMode,\n resetSessionState,\n getModel,\n estimateCostUsd,\n AgentEventEmitter,\n type AgentLoopCallbacks,\n type AgentLoopOptions,\n} from \"./services/agent-loop.js\";\nimport { resolveConfig } from \"./services/config-store.js\";\nimport { createClient, type SupabaseClient } from \"@supabase/supabase-js\";\nimport { getValidToken, createAuthenticatedClient } from \"./services/auth-service.js\";\nimport { loadServerToolDefinitions } from \"./services/server-tools.js\";\nimport { LOCAL_TOOL_DEFINITIONS } from \"./services/local-tools.js\";\nimport { createRequire } from \"module\";\n\nconst require = createRequire(import.meta.url);\nconst PKG_VERSION: string = require(\"../../package.json\").version;\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ServeModeOptions {\n port: number;\n host: string;\n model?: string;\n permissionMode?: string;\n effort?: string;\n allowedTools?: string[];\n disallowedTools?: string[];\n maxTurns?: number;\n maxBudgetUsd?: number;\n fallbackModel?: string;\n debug?: boolean;\n verbose?: boolean;\n}\n\ninterface ClientSession {\n ws: WebSocket;\n abortController: AbortController | null;\n conversationHistory: Anthropic.MessageParam[];\n conversationId: string | null;\n totalInputTokens: number;\n totalOutputTokens: number;\n}\n\n// ============================================================================\n// SUPABASE CLIENT (for conversation persistence)\n// ============================================================================\n\nlet supabase: SupabaseClient | null = null;\nlet supabaseCreatedAt = 0;\nconst SUPABASE_TTL_MS = 45 * 60 * 1000; // Refresh client every 45 min (JWT expires ~60 min)\n\nasync function getSupabase(): Promise<SupabaseClient | null> {\n const now = Date.now();\n\n // Return cached client if still fresh\n if (supabase && (now - supabaseCreatedAt) < SUPABASE_TTL_MS) return supabase;\n\n // Invalidate stale client\n supabase = null;\n\n const config = resolveConfig();\n\n // Tier 1: Service role key (never expires)\n if (config.supabaseUrl && config.supabaseKey && process.env.SUPABASE_SERVICE_ROLE_KEY) {\n supabase = createClient(config.supabaseUrl, config.supabaseKey, {\n auth: { autoRefreshToken: false, persistSession: false },\n });\n supabaseCreatedAt = now;\n return supabase;\n }\n\n // Tier 2: User JWT — always get a fresh token\n try {\n const token = await getValidToken();\n if (token) {\n supabase = createAuthenticatedClient(token);\n supabaseCreatedAt = now;\n return supabase;\n }\n } catch {\n // Fall through\n }\n\n return null;\n}\n\n// ============================================================================\n// CONVERSATION PERSISTENCE\n// ============================================================================\n\nasync function createConversation(\n storeId: string | null,\n title: string,\n agentName?: string,\n): Promise<string | null> {\n const db = await getSupabase();\n if (!db) return null;\n\n try {\n const { data, error } = await db\n .from(\"ai_conversations\")\n .insert({\n store_id: storeId || null,\n title: title.substring(0, 100),\n metadata: {\n source: \"whale-serve\",\n agentName: agentName || \"whale\",\n },\n status: \"active\",\n })\n .select(\"id\")\n .single();\n\n if (error) {\n console.error(\"[serve] Failed to create conversation:\", error.message);\n return null;\n }\n return data?.id || null;\n } catch (err) {\n console.error(\"[serve] Conversation create error:\", err);\n return null;\n }\n}\n\nasync function appendMessage(\n conversationId: string,\n role: \"user\" | \"assistant\",\n content: string,\n tokenCount?: number,\n toolNames?: string[],\n): Promise<void> {\n const db = await getSupabase();\n if (!db || !conversationId) return;\n\n try {\n // Insert into ai_messages for individual message tracking\n await db.from(\"ai_messages\").insert({\n conversation_id: conversationId,\n role,\n content: [{ type: \"text\", text: content }],\n is_tool_use: (toolNames && toolNames.length > 0) || false,\n tool_names: toolNames || [],\n token_count: tokenCount || 0,\n });\n } catch {\n // Non-fatal — persistence is best-effort\n }\n}\n\nasync function updateConversationMetadata(\n conversationId: string,\n metadata: Record<string, unknown>,\n): Promise<void> {\n const db = await getSupabase();\n if (!db || !conversationId) return;\n\n try {\n // Fetch current metadata, merge, and update\n const { data } = await db\n .from(\"ai_conversations\")\n .select(\"metadata\")\n .eq(\"id\", conversationId)\n .single();\n\n const existing = (data?.metadata as Record<string, unknown>) || {};\n await db\n .from(\"ai_conversations\")\n .update({ metadata: { ...existing, ...metadata }, updated_at: new Date().toISOString() })\n .eq(\"id\", conversationId);\n } catch {\n // Non-fatal\n }\n}\n\nasync function loadConversation(\n conversationId: string,\n): Promise<{ id: string; title: string; messages: Record<string, unknown>[] } | null> {\n const db = await getSupabase();\n if (!db) return null;\n\n try {\n const { data, error } = await db\n .from(\"ai_conversations\")\n .select(\"id, title, messages\")\n .eq(\"id\", conversationId)\n .single();\n\n if (error || !data) return null;\n return {\n id: data.id,\n title: data.title || \"Untitled\",\n messages: (data.messages as Record<string, unknown>[]) || [],\n };\n } catch {\n return null;\n }\n}\n\nasync function listConversations(\n storeId: string,\n limit: number = 20,\n): Promise<Record<string, unknown>[]> {\n const db = await getSupabase();\n if (!db) return [];\n\n try {\n const { data, error } = await db\n .from(\"ai_conversations\")\n .select(\"id, title, agent_id, metadata, turn_count, created_at, updated_at\")\n .eq(\"store_id\", storeId)\n .order(\"updated_at\", { ascending: false })\n .limit(limit);\n\n if (error || !data) return [];\n return data.map((c) => ({\n id: c.id,\n title: c.title || \"Untitled\",\n agentId: c.agent_id || null,\n agentName: (c.metadata as Record<string, unknown>)?.agentName || null,\n messageCount: c.turn_count || 0,\n createdAt: c.created_at,\n updatedAt: c.updated_at,\n }));\n } catch {\n return [];\n }\n}\n\n// ============================================================================\n// TOOL LIST (for ready/tools messages)\n// ============================================================================\n\nasync function getToolList(): Promise<{ id: string; name: string; description: string; category: string }[]> {\n const tools: { id: string; name: string; description: string; category: string }[] = [];\n\n // Local tools\n for (const t of LOCAL_TOOL_DEFINITIONS) {\n tools.push({\n id: `local-${t.name}`,\n name: t.name,\n description: t.description,\n category: \"local\",\n });\n }\n\n // Server tools\n try {\n const serverTools = await loadServerToolDefinitions();\n for (const t of serverTools) {\n if (!tools.some((existing) => existing.name === t.name)) {\n tools.push({\n id: `server-${t.name}`,\n name: t.name,\n description: t.description || \"\",\n category: \"server\",\n });\n }\n }\n } catch {\n // Server tools unavailable — local-only mode\n }\n\n return tools;\n}\n\n// ============================================================================\n// WEBSOCKET MESSAGE HELPERS\n// ============================================================================\n\nfunction send(ws: WebSocket, message: Record<string, unknown>): void {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(message));\n }\n}\n\nfunction sendDebug(ws: WebSocket, level: string, message: string, data?: Record<string, unknown>): void {\n send(ws, { type: \"debug\", level, message, data });\n}\n\n// ============================================================================\n// QUERY HANDLER — runs the full agent loop\n// ============================================================================\n\nasync function handleQuery(\n session: ClientSession,\n msg: Record<string, unknown>,\n opts: ServeModeOptions,\n): Promise<void> {\n const { ws } = session;\n const prompt = msg.prompt as string;\n if (!prompt) {\n send(ws, { type: \"error\", error: \"Missing 'prompt' field\" });\n return;\n }\n\n // Extract image attachments sent by WhaleChat\n const rawAttachments = (msg.attachments as Array<{ type: string; media_type?: string; data?: string }>) || [];\n const images = rawAttachments\n .filter(att => att.type === \"image\" && att.media_type && att.data)\n .map(att => ({ base64: att.data!, mediaType: att.media_type! }));\n\n const storeId = (msg.storeId as string) || resolveConfig().storeId || null;\n const config = (msg.config as Record<string, unknown>) || {};\n const requestedConvId = (msg.conversationId as string) || session.conversationId;\n\n // Restore conversation history from client if session is fresh (new WS connection)\n const clientHistory = msg.conversationHistory as Array<{ role: string; content: string }> | undefined;\n if (session.conversationHistory.length === 0 && clientHistory && clientHistory.length > 0) {\n session.conversationHistory = clientHistory\n .filter((m) => m.content && m.content.trim().length > 0)\n .map((m) => ({\n role: m.role as \"user\" | \"assistant\",\n content: m.content,\n })) as Anthropic.MessageParam[];\n }\n\n // Apply model from config or server defaults\n const model = (config.model as string) || opts.model;\n if (model) setModel(model);\n\n // Create or continue conversation\n let conversationId = requestedConvId;\n if (!conversationId) {\n conversationId = await createConversation(storeId, prompt, config.agentName as string);\n if (conversationId) {\n send(ws, {\n type: \"conversation_created\",\n conversation: {\n id: conversationId,\n title: prompt.substring(0, 100),\n agentId: config.agentId || null,\n agentName: config.agentName || \"whale\",\n messageCount: 0,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n },\n });\n }\n }\n session.conversationId = conversationId;\n\n // Persist user message\n if (conversationId) {\n appendMessage(conversationId, \"user\", prompt);\n }\n\n // Signal started\n send(ws, {\n type: \"started\",\n model: getModel(),\n conversationId,\n });\n\n // Set up abort controller\n const abortController = new AbortController();\n session.abortController = abortController;\n\n let totalIn = 0;\n let totalOut = 0;\n let lastCostUsd = 0;\n let fullText = \"\";\n const toolsUsed: string[] = [];\n const startTime = Date.now();\n\n // Create event emitter for subagent/team events → forward to WebSocket\n const emitter = new AgentEventEmitter();\n const forwardTypes = new Set([\n \"subagent_start\", \"subagent_progress\", \"subagent_done\",\n \"subagent_tool_start\", \"subagent_tool_end\",\n \"team_start\", \"team_progress\", \"team_task\", \"team_done\",\n ]);\n const eventHandler = (event: { type: string; [key: string]: unknown }) => {\n if (event.type === \"text\") {\n // Emitter captures text events — forward them to WebSocket + accumulate\n const text = event.text as string;\n if (text) { fullText += text; send(ws, { type: \"text\", text }); }\n } else if (forwardTypes.has(event.type)) {\n send(ws, event as Record<string, unknown>);\n }\n };\n emitter.on(\"event\", eventHandler);\n\n try {\n const callbacks: AgentLoopCallbacks = {\n onText: (text: string) => {\n fullText += text;\n send(ws, { type: \"text\", text });\n },\n\n onToolStart: (name: string, input?: Record<string, unknown>) => {\n if (!toolsUsed.includes(name)) toolsUsed.push(name);\n send(ws, { type: \"tool_start\", tool: name, input: input || {} });\n },\n\n onToolResult: (\n name: string,\n success: boolean,\n result: unknown,\n _input?: Record<string, unknown>,\n durationMs?: number,\n ) => {\n // Truncate large results for the wire\n let wireResult = result;\n if (typeof result === \"string\" && result.length > 10000) {\n wireResult = result.substring(0, 10000) + \"\\n... (truncated)\";\n }\n send(ws, {\n type: \"tool_result\",\n tool: name,\n success,\n result: wireResult,\n error: success ? undefined : (typeof result === \"string\" ? result : \"Tool failed\"),\n duration_ms: durationMs,\n });\n },\n\n onUsage: (input_tokens: number, output_tokens: number, _thinking_tokens?: number, _model?: string, costUsd?: number) => {\n totalIn += input_tokens;\n totalOut += output_tokens;\n if (costUsd != null) lastCostUsd = costUsd;\n },\n\n onDone: (finalMessages: Anthropic.MessageParam[]) => {\n session.conversationHistory = finalMessages;\n },\n\n onError: (error: string) => {\n send(ws, { type: \"error\", error });\n },\n\n onAutoCompact: (before: number, after: number, tokensSaved: number) => {\n sendDebug(ws, \"info\", `Context compacted: ${before} → ${after} messages (saved ~${tokensSaved} tokens)`);\n },\n };\n\n const loopOpts: AgentLoopOptions = {\n message: prompt,\n images: images.length > 0 ? images : undefined,\n conversationHistory: session.conversationHistory,\n callbacks,\n abortSignal: abortController.signal,\n emitter,\n maxTurns: (config.maxTurns as number) || opts.maxTurns,\n maxBudgetUsd: opts.maxBudgetUsd,\n effort: (opts.effort || \"medium\") as \"low\" | \"medium\" | \"high\",\n allowedTools: (config.enabledTools as string[]) || opts.allowedTools,\n disallowedTools: opts.disallowedTools,\n fallbackModel: opts.fallbackModel,\n };\n\n await runAgentLoop(loopOpts);\n\n // Calculate cost\n session.totalInputTokens += totalIn;\n session.totalOutputTokens += totalOut;\n const totalCost = lastCostUsd || estimateCostUsd(session.totalInputTokens, session.totalOutputTokens);\n const durationMs = Date.now() - startTime;\n\n // Persist assistant response\n if (conversationId && fullText) {\n appendMessage(conversationId, \"assistant\", fullText, totalOut, toolsUsed);\n }\n\n // Update conversation metadata\n if (conversationId) {\n updateConversationMetadata(conversationId, {\n lastTurnTokens: { input: totalIn, output: totalOut },\n lastToolCalls: toolsUsed,\n lastDurationMs: durationMs,\n model: getModel(),\n });\n }\n\n // Send done\n send(ws, {\n type: \"done\",\n status: \"complete\",\n conversationId: conversationId || \"\",\n usage: {\n inputTokens: session.totalInputTokens,\n outputTokens: session.totalOutputTokens,\n totalCost,\n },\n });\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n if (abortController.signal.aborted) {\n send(ws, { type: \"aborted\" });\n } else {\n send(ws, { type: \"error\", error: errorMsg });\n }\n } finally {\n emitter.off(\"event\", eventHandler);\n session.abortController = null;\n }\n}\n\n// ============================================================================\n// CONNECTION HANDLER\n// ============================================================================\n\nasync function handleConnection(ws: WebSocket, opts: ServeModeOptions): Promise<void> {\n const session: ClientSession = {\n ws,\n abortController: null,\n conversationHistory: [],\n conversationId: null,\n totalInputTokens: 0,\n totalOutputTokens: 0,\n };\n\n // Send ready with tool list\n const tools = await getToolList();\n send(ws, {\n type: \"ready\",\n version: PKG_VERSION,\n tools,\n });\n\n if (opts.verbose) {\n console.log(\"[serve] Client connected, sent ready with\", tools.length, \"tools\");\n }\n\n ws.on(\"message\", async (data: Buffer | string) => {\n let msg: Record<string, unknown>;\n try {\n const text = typeof data === \"string\" ? data : data.toString(\"utf-8\");\n msg = JSON.parse(text) as Record<string, unknown>;\n } catch {\n send(ws, { type: \"error\", error: \"Invalid JSON\" });\n return;\n }\n\n const type = msg.type as string;\n if (!type) {\n send(ws, { type: \"error\", error: \"Missing 'type' field\" });\n return;\n }\n\n switch (type) {\n case \"query\":\n await handleQuery(session, msg, opts);\n break;\n\n case \"abort\":\n if (session.abortController) {\n session.abortController.abort();\n // aborted message is sent by handleQuery's catch block\n }\n break;\n\n case \"ping\":\n send(ws, { type: \"pong\" });\n break;\n\n case \"get_tools\": {\n const toolList = await getToolList();\n send(ws, { type: \"tools\", tools: toolList });\n break;\n }\n\n case \"new_conversation\":\n session.conversationHistory = [];\n session.conversationId = null;\n session.totalInputTokens = 0;\n session.totalOutputTokens = 0;\n resetSessionState(); // Reset module-level token counters, caches\n if (opts.verbose) {\n console.log(\"[serve] New conversation started\");\n }\n break;\n\n case \"get_conversations\": {\n const storeId = msg.storeId as string;\n const limit = (msg.limit as number) || 20;\n if (!storeId) {\n send(ws, { type: \"conversations\", conversations: [] });\n break;\n }\n const convs = await listConversations(storeId, limit);\n send(ws, { type: \"conversations\", conversations: convs });\n break;\n }\n\n case \"load_conversation\": {\n const convId = msg.conversationId as string;\n if (!convId) {\n send(ws, { type: \"error\", error: \"Missing conversationId\" });\n break;\n }\n const conv = await loadConversation(convId);\n if (conv) {\n session.conversationId = conv.id;\n send(ws, {\n type: \"conversation_loaded\",\n conversationId: conv.id,\n title: conv.title,\n messages: conv.messages,\n });\n } else {\n send(ws, { type: \"error\", error: `Conversation not found: ${convId}` });\n }\n break;\n }\n\n default:\n if (opts.verbose) {\n console.log(\"[serve] Unknown message type:\", type);\n }\n break;\n }\n });\n\n ws.on(\"close\", () => {\n // Abort any running query when client disconnects\n if (session.abortController) {\n session.abortController.abort();\n }\n if (opts.verbose) {\n console.log(\"[serve] Client disconnected\");\n }\n });\n\n ws.on(\"error\", (err: Error) => {\n console.error(\"[serve] WebSocket error:\", err.message);\n if (session.abortController) {\n session.abortController.abort();\n }\n });\n}\n\n// ============================================================================\n// SERVER STARTUP\n// ============================================================================\n\nexport async function runServeMode(opts: ServeModeOptions): Promise<void> {\n // Apply global settings\n if (opts.model) setModel(opts.model);\n setPermissionMode((opts.permissionMode as \"default\" | \"plan\" | \"yolo\") || \"yolo\");\n\n const port = opts.port;\n const host = opts.host;\n\n // HTTP server for health check + WebSocket upgrade\n const server = createServer((req, res) => {\n // Health check endpoint\n if (req.method === \"GET\" && (req.url === \"/health\" || req.url === \"/\")) {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n status: \"ok\",\n version: PKG_VERSION,\n model: getModel(),\n port,\n uptime: Math.floor(process.uptime()),\n }),\n );\n return;\n }\n\n // Everything else: 404\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found. Connect via WebSocket.\" }));\n });\n\n // WebSocket server\n const wss = new WebSocketServer({ server });\n\n wss.on(\"connection\", (ws: WebSocket) => {\n handleConnection(ws, opts);\n });\n\n // Graceful shutdown\n const shutdown = () => {\n console.log(\"\\n[serve] Shutting down...\");\n wss.clients.forEach((client) => {\n if (client.readyState === WebSocket.OPEN) {\n client.close(1001, \"Server shutting down\");\n }\n });\n server.close(() => {\n console.log(\"[serve] Server stopped.\");\n process.exit(0);\n });\n // Force exit after 3s\n setTimeout(() => process.exit(0), 3000);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n // Verify Supabase connectivity (non-blocking)\n getSupabase().then((db) => {\n if (db) {\n console.log(\"[serve] Supabase connected — conversation persistence enabled\");\n } else {\n console.log(\"[serve] Supabase not configured — conversations are session-only\");\n }\n });\n\n // Start listening\n return new Promise<void>((resolve, reject) => {\n server.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\") {\n console.error(`[serve] Port ${port} is already in use.`);\n console.error(`[serve] Try: whale serve --port ${port + 1}`);\n process.exit(1);\n }\n reject(err);\n });\n\n server.listen(port, host, () => {\n const d = \"\\x1b[2m\";\n const B = \"\\x1b[1m\";\n const r = \"\\x1b[0m\";\n const c = \"\\x1b[38;2;99;102;241m\";\n\n console.log();\n console.log(` ${c}${B}◆ whale serve${r} ${d}v${PKG_VERSION}${r}`);\n console.log();\n console.log(` ${B}WebSocket${r} ${d}ws://${host}:${port}${r}`);\n console.log(` ${B}Health${r} ${d}http://${host}:${port}/health${r}`);\n console.log(` ${B}Model${r} ${d}${getModel()}${r}`);\n console.log(` ${B}Mode${r} ${d}yolo (local server trusts local client)${r}`);\n console.log();\n console.log(` ${d}WhaleChat will auto-connect on port 3847${r}`);\n console.log(` ${d}Press Ctrl+C to stop${r}`);\n console.log();\n\n resolve();\n });\n });\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Agent Config Loader — fetches agent settings from ai_agent_config (Supabase).
3
+ *
4
+ * Single source of truth: the DB record IS the config.
5
+ * Nothing is hardcoded — all behavioral knobs come from context_config JSONB.
6
+ * Cached for the session lifetime (5 min TTL) to avoid hammering the DB.
7
+ */
8
+ import type { AgentContextConfig } from "../../shared/agent-core.js";
9
+ export interface CLIAgentConfig {
10
+ id: string;
11
+ name: string;
12
+ model: string;
13
+ max_tokens: number;
14
+ max_tool_calls: number;
15
+ temperature: number;
16
+ context_config: AgentContextConfig | null;
17
+ }
18
+ /**
19
+ * Fetch the Whale Code agent's config from ai_agent_config.
20
+ * Uses the defaultAgentId from CLI config, or falls back to the known Whale Code UUID.
21
+ *
22
+ * Caching strategy:
23
+ * - Successful loads: cached for 5 minutes
24
+ * - Failed loads: retried after 15s backoff (does NOT cache null for 5 min)
25
+ * - If a previous success exists, returns stale cache on failure (graceful degradation)
26
+ */
27
+ export declare function loadCLIAgentConfig(): Promise<CLIAgentConfig | null>;
28
+ /** Clear the cache (e.g., on /clear or session reset) */
29
+ export declare function resetAgentConfigCache(): void;
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Agent Config Loader — fetches agent settings from ai_agent_config (Supabase).
3
+ *
4
+ * Single source of truth: the DB record IS the config.
5
+ * Nothing is hardcoded — all behavioral knobs come from context_config JSONB.
6
+ * Cached for the session lifetime (5 min TTL) to avoid hammering the DB.
7
+ */
8
+
9
+ import { createClient } from "@supabase/supabase-js";
10
+ import { resolveConfig } from "./config-store.js";
11
+
12
+ // ============================================================================
13
+ // TYPES
14
+ // ============================================================================
15
+
16
+ // ============================================================================
17
+ // CACHE
18
+ // ============================================================================
19
+
20
+ let cachedConfig = null;
21
+ let cacheTimestamp = 0;
22
+ let lastFailTimestamp = 0;
23
+ const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes for successful loads
24
+ const RETRY_BACKOFF_MS = 15_000; // 15s retry backoff after failures
25
+
26
+ /**
27
+ * Fetch the Whale Code agent's config from ai_agent_config.
28
+ * Uses the defaultAgentId from CLI config, or falls back to the known Whale Code UUID.
29
+ *
30
+ * Caching strategy:
31
+ * - Successful loads: cached for 5 minutes
32
+ * - Failed loads: retried after 15s backoff (does NOT cache null for 5 min)
33
+ * - If a previous success exists, returns stale cache on failure (graceful degradation)
34
+ */
35
+ export async function loadCLIAgentConfig() {
36
+ // Return valid cache if within TTL
37
+ if (cachedConfig && Date.now() - cacheTimestamp < CACHE_TTL_MS) {
38
+ return cachedConfig;
39
+ }
40
+
41
+ // Backoff after recent failure — return stale cache (may be null if never loaded)
42
+ if (!cachedConfig && lastFailTimestamp && Date.now() - lastFailTimestamp < RETRY_BACKOFF_MS) {
43
+ return null;
44
+ }
45
+ try {
46
+ const {
47
+ supabaseUrl,
48
+ supabaseKey,
49
+ defaultAgentId
50
+ } = resolveConfig();
51
+ if (!supabaseUrl || !supabaseKey) {
52
+ lastFailTimestamp = Date.now();
53
+ return cachedConfig;
54
+ }
55
+ const agentId = defaultAgentId || "72d7aaa8-2e8b-48a0-a38d-f332f69600bb";
56
+ const supabase = createClient(supabaseUrl, supabaseKey);
57
+ const {
58
+ data,
59
+ error
60
+ } = await supabase.from("ai_agent_config").select("id, name, model, max_tokens, max_tool_calls, temperature, context_config").eq("id", agentId).single();
61
+ if (error || !data) {
62
+ // DB error — retry after backoff, return stale cache if available
63
+ lastFailTimestamp = Date.now();
64
+ return cachedConfig;
65
+ }
66
+ cachedConfig = {
67
+ id: data.id,
68
+ name: data.name,
69
+ model: data.model,
70
+ max_tokens: data.max_tokens,
71
+ max_tool_calls: data.max_tool_calls,
72
+ temperature: data.temperature,
73
+ context_config: data.context_config
74
+ };
75
+ cacheTimestamp = Date.now();
76
+ lastFailTimestamp = 0; // Clear failure state on success
77
+ return cachedConfig;
78
+ } catch {
79
+ // Network failure, auth expired, etc. — never crash the CLI
80
+ lastFailTimestamp = Date.now();
81
+ return cachedConfig;
82
+ }
83
+ }
84
+
85
+ /** Clear the cache (e.g., on /clear or session reset) */
86
+ export function resetAgentConfigCache() {
87
+ cachedConfig = null;
88
+ cacheTimestamp = 0;
89
+ lastFailTimestamp = 0;
90
+ }
91
+ //# sourceMappingURL=agent-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-config.js","names":["createClient","resolveConfig","cachedConfig","cacheTimestamp","lastFailTimestamp","CACHE_TTL_MS","RETRY_BACKOFF_MS","loadCLIAgentConfig","Date","now","supabaseUrl","supabaseKey","defaultAgentId","agentId","supabase","data","error","from","select","eq","single","id","name","model","max_tokens","max_tool_calls","temperature","context_config","resetAgentConfigCache"],"sources":["../../../src/cli/services/agent-config.ts"],"sourcesContent":["/**\n * Agent Config Loader — fetches agent settings from ai_agent_config (Supabase).\n *\n * Single source of truth: the DB record IS the config.\n * Nothing is hardcoded — all behavioral knobs come from context_config JSONB.\n * Cached for the session lifetime (5 min TTL) to avoid hammering the DB.\n */\n\nimport { createClient } from \"@supabase/supabase-js\";\nimport { resolveConfig } from \"./config-store.js\";\nimport type { AgentContextConfig } from \"../../shared/agent-core.js\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface CLIAgentConfig {\n id: string;\n name: string;\n model: string;\n max_tokens: number;\n max_tool_calls: number;\n temperature: number;\n context_config: AgentContextConfig | null;\n}\n\n// ============================================================================\n// CACHE\n// ============================================================================\n\nlet cachedConfig: CLIAgentConfig | null = null;\nlet cacheTimestamp = 0;\nlet lastFailTimestamp = 0;\nconst CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes for successful loads\nconst RETRY_BACKOFF_MS = 15_000; // 15s retry backoff after failures\n\n/**\n * Fetch the Whale Code agent's config from ai_agent_config.\n * Uses the defaultAgentId from CLI config, or falls back to the known Whale Code UUID.\n *\n * Caching strategy:\n * - Successful loads: cached for 5 minutes\n * - Failed loads: retried after 15s backoff (does NOT cache null for 5 min)\n * - If a previous success exists, returns stale cache on failure (graceful degradation)\n */\nexport async function loadCLIAgentConfig(): Promise<CLIAgentConfig | null> {\n // Return valid cache if within TTL\n if (cachedConfig && Date.now() - cacheTimestamp < CACHE_TTL_MS) {\n return cachedConfig;\n }\n\n // Backoff after recent failure — return stale cache (may be null if never loaded)\n if (!cachedConfig && lastFailTimestamp && Date.now() - lastFailTimestamp < RETRY_BACKOFF_MS) {\n return null;\n }\n\n try {\n const { supabaseUrl, supabaseKey, defaultAgentId } = resolveConfig();\n if (!supabaseUrl || !supabaseKey) {\n lastFailTimestamp = Date.now();\n return cachedConfig;\n }\n\n const agentId = defaultAgentId || \"72d7aaa8-2e8b-48a0-a38d-f332f69600bb\";\n\n const supabase = createClient(supabaseUrl, supabaseKey);\n const { data, error } = await supabase\n .from(\"ai_agent_config\")\n .select(\"id, name, model, max_tokens, max_tool_calls, temperature, context_config\")\n .eq(\"id\", agentId)\n .single();\n\n if (error || !data) {\n // DB error — retry after backoff, return stale cache if available\n lastFailTimestamp = Date.now();\n return cachedConfig;\n }\n\n cachedConfig = {\n id: data.id,\n name: data.name,\n model: data.model,\n max_tokens: data.max_tokens,\n max_tool_calls: data.max_tool_calls,\n temperature: data.temperature,\n context_config: data.context_config,\n };\n cacheTimestamp = Date.now();\n lastFailTimestamp = 0; // Clear failure state on success\n return cachedConfig;\n } catch {\n // Network failure, auth expired, etc. — never crash the CLI\n lastFailTimestamp = Date.now();\n return cachedConfig;\n }\n}\n\n/** Clear the cache (e.g., on /clear or session reset) */\nexport function resetAgentConfigCache(): void {\n cachedConfig = null;\n cacheTimestamp = 0;\n lastFailTimestamp = 0;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,YAAY,QAAQ,uBAAuB;AACpD,SAASC,aAAa,QAAQ,mBAAmB;;AAGjD;AACA;AACA;;AAYA;AACA;AACA;;AAEA,IAAIC,YAAmC,GAAG,IAAI;AAC9C,IAAIC,cAAc,GAAG,CAAC;AACtB,IAAIC,iBAAiB,GAAG,CAAC;AACzB,MAAMC,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAG;AACtC,MAAMC,gBAAgB,GAAG,MAAM,CAAC,CAAQ;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,kBAAkBA,CAAA,EAAmC;EACzE;EACA,IAAIL,YAAY,IAAIM,IAAI,CAACC,GAAG,CAAC,CAAC,GAAGN,cAAc,GAAGE,YAAY,EAAE;IAC9D,OAAOH,YAAY;EACrB;;EAEA;EACA,IAAI,CAACA,YAAY,IAAIE,iBAAiB,IAAII,IAAI,CAACC,GAAG,CAAC,CAAC,GAAGL,iBAAiB,GAAGE,gBAAgB,EAAE;IAC3F,OAAO,IAAI;EACb;EAEA,IAAI;IACF,MAAM;MAAEI,WAAW;MAAEC,WAAW;MAAEC;IAAe,CAAC,GAAGX,aAAa,CAAC,CAAC;IACpE,IAAI,CAACS,WAAW,IAAI,CAACC,WAAW,EAAE;MAChCP,iBAAiB,GAAGI,IAAI,CAACC,GAAG,CAAC,CAAC;MAC9B,OAAOP,YAAY;IACrB;IAEA,MAAMW,OAAO,GAAGD,cAAc,IAAI,sCAAsC;IAExE,MAAME,QAAQ,GAAGd,YAAY,CAACU,WAAW,EAAEC,WAAW,CAAC;IACvD,MAAM;MAAEI,IAAI;MAAEC;IAAM,CAAC,GAAG,MAAMF,QAAQ,CACnCG,IAAI,CAAC,iBAAiB,CAAC,CACvBC,MAAM,CAAC,0EAA0E,CAAC,CAClFC,EAAE,CAAC,IAAI,EAAEN,OAAO,CAAC,CACjBO,MAAM,CAAC,CAAC;IAEX,IAAIJ,KAAK,IAAI,CAACD,IAAI,EAAE;MAClB;MACAX,iBAAiB,GAAGI,IAAI,CAACC,GAAG,CAAC,CAAC;MAC9B,OAAOP,YAAY;IACrB;IAEAA,YAAY,GAAG;MACbmB,EAAE,EAAEN,IAAI,CAACM,EAAE;MACXC,IAAI,EAAEP,IAAI,CAACO,IAAI;MACfC,KAAK,EAAER,IAAI,CAACQ,KAAK;MACjBC,UAAU,EAAET,IAAI,CAACS,UAAU;MAC3BC,cAAc,EAAEV,IAAI,CAACU,cAAc;MACnCC,WAAW,EAAEX,IAAI,CAACW,WAAW;MAC7BC,cAAc,EAAEZ,IAAI,CAACY;IACvB,CAAC;IACDxB,cAAc,GAAGK,IAAI,CAACC,GAAG,CAAC,CAAC;IAC3BL,iBAAiB,GAAG,CAAC,CAAC,CAAC;IACvB,OAAOF,YAAY;EACrB,CAAC,CAAC,MAAM;IACN;IACAE,iBAAiB,GAAGI,IAAI,CAACC,GAAG,CAAC,CAAC;IAC9B,OAAOP,YAAY;EACrB;AACF;;AAEA;AACA,OAAO,SAAS0B,qBAAqBA,CAAA,EAAS;EAC5C1B,YAAY,GAAG,IAAI;EACnBC,cAAc,GAAG,CAAC;EAClBC,iBAAiB,GAAG,CAAC;AACvB","ignoreList":[]}
@@ -11,7 +11,7 @@
11
11
  * You are a security review agent...
12
12
  *
13
13
  * Load order:
14
- * 1. ~/.swagmanager/agents/*.md (global)
14
+ * 1. ~/.whale/agents/*.md (global)
15
15
  * 2. .whale/agents/*.md (local, overrides global)
16
16
  */
17
17
  export interface AgentDefinition {
@@ -19,6 +19,9 @@ export interface AgentDefinition {
19
19
  prompt: string;
20
20
  description?: string;
21
21
  tools?: string[];
22
+ model?: string;
23
+ max_tokens?: number;
24
+ temperature?: number;
22
25
  source: "global" | "local";
23
26
  }
24
27
  export declare function loadAgentDefinitions(): AgentDefinition[];
@@ -11,81 +11,122 @@
11
11
  * You are a security review agent...
12
12
  *
13
13
  * Load order:
14
- * 1. ~/.swagmanager/agents/*.md (global)
14
+ * 1. ~/.whale/agents/*.md (global)
15
15
  * 2. .whale/agents/*.md (local, overrides global)
16
16
  */
17
+
17
18
  import { existsSync, readdirSync, readFileSync } from "fs";
18
19
  import { join, basename } from "path";
19
20
  import { homedir } from "os";
21
+
22
+ // ============================================================================
23
+ // TYPES
24
+ // ============================================================================
25
+
20
26
  // ============================================================================
21
27
  // PATHS
22
28
  // ============================================================================
23
- const GLOBAL_AGENTS_DIR = join(homedir(), ".swagmanager", "agents");
29
+
30
+ const GLOBAL_AGENTS_DIR = join(homedir(), ".whale", "agents");
24
31
  const LOCAL_AGENTS_DIR = ".whale/agents";
32
+
25
33
  // ============================================================================
26
34
  // LOADING
27
35
  // ============================================================================
36
+
28
37
  function parseFrontmatter(content) {
29
- if (!content.startsWith("---"))
30
- return { body: content.trim() };
31
- const endIndex = content.indexOf("---", 3);
32
- if (endIndex === -1)
33
- return { body: content.trim() };
34
- const frontmatter = content.slice(3, endIndex).trim();
35
- const body = content.slice(endIndex + 3).trim();
36
- // Parse description
37
- const descMatch = frontmatter.match(/description:\s*(.+)/i);
38
- const description = descMatch?.[1]?.trim();
39
- // Parse tools (comma-separated)
40
- const toolsMatch = frontmatter.match(/tools:\s*(.+)/i);
41
- const tools = toolsMatch?.[1]?.split(",").map(t => t.trim()).filter(Boolean);
42
- return { description, tools, body };
38
+ if (!content.startsWith("---")) return {
39
+ body: content.trim()
40
+ };
41
+ const endIndex = content.indexOf("---", 3);
42
+ if (endIndex === -1) return {
43
+ body: content.trim()
44
+ };
45
+ const frontmatter = content.slice(3, endIndex).trim();
46
+ const body = content.slice(endIndex + 3).trim();
47
+
48
+ // Parse description
49
+ const descMatch = frontmatter.match(/description:\s*(.+)/i);
50
+ const description = descMatch?.[1]?.trim();
51
+
52
+ // Parse tools (comma-separated)
53
+ const toolsMatch = frontmatter.match(/tools:\s*(.+)/i);
54
+ const tools = toolsMatch?.[1]?.split(",").map(t => t.trim()).filter(Boolean);
55
+
56
+ // Parse model (haiku, sonnet, opus)
57
+ const modelMatch = frontmatter.match(/model:\s*(.+)/i);
58
+ const model = modelMatch?.[1]?.trim();
59
+
60
+ // Parse max_tokens
61
+ const maxTokensMatch = frontmatter.match(/max_tokens:\s*(\d+)/i);
62
+ const max_tokens = maxTokensMatch ? parseInt(maxTokensMatch[1], 10) : undefined;
63
+
64
+ // Parse temperature (0-1)
65
+ const tempMatch = frontmatter.match(/temperature:\s*([\d.]+)/i);
66
+ const temperature = tempMatch ? parseFloat(tempMatch[1]) : undefined;
67
+ return {
68
+ description,
69
+ tools,
70
+ model,
71
+ max_tokens,
72
+ temperature,
73
+ body
74
+ };
43
75
  }
44
76
  function loadAgentsFromDir(dir, source) {
45
- if (!existsSync(dir))
46
- return [];
47
- const agents = [];
48
- try {
49
- const files = readdirSync(dir).filter(f => f.endsWith(".md"));
50
- for (const file of files) {
51
- const name = basename(file, ".md");
52
- const path = join(dir, file);
53
- try {
54
- const content = readFileSync(path, "utf-8");
55
- const { description, tools, body } = parseFrontmatter(content);
56
- agents.push({
57
- name,
58
- prompt: body,
59
- description,
60
- tools,
61
- source,
62
- });
63
- }
64
- catch { /* skip unreadable */ }
65
- }
77
+ if (!existsSync(dir)) return [];
78
+ const agents = [];
79
+ try {
80
+ const files = readdirSync(dir).filter(f => f.endsWith(".md"));
81
+ for (const file of files) {
82
+ const name = basename(file, ".md");
83
+ const path = join(dir, file);
84
+ try {
85
+ const content = readFileSync(path, "utf-8");
86
+ const {
87
+ description,
88
+ tools,
89
+ model,
90
+ max_tokens,
91
+ temperature,
92
+ body
93
+ } = parseFrontmatter(content);
94
+ agents.push({
95
+ name,
96
+ prompt: body,
97
+ description,
98
+ tools,
99
+ model,
100
+ max_tokens,
101
+ temperature,
102
+ source
103
+ });
104
+ } catch {/* skip unreadable */}
66
105
  }
67
- catch { /* skip inaccessible */ }
68
- return agents;
106
+ } catch {/* skip inaccessible */}
107
+ return agents;
69
108
  }
70
109
  export function loadAgentDefinitions() {
71
- const agents = [];
72
- // Load global agents first
73
- agents.push(...loadAgentsFromDir(GLOBAL_AGENTS_DIR, "global"));
74
- // Load local agents (override global with same name)
75
- const localDir = join(process.cwd(), LOCAL_AGENTS_DIR);
76
- const localAgents = loadAgentsFromDir(localDir, "local");
77
- for (const local of localAgents) {
78
- const existingIndex = agents.findIndex(a => a.name === local.name);
79
- if (existingIndex >= 0) {
80
- agents[existingIndex] = local;
81
- }
82
- else {
83
- agents.push(local);
84
- }
110
+ const agents = [];
111
+
112
+ // Load global agents first
113
+ agents.push(...loadAgentsFromDir(GLOBAL_AGENTS_DIR, "global"));
114
+
115
+ // Load local agents (override global with same name)
116
+ const localDir = join(process.cwd(), LOCAL_AGENTS_DIR);
117
+ const localAgents = loadAgentsFromDir(localDir, "local");
118
+ for (const local of localAgents) {
119
+ const existingIndex = agents.findIndex(a => a.name === local.name);
120
+ if (existingIndex >= 0) {
121
+ agents[existingIndex] = local;
122
+ } else {
123
+ agents.push(local);
85
124
  }
86
- return agents.sort((a, b) => a.name.localeCompare(b.name));
125
+ }
126
+ return agents.sort((a, b) => a.name.localeCompare(b.name));
87
127
  }
88
128
  export function getAgentDefinition(name) {
89
- const agents = loadAgentDefinitions();
90
- return agents.find(a => a.name === name);
129
+ const agents = loadAgentDefinitions();
130
+ return agents.find(a => a.name === name);
91
131
  }
132
+ //# sourceMappingURL=agent-definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-definitions.js","names":["existsSync","readdirSync","readFileSync","join","basename","homedir","GLOBAL_AGENTS_DIR","LOCAL_AGENTS_DIR","parseFrontmatter","content","startsWith","body","trim","endIndex","indexOf","frontmatter","slice","descMatch","match","description","toolsMatch","tools","split","map","t","filter","Boolean","modelMatch","model","maxTokensMatch","max_tokens","parseInt","undefined","tempMatch","temperature","parseFloat","loadAgentsFromDir","dir","source","agents","files","f","endsWith","file","name","path","push","prompt","loadAgentDefinitions","localDir","process","cwd","localAgents","local","existingIndex","findIndex","a","sort","b","localeCompare","getAgentDefinition","find"],"sources":["../../../src/cli/services/agent-definitions.ts"],"sourcesContent":["/**\n * Agent Definitions — custom agent types from markdown files\n *\n * Matches Claude Code's .claude/agents/ pattern:\n *\n * .whale/agents/reviewer.md:\n * ---\n * description: Reviews code for security issues\n * tools: read_file, glob, grep\n * ---\n * You are a security review agent...\n *\n * Load order:\n * 1. ~/.whale/agents/*.md (global)\n * 2. .whale/agents/*.md (local, overrides global)\n */\n\nimport { existsSync, readdirSync, readFileSync } from \"fs\";\nimport { join, basename } from \"path\";\nimport { homedir } from \"os\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface AgentDefinition {\n name: string; // filename without .md\n prompt: string; // file content (system prompt for the agent)\n description?: string; // from frontmatter\n tools?: string[]; // from frontmatter: which tools the agent can use\n model?: string; // from frontmatter: \"haiku\" | \"sonnet\" | \"opus\"\n max_tokens?: number; // from frontmatter: max output tokens\n temperature?: number; // from frontmatter: sampling temperature (0-1)\n source: \"global\" | \"local\";\n}\n\n// ============================================================================\n// PATHS\n// ============================================================================\n\nconst GLOBAL_AGENTS_DIR = join(homedir(), \".whale\", \"agents\");\nconst LOCAL_AGENTS_DIR = \".whale/agents\";\n\n// ============================================================================\n// LOADING\n// ============================================================================\n\ninterface ParsedFrontmatter {\n description?: string;\n tools?: string[];\n model?: string;\n max_tokens?: number;\n temperature?: number;\n body: string;\n}\n\nfunction parseFrontmatter(content: string): ParsedFrontmatter {\n if (!content.startsWith(\"---\")) return { body: content.trim() };\n\n const endIndex = content.indexOf(\"---\", 3);\n if (endIndex === -1) return { body: content.trim() };\n\n const frontmatter = content.slice(3, endIndex).trim();\n const body = content.slice(endIndex + 3).trim();\n\n // Parse description\n const descMatch = frontmatter.match(/description:\\s*(.+)/i);\n const description = descMatch?.[1]?.trim();\n\n // Parse tools (comma-separated)\n const toolsMatch = frontmatter.match(/tools:\\s*(.+)/i);\n const tools = toolsMatch?.[1]?.split(\",\").map(t => t.trim()).filter(Boolean);\n\n // Parse model (haiku, sonnet, opus)\n const modelMatch = frontmatter.match(/model:\\s*(.+)/i);\n const model = modelMatch?.[1]?.trim();\n\n // Parse max_tokens\n const maxTokensMatch = frontmatter.match(/max_tokens:\\s*(\\d+)/i);\n const max_tokens = maxTokensMatch ? parseInt(maxTokensMatch[1], 10) : undefined;\n\n // Parse temperature (0-1)\n const tempMatch = frontmatter.match(/temperature:\\s*([\\d.]+)/i);\n const temperature = tempMatch ? parseFloat(tempMatch[1]) : undefined;\n\n return { description, tools, model, max_tokens, temperature, body };\n}\n\nfunction loadAgentsFromDir(dir: string, source: \"global\" | \"local\"): AgentDefinition[] {\n if (!existsSync(dir)) return [];\n\n const agents: AgentDefinition[] = [];\n\n try {\n const files = readdirSync(dir).filter(f => f.endsWith(\".md\"));\n\n for (const file of files) {\n const name = basename(file, \".md\");\n const path = join(dir, file);\n\n try {\n const content = readFileSync(path, \"utf-8\");\n const { description, tools, model, max_tokens, temperature, body } = parseFrontmatter(content);\n\n agents.push({\n name,\n prompt: body,\n description,\n tools,\n model,\n max_tokens,\n temperature,\n source,\n });\n } catch { /* skip unreadable */ }\n }\n } catch { /* skip inaccessible */ }\n\n return agents;\n}\n\nexport function loadAgentDefinitions(): AgentDefinition[] {\n const agents: AgentDefinition[] = [];\n\n // Load global agents first\n agents.push(...loadAgentsFromDir(GLOBAL_AGENTS_DIR, \"global\"));\n\n // Load local agents (override global with same name)\n const localDir = join(process.cwd(), LOCAL_AGENTS_DIR);\n const localAgents = loadAgentsFromDir(localDir, \"local\");\n\n for (const local of localAgents) {\n const existingIndex = agents.findIndex(a => a.name === local.name);\n if (existingIndex >= 0) {\n agents[existingIndex] = local;\n } else {\n agents.push(local);\n }\n }\n\n return agents.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function getAgentDefinition(name: string): AgentDefinition | undefined {\n const agents = loadAgentDefinitions();\n return agents.find(a => a.name === name);\n}\n"],"mappings":"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","ignoreList":[]}