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
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Hooks are configured in:
5
5
  * - Project: .whale/hooks.json (array of HookConfig)
6
- * - User: ~/.swagmanager/hooks.json (array of HookConfig)
6
+ * - User: ~/.whale/hooks.json (array of HookConfig)
7
7
  *
8
8
  * Both are loaded and merged (project hooks run first).
9
9
  *
@@ -16,243 +16,258 @@
16
16
  * If allow: false, the tool call is blocked and message is returned as the tool result.
17
17
  * If hook exits non-zero, it is logged as a warning but does not crash the session.
18
18
  */
19
+
19
20
  import { existsSync, readFileSync } from "fs";
20
21
  import { join } from "path";
21
- import { homedir } from "os";
22
22
  import { spawn } from "child_process";
23
+ import { HOOKS_PATH } from "./paths.js";
24
+
25
+ // ============================================================================
26
+ // TYPES
27
+ // ============================================================================
28
+
29
+ /** JSON sent to hook process on stdin */
30
+
31
+ /** JSON output from hook process on stdout */
32
+
23
33
  const DEFAULT_TIMEOUT_MS = 10_000;
34
+
24
35
  // ============================================================================
25
36
  // GLOB MATCHING
26
37
  // ============================================================================
38
+
27
39
  /**
28
40
  * Match a tool name against a simple glob pattern.
29
41
  * Supports * (any chars) and ? (single char).
30
42
  */
31
43
  export function matchGlob(pattern, name) {
32
- // Escape regex special chars except * and ?
33
- const regex = pattern
34
- .replace(/[.+^${}()|[\]\\]/g, "\\$&")
35
- .replace(/\*/g, ".*")
36
- .replace(/\?/g, ".");
37
- return new RegExp(`^${regex}$`).test(name);
44
+ // Escape regex special chars except * and ?
45
+ const regex = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*").replace(/\?/g, ".");
46
+ return new RegExp(`^${regex}$`).test(name);
38
47
  }
48
+
39
49
  // ============================================================================
40
50
  // LOAD HOOKS
41
51
  // ============================================================================
42
- const VALID_EVENTS = [
43
- "BeforeTool",
44
- "AfterTool",
45
- "SessionStart",
46
- "SessionEnd",
47
- "Notification",
48
- ];
52
+
53
+ const VALID_EVENTS = ["BeforeTool", "AfterTool", "SessionStart", "SessionEnd", "Notification"];
54
+
49
55
  /**
50
- * Load hooks from project (.whale/hooks.json) and user (~/.swagmanager/hooks.json).
56
+ * Load hooks from project (.whale/hooks.json) and user (~/.whale/hooks.json).
51
57
  * Project hooks come first in the array, then user hooks.
52
58
  * Invalid files are skipped with a warning.
53
59
  */
54
60
  export function loadHooks(cwd) {
55
- const hooks = [];
56
- // Project hooks (higher priority, run first)
57
- const projectPath = join(cwd, ".whale", "hooks.json");
58
- const projectHooks = loadHooksFromFile(projectPath);
59
- if (projectHooks)
60
- hooks.push(...projectHooks);
61
- // User hooks
62
- const userPath = join(homedir(), ".swagmanager", "hooks.json");
63
- const userHooks = loadHooksFromFile(userPath);
64
- if (userHooks)
65
- hooks.push(...userHooks);
66
- return hooks;
61
+ const hooks = [];
62
+
63
+ // Project hooks (higher priority, run first)
64
+ const projectPath = join(cwd, ".whale", "hooks.json");
65
+ const projectHooks = loadHooksFromFile(projectPath);
66
+ if (projectHooks) hooks.push(...projectHooks);
67
+
68
+ // User hooks
69
+ const userPath = HOOKS_PATH;
70
+ const userHooks = loadHooksFromFile(userPath);
71
+ if (userHooks) hooks.push(...userHooks);
72
+ return hooks;
67
73
  }
68
74
  function loadHooksFromFile(filePath) {
69
- if (!existsSync(filePath))
70
- return null;
71
- try {
72
- const raw = readFileSync(filePath, "utf-8");
73
- const parsed = JSON.parse(raw);
74
- if (!Array.isArray(parsed)) {
75
- console.error(`[hooks] Warning: ${filePath} should be a JSON array, skipping`);
76
- return null;
77
- }
78
- // Validate each hook config
79
- return parsed.filter((h) => {
80
- if (!h || typeof h !== "object")
81
- return false;
82
- const hook = h;
83
- if (typeof hook.event !== "string" || typeof hook.command !== "string") {
84
- console.error(`[hooks] Warning: Invalid hook in ${filePath}, missing event or command`);
85
- return false;
86
- }
87
- if (!VALID_EVENTS.includes(hook.event)) {
88
- console.error(`[hooks] Warning: Invalid event "${hook.event}" in ${filePath}`);
89
- return false;
90
- }
91
- return true;
92
- });
93
- }
94
- catch (err) {
95
- console.error(`[hooks] Warning: Failed to parse ${filePath}: ${err instanceof Error ? err.message : err}`);
96
- return null;
75
+ if (!existsSync(filePath)) return null;
76
+ try {
77
+ const raw = readFileSync(filePath, "utf-8");
78
+ const parsed = JSON.parse(raw);
79
+ if (!Array.isArray(parsed)) {
80
+ console.error(`[hooks] Warning: ${filePath} should be a JSON array, skipping`);
81
+ return null;
97
82
  }
83
+ // Validate each hook config
84
+ return parsed.filter(h => {
85
+ if (!h || typeof h !== "object") return false;
86
+ const hook = h;
87
+ if (typeof hook.event !== "string" || typeof hook.command !== "string") {
88
+ console.error(`[hooks] Warning: Invalid hook in ${filePath}, missing event or command`);
89
+ return false;
90
+ }
91
+ if (!VALID_EVENTS.includes(hook.event)) {
92
+ console.error(`[hooks] Warning: Invalid event "${hook.event}" in ${filePath}`);
93
+ return false;
94
+ }
95
+ return true;
96
+ });
97
+ } catch (err) {
98
+ console.error(`[hooks] Warning: Failed to parse ${filePath}: ${err instanceof Error ? err.message : err}`);
99
+ return null;
100
+ }
98
101
  }
102
+
99
103
  // ============================================================================
100
104
  // EXECUTE HOOK
101
105
  // ============================================================================
106
+
102
107
  /**
103
108
  * Execute a hook command with JSON payload on stdin.
104
109
  * Returns parsed JSON response from stdout, or null on error/timeout.
105
110
  */
106
111
  export async function executeHook(hook, payload) {
107
- const timeout = hook.timeout ?? DEFAULT_TIMEOUT_MS;
108
- return new Promise((resolve) => {
109
- let stdout = "";
110
- let stderr = "";
111
- let settled = false;
112
- const child = spawn("/bin/sh", ["-c", hook.command], {
113
- stdio: ["pipe", "pipe", "pipe"],
114
- env: { ...process.env },
115
- });
116
- let timer;
117
- const settle = (result) => {
118
- if (settled)
119
- return;
120
- settled = true;
121
- if (timer)
122
- clearTimeout(timer);
123
- resolve(result);
124
- };
125
- // Kill on timeout
126
- timer = setTimeout(() => {
127
- if (!settled) {
128
- console.error(`[hooks] Warning: Hook "${hook.command}" timed out after ${timeout}ms, killing`);
129
- try {
130
- child.kill("SIGKILL");
131
- }
132
- catch {
133
- /* ignore */
134
- }
135
- settle(null);
136
- }
137
- }, timeout);
138
- child.stdout?.on("data", (data) => {
139
- stdout += data.toString();
140
- });
141
- child.stderr?.on("data", (data) => {
142
- stderr += data.toString();
143
- });
144
- child.on("error", (err) => {
145
- console.error(`[hooks] Warning: Hook "${hook.command}" failed to start: ${err.message}`);
146
- settle(null);
147
- });
148
- child.on("close", (code) => {
149
- if (code !== 0) {
150
- if (stderr) {
151
- console.error(`[hooks] Warning: Hook "${hook.command}" exited with code ${code}: ${stderr.trim()}`);
152
- }
153
- else {
154
- console.error(`[hooks] Warning: Hook "${hook.command}" exited with code ${code}`);
155
- }
156
- settle(null);
157
- return;
158
- }
159
- // Parse stdout as JSON
160
- const trimmed = stdout.trim();
161
- if (!trimmed) {
162
- settle(null);
163
- return;
164
- }
165
- try {
166
- settle(JSON.parse(trimmed));
167
- }
168
- catch {
169
- // Non-JSON output is not an error, just no structured response
170
- settle(null);
171
- }
172
- });
173
- // Write payload to stdin
112
+ const timeout = hook.timeout ?? DEFAULT_TIMEOUT_MS;
113
+ return new Promise(resolve => {
114
+ let stdout = "";
115
+ let stderr = "";
116
+ let settled = false;
117
+ const child = spawn("/bin/sh", ["-c", hook.command], {
118
+ stdio: ["pipe", "pipe", "pipe"],
119
+ env: {
120
+ ...process.env
121
+ }
122
+ });
123
+ let timer;
124
+ const settle = result => {
125
+ if (settled) return;
126
+ settled = true;
127
+ if (timer) clearTimeout(timer);
128
+ resolve(result);
129
+ };
130
+
131
+ // Kill on timeout
132
+ timer = setTimeout(() => {
133
+ if (!settled) {
134
+ console.error(`[hooks] Warning: Hook "${hook.command}" timed out after ${timeout}ms, killing`);
174
135
  try {
175
- child.stdin?.write(JSON.stringify(payload));
176
- child.stdin?.end();
136
+ child.kill("SIGKILL");
137
+ } catch {
138
+ /* ignore */
177
139
  }
178
- catch {
179
- // stdin may already be closed — that is fine
140
+ settle(null);
141
+ }
142
+ }, timeout);
143
+ child.stdout?.on("data", data => {
144
+ stdout += data.toString();
145
+ });
146
+ child.stderr?.on("data", data => {
147
+ stderr += data.toString();
148
+ });
149
+ child.on("error", err => {
150
+ console.error(`[hooks] Warning: Hook "${hook.command}" failed to start: ${err.message}`);
151
+ settle(null);
152
+ });
153
+ child.on("close", code => {
154
+ if (code !== 0) {
155
+ if (stderr) {
156
+ console.error(`[hooks] Warning: Hook "${hook.command}" exited with code ${code}: ${stderr.trim()}`);
157
+ } else {
158
+ console.error(`[hooks] Warning: Hook "${hook.command}" exited with code ${code}`);
180
159
  }
160
+ settle(null);
161
+ return;
162
+ }
163
+
164
+ // Parse stdout as JSON
165
+ const trimmed = stdout.trim();
166
+ if (!trimmed) {
167
+ settle(null);
168
+ return;
169
+ }
170
+ try {
171
+ settle(JSON.parse(trimmed));
172
+ } catch {
173
+ // Non-JSON output is not an error, just no structured response
174
+ settle(null);
175
+ }
181
176
  });
177
+
178
+ // Write payload to stdin
179
+ try {
180
+ child.stdin?.write(JSON.stringify(payload));
181
+ child.stdin?.end();
182
+ } catch {
183
+ // stdin may already be closed — that is fine
184
+ }
185
+ });
182
186
  }
187
+
183
188
  // ============================================================================
184
189
  // PUBLIC API
185
190
  // ============================================================================
191
+
186
192
  /**
187
193
  * Run BeforeTool hooks for a given tool call.
188
194
  * Returns whether the tool call should proceed and optionally modified input.
189
195
  */
190
196
  export async function runBeforeToolHook(hooks, toolName, input) {
191
- const matching = hooks.filter((h) => h.event === "BeforeTool" &&
192
- (!h.pattern || matchGlob(h.pattern, toolName)));
193
- if (matching.length === 0)
194
- return { allow: true };
195
- const payload = {
196
- event: "BeforeTool",
197
- tool_name: toolName,
198
- tool_input: input,
199
- };
200
- for (const hook of matching) {
201
- const response = await executeHook(hook, payload);
202
- if (!response)
203
- continue;
204
- // If any hook blocks, stop immediately
205
- if (response.allow === false) {
206
- return {
207
- allow: false,
208
- message: response.message || `Blocked by hook: ${hook.command}`,
209
- };
210
- }
211
- // If hook modifies input and is allowed to
212
- if (hook.allowModify && response.modified_input) {
213
- return { allow: true, modifiedInput: response.modified_input };
214
- }
197
+ const matching = hooks.filter(h => h.event === "BeforeTool" && (!h.pattern || matchGlob(h.pattern, toolName)));
198
+ if (matching.length === 0) return {
199
+ allow: true
200
+ };
201
+ const payload = {
202
+ event: "BeforeTool",
203
+ tool_name: toolName,
204
+ tool_input: input
205
+ };
206
+ for (const hook of matching) {
207
+ const response = await executeHook(hook, payload);
208
+ if (!response) continue;
209
+
210
+ // If any hook blocks, stop immediately
211
+ if (response.allow === false) {
212
+ return {
213
+ allow: false,
214
+ message: response.message || `Blocked by hook: ${hook.command}`
215
+ };
215
216
  }
216
- return { allow: true };
217
+
218
+ // If hook modifies input and is allowed to
219
+ if (hook.allowModify && response.modified_input) {
220
+ return {
221
+ allow: true,
222
+ modifiedInput: response.modified_input
223
+ };
224
+ }
225
+ }
226
+ return {
227
+ allow: true
228
+ };
217
229
  }
230
+
218
231
  /**
219
232
  * Run AfterTool hooks for a given tool result.
220
233
  * Returns optionally modified output.
221
234
  */
222
235
  export async function runAfterToolHook(hooks, toolName, output, success) {
223
- const matching = hooks.filter((h) => h.event === "AfterTool" &&
224
- (!h.pattern || matchGlob(h.pattern, toolName)));
225
- if (matching.length === 0)
226
- return {};
227
- const payload = {
228
- event: "AfterTool",
229
- tool_name: toolName,
230
- tool_output: output,
231
- tool_success: success,
232
- };
233
- for (const hook of matching) {
234
- const response = await executeHook(hook, payload);
235
- if (!response)
236
- continue;
237
- // If hook modifies output and is allowed to
238
- if (hook.allowModify && response.modified_output !== undefined) {
239
- return { modifiedOutput: response.modified_output };
240
- }
236
+ const matching = hooks.filter(h => h.event === "AfterTool" && (!h.pattern || matchGlob(h.pattern, toolName)));
237
+ if (matching.length === 0) return {};
238
+ const payload = {
239
+ event: "AfterTool",
240
+ tool_name: toolName,
241
+ tool_output: output,
242
+ tool_success: success
243
+ };
244
+ for (const hook of matching) {
245
+ const response = await executeHook(hook, payload);
246
+ if (!response) continue;
247
+
248
+ // If hook modifies output and is allowed to
249
+ if (hook.allowModify && response.modified_output !== undefined) {
250
+ return {
251
+ modifiedOutput: response.modified_output
252
+ };
241
253
  }
242
- return {};
254
+ }
255
+ return {};
243
256
  }
257
+
244
258
  /**
245
259
  * Run session lifecycle hooks (SessionStart, SessionEnd, Notification).
246
260
  * Fire-and-forget — errors are logged but don't affect session.
247
261
  */
248
262
  export async function runSessionHook(hooks, event, data) {
249
- const matching = hooks.filter((h) => h.event === event);
250
- if (matching.length === 0)
251
- return;
252
- const payload = {
253
- event,
254
- ...(data || {}),
255
- };
256
- // Run all session hooks concurrently — don't wait or fail
257
- await Promise.allSettled(matching.map((hook) => executeHook(hook, payload)));
263
+ const matching = hooks.filter(h => h.event === event);
264
+ if (matching.length === 0) return;
265
+ const payload = {
266
+ event,
267
+ ...(data || {})
268
+ };
269
+
270
+ // Run all session hooks concurrently — don't wait or fail
271
+ await Promise.allSettled(matching.map(hook => executeHook(hook, payload)));
258
272
  }
273
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","names":["existsSync","readFileSync","join","spawn","HOOKS_PATH","DEFAULT_TIMEOUT_MS","matchGlob","pattern","name","regex","replace","RegExp","test","VALID_EVENTS","loadHooks","cwd","hooks","projectPath","projectHooks","loadHooksFromFile","push","userPath","userHooks","filePath","raw","parsed","JSON","parse","Array","isArray","console","error","filter","h","hook","event","command","includes","err","Error","message","executeHook","payload","timeout","Promise","resolve","stdout","stderr","settled","child","stdio","env","process","timer","settle","result","clearTimeout","setTimeout","kill","on","data","toString","code","trim","trimmed","stdin","write","stringify","end","runBeforeToolHook","toolName","input","matching","length","allow","tool_name","tool_input","response","allowModify","modified_input","modifiedInput","runAfterToolHook","output","success","tool_output","tool_success","modified_output","undefined","modifiedOutput","runSessionHook","allSettled","map"],"sources":["../../../src/cli/services/hooks.ts"],"sourcesContent":["/**\n * Hooks System — shell commands that run before/after tool calls and at session lifecycle events.\n *\n * Hooks are configured in:\n * - Project: .whale/hooks.json (array of HookConfig)\n * - User: ~/.whale/hooks.json (array of HookConfig)\n *\n * Both are loaded and merged (project hooks run first).\n *\n * Hook process receives JSON on stdin:\n * { event, tool_name?, tool_input?, tool_output?, tool_success?, session_id? }\n *\n * Hook process may output JSON on stdout:\n * { allow?: boolean, message?: string, modified_input?: object, modified_output?: string }\n *\n * If allow: false, the tool call is blocked and message is returned as the tool result.\n * If hook exits non-zero, it is logged as a warning but does not crash the session.\n */\n\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { spawn } from \"child_process\";\nimport { HOOKS_PATH } from \"./paths.js\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport type HookEvent =\n | \"BeforeTool\"\n | \"AfterTool\"\n | \"SessionStart\"\n | \"SessionEnd\"\n | \"Notification\";\n\nexport interface HookConfig {\n /** Which event triggers this hook */\n event: HookEvent;\n /** Shell command to run */\n command: string;\n /** Optional: only trigger for matching tool names (glob pattern) */\n pattern?: string;\n /** Max ms to wait for hook process (default 10000) */\n timeout?: number;\n /** Can hook modify the tool input/output? (default false) */\n allowModify?: boolean;\n}\n\n/** JSON sent to hook process on stdin */\ninterface HookPayload {\n event: HookEvent;\n tool_name?: string;\n tool_input?: Record<string, unknown>;\n tool_output?: string;\n tool_success?: boolean;\n session_id?: string;\n}\n\n/** JSON output from hook process on stdout */\ninterface HookResponse {\n allow?: boolean;\n message?: string;\n modified_input?: Record<string, unknown>;\n modified_output?: string;\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\n// ============================================================================\n// GLOB MATCHING\n// ============================================================================\n\n/**\n * Match a tool name against a simple glob pattern.\n * Supports * (any chars) and ? (single char).\n */\nexport function matchGlob(pattern: string, name: string): boolean {\n // Escape regex special chars except * and ?\n const regex = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*/g, \".*\")\n .replace(/\\?/g, \".\");\n return new RegExp(`^${regex}$`).test(name);\n}\n\n// ============================================================================\n// LOAD HOOKS\n// ============================================================================\n\nconst VALID_EVENTS: HookEvent[] = [\n \"BeforeTool\",\n \"AfterTool\",\n \"SessionStart\",\n \"SessionEnd\",\n \"Notification\",\n];\n\n/**\n * Load hooks from project (.whale/hooks.json) and user (~/.whale/hooks.json).\n * Project hooks come first in the array, then user hooks.\n * Invalid files are skipped with a warning.\n */\nexport function loadHooks(cwd: string): HookConfig[] {\n const hooks: HookConfig[] = [];\n\n // Project hooks (higher priority, run first)\n const projectPath = join(cwd, \".whale\", \"hooks.json\");\n const projectHooks = loadHooksFromFile(projectPath);\n if (projectHooks) hooks.push(...projectHooks);\n\n // User hooks\n const userPath = HOOKS_PATH;\n const userHooks = loadHooksFromFile(userPath);\n if (userHooks) hooks.push(...userHooks);\n\n return hooks;\n}\n\nfunction loadHooksFromFile(filePath: string): HookConfig[] | null {\n if (!existsSync(filePath)) return null;\n try {\n const raw = readFileSync(filePath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) {\n console.error(`[hooks] Warning: ${filePath} should be a JSON array, skipping`);\n return null;\n }\n // Validate each hook config\n return parsed.filter((h: unknown) => {\n if (!h || typeof h !== \"object\") return false;\n const hook = h as Record<string, unknown>;\n if (typeof hook.event !== \"string\" || typeof hook.command !== \"string\") {\n console.error(`[hooks] Warning: Invalid hook in ${filePath}, missing event or command`);\n return false;\n }\n if (!VALID_EVENTS.includes(hook.event as HookEvent)) {\n console.error(`[hooks] Warning: Invalid event \"${hook.event}\" in ${filePath}`);\n return false;\n }\n return true;\n }) as HookConfig[];\n } catch (err) {\n console.error(\n `[hooks] Warning: Failed to parse ${filePath}: ${err instanceof Error ? err.message : err}`,\n );\n return null;\n }\n}\n\n// ============================================================================\n// EXECUTE HOOK\n// ============================================================================\n\n/**\n * Execute a hook command with JSON payload on stdin.\n * Returns parsed JSON response from stdout, or null on error/timeout.\n */\nexport async function executeHook(\n hook: HookConfig,\n payload: HookPayload,\n): Promise<HookResponse | null> {\n const timeout = hook.timeout ?? DEFAULT_TIMEOUT_MS;\n\n return new Promise((resolve) => {\n let stdout = \"\";\n let stderr = \"\";\n let settled = false;\n\n const child = spawn(\"/bin/sh\", [\"-c\", hook.command], {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env },\n });\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const settle = (result: HookResponse | null) => {\n if (settled) return;\n settled = true;\n if (timer) clearTimeout(timer);\n resolve(result);\n };\n\n // Kill on timeout\n timer = setTimeout(() => {\n if (!settled) {\n console.error(\n `[hooks] Warning: Hook \"${hook.command}\" timed out after ${timeout}ms, killing`,\n );\n try {\n child.kill(\"SIGKILL\");\n } catch {\n /* ignore */\n }\n settle(null);\n }\n }, timeout);\n\n child.stdout?.on(\"data\", (data: Buffer) => {\n stdout += data.toString();\n });\n\n child.stderr?.on(\"data\", (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on(\"error\", (err) => {\n console.error(\n `[hooks] Warning: Hook \"${hook.command}\" failed to start: ${err.message}`,\n );\n settle(null);\n });\n\n child.on(\"close\", (code) => {\n if (code !== 0) {\n if (stderr) {\n console.error(\n `[hooks] Warning: Hook \"${hook.command}\" exited with code ${code}: ${stderr.trim()}`,\n );\n } else {\n console.error(\n `[hooks] Warning: Hook \"${hook.command}\" exited with code ${code}`,\n );\n }\n settle(null);\n return;\n }\n\n // Parse stdout as JSON\n const trimmed = stdout.trim();\n if (!trimmed) {\n settle(null);\n return;\n }\n try {\n settle(JSON.parse(trimmed) as HookResponse);\n } catch {\n // Non-JSON output is not an error, just no structured response\n settle(null);\n }\n });\n\n // Write payload to stdin\n try {\n child.stdin?.write(JSON.stringify(payload));\n child.stdin?.end();\n } catch {\n // stdin may already be closed — that is fine\n }\n });\n}\n\n// ============================================================================\n// PUBLIC API\n// ============================================================================\n\n/**\n * Run BeforeTool hooks for a given tool call.\n * Returns whether the tool call should proceed and optionally modified input.\n */\nexport async function runBeforeToolHook(\n hooks: HookConfig[],\n toolName: string,\n input: Record<string, unknown>,\n): Promise<{\n allow: boolean;\n message?: string;\n modifiedInput?: Record<string, unknown>;\n}> {\n const matching = hooks.filter(\n (h) =>\n h.event === \"BeforeTool\" &&\n (!h.pattern || matchGlob(h.pattern, toolName)),\n );\n\n if (matching.length === 0) return { allow: true };\n\n const payload: HookPayload = {\n event: \"BeforeTool\",\n tool_name: toolName,\n tool_input: input,\n };\n\n for (const hook of matching) {\n const response = await executeHook(hook, payload);\n if (!response) continue;\n\n // If any hook blocks, stop immediately\n if (response.allow === false) {\n return {\n allow: false,\n message: response.message || `Blocked by hook: ${hook.command}`,\n };\n }\n\n // If hook modifies input and is allowed to\n if (hook.allowModify && response.modified_input) {\n return { allow: true, modifiedInput: response.modified_input };\n }\n }\n\n return { allow: true };\n}\n\n/**\n * Run AfterTool hooks for a given tool result.\n * Returns optionally modified output.\n */\nexport async function runAfterToolHook(\n hooks: HookConfig[],\n toolName: string,\n output: string,\n success: boolean,\n): Promise<{ modifiedOutput?: string }> {\n const matching = hooks.filter(\n (h) =>\n h.event === \"AfterTool\" &&\n (!h.pattern || matchGlob(h.pattern, toolName)),\n );\n\n if (matching.length === 0) return {};\n\n const payload: HookPayload = {\n event: \"AfterTool\",\n tool_name: toolName,\n tool_output: output,\n tool_success: success,\n };\n\n for (const hook of matching) {\n const response = await executeHook(hook, payload);\n if (!response) continue;\n\n // If hook modifies output and is allowed to\n if (hook.allowModify && response.modified_output !== undefined) {\n return { modifiedOutput: response.modified_output };\n }\n }\n\n return {};\n}\n\n/**\n * Run session lifecycle hooks (SessionStart, SessionEnd, Notification).\n * Fire-and-forget — errors are logged but don't affect session.\n */\nexport async function runSessionHook(\n hooks: HookConfig[],\n event: \"SessionStart\" | \"SessionEnd\" | \"Notification\",\n data?: Record<string, unknown>,\n): Promise<void> {\n const matching = hooks.filter((h) => h.event === event);\n\n if (matching.length === 0) return;\n\n const payload: HookPayload = {\n event,\n ...(data || {}),\n };\n\n // Run all session hooks concurrently — don't wait or fail\n await Promise.allSettled(matching.map((hook) => executeHook(hook, payload)));\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Ink Incremental Rendering Patch
3
+ *
4
+ * Replaces Ink's standard log-update instance (erase everything, rewrite everything)
5
+ * with its built-in incremental variant (only rewrite changed lines).
6
+ *
7
+ * This dramatically reduces flicker for updates that change few lines (spinners,
8
+ * streaming text, tool status changes) because unchanged lines are never touched.
9
+ *
10
+ * How it works:
11
+ * - Ink's log-update has two modes: standard (erase+rewrite all) and incremental
12
+ * (line-level diff — skip unchanged lines, rewrite only changed ones)
13
+ * - Ink defaults to standard mode. This patch swaps in incremental mode.
14
+ * - The throttledLog arrow function accesses this.log dynamically (not via closure),
15
+ * so replacing ink.log is picked up automatically. No autoBind issues.
16
+ *
17
+ * Call after render() — the Ink instance must exist in the registry.
18
+ */
19
+ export declare function patchInkIncremental(): Promise<void>;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Ink Incremental Rendering Patch
3
+ *
4
+ * Replaces Ink's standard log-update instance (erase everything, rewrite everything)
5
+ * with its built-in incremental variant (only rewrite changed lines).
6
+ *
7
+ * This dramatically reduces flicker for updates that change few lines (spinners,
8
+ * streaming text, tool status changes) because unchanged lines are never touched.
9
+ *
10
+ * How it works:
11
+ * - Ink's log-update has two modes: standard (erase+rewrite all) and incremental
12
+ * (line-level diff — skip unchanged lines, rewrite only changed ones)
13
+ * - Ink defaults to standard mode. This patch swaps in incremental mode.
14
+ * - The throttledLog arrow function accesses this.log dynamically (not via closure),
15
+ * so replacing ink.log is picked up automatically. No autoBind issues.
16
+ *
17
+ * Call after render() — the Ink instance must exist in the registry.
18
+ */
19
+
20
+ import { pathToFileURL } from "url";
21
+ import { resolve, dirname } from "path";
22
+ import { fileURLToPath } from "url";
23
+ export async function patchInkIncremental() {
24
+ try {
25
+ const __dirname = dirname(fileURLToPath(import.meta.url));
26
+ const inkBuildDir = resolve(__dirname, "..", "..", "..", "node_modules", "ink", "build");
27
+ const [{
28
+ default: instances
29
+ }, {
30
+ default: logUpdate
31
+ }] = await Promise.all([import(/* @vite-ignore */pathToFileURL(resolve(inkBuildDir, "instances.js")).href), import(/* @vite-ignore */pathToFileURL(resolve(inkBuildDir, "log-update.js")).href)]);
32
+ const ink = instances.get(process.stdout);
33
+ if (!ink) return;
34
+ const oldLog = ink.log;
35
+ const incrementalLog = logUpdate.create(ink.options.stdout, {
36
+ incremental: true
37
+ });
38
+
39
+ // Sync the new log's internal state with what's currently on screen
40
+ if (ink.lastOutputToRender) {
41
+ incrementalLog.sync(ink.lastOutputToRender);
42
+ }
43
+ if (ink.cursorPosition) {
44
+ incrementalLog.setCursorPosition(ink.cursorPosition);
45
+ }
46
+
47
+ // Replace the log instance
48
+ ink.log = incrementalLog;
49
+
50
+ // In unthrottled mode (debug/screenReader), throttledLog === oldLog (direct ref).
51
+ // Replace it too so all paths use the incremental renderer.
52
+ if (ink.throttledLog === oldLog) {
53
+ ink.throttledLog = incrementalLog;
54
+ }
55
+ } catch {
56
+ // Silent fail — incremental rendering is best-effort
57
+ }
58
+ }
59
+ //# sourceMappingURL=ink-incremental.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ink-incremental.js","names":["pathToFileURL","resolve","dirname","fileURLToPath","patchInkIncremental","__dirname","import","meta","url","inkBuildDir","default","instances","logUpdate","Promise","all","href","ink","get","process","stdout","oldLog","log","incrementalLog","create","options","incremental","lastOutputToRender","sync","cursorPosition","setCursorPosition","throttledLog"],"sources":["../../../src/cli/services/ink-incremental.ts"],"sourcesContent":["/**\n * Ink Incremental Rendering Patch\n *\n * Replaces Ink's standard log-update instance (erase everything, rewrite everything)\n * with its built-in incremental variant (only rewrite changed lines).\n *\n * This dramatically reduces flicker for updates that change few lines (spinners,\n * streaming text, tool status changes) because unchanged lines are never touched.\n *\n * How it works:\n * - Ink's log-update has two modes: standard (erase+rewrite all) and incremental\n * (line-level diff — skip unchanged lines, rewrite only changed ones)\n * - Ink defaults to standard mode. This patch swaps in incremental mode.\n * - The throttledLog arrow function accesses this.log dynamically (not via closure),\n * so replacing ink.log is picked up automatically. No autoBind issues.\n *\n * Call after render() — the Ink instance must exist in the registry.\n */\n\nimport { pathToFileURL } from \"url\";\nimport { resolve, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\ninterface InkLog {\n (output: string): boolean | void;\n clear: () => void;\n done: () => void;\n sync: (str: string) => void;\n setCursorPosition: (pos: unknown) => void;\n isCursorDirty: () => boolean;\n willRender: (str: string) => boolean;\n}\n\ninterface InkInstance {\n log: InkLog;\n throttledLog: InkLog | ((output: string) => void);\n lastOutputToRender: string;\n cursorPosition: unknown;\n options: { stdout: NodeJS.WriteStream };\n}\n\nexport async function patchInkIncremental(): Promise<void> {\n try {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n const inkBuildDir = resolve(__dirname, \"..\", \"..\", \"..\", \"node_modules\", \"ink\", \"build\");\n\n const [{ default: instances }, { default: logUpdate }] = await Promise.all([\n import(/* @vite-ignore */ pathToFileURL(resolve(inkBuildDir, \"instances.js\")).href) as Promise<{\n default: WeakMap<NodeJS.WriteStream, InkInstance>;\n }>,\n import(/* @vite-ignore */ pathToFileURL(resolve(inkBuildDir, \"log-update.js\")).href) as Promise<{\n default: {\n create: (\n stream: NodeJS.WriteStream,\n opts?: { incremental?: boolean; showCursor?: boolean },\n ) => InkLog;\n };\n }>,\n ]);\n\n const ink = instances.get(process.stdout);\n if (!ink) return;\n\n const oldLog = ink.log;\n const incrementalLog = logUpdate.create(ink.options.stdout, { incremental: true });\n\n // Sync the new log's internal state with what's currently on screen\n if (ink.lastOutputToRender) {\n incrementalLog.sync(ink.lastOutputToRender);\n }\n if (ink.cursorPosition) {\n incrementalLog.setCursorPosition(ink.cursorPosition);\n }\n\n // Replace the log instance\n ink.log = incrementalLog;\n\n // In unthrottled mode (debug/screenReader), throttledLog === oldLog (direct ref).\n // Replace it too so all paths use the incremental renderer.\n if (ink.throttledLog === (oldLog as unknown)) {\n ink.throttledLog = incrementalLog;\n }\n } catch {\n // Silent fail — incremental rendering is best-effort\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,aAAa,QAAQ,KAAK;AACnC,SAASC,OAAO,EAAEC,OAAO,QAAQ,MAAM;AACvC,SAASC,aAAa,QAAQ,KAAK;AAoBnC,OAAO,eAAeC,mBAAmBA,CAAA,EAAkB;EACzD,IAAI;IACF,MAAMC,SAAS,GAAGH,OAAO,CAACC,aAAa,CAACG,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC,CAAC;IACzD,MAAMC,WAAW,GAAGR,OAAO,CAACI,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,CAAC;IAExF,MAAM,CAAC;MAAEK,OAAO,EAAEC;IAAU,CAAC,EAAE;MAAED,OAAO,EAAEE;IAAU,CAAC,CAAC,GAAG,MAAMC,OAAO,CAACC,GAAG,CAAC,CACzE,MAAM,CAAC,kBAAmBd,aAAa,CAACC,OAAO,CAACQ,WAAW,EAAE,cAAc,CAAC,CAAC,CAACM,IAAI,CAAC,EAGnF,MAAM,CAAC,kBAAmBf,aAAa,CAACC,OAAO,CAACQ,WAAW,EAAE,eAAe,CAAC,CAAC,CAACM,IAAI,CAAC,CAQrF,CAAC;IAEF,MAAMC,GAAG,GAAGL,SAAS,CAACM,GAAG,CAACC,OAAO,CAACC,MAAM,CAAC;IACzC,IAAI,CAACH,GAAG,EAAE;IAEV,MAAMI,MAAM,GAAGJ,GAAG,CAACK,GAAG;IACtB,MAAMC,cAAc,GAAGV,SAAS,CAACW,MAAM,CAACP,GAAG,CAACQ,OAAO,CAACL,MAAM,EAAE;MAAEM,WAAW,EAAE;IAAK,CAAC,CAAC;;IAElF;IACA,IAAIT,GAAG,CAACU,kBAAkB,EAAE;MAC1BJ,cAAc,CAACK,IAAI,CAACX,GAAG,CAACU,kBAAkB,CAAC;IAC7C;IACA,IAAIV,GAAG,CAACY,cAAc,EAAE;MACtBN,cAAc,CAACO,iBAAiB,CAACb,GAAG,CAACY,cAAc,CAAC;IACtD;;IAEA;IACAZ,GAAG,CAACK,GAAG,GAAGC,cAAc;;IAExB;IACA;IACA,IAAIN,GAAG,CAACc,YAAY,KAAMV,MAAkB,EAAE;MAC5CJ,GAAG,CAACc,YAAY,GAAGR,cAAc;IACnC;EACF,CAAC,CAAC,MAAM;IACN;EAAA;AAEJ","ignoreList":[]}