whale-code 6.5.5 → 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 (847) 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 +5 -1
  73. package/dist/cli/services/agent-config.js +66 -36
  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 +976 -688
  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.js +187 -169
  107. package/dist/cli/services/error-logger.js.map +1 -0
  108. package/dist/cli/services/file-history.d.ts +1 -1
  109. package/dist/cli/services/file-history.js +50 -54
  110. package/dist/cli/services/file-history.js.map +1 -0
  111. package/dist/cli/services/format-server-response.js +332 -372
  112. package/dist/cli/services/format-server-response.js.map +1 -0
  113. package/dist/cli/services/git-context.js +61 -45
  114. package/dist/cli/services/git-context.js.map +1 -0
  115. package/dist/cli/services/hooks.d.ts +2 -2
  116. package/dist/cli/services/hooks.js +195 -180
  117. package/dist/cli/services/hooks.js.map +1 -0
  118. package/dist/cli/services/ink-incremental.d.ts +19 -0
  119. package/dist/cli/services/ink-incremental.js +59 -0
  120. package/dist/cli/services/ink-incremental.js.map +1 -0
  121. package/dist/cli/services/ink-resize-fix.js +54 -44
  122. package/dist/cli/services/ink-resize-fix.js.map +1 -0
  123. package/dist/cli/services/ink-sync-output.d.ts +12 -0
  124. package/dist/cli/services/ink-sync-output.js +16 -0
  125. package/dist/cli/services/ink-sync-output.js.map +1 -0
  126. package/dist/cli/services/interactive-tools.js +268 -212
  127. package/dist/cli/services/interactive-tools.js.map +1 -0
  128. package/dist/cli/services/keybinding-manager.d.ts +11 -1
  129. package/dist/cli/services/keybinding-manager.js +126 -63
  130. package/dist/cli/services/keybinding-manager.js.map +1 -0
  131. package/dist/cli/services/local-tools.d.ts +1 -1
  132. package/dist/cli/services/local-tools.js +939 -656
  133. package/dist/cli/services/local-tools.js.map +1 -0
  134. package/dist/cli/services/lsp-manager.js +757 -594
  135. package/dist/cli/services/lsp-manager.js.map +1 -0
  136. package/dist/cli/services/mcp-client.d.ts +1 -1
  137. package/dist/cli/services/mcp-client.js +173 -134
  138. package/dist/cli/services/mcp-client.js.map +1 -0
  139. package/dist/cli/services/memory-manager.js +53 -40
  140. package/dist/cli/services/memory-manager.js.map +1 -0
  141. package/dist/cli/services/model-manager.js +55 -40
  142. package/dist/cli/services/model-manager.js.map +1 -0
  143. package/dist/cli/services/model-router.js +115 -85
  144. package/dist/cli/services/model-router.js.map +1 -0
  145. package/dist/cli/services/paths.d.ts +30 -0
  146. package/dist/cli/services/paths.js +81 -0
  147. package/dist/cli/services/paths.js.map +1 -0
  148. package/dist/cli/services/permission-modes.js +32 -25
  149. package/dist/cli/services/permission-modes.js.map +1 -0
  150. package/dist/cli/services/rewind.js +182 -168
  151. package/dist/cli/services/rewind.js.map +1 -0
  152. package/dist/cli/services/ripgrep.js +115 -115
  153. package/dist/cli/services/ripgrep.js.map +1 -0
  154. package/dist/cli/services/sandbox.d.ts +1 -1
  155. package/dist/cli/services/sandbox.js +58 -37
  156. package/dist/cli/services/sandbox.js.map +1 -0
  157. package/dist/cli/services/server-tools.js +738 -565
  158. package/dist/cli/services/server-tools.js.map +1 -0
  159. package/dist/cli/services/session-persistence.js +69 -74
  160. package/dist/cli/services/session-persistence.js.map +1 -0
  161. package/dist/cli/services/subagent-worker.js +42 -27
  162. package/dist/cli/services/subagent-worker.js.map +1 -0
  163. package/dist/cli/services/subagent.d.ts +2 -0
  164. package/dist/cli/services/subagent.js +605 -433
  165. package/dist/cli/services/subagent.js.map +1 -0
  166. package/dist/cli/services/system-prompt.js +86 -78
  167. package/dist/cli/services/system-prompt.js.map +1 -0
  168. package/dist/cli/services/task-decomposer.d.ts +1 -1
  169. package/dist/cli/services/task-decomposer.js +172 -139
  170. package/dist/cli/services/task-decomposer.js.map +1 -0
  171. package/dist/cli/services/team-lead.d.ts +2 -2
  172. package/dist/cli/services/team-lead.js +727 -529
  173. package/dist/cli/services/team-lead.js.map +1 -0
  174. package/dist/cli/services/team-state.js +319 -319
  175. package/dist/cli/services/team-state.js.map +1 -0
  176. package/dist/cli/services/teammate.d.ts +8 -2
  177. package/dist/cli/services/teammate.js +857 -569
  178. package/dist/cli/services/teammate.js.map +1 -0
  179. package/dist/cli/services/telemetry.d.ts +6 -1
  180. package/dist/cli/services/telemetry.js +180 -157
  181. package/dist/cli/services/telemetry.js.map +1 -0
  182. package/dist/cli/services/tools/agent-tools.d.ts +3 -3
  183. package/dist/cli/services/tools/agent-tools.js +480 -322
  184. package/dist/cli/services/tools/agent-tools.js.map +1 -0
  185. package/dist/cli/services/tools/file-ops.js +563 -450
  186. package/dist/cli/services/tools/file-ops.js.map +1 -0
  187. package/dist/cli/services/tools/search-tools.js +231 -162
  188. package/dist/cli/services/tools/search-tools.js.map +1 -0
  189. package/dist/cli/services/tools/shell-exec.js +197 -151
  190. package/dist/cli/services/tools/shell-exec.js.map +1 -0
  191. package/dist/cli/services/tools/task-manager.js +206 -173
  192. package/dist/cli/services/tools/task-manager.js.map +1 -0
  193. package/dist/cli/services/tools/web-tools.js +388 -341
  194. package/dist/cli/services/tools/web-tools.js.map +1 -0
  195. package/dist/cli/setup/SetupApp.d.ts +2 -2
  196. package/dist/cli/setup/SetupApp.js +608 -160
  197. package/dist/cli/setup/SetupApp.js.map +1 -0
  198. package/dist/cli/shared/ErrorBoundary.d.ts +22 -0
  199. package/dist/cli/shared/ErrorBoundary.js +73 -0
  200. package/dist/cli/shared/ErrorBoundary.js.map +1 -0
  201. package/dist/cli/shared/MatrixIntro.js +66 -69
  202. package/dist/cli/shared/MatrixIntro.js.map +1 -0
  203. package/dist/cli/shared/SpinnerSlot.d.ts +14 -0
  204. package/dist/cli/shared/SpinnerSlot.js +63 -0
  205. package/dist/cli/shared/SpinnerSlot.js.map +1 -0
  206. package/dist/cli/shared/Theme.d.ts +1 -1
  207. package/dist/cli/shared/Theme.js +136 -92
  208. package/dist/cli/shared/Theme.js.map +1 -0
  209. package/dist/cli/shared/WhaleBanner.js +99 -11
  210. package/dist/cli/shared/WhaleBanner.js.map +1 -0
  211. package/dist/cli/shared/markdown.d.ts +3 -1
  212. package/dist/cli/shared/markdown.js +736 -674
  213. package/dist/cli/shared/markdown.js.map +1 -0
  214. package/dist/cli/shared/marked-terminal.d.js +2 -0
  215. package/dist/cli/shared/marked-terminal.d.js.map +1 -0
  216. package/dist/cli/shared/theme-manager.js +99 -90
  217. package/dist/cli/shared/theme-manager.js.map +1 -0
  218. package/dist/cli/shared/theme-presets.js +256 -254
  219. package/dist/cli/shared/theme-presets.js.map +1 -0
  220. package/dist/cli/status/StatusApp.js +235 -86
  221. package/dist/cli/status/StatusApp.js.map +1 -0
  222. package/dist/cli/stores/StoreApp.js +275 -65
  223. package/dist/cli/stores/StoreApp.js.map +1 -0
  224. package/dist/index.d.ts +2 -2
  225. package/dist/index.js +509 -396
  226. package/dist/index.js.map +1 -0
  227. package/dist/local-agent/connection.d.ts +2 -2
  228. package/dist/local-agent/connection.js +352 -293
  229. package/dist/local-agent/connection.js.map +1 -0
  230. package/dist/local-agent/discovery.js +259 -122
  231. package/dist/local-agent/discovery.js.map +1 -0
  232. package/dist/local-agent/executor.js +216 -193
  233. package/dist/local-agent/executor.js.map +1 -0
  234. package/dist/local-agent/index.d.ts +2 -2
  235. package/dist/local-agent/index.js +156 -156
  236. package/dist/local-agent/index.js.map +1 -0
  237. package/dist/node/adapters/base.js +18 -8
  238. package/dist/node/adapters/base.js.map +1 -0
  239. package/dist/node/adapters/discord.js +286 -275
  240. package/dist/node/adapters/discord.js.map +1 -0
  241. package/dist/node/adapters/email.js +189 -202
  242. package/dist/node/adapters/email.js.map +1 -0
  243. package/dist/node/adapters/imessage.js +145 -142
  244. package/dist/node/adapters/imessage.js.map +1 -0
  245. package/dist/node/adapters/slack.js +237 -236
  246. package/dist/node/adapters/slack.js.map +1 -0
  247. package/dist/node/adapters/sms.js +149 -151
  248. package/dist/node/adapters/sms.js.map +1 -0
  249. package/dist/node/adapters/telegram.js +88 -92
  250. package/dist/node/adapters/telegram.js.map +1 -0
  251. package/dist/node/adapters/webchat.js +160 -136
  252. package/dist/node/adapters/webchat.js.map +1 -0
  253. package/dist/node/adapters/whatsapp.js +212 -215
  254. package/dist/node/adapters/whatsapp.js.map +1 -0
  255. package/dist/node/cli.js +884 -653
  256. package/dist/node/cli.js.map +1 -0
  257. package/dist/node/config.js +20 -18
  258. package/dist/node/config.js.map +1 -0
  259. package/dist/node/gateway-client.js +191 -181
  260. package/dist/node/gateway-client.js.map +1 -0
  261. package/dist/node/portal/clipboard.js +161 -130
  262. package/dist/node/portal/clipboard.js.map +1 -0
  263. package/dist/node/portal/discovery.js +51 -45
  264. package/dist/node/portal/discovery.js.map +1 -0
  265. package/dist/node/portal/forward.js +64 -58
  266. package/dist/node/portal/forward.js.map +1 -0
  267. package/dist/node/portal/index.js +246 -221
  268. package/dist/node/portal/index.js.map +1 -0
  269. package/dist/node/portal/multiplexer.js +192 -182
  270. package/dist/node/portal/multiplexer.js.map +1 -0
  271. package/dist/node/portal/permissions.js +102 -70
  272. package/dist/node/portal/permissions.js.map +1 -0
  273. package/dist/node/portal/protocol.js +153 -116
  274. package/dist/node/portal/protocol.js.map +1 -0
  275. package/dist/node/portal/screen.js +80 -69
  276. package/dist/node/portal/screen.js.map +1 -0
  277. package/dist/node/portal/session.js +124 -117
  278. package/dist/node/portal/session.js.map +1 -0
  279. package/dist/node/portal/shell.js +140 -113
  280. package/dist/node/portal/shell.js.map +1 -0
  281. package/dist/node/portal/stream.js +77 -75
  282. package/dist/node/portal/stream.js.map +1 -0
  283. package/dist/node/portal/transfer.js +190 -167
  284. package/dist/node/portal/transfer.js.map +1 -0
  285. package/dist/node/portal/ui.js +124 -99
  286. package/dist/node/portal/ui.js.map +1 -0
  287. package/dist/node/remote-desktop/compile-helper.js +50 -45
  288. package/dist/node/remote-desktop/compile-helper.js.map +1 -0
  289. package/dist/node/remote-desktop/index.js +215 -187
  290. package/dist/node/remote-desktop/index.js.map +1 -0
  291. package/dist/node/remote-desktop/protocol.js +45 -29
  292. package/dist/node/remote-desktop/protocol.js.map +1 -0
  293. package/dist/node/runtime.js +493 -410
  294. package/dist/node/runtime.js.map +1 -0
  295. package/dist/server/handlers/__test-utils__/test-db.js +39 -89
  296. package/dist/server/handlers/__test-utils__/test-db.js.map +1 -0
  297. package/dist/server/handlers/analytics.js +467 -261
  298. package/dist/server/handlers/analytics.js.map +1 -0
  299. package/dist/server/handlers/api-docs.js +1030 -895
  300. package/dist/server/handlers/api-docs.js.map +1 -0
  301. package/dist/server/handlers/api-keys.js +291 -242
  302. package/dist/server/handlers/api-keys.js.map +1 -0
  303. package/dist/server/handlers/billing.js +330 -239
  304. package/dist/server/handlers/billing.js.map +1 -0
  305. package/dist/server/handlers/browser.js +468 -395
  306. package/dist/server/handlers/browser.js.map +1 -0
  307. package/dist/server/handlers/catalog.js +1377 -978
  308. package/dist/server/handlers/catalog.js.map +1 -0
  309. package/dist/server/handlers/clickhouse.js +157 -109
  310. package/dist/server/handlers/clickhouse.js.map +1 -0
  311. package/dist/server/handlers/comms.js +1439 -984
  312. package/dist/server/handlers/comms.js.map +1 -0
  313. package/dist/server/handlers/creations.js +461 -394
  314. package/dist/server/handlers/creations.js.map +1 -0
  315. package/dist/server/handlers/crm.js +1082 -791
  316. package/dist/server/handlers/crm.js.map +1 -0
  317. package/dist/server/handlers/discovery.js +251 -232
  318. package/dist/server/handlers/discovery.js.map +1 -0
  319. package/dist/server/handlers/embeddings.js +241 -164
  320. package/dist/server/handlers/embeddings.js.map +1 -0
  321. package/dist/server/handlers/enrichment.js +887 -718
  322. package/dist/server/handlers/enrichment.js.map +1 -0
  323. package/dist/server/handlers/image-gen.js +467 -376
  324. package/dist/server/handlers/image-gen.js.map +1 -0
  325. package/dist/server/handlers/inventory.js +797 -424
  326. package/dist/server/handlers/inventory.js.map +1 -0
  327. package/dist/server/handlers/kali.js +272 -230
  328. package/dist/server/handlers/kali.js.map +1 -0
  329. package/dist/server/handlers/llm-providers.js +803 -580
  330. package/dist/server/handlers/llm-providers.js.map +1 -0
  331. package/dist/server/handlers/local-agent.js +133 -105
  332. package/dist/server/handlers/local-agent.js.map +1 -0
  333. package/dist/server/handlers/media.js +1179 -857
  334. package/dist/server/handlers/media.js.map +1 -0
  335. package/dist/server/handlers/meta-ads.js +2669 -2093
  336. package/dist/server/handlers/meta-ads.js.map +1 -0
  337. package/dist/server/handlers/nodes.js +1321 -913
  338. package/dist/server/handlers/nodes.js.map +1 -0
  339. package/dist/server/handlers/operations.js +183 -157
  340. package/dist/server/handlers/operations.js.map +1 -0
  341. package/dist/server/handlers/platform.js +346 -210
  342. package/dist/server/handlers/platform.js.map +1 -0
  343. package/dist/server/handlers/remove-bg.js +118 -86
  344. package/dist/server/handlers/remove-bg.js.map +1 -0
  345. package/dist/server/handlers/storefront.js +586 -446
  346. package/dist/server/handlers/storefront.js.map +1 -0
  347. package/dist/server/handlers/supply-chain.js +546 -326
  348. package/dist/server/handlers/supply-chain.js.map +1 -0
  349. package/dist/server/handlers/transcription.js +106 -97
  350. package/dist/server/handlers/transcription.js.map +1 -0
  351. package/dist/server/handlers/video-gen.js +593 -424
  352. package/dist/server/handlers/video-gen.js.map +1 -0
  353. package/dist/server/handlers/voice.js +1458 -1039
  354. package/dist/server/handlers/voice.js.map +1 -0
  355. package/dist/server/handlers/workflow-steps.js +2837 -2116
  356. package/dist/server/handlers/workflow-steps.js.map +1 -0
  357. package/dist/server/handlers/workflows.js +1630 -933
  358. package/dist/server/handlers/workflows.js.map +1 -0
  359. package/dist/server/index.js +3167 -2422
  360. package/dist/server/index.js.map +1 -0
  361. package/dist/server/lib/batch-client.js +471 -409
  362. package/dist/server/lib/batch-client.js.map +1 -0
  363. package/dist/server/lib/clickhouse-buffer.js +118 -104
  364. package/dist/server/lib/clickhouse-buffer.js.map +1 -0
  365. package/dist/server/lib/clickhouse-client.js +107 -107
  366. package/dist/server/lib/clickhouse-client.js.map +1 -0
  367. package/dist/server/lib/coa-renderer.js +1786 -356
  368. package/dist/server/lib/coa-renderer.js.map +1 -0
  369. package/dist/server/lib/code-worker-pool.js +227 -177
  370. package/dist/server/lib/code-worker-pool.js.map +1 -0
  371. package/dist/server/lib/code-worker.js +174 -164
  372. package/dist/server/lib/code-worker.js.map +1 -0
  373. package/dist/server/lib/compaction-service.d.ts +2 -12
  374. package/dist/server/lib/compaction-service.js +74 -184
  375. package/dist/server/lib/compaction-service.js.map +1 -0
  376. package/dist/server/lib/logger.js +36 -24
  377. package/dist/server/lib/logger.js.map +1 -0
  378. package/dist/server/lib/otel.js +101 -80
  379. package/dist/server/lib/otel.js.map +1 -0
  380. package/dist/server/lib/pdf-renderer.js +952 -788
  381. package/dist/server/lib/pdf-renderer.js.map +1 -0
  382. package/dist/server/lib/prompt-sanitizer.js +188 -108
  383. package/dist/server/lib/prompt-sanitizer.js.map +1 -0
  384. package/dist/server/lib/provider-capabilities.js +136 -138
  385. package/dist/server/lib/provider-capabilities.js.map +1 -0
  386. package/dist/server/lib/provider-failover.js +190 -168
  387. package/dist/server/lib/provider-failover.js.map +1 -0
  388. package/dist/server/lib/rate-limiter.js +186 -117
  389. package/dist/server/lib/rate-limiter.js.map +1 -0
  390. package/dist/server/lib/react-pdf-layout.js +551 -382
  391. package/dist/server/lib/react-pdf-layout.js.map +1 -0
  392. package/dist/server/lib/server-agent-loop.d.ts +4 -1
  393. package/dist/server/lib/server-agent-loop.js +906 -634
  394. package/dist/server/lib/server-agent-loop.js.map +1 -0
  395. package/dist/server/lib/server-subagent.js +260 -164
  396. package/dist/server/lib/server-subagent.js.map +1 -0
  397. package/dist/server/lib/session-checkpoint.js +105 -96
  398. package/dist/server/lib/session-checkpoint.js.map +1 -0
  399. package/dist/server/lib/ssrf-guard.js +193 -184
  400. package/dist/server/lib/ssrf-guard.js.map +1 -0
  401. package/dist/server/lib/supabase-client.js +94 -82
  402. package/dist/server/lib/supabase-client.js.map +1 -0
  403. package/dist/server/lib/template-resolver.js +154 -176
  404. package/dist/server/lib/template-resolver.js.map +1 -0
  405. package/dist/server/lib/utils.js +242 -133
  406. package/dist/server/lib/utils.js.map +1 -0
  407. package/dist/server/local-agent-gateway.d.ts +2 -2
  408. package/dist/server/local-agent-gateway.js +785 -627
  409. package/dist/server/local-agent-gateway.js.map +1 -0
  410. package/dist/server/providers/anthropic.js +250 -172
  411. package/dist/server/providers/anthropic.js.map +1 -0
  412. package/dist/server/providers/bedrock.js +217 -158
  413. package/dist/server/providers/bedrock.js.map +1 -0
  414. package/dist/server/providers/gemini.js +548 -418
  415. package/dist/server/providers/gemini.js.map +1 -0
  416. package/dist/server/providers/openai.js +571 -437
  417. package/dist/server/providers/openai.js.map +1 -0
  418. package/dist/server/providers/registry.js +23 -18
  419. package/dist/server/providers/registry.js.map +1 -0
  420. package/dist/server/providers/shared.js +123 -95
  421. package/dist/server/providers/shared.js.map +1 -0
  422. package/dist/server/providers/types.js +1 -11
  423. package/dist/server/providers/types.js.map +1 -0
  424. package/dist/server/proxy-handlers.js +209 -165
  425. package/dist/server/proxy-handlers.js.map +1 -0
  426. package/dist/server/tool-router.js +959 -599
  427. package/dist/server/tool-router.js.map +1 -0
  428. package/dist/server/validation.js +248 -188
  429. package/dist/server/validation.js.map +1 -0
  430. package/dist/server/worker.js +202 -133
  431. package/dist/server/worker.js.map +1 -0
  432. package/dist/setup.d.ts +2 -2
  433. package/dist/setup.js +151 -147
  434. package/dist/setup.js.map +1 -0
  435. package/dist/shared/agent-core.d.ts +115 -26
  436. package/dist/shared/agent-core.js +956 -522
  437. package/dist/shared/agent-core.js.map +1 -0
  438. package/dist/shared/anthropic-types.js +1 -6
  439. package/dist/shared/anthropic-types.js.map +1 -0
  440. package/dist/shared/api-client.d.ts +16 -9
  441. package/dist/shared/api-client.js +419 -327
  442. package/dist/shared/api-client.js.map +1 -0
  443. package/dist/shared/compaction.d.ts +36 -0
  444. package/dist/shared/compaction.js +138 -0
  445. package/dist/shared/compaction.js.map +1 -0
  446. package/dist/shared/constants.js +67 -64
  447. package/dist/shared/constants.js.map +1 -0
  448. package/dist/shared/sse-parser.js +221 -219
  449. package/dist/shared/sse-parser.js.map +1 -0
  450. package/dist/shared/tool-dispatch.d.ts +4 -0
  451. package/dist/shared/tool-dispatch.js +226 -165
  452. package/dist/shared/tool-dispatch.js.map +1 -0
  453. package/dist/shared/types.js +1 -6
  454. package/dist/shared/types.js.map +1 -0
  455. package/dist/types/cli-highlight.d.js +2 -0
  456. package/dist/types/cli-highlight.d.js.map +1 -0
  457. package/dist/types/diff.d.js +2 -0
  458. package/dist/types/diff.d.js.map +1 -0
  459. package/dist/types/pdf-parse.d.js +2 -0
  460. package/dist/types/pdf-parse.d.js.map +1 -0
  461. package/dist/updater.d.ts +1 -1
  462. package/dist/updater.js +118 -92
  463. package/dist/updater.js.map +1 -0
  464. package/dist/webchat/widget.js +227 -380
  465. package/dist/webchat/widget.js.map +1 -0
  466. package/package.json +22 -10
  467. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  468. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  469. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  470. package/vendor/ink/build/apply-styles.js +175 -0
  471. package/vendor/ink/build/build-layout.js +77 -0
  472. package/vendor/ink/build/calculate-wrapped-text.js +53 -0
  473. package/vendor/ink/build/colorize.d.ts +3 -0
  474. package/vendor/ink/build/colorize.js +48 -0
  475. package/vendor/ink/build/colorize.js.map +1 -0
  476. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  477. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  478. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  479. package/vendor/ink/build/components/App.d.ts +18 -0
  480. package/vendor/ink/build/components/App.js +351 -0
  481. package/vendor/ink/build/components/App.js.map +1 -0
  482. package/vendor/ink/build/components/AppContext.d.ts +15 -0
  483. package/vendor/ink/build/components/AppContext.js +11 -0
  484. package/vendor/ink/build/components/AppContext.js.map +1 -0
  485. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  486. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  487. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  488. package/vendor/ink/build/components/Box.d.ts +117 -0
  489. package/vendor/ink/build/components/Box.js +34 -0
  490. package/vendor/ink/build/components/Box.js.map +1 -0
  491. package/vendor/ink/build/components/Color.js +62 -0
  492. package/vendor/ink/build/components/Cursor.d.ts +83 -0
  493. package/vendor/ink/build/components/Cursor.js +53 -0
  494. package/vendor/ink/build/components/Cursor.js.map +1 -0
  495. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  496. package/vendor/ink/build/components/CursorContext.js +8 -0
  497. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  498. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  499. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  500. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  501. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  502. package/vendor/ink/build/components/ErrorOverview.js +84 -0
  503. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  504. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  505. package/vendor/ink/build/components/FocusContext.js +17 -0
  506. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  507. package/vendor/ink/build/components/Newline.d.ts +13 -0
  508. package/vendor/ink/build/components/Newline.js +8 -0
  509. package/vendor/ink/build/components/Newline.js.map +1 -0
  510. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  511. package/vendor/ink/build/components/Spacer.js +11 -0
  512. package/vendor/ink/build/components/Spacer.js.map +1 -0
  513. package/vendor/ink/build/components/Static.d.ts +24 -0
  514. package/vendor/ink/build/components/Static.js +28 -0
  515. package/vendor/ink/build/components/Static.js.map +1 -0
  516. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  517. package/vendor/ink/build/components/StderrContext.js +13 -0
  518. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  519. package/vendor/ink/build/components/StdinContext.d.ts +22 -0
  520. package/vendor/ink/build/components/StdinContext.js +19 -0
  521. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  522. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  523. package/vendor/ink/build/components/StdoutContext.js +13 -0
  524. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  525. package/vendor/ink/build/components/Text.d.ts +55 -0
  526. package/vendor/ink/build/components/Text.js +50 -0
  527. package/vendor/ink/build/components/Text.js.map +1 -0
  528. package/vendor/ink/build/components/Transform.d.ts +16 -0
  529. package/vendor/ink/build/components/Transform.js +15 -0
  530. package/vendor/ink/build/components/Transform.js.map +1 -0
  531. package/vendor/ink/build/cursor-helpers.d.ts +38 -0
  532. package/vendor/ink/build/cursor-helpers.js +56 -0
  533. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  534. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  535. package/vendor/ink/build/devtools-window-polyfill.js +65 -0
  536. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  537. package/vendor/ink/build/devtools.d.ts +1 -0
  538. package/vendor/ink/build/devtools.js +11 -0
  539. package/vendor/ink/build/devtools.js.map +1 -0
  540. package/vendor/ink/build/dom.d.ts +56 -0
  541. package/vendor/ink/build/dom.js +124 -0
  542. package/vendor/ink/build/dom.js.map +1 -0
  543. package/vendor/ink/build/experimental/apply-style.js +140 -0
  544. package/vendor/ink/build/experimental/dom.js +123 -0
  545. package/vendor/ink/build/experimental/output.js +91 -0
  546. package/vendor/ink/build/experimental/reconciler.js +141 -0
  547. package/vendor/ink/build/experimental/renderer.js +81 -0
  548. package/vendor/ink/build/get-max-width.d.ts +3 -0
  549. package/vendor/ink/build/get-max-width.js +10 -0
  550. package/vendor/ink/build/get-max-width.js.map +1 -0
  551. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  552. package/vendor/ink/build/hooks/use-app.js +8 -0
  553. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  554. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  555. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  556. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  557. package/vendor/ink/build/hooks/use-focus-manager.d.ts +28 -0
  558. package/vendor/ink/build/hooks/use-focus-manager.js +17 -0
  559. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  560. package/vendor/ink/build/hooks/use-focus.d.ts +29 -0
  561. package/vendor/ink/build/hooks/use-focus.js +42 -0
  562. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  563. package/vendor/ink/build/hooks/use-input.d.ts +131 -0
  564. package/vendor/ink/build/hooks/use-input.js +124 -0
  565. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  566. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +5 -0
  567. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +11 -0
  568. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  569. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  570. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  571. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  572. package/vendor/ink/build/hooks/use-stdin.d.ts +5 -0
  573. package/vendor/ink/build/hooks/use-stdin.js +8 -0
  574. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  575. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  576. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  577. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  578. package/vendor/ink/build/hooks/useInput.js +38 -0
  579. package/vendor/ink/build/index.d.ts +34 -0
  580. package/vendor/ink/build/index.js +20 -0
  581. package/vendor/ink/build/index.js.map +1 -0
  582. package/vendor/ink/build/ink.d.ts +90 -0
  583. package/vendor/ink/build/ink.js +654 -0
  584. package/vendor/ink/build/ink.js.map +1 -0
  585. package/vendor/ink/build/input-parser.d.ts +7 -0
  586. package/vendor/ink/build/input-parser.js +154 -0
  587. package/vendor/ink/build/input-parser.js.map +1 -0
  588. package/vendor/ink/build/instance.js +205 -0
  589. package/vendor/ink/build/instances.d.ts +3 -0
  590. package/vendor/ink/build/instances.js +8 -0
  591. package/vendor/ink/build/instances.js.map +1 -0
  592. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  593. package/vendor/ink/build/kitty-keyboard.js +32 -0
  594. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  595. package/vendor/ink/build/layout.d.ts +7 -0
  596. package/vendor/ink/build/layout.js +33 -0
  597. package/vendor/ink/build/layout.js.map +1 -0
  598. package/vendor/ink/build/log-update.d.ts +19 -0
  599. package/vendor/ink/build/log-update.js +243 -0
  600. package/vendor/ink/build/log-update.js.map +1 -0
  601. package/vendor/ink/build/measure-element.d.ts +16 -0
  602. package/vendor/ink/build/measure-element.js +9 -0
  603. package/vendor/ink/build/measure-element.js.map +1 -0
  604. package/vendor/ink/build/measure-text.d.ts +6 -0
  605. package/vendor/ink/build/measure-text.js +21 -0
  606. package/vendor/ink/build/measure-text.js.map +1 -0
  607. package/vendor/ink/build/options.d.ts +52 -0
  608. package/vendor/ink/build/options.js +2 -0
  609. package/vendor/ink/build/options.js.map +1 -0
  610. package/vendor/ink/build/output.d.ts +35 -0
  611. package/vendor/ink/build/output.js +183 -0
  612. package/vendor/ink/build/output.js.map +1 -0
  613. package/vendor/ink/build/parse-keypress.d.ts +22 -0
  614. package/vendor/ink/build/parse-keypress.js +493 -0
  615. package/vendor/ink/build/parse-keypress.js.map +1 -0
  616. package/vendor/ink/build/reconciler.d.ts +4 -0
  617. package/vendor/ink/build/reconciler.js +274 -0
  618. package/vendor/ink/build/reconciler.js.map +1 -0
  619. package/vendor/ink/build/render-background.d.ts +4 -0
  620. package/vendor/ink/build/render-background.js +25 -0
  621. package/vendor/ink/build/render-background.js.map +1 -0
  622. package/vendor/ink/build/render-border.d.ts +4 -0
  623. package/vendor/ink/build/render-border.js +73 -0
  624. package/vendor/ink/build/render-border.js.map +1 -0
  625. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  626. package/vendor/ink/build/render-node-to-output.js +147 -0
  627. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  628. package/vendor/ink/build/render-to-string.d.ts +38 -0
  629. package/vendor/ink/build/render-to-string.js +115 -0
  630. package/vendor/ink/build/render-to-string.js.map +1 -0
  631. package/vendor/ink/build/render.d.ts +121 -0
  632. package/vendor/ink/build/render.js +55 -0
  633. package/vendor/ink/build/render.js.map +1 -0
  634. package/vendor/ink/build/renderer.d.ts +8 -0
  635. package/vendor/ink/build/renderer.js +55 -0
  636. package/vendor/ink/build/renderer.js.map +1 -0
  637. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  638. package/vendor/ink/build/sanitize-ansi.js +27 -0
  639. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  640. package/vendor/ink/build/screen-reader-update.d.ts +13 -0
  641. package/vendor/ink/build/screen-reader-update.js +38 -0
  642. package/vendor/ink/build/screen-reader-update.js.map +1 -0
  643. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  644. package/vendor/ink/build/squash-text-nodes.js +36 -0
  645. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  646. package/vendor/ink/build/styles.d.ts +240 -0
  647. package/vendor/ink/build/styles.js +232 -0
  648. package/vendor/ink/build/styles.js.map +1 -0
  649. package/vendor/ink/build/utils.d.ts +2 -0
  650. package/vendor/ink/build/utils.js +4 -0
  651. package/vendor/ink/build/utils.js.map +1 -0
  652. package/vendor/ink/build/wrap-text.d.ts +3 -0
  653. package/vendor/ink/build/wrap-text.js +31 -0
  654. package/vendor/ink/build/wrap-text.js.map +1 -0
  655. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  656. package/vendor/ink/build/write-synchronized.js +7 -0
  657. package/vendor/ink/build/write-synchronized.js.map +1 -0
  658. package/vendor/ink/license +10 -0
  659. package/vendor/ink/node_modules/@types/node/LICENSE +21 -0
  660. package/vendor/ink/node_modules/@types/node/README.md +15 -0
  661. package/vendor/ink/node_modules/@types/node/assert/strict.d.ts +105 -0
  662. package/vendor/ink/node_modules/@types/node/assert.d.ts +955 -0
  663. package/vendor/ink/node_modules/@types/node/async_hooks.d.ts +623 -0
  664. package/vendor/ink/node_modules/@types/node/buffer.buffer.d.ts +466 -0
  665. package/vendor/ink/node_modules/@types/node/buffer.d.ts +1810 -0
  666. package/vendor/ink/node_modules/@types/node/child_process.d.ts +1428 -0
  667. package/vendor/ink/node_modules/@types/node/cluster.d.ts +486 -0
  668. package/vendor/ink/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
  669. package/vendor/ink/node_modules/@types/node/console.d.ts +151 -0
  670. package/vendor/ink/node_modules/@types/node/constants.d.ts +20 -0
  671. package/vendor/ink/node_modules/@types/node/crypto.d.ts +4065 -0
  672. package/vendor/ink/node_modules/@types/node/dgram.d.ts +564 -0
  673. package/vendor/ink/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
  674. package/vendor/ink/node_modules/@types/node/dns/promises.d.ts +503 -0
  675. package/vendor/ink/node_modules/@types/node/dns.d.ts +922 -0
  676. package/vendor/ink/node_modules/@types/node/domain.d.ts +166 -0
  677. package/vendor/ink/node_modules/@types/node/events.d.ts +1054 -0
  678. package/vendor/ink/node_modules/@types/node/fs/promises.d.ts +1329 -0
  679. package/vendor/ink/node_modules/@types/node/fs.d.ts +4676 -0
  680. package/vendor/ink/node_modules/@types/node/globals.d.ts +150 -0
  681. package/vendor/ink/node_modules/@types/node/globals.typedarray.d.ts +101 -0
  682. package/vendor/ink/node_modules/@types/node/http.d.ts +2167 -0
  683. package/vendor/ink/node_modules/@types/node/http2.d.ts +2480 -0
  684. package/vendor/ink/node_modules/@types/node/https.d.ts +405 -0
  685. package/vendor/ink/node_modules/@types/node/index.d.ts +115 -0
  686. package/vendor/ink/node_modules/@types/node/inspector/promises.d.ts +41 -0
  687. package/vendor/ink/node_modules/@types/node/inspector.d.ts +224 -0
  688. package/vendor/ink/node_modules/@types/node/inspector.generated.d.ts +4226 -0
  689. package/vendor/ink/node_modules/@types/node/module.d.ts +819 -0
  690. package/vendor/ink/node_modules/@types/node/net.d.ts +933 -0
  691. package/vendor/ink/node_modules/@types/node/os.d.ts +507 -0
  692. package/vendor/ink/node_modules/@types/node/package.json +155 -0
  693. package/vendor/ink/node_modules/@types/node/path/posix.d.ts +8 -0
  694. package/vendor/ink/node_modules/@types/node/path/win32.d.ts +8 -0
  695. package/vendor/ink/node_modules/@types/node/path.d.ts +187 -0
  696. package/vendor/ink/node_modules/@types/node/perf_hooks.d.ts +643 -0
  697. package/vendor/ink/node_modules/@types/node/process.d.ts +2156 -0
  698. package/vendor/ink/node_modules/@types/node/punycode.d.ts +117 -0
  699. package/vendor/ink/node_modules/@types/node/querystring.d.ts +152 -0
  700. package/vendor/ink/node_modules/@types/node/quic.d.ts +910 -0
  701. package/vendor/ink/node_modules/@types/node/readline/promises.d.ts +161 -0
  702. package/vendor/ink/node_modules/@types/node/readline.d.ts +541 -0
  703. package/vendor/ink/node_modules/@types/node/repl.d.ts +415 -0
  704. package/vendor/ink/node_modules/@types/node/sea.d.ts +162 -0
  705. package/vendor/ink/node_modules/@types/node/sqlite.d.ts +955 -0
  706. package/vendor/ink/node_modules/@types/node/stream/consumers.d.ts +38 -0
  707. package/vendor/ink/node_modules/@types/node/stream/promises.d.ts +211 -0
  708. package/vendor/ink/node_modules/@types/node/stream/web.d.ts +296 -0
  709. package/vendor/ink/node_modules/@types/node/stream.d.ts +1760 -0
  710. package/vendor/ink/node_modules/@types/node/string_decoder.d.ts +67 -0
  711. package/vendor/ink/node_modules/@types/node/test/reporters.d.ts +96 -0
  712. package/vendor/ink/node_modules/@types/node/test.d.ts +2240 -0
  713. package/vendor/ink/node_modules/@types/node/timers/promises.d.ts +108 -0
  714. package/vendor/ink/node_modules/@types/node/timers.d.ts +159 -0
  715. package/vendor/ink/node_modules/@types/node/tls.d.ts +1198 -0
  716. package/vendor/ink/node_modules/@types/node/trace_events.d.ts +197 -0
  717. package/vendor/ink/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +462 -0
  718. package/vendor/ink/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
  719. package/vendor/ink/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +36 -0
  720. package/vendor/ink/node_modules/@types/node/ts5.6/index.d.ts +117 -0
  721. package/vendor/ink/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
  722. package/vendor/ink/node_modules/@types/node/ts5.7/index.d.ts +117 -0
  723. package/vendor/ink/node_modules/@types/node/tty.d.ts +250 -0
  724. package/vendor/ink/node_modules/@types/node/url.d.ts +519 -0
  725. package/vendor/ink/node_modules/@types/node/util/types.d.ts +558 -0
  726. package/vendor/ink/node_modules/@types/node/util.d.ts +1662 -0
  727. package/vendor/ink/node_modules/@types/node/v8.d.ts +983 -0
  728. package/vendor/ink/node_modules/@types/node/vm.d.ts +1208 -0
  729. package/vendor/ink/node_modules/@types/node/wasi.d.ts +202 -0
  730. package/vendor/ink/node_modules/@types/node/web-globals/abortcontroller.d.ts +59 -0
  731. package/vendor/ink/node_modules/@types/node/web-globals/blob.d.ts +23 -0
  732. package/vendor/ink/node_modules/@types/node/web-globals/console.d.ts +9 -0
  733. package/vendor/ink/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
  734. package/vendor/ink/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  735. package/vendor/ink/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
  736. package/vendor/ink/node_modules/@types/node/web-globals/events.d.ts +106 -0
  737. package/vendor/ink/node_modules/@types/node/web-globals/fetch.d.ts +69 -0
  738. package/vendor/ink/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
  739. package/vendor/ink/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
  740. package/vendor/ink/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
  741. package/vendor/ink/node_modules/@types/node/web-globals/performance.d.ts +45 -0
  742. package/vendor/ink/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  743. package/vendor/ink/node_modules/@types/node/web-globals/streams.d.ts +115 -0
  744. package/vendor/ink/node_modules/@types/node/web-globals/timers.d.ts +44 -0
  745. package/vendor/ink/node_modules/@types/node/web-globals/url.d.ts +24 -0
  746. package/vendor/ink/node_modules/@types/node/worker_threads.d.ts +717 -0
  747. package/vendor/ink/node_modules/@types/node/zlib.d.ts +618 -0
  748. package/vendor/ink/node_modules/node-pty/LICENSE +69 -0
  749. package/vendor/ink/node_modules/node-pty/README.md +164 -0
  750. package/vendor/ink/node_modules/node-pty/binding.gyp +150 -0
  751. package/vendor/ink/node_modules/node-pty/lib/conpty_console_list_agent.js +25 -0
  752. package/vendor/ink/node_modules/node-pty/lib/eventEmitter2.js +47 -0
  753. package/vendor/ink/node_modules/node-pty/lib/index.js +52 -0
  754. package/vendor/ink/node_modules/node-pty/lib/interfaces.js +7 -0
  755. package/vendor/ink/node_modules/node-pty/lib/shared/conout.js +11 -0
  756. package/vendor/ink/node_modules/node-pty/lib/terminal.js +190 -0
  757. package/vendor/ink/node_modules/node-pty/lib/types.js +7 -0
  758. package/vendor/ink/node_modules/node-pty/lib/unixTerminal.js +349 -0
  759. package/vendor/ink/node_modules/node-pty/lib/utils.js +39 -0
  760. package/vendor/ink/node_modules/node-pty/lib/windowsConoutConnection.js +125 -0
  761. package/vendor/ink/node_modules/node-pty/lib/windowsPtyAgent.js +287 -0
  762. package/vendor/ink/node_modules/node-pty/lib/windowsTerminal.js +201 -0
  763. package/vendor/ink/node_modules/node-pty/lib/worker/conoutSocketWorker.js +22 -0
  764. package/vendor/ink/node_modules/node-pty/package.json +65 -0
  765. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
  766. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
  767. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
  768. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
  769. package/vendor/ink/node_modules/node-pty/prebuilds/linux-arm64/pty.node +0 -0
  770. package/vendor/ink/node_modules/node-pty/prebuilds/linux-x64/pty.node +0 -0
  771. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  772. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  773. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  774. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.pdb +0 -0
  775. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  776. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  777. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  778. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  779. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  780. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.pdb +0 -0
  781. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  782. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  783. package/vendor/ink/node_modules/node-pty/scripts/post-install.js +76 -0
  784. package/vendor/ink/node_modules/node-pty/scripts/prebuild.js +34 -0
  785. package/vendor/ink/node_modules/node-pty/src/unix/pty.cc +875 -0
  786. package/vendor/ink/node_modules/node-pty/src/unix/spawn-helper.cc +23 -0
  787. package/vendor/ink/node_modules/node-pty/src/win/conpty.cc +582 -0
  788. package/vendor/ink/node_modules/node-pty/src/win/conpty.h +41 -0
  789. package/vendor/ink/node_modules/node-pty/src/win/conpty_console_list.cc +44 -0
  790. package/vendor/ink/node_modules/node-pty/src/win/path_util.cc +95 -0
  791. package/vendor/ink/node_modules/node-pty/src/win/path_util.h +26 -0
  792. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
  793. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
  794. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
  795. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
  796. package/vendor/ink/node_modules/node-pty/typings/node-pty.d.ts +215 -0
  797. package/vendor/ink/node_modules/undici-types/LICENSE +21 -0
  798. package/vendor/ink/node_modules/undici-types/README.md +6 -0
  799. package/vendor/ink/node_modules/undici-types/agent.d.ts +32 -0
  800. package/vendor/ink/node_modules/undici-types/api.d.ts +43 -0
  801. package/vendor/ink/node_modules/undici-types/balanced-pool.d.ts +30 -0
  802. package/vendor/ink/node_modules/undici-types/cache-interceptor.d.ts +173 -0
  803. package/vendor/ink/node_modules/undici-types/cache.d.ts +36 -0
  804. package/vendor/ink/node_modules/undici-types/client-stats.d.ts +15 -0
  805. package/vendor/ink/node_modules/undici-types/client.d.ts +108 -0
  806. package/vendor/ink/node_modules/undici-types/connector.d.ts +34 -0
  807. package/vendor/ink/node_modules/undici-types/content-type.d.ts +21 -0
  808. package/vendor/ink/node_modules/undici-types/cookies.d.ts +30 -0
  809. package/vendor/ink/node_modules/undici-types/diagnostics-channel.d.ts +74 -0
  810. package/vendor/ink/node_modules/undici-types/dispatcher.d.ts +276 -0
  811. package/vendor/ink/node_modules/undici-types/env-http-proxy-agent.d.ts +22 -0
  812. package/vendor/ink/node_modules/undici-types/errors.d.ts +161 -0
  813. package/vendor/ink/node_modules/undici-types/eventsource.d.ts +66 -0
  814. package/vendor/ink/node_modules/undici-types/fetch.d.ts +211 -0
  815. package/vendor/ink/node_modules/undici-types/formdata.d.ts +108 -0
  816. package/vendor/ink/node_modules/undici-types/global-dispatcher.d.ts +9 -0
  817. package/vendor/ink/node_modules/undici-types/global-origin.d.ts +7 -0
  818. package/vendor/ink/node_modules/undici-types/h2c-client.d.ts +73 -0
  819. package/vendor/ink/node_modules/undici-types/handlers.d.ts +15 -0
  820. package/vendor/ink/node_modules/undici-types/header.d.ts +160 -0
  821. package/vendor/ink/node_modules/undici-types/index.d.ts +88 -0
  822. package/vendor/ink/node_modules/undici-types/interceptors.d.ts +73 -0
  823. package/vendor/ink/node_modules/undici-types/mock-agent.d.ts +68 -0
  824. package/vendor/ink/node_modules/undici-types/mock-call-history.d.ts +111 -0
  825. package/vendor/ink/node_modules/undici-types/mock-client.d.ts +27 -0
  826. package/vendor/ink/node_modules/undici-types/mock-errors.d.ts +12 -0
  827. package/vendor/ink/node_modules/undici-types/mock-interceptor.d.ts +94 -0
  828. package/vendor/ink/node_modules/undici-types/mock-pool.d.ts +27 -0
  829. package/vendor/ink/node_modules/undici-types/package.json +55 -0
  830. package/vendor/ink/node_modules/undici-types/patch.d.ts +29 -0
  831. package/vendor/ink/node_modules/undici-types/pool-stats.d.ts +19 -0
  832. package/vendor/ink/node_modules/undici-types/pool.d.ts +41 -0
  833. package/vendor/ink/node_modules/undici-types/proxy-agent.d.ts +29 -0
  834. package/vendor/ink/node_modules/undici-types/readable.d.ts +68 -0
  835. package/vendor/ink/node_modules/undici-types/retry-agent.d.ts +8 -0
  836. package/vendor/ink/node_modules/undici-types/retry-handler.d.ts +125 -0
  837. package/vendor/ink/node_modules/undici-types/round-robin-pool.d.ts +41 -0
  838. package/vendor/ink/node_modules/undici-types/snapshot-agent.d.ts +109 -0
  839. package/vendor/ink/node_modules/undici-types/util.d.ts +18 -0
  840. package/vendor/ink/node_modules/undici-types/utility.d.ts +7 -0
  841. package/vendor/ink/node_modules/undici-types/webidl.d.ts +341 -0
  842. package/vendor/ink/node_modules/undici-types/websocket.d.ts +186 -0
  843. package/vendor/ink/package.json +201 -0
  844. package/vendor/ink/readme.md +2636 -0
  845. package/bin/swag-agent.js +0 -9
  846. package/dist/server/lib/pg-rate-limiter.d.ts +0 -21
  847. 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":[]}
@@ -18,7 +18,11 @@ export interface CLIAgentConfig {
18
18
  /**
19
19
  * Fetch the Whale Code agent's config from ai_agent_config.
20
20
  * Uses the defaultAgentId from CLI config, or falls back to the known Whale Code UUID.
21
- * Cached for 5 minutes — call freely from hot paths.
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)
22
26
  */
23
27
  export declare function loadCLIAgentConfig(): Promise<CLIAgentConfig | null>;
24
28
  /** Clear the cache (e.g., on /clear or session reset) */
@@ -5,57 +5,87 @@
5
5
  * Nothing is hardcoded — all behavioral knobs come from context_config JSONB.
6
6
  * Cached for the session lifetime (5 min TTL) to avoid hammering the DB.
7
7
  */
8
+
8
9
  import { createClient } from "@supabase/supabase-js";
9
10
  import { resolveConfig } from "./config-store.js";
11
+
12
+ // ============================================================================
13
+ // TYPES
14
+ // ============================================================================
15
+
10
16
  // ============================================================================
11
17
  // CACHE
12
18
  // ============================================================================
19
+
13
20
  let cachedConfig = null;
14
21
  let cacheTimestamp = 0;
15
- const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
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
+
16
26
  /**
17
27
  * Fetch the Whale Code agent's config from ai_agent_config.
18
28
  * Uses the defaultAgentId from CLI config, or falls back to the known Whale Code UUID.
19
- * Cached for 5 minutes — call freely from hot paths.
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)
20
34
  */
21
35
  export async function loadCLIAgentConfig() {
22
- if (cachedConfig && Date.now() - cacheTimestamp < CACHE_TTL_MS) {
23
- return cachedConfig;
24
- }
25
- try {
26
- const { supabaseUrl, supabaseKey, defaultAgentId } = resolveConfig();
27
- if (!supabaseUrl || !supabaseKey)
28
- return cachedConfig;
29
- const agentId = defaultAgentId || "72d7aaa8-2e8b-48a0-a38d-f332f69600bb";
30
- const supabase = createClient(supabaseUrl, supabaseKey);
31
- const { data, error } = await supabase
32
- .from("ai_agent_config")
33
- .select("id, name, model, max_tokens, max_tool_calls, temperature, context_config")
34
- .eq("id", agentId)
35
- .single();
36
- if (error || !data) {
37
- // Silently fall back to cached config on error — never block the CLI
38
- return cachedConfig;
39
- }
40
- cachedConfig = {
41
- id: data.id,
42
- name: data.name,
43
- model: data.model,
44
- max_tokens: data.max_tokens,
45
- max_tool_calls: data.max_tool_calls,
46
- temperature: data.temperature,
47
- context_config: data.context_config,
48
- };
49
- cacheTimestamp = Date.now();
50
- return cachedConfig;
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;
51
54
  }
52
- catch {
53
- // Network failure, auth expired, etc. — never crash the CLI
54
- return cachedConfig;
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;
55
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
+ }
56
83
  }
84
+
57
85
  /** Clear the cache (e.g., on /clear or session reset) */
58
86
  export function resetAgentConfigCache() {
59
- cachedConfig = null;
60
- cacheTimestamp = 0;
87
+ cachedConfig = null;
88
+ cacheTimestamp = 0;
89
+ lastFailTimestamp = 0;
61
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":[]}