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
@@ -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