whale-code 6.5.4 → 6.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (853) hide show
  1. package/README.md +39 -31
  2. package/bin/{swagmanager-mcp.js → whale-code.js} +17 -2
  3. package/dist/cli/app.js +148 -72
  4. package/dist/cli/app.js.map +1 -0
  5. package/dist/cli/chat/AgentSelector.js +105 -10
  6. package/dist/cli/chat/AgentSelector.js.map +1 -0
  7. package/dist/cli/chat/ChatApp.d.ts +31 -0
  8. package/dist/cli/chat/ChatApp.js +539 -286
  9. package/dist/cli/chat/ChatApp.js.map +1 -0
  10. package/dist/cli/chat/ChatInput.js +1088 -770
  11. package/dist/cli/chat/ChatInput.js.map +1 -0
  12. package/dist/cli/chat/MarkdownText.js +39 -14
  13. package/dist/cli/chat/MarkdownText.js.map +1 -0
  14. package/dist/cli/chat/MemoryManager.js +181 -46
  15. package/dist/cli/chat/MemoryManager.js.map +1 -0
  16. package/dist/cli/chat/MessageList.d.ts +2 -3
  17. package/dist/cli/chat/MessageList.js +186 -45
  18. package/dist/cli/chat/MessageList.js.map +1 -0
  19. package/dist/cli/chat/ModelSelector.js +282 -63
  20. package/dist/cli/chat/ModelSelector.js.map +1 -0
  21. package/dist/cli/chat/NodeManager.js +165 -75
  22. package/dist/cli/chat/NodeManager.js.map +1 -0
  23. package/dist/cli/chat/NodeSelector.js +171 -30
  24. package/dist/cli/chat/NodeSelector.js.map +1 -0
  25. package/dist/cli/chat/PlanApproval.js +281 -57
  26. package/dist/cli/chat/PlanApproval.js.map +1 -0
  27. package/dist/cli/chat/RewindViewer.js +559 -144
  28. package/dist/cli/chat/RewindViewer.js.map +1 -0
  29. package/dist/cli/chat/SessionManager.js +137 -30
  30. package/dist/cli/chat/SessionManager.js.map +1 -0
  31. package/dist/cli/chat/SlashMenu.js +293 -164
  32. package/dist/cli/chat/SlashMenu.js.map +1 -0
  33. package/dist/cli/chat/StatusBar.js +172 -9
  34. package/dist/cli/chat/StatusBar.js.map +1 -0
  35. package/dist/cli/chat/StoreSelector.js +147 -18
  36. package/dist/cli/chat/StoreSelector.js.map +1 -0
  37. package/dist/cli/chat/StreamingText.d.ts +1 -5
  38. package/dist/cli/chat/StreamingText.js +22 -7
  39. package/dist/cli/chat/StreamingText.js.map +1 -0
  40. package/dist/cli/chat/SubagentPanel.d.ts +1 -2
  41. package/dist/cli/chat/SubagentPanel.js +612 -72
  42. package/dist/cli/chat/SubagentPanel.js.map +1 -0
  43. package/dist/cli/chat/TeamPanel.d.ts +1 -0
  44. package/dist/cli/chat/TeamPanel.js +230 -30
  45. package/dist/cli/chat/TeamPanel.js.map +1 -0
  46. package/dist/cli/chat/ThemeSelector.js +84 -24
  47. package/dist/cli/chat/ThemeSelector.js.map +1 -0
  48. package/dist/cli/chat/ToolIndicator.js +1476 -371
  49. package/dist/cli/chat/ToolIndicator.js.map +1 -0
  50. package/dist/cli/chat/hooks/useAgentLoop.d.ts +1 -0
  51. package/dist/cli/chat/hooks/useAgentLoop.js +481 -367
  52. package/dist/cli/chat/hooks/useAgentLoop.js.map +1 -0
  53. package/dist/cli/chat/hooks/useSlashCommands.d.ts +3 -14
  54. package/dist/cli/chat/hooks/useSlashCommands.js +744 -572
  55. package/dist/cli/chat/hooks/useSlashCommands.js.map +1 -0
  56. package/dist/cli/commands/config-cmd.js +56 -57
  57. package/dist/cli/commands/config-cmd.js.map +1 -0
  58. package/dist/cli/commands/db.js +184 -169
  59. package/dist/cli/commands/db.js.map +1 -0
  60. package/dist/cli/commands/doctor.js +212 -122
  61. package/dist/cli/commands/doctor.js.map +1 -0
  62. package/dist/cli/commands/init.js +211 -244
  63. package/dist/cli/commands/init.js.map +1 -0
  64. package/dist/cli/commands/mcp.js +127 -122
  65. package/dist/cli/commands/mcp.js.map +1 -0
  66. package/dist/cli/login/LoginApp.js +355 -141
  67. package/dist/cli/login/LoginApp.js.map +1 -0
  68. package/dist/cli/print-mode.js +196 -177
  69. package/dist/cli/print-mode.js.map +1 -0
  70. package/dist/cli/serve-mode.js +615 -530
  71. package/dist/cli/serve-mode.js.map +1 -0
  72. package/dist/cli/services/agent-config.d.ts +29 -0
  73. package/dist/cli/services/agent-config.js +91 -0
  74. package/dist/cli/services/agent-config.js.map +1 -0
  75. package/dist/cli/services/agent-definitions.d.ts +4 -1
  76. package/dist/cli/services/agent-definitions.js +97 -56
  77. package/dist/cli/services/agent-definitions.js.map +1 -0
  78. package/dist/cli/services/agent-events.js +225 -162
  79. package/dist/cli/services/agent-events.js.map +1 -0
  80. package/dist/cli/services/agent-loop.js +978 -669
  81. package/dist/cli/services/agent-loop.js.map +1 -0
  82. package/dist/cli/services/agent-worker-base.d.ts +35 -5
  83. package/dist/cli/services/agent-worker-base.js +337 -153
  84. package/dist/cli/services/agent-worker-base.js.map +1 -0
  85. package/dist/cli/services/api-retry.js +69 -64
  86. package/dist/cli/services/api-retry.js.map +1 -0
  87. package/dist/cli/services/auth-service.d.ts +3 -3
  88. package/dist/cli/services/auth-service.js +209 -132
  89. package/dist/cli/services/auth-service.js.map +1 -0
  90. package/dist/cli/services/background-processes.js +343 -267
  91. package/dist/cli/services/background-processes.js.map +1 -0
  92. package/dist/cli/services/browser-auth.d.ts +2 -2
  93. package/dist/cli/services/browser-auth.js +159 -118
  94. package/dist/cli/services/browser-auth.js.map +1 -0
  95. package/dist/cli/services/claude-md-loader.js +40 -36
  96. package/dist/cli/services/claude-md-loader.js.map +1 -0
  97. package/dist/cli/services/config-store.d.ts +9 -4
  98. package/dist/cli/services/config-store.js +164 -117
  99. package/dist/cli/services/config-store.js.map +1 -0
  100. package/dist/cli/services/debug-log.d.ts +1 -1
  101. package/dist/cli/services/debug-log.js +34 -35
  102. package/dist/cli/services/debug-log.js.map +1 -0
  103. package/dist/cli/services/env-detect.d.ts +7 -0
  104. package/dist/cli/services/env-detect.js +9 -0
  105. package/dist/cli/services/env-detect.js.map +1 -0
  106. package/dist/cli/services/error-logger.d.ts +2 -3
  107. package/dist/cli/services/error-logger.js +189 -180
  108. package/dist/cli/services/error-logger.js.map +1 -0
  109. package/dist/cli/services/file-history.d.ts +1 -1
  110. package/dist/cli/services/file-history.js +50 -54
  111. package/dist/cli/services/file-history.js.map +1 -0
  112. package/dist/cli/services/format-server-response.js +332 -372
  113. package/dist/cli/services/format-server-response.js.map +1 -0
  114. package/dist/cli/services/git-context.js +61 -45
  115. package/dist/cli/services/git-context.js.map +1 -0
  116. package/dist/cli/services/hooks.d.ts +2 -2
  117. package/dist/cli/services/hooks.js +195 -180
  118. package/dist/cli/services/hooks.js.map +1 -0
  119. package/dist/cli/services/ink-incremental.d.ts +19 -0
  120. package/dist/cli/services/ink-incremental.js +59 -0
  121. package/dist/cli/services/ink-incremental.js.map +1 -0
  122. package/dist/cli/services/ink-resize-fix.js +54 -44
  123. package/dist/cli/services/ink-resize-fix.js.map +1 -0
  124. package/dist/cli/services/ink-sync-output.d.ts +12 -0
  125. package/dist/cli/services/ink-sync-output.js +16 -0
  126. package/dist/cli/services/ink-sync-output.js.map +1 -0
  127. package/dist/cli/services/interactive-tools.js +268 -212
  128. package/dist/cli/services/interactive-tools.js.map +1 -0
  129. package/dist/cli/services/keybinding-manager.d.ts +11 -1
  130. package/dist/cli/services/keybinding-manager.js +126 -63
  131. package/dist/cli/services/keybinding-manager.js.map +1 -0
  132. package/dist/cli/services/local-tools.d.ts +1 -1
  133. package/dist/cli/services/local-tools.js +939 -656
  134. package/dist/cli/services/local-tools.js.map +1 -0
  135. package/dist/cli/services/lsp-manager.js +757 -594
  136. package/dist/cli/services/lsp-manager.js.map +1 -0
  137. package/dist/cli/services/mcp-client.d.ts +1 -1
  138. package/dist/cli/services/mcp-client.js +173 -134
  139. package/dist/cli/services/mcp-client.js.map +1 -0
  140. package/dist/cli/services/memory-manager.js +53 -40
  141. package/dist/cli/services/memory-manager.js.map +1 -0
  142. package/dist/cli/services/model-manager.js +55 -40
  143. package/dist/cli/services/model-manager.js.map +1 -0
  144. package/dist/cli/services/model-router.js +115 -85
  145. package/dist/cli/services/model-router.js.map +1 -0
  146. package/dist/cli/services/paths.d.ts +30 -0
  147. package/dist/cli/services/paths.js +81 -0
  148. package/dist/cli/services/paths.js.map +1 -0
  149. package/dist/cli/services/permission-modes.js +32 -25
  150. package/dist/cli/services/permission-modes.js.map +1 -0
  151. package/dist/cli/services/rewind.js +182 -168
  152. package/dist/cli/services/rewind.js.map +1 -0
  153. package/dist/cli/services/ripgrep.js +115 -115
  154. package/dist/cli/services/ripgrep.js.map +1 -0
  155. package/dist/cli/services/sandbox.d.ts +1 -1
  156. package/dist/cli/services/sandbox.js +58 -37
  157. package/dist/cli/services/sandbox.js.map +1 -0
  158. package/dist/cli/services/server-tools.js +738 -565
  159. package/dist/cli/services/server-tools.js.map +1 -0
  160. package/dist/cli/services/session-persistence.js +69 -74
  161. package/dist/cli/services/session-persistence.js.map +1 -0
  162. package/dist/cli/services/subagent-worker.js +42 -27
  163. package/dist/cli/services/subagent-worker.js.map +1 -0
  164. package/dist/cli/services/subagent.d.ts +2 -0
  165. package/dist/cli/services/subagent.js +606 -430
  166. package/dist/cli/services/subagent.js.map +1 -0
  167. package/dist/cli/services/system-prompt.js +86 -78
  168. package/dist/cli/services/system-prompt.js.map +1 -0
  169. package/dist/cli/services/task-decomposer.d.ts +1 -1
  170. package/dist/cli/services/task-decomposer.js +172 -139
  171. package/dist/cli/services/task-decomposer.js.map +1 -0
  172. package/dist/cli/services/team-lead.d.ts +2 -2
  173. package/dist/cli/services/team-lead.js +727 -529
  174. package/dist/cli/services/team-lead.js.map +1 -0
  175. package/dist/cli/services/team-state.js +319 -319
  176. package/dist/cli/services/team-state.js.map +1 -0
  177. package/dist/cli/services/teammate.d.ts +8 -2
  178. package/dist/cli/services/teammate.js +862 -560
  179. package/dist/cli/services/teammate.js.map +1 -0
  180. package/dist/cli/services/telemetry.d.ts +6 -1
  181. package/dist/cli/services/telemetry.js +180 -157
  182. package/dist/cli/services/telemetry.js.map +1 -0
  183. package/dist/cli/services/tools/agent-tools.d.ts +3 -3
  184. package/dist/cli/services/tools/agent-tools.js +480 -322
  185. package/dist/cli/services/tools/agent-tools.js.map +1 -0
  186. package/dist/cli/services/tools/file-ops.js +563 -450
  187. package/dist/cli/services/tools/file-ops.js.map +1 -0
  188. package/dist/cli/services/tools/search-tools.js +231 -162
  189. package/dist/cli/services/tools/search-tools.js.map +1 -0
  190. package/dist/cli/services/tools/shell-exec.js +197 -151
  191. package/dist/cli/services/tools/shell-exec.js.map +1 -0
  192. package/dist/cli/services/tools/task-manager.js +206 -173
  193. package/dist/cli/services/tools/task-manager.js.map +1 -0
  194. package/dist/cli/services/tools/web-tools.js +388 -341
  195. package/dist/cli/services/tools/web-tools.js.map +1 -0
  196. package/dist/cli/setup/SetupApp.d.ts +2 -2
  197. package/dist/cli/setup/SetupApp.js +608 -160
  198. package/dist/cli/setup/SetupApp.js.map +1 -0
  199. package/dist/cli/shared/ErrorBoundary.d.ts +22 -0
  200. package/dist/cli/shared/ErrorBoundary.js +73 -0
  201. package/dist/cli/shared/ErrorBoundary.js.map +1 -0
  202. package/dist/cli/shared/MatrixIntro.js +66 -69
  203. package/dist/cli/shared/MatrixIntro.js.map +1 -0
  204. package/dist/cli/shared/SpinnerSlot.d.ts +14 -0
  205. package/dist/cli/shared/SpinnerSlot.js +63 -0
  206. package/dist/cli/shared/SpinnerSlot.js.map +1 -0
  207. package/dist/cli/shared/Theme.d.ts +1 -1
  208. package/dist/cli/shared/Theme.js +136 -92
  209. package/dist/cli/shared/Theme.js.map +1 -0
  210. package/dist/cli/shared/WhaleBanner.js +99 -11
  211. package/dist/cli/shared/WhaleBanner.js.map +1 -0
  212. package/dist/cli/shared/markdown.d.ts +3 -1
  213. package/dist/cli/shared/markdown.js +736 -674
  214. package/dist/cli/shared/markdown.js.map +1 -0
  215. package/dist/cli/shared/marked-terminal.d.js +2 -0
  216. package/dist/cli/shared/marked-terminal.d.js.map +1 -0
  217. package/dist/cli/shared/theme-manager.js +99 -90
  218. package/dist/cli/shared/theme-manager.js.map +1 -0
  219. package/dist/cli/shared/theme-presets.js +256 -254
  220. package/dist/cli/shared/theme-presets.js.map +1 -0
  221. package/dist/cli/status/StatusApp.js +235 -86
  222. package/dist/cli/status/StatusApp.js.map +1 -0
  223. package/dist/cli/stores/StoreApp.js +275 -65
  224. package/dist/cli/stores/StoreApp.js.map +1 -0
  225. package/dist/index.d.ts +2 -2
  226. package/dist/index.js +509 -396
  227. package/dist/index.js.map +1 -0
  228. package/dist/local-agent/connection.d.ts +2 -2
  229. package/dist/local-agent/connection.js +352 -293
  230. package/dist/local-agent/connection.js.map +1 -0
  231. package/dist/local-agent/discovery.js +259 -122
  232. package/dist/local-agent/discovery.js.map +1 -0
  233. package/dist/local-agent/executor.js +216 -193
  234. package/dist/local-agent/executor.js.map +1 -0
  235. package/dist/local-agent/index.d.ts +2 -2
  236. package/dist/local-agent/index.js +156 -156
  237. package/dist/local-agent/index.js.map +1 -0
  238. package/dist/node/adapters/base.js +18 -8
  239. package/dist/node/adapters/base.js.map +1 -0
  240. package/dist/node/adapters/discord.js +286 -275
  241. package/dist/node/adapters/discord.js.map +1 -0
  242. package/dist/node/adapters/email.js +189 -202
  243. package/dist/node/adapters/email.js.map +1 -0
  244. package/dist/node/adapters/imessage.js +145 -142
  245. package/dist/node/adapters/imessage.js.map +1 -0
  246. package/dist/node/adapters/slack.js +237 -236
  247. package/dist/node/adapters/slack.js.map +1 -0
  248. package/dist/node/adapters/sms.js +149 -151
  249. package/dist/node/adapters/sms.js.map +1 -0
  250. package/dist/node/adapters/telegram.js +88 -92
  251. package/dist/node/adapters/telegram.js.map +1 -0
  252. package/dist/node/adapters/webchat.js +160 -136
  253. package/dist/node/adapters/webchat.js.map +1 -0
  254. package/dist/node/adapters/whatsapp.js +212 -215
  255. package/dist/node/adapters/whatsapp.js.map +1 -0
  256. package/dist/node/cli.js +884 -653
  257. package/dist/node/cli.js.map +1 -0
  258. package/dist/node/config.js +20 -18
  259. package/dist/node/config.js.map +1 -0
  260. package/dist/node/gateway-client.js +191 -181
  261. package/dist/node/gateway-client.js.map +1 -0
  262. package/dist/node/portal/clipboard.js +161 -130
  263. package/dist/node/portal/clipboard.js.map +1 -0
  264. package/dist/node/portal/discovery.js +51 -45
  265. package/dist/node/portal/discovery.js.map +1 -0
  266. package/dist/node/portal/forward.js +64 -58
  267. package/dist/node/portal/forward.js.map +1 -0
  268. package/dist/node/portal/index.js +246 -221
  269. package/dist/node/portal/index.js.map +1 -0
  270. package/dist/node/portal/multiplexer.js +192 -182
  271. package/dist/node/portal/multiplexer.js.map +1 -0
  272. package/dist/node/portal/permissions.js +102 -70
  273. package/dist/node/portal/permissions.js.map +1 -0
  274. package/dist/node/portal/protocol.js +153 -116
  275. package/dist/node/portal/protocol.js.map +1 -0
  276. package/dist/node/portal/screen.js +80 -69
  277. package/dist/node/portal/screen.js.map +1 -0
  278. package/dist/node/portal/session.js +124 -117
  279. package/dist/node/portal/session.js.map +1 -0
  280. package/dist/node/portal/shell.js +140 -113
  281. package/dist/node/portal/shell.js.map +1 -0
  282. package/dist/node/portal/stream.js +77 -75
  283. package/dist/node/portal/stream.js.map +1 -0
  284. package/dist/node/portal/transfer.js +190 -167
  285. package/dist/node/portal/transfer.js.map +1 -0
  286. package/dist/node/portal/ui.js +124 -99
  287. package/dist/node/portal/ui.js.map +1 -0
  288. package/dist/node/remote-desktop/compile-helper.js +50 -45
  289. package/dist/node/remote-desktop/compile-helper.js.map +1 -0
  290. package/dist/node/remote-desktop/index.js +215 -187
  291. package/dist/node/remote-desktop/index.js.map +1 -0
  292. package/dist/node/remote-desktop/protocol.js +45 -29
  293. package/dist/node/remote-desktop/protocol.js.map +1 -0
  294. package/dist/node/runtime.js +493 -410
  295. package/dist/node/runtime.js.map +1 -0
  296. package/dist/server/handlers/__test-utils__/test-db.js +39 -89
  297. package/dist/server/handlers/__test-utils__/test-db.js.map +1 -0
  298. package/dist/server/handlers/analytics.js +467 -261
  299. package/dist/server/handlers/analytics.js.map +1 -0
  300. package/dist/server/handlers/api-docs.d.ts +6 -0
  301. package/dist/server/handlers/api-docs.js +1613 -0
  302. package/dist/server/handlers/api-docs.js.map +1 -0
  303. package/dist/server/handlers/api-keys.js +295 -232
  304. package/dist/server/handlers/api-keys.js.map +1 -0
  305. package/dist/server/handlers/billing.js +330 -239
  306. package/dist/server/handlers/billing.js.map +1 -0
  307. package/dist/server/handlers/browser.js +468 -395
  308. package/dist/server/handlers/browser.js.map +1 -0
  309. package/dist/server/handlers/catalog.js +1377 -978
  310. package/dist/server/handlers/catalog.js.map +1 -0
  311. package/dist/server/handlers/clickhouse.js +157 -109
  312. package/dist/server/handlers/clickhouse.js.map +1 -0
  313. package/dist/server/handlers/comms.d.ts +0 -53
  314. package/dist/server/handlers/comms.js +1443 -970
  315. package/dist/server/handlers/comms.js.map +1 -0
  316. package/dist/server/handlers/creations.js +461 -394
  317. package/dist/server/handlers/creations.js.map +1 -0
  318. package/dist/server/handlers/crm.js +1082 -791
  319. package/dist/server/handlers/crm.js.map +1 -0
  320. package/dist/server/handlers/discovery.js +251 -232
  321. package/dist/server/handlers/discovery.js.map +1 -0
  322. package/dist/server/handlers/embeddings.js +241 -164
  323. package/dist/server/handlers/embeddings.js.map +1 -0
  324. package/dist/server/handlers/enrichment.js +887 -718
  325. package/dist/server/handlers/enrichment.js.map +1 -0
  326. package/dist/server/handlers/image-gen.js +467 -376
  327. package/dist/server/handlers/image-gen.js.map +1 -0
  328. package/dist/server/handlers/inventory.js +797 -424
  329. package/dist/server/handlers/inventory.js.map +1 -0
  330. package/dist/server/handlers/kali.js +272 -230
  331. package/dist/server/handlers/kali.js.map +1 -0
  332. package/dist/server/handlers/llm-providers.js +803 -580
  333. package/dist/server/handlers/llm-providers.js.map +1 -0
  334. package/dist/server/handlers/local-agent.js +133 -105
  335. package/dist/server/handlers/local-agent.js.map +1 -0
  336. package/dist/server/handlers/media.js +1179 -857
  337. package/dist/server/handlers/media.js.map +1 -0
  338. package/dist/server/handlers/meta-ads.js +2669 -2093
  339. package/dist/server/handlers/meta-ads.js.map +1 -0
  340. package/dist/server/handlers/nodes.js +1321 -913
  341. package/dist/server/handlers/nodes.js.map +1 -0
  342. package/dist/server/handlers/operations.js +183 -157
  343. package/dist/server/handlers/operations.js.map +1 -0
  344. package/dist/server/handlers/platform.js +346 -210
  345. package/dist/server/handlers/platform.js.map +1 -0
  346. package/dist/server/handlers/remove-bg.js +118 -86
  347. package/dist/server/handlers/remove-bg.js.map +1 -0
  348. package/dist/server/handlers/storefront.js +586 -446
  349. package/dist/server/handlers/storefront.js.map +1 -0
  350. package/dist/server/handlers/supply-chain.js +546 -326
  351. package/dist/server/handlers/supply-chain.js.map +1 -0
  352. package/dist/server/handlers/transcription.js +106 -97
  353. package/dist/server/handlers/transcription.js.map +1 -0
  354. package/dist/server/handlers/video-gen.js +593 -424
  355. package/dist/server/handlers/video-gen.js.map +1 -0
  356. package/dist/server/handlers/voice.js +1458 -1017
  357. package/dist/server/handlers/voice.js.map +1 -0
  358. package/dist/server/handlers/workflow-steps.js +2837 -2116
  359. package/dist/server/handlers/workflow-steps.js.map +1 -0
  360. package/dist/server/handlers/workflows.js +1630 -933
  361. package/dist/server/handlers/workflows.js.map +1 -0
  362. package/dist/server/index.js +3166 -2390
  363. package/dist/server/index.js.map +1 -0
  364. package/dist/server/lib/batch-client.js +471 -409
  365. package/dist/server/lib/batch-client.js.map +1 -0
  366. package/dist/server/lib/clickhouse-buffer.js +118 -104
  367. package/dist/server/lib/clickhouse-buffer.js.map +1 -0
  368. package/dist/server/lib/clickhouse-client.js +107 -107
  369. package/dist/server/lib/clickhouse-client.js.map +1 -0
  370. package/dist/server/lib/coa-renderer.js +1786 -356
  371. package/dist/server/lib/coa-renderer.js.map +1 -0
  372. package/dist/server/lib/code-worker-pool.js +227 -177
  373. package/dist/server/lib/code-worker-pool.js.map +1 -0
  374. package/dist/server/lib/code-worker.js +174 -164
  375. package/dist/server/lib/code-worker.js.map +1 -0
  376. package/dist/server/lib/compaction-service.d.ts +2 -12
  377. package/dist/server/lib/compaction-service.js +74 -184
  378. package/dist/server/lib/compaction-service.js.map +1 -0
  379. package/dist/server/lib/logger.js +36 -24
  380. package/dist/server/lib/logger.js.map +1 -0
  381. package/dist/server/lib/otel.js +101 -80
  382. package/dist/server/lib/otel.js.map +1 -0
  383. package/dist/server/lib/pdf-renderer.d.ts +1 -1
  384. package/dist/server/lib/pdf-renderer.js +954 -776
  385. package/dist/server/lib/pdf-renderer.js.map +1 -0
  386. package/dist/server/lib/prompt-sanitizer.js +188 -108
  387. package/dist/server/lib/prompt-sanitizer.js.map +1 -0
  388. package/dist/server/lib/provider-capabilities.js +136 -138
  389. package/dist/server/lib/provider-capabilities.js.map +1 -0
  390. package/dist/server/lib/provider-failover.js +190 -168
  391. package/dist/server/lib/provider-failover.js.map +1 -0
  392. package/dist/server/lib/rate-limiter.js +186 -117
  393. package/dist/server/lib/rate-limiter.js.map +1 -0
  394. package/dist/server/lib/react-pdf-layout.js +551 -382
  395. package/dist/server/lib/react-pdf-layout.js.map +1 -0
  396. package/dist/server/lib/server-agent-loop.d.ts +9 -0
  397. package/dist/server/lib/server-agent-loop.js +906 -624
  398. package/dist/server/lib/server-agent-loop.js.map +1 -0
  399. package/dist/server/lib/server-subagent.d.ts +2 -0
  400. package/dist/server/lib/server-subagent.js +260 -162
  401. package/dist/server/lib/server-subagent.js.map +1 -0
  402. package/dist/server/lib/session-checkpoint.js +105 -96
  403. package/dist/server/lib/session-checkpoint.js.map +1 -0
  404. package/dist/server/lib/ssrf-guard.js +193 -184
  405. package/dist/server/lib/ssrf-guard.js.map +1 -0
  406. package/dist/server/lib/supabase-client.js +94 -82
  407. package/dist/server/lib/supabase-client.js.map +1 -0
  408. package/dist/server/lib/template-resolver.js +154 -176
  409. package/dist/server/lib/template-resolver.js.map +1 -0
  410. package/dist/server/lib/utils.js +242 -133
  411. package/dist/server/lib/utils.js.map +1 -0
  412. package/dist/server/local-agent-gateway.d.ts +2 -2
  413. package/dist/server/local-agent-gateway.js +785 -627
  414. package/dist/server/local-agent-gateway.js.map +1 -0
  415. package/dist/server/providers/anthropic.js +254 -176
  416. package/dist/server/providers/anthropic.js.map +1 -0
  417. package/dist/server/providers/bedrock.js +221 -162
  418. package/dist/server/providers/bedrock.js.map +1 -0
  419. package/dist/server/providers/gemini.js +548 -418
  420. package/dist/server/providers/gemini.js.map +1 -0
  421. package/dist/server/providers/openai.js +571 -437
  422. package/dist/server/providers/openai.js.map +1 -0
  423. package/dist/server/providers/registry.js +23 -18
  424. package/dist/server/providers/registry.js.map +1 -0
  425. package/dist/server/providers/shared.js +123 -95
  426. package/dist/server/providers/shared.js.map +1 -0
  427. package/dist/server/providers/types.js +1 -11
  428. package/dist/server/providers/types.js.map +1 -0
  429. package/dist/server/proxy-handlers.js +209 -165
  430. package/dist/server/proxy-handlers.js.map +1 -0
  431. package/dist/server/tool-router.d.ts +13 -0
  432. package/dist/server/tool-router.js +960 -598
  433. package/dist/server/tool-router.js.map +1 -0
  434. package/dist/server/validation.js +248 -188
  435. package/dist/server/validation.js.map +1 -0
  436. package/dist/server/worker.js +202 -133
  437. package/dist/server/worker.js.map +1 -0
  438. package/dist/setup.d.ts +2 -2
  439. package/dist/setup.js +151 -147
  440. package/dist/setup.js.map +1 -0
  441. package/dist/shared/agent-core.d.ts +191 -24
  442. package/dist/shared/agent-core.js +971 -462
  443. package/dist/shared/agent-core.js.map +1 -0
  444. package/dist/shared/anthropic-types.js +1 -6
  445. package/dist/shared/anthropic-types.js.map +1 -0
  446. package/dist/shared/api-client.d.ts +17 -9
  447. package/dist/shared/api-client.js +419 -327
  448. package/dist/shared/api-client.js.map +1 -0
  449. package/dist/shared/compaction.d.ts +36 -0
  450. package/dist/shared/compaction.js +138 -0
  451. package/dist/shared/compaction.js.map +1 -0
  452. package/dist/shared/constants.js +67 -64
  453. package/dist/shared/constants.js.map +1 -0
  454. package/dist/shared/sse-parser.js +221 -219
  455. package/dist/shared/sse-parser.js.map +1 -0
  456. package/dist/shared/tool-dispatch.d.ts +4 -2
  457. package/dist/shared/tool-dispatch.js +226 -165
  458. package/dist/shared/tool-dispatch.js.map +1 -0
  459. package/dist/shared/types.js +1 -6
  460. package/dist/shared/types.js.map +1 -0
  461. package/dist/types/cli-highlight.d.js +2 -0
  462. package/dist/types/cli-highlight.d.js.map +1 -0
  463. package/dist/types/diff.d.js +2 -0
  464. package/dist/types/diff.d.js.map +1 -0
  465. package/dist/types/pdf-parse.d.js +2 -0
  466. package/dist/types/pdf-parse.d.js.map +1 -0
  467. package/dist/updater.d.ts +1 -1
  468. package/dist/updater.js +118 -92
  469. package/dist/updater.js.map +1 -0
  470. package/dist/webchat/widget.js +227 -380
  471. package/dist/webchat/widget.js.map +1 -0
  472. package/package.json +22 -10
  473. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  474. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  475. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  476. package/vendor/ink/build/apply-styles.js +175 -0
  477. package/vendor/ink/build/build-layout.js +77 -0
  478. package/vendor/ink/build/calculate-wrapped-text.js +53 -0
  479. package/vendor/ink/build/colorize.d.ts +3 -0
  480. package/vendor/ink/build/colorize.js +48 -0
  481. package/vendor/ink/build/colorize.js.map +1 -0
  482. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  483. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  484. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  485. package/vendor/ink/build/components/App.d.ts +18 -0
  486. package/vendor/ink/build/components/App.js +351 -0
  487. package/vendor/ink/build/components/App.js.map +1 -0
  488. package/vendor/ink/build/components/AppContext.d.ts +15 -0
  489. package/vendor/ink/build/components/AppContext.js +11 -0
  490. package/vendor/ink/build/components/AppContext.js.map +1 -0
  491. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  492. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  493. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  494. package/vendor/ink/build/components/Box.d.ts +117 -0
  495. package/vendor/ink/build/components/Box.js +34 -0
  496. package/vendor/ink/build/components/Box.js.map +1 -0
  497. package/vendor/ink/build/components/Color.js +62 -0
  498. package/vendor/ink/build/components/Cursor.d.ts +83 -0
  499. package/vendor/ink/build/components/Cursor.js +53 -0
  500. package/vendor/ink/build/components/Cursor.js.map +1 -0
  501. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  502. package/vendor/ink/build/components/CursorContext.js +8 -0
  503. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  504. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  505. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  506. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  507. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  508. package/vendor/ink/build/components/ErrorOverview.js +84 -0
  509. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  510. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  511. package/vendor/ink/build/components/FocusContext.js +17 -0
  512. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  513. package/vendor/ink/build/components/Newline.d.ts +13 -0
  514. package/vendor/ink/build/components/Newline.js +8 -0
  515. package/vendor/ink/build/components/Newline.js.map +1 -0
  516. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  517. package/vendor/ink/build/components/Spacer.js +11 -0
  518. package/vendor/ink/build/components/Spacer.js.map +1 -0
  519. package/vendor/ink/build/components/Static.d.ts +24 -0
  520. package/vendor/ink/build/components/Static.js +28 -0
  521. package/vendor/ink/build/components/Static.js.map +1 -0
  522. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  523. package/vendor/ink/build/components/StderrContext.js +13 -0
  524. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  525. package/vendor/ink/build/components/StdinContext.d.ts +22 -0
  526. package/vendor/ink/build/components/StdinContext.js +19 -0
  527. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  528. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  529. package/vendor/ink/build/components/StdoutContext.js +13 -0
  530. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  531. package/vendor/ink/build/components/Text.d.ts +55 -0
  532. package/vendor/ink/build/components/Text.js +50 -0
  533. package/vendor/ink/build/components/Text.js.map +1 -0
  534. package/vendor/ink/build/components/Transform.d.ts +16 -0
  535. package/vendor/ink/build/components/Transform.js +15 -0
  536. package/vendor/ink/build/components/Transform.js.map +1 -0
  537. package/vendor/ink/build/cursor-helpers.d.ts +38 -0
  538. package/vendor/ink/build/cursor-helpers.js +56 -0
  539. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  540. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  541. package/vendor/ink/build/devtools-window-polyfill.js +65 -0
  542. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  543. package/vendor/ink/build/devtools.d.ts +1 -0
  544. package/vendor/ink/build/devtools.js +11 -0
  545. package/vendor/ink/build/devtools.js.map +1 -0
  546. package/vendor/ink/build/dom.d.ts +56 -0
  547. package/vendor/ink/build/dom.js +124 -0
  548. package/vendor/ink/build/dom.js.map +1 -0
  549. package/vendor/ink/build/experimental/apply-style.js +140 -0
  550. package/vendor/ink/build/experimental/dom.js +123 -0
  551. package/vendor/ink/build/experimental/output.js +91 -0
  552. package/vendor/ink/build/experimental/reconciler.js +141 -0
  553. package/vendor/ink/build/experimental/renderer.js +81 -0
  554. package/vendor/ink/build/get-max-width.d.ts +3 -0
  555. package/vendor/ink/build/get-max-width.js +10 -0
  556. package/vendor/ink/build/get-max-width.js.map +1 -0
  557. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  558. package/vendor/ink/build/hooks/use-app.js +8 -0
  559. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  560. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  561. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  562. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  563. package/vendor/ink/build/hooks/use-focus-manager.d.ts +28 -0
  564. package/vendor/ink/build/hooks/use-focus-manager.js +17 -0
  565. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  566. package/vendor/ink/build/hooks/use-focus.d.ts +29 -0
  567. package/vendor/ink/build/hooks/use-focus.js +42 -0
  568. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  569. package/vendor/ink/build/hooks/use-input.d.ts +131 -0
  570. package/vendor/ink/build/hooks/use-input.js +124 -0
  571. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  572. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +5 -0
  573. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +11 -0
  574. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  575. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  576. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  577. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  578. package/vendor/ink/build/hooks/use-stdin.d.ts +5 -0
  579. package/vendor/ink/build/hooks/use-stdin.js +8 -0
  580. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  581. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  582. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  583. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  584. package/vendor/ink/build/hooks/useInput.js +38 -0
  585. package/vendor/ink/build/index.d.ts +34 -0
  586. package/vendor/ink/build/index.js +20 -0
  587. package/vendor/ink/build/index.js.map +1 -0
  588. package/vendor/ink/build/ink.d.ts +90 -0
  589. package/vendor/ink/build/ink.js +654 -0
  590. package/vendor/ink/build/ink.js.map +1 -0
  591. package/vendor/ink/build/input-parser.d.ts +7 -0
  592. package/vendor/ink/build/input-parser.js +154 -0
  593. package/vendor/ink/build/input-parser.js.map +1 -0
  594. package/vendor/ink/build/instance.js +205 -0
  595. package/vendor/ink/build/instances.d.ts +3 -0
  596. package/vendor/ink/build/instances.js +8 -0
  597. package/vendor/ink/build/instances.js.map +1 -0
  598. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  599. package/vendor/ink/build/kitty-keyboard.js +32 -0
  600. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  601. package/vendor/ink/build/layout.d.ts +7 -0
  602. package/vendor/ink/build/layout.js +33 -0
  603. package/vendor/ink/build/layout.js.map +1 -0
  604. package/vendor/ink/build/log-update.d.ts +19 -0
  605. package/vendor/ink/build/log-update.js +243 -0
  606. package/vendor/ink/build/log-update.js.map +1 -0
  607. package/vendor/ink/build/measure-element.d.ts +16 -0
  608. package/vendor/ink/build/measure-element.js +9 -0
  609. package/vendor/ink/build/measure-element.js.map +1 -0
  610. package/vendor/ink/build/measure-text.d.ts +6 -0
  611. package/vendor/ink/build/measure-text.js +21 -0
  612. package/vendor/ink/build/measure-text.js.map +1 -0
  613. package/vendor/ink/build/options.d.ts +52 -0
  614. package/vendor/ink/build/options.js +2 -0
  615. package/vendor/ink/build/options.js.map +1 -0
  616. package/vendor/ink/build/output.d.ts +35 -0
  617. package/vendor/ink/build/output.js +183 -0
  618. package/vendor/ink/build/output.js.map +1 -0
  619. package/vendor/ink/build/parse-keypress.d.ts +22 -0
  620. package/vendor/ink/build/parse-keypress.js +493 -0
  621. package/vendor/ink/build/parse-keypress.js.map +1 -0
  622. package/vendor/ink/build/reconciler.d.ts +4 -0
  623. package/vendor/ink/build/reconciler.js +274 -0
  624. package/vendor/ink/build/reconciler.js.map +1 -0
  625. package/vendor/ink/build/render-background.d.ts +4 -0
  626. package/vendor/ink/build/render-background.js +25 -0
  627. package/vendor/ink/build/render-background.js.map +1 -0
  628. package/vendor/ink/build/render-border.d.ts +4 -0
  629. package/vendor/ink/build/render-border.js +73 -0
  630. package/vendor/ink/build/render-border.js.map +1 -0
  631. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  632. package/vendor/ink/build/render-node-to-output.js +147 -0
  633. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  634. package/vendor/ink/build/render-to-string.d.ts +38 -0
  635. package/vendor/ink/build/render-to-string.js +115 -0
  636. package/vendor/ink/build/render-to-string.js.map +1 -0
  637. package/vendor/ink/build/render.d.ts +121 -0
  638. package/vendor/ink/build/render.js +55 -0
  639. package/vendor/ink/build/render.js.map +1 -0
  640. package/vendor/ink/build/renderer.d.ts +8 -0
  641. package/vendor/ink/build/renderer.js +55 -0
  642. package/vendor/ink/build/renderer.js.map +1 -0
  643. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  644. package/vendor/ink/build/sanitize-ansi.js +27 -0
  645. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  646. package/vendor/ink/build/screen-reader-update.d.ts +13 -0
  647. package/vendor/ink/build/screen-reader-update.js +38 -0
  648. package/vendor/ink/build/screen-reader-update.js.map +1 -0
  649. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  650. package/vendor/ink/build/squash-text-nodes.js +36 -0
  651. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  652. package/vendor/ink/build/styles.d.ts +240 -0
  653. package/vendor/ink/build/styles.js +232 -0
  654. package/vendor/ink/build/styles.js.map +1 -0
  655. package/vendor/ink/build/utils.d.ts +2 -0
  656. package/vendor/ink/build/utils.js +4 -0
  657. package/vendor/ink/build/utils.js.map +1 -0
  658. package/vendor/ink/build/wrap-text.d.ts +3 -0
  659. package/vendor/ink/build/wrap-text.js +31 -0
  660. package/vendor/ink/build/wrap-text.js.map +1 -0
  661. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  662. package/vendor/ink/build/write-synchronized.js +7 -0
  663. package/vendor/ink/build/write-synchronized.js.map +1 -0
  664. package/vendor/ink/license +10 -0
  665. package/vendor/ink/node_modules/@types/node/LICENSE +21 -0
  666. package/vendor/ink/node_modules/@types/node/README.md +15 -0
  667. package/vendor/ink/node_modules/@types/node/assert/strict.d.ts +105 -0
  668. package/vendor/ink/node_modules/@types/node/assert.d.ts +955 -0
  669. package/vendor/ink/node_modules/@types/node/async_hooks.d.ts +623 -0
  670. package/vendor/ink/node_modules/@types/node/buffer.buffer.d.ts +466 -0
  671. package/vendor/ink/node_modules/@types/node/buffer.d.ts +1810 -0
  672. package/vendor/ink/node_modules/@types/node/child_process.d.ts +1428 -0
  673. package/vendor/ink/node_modules/@types/node/cluster.d.ts +486 -0
  674. package/vendor/ink/node_modules/@types/node/compatibility/iterators.d.ts +21 -0
  675. package/vendor/ink/node_modules/@types/node/console.d.ts +151 -0
  676. package/vendor/ink/node_modules/@types/node/constants.d.ts +20 -0
  677. package/vendor/ink/node_modules/@types/node/crypto.d.ts +4065 -0
  678. package/vendor/ink/node_modules/@types/node/dgram.d.ts +564 -0
  679. package/vendor/ink/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
  680. package/vendor/ink/node_modules/@types/node/dns/promises.d.ts +503 -0
  681. package/vendor/ink/node_modules/@types/node/dns.d.ts +922 -0
  682. package/vendor/ink/node_modules/@types/node/domain.d.ts +166 -0
  683. package/vendor/ink/node_modules/@types/node/events.d.ts +1054 -0
  684. package/vendor/ink/node_modules/@types/node/fs/promises.d.ts +1329 -0
  685. package/vendor/ink/node_modules/@types/node/fs.d.ts +4676 -0
  686. package/vendor/ink/node_modules/@types/node/globals.d.ts +150 -0
  687. package/vendor/ink/node_modules/@types/node/globals.typedarray.d.ts +101 -0
  688. package/vendor/ink/node_modules/@types/node/http.d.ts +2167 -0
  689. package/vendor/ink/node_modules/@types/node/http2.d.ts +2480 -0
  690. package/vendor/ink/node_modules/@types/node/https.d.ts +405 -0
  691. package/vendor/ink/node_modules/@types/node/index.d.ts +115 -0
  692. package/vendor/ink/node_modules/@types/node/inspector/promises.d.ts +41 -0
  693. package/vendor/ink/node_modules/@types/node/inspector.d.ts +224 -0
  694. package/vendor/ink/node_modules/@types/node/inspector.generated.d.ts +4226 -0
  695. package/vendor/ink/node_modules/@types/node/module.d.ts +819 -0
  696. package/vendor/ink/node_modules/@types/node/net.d.ts +933 -0
  697. package/vendor/ink/node_modules/@types/node/os.d.ts +507 -0
  698. package/vendor/ink/node_modules/@types/node/package.json +155 -0
  699. package/vendor/ink/node_modules/@types/node/path/posix.d.ts +8 -0
  700. package/vendor/ink/node_modules/@types/node/path/win32.d.ts +8 -0
  701. package/vendor/ink/node_modules/@types/node/path.d.ts +187 -0
  702. package/vendor/ink/node_modules/@types/node/perf_hooks.d.ts +643 -0
  703. package/vendor/ink/node_modules/@types/node/process.d.ts +2156 -0
  704. package/vendor/ink/node_modules/@types/node/punycode.d.ts +117 -0
  705. package/vendor/ink/node_modules/@types/node/querystring.d.ts +152 -0
  706. package/vendor/ink/node_modules/@types/node/quic.d.ts +910 -0
  707. package/vendor/ink/node_modules/@types/node/readline/promises.d.ts +161 -0
  708. package/vendor/ink/node_modules/@types/node/readline.d.ts +541 -0
  709. package/vendor/ink/node_modules/@types/node/repl.d.ts +415 -0
  710. package/vendor/ink/node_modules/@types/node/sea.d.ts +162 -0
  711. package/vendor/ink/node_modules/@types/node/sqlite.d.ts +955 -0
  712. package/vendor/ink/node_modules/@types/node/stream/consumers.d.ts +38 -0
  713. package/vendor/ink/node_modules/@types/node/stream/promises.d.ts +211 -0
  714. package/vendor/ink/node_modules/@types/node/stream/web.d.ts +296 -0
  715. package/vendor/ink/node_modules/@types/node/stream.d.ts +1760 -0
  716. package/vendor/ink/node_modules/@types/node/string_decoder.d.ts +67 -0
  717. package/vendor/ink/node_modules/@types/node/test/reporters.d.ts +96 -0
  718. package/vendor/ink/node_modules/@types/node/test.d.ts +2240 -0
  719. package/vendor/ink/node_modules/@types/node/timers/promises.d.ts +108 -0
  720. package/vendor/ink/node_modules/@types/node/timers.d.ts +159 -0
  721. package/vendor/ink/node_modules/@types/node/tls.d.ts +1198 -0
  722. package/vendor/ink/node_modules/@types/node/trace_events.d.ts +197 -0
  723. package/vendor/ink/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +462 -0
  724. package/vendor/ink/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
  725. package/vendor/ink/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +36 -0
  726. package/vendor/ink/node_modules/@types/node/ts5.6/index.d.ts +117 -0
  727. package/vendor/ink/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
  728. package/vendor/ink/node_modules/@types/node/ts5.7/index.d.ts +117 -0
  729. package/vendor/ink/node_modules/@types/node/tty.d.ts +250 -0
  730. package/vendor/ink/node_modules/@types/node/url.d.ts +519 -0
  731. package/vendor/ink/node_modules/@types/node/util/types.d.ts +558 -0
  732. package/vendor/ink/node_modules/@types/node/util.d.ts +1662 -0
  733. package/vendor/ink/node_modules/@types/node/v8.d.ts +983 -0
  734. package/vendor/ink/node_modules/@types/node/vm.d.ts +1208 -0
  735. package/vendor/ink/node_modules/@types/node/wasi.d.ts +202 -0
  736. package/vendor/ink/node_modules/@types/node/web-globals/abortcontroller.d.ts +59 -0
  737. package/vendor/ink/node_modules/@types/node/web-globals/blob.d.ts +23 -0
  738. package/vendor/ink/node_modules/@types/node/web-globals/console.d.ts +9 -0
  739. package/vendor/ink/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
  740. package/vendor/ink/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  741. package/vendor/ink/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
  742. package/vendor/ink/node_modules/@types/node/web-globals/events.d.ts +106 -0
  743. package/vendor/ink/node_modules/@types/node/web-globals/fetch.d.ts +69 -0
  744. package/vendor/ink/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
  745. package/vendor/ink/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
  746. package/vendor/ink/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
  747. package/vendor/ink/node_modules/@types/node/web-globals/performance.d.ts +45 -0
  748. package/vendor/ink/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  749. package/vendor/ink/node_modules/@types/node/web-globals/streams.d.ts +115 -0
  750. package/vendor/ink/node_modules/@types/node/web-globals/timers.d.ts +44 -0
  751. package/vendor/ink/node_modules/@types/node/web-globals/url.d.ts +24 -0
  752. package/vendor/ink/node_modules/@types/node/worker_threads.d.ts +717 -0
  753. package/vendor/ink/node_modules/@types/node/zlib.d.ts +618 -0
  754. package/vendor/ink/node_modules/node-pty/LICENSE +69 -0
  755. package/vendor/ink/node_modules/node-pty/README.md +164 -0
  756. package/vendor/ink/node_modules/node-pty/binding.gyp +150 -0
  757. package/vendor/ink/node_modules/node-pty/lib/conpty_console_list_agent.js +25 -0
  758. package/vendor/ink/node_modules/node-pty/lib/eventEmitter2.js +47 -0
  759. package/vendor/ink/node_modules/node-pty/lib/index.js +52 -0
  760. package/vendor/ink/node_modules/node-pty/lib/interfaces.js +7 -0
  761. package/vendor/ink/node_modules/node-pty/lib/shared/conout.js +11 -0
  762. package/vendor/ink/node_modules/node-pty/lib/terminal.js +190 -0
  763. package/vendor/ink/node_modules/node-pty/lib/types.js +7 -0
  764. package/vendor/ink/node_modules/node-pty/lib/unixTerminal.js +349 -0
  765. package/vendor/ink/node_modules/node-pty/lib/utils.js +39 -0
  766. package/vendor/ink/node_modules/node-pty/lib/windowsConoutConnection.js +125 -0
  767. package/vendor/ink/node_modules/node-pty/lib/windowsPtyAgent.js +287 -0
  768. package/vendor/ink/node_modules/node-pty/lib/windowsTerminal.js +201 -0
  769. package/vendor/ink/node_modules/node-pty/lib/worker/conoutSocketWorker.js +22 -0
  770. package/vendor/ink/node_modules/node-pty/package.json +65 -0
  771. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
  772. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
  773. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
  774. package/vendor/ink/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
  775. package/vendor/ink/node_modules/node-pty/prebuilds/linux-arm64/pty.node +0 -0
  776. package/vendor/ink/node_modules/node-pty/prebuilds/linux-x64/pty.node +0 -0
  777. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  778. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  779. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  780. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty.pdb +0 -0
  781. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  782. package/vendor/ink/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  783. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  784. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  785. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  786. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty.pdb +0 -0
  787. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  788. package/vendor/ink/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  789. package/vendor/ink/node_modules/node-pty/scripts/post-install.js +76 -0
  790. package/vendor/ink/node_modules/node-pty/scripts/prebuild.js +34 -0
  791. package/vendor/ink/node_modules/node-pty/src/unix/pty.cc +875 -0
  792. package/vendor/ink/node_modules/node-pty/src/unix/spawn-helper.cc +23 -0
  793. package/vendor/ink/node_modules/node-pty/src/win/conpty.cc +582 -0
  794. package/vendor/ink/node_modules/node-pty/src/win/conpty.h +41 -0
  795. package/vendor/ink/node_modules/node-pty/src/win/conpty_console_list.cc +44 -0
  796. package/vendor/ink/node_modules/node-pty/src/win/path_util.cc +95 -0
  797. package/vendor/ink/node_modules/node-pty/src/win/path_util.h +26 -0
  798. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
  799. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
  800. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
  801. package/vendor/ink/node_modules/node-pty/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
  802. package/vendor/ink/node_modules/node-pty/typings/node-pty.d.ts +215 -0
  803. package/vendor/ink/node_modules/undici-types/LICENSE +21 -0
  804. package/vendor/ink/node_modules/undici-types/README.md +6 -0
  805. package/vendor/ink/node_modules/undici-types/agent.d.ts +32 -0
  806. package/vendor/ink/node_modules/undici-types/api.d.ts +43 -0
  807. package/vendor/ink/node_modules/undici-types/balanced-pool.d.ts +30 -0
  808. package/vendor/ink/node_modules/undici-types/cache-interceptor.d.ts +173 -0
  809. package/vendor/ink/node_modules/undici-types/cache.d.ts +36 -0
  810. package/vendor/ink/node_modules/undici-types/client-stats.d.ts +15 -0
  811. package/vendor/ink/node_modules/undici-types/client.d.ts +108 -0
  812. package/vendor/ink/node_modules/undici-types/connector.d.ts +34 -0
  813. package/vendor/ink/node_modules/undici-types/content-type.d.ts +21 -0
  814. package/vendor/ink/node_modules/undici-types/cookies.d.ts +30 -0
  815. package/vendor/ink/node_modules/undici-types/diagnostics-channel.d.ts +74 -0
  816. package/vendor/ink/node_modules/undici-types/dispatcher.d.ts +276 -0
  817. package/vendor/ink/node_modules/undici-types/env-http-proxy-agent.d.ts +22 -0
  818. package/vendor/ink/node_modules/undici-types/errors.d.ts +161 -0
  819. package/vendor/ink/node_modules/undici-types/eventsource.d.ts +66 -0
  820. package/vendor/ink/node_modules/undici-types/fetch.d.ts +211 -0
  821. package/vendor/ink/node_modules/undici-types/formdata.d.ts +108 -0
  822. package/vendor/ink/node_modules/undici-types/global-dispatcher.d.ts +9 -0
  823. package/vendor/ink/node_modules/undici-types/global-origin.d.ts +7 -0
  824. package/vendor/ink/node_modules/undici-types/h2c-client.d.ts +73 -0
  825. package/vendor/ink/node_modules/undici-types/handlers.d.ts +15 -0
  826. package/vendor/ink/node_modules/undici-types/header.d.ts +160 -0
  827. package/vendor/ink/node_modules/undici-types/index.d.ts +88 -0
  828. package/vendor/ink/node_modules/undici-types/interceptors.d.ts +73 -0
  829. package/vendor/ink/node_modules/undici-types/mock-agent.d.ts +68 -0
  830. package/vendor/ink/node_modules/undici-types/mock-call-history.d.ts +111 -0
  831. package/vendor/ink/node_modules/undici-types/mock-client.d.ts +27 -0
  832. package/vendor/ink/node_modules/undici-types/mock-errors.d.ts +12 -0
  833. package/vendor/ink/node_modules/undici-types/mock-interceptor.d.ts +94 -0
  834. package/vendor/ink/node_modules/undici-types/mock-pool.d.ts +27 -0
  835. package/vendor/ink/node_modules/undici-types/package.json +55 -0
  836. package/vendor/ink/node_modules/undici-types/patch.d.ts +29 -0
  837. package/vendor/ink/node_modules/undici-types/pool-stats.d.ts +19 -0
  838. package/vendor/ink/node_modules/undici-types/pool.d.ts +41 -0
  839. package/vendor/ink/node_modules/undici-types/proxy-agent.d.ts +29 -0
  840. package/vendor/ink/node_modules/undici-types/readable.d.ts +68 -0
  841. package/vendor/ink/node_modules/undici-types/retry-agent.d.ts +8 -0
  842. package/vendor/ink/node_modules/undici-types/retry-handler.d.ts +125 -0
  843. package/vendor/ink/node_modules/undici-types/round-robin-pool.d.ts +41 -0
  844. package/vendor/ink/node_modules/undici-types/snapshot-agent.d.ts +109 -0
  845. package/vendor/ink/node_modules/undici-types/util.d.ts +18 -0
  846. package/vendor/ink/node_modules/undici-types/utility.d.ts +7 -0
  847. package/vendor/ink/node_modules/undici-types/webidl.d.ts +341 -0
  848. package/vendor/ink/node_modules/undici-types/websocket.d.ts +186 -0
  849. package/vendor/ink/package.json +201 -0
  850. package/vendor/ink/readme.md +2636 -0
  851. package/bin/swag-agent.js +0 -9
  852. package/dist/server/lib/pg-rate-limiter.d.ts +0 -21
  853. package/dist/server/lib/pg-rate-limiter.js +0 -86
@@ -1,471 +1,544 @@
1
1
  // server/handlers/browser.ts — Browser automation via Playwright
2
2
  // Supports: navigate, screenshot, extract, click, fill, evaluate, pdf
3
+
3
4
  import { chromium } from "playwright-core";
5
+
4
6
  // ============================================================================
5
7
  // BROWSER INSTANCE LIFECYCLE
6
8
  // ============================================================================
9
+
7
10
  let browserInstance = null;
8
11
  let idleTimer = null;
9
12
  const IDLE_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
10
13
  const PAGE_TIMEOUT_MS = 60_000; // 60 seconds per page operation (increased for CAPTCHA solving)
11
14
  const MAX_RESULT_BYTES = 500 * 1024; // 500KB safety cap — context_management handles limits
12
15
  const MAX_TEXT_CHARS = 200_000; // 200K chars for text content
16
+
13
17
  function resetIdleTimer() {
14
- if (idleTimer)
15
- clearTimeout(idleTimer);
16
- idleTimer = setTimeout(async () => {
17
- if (browserInstance) {
18
- try {
19
- await browserInstance.close();
20
- }
21
- catch { /* browser may already be closed */ }
22
- browserInstance = null;
23
- console.log("[browser] Closed after idle timeout");
24
- }
25
- }, IDLE_TIMEOUT_MS);
18
+ if (idleTimer) clearTimeout(idleTimer);
19
+ idleTimer = setTimeout(async () => {
20
+ if (browserInstance) {
21
+ try {
22
+ await browserInstance.close();
23
+ } catch {/* browser may already be closed */}
24
+ browserInstance = null;
25
+ console.log("[browser] Closed after idle timeout");
26
+ }
27
+ }, IDLE_TIMEOUT_MS);
26
28
  }
27
29
  async function getBrowser() {
28
- if (browserInstance && browserInstance.isConnected()) {
29
- resetIdleTimer();
30
- return browserInstance;
31
- }
32
- browserInstance = await chromium.launch({
33
- headless: true,
34
- executablePath: process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH || undefined,
35
- args: [
36
- "--no-sandbox",
37
- "--disable-setuid-sandbox",
38
- "--disable-dev-shm-usage",
39
- "--disable-gpu",
40
- ],
41
- });
42
- browserInstance.on("disconnected", () => {
43
- browserInstance = null;
44
- if (idleTimer) {
45
- clearTimeout(idleTimer);
46
- idleTimer = null;
47
- }
48
- });
30
+ if (browserInstance && browserInstance.isConnected()) {
49
31
  resetIdleTimer();
50
- console.log("[browser] Launched new instance");
51
32
  return browserInstance;
33
+ }
34
+ browserInstance = await chromium.launch({
35
+ headless: true,
36
+ executablePath: process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH || undefined,
37
+ args: ["--no-sandbox", "--disable-setuid-sandbox", "--disable-dev-shm-usage", "--disable-gpu"]
38
+ });
39
+ browserInstance.on("disconnected", () => {
40
+ browserInstance = null;
41
+ if (idleTimer) {
42
+ clearTimeout(idleTimer);
43
+ idleTimer = null;
44
+ }
45
+ });
46
+ resetIdleTimer();
47
+ console.log("[browser] Launched new instance");
48
+ return browserInstance;
52
49
  }
53
50
  async function withPage(url, waitFor, fn) {
54
- const browser = await getBrowser();
55
- const context = await browser.newContext({
56
- userAgent: "WhaleBot/1.0 (https://whale.app)",
57
- viewport: { width: 1280, height: 720 },
58
- ignoreHTTPSErrors: true,
51
+ const browser = await getBrowser();
52
+ const context = await browser.newContext({
53
+ userAgent: "WhaleBot/1.0 (https://whale.app)",
54
+ viewport: {
55
+ width: 1280,
56
+ height: 720
57
+ },
58
+ ignoreHTTPSErrors: true
59
+ });
60
+ context.setDefaultTimeout(PAGE_TIMEOUT_MS);
61
+ const page = await context.newPage();
62
+ try {
63
+ await page.goto(url, {
64
+ waitUntil: "domcontentloaded",
65
+ timeout: PAGE_TIMEOUT_MS
59
66
  });
60
- context.setDefaultTimeout(PAGE_TIMEOUT_MS);
61
- const page = await context.newPage();
62
- try {
63
- await page.goto(url, { waitUntil: "domcontentloaded", timeout: PAGE_TIMEOUT_MS });
64
- // Auto-detect and solve CAPTCHAs after page load
65
- const captchaResult = await detectAndSolveCaptcha(page);
66
- if (captchaResult.solved) {
67
- console.log(`[browser] Solved ${captchaResult.type} CAPTCHA on ${url}`);
68
- // Wait for page to update after CAPTCHA solution
69
- await page.waitForTimeout(2000);
70
- }
71
- if (waitFor) {
72
- await page.waitForSelector(waitFor, { timeout: PAGE_TIMEOUT_MS });
73
- }
74
- return await fn(page);
67
+
68
+ // Auto-detect and solve CAPTCHAs after page load
69
+ const captchaResult = await detectAndSolveCaptcha(page);
70
+ if (captchaResult.solved) {
71
+ console.log(`[browser] Solved ${captchaResult.type} CAPTCHA on ${url}`);
72
+ // Wait for page to update after CAPTCHA solution
73
+ await page.waitForTimeout(2000);
75
74
  }
76
- finally {
77
- await page.close().catch(() => { });
78
- await context.close().catch(() => { });
75
+ if (waitFor) {
76
+ await page.waitForSelector(waitFor, {
77
+ timeout: PAGE_TIMEOUT_MS
78
+ });
79
79
  }
80
+ return await fn(page);
81
+ } finally {
82
+ await page.close().catch(() => {});
83
+ await context.close().catch(() => {});
84
+ }
80
85
  }
86
+
81
87
  // ============================================================================
82
88
  // SSRF PROTECTION
83
89
  // ============================================================================
90
+
84
91
  function isBlockedUrl(url) {
85
- let parsed;
86
- try {
87
- parsed = new URL(url);
88
- }
89
- catch {
90
- return "Invalid URL";
91
- }
92
- if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
93
- return `Blocked protocol: ${parsed.protocol}`;
94
- }
95
- const host = parsed.hostname.toLowerCase();
96
- // Block localhost variants
97
- if (host === "localhost" || host === "127.0.0.1" || host === "0.0.0.0" ||
98
- host === "::1" || host === "[::1]") {
99
- return "Blocked: localhost";
100
- }
101
- // Block private/internal domains
102
- if (host.endsWith(".internal") || host.endsWith(".local") ||
103
- host === "metadata.google.internal") {
104
- return "Blocked: internal/local domain";
105
- }
106
- // Block private IP ranges
107
- if (/^10\./.test(host) ||
108
- /^172\.(1[6-9]|2\d|3[01])\./.test(host) ||
109
- /^192\.168\./.test(host) ||
110
- /^169\.254\./.test(host)) {
111
- return "Blocked: private IP range";
112
- }
113
- // Block IPv6 private
114
- if (host.startsWith("fd") || host.startsWith("fc00:") ||
115
- host.startsWith("fe80:") || host.includes("::ffff:")) {
116
- return "Blocked: IPv6 private range";
117
- }
118
- return null;
92
+ let parsed;
93
+ try {
94
+ parsed = new URL(url);
95
+ } catch {
96
+ return "Invalid URL";
97
+ }
98
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
99
+ return `Blocked protocol: ${parsed.protocol}`;
100
+ }
101
+ const host = parsed.hostname.toLowerCase();
102
+
103
+ // Block localhost variants
104
+ if (host === "localhost" || host === "127.0.0.1" || host === "0.0.0.0" || host === "::1" || host === "[::1]") {
105
+ return "Blocked: localhost";
106
+ }
107
+
108
+ // Block private/internal domains
109
+ if (host.endsWith(".internal") || host.endsWith(".local") || host === "metadata.google.internal") {
110
+ return "Blocked: internal/local domain";
111
+ }
112
+
113
+ // Block private IP ranges
114
+ if (/^10\./.test(host) || /^172\.(1[6-9]|2\d|3[01])\./.test(host) || /^192\.168\./.test(host) || /^169\.254\./.test(host)) {
115
+ return "Blocked: private IP range";
116
+ }
117
+
118
+ // Block IPv6 private
119
+ if (host.startsWith("fd") || host.startsWith("fc00:") || host.startsWith("fe80:") || host.includes("::ffff:")) {
120
+ return "Blocked: IPv6 private range";
121
+ }
122
+ return null;
119
123
  }
124
+
120
125
  // ============================================================================
121
126
  // TEXT CLEANUP
122
127
  // ============================================================================
128
+
123
129
  function stripScriptsAndStyles(html) {
124
- return html
125
- .replace(/<script[\s\S]*?<\/script>/gi, "")
126
- .replace(/<style[\s\S]*?<\/style>/gi, "")
127
- .replace(/<[^>]+>/g, " ")
128
- .replace(/\s+/g, " ")
129
- .trim();
130
+ return html.replace(/<script[\s\S]*?<\/script>/gi, "").replace(/<style[\s\S]*?<\/style>/gi, "").replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
130
131
  }
131
132
  function truncate(text, maxChars) {
132
- if (text.length <= maxChars)
133
- return text;
134
- return text.substring(0, maxChars) + "\n...[truncated]";
133
+ if (text.length <= maxChars) return text;
134
+ return text.substring(0, maxChars) + "\n...[truncated]";
135
135
  }
136
136
  function truncateResult(data) {
137
- const json = JSON.stringify(data);
138
- if (json.length <= MAX_RESULT_BYTES)
139
- return data;
140
- // If too large, stringify and truncate
141
- return JSON.parse(truncate(json, MAX_RESULT_BYTES));
137
+ const json = JSON.stringify(data);
138
+ if (json.length <= MAX_RESULT_BYTES) return data;
139
+ // If too large, stringify and truncate
140
+ return JSON.parse(truncate(json, MAX_RESULT_BYTES));
142
141
  }
142
+
143
143
  // ============================================================================
144
144
  // ACTION HANDLERS
145
145
  // ============================================================================
146
+
146
147
  async function actionNavigate(url, waitFor) {
147
- return withPage(url, waitFor, async (page) => {
148
- const title = await page.title();
149
- const html = await page.content();
150
- const textContent = stripScriptsAndStyles(html);
151
- return {
152
- success: true,
153
- data: {
154
- url: page.url(),
155
- title,
156
- text: truncate(textContent, MAX_TEXT_CHARS),
157
- text_length: textContent.length,
158
- },
159
- };
160
- });
148
+ return withPage(url, waitFor, async page => {
149
+ const title = await page.title();
150
+ const html = await page.content();
151
+ const textContent = stripScriptsAndStyles(html);
152
+ return {
153
+ success: true,
154
+ data: {
155
+ url: page.url(),
156
+ title,
157
+ text: truncate(textContent, MAX_TEXT_CHARS),
158
+ text_length: textContent.length
159
+ }
160
+ };
161
+ });
161
162
  }
162
163
  async function actionScreenshot(url, waitFor) {
163
- return withPage(url, waitFor, async (page) => {
164
- const buffer = await page.screenshot({ type: "png", fullPage: false });
165
- const base64 = buffer.toString("base64");
166
- const title = await page.title();
167
- return {
168
- success: true,
169
- data: {
170
- url: page.url(),
171
- title,
172
- screenshot_base64: base64,
173
- format: "png",
174
- size_bytes: buffer.length,
175
- },
176
- };
164
+ return withPage(url, waitFor, async page => {
165
+ const buffer = await page.screenshot({
166
+ type: "png",
167
+ fullPage: false
177
168
  });
169
+ const base64 = buffer.toString("base64");
170
+ const title = await page.title();
171
+ return {
172
+ success: true,
173
+ data: {
174
+ url: page.url(),
175
+ title,
176
+ screenshot_base64: base64,
177
+ format: "png",
178
+ size_bytes: buffer.length
179
+ }
180
+ };
181
+ });
178
182
  }
179
183
  async function actionExtract(url, selector, waitFor) {
180
- if (!selector) {
181
- return { success: false, error: "selector is required for extract action" };
182
- }
183
- return withPage(url, waitFor, async (page) => {
184
- const elements = await page.$$eval(selector, (els) => els.map((el) => ({
185
- tag: el.tagName.toLowerCase(),
186
- text: el.textContent?.trim() || "",
187
- html: el.innerHTML.substring(0, 2000),
188
- attributes: Object.fromEntries(Array.from(el.attributes).map((a) => [a.name, a.value])),
189
- })));
190
- return {
191
- success: true,
192
- data: {
193
- url: page.url(),
194
- selector,
195
- count: elements.length,
196
- elements: elements.slice(0, 50), // Cap at 50 elements
197
- },
198
- };
199
- });
184
+ if (!selector) {
185
+ return {
186
+ success: false,
187
+ error: "selector is required for extract action"
188
+ };
189
+ }
190
+ return withPage(url, waitFor, async page => {
191
+ const elements = await page.$$eval(selector, els => els.map(el => ({
192
+ tag: el.tagName.toLowerCase(),
193
+ text: el.textContent?.trim() || "",
194
+ html: el.innerHTML.substring(0, 2000),
195
+ attributes: Object.fromEntries(Array.from(el.attributes).map(a => [a.name, a.value]))
196
+ })));
197
+ return {
198
+ success: true,
199
+ data: {
200
+ url: page.url(),
201
+ selector,
202
+ count: elements.length,
203
+ elements: elements.slice(0, 50) // Cap at 50 elements
204
+ }
205
+ };
206
+ });
200
207
  }
201
208
  async function actionClick(url, selector, waitFor) {
202
- if (!selector) {
203
- return { success: false, error: "selector is required for click action" };
204
- }
205
- return withPage(url, waitFor, async (page) => {
206
- await page.click(selector, { timeout: PAGE_TIMEOUT_MS });
207
- // Wait a moment for any navigation or dynamic content
208
- await page.waitForTimeout(1000);
209
- const title = await page.title();
210
- const html = await page.content();
211
- const textContent = stripScriptsAndStyles(html);
212
- return {
213
- success: true,
214
- data: {
215
- url: page.url(),
216
- title,
217
- clicked: selector,
218
- text: truncate(textContent, MAX_TEXT_CHARS),
219
- },
220
- };
209
+ if (!selector) {
210
+ return {
211
+ success: false,
212
+ error: "selector is required for click action"
213
+ };
214
+ }
215
+ return withPage(url, waitFor, async page => {
216
+ await page.click(selector, {
217
+ timeout: PAGE_TIMEOUT_MS
221
218
  });
219
+
220
+ // Wait a moment for any navigation or dynamic content
221
+ await page.waitForTimeout(1000);
222
+ const title = await page.title();
223
+ const html = await page.content();
224
+ const textContent = stripScriptsAndStyles(html);
225
+ return {
226
+ success: true,
227
+ data: {
228
+ url: page.url(),
229
+ title,
230
+ clicked: selector,
231
+ text: truncate(textContent, MAX_TEXT_CHARS)
232
+ }
233
+ };
234
+ });
222
235
  }
223
236
  async function actionFill(url, selector, value, waitFor) {
224
- if (!selector) {
225
- return { success: false, error: "selector is required for fill action" };
226
- }
227
- if (value === undefined || value === null) {
228
- return { success: false, error: "value is required for fill action" };
229
- }
230
- return withPage(url, waitFor, async (page) => {
231
- await page.fill(selector, value, { timeout: PAGE_TIMEOUT_MS });
232
- return {
233
- success: true,
234
- data: {
235
- url: page.url(),
236
- filled: { selector, value },
237
- },
238
- };
237
+ if (!selector) {
238
+ return {
239
+ success: false,
240
+ error: "selector is required for fill action"
241
+ };
242
+ }
243
+ if (value === undefined || value === null) {
244
+ return {
245
+ success: false,
246
+ error: "value is required for fill action"
247
+ };
248
+ }
249
+ return withPage(url, waitFor, async page => {
250
+ await page.fill(selector, value, {
251
+ timeout: PAGE_TIMEOUT_MS
239
252
  });
253
+ return {
254
+ success: true,
255
+ data: {
256
+ url: page.url(),
257
+ filled: {
258
+ selector,
259
+ value
260
+ }
261
+ }
262
+ };
263
+ });
240
264
  }
241
265
  async function actionEvaluate(url, script, waitFor) {
242
- if (!script) {
243
- return { success: false, error: "script is required for evaluate action" };
244
- }
245
- return withPage(url, waitFor, async (page) => {
246
- const result = await page.evaluate(script);
247
- return {
248
- success: true,
249
- data: {
250
- url: page.url(),
251
- result: truncateResult(result),
252
- },
253
- };
254
- });
266
+ if (!script) {
267
+ return {
268
+ success: false,
269
+ error: "script is required for evaluate action"
270
+ };
271
+ }
272
+ return withPage(url, waitFor, async page => {
273
+ const result = await page.evaluate(script);
274
+ return {
275
+ success: true,
276
+ data: {
277
+ url: page.url(),
278
+ result: truncateResult(result)
279
+ }
280
+ };
281
+ });
255
282
  }
256
283
  async function actionPdf(url, waitFor) {
257
- return withPage(url, waitFor, async (page) => {
258
- const buffer = await page.pdf({
259
- format: "A4",
260
- printBackground: true,
261
- margin: { top: "1cm", bottom: "1cm", left: "1cm", right: "1cm" },
262
- });
263
- const base64 = buffer.toString("base64");
264
- const title = await page.title();
265
- return {
266
- success: true,
267
- data: {
268
- url: page.url(),
269
- title,
270
- pdf_base64: base64,
271
- format: "A4",
272
- size_bytes: buffer.length,
273
- },
274
- };
284
+ return withPage(url, waitFor, async page => {
285
+ const buffer = await page.pdf({
286
+ format: "A4",
287
+ printBackground: true,
288
+ margin: {
289
+ top: "1cm",
290
+ bottom: "1cm",
291
+ left: "1cm",
292
+ right: "1cm"
293
+ }
275
294
  });
295
+ const base64 = buffer.toString("base64");
296
+ const title = await page.title();
297
+ return {
298
+ success: true,
299
+ data: {
300
+ url: page.url(),
301
+ title,
302
+ pdf_base64: base64,
303
+ format: "A4",
304
+ size_bytes: buffer.length
305
+ }
306
+ };
307
+ });
276
308
  }
309
+
310
+ // ============================================================================
311
+ // CAPTCHA DETECTION & SOLVING (via CapMonster Cloud)
312
+ // ============================================================================
313
+
277
314
  async function callCapMonster(taskType, params) {
278
- const apiKey = process.env.CAPMONSTER_API_KEY;
279
- if (!apiKey)
280
- throw new Error("CAPMONSTER_API_KEY not configured");
281
- const createResp = await fetch("https://api.capmonster.cloud/createTask", {
282
- method: "POST",
283
- headers: { "Content-Type": "application/json" },
284
- body: JSON.stringify({ clientKey: apiKey, task: { type: taskType, ...params } }),
315
+ const apiKey = process.env.CAPMONSTER_API_KEY;
316
+ if (!apiKey) throw new Error("CAPMONSTER_API_KEY not configured");
317
+ const createResp = await fetch("https://api.capmonster.cloud/createTask", {
318
+ method: "POST",
319
+ headers: {
320
+ "Content-Type": "application/json"
321
+ },
322
+ body: JSON.stringify({
323
+ clientKey: apiKey,
324
+ task: {
325
+ type: taskType,
326
+ ...params
327
+ }
328
+ })
329
+ });
330
+ const createData = await createResp.json();
331
+ if (createData.errorId) throw new Error(`CapMonster create: ${createData.errorDescription}`);
332
+ const taskId = createData.taskId;
333
+
334
+ // Poll for result (max 120s, 2s intervals)
335
+ for (let i = 0; i < 60; i++) {
336
+ await new Promise(r => setTimeout(r, 2000));
337
+ const resultResp = await fetch("https://api.capmonster.cloud/getTaskResult", {
338
+ method: "POST",
339
+ headers: {
340
+ "Content-Type": "application/json"
341
+ },
342
+ body: JSON.stringify({
343
+ clientKey: apiKey,
344
+ taskId
345
+ })
285
346
  });
286
- const createData = await createResp.json();
287
- if (createData.errorId)
288
- throw new Error(`CapMonster create: ${createData.errorDescription}`);
289
- const taskId = createData.taskId;
290
- // Poll for result (max 120s, 2s intervals)
291
- for (let i = 0; i < 60; i++) {
292
- await new Promise(r => setTimeout(r, 2000));
293
- const resultResp = await fetch("https://api.capmonster.cloud/getTaskResult", {
294
- method: "POST",
295
- headers: { "Content-Type": "application/json" },
296
- body: JSON.stringify({ clientKey: apiKey, taskId }),
297
- });
298
- const resultData = await resultResp.json();
299
- if (resultData.status === "ready") {
300
- return resultData.solution?.gRecaptchaResponse || resultData.solution?.token || resultData.solution?.cf_clearance || "";
301
- }
302
- if (resultData.errorId)
303
- throw new Error(`CapMonster result: ${resultData.errorDescription}`);
347
+ const resultData = await resultResp.json();
348
+ if (resultData.status === "ready") {
349
+ return resultData.solution?.gRecaptchaResponse || resultData.solution?.token || resultData.solution?.cf_clearance || "";
304
350
  }
305
- throw new Error("CapMonster: timeout waiting for solution (120s)");
351
+ if (resultData.errorId) throw new Error(`CapMonster result: ${resultData.errorDescription}`);
352
+ }
353
+ throw new Error("CapMonster: timeout waiting for solution (120s)");
306
354
  }
307
355
  async function detectAndSolveCaptcha(page) {
308
- try {
309
- // Skip if no API key configured
310
- if (!process.env.CAPMONSTER_API_KEY)
311
- return { solved: false };
312
- const pageUrl = page.url();
313
- // Detect reCAPTCHA v2
314
- const recaptchaKey = await page.evaluate(() => {
315
- const el = document.querySelector('.g-recaptcha[data-sitekey], [data-sitekey]');
316
- if (el && el.classList.contains('g-recaptcha'))
317
- return el.getAttribute('data-sitekey');
318
- // Also check for reCAPTCHA iframe
319
- const iframe = document.querySelector('iframe[src*="recaptcha"]');
320
- if (iframe) {
321
- const src = iframe.getAttribute('src') || '';
322
- const match = src.match(/[?&]k=([^&]+)/);
323
- return match ? match[1] : null;
324
- }
325
- return null;
326
- }).catch(() => null);
327
- if (recaptchaKey) {
328
- console.log(`[browser] Detected reCAPTCHA v2 on ${pageUrl}`);
329
- const token = await callCapMonster("RecaptchaV2TaskProxyless", {
330
- websiteURL: pageUrl,
331
- websiteKey: recaptchaKey,
332
- });
333
- await page.evaluate((t) => {
334
- const textarea = document.getElementById('g-recaptcha-response');
335
- if (textarea) {
336
- textarea.style.display = 'block';
337
- textarea.value = t;
338
- }
339
- // Try triggering the callback
340
- const win = window;
341
- try {
342
- const cfg = win.___grecaptcha_cfg;
343
- if (cfg?.clients) {
344
- const clients = cfg.clients;
345
- const firstKey = Object.keys(clients)[0];
346
- const first = firstKey ? clients[firstKey] : null;
347
- if (first) {
348
- const findCallback = (obj, depth = 0) => {
349
- if (depth > 4 || !obj || typeof obj !== 'object')
350
- return null;
351
- for (const val of Object.values(obj)) {
352
- if (typeof val === 'function')
353
- return val;
354
- const found = findCallback(val, depth + 1);
355
- if (found)
356
- return found;
357
- }
358
- return null;
359
- };
360
- const cb = findCallback(first);
361
- if (cb)
362
- cb(t);
363
- }
364
- }
365
- }
366
- catch { /* callback search failed, form submit will work */ }
367
- }, token);
368
- return { solved: true, type: "reCAPTCHA v2" };
356
+ try {
357
+ // Skip if no API key configured
358
+ if (!process.env.CAPMONSTER_API_KEY) return {
359
+ solved: false
360
+ };
361
+ const pageUrl = page.url();
362
+
363
+ // Detect reCAPTCHA v2
364
+ const recaptchaKey = await page.evaluate(() => {
365
+ const el = document.querySelector('.g-recaptcha[data-sitekey], [data-sitekey]');
366
+ if (el && el.classList.contains('g-recaptcha')) return el.getAttribute('data-sitekey');
367
+ // Also check for reCAPTCHA iframe
368
+ const iframe = document.querySelector('iframe[src*="recaptcha"]');
369
+ if (iframe) {
370
+ const src = iframe.getAttribute('src') || '';
371
+ const match = src.match(/[?&]k=([^&]+)/);
372
+ return match ? match[1] : null;
373
+ }
374
+ return null;
375
+ }).catch(() => null);
376
+ if (recaptchaKey) {
377
+ console.log(`[browser] Detected reCAPTCHA v2 on ${pageUrl}`);
378
+ const token = await callCapMonster("RecaptchaV2TaskProxyless", {
379
+ websiteURL: pageUrl,
380
+ websiteKey: recaptchaKey
381
+ });
382
+ await page.evaluate(t => {
383
+ const textarea = document.getElementById('g-recaptcha-response');
384
+ if (textarea) {
385
+ textarea.style.display = 'block';
386
+ textarea.value = t;
369
387
  }
370
- // Detect hCaptcha
371
- const hcaptchaKey = await page.evaluate(() => {
372
- const el = document.querySelector('.h-captcha[data-sitekey]');
373
- return el?.getAttribute('data-sitekey') || null;
374
- }).catch(() => null);
375
- if (hcaptchaKey) {
376
- console.log(`[browser] Detected hCaptcha on ${pageUrl}`);
377
- const token = await callCapMonster("HCaptchaTaskProxyless", {
378
- websiteURL: pageUrl,
379
- websiteKey: hcaptchaKey,
380
- });
381
- await page.evaluate((t) => {
382
- const textarea = document.querySelector('[name="h-captcha-response"], [name="g-recaptcha-response"]');
383
- if (textarea) {
384
- textarea.value = t;
388
+ // Try triggering the callback
389
+ const win = window;
390
+ try {
391
+ const cfg = win.___grecaptcha_cfg;
392
+ if (cfg?.clients) {
393
+ const clients = cfg.clients;
394
+ const firstKey = Object.keys(clients)[0];
395
+ const first = firstKey ? clients[firstKey] : null;
396
+ if (first) {
397
+ const findCallback = (obj, depth = 0) => {
398
+ if (depth > 4 || !obj || typeof obj !== 'object') return null;
399
+ for (const val of Object.values(obj)) {
400
+ if (typeof val === 'function') return val;
401
+ const found = findCallback(val, depth + 1);
402
+ if (found) return found;
385
403
  }
386
- const win = window;
387
- if (typeof win.hcaptchaCallback === 'function') {
388
- win.hcaptchaCallback(t);
389
- }
390
- }, token);
391
- return { solved: true, type: "hCaptcha" };
404
+ return null;
405
+ };
406
+ const cb = findCallback(first);
407
+ if (cb) cb(t);
408
+ }
409
+ }
410
+ } catch {/* callback search failed, form submit will work */}
411
+ }, token);
412
+ return {
413
+ solved: true,
414
+ type: "reCAPTCHA v2"
415
+ };
416
+ }
417
+
418
+ // Detect hCaptcha
419
+ const hcaptchaKey = await page.evaluate(() => {
420
+ const el = document.querySelector('.h-captcha[data-sitekey]');
421
+ return el?.getAttribute('data-sitekey') || null;
422
+ }).catch(() => null);
423
+ if (hcaptchaKey) {
424
+ console.log(`[browser] Detected hCaptcha on ${pageUrl}`);
425
+ const token = await callCapMonster("HCaptchaTaskProxyless", {
426
+ websiteURL: pageUrl,
427
+ websiteKey: hcaptchaKey
428
+ });
429
+ await page.evaluate(t => {
430
+ const textarea = document.querySelector('[name="h-captcha-response"], [name="g-recaptcha-response"]');
431
+ if (textarea) {
432
+ textarea.value = t;
392
433
  }
393
- // Detect Cloudflare Turnstile
394
- const turnstileKey = await page.evaluate(() => {
395
- const el = document.querySelector('.cf-turnstile[data-sitekey]');
396
- return el?.getAttribute('data-sitekey') || null;
397
- }).catch(() => null);
398
- if (turnstileKey) {
399
- console.log(`[browser] Detected Turnstile on ${pageUrl}`);
400
- const token = await callCapMonster("TurnstileTaskProxyless", {
401
- websiteURL: pageUrl,
402
- websiteKey: turnstileKey,
403
- });
404
- await page.evaluate((t) => {
405
- const input = document.querySelector('[name="cf-turnstile-response"]');
406
- if (input)
407
- input.value = t;
408
- const win = window;
409
- if (typeof win.turnstileCallback === 'function') {
410
- win.turnstileCallback(t);
411
- }
412
- }, token);
413
- return { solved: true, type: "Turnstile" };
434
+ const win = window;
435
+ if (typeof win.hcaptchaCallback === 'function') {
436
+ win.hcaptchaCallback(t);
414
437
  }
415
- return { solved: false };
438
+ }, token);
439
+ return {
440
+ solved: true,
441
+ type: "hCaptcha"
442
+ };
416
443
  }
417
- catch (err) {
418
- console.log(`[browser] CAPTCHA detection/solving failed: ${err instanceof Error ? err.message : String(err)}`);
419
- return { solved: false };
444
+
445
+ // Detect Cloudflare Turnstile
446
+ const turnstileKey = await page.evaluate(() => {
447
+ const el = document.querySelector('.cf-turnstile[data-sitekey]');
448
+ return el?.getAttribute('data-sitekey') || null;
449
+ }).catch(() => null);
450
+ if (turnstileKey) {
451
+ console.log(`[browser] Detected Turnstile on ${pageUrl}`);
452
+ const token = await callCapMonster("TurnstileTaskProxyless", {
453
+ websiteURL: pageUrl,
454
+ websiteKey: turnstileKey
455
+ });
456
+ await page.evaluate(t => {
457
+ const input = document.querySelector('[name="cf-turnstile-response"]');
458
+ if (input) input.value = t;
459
+ const win = window;
460
+ if (typeof win.turnstileCallback === 'function') {
461
+ win.turnstileCallback(t);
462
+ }
463
+ }, token);
464
+ return {
465
+ solved: true,
466
+ type: "Turnstile"
467
+ };
420
468
  }
469
+ return {
470
+ solved: false
471
+ };
472
+ } catch (err) {
473
+ console.log(`[browser] CAPTCHA detection/solving failed: ${err instanceof Error ? err.message : String(err)}`);
474
+ return {
475
+ solved: false
476
+ };
477
+ }
421
478
  }
479
+
422
480
  // ============================================================================
423
481
  // MAIN HANDLER
424
482
  // ============================================================================
483
+
425
484
  export async function handleBrowser(_sb, args, _storeId) {
426
- const action = args.action;
427
- const url = args.url;
428
- const selector = args.selector;
429
- const value = args.value;
430
- const script = args.script;
431
- const waitFor = args.wait_for;
432
- if (!action) {
433
- return { success: false, error: "action is required" };
434
- }
435
- if (!url) {
436
- return { success: false, error: "url is required" };
437
- }
438
- // SSRF check
439
- const blocked = isBlockedUrl(url);
440
- if (blocked) {
441
- return { success: false, error: blocked };
442
- }
443
- try {
444
- switch (action) {
445
- case "navigate":
446
- return await actionNavigate(url, waitFor);
447
- case "screenshot":
448
- return await actionScreenshot(url, waitFor);
449
- case "extract":
450
- return await actionExtract(url, selector, waitFor);
451
- case "click":
452
- return await actionClick(url, selector, waitFor);
453
- case "fill":
454
- return await actionFill(url, selector, value, waitFor);
455
- case "evaluate":
456
- return await actionEvaluate(url, script, waitFor);
457
- case "pdf":
458
- return await actionPdf(url, waitFor);
459
- default:
460
- return { success: false, error: `Unknown browser action: ${action}. Valid: navigate, screenshot, extract, click, fill, evaluate, pdf` };
461
- }
462
- }
463
- catch (err) {
464
- const message = err instanceof Error ? err.message : String(err);
465
- // Clean up common Playwright error noise
466
- const cleanMessage = message
467
- .replace(/=========================== logs ===========================[^]*?============================================================/gs, "")
468
- .trim();
469
- return { success: false, error: `Browser error: ${cleanMessage.substring(0, 500)}` };
485
+ const action = args.action;
486
+ const url = args.url;
487
+ const selector = args.selector;
488
+ const value = args.value;
489
+ const script = args.script;
490
+ const waitFor = args.wait_for;
491
+ if (!action) {
492
+ return {
493
+ success: false,
494
+ error: "action is required"
495
+ };
496
+ }
497
+ if (!url) {
498
+ return {
499
+ success: false,
500
+ error: "url is required"
501
+ };
502
+ }
503
+
504
+ // SSRF check
505
+ const blocked = isBlockedUrl(url);
506
+ if (blocked) {
507
+ return {
508
+ success: false,
509
+ error: blocked
510
+ };
511
+ }
512
+ try {
513
+ switch (action) {
514
+ case "navigate":
515
+ return await actionNavigate(url, waitFor);
516
+ case "screenshot":
517
+ return await actionScreenshot(url, waitFor);
518
+ case "extract":
519
+ return await actionExtract(url, selector, waitFor);
520
+ case "click":
521
+ return await actionClick(url, selector, waitFor);
522
+ case "fill":
523
+ return await actionFill(url, selector, value, waitFor);
524
+ case "evaluate":
525
+ return await actionEvaluate(url, script, waitFor);
526
+ case "pdf":
527
+ return await actionPdf(url, waitFor);
528
+ default:
529
+ return {
530
+ success: false,
531
+ error: `Unknown browser action: ${action}. Valid: navigate, screenshot, extract, click, fill, evaluate, pdf`
532
+ };
470
533
  }
534
+ } catch (err) {
535
+ const message = err instanceof Error ? err.message : String(err);
536
+ // Clean up common Playwright error noise
537
+ const cleanMessage = message.replace(/=========================== logs ===========================[^]*?============================================================/gs, "").trim();
538
+ return {
539
+ success: false,
540
+ error: `Browser error: ${cleanMessage.substring(0, 500)}`
541
+ };
542
+ }
471
543
  }
544
+ //# sourceMappingURL=browser.js.map