whale-code 6.5.11 → 6.6.0

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 (613) hide show
  1. package/dist/cli/chat/ChatApp.js +7 -11
  2. package/dist/cli/chat/ChatApp.js.map +1 -1
  3. package/dist/cli/chat/ChatInput.js +7 -3
  4. package/dist/cli/chat/ChatInput.js.map +1 -1
  5. package/dist/cli/chat/MessageList.js +5 -6
  6. package/dist/cli/chat/MessageList.js.map +1 -1
  7. package/dist/cli/chat/StatusBar.d.ts +2 -2
  8. package/dist/cli/chat/StatusBar.js +90 -160
  9. package/dist/cli/chat/StatusBar.js.map +1 -1
  10. package/dist/cli/chat/components/LiveArea.js +78 -115
  11. package/dist/cli/chat/components/LiveArea.js.map +1 -1
  12. package/dist/cli/chat/components/StaticMessages.js +60 -79
  13. package/dist/cli/chat/components/StaticMessages.js.map +1 -1
  14. package/dist/cli/chat/hooks/useAgentLoop.js +45 -37
  15. package/dist/cli/chat/hooks/useAgentLoop.js.map +1 -1
  16. package/dist/cli/chat/store.d.ts +12 -0
  17. package/dist/cli/chat/store.js +19 -0
  18. package/dist/cli/chat/store.js.map +1 -1
  19. package/dist/cli/services/agent-loop-tools.js +10 -1
  20. package/dist/cli/services/agent-loop-tools.js.map +1 -1
  21. package/dist/cli/services/cli-agent-loop.js +3 -2
  22. package/dist/cli/services/cli-agent-loop.js.map +1 -1
  23. package/dist/cli/services/config-store.js +4 -3
  24. package/dist/cli/services/config-store.js.map +1 -1
  25. package/dist/cli/services/memory-manager.js +2 -2
  26. package/dist/cli/services/memory-manager.js.map +1 -1
  27. package/dist/cli/services/permission-modes.js +14 -10
  28. package/dist/cli/services/permission-modes.js.map +1 -1
  29. package/dist/cli/services/session-client.js +2 -1
  30. package/dist/cli/services/session-client.js.map +1 -1
  31. package/dist/cli/services/session-persistence.js +14 -6
  32. package/dist/cli/services/session-persistence.js.map +1 -1
  33. package/dist/cli/shared/SpinnerSlot.js +4 -1
  34. package/dist/cli/shared/SpinnerSlot.js.map +1 -1
  35. package/dist/server/handlers/browser-lifecycle.js +10 -0
  36. package/dist/server/handlers/browser-lifecycle.js.map +1 -1
  37. package/dist/server/handlers/browser.js +16 -1
  38. package/dist/server/handlers/browser.js.map +1 -1
  39. package/dist/server/handlers/campaigns.js +11 -0
  40. package/dist/server/handlers/campaigns.js.map +1 -1
  41. package/dist/server/handlers/catalog-products.js +19 -5
  42. package/dist/server/handlers/catalog-products.js.map +1 -1
  43. package/dist/server/handlers/catalog.js +42 -8
  44. package/dist/server/handlers/catalog.js.map +1 -1
  45. package/dist/server/handlers/clickhouse.js +4 -4
  46. package/dist/server/handlers/clickhouse.js.map +1 -1
  47. package/dist/server/handlers/comms-email.js +70 -8
  48. package/dist/server/handlers/comms-email.js.map +1 -1
  49. package/dist/server/handlers/comms.js +63 -21
  50. package/dist/server/handlers/comms.js.map +1 -1
  51. package/dist/server/handlers/coupons.js +141 -77
  52. package/dist/server/handlers/coupons.js.map +1 -1
  53. package/dist/server/handlers/google-ads.js +280 -8
  54. package/dist/server/handlers/google-ads.js.map +1 -1
  55. package/dist/server/handlers/remove-bg.d.ts +33 -0
  56. package/dist/server/handlers/remove-bg.js +698 -44
  57. package/dist/server/handlers/remove-bg.js.map +1 -1
  58. package/dist/server/handlers/supply-chain.js +93 -1
  59. package/dist/server/handlers/supply-chain.js.map +1 -1
  60. package/dist/server/handlers/workflow-steps-types.d.ts +1 -1
  61. package/dist/server/handlers/workflow-steps-types.js +7 -1
  62. package/dist/server/handlers/workflow-steps-types.js.map +1 -1
  63. package/dist/server/handlers/workflow-steps.js +1 -1
  64. package/dist/server/handlers/workflow-steps.js.map +1 -1
  65. package/dist/server/index.js +122 -29
  66. package/dist/server/index.js.map +1 -1
  67. package/dist/server/lib/agent-loop-turn.js +33 -3
  68. package/dist/server/lib/agent-loop-turn.js.map +1 -1
  69. package/dist/server/lib/agent-loop-types.d.ts +6 -2
  70. package/dist/server/lib/agent-loop-types.js +14 -2
  71. package/dist/server/lib/agent-loop-types.js.map +1 -1
  72. package/dist/server/lib/clickhouse-client.js +4 -2
  73. package/dist/server/lib/clickhouse-client.js.map +1 -1
  74. package/dist/server/lib/code-worker.js +4 -1
  75. package/dist/server/lib/code-worker.js.map +1 -1
  76. package/dist/server/providers/anthropic.js +103 -33
  77. package/dist/server/providers/anthropic.js.map +1 -1
  78. package/dist/server/server-chat.js +2 -2
  79. package/dist/server/server-chat.js.map +1 -1
  80. package/dist/server/server-helpers.d.ts +8 -1
  81. package/dist/server/server-helpers.js +17 -3
  82. package/dist/server/server-helpers.js.map +1 -1
  83. package/dist/server/server-persist.js +34 -21
  84. package/dist/server/server-persist.js.map +1 -1
  85. package/dist/server/server-rate-limit.d.ts +0 -1
  86. package/dist/server/server-rate-limit.js +5 -5
  87. package/dist/server/server-rate-limit.js.map +1 -1
  88. package/dist/server/server-routes-approvals.js +2 -2
  89. package/dist/server/server-routes-approvals.js.map +1 -1
  90. package/dist/server/server-routes-auth.js +2 -2
  91. package/dist/server/server-routes-auth.js.map +1 -1
  92. package/dist/server/server-routes-events.js +2 -2
  93. package/dist/server/server-routes-events.js.map +1 -1
  94. package/dist/server/server-routes-public.js +4 -4
  95. package/dist/server/server-routes-public.js.map +1 -1
  96. package/dist/server/server-routes-webchat.js +3 -3
  97. package/dist/server/server-routes-webchat.js.map +1 -1
  98. package/dist/server/server-store-circuit-breaker.js +1 -1
  99. package/dist/server/server-store-circuit-breaker.js.map +1 -1
  100. package/dist/server/tool-router.js +7 -4
  101. package/dist/server/tool-router.js.map +1 -1
  102. package/dist/server/validation.js +11 -0
  103. package/dist/server/validation.js.map +1 -1
  104. package/dist/shared/api-client.js +38 -11
  105. package/dist/shared/api-client.js.map +1 -1
  106. package/package.json +12 -10
  107. package/vendor/ink/build/ink.js +68 -24
  108. package/vendor/ink/node_modules/react-devtools-core/README.md +152 -0
  109. package/vendor/ink/node_modules/react-devtools-core/backend.js +1 -0
  110. package/vendor/ink/node_modules/react-devtools-core/dist/648.chunk.js +2 -0
  111. package/vendor/ink/node_modules/react-devtools-core/dist/648.chunk.js.map +1 -0
  112. package/vendor/ink/node_modules/react-devtools-core/dist/backend.js +15691 -0
  113. package/vendor/ink/node_modules/react-devtools-core/dist/backend.js.map +1 -0
  114. package/vendor/ink/node_modules/react-devtools-core/dist/importFile.worker.worker.js +2 -0
  115. package/vendor/ink/node_modules/react-devtools-core/dist/importFile.worker.worker.js.map +1 -0
  116. package/vendor/ink/node_modules/react-devtools-core/dist/parseSourceAndMetadata.worker.worker.js +14 -0
  117. package/vendor/ink/node_modules/react-devtools-core/dist/parseSourceAndMetadata.worker.worker.js.map +1 -0
  118. package/vendor/ink/node_modules/react-devtools-core/dist/standalone.js +2 -0
  119. package/vendor/ink/node_modules/react-devtools-core/dist/standalone.js.map +1 -0
  120. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/LICENSE +21 -0
  121. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/README.md +495 -0
  122. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/browser.js +8 -0
  123. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/index.js +10 -0
  124. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/buffer-util.js +129 -0
  125. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/constants.js +10 -0
  126. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/event-target.js +184 -0
  127. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/extension.js +223 -0
  128. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/limiter.js +55 -0
  129. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/permessage-deflate.js +518 -0
  130. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/receiver.js +607 -0
  131. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/sender.js +409 -0
  132. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/stream.js +180 -0
  133. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/validation.js +104 -0
  134. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/websocket-server.js +449 -0
  135. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/websocket.js +1197 -0
  136. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/package.json +56 -0
  137. package/vendor/ink/node_modules/react-devtools-core/package.json +38 -0
  138. package/vendor/ink/node_modules/react-devtools-core/standalone.js +1 -0
  139. package/dist/cli/__tests__/print-mode-streaming.test.js +0 -270
  140. package/dist/cli/__tests__/print-mode.basic-output.test.js +0 -230
  141. package/dist/cli/__tests__/print-mode.session-errors.test.js +0 -252
  142. package/dist/cli/__tests__/print-mode.test.js +0 -273
  143. package/dist/cli/__tests__/serve-mode-messages.test.js +0 -338
  144. package/dist/cli/__tests__/serve-mode.messages.part2.test.js +0 -266
  145. package/dist/cli/__tests__/serve-mode.messages.test.js +0 -277
  146. package/dist/cli/__tests__/serve-mode.startup-http.test.js +0 -279
  147. package/dist/cli/__tests__/serve-mode.test.js +0 -345
  148. package/dist/cli/chat/NodeManager.d.ts +0 -30
  149. package/dist/cli/chat/NodeManager.js +0 -66
  150. package/dist/cli/chat/NodeManager.js.map +0 -1
  151. package/dist/cli/chat/chat-input-menu-handler.d.ts +0 -32
  152. package/dist/cli/chat/hooks/slash-imsg-handlers.js +0 -148
  153. package/dist/cli/chat/hooks/slash-imsg-handlers.js.map +0 -1
  154. package/dist/cli/chat/hooks/useStreamingReducer.d.ts +0 -66
  155. package/dist/cli/commands/__tests__/config-cmd.test.js +0 -270
  156. package/dist/cli/commands/__tests__/doctor.test.js +0 -257
  157. package/dist/cli/commands/__tests__/imsg-node-bridge.test.js +0 -99
  158. package/dist/cli/commands/__tests__/imsg-utils.test.js +0 -73
  159. package/dist/cli/commands/__tests__/init.test.js +0 -214
  160. package/dist/cli/commands/__tests__/mcp.test.js +0 -287
  161. package/dist/cli/commands/imsg-watcher-helpers.d.ts +0 -40
  162. package/dist/cli/commands/imsg-watcher-helpers.js +0 -184
  163. package/dist/cli/commands/imsg-watcher-helpers.js.map +0 -1
  164. package/dist/cli/commands/imsg-watcher.d.ts +0 -11
  165. package/dist/cli/commands/imsg-watcher.js +0 -230
  166. package/dist/cli/commands/imsg-watcher.js.map +0 -1
  167. package/dist/cli/services/__tests__/agent-definitions.test.js +0 -153
  168. package/dist/cli/services/__tests__/agent-events-global.test.js +0 -39
  169. package/dist/cli/services/__tests__/agent-events.part2.test.js +0 -113
  170. package/dist/cli/services/__tests__/agent-events.test.js +0 -157
  171. package/dist/cli/services/__tests__/agent-loop-auth.test.js +0 -392
  172. package/dist/cli/services/__tests__/agent-loop-budget.test.js +0 -389
  173. package/dist/cli/services/__tests__/agent-loop-tools-lifecycle.test.js +0 -430
  174. package/dist/cli/services/__tests__/agent-loop-tools-maxturns.test.js +0 -486
  175. package/dist/cli/services/__tests__/agent-loop-utils-execution.test.js +0 -528
  176. package/dist/cli/services/__tests__/agent-loop-utils-helpers.test.js +0 -466
  177. package/dist/cli/services/__tests__/agent-worker-base-execute.test.js +0 -257
  178. package/dist/cli/services/__tests__/agent-worker-base-helpers.test.js +0 -198
  179. package/dist/cli/services/__tests__/agent-worker-base.test.js +0 -278
  180. package/dist/cli/services/__tests__/auth-service-exports.test.js +0 -41
  181. package/dist/cli/services/__tests__/auth-service.part2.test.js +0 -169
  182. package/dist/cli/services/__tests__/auth-service.test.js +0 -242
  183. package/dist/cli/services/__tests__/background-processes.test.js +0 -282
  184. package/dist/cli/services/__tests__/claude-md-loader.test.js +0 -134
  185. package/dist/cli/services/__tests__/config-store.test.js +0 -247
  186. package/dist/cli/services/__tests__/debug-log.test.js +0 -199
  187. package/dist/cli/services/__tests__/edge-cases-caching.test.js +0 -174
  188. package/dist/cli/services/__tests__/edge-cases-compaction-core.test.js +0 -226
  189. package/dist/cli/services/__tests__/edge-cases-compaction-openai.test.js +0 -152
  190. package/dist/cli/services/__tests__/edge-cases-compaction-shapes.test.js +0 -53
  191. package/dist/cli/services/__tests__/edge-cases-compaction-thinking.test.js +0 -226
  192. package/dist/cli/services/__tests__/edge-cases-compaction.test.js +0 -131
  193. package/dist/cli/services/__tests__/edge-cases-paths.test.js +0 -86
  194. package/dist/cli/services/__tests__/error-logger-messages.test.js +0 -81
  195. package/dist/cli/services/__tests__/error-logger-transport.test.js +0 -119
  196. package/dist/cli/services/__tests__/error-logger.test.js +0 -264
  197. package/dist/cli/services/__tests__/file-history.test.js +0 -136
  198. package/dist/cli/services/__tests__/git-context-cache-reset.test.js +0 -223
  199. package/dist/cli/services/__tests__/git-context.test.js +0 -241
  200. package/dist/cli/services/__tests__/interactive-tools-execute.test.js +0 -166
  201. package/dist/cli/services/__tests__/interactive-tools-plan.test.js +0 -197
  202. package/dist/cli/services/__tests__/interactive-tools.part2.test.js +0 -168
  203. package/dist/cli/services/__tests__/interactive-tools.test.js +0 -179
  204. package/dist/cli/services/__tests__/keybinding-manager.test.js +0 -205
  205. package/dist/cli/services/__tests__/local-tools-dispatch.test.js +0 -404
  206. package/dist/cli/services/__tests__/local-tools.test.js +0 -238
  207. package/dist/cli/services/__tests__/lsp-manager.test.js +0 -364
  208. package/dist/cli/services/__tests__/mcp-client-connect-disconnect.test.js +0 -310
  209. package/dist/cli/services/__tests__/mcp-client.test.js +0 -93
  210. package/dist/cli/services/__tests__/memory-manager.test.js +0 -154
  211. package/dist/cli/services/__tests__/model-manager-utils.test.js +0 -154
  212. package/dist/cli/services/__tests__/model-manager.test.js +0 -175
  213. package/dist/cli/services/__tests__/permission-modes.test.js +0 -222
  214. package/dist/cli/services/__tests__/ripgrep.test.js +0 -328
  215. package/dist/cli/services/__tests__/server-tools-execute.test.js +0 -317
  216. package/dist/cli/services/__tests__/server-tools.test.js +0 -272
  217. package/dist/cli/services/__tests__/session-persistence.test.js +0 -245
  218. package/dist/cli/services/__tests__/subagent-basic.test.js +0 -489
  219. package/dist/cli/services/__tests__/subagent-edge.test.js +0 -545
  220. package/dist/cli/services/__tests__/subagent-prompts.test.js +0 -558
  221. package/dist/cli/services/__tests__/subagent-worker-errors.test.js +0 -255
  222. package/dist/cli/services/__tests__/subagent-worker.test.js +0 -242
  223. package/dist/cli/services/__tests__/system-prompt.test.js +0 -210
  224. package/dist/cli/services/__tests__/team-lead-comms-messaging.test.js +0 -250
  225. package/dist/cli/services/__tests__/team-lead-comms-result.test.js +0 -232
  226. package/dist/cli/services/__tests__/team-lead-comms-stop.test.js +0 -344
  227. package/dist/cli/services/__tests__/team-lead-comms.test.js +0 -285
  228. package/dist/cli/services/__tests__/team-lead-create.test.js +0 -327
  229. package/dist/cli/services/__tests__/team-lead-run.test.js +0 -318
  230. package/dist/cli/services/__tests__/team-lead-stop.test.js +0 -199
  231. package/dist/cli/services/__tests__/team-state-comms.test.js +0 -240
  232. package/dist/cli/services/__tests__/team-state-core.test.js +0 -230
  233. package/dist/cli/services/__tests__/team-state-tasks-complete-fail-available.test.js +0 -224
  234. package/dist/cli/services/__tests__/team-state-tasks.test.js +0 -184
  235. package/dist/cli/services/__tests__/telemetry-ai-metadata.test.js +0 -116
  236. package/dist/cli/services/__tests__/telemetry.part2.test.js +0 -195
  237. package/dist/cli/services/__tests__/telemetry.test.js +0 -176
  238. package/dist/cli/services/agent-loop-iteration.d.ts +0 -13
  239. package/dist/cli/services/agent-loop-setup.d.ts +0 -32
  240. package/dist/cli/services/agent-worker-base-api.d.ts +0 -19
  241. package/dist/cli/services/agent-worker-base-helpers.d.ts +0 -27
  242. package/dist/cli/services/agent-worker-base-tools.d.ts +0 -16
  243. package/dist/cli/services/agent-worker-base-types.d.ts +0 -81
  244. package/dist/cli/services/background-agents.d.ts +0 -26
  245. package/dist/cli/services/background-processes-ops.d.ts +0 -24
  246. package/dist/cli/services/background-tool-defs.d.ts +0 -50
  247. package/dist/cli/services/config-modules-model.test.js +0 -133
  248. package/dist/cli/services/config-modules-permission.test.js +0 -85
  249. package/dist/cli/services/config-modules-permissions.test.js +0 -85
  250. package/dist/cli/services/config-modules-session.test.js +0 -297
  251. package/dist/cli/services/format-server-response-columns.test.js +0 -265
  252. package/dist/cli/services/format-server-response-fallback.test.js +0 -65
  253. package/dist/cli/services/format-server-response-primitives-basic.test.js +0 -261
  254. package/dist/cli/services/format-server-response-primitives-nested.test.js +0 -188
  255. package/dist/cli/services/format-server-response-primitives.test.js +0 -300
  256. package/dist/cli/services/format-server-response-realworld.test.js +0 -248
  257. package/dist/cli/services/format-server-response-values.test.js +0 -247
  258. package/dist/cli/services/hooks-runners.test.js +0 -184
  259. package/dist/cli/services/hooks.glob-load.test.js +0 -233
  260. package/dist/cli/services/hooks.run-hooks.test.js +0 -184
  261. package/dist/cli/services/hooks.test.js +0 -233
  262. package/dist/cli/services/ink-incremental.d.ts +0 -19
  263. package/dist/cli/services/ink-incremental.js +0 -59
  264. package/dist/cli/services/ink-incremental.js.map +0 -1
  265. package/dist/cli/services/ink-resize-fix.d.ts +0 -18
  266. package/dist/cli/services/ink-resize-fix.js +0 -76
  267. package/dist/cli/services/ink-resize-fix.js.map +0 -1
  268. package/dist/cli/services/ink-sync-output.d.ts +0 -12
  269. package/dist/cli/services/ink-sync-output.js +0 -16
  270. package/dist/cli/services/ink-sync-output.js.map +0 -1
  271. package/dist/cli/services/interactive-tool-defs.d.ts +0 -80
  272. package/dist/cli/services/local-tools-definitions.d.ts +0 -6
  273. package/dist/cli/services/local-tools-files.test.js +0 -256
  274. package/dist/cli/services/local-tools-read-many.d.ts +0 -6
  275. package/dist/cli/services/model-router.test.js +0 -245
  276. package/dist/cli/services/rewind-rewindTo.test.js +0 -202
  277. package/dist/cli/services/rewind.test.js +0 -175
  278. package/dist/cli/services/sandbox.test.js +0 -198
  279. package/dist/cli/services/subagent-execution.d.ts +0 -12
  280. package/dist/cli/services/team-lead-auto.d.ts +0 -11
  281. package/dist/cli/services/team-lead-execution.d.ts +0 -28
  282. package/dist/cli/services/teammate-loop.js +0 -557
  283. package/dist/cli/services/teammate-loop.js.map +0 -1
  284. package/dist/cli/services/tools/__tests__/agent-tools-tasks-teams.test.js +0 -250
  285. package/dist/cli/services/tools/__tests__/agent-tools-teams.test.js +0 -200
  286. package/dist/cli/services/tools/__tests__/agent-tools.test.js +0 -340
  287. package/dist/cli/services/tools/__tests__/file-ops-cache.test.js +0 -152
  288. package/dist/cli/services/tools/__tests__/file-ops-notebook.test.js +0 -249
  289. package/dist/cli/services/tools/__tests__/file-ops-read.test.js +0 -261
  290. package/dist/cli/services/tools/__tests__/file-ops-write.test.js +0 -292
  291. package/dist/cli/services/tools/__tests__/search-tools-rg.test.js +0 -92
  292. package/dist/cli/services/tools/__tests__/search-tools.part2.test.js +0 -174
  293. package/dist/cli/services/tools/__tests__/search-tools.test.js +0 -227
  294. package/dist/cli/services/tools/__tests__/shell-exec-allowed-core.test.js +0 -163
  295. package/dist/cli/services/tools/__tests__/shell-exec-allowed-extended.test.js +0 -220
  296. package/dist/cli/services/tools/__tests__/shell-exec-allowed.part2.test.js +0 -215
  297. package/dist/cli/services/tools/__tests__/shell-exec-allowed.test.js +0 -154
  298. package/dist/cli/services/tools/__tests__/shell-exec-blocked.test.js +0 -132
  299. package/dist/cli/services/tools/__tests__/shell-exec-execution.test.js +0 -245
  300. package/dist/cli/services/tools/__tests__/task-manager-create.test.js +0 -110
  301. package/dist/cli/services/tools/__tests__/task-manager-crud.test.js +0 -339
  302. package/dist/cli/services/tools/__tests__/task-manager-list-get.test.js +0 -343
  303. package/dist/cli/services/tools/__tests__/task-manager-query.test.js +0 -346
  304. package/dist/cli/services/tools/__tests__/task-manager-routing.test.js +0 -58
  305. package/dist/cli/services/tools/__tests__/task-manager-update.test.js +0 -224
  306. package/dist/cli/services/tools/__tests__/task-manager.test.js +0 -159
  307. package/dist/cli/services/tools/__tests__/web-tools-html-search.test.js +0 -227
  308. package/dist/cli/services/tools/__tests__/web-tools.test.js +0 -285
  309. package/dist/cli/services/tools/shell-exec.test.js +0 -148
  310. package/dist/cli/shared/SharedTick.d.ts +0 -10
  311. package/dist/cli/shared/__tests__/markdown.test.js +0 -188
  312. package/dist/local-agent/__tests__/connection-disconnect.test.js +0 -201
  313. package/dist/local-agent/__tests__/connection-lifecycle.test.js +0 -289
  314. package/dist/local-agent/__tests__/connection-msghandling.test.js +0 -311
  315. package/dist/local-agent/__tests__/connection-reconnect.test.js +0 -230
  316. package/dist/local-agent/__tests__/connection-toolexec.test.js +0 -253
  317. package/dist/local-agent/__tests__/discovery.test.js +0 -328
  318. package/dist/local-agent/__tests__/executor-background.test.js +0 -219
  319. package/dist/local-agent/__tests__/executor-exec.test.js +0 -221
  320. package/dist/local-agent/__tests__/executor-jobs-sessions.test.js +0 -220
  321. package/dist/local-agent/__tests__/executor-system-info.test.js +0 -133
  322. package/dist/local-agent/__tests__/executor-systeminfo.test.js +0 -109
  323. package/dist/local-agent/__tests__/executor.test.js +0 -235
  324. package/dist/local-agent/__tests__/index.test.js +0 -139
  325. package/dist/node/__tests__/cli-channels.test.js +0 -293
  326. package/dist/node/__tests__/cli-config-edge.test.js +0 -154
  327. package/dist/node/__tests__/cli-config.test.js +0 -215
  328. package/dist/node/__tests__/config.test.js +0 -292
  329. package/dist/node/__tests__/runtime-heartbeat.test.js +0 -153
  330. package/dist/node/__tests__/runtime-lifecycle-init.test.js +0 -263
  331. package/dist/node/__tests__/runtime-lifecycle-stats.test.js +0 -180
  332. package/dist/node/__tests__/runtime-lifecycle.test.js +0 -305
  333. package/dist/node/__tests__/runtime-relay.test.js +0 -341
  334. package/dist/node/adapters/__tests__/base.test.js +0 -286
  335. package/dist/node/adapters/__tests__/discord.test.js +0 -284
  336. package/dist/node/adapters/__tests__/email-send.test.js +0 -295
  337. package/dist/node/adapters/__tests__/email.inbound-send.test.js +0 -217
  338. package/dist/node/adapters/__tests__/email.lifecycle.test.js +0 -211
  339. package/dist/node/adapters/__tests__/email.test.js +0 -290
  340. package/dist/node/adapters/__tests__/email.webhook-send.test.js +0 -251
  341. package/dist/node/adapters/__tests__/imessage-filter.test.js +0 -183
  342. package/dist/node/adapters/__tests__/imessage-lifecycle.test.js +0 -215
  343. package/dist/node/adapters/__tests__/imessage-send-restart.test.js +0 -227
  344. package/dist/node/adapters/__tests__/slack.part2.test.js +0 -135
  345. package/dist/node/adapters/__tests__/slack.test.js +0 -241
  346. package/dist/node/adapters/__tests__/sms-extras.test.js +0 -108
  347. package/dist/node/adapters/__tests__/sms-lifecycle.test.js +0 -203
  348. package/dist/node/adapters/__tests__/sms-messaging.test.js +0 -266
  349. package/dist/node/adapters/__tests__/sms.part2.test.js +0 -174
  350. package/dist/node/adapters/__tests__/sms.test.js +0 -253
  351. package/dist/node/adapters/__tests__/telegram-polling.test.js +0 -256
  352. package/dist/node/adapters/__tests__/telegram-send.test.js +0 -166
  353. package/dist/node/adapters/__tests__/webchat-inbound.test.js +0 -188
  354. package/dist/node/adapters/__tests__/webchat-outbound.test.js +0 -178
  355. package/dist/node/adapters/__tests__/whatsapp-inbound.test.js +0 -200
  356. package/dist/node/adapters/__tests__/whatsapp-send.test.js +0 -212
  357. package/dist/node/adapters/__tests__/whatsapp.test.js +0 -280
  358. package/dist/server/__tests__/gateway-fast-fail.test.js +0 -160
  359. package/dist/server/__tests__/local-agent-gateway.test.js +0 -186
  360. package/dist/server/__tests__/proxy-handlers-delegation.test.js +0 -240
  361. package/dist/server/__tests__/proxy-handlers-validation.test.js +0 -211
  362. package/dist/server/__tests__/proxy-handlers.part2.test.js +0 -240
  363. package/dist/server/__tests__/proxy-handlers.test.js +0 -213
  364. package/dist/server/__tests__/strip-base64-e2e.test.js +0 -303
  365. package/dist/server/__tests__/strip-base64.test.js +0 -256
  366. package/dist/server/__tests__/tool-router-agent-tools.test.js +0 -324
  367. package/dist/server/__tests__/tool-router-execute-core.test.js +0 -357
  368. package/dist/server/__tests__/tool-router-execute-permissions.test.js +0 -332
  369. package/dist/server/__tests__/tool-router-execute.test.js +0 -348
  370. package/dist/server/__tests__/tool-router-load.test.js +0 -432
  371. package/dist/server/__tests__/tool-router-permissions.test.js +0 -359
  372. package/dist/server/__tests__/tool-router-registry-cache.test.js +0 -383
  373. package/dist/server/__tests__/tool-router-registry-handlers.test.js +0 -272
  374. package/dist/server/__tests__/tool-router-registry.test.js +0 -331
  375. package/dist/server/__tests__/validation-inventory.test.js +0 -250
  376. package/dist/server/__tests__/validation-misc.test.js +0 -243
  377. package/dist/server/__tests__/validation-supply-chain.test.js +0 -188
  378. package/dist/server/__tests__/worker.test.js +0 -265
  379. package/dist/server/handlers/__tests__/conversation-lock.test.js +0 -117
  380. package/dist/server/handlers/__tests__/e2e/auth-cross-platform-login.e2e.test.js +0 -268
  381. package/dist/server/handlers/__tests__/e2e/auth-cross-platform-tokens.e2e.test.js +0 -264
  382. package/dist/server/handlers/__tests__/e2e/email-pipeline-send.e2e.test.js +0 -214
  383. package/dist/server/handlers/__tests__/e2e/email-pipeline-threads.e2e.test.js +0 -168
  384. package/dist/server/handlers/__tests__/e2e/error-logging-pipeline-dedup.e2e.test.js +0 -229
  385. package/dist/server/handlers/__tests__/e2e/error-logging-pipeline.e2e.test.js +0 -239
  386. package/dist/server/handlers/__tests__/e2e/error-logging-rate-limit.e2e.test.js +0 -150
  387. package/dist/server/handlers/__tests__/e2e/inventory-sync-guards.e2e.test.js +0 -177
  388. package/dist/server/handlers/__tests__/e2e/inventory-sync.e2e.test.js +0 -228
  389. package/dist/server/handlers/__tests__/e2e/inventory-sync.part2.e2e.test.js +0 -188
  390. package/dist/server/handlers/__tests__/e2e/order-lifecycle-fulfillment.e2e.test.js +0 -295
  391. package/dist/server/handlers/__tests__/e2e/order-lifecycle.e2e.test.js +0 -277
  392. package/dist/server/handlers/__tests__/e2e/order-lifecycle.fulfillment.e2e.test.js +0 -307
  393. package/dist/server/handlers/__tests__/e2e/order-lifecycle.setup.e2e.test.js +0 -177
  394. package/dist/server/handlers/__tests__/e2e/storefront-checkout-cart.e2e.test.js +0 -255
  395. package/dist/server/handlers/__tests__/e2e/storefront-checkout-webhook.e2e.test.js +0 -231
  396. package/dist/server/handlers/__tests__/e2e/workflow-execution-failures.e2e.test.js +0 -235
  397. package/dist/server/handlers/__tests__/e2e/workflow-execution.e2e.test.js +0 -294
  398. package/dist/server/handlers/__tests__/e2e/workflow-security.e2e.test.js +0 -311
  399. package/dist/server/handlers/__tests__/e2e/workflow-security.part2.e2e.test.js +0 -267
  400. package/dist/server/handlers/__tests__/workflow-cache.test.js +0 -237
  401. package/dist/server/handlers/analytics-errors-edge.test.js +0 -173
  402. package/dist/server/handlers/analytics.test.js +0 -280
  403. package/dist/server/handlers/api-docs-examples-ext.d.ts +0 -9
  404. package/dist/server/handlers/api-docs-examples-ext.js +0 -278
  405. package/dist/server/handlers/api-docs-examples-ext.js.map +0 -1
  406. package/dist/server/handlers/api-docs-examples.d.ts +0 -8
  407. package/dist/server/handlers/api-docs-examples.js +0 -221
  408. package/dist/server/handlers/api-docs-examples.js.map +0 -1
  409. package/dist/server/handlers/api-docs-sections-ext.d.ts +0 -2
  410. package/dist/server/handlers/api-docs-sections-ext.js +0 -497
  411. package/dist/server/handlers/api-docs-sections-ext.js.map +0 -1
  412. package/dist/server/handlers/api-docs-sections.d.ts +0 -21
  413. package/dist/server/handlers/api-docs-sections.js +0 -293
  414. package/dist/server/handlers/api-docs-sections.js.map +0 -1
  415. package/dist/server/handlers/api-keys.part2.test.js +0 -157
  416. package/dist/server/handlers/api-keys.test.js +0 -161
  417. package/dist/server/handlers/billing-routes.test.js +0 -123
  418. package/dist/server/handlers/billing.test.js +0 -215
  419. package/dist/server/handlers/browser-actions-errors.test.js +0 -94
  420. package/dist/server/handlers/browser-actions.part2.test.js +0 -190
  421. package/dist/server/handlers/browser-actions.test.js +0 -190
  422. package/dist/server/handlers/browser-validation.test.js +0 -257
  423. package/dist/server/handlers/catalog.test.js +0 -297
  424. package/dist/server/handlers/comms.test.js +0 -289
  425. package/dist/server/handlers/creations-advanced-collections.test.js +0 -214
  426. package/dist/server/handlers/creations-advanced-generate.test.js +0 -142
  427. package/dist/server/handlers/creations-advanced.test.js +0 -171
  428. package/dist/server/handlers/creations-collections-preview.test.js +0 -214
  429. package/dist/server/handlers/creations-crud.test.js +0 -260
  430. package/dist/server/handlers/creations-mutations.test.js +0 -197
  431. package/dist/server/handlers/crm.test.js +0 -179
  432. package/dist/server/handlers/discovery-advertise.test.js +0 -185
  433. package/dist/server/handlers/discovery-scan.test.js +0 -233
  434. package/dist/server/handlers/embeddings-embed-search.test.js +0 -196
  435. package/dist/server/handlers/embeddings-index-delete-stats.test.js +0 -140
  436. package/dist/server/handlers/embeddings-search.test.js +0 -221
  437. package/dist/server/handlers/embeddings.test.js +0 -137
  438. package/dist/server/handlers/enrichment-breach.d.ts +0 -8
  439. package/dist/server/handlers/enrichment-breach.js +0 -266
  440. package/dist/server/handlers/enrichment-breach.js.map +0 -1
  441. package/dist/server/handlers/enrichment-data.d.ts +0 -13
  442. package/dist/server/handlers/enrichment-data.js +0 -145
  443. package/dist/server/handlers/enrichment-data.js.map +0 -1
  444. package/dist/server/handlers/enrichment-mutations.test.js +0 -240
  445. package/dist/server/handlers/enrichment-queries.test.js +0 -181
  446. package/dist/server/handlers/enrichment-validation.test.js +0 -177
  447. package/dist/server/handlers/enrichment-writes.d.ts +0 -16
  448. package/dist/server/handlers/enrichment-writes.js +0 -226
  449. package/dist/server/handlers/enrichment-writes.js.map +0 -1
  450. package/dist/server/handlers/image-gen.test.js +0 -205
  451. package/dist/server/handlers/inventory.test.js +0 -380
  452. package/dist/server/handlers/kali-background.test.js +0 -222
  453. package/dist/server/handlers/kali-errors.test.js +0 -92
  454. package/dist/server/handlers/kali-validation.test.js +0 -234
  455. package/dist/server/handlers/llm-providers-actions.test.js +0 -220
  456. package/dist/server/handlers/llm-providers-anthropic.test.js +0 -239
  457. package/dist/server/handlers/llm-providers-failover.test.js +0 -232
  458. package/dist/server/handlers/llm-providers-providers.test.js +0 -300
  459. package/dist/server/handlers/llm-providers-validation.test.js +0 -239
  460. package/dist/server/handlers/local-agent-tools.test.js +0 -224
  461. package/dist/server/handlers/local-agent.test.js +0 -198
  462. package/dist/server/handlers/local-agent.tools-status.test.js +0 -204
  463. package/dist/server/handlers/local-agent.validation-exec.test.js +0 -182
  464. package/dist/server/handlers/meta-ads-audience-rules.test.js +0 -243
  465. package/dist/server/handlers/meta-ads-audience-targeting.test.js +0 -205
  466. package/dist/server/handlers/meta-ads-audiences-targeting.test.js +0 -383
  467. package/dist/server/handlers/meta-ads-crud-ads.test.js +0 -136
  468. package/dist/server/handlers/meta-ads-crud-campaigns.test.js +0 -189
  469. package/dist/server/handlers/meta-ads-crud-create.test.js +0 -303
  470. package/dist/server/handlers/meta-ads-crud-list-update.test.js +0 -259
  471. package/dist/server/handlers/meta-ads-delete-publish-sync.test.js +0 -282
  472. package/dist/server/handlers/meta-ads-insights.test.js +0 -80
  473. package/dist/server/handlers/meta-ads-list-get.test.js +0 -237
  474. package/dist/server/handlers/meta-ads-publish-delete.test.js +0 -254
  475. package/dist/server/handlers/meta-ads-publish-helpers.js +0 -117
  476. package/dist/server/handlers/meta-ads-publish-helpers.js.map +0 -1
  477. package/dist/server/handlers/meta-ads-publish-sync.test.js +0 -205
  478. package/dist/server/handlers/meta-ads-publish.test.js +0 -254
  479. package/dist/server/handlers/meta-ads-sync-insights.test.js +0 -184
  480. package/dist/server/handlers/meta-ads-update.test.js +0 -117
  481. package/dist/server/handlers/nodes-channels.test.js +0 -413
  482. package/dist/server/handlers/nodes-events.test.js +0 -131
  483. package/dist/server/handlers/nodes-list-delete.test.js +0 -171
  484. package/dist/server/handlers/nodes-messages-delivery.test.js +0 -208
  485. package/dist/server/handlers/nodes-messages.test.js +0 -211
  486. package/dist/server/handlers/nodes-register.test.js +0 -277
  487. package/dist/server/handlers/nodes.test.js +0 -353
  488. package/dist/server/handlers/operations.test.js +0 -136
  489. package/dist/server/handlers/platform-telemetry.test.js +0 -200
  490. package/dist/server/handlers/platform-websearch.test.js +0 -160
  491. package/dist/server/handlers/storefront.test.js +0 -329
  492. package/dist/server/handlers/supply-chain.test.js +0 -347
  493. package/dist/server/handlers/transcription.test.js +0 -118
  494. package/dist/server/handlers/video-gen-veo.js +0 -114
  495. package/dist/server/handlers/video-gen-veo.js.map +0 -1
  496. package/dist/server/handlers/video-gen.test.js +0 -146
  497. package/dist/server/handlers/voice.test.js +0 -153
  498. package/dist/server/handlers/workflow-steps.test.js +0 -330
  499. package/dist/server/handlers/workflows-extras.test.js +0 -65
  500. package/dist/server/handlers/workflows.part2.test.js +0 -170
  501. package/dist/server/handlers/workflows.test.js +0 -281
  502. package/dist/server/lib/__tests__/batch-client-conversion-jsonl.test.js +0 -171
  503. package/dist/server/lib/__tests__/batch-client-polling.test.js +0 -292
  504. package/dist/server/lib/__tests__/batch-client-queue.test.js +0 -270
  505. package/dist/server/lib/__tests__/clickhouse-buffer.test.js +0 -236
  506. package/dist/server/lib/__tests__/code-worker-edge-cases.test.js +0 -118
  507. package/dist/server/lib/__tests__/code-worker-pool-execute.test.js +0 -193
  508. package/dist/server/lib/__tests__/code-worker-pool-execution.test.js +0 -165
  509. package/dist/server/lib/__tests__/code-worker-pool-init.test.js +0 -131
  510. package/dist/server/lib/__tests__/code-worker-pool.test.js +0 -194
  511. package/dist/server/lib/__tests__/code-worker-sandbox-ops.test.js +0 -123
  512. package/dist/server/lib/__tests__/code-worker-sandbox.test.js +0 -217
  513. package/dist/server/lib/__tests__/code-worker.test.js +0 -179
  514. package/dist/server/lib/__tests__/compaction-service-generate.test.js +0 -229
  515. package/dist/server/lib/__tests__/compaction-service.test.js +0 -319
  516. package/dist/server/lib/__tests__/otel.test.js +0 -146
  517. package/dist/server/lib/__tests__/prompt-sanitizer-validation.test.js +0 -165
  518. package/dist/server/lib/__tests__/prompt-sanitizer.sanitize.test.js +0 -343
  519. package/dist/server/lib/__tests__/prompt-sanitizer.test.js +0 -328
  520. package/dist/server/lib/__tests__/prompt-sanitizer.validate-tool.test.js +0 -145
  521. package/dist/server/lib/__tests__/provider-capabilities.test.js +0 -263
  522. package/dist/server/lib/__tests__/provider-failover-routing.test.js +0 -145
  523. package/dist/server/lib/__tests__/provider-failover-state.test.js +0 -131
  524. package/dist/server/lib/__tests__/rate-limiter-budgets.test.js +0 -216
  525. package/dist/server/lib/__tests__/rate-limiter.budgets-tools.test.js +0 -113
  526. package/dist/server/lib/__tests__/rate-limiter.check-request.test.js +0 -141
  527. package/dist/server/lib/__tests__/rate-limiter.stats-lifecycle.test.js +0 -135
  528. package/dist/server/lib/__tests__/rate-limiter.test.js +0 -207
  529. package/dist/server/lib/__tests__/server-agent-loop-abort-conditions.test.js +0 -544
  530. package/dist/server/lib/__tests__/server-agent-loop-abort.part2.test.js +0 -504
  531. package/dist/server/lib/__tests__/server-agent-loop-abort.test.js +0 -396
  532. package/dist/server/lib/__tests__/server-agent-loop-compaction.test.js +0 -397
  533. package/dist/server/lib/__tests__/server-agent-loop-failover.test.js +0 -356
  534. package/dist/server/lib/__tests__/server-agent-loop-features-caching.test.js +0 -519
  535. package/dist/server/lib/__tests__/server-agent-loop-features-edges.test.js +0 -512
  536. package/dist/server/lib/__tests__/server-subagent-bailout.test.js +0 -194
  537. package/dist/server/lib/__tests__/server-subagent-basics.test.js +0 -348
  538. package/dist/server/lib/__tests__/server-subagent-errors-abort.test.js +0 -319
  539. package/dist/server/lib/__tests__/server-subagent-errors-progress.test.js +0 -253
  540. package/dist/server/lib/__tests__/server-subagent-errors.part2.test.js +0 -253
  541. package/dist/server/lib/__tests__/server-subagent-errors.test.js +0 -319
  542. package/dist/server/lib/__tests__/session-checkpoint-load.test.js +0 -275
  543. package/dist/server/lib/__tests__/session-checkpoint-save.test.js +0 -159
  544. package/dist/server/lib/__tests__/ssrf-guard.test.js +0 -93
  545. package/dist/server/lib/__tests__/supabase-client.test.js +0 -111
  546. package/dist/server/lib/__tests__/template-resolver.test.js +0 -317
  547. package/dist/server/lib/__tests__/utils-timeout.test.js +0 -49
  548. package/dist/server/lib/__tests__/utils.test.js +0 -322
  549. package/dist/server/providers/__tests__/anthropic-adapter.test.js +0 -228
  550. package/dist/server/providers/__tests__/anthropic-betas-toolchoice.test.js +0 -257
  551. package/dist/server/providers/__tests__/anthropic-errors.test.js +0 -262
  552. package/dist/server/providers/__tests__/anthropic-stream-core.test.js +0 -275
  553. package/dist/server/providers/__tests__/anthropic-streaming-betas.test.js +0 -247
  554. package/dist/server/providers/__tests__/anthropic-streaming-core.test.js +0 -275
  555. package/dist/server/providers/__tests__/bedrock-config.test.js +0 -177
  556. package/dist/server/providers/__tests__/bedrock-stream-behavior-streaming.test.js +0 -272
  557. package/dist/server/providers/__tests__/bedrock-stream-behavior-toolchoice.test.js +0 -214
  558. package/dist/server/providers/__tests__/bedrock-stream-behavior.part2.test.js +0 -165
  559. package/dist/server/providers/__tests__/bedrock-stream-behavior.test.js +0 -309
  560. package/dist/server/providers/__tests__/bedrock-stream-body-credentials.test.js +0 -170
  561. package/dist/server/providers/__tests__/bedrock-stream-body-extras.test.js +0 -183
  562. package/dist/server/providers/__tests__/bedrock-stream-body-request.test.js +0 -305
  563. package/dist/server/providers/__tests__/bedrock-stream-body.part2.test.js +0 -305
  564. package/dist/server/providers/__tests__/bedrock-stream-body.test.js +0 -175
  565. package/dist/server/providers/__tests__/bedrock-stream-errors.test.js +0 -165
  566. package/dist/server/providers/__tests__/gemini-config-methods.test.js +0 -182
  567. package/dist/server/providers/__tests__/gemini-config-streaming.test.js +0 -257
  568. package/dist/server/providers/__tests__/gemini-conversion-messages.test.js +0 -247
  569. package/dist/server/providers/__tests__/gemini-conversion-schema.test.js +0 -365
  570. package/dist/server/providers/__tests__/gemini-tools-choice.test.js +0 -221
  571. package/dist/server/providers/__tests__/gemini-tools-fn.test.js +0 -252
  572. package/dist/server/providers/__tests__/openai-config.test.js +0 -194
  573. package/dist/server/providers/__tests__/openai-conversion.test.js +0 -276
  574. package/dist/server/providers/__tests__/openai-messages.test.js +0 -261
  575. package/dist/server/providers/__tests__/openai-streaming.test.js +0 -394
  576. package/dist/server/providers/__tests__/openai-tools-cache.test.js +0 -227
  577. package/dist/server/providers/__tests__/registry.test.js +0 -183
  578. package/dist/server/providers/__tests__/shared.test.js +0 -297
  579. package/dist/shared/agent-core-config.test.js +0 -132
  580. package/dist/shared/agent-core-context-thinking.test.js +0 -293
  581. package/dist/shared/agent-core-loop-calls.test.js +0 -174
  582. package/dist/shared/agent-core-loop-detector-bail.test.js +0 -201
  583. package/dist/shared/agent-core-loop-detector.test.js +0 -195
  584. package/dist/shared/agent-core-loop-errors.test.js +0 -258
  585. package/dist/shared/agent-core-pricing.test.js +0 -191
  586. package/dist/shared/agent-core-sanitize-retry.test.js +0 -129
  587. package/dist/shared/api-client-build-request.test.js +0 -228
  588. package/dist/shared/api-client-build-system-caching.test.js +0 -107
  589. package/dist/shared/api-client-build.test.js +0 -223
  590. package/dist/shared/api-client-config.d.ts +0 -21
  591. package/dist/shared/api-client-helpers.d.ts +0 -57
  592. package/dist/shared/api-client-helpers.test.js +0 -261
  593. package/dist/shared/api-client-proxy-happy.test.js +0 -255
  594. package/dist/shared/api-client-proxy-retry.test.js +0 -307
  595. package/dist/shared/api-client-proxy.d.ts +0 -26
  596. package/dist/shared/api-client-proxy.test.js +0 -255
  597. package/dist/shared/api-client-retry.test.js +0 -307
  598. package/dist/shared/api-client-system-trimming.test.js +0 -261
  599. package/dist/shared/api-client-trimming.d.ts +0 -36
  600. package/dist/shared/api-client.test.js +0 -228
  601. package/dist/shared/compaction-thinking.test.js +0 -315
  602. package/dist/shared/compaction-trimming.test.js +0 -223
  603. package/dist/shared/sse-parser-callbacks.test.js +0 -422
  604. package/dist/shared/sse-parser-collect.test.js +0 -252
  605. package/dist/shared/sse-parser-e2e.test.js +0 -558
  606. package/dist/shared/sse-parser-parse.test.js +0 -253
  607. package/dist/shared/tool-dispatch-advanced-batch-build.test.js +0 -405
  608. package/dist/shared/tool-dispatch-advanced.test.js +0 -320
  609. package/dist/shared/tool-dispatch-basic.test.js +0 -278
  610. package/dist/shared/tool-dispatch-content.d.ts +0 -14
  611. package/dist/shared/tool-dispatch-parallel.test.js +0 -378
  612. package/dist/webchat/__tests__/widget-messaging.test.js +0 -323
  613. package/dist/webchat/__tests__/widget.test.js +0 -273
@@ -5,14 +5,24 @@
5
5
  * CLI-only: always calls through server proxy (no direct Anthropic SDK usage).
6
6
  */
7
7
 
8
- import { getContextManagement, getMaxOutputTokens, getThinkingConfig, isRetryableError, addPromptCaching } from "./agent-core.js";
8
+ import { getContextManagement, getMaxOutputTokens, getThinkingConfig, isRetryableError, categorizeError, addPromptCaching } from "./agent-core.js";
9
9
  import { getProvider } from "./constants.js";
10
10
  // ============================================================================
11
11
  // CONSTANTS
12
12
  // ============================================================================
13
13
 
14
- const MAX_RETRIES = 3;
15
- const RETRY_BASE_DELAY_MS = 1000;
14
+ const MAX_RETRIES = 5;
15
+ const RETRY_BASE_DELAY_MS = 2000;
16
+ const RETRY_MAX_DELAY_MS = 60000;
17
+ const MODEL_FALLBACK_AFTER = 2;
18
+
19
+ // Auto-derive fallback model when not explicitly provided
20
+ const AUTO_FALLBACK = {
21
+ "claude-opus-4-6": "claude-sonnet-4-6",
22
+ "claude-opus-4-5-20251101": "claude-sonnet-4-5-20250929",
23
+ "claude-opus-4-20250514": "claude-sonnet-4-20250514",
24
+ "claude-opus-4-1-20250805": "claude-sonnet-4-5-20250929"
25
+ };
16
26
 
17
27
  // ============================================================================
18
28
  // API REQUEST CONFIG BUILDER
@@ -243,7 +253,31 @@ export async function callServerProxy(config) {
243
253
  if (attempt < MAX_RETRIES && isRetryableError(err)) {
244
254
  const errMsg = err instanceof Error ? err.message : String(err);
245
255
  config.onRetry?.(attempt + 1, MAX_RETRIES, errMsg);
246
- const delay = RETRY_BASE_DELAY_MS * Math.pow(2, attempt);
256
+ const {
257
+ category
258
+ } = categorizeError(err);
259
+ let delay = Math.min(RETRY_BASE_DELAY_MS * Math.pow(2, attempt), RETRY_MAX_DELAY_MS);
260
+
261
+ // Overloaded/rate-limited: longer backoff + model fallback
262
+ if (category === "PROVIDER_DOWN" || category === "RATE_LIMIT") {
263
+ delay = Math.min(delay * 3, RETRY_MAX_DELAY_MS);
264
+
265
+ // After N failed attempts, downgrade model (Opus → Sonnet)
266
+ if (attempt >= MODEL_FALLBACK_AFTER) {
267
+ const fallback = config.fallbackModel || AUTO_FALLBACK[config.model];
268
+ if (fallback && config.model !== fallback) {
269
+ const fromModel = config.model;
270
+ config.model = fallback;
271
+ config.onFallback?.(fromModel, config.model);
272
+ // Fallback model likely available — shorter delay
273
+ delay = Math.min(RETRY_BASE_DELAY_MS, delay);
274
+ }
275
+ }
276
+ }
277
+
278
+ // Jitter ±25%
279
+ const jitter = delay * 0.25 * (Math.random() * 2 - 1);
280
+ delay = Math.round(delay + jitter);
247
281
 
248
282
  // Abort-aware backoff — ESC can interrupt the wait immediately
249
283
  await new Promise((resolve, reject) => {
@@ -260,13 +294,6 @@ export async function callServerProxy(config) {
260
294
  once: true
261
295
  });
262
296
  });
263
-
264
- // Fallback model on last retry
265
- if (attempt === MAX_RETRIES - 1 && config.fallbackModel) {
266
- const fromModel = config.model;
267
- config.model = config.fallbackModel;
268
- config.onFallback?.(fromModel, config.model);
269
- }
270
297
  continue;
271
298
  }
272
299
  throw err;
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.js","names":["getContextManagement","getMaxOutputTokens","getThinkingConfig","isRetryableError","addPromptCaching","getProvider","MAX_RETRIES","RETRY_BASE_DELAY_MS","buildAPIRequest","opts","model","contextProfile","thinkingEnabled","maxOutputTokens","contextOverrides","provider","isAnthropicModel","betas","edits","ctxMgmt","config","type","keep","value","trigger","supportsCompaction","includes","push","pause_after_compaction","instructions","thinkingCfg","beta","maxTokens","thinking","budget_tokens","Math","min","filter","e","contextManagement","callServerProxy","proxyUrl","signal","timeoutMs","tokenRefreshed","attempt","body","mode","messages","system","tools","max_tokens","apiConfig","stream","length","context_management","temperature","storeId","store_id","Array","isArray","msgs","keepFrom","max","i","msg","content","block","source","text","sub","serialized","JSON","stringify","fetchOpts","method","headers","token","String","Buffer","byteLength","controller","timeout","AbortController","setTimeout","abort","response","fetch","clearTimeout","ok","errorBody","status","onTokenRefresh","newToken","Object","assign","Error","err","aborted","errMsg","message","onRetry","delay","pow","Promise","resolve","reject","reason","timer","onAbort","addEventListener","once","fallbackModel","fromModel","onFallback","buildSystemBlocks","systemPrompt","costContext","enableCaching","cache_control","prepareWithCaching","trimGeminiContext","estimatedTokens","threshold","keepRecent","toolResultCount","trimCount","trimmed","map","callTranscribe","audioBase64","mediaType","Authorization","audio_base64","media_type","errText","data","json","success","transcript","error","trimOpenAIContext","COMPACTION_TIMEOUT_MS","requestProviderCompaction","system_prompt","compaction_content"],"sources":["../../src/shared/api-client.ts"],"sourcesContent":["/**\n * Unified API Client — ONE server proxy caller with retry and config builder.\n *\n * Replaces proxy+direct call paths in agent-loop, subagent, teammate.\n * CLI-only: always calls through server proxy (no direct Anthropic SDK usage).\n */\n\nimport {\n getContextManagement,\n getMaxOutputTokens,\n getThinkingConfig,\n isRetryableError,\n addPromptCaching,\n} from \"./agent-core.js\";\nimport type { CompactableMessage } from \"./compaction.js\";\nimport { getProvider } from \"./constants.js\";\nimport type { ContextProfile, APIRequestConfig } from \"./types.js\";\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst MAX_RETRIES = 3;\nconst RETRY_BASE_DELAY_MS = 1000;\n\n// ============================================================================\n// API REQUEST CONFIG BUILDER\n// ============================================================================\n\n/**\n * Build all Anthropic API config from a simple profile.\n *\n * Profiles:\n * - 'main': clear at 80K/keep 3, compact at 120K (Opus only)\n * - 'subagent': clear at 60K/keep 2, no compaction, 8192 max tokens\n * - 'teammate': clear at 80K/keep 3, no compaction\n */\nexport function buildAPIRequest(opts: {\n model: string;\n contextProfile: ContextProfile;\n thinkingEnabled?: boolean;\n maxOutputTokens?: number;\n contextOverrides?: import(\"./agent-core.js\").ContextManagementOverrides;\n}): APIRequestConfig {\n const { model, contextProfile, thinkingEnabled = false, maxOutputTokens, contextOverrides } = opts;\n\n // Context management config per profile\n // Non-Anthropic models (Gemini, OpenAI, etc.) don't support Anthropic betas or context management\n const provider = getProvider(model);\n const isAnthropicModel = provider === \"anthropic\" || provider === \"bedrock\";\n let betas: string[] = isAnthropicModel ? [\"context-management-2025-06-27\"] : [];\n let edits: Array<Record<string, unknown>> = [];\n\n switch (contextProfile) {\n case \"main\": {\n const ctxMgmt = getContextManagement(model, contextOverrides);\n betas = [...ctxMgmt.betas];\n edits = ctxMgmt.config.edits;\n break;\n }\n case \"subagent\":\n if (isAnthropicModel) {\n edits = [\n {\n type: \"clear_thinking_20251015\",\n keep: { type: \"thinking_turns\", value: 1 },\n },\n {\n type: \"clear_tool_uses_20250919\",\n trigger: { type: \"input_tokens\", value: 60_000 },\n keep: { type: \"tool_uses\", value: 2 },\n },\n ];\n // Compaction for sub-agents on models that support it (lower threshold than main agent).\n // Trigger at 80K — above the 60K clear_tool_uses threshold so clearing fires first.\n const supportsCompaction = model.includes(\"opus-4-6\") || model.includes(\"sonnet-4-6\");\n if (supportsCompaction) {\n edits.push({\n type: \"compact_20260112\",\n trigger: { type: \"input_tokens\", value: 80_000 },\n pause_after_compaction: true,\n instructions: \"Summarize preserving: task goal, files found/modified, key findings, next steps.\",\n });\n betas.push(\"compact-2026-01-12\");\n }\n }\n break;\n case \"teammate\": {\n const ctxMgmt = getContextManagement(model);\n betas = [...ctxMgmt.betas];\n edits = ctxMgmt.config.edits;\n break;\n }\n }\n\n // Thinking config\n const thinkingCfg = getThinkingConfig(model, thinkingEnabled);\n if (thinkingCfg.beta) betas.push(thinkingCfg.beta);\n\n // Max tokens — caller is responsible for setting appropriate limits per context\n const maxTokens = getMaxOutputTokens(model, maxOutputTokens);\n\n // Build thinking param (ensure budget < maxTokens)\n // Only include for Anthropic/Bedrock — Gemini/OpenAI handle thinking internally\n let thinking: { type: string; budget_tokens?: number } | undefined;\n if (isAnthropicModel && thinkingCfg.thinking.type !== \"disabled\") {\n thinking = thinkingCfg.thinking.budget_tokens\n ? { ...thinkingCfg.thinking, budget_tokens: Math.min(thinkingCfg.thinking.budget_tokens, maxTokens - 1) }\n : thinkingCfg.thinking;\n }\n\n // Strip clear_thinking edits when thinking is disabled — API requires thinking\n // to be enabled or adaptive for clear_thinking_20251015 to be accepted\n if (!thinking) {\n edits = edits.filter(e => e.type !== \"clear_thinking_20251015\");\n }\n\n return {\n betas,\n contextManagement: { edits },\n thinking,\n maxTokens,\n };\n}\n\n// ============================================================================\n// SERVER PROXY CALLER\n// ============================================================================\n\nexport interface CallServerProxyConfig {\n proxyUrl: string;\n token: string;\n model: string;\n system: object[];\n messages: object[];\n tools: object[];\n apiConfig: APIRequestConfig;\n signal?: AbortSignal;\n timeoutMs?: number;\n fallbackModel?: string;\n storeId?: string; // Required for non-Anthropic providers (credential resolution)\n onFallback?: (fromModel: string, toModel: string) => void;\n onRetry?: (attempt: number, maxRetries: number, error: string) => void;\n /** Called on 401 to refresh the auth token. Returns new token or null. */\n onTokenRefresh?: () => Promise<string | null>;\n}\n\n/**\n * Call server proxy endpoint and return raw SSE stream.\n * Retries with exponential backoff on 429/500/529.\n */\nexport async function callServerProxy(\n config: CallServerProxyConfig,\n): Promise<ReadableStream<Uint8Array>> {\n const { proxyUrl, signal, timeoutMs } = config;\n let tokenRefreshed = false;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n try {\n const body: Record<string, unknown> = {\n mode: \"proxy\",\n messages: config.messages,\n system: config.system,\n tools: config.tools,\n model: config.model,\n max_tokens: config.apiConfig.maxTokens,\n stream: true,\n betas: config.apiConfig.betas,\n ...(config.apiConfig.contextManagement?.edits?.length\n ? { context_management: config.apiConfig.contextManagement }\n : {}),\n };\n if (config.apiConfig.thinking) {\n body.thinking = config.apiConfig.thinking;\n // Anthropic requires temperature=1.0 when thinking is enabled — enforce client-side\n if (config.apiConfig.thinking.type !== \"disabled\") {\n body.temperature = 1.0;\n }\n }\n if (config.storeId) {\n body.store_id = config.storeId;\n }\n\n // Prune old base64 images from conversation history before serializing.\n // Keep images only in the last 2 messages to avoid multi-MB request bodies\n // that can cause \"Invalid JSON\" errors from body truncation on the proxy.\n if (Array.isArray(body.messages) && (body.messages as any[]).length > 4) {\n const msgs = body.messages as any[];\n const keepFrom = Math.max(0, msgs.length - 2);\n for (let i = 0; i < keepFrom; i++) {\n const msg = msgs[i];\n if (!Array.isArray(msg?.content)) continue;\n for (const block of msg.content) {\n if (block.type === \"image\" && block.source?.type === \"base64\") {\n block.type = \"text\";\n block.text = \"[image]\";\n delete block.source;\n }\n if (block.type === \"tool_result\" && Array.isArray(block.content)) {\n for (const sub of block.content) {\n if (sub.type === \"image\" && sub.source?.type === \"base64\") {\n sub.type = \"text\";\n sub.text = \"[image]\";\n delete sub.source;\n }\n }\n }\n }\n }\n }\n\n const serialized = JSON.stringify(body);\n const fetchOpts: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${config.token}`,\n \"Content-Length\": String(Buffer.byteLength(serialized)),\n },\n body: serialized,\n signal,\n };\n\n // Apply timeout only when the caller did NOT already supply a signal\n let controller: AbortController | undefined;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n if (timeoutMs && !signal) {\n controller = new AbortController();\n timeout = setTimeout(() => controller!.abort(), timeoutMs);\n fetchOpts.signal = controller.signal;\n }\n\n try {\n const response = await fetch(proxyUrl, fetchOpts);\n if (timeout) clearTimeout(timeout);\n\n if (response.ok && response.body) {\n return response.body;\n }\n\n const errorBody = await response.text();\n\n // Auto-refresh on 401 (token invalidated server-side before local expiry)\n if (response.status === 401 && config.onTokenRefresh && !tokenRefreshed) {\n const newToken = await config.onTokenRefresh();\n if (newToken) {\n tokenRefreshed = true;\n config.token = newToken;\n continue; // retry with new token\n }\n }\n\n throw Object.assign(\n new Error(`Proxy error (${response.status}): ${errorBody}`),\n { status: response.status },\n );\n } catch (err) {\n if (timeout) clearTimeout(timeout);\n throw err;\n }\n } catch (err: unknown) {\n if (signal?.aborted) throw err;\n\n if (attempt < MAX_RETRIES && isRetryableError(err)) {\n const errMsg = err instanceof Error ? err.message : String(err);\n config.onRetry?.(attempt + 1, MAX_RETRIES, errMsg);\n const delay = RETRY_BASE_DELAY_MS * Math.pow(2, attempt);\n\n // Abort-aware backoff — ESC can interrupt the wait immediately\n await new Promise<void>((resolve, reject) => {\n if (signal?.aborted) { reject(signal.reason ?? new Error(\"Aborted\")); return; }\n const timer = setTimeout(resolve, delay);\n const onAbort = () => { clearTimeout(timer); reject(signal!.reason ?? new Error(\"Aborted\")); };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n\n // Fallback model on last retry\n if (attempt === MAX_RETRIES - 1 && config.fallbackModel) {\n const fromModel = config.model;\n config.model = config.fallbackModel;\n config.onFallback?.(fromModel, config.model);\n }\n continue;\n }\n throw err;\n }\n }\n\n throw new Error(\"Failed to get response after retries\");\n}\n\n// ============================================================================\n// HELPERS — system prompt + caching setup\n// ============================================================================\n\n/**\n * Build system blocks with prompt caching.\n * Cached system prompt + optional dynamic cost context (after cache breakpoint).\n */\nexport function buildSystemBlocks(\n systemPrompt: string,\n costContext?: string,\n enableCaching = true,\n): Array<Record<string, unknown>> {\n const system: Array<Record<string, unknown>> = [];\n\n if (enableCaching) {\n system.push({\n type: \"text\",\n text: systemPrompt,\n cache_control: { type: \"ephemeral\" },\n });\n } else {\n system.push({ type: \"text\", text: systemPrompt });\n }\n\n if (costContext) {\n system.push({ type: \"text\", text: costContext });\n }\n\n return system;\n}\n\n/**\n * Prepare messages and tools with prompt caching.\n * Skips cache_control injection for Gemini (uses implicit caching).\n */\nexport function prepareWithCaching<\n T extends object = object,\n M extends { role: string; content: unknown } = { role: string; content: unknown },\n>(\n tools: T[],\n messages: M[],\n model?: string,\n): { tools: T[]; messages: M[] } {\n if (model) {\n const provider = getProvider(model);\n if (provider === \"gemini\" || provider === \"openai\") {\n return { tools, messages };\n }\n }\n return addPromptCaching(tools, messages);\n}\n\n// ============================================================================\n// GEMINI CONTEXT TRIMMING\n// ============================================================================\n\n/**\n * Client-side context trimming for Gemini (no server-side context management).\n * When estimated input tokens exceed threshold, replaces old tool result contents\n * with \"[trimmed]\" to stay within Gemini's 1M context window.\n */\nexport function trimGeminiContext<T extends CompactableMessage>(\n messages: T[],\n estimatedTokens: number,\n threshold = 950_000,\n keepRecent = 5,\n): T[] {\n if (estimatedTokens < threshold) return messages;\n\n type Block = { type?: string; content?: unknown };\n let toolResultCount = 0;\n for (const msg of messages) {\n if (Array.isArray(msg.content)) {\n for (const block of msg.content as Block[]) {\n if (block.type === \"tool_result\") toolResultCount++;\n }\n }\n }\n\n if (toolResultCount <= keepRecent) return messages;\n\n const trimCount = toolResultCount - keepRecent;\n let trimmed = 0;\n\n return messages.map((msg) => {\n if (!Array.isArray(msg.content)) return msg;\n const content = (msg.content as Block[]).map((block) => {\n if (block.type === \"tool_result\" && trimmed < trimCount) {\n trimmed++;\n if (typeof block.content === \"string\") {\n return { ...block, content: \"[trimmed]\" };\n } else if (Array.isArray(block.content)) {\n return { ...block, content: [{ type: \"text\", text: \"[trimmed]\" }] };\n }\n }\n return block;\n });\n return { ...msg, content } as T;\n });\n}\n\n// ============================================================================\n// OPENAI CONTEXT TRIMMING\n// ============================================================================\n\n/**\n * Client-side context trimming for OpenAI (no server-side context management).\n * When estimated input tokens exceed threshold, replaces old tool result contents\n * with \"[trimmed]\" to stay within OpenAI's 200K context window.\n */\n// ============================================================================\n// AUDIO TRANSCRIPTION CLIENT\n// ============================================================================\n\n/**\n * Call server transcription endpoint (OpenAI Whisper via our Fly.io proxy).\n * Used by tool-dispatch when __AUDIO__ marker is detected in tool results.\n */\nexport async function callTranscribe(opts: {\n proxyUrl: string;\n token: string;\n storeId: string;\n audioBase64: string;\n mediaType: string;\n}): Promise<string> {\n const { proxyUrl, token, storeId, audioBase64, mediaType } = opts;\n\n // Use same server URL as proxy, just different mode\n const response = await fetch(proxyUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n mode: \"transcribe\",\n audio_base64: audioBase64,\n media_type: mediaType,\n store_id: storeId,\n }),\n });\n\n if (!response.ok) {\n const errText = await response.text();\n throw new Error(`Transcription failed (${response.status}): ${errText}`);\n }\n\n const data = (await response.json()) as { success: boolean; transcript?: string; error?: string };\n if (!data.success || !data.transcript) {\n throw new Error(data.error || \"Transcription returned no transcript\");\n }\n\n return data.transcript;\n}\n\n// ============================================================================\n// OPENAI CONTEXT TRIMMING\n// ============================================================================\n\nexport function trimOpenAIContext<T extends CompactableMessage>(\n messages: T[],\n estimatedTokens: number,\n threshold = 190_000,\n keepRecent = 5,\n): T[] {\n if (estimatedTokens < threshold) return messages;\n\n type Block = { type?: string; content?: unknown };\n let toolResultCount = 0;\n for (const msg of messages) {\n if (Array.isArray(msg.content)) {\n for (const block of msg.content as Block[]) {\n if (block.type === \"tool_result\") toolResultCount++;\n }\n }\n }\n\n if (toolResultCount <= keepRecent) return messages;\n\n const trimCount = toolResultCount - keepRecent;\n let trimmed = 0;\n\n return messages.map((msg) => {\n if (!Array.isArray(msg.content)) return msg;\n const content = (msg.content as Block[]).map((block) => {\n if (block.type === \"tool_result\" && trimmed < trimCount) {\n trimmed++;\n if (typeof block.content === \"string\") {\n return { ...block, content: \"[trimmed]\" };\n } else if (Array.isArray(block.content)) {\n return { ...block, content: [{ type: \"text\", text: \"[trimmed]\" }] };\n }\n }\n return block;\n });\n return { ...msg, content } as T;\n });\n}\n\n// ============================================================================\n// PROVIDER COMPACTION CLIENT\n// ============================================================================\n\nconst COMPACTION_TIMEOUT_MS = 30_000;\n\n/**\n * Request conversation compaction from the server (Haiku summarization).\n * Used by non-Anthropic providers (OpenAI, Gemini) that lack native compaction.\n * Returns summary string or null on failure (caller keeps unsummarized history).\n */\nexport async function requestProviderCompaction(opts: {\n proxyUrl: string;\n token: string;\n messages: object[];\n systemPrompt: string;\n}): Promise<string | null> {\n const { proxyUrl, token, messages, systemPrompt } = opts;\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), COMPACTION_TIMEOUT_MS);\n\n try {\n const response = await fetch(proxyUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n mode: \"compact\",\n messages,\n system_prompt: systemPrompt,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as {\n success: boolean;\n compaction_content?: string;\n error?: string;\n };\n\n return data.success && data.compaction_content ? data.compaction_content : null;\n } finally {\n clearTimeout(timeout);\n }\n } catch {\n return null; // Graceful failure — caller keeps unsummarized history\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"api-client.js","names":["getContextManagement","getMaxOutputTokens","getThinkingConfig","isRetryableError","categorizeError","addPromptCaching","getProvider","MAX_RETRIES","RETRY_BASE_DELAY_MS","RETRY_MAX_DELAY_MS","MODEL_FALLBACK_AFTER","AUTO_FALLBACK","buildAPIRequest","opts","model","contextProfile","thinkingEnabled","maxOutputTokens","contextOverrides","provider","isAnthropicModel","betas","edits","ctxMgmt","config","type","keep","value","trigger","supportsCompaction","includes","push","pause_after_compaction","instructions","thinkingCfg","beta","maxTokens","thinking","budget_tokens","Math","min","filter","e","contextManagement","callServerProxy","proxyUrl","signal","timeoutMs","tokenRefreshed","attempt","body","mode","messages","system","tools","max_tokens","apiConfig","stream","length","context_management","temperature","storeId","store_id","Array","isArray","msgs","keepFrom","max","i","msg","content","block","source","text","sub","serialized","JSON","stringify","fetchOpts","method","headers","token","String","Buffer","byteLength","controller","timeout","AbortController","setTimeout","abort","response","fetch","clearTimeout","ok","errorBody","status","onTokenRefresh","newToken","Object","assign","Error","err","aborted","errMsg","message","onRetry","category","delay","pow","fallback","fallbackModel","fromModel","onFallback","jitter","random","round","Promise","resolve","reject","reason","timer","onAbort","addEventListener","once","buildSystemBlocks","systemPrompt","costContext","enableCaching","cache_control","prepareWithCaching","trimGeminiContext","estimatedTokens","threshold","keepRecent","toolResultCount","trimCount","trimmed","map","callTranscribe","audioBase64","mediaType","Authorization","audio_base64","media_type","errText","data","json","success","transcript","error","trimOpenAIContext","COMPACTION_TIMEOUT_MS","requestProviderCompaction","system_prompt","compaction_content"],"sources":["../../src/shared/api-client.ts"],"sourcesContent":["/**\n * Unified API Client — ONE server proxy caller with retry and config builder.\n *\n * Replaces proxy+direct call paths in agent-loop, subagent, teammate.\n * CLI-only: always calls through server proxy (no direct Anthropic SDK usage).\n */\n\nimport {\n getContextManagement,\n getMaxOutputTokens,\n getThinkingConfig,\n isRetryableError,\n categorizeError,\n addPromptCaching,\n} from \"./agent-core.js\";\nimport type { CompactableMessage } from \"./compaction.js\";\nimport { getProvider } from \"./constants.js\";\nimport type { ContextProfile, APIRequestConfig } from \"./types.js\";\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst MAX_RETRIES = 5;\nconst RETRY_BASE_DELAY_MS = 2000;\nconst RETRY_MAX_DELAY_MS = 60000;\nconst MODEL_FALLBACK_AFTER = 2;\n\n// Auto-derive fallback model when not explicitly provided\nconst AUTO_FALLBACK: Record<string, string> = {\n \"claude-opus-4-6\": \"claude-sonnet-4-6\",\n \"claude-opus-4-5-20251101\": \"claude-sonnet-4-5-20250929\",\n \"claude-opus-4-20250514\": \"claude-sonnet-4-20250514\",\n \"claude-opus-4-1-20250805\": \"claude-sonnet-4-5-20250929\",\n};\n\n// ============================================================================\n// API REQUEST CONFIG BUILDER\n// ============================================================================\n\n/**\n * Build all Anthropic API config from a simple profile.\n *\n * Profiles:\n * - 'main': clear at 80K/keep 3, compact at 120K (Opus only)\n * - 'subagent': clear at 60K/keep 2, no compaction, 8192 max tokens\n * - 'teammate': clear at 80K/keep 3, no compaction\n */\nexport function buildAPIRequest(opts: {\n model: string;\n contextProfile: ContextProfile;\n thinkingEnabled?: boolean;\n maxOutputTokens?: number;\n contextOverrides?: import(\"./agent-core.js\").ContextManagementOverrides;\n}): APIRequestConfig {\n const { model, contextProfile, thinkingEnabled = false, maxOutputTokens, contextOverrides } = opts;\n\n // Context management config per profile\n // Non-Anthropic models (Gemini, OpenAI, etc.) don't support Anthropic betas or context management\n const provider = getProvider(model);\n const isAnthropicModel = provider === \"anthropic\" || provider === \"bedrock\";\n let betas: string[] = isAnthropicModel ? [\"context-management-2025-06-27\"] : [];\n let edits: Array<Record<string, unknown>> = [];\n\n switch (contextProfile) {\n case \"main\": {\n const ctxMgmt = getContextManagement(model, contextOverrides);\n betas = [...ctxMgmt.betas];\n edits = ctxMgmt.config.edits;\n break;\n }\n case \"subagent\":\n if (isAnthropicModel) {\n edits = [\n {\n type: \"clear_thinking_20251015\",\n keep: { type: \"thinking_turns\", value: 1 },\n },\n {\n type: \"clear_tool_uses_20250919\",\n trigger: { type: \"input_tokens\", value: 60_000 },\n keep: { type: \"tool_uses\", value: 2 },\n },\n ];\n // Compaction for sub-agents on models that support it (lower threshold than main agent).\n // Trigger at 80K — above the 60K clear_tool_uses threshold so clearing fires first.\n const supportsCompaction = model.includes(\"opus-4-6\") || model.includes(\"sonnet-4-6\");\n if (supportsCompaction) {\n edits.push({\n type: \"compact_20260112\",\n trigger: { type: \"input_tokens\", value: 80_000 },\n pause_after_compaction: true,\n instructions: \"Summarize preserving: task goal, files found/modified, key findings, next steps.\",\n });\n betas.push(\"compact-2026-01-12\");\n }\n }\n break;\n case \"teammate\": {\n const ctxMgmt = getContextManagement(model);\n betas = [...ctxMgmt.betas];\n edits = ctxMgmt.config.edits;\n break;\n }\n }\n\n // Thinking config\n const thinkingCfg = getThinkingConfig(model, thinkingEnabled);\n if (thinkingCfg.beta) betas.push(thinkingCfg.beta);\n\n // Max tokens — caller is responsible for setting appropriate limits per context\n const maxTokens = getMaxOutputTokens(model, maxOutputTokens);\n\n // Build thinking param (ensure budget < maxTokens)\n // Only include for Anthropic/Bedrock — Gemini/OpenAI handle thinking internally\n let thinking: { type: string; budget_tokens?: number } | undefined;\n if (isAnthropicModel && thinkingCfg.thinking.type !== \"disabled\") {\n thinking = thinkingCfg.thinking.budget_tokens\n ? { ...thinkingCfg.thinking, budget_tokens: Math.min(thinkingCfg.thinking.budget_tokens, maxTokens - 1) }\n : thinkingCfg.thinking;\n }\n\n // Strip clear_thinking edits when thinking is disabled — API requires thinking\n // to be enabled or adaptive for clear_thinking_20251015 to be accepted\n if (!thinking) {\n edits = edits.filter(e => e.type !== \"clear_thinking_20251015\");\n }\n\n return {\n betas,\n contextManagement: { edits },\n thinking,\n maxTokens,\n };\n}\n\n// ============================================================================\n// SERVER PROXY CALLER\n// ============================================================================\n\nexport interface CallServerProxyConfig {\n proxyUrl: string;\n token: string;\n model: string;\n system: object[];\n messages: object[];\n tools: object[];\n apiConfig: APIRequestConfig;\n signal?: AbortSignal;\n timeoutMs?: number;\n fallbackModel?: string;\n storeId?: string; // Required for non-Anthropic providers (credential resolution)\n onFallback?: (fromModel: string, toModel: string) => void;\n onRetry?: (attempt: number, maxRetries: number, error: string) => void;\n /** Called on 401 to refresh the auth token. Returns new token or null. */\n onTokenRefresh?: () => Promise<string | null>;\n}\n\n/**\n * Call server proxy endpoint and return raw SSE stream.\n * Retries with exponential backoff on 429/500/529.\n */\nexport async function callServerProxy(\n config: CallServerProxyConfig,\n): Promise<ReadableStream<Uint8Array>> {\n const { proxyUrl, signal, timeoutMs } = config;\n let tokenRefreshed = false;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n try {\n const body: Record<string, unknown> = {\n mode: \"proxy\",\n messages: config.messages,\n system: config.system,\n tools: config.tools,\n model: config.model,\n max_tokens: config.apiConfig.maxTokens,\n stream: true,\n betas: config.apiConfig.betas,\n ...(config.apiConfig.contextManagement?.edits?.length\n ? { context_management: config.apiConfig.contextManagement }\n : {}),\n };\n if (config.apiConfig.thinking) {\n body.thinking = config.apiConfig.thinking;\n // Anthropic requires temperature=1.0 when thinking is enabled — enforce client-side\n if (config.apiConfig.thinking.type !== \"disabled\") {\n body.temperature = 1.0;\n }\n }\n if (config.storeId) {\n body.store_id = config.storeId;\n }\n\n // Prune old base64 images from conversation history before serializing.\n // Keep images only in the last 2 messages to avoid multi-MB request bodies\n // that can cause \"Invalid JSON\" errors from body truncation on the proxy.\n if (Array.isArray(body.messages) && (body.messages as any[]).length > 4) {\n const msgs = body.messages as any[];\n const keepFrom = Math.max(0, msgs.length - 2);\n for (let i = 0; i < keepFrom; i++) {\n const msg = msgs[i];\n if (!Array.isArray(msg?.content)) continue;\n for (const block of msg.content) {\n if (block.type === \"image\" && block.source?.type === \"base64\") {\n block.type = \"text\";\n block.text = \"[image]\";\n delete block.source;\n }\n if (block.type === \"tool_result\" && Array.isArray(block.content)) {\n for (const sub of block.content) {\n if (sub.type === \"image\" && sub.source?.type === \"base64\") {\n sub.type = \"text\";\n sub.text = \"[image]\";\n delete sub.source;\n }\n }\n }\n }\n }\n }\n\n const serialized = JSON.stringify(body);\n const fetchOpts: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${config.token}`,\n \"Content-Length\": String(Buffer.byteLength(serialized)),\n },\n body: serialized,\n signal,\n };\n\n // Apply timeout only when the caller did NOT already supply a signal\n let controller: AbortController | undefined;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n if (timeoutMs && !signal) {\n controller = new AbortController();\n timeout = setTimeout(() => controller!.abort(), timeoutMs);\n fetchOpts.signal = controller.signal;\n }\n\n try {\n const response = await fetch(proxyUrl, fetchOpts);\n if (timeout) clearTimeout(timeout);\n\n if (response.ok && response.body) {\n return response.body;\n }\n\n const errorBody = await response.text();\n\n // Auto-refresh on 401 (token invalidated server-side before local expiry)\n if (response.status === 401 && config.onTokenRefresh && !tokenRefreshed) {\n const newToken = await config.onTokenRefresh();\n if (newToken) {\n tokenRefreshed = true;\n config.token = newToken;\n continue; // retry with new token\n }\n }\n\n throw Object.assign(\n new Error(`Proxy error (${response.status}): ${errorBody}`),\n { status: response.status },\n );\n } catch (err) {\n if (timeout) clearTimeout(timeout);\n throw err;\n }\n } catch (err: unknown) {\n if (signal?.aborted) throw err;\n\n if (attempt < MAX_RETRIES && isRetryableError(err)) {\n const errMsg = err instanceof Error ? err.message : String(err);\n config.onRetry?.(attempt + 1, MAX_RETRIES, errMsg);\n\n const { category } = categorizeError(err);\n let delay = Math.min(RETRY_BASE_DELAY_MS * Math.pow(2, attempt), RETRY_MAX_DELAY_MS);\n\n // Overloaded/rate-limited: longer backoff + model fallback\n if (category === \"PROVIDER_DOWN\" || category === \"RATE_LIMIT\") {\n delay = Math.min(delay * 3, RETRY_MAX_DELAY_MS);\n\n // After N failed attempts, downgrade model (Opus → Sonnet)\n if (attempt >= MODEL_FALLBACK_AFTER) {\n const fallback = config.fallbackModel || AUTO_FALLBACK[config.model];\n if (fallback && config.model !== fallback) {\n const fromModel = config.model;\n config.model = fallback;\n config.onFallback?.(fromModel, config.model);\n // Fallback model likely available — shorter delay\n delay = Math.min(RETRY_BASE_DELAY_MS, delay);\n }\n }\n }\n\n // Jitter ±25%\n const jitter = delay * 0.25 * (Math.random() * 2 - 1);\n delay = Math.round(delay + jitter);\n\n // Abort-aware backoff — ESC can interrupt the wait immediately\n await new Promise<void>((resolve, reject) => {\n if (signal?.aborted) { reject(signal.reason ?? new Error(\"Aborted\")); return; }\n const timer = setTimeout(resolve, delay);\n const onAbort = () => { clearTimeout(timer); reject(signal!.reason ?? new Error(\"Aborted\")); };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n continue;\n }\n throw err;\n }\n }\n\n throw new Error(\"Failed to get response after retries\");\n}\n\n// ============================================================================\n// HELPERS — system prompt + caching setup\n// ============================================================================\n\n/**\n * Build system blocks with prompt caching.\n * Cached system prompt + optional dynamic cost context (after cache breakpoint).\n */\nexport function buildSystemBlocks(\n systemPrompt: string,\n costContext?: string,\n enableCaching = true,\n): Array<Record<string, unknown>> {\n const system: Array<Record<string, unknown>> = [];\n\n if (enableCaching) {\n system.push({\n type: \"text\",\n text: systemPrompt,\n cache_control: { type: \"ephemeral\" },\n });\n } else {\n system.push({ type: \"text\", text: systemPrompt });\n }\n\n if (costContext) {\n system.push({ type: \"text\", text: costContext });\n }\n\n return system;\n}\n\n/**\n * Prepare messages and tools with prompt caching.\n * Skips cache_control injection for Gemini (uses implicit caching).\n */\nexport function prepareWithCaching<\n T extends object = object,\n M extends { role: string; content: unknown } = { role: string; content: unknown },\n>(\n tools: T[],\n messages: M[],\n model?: string,\n): { tools: T[]; messages: M[] } {\n if (model) {\n const provider = getProvider(model);\n if (provider === \"gemini\" || provider === \"openai\") {\n return { tools, messages };\n }\n }\n return addPromptCaching(tools, messages);\n}\n\n// ============================================================================\n// GEMINI CONTEXT TRIMMING\n// ============================================================================\n\n/**\n * Client-side context trimming for Gemini (no server-side context management).\n * When estimated input tokens exceed threshold, replaces old tool result contents\n * with \"[trimmed]\" to stay within Gemini's 1M context window.\n */\nexport function trimGeminiContext<T extends CompactableMessage>(\n messages: T[],\n estimatedTokens: number,\n threshold = 950_000,\n keepRecent = 5,\n): T[] {\n if (estimatedTokens < threshold) return messages;\n\n type Block = { type?: string; content?: unknown };\n let toolResultCount = 0;\n for (const msg of messages) {\n if (Array.isArray(msg.content)) {\n for (const block of msg.content as Block[]) {\n if (block.type === \"tool_result\") toolResultCount++;\n }\n }\n }\n\n if (toolResultCount <= keepRecent) return messages;\n\n const trimCount = toolResultCount - keepRecent;\n let trimmed = 0;\n\n return messages.map((msg) => {\n if (!Array.isArray(msg.content)) return msg;\n const content = (msg.content as Block[]).map((block) => {\n if (block.type === \"tool_result\" && trimmed < trimCount) {\n trimmed++;\n if (typeof block.content === \"string\") {\n return { ...block, content: \"[trimmed]\" };\n } else if (Array.isArray(block.content)) {\n return { ...block, content: [{ type: \"text\", text: \"[trimmed]\" }] };\n }\n }\n return block;\n });\n return { ...msg, content } as T;\n });\n}\n\n// ============================================================================\n// OPENAI CONTEXT TRIMMING\n// ============================================================================\n\n/**\n * Client-side context trimming for OpenAI (no server-side context management).\n * When estimated input tokens exceed threshold, replaces old tool result contents\n * with \"[trimmed]\" to stay within OpenAI's 200K context window.\n */\n// ============================================================================\n// AUDIO TRANSCRIPTION CLIENT\n// ============================================================================\n\n/**\n * Call server transcription endpoint (OpenAI Whisper via our Fly.io proxy).\n * Used by tool-dispatch when __AUDIO__ marker is detected in tool results.\n */\nexport async function callTranscribe(opts: {\n proxyUrl: string;\n token: string;\n storeId: string;\n audioBase64: string;\n mediaType: string;\n}): Promise<string> {\n const { proxyUrl, token, storeId, audioBase64, mediaType } = opts;\n\n // Use same server URL as proxy, just different mode\n const response = await fetch(proxyUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n mode: \"transcribe\",\n audio_base64: audioBase64,\n media_type: mediaType,\n store_id: storeId,\n }),\n });\n\n if (!response.ok) {\n const errText = await response.text();\n throw new Error(`Transcription failed (${response.status}): ${errText}`);\n }\n\n const data = (await response.json()) as { success: boolean; transcript?: string; error?: string };\n if (!data.success || !data.transcript) {\n throw new Error(data.error || \"Transcription returned no transcript\");\n }\n\n return data.transcript;\n}\n\n// ============================================================================\n// OPENAI CONTEXT TRIMMING\n// ============================================================================\n\nexport function trimOpenAIContext<T extends CompactableMessage>(\n messages: T[],\n estimatedTokens: number,\n threshold = 190_000,\n keepRecent = 5,\n): T[] {\n if (estimatedTokens < threshold) return messages;\n\n type Block = { type?: string; content?: unknown };\n let toolResultCount = 0;\n for (const msg of messages) {\n if (Array.isArray(msg.content)) {\n for (const block of msg.content as Block[]) {\n if (block.type === \"tool_result\") toolResultCount++;\n }\n }\n }\n\n if (toolResultCount <= keepRecent) return messages;\n\n const trimCount = toolResultCount - keepRecent;\n let trimmed = 0;\n\n return messages.map((msg) => {\n if (!Array.isArray(msg.content)) return msg;\n const content = (msg.content as Block[]).map((block) => {\n if (block.type === \"tool_result\" && trimmed < trimCount) {\n trimmed++;\n if (typeof block.content === \"string\") {\n return { ...block, content: \"[trimmed]\" };\n } else if (Array.isArray(block.content)) {\n return { ...block, content: [{ type: \"text\", text: \"[trimmed]\" }] };\n }\n }\n return block;\n });\n return { ...msg, content } as T;\n });\n}\n\n// ============================================================================\n// PROVIDER COMPACTION CLIENT\n// ============================================================================\n\nconst COMPACTION_TIMEOUT_MS = 30_000;\n\n/**\n * Request conversation compaction from the server (Haiku summarization).\n * Used by non-Anthropic providers (OpenAI, Gemini) that lack native compaction.\n * Returns summary string or null on failure (caller keeps unsummarized history).\n */\nexport async function requestProviderCompaction(opts: {\n proxyUrl: string;\n token: string;\n messages: object[];\n systemPrompt: string;\n}): Promise<string | null> {\n const { proxyUrl, token, messages, systemPrompt } = opts;\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), COMPACTION_TIMEOUT_MS);\n\n try {\n const response = await fetch(proxyUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n mode: \"compact\",\n messages,\n system_prompt: systemPrompt,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as {\n success: boolean;\n compaction_content?: string;\n error?: string;\n };\n\n return data.success && data.compaction_content ? data.compaction_content : null;\n } finally {\n clearTimeout(timeout);\n }\n } catch {\n return null; // Graceful failure — caller keeps unsummarized history\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "whale-code",
3
- "version": "6.5.11",
3
+ "version": "6.6.0",
4
4
  "description": "whale code — local-first AI agent CLI for inventory, orders, and analytics powered by MCP",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -23,42 +23,44 @@
23
23
  "postinstall": "chmod +x node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper 2>/dev/null || true"
24
24
  },
25
25
  "dependencies": {
26
+ "@alcalzone/ansi-tokenize": "^0.2.4",
26
27
  "@anthropic-ai/sdk": "^0.74.0",
27
28
  "@aws-sdk/client-bedrock-runtime": "^3.1000.0",
28
29
  "@google/genai": "^1.41.0",
29
30
  "@modelcontextprotocol/sdk": "^1.25.3",
31
+ "@napi-rs/canvas": "^0.1.97",
30
32
  "@react-pdf/renderer": "^4.3.2",
31
33
  "@supabase/supabase-js": "2.95.3",
32
- "bonjour-service": "^1.3.0",
33
- "chalk": "^5.6.2",
34
- "diff": "^8.0.3",
35
- "@alcalzone/ansi-tokenize": "^0.2.4",
36
34
  "ansi-escapes": "^7.3.0",
37
35
  "auto-bind": "^5.0.1",
36
+ "bonjour-service": "^1.3.0",
37
+ "chalk": "^5.6.2",
38
38
  "cli-boxes": "^3.0.0",
39
39
  "cli-cursor": "^4.0.0",
40
40
  "cli-truncate": "^5.1.1",
41
41
  "code-excerpt": "^4.0.0",
42
+ "diff": "^8.0.3",
42
43
  "es-toolkit": "^1.39.10",
43
44
  "indent-string": "^5.0.0",
44
45
  "ink": "file:./vendor/ink",
45
- "is-in-ci": "^2.0.0",
46
- "patch-console": "^2.0.0",
47
- "react-devtools-core": "^6.1.1",
48
- "react-reconciler": "^0.33.0",
49
46
  "ink-select-input": "^6.2.0",
50
47
  "ink-text-input": "^6.0.0",
48
+ "is-in-ci": "^2.0.0",
51
49
  "marked": "^15.0.12",
52
50
  "marked-terminal": "^7.3.0",
53
51
  "node-pty": "^1.1.0",
54
52
  "openai": "^6.22.0",
53
+ "patch-console": "^2.0.0",
55
54
  "pdf-parse": "^1.1.1",
55
+ "pdfjs-dist": "^5.5.207",
56
56
  "pg": "^8.18.0",
57
57
  "pino": "^10.3.1",
58
58
  "playwright-core": "^1.58.2",
59
59
  "qrcode": "^1.5.4",
60
60
  "react": "^19.2.4",
61
+ "react-devtools-core": "^6.1.1",
61
62
  "react-pdf-html": "^2.1.5",
63
+ "react-reconciler": "^0.33.0",
62
64
  "scheduler": "^0.27.0",
63
65
  "shiki": "^4.0.0",
64
66
  "signal-exit": "^3.0.7",
@@ -66,8 +68,8 @@
66
68
  "stack-utils": "^2.0.6",
67
69
  "terminal-size": "^4.0.1",
68
70
  "widest-line": "^6.0.0",
69
- "yoga-layout": "~3.2.1",
70
71
  "ws": "^8.19.0",
72
+ "yoga-layout": "~3.2.1",
71
73
  "zod": "^4.3.6",
72
74
  "zustand": "^5.0.11"
73
75
  },
@@ -25,13 +25,18 @@ const noop = () => { };
25
25
  /**
26
26
  * Count the visual (wrapped) lines an output string occupies at a given terminal width.
27
27
  * Accounts for ANSI escape codes via string-width and long-line wrapping.
28
+ * Ignores trailing empty line from trailing '\n' (matches log-update's visibleLineCount).
28
29
  */
29
30
  function countVisualLines(output, termWidth) {
30
31
  if (!output) return 0;
31
32
  const lines = output.split('\n');
33
+ // A trailing '\n' produces an empty final element that doesn't occupy
34
+ // a visual row on screen — the cursor just moves to the next line.
35
+ // Exclude it so cursorUp() doesn't overshoot into static content.
36
+ const count = output.endsWith('\n') ? lines.length - 1 : lines.length;
32
37
  let total = 0;
33
- for (const line of lines) {
34
- const w = stringWidth(line);
38
+ for (let i = 0; i < count; i++) {
39
+ const w = stringWidth(lines[i]);
35
40
  total += w === 0 ? 1 : Math.ceil(w / termWidth);
36
41
  }
37
42
  return total;
@@ -124,6 +129,7 @@ export default class Ink {
124
129
  unsubscribeResize;
125
130
  throttledOnRender;
126
131
  hasPendingThrottledRender = false;
132
+ lastWasFullscreen = false;
127
133
  kittyProtocolEnabled = false;
128
134
  cancelKittyDetection;
129
135
  constructor(options) {
@@ -219,39 +225,31 @@ export default class Ink {
219
225
  return size?.columns ?? 80;
220
226
  };
221
227
  resized = () => {
222
- const currentWidth = this.getTerminalWidth();
223
- // Re-layout at new width
224
228
  this.calculateLayout();
225
229
  const { output, outputHeight, staticOutput } = render(this.rootNode, this.isScreenReaderEnabled);
226
230
  const hasStaticOutput = staticOutput && staticOutput !== '\n';
227
231
  if (hasStaticOutput) {
228
232
  this.fullStaticOutput += staticOutput;
229
233
  }
230
- // Terminal reflow during resize makes line-count-based erasure unreliable.
231
- // Erase generously: use the full visible terminal height as upper bound.
232
- // This clears any ghost lines from reflow without touching scrollback.
233
234
  const rows = this.options.stdout.rows || 24;
234
- const safeErase = Math.max(rows, this.lastOutputHeight + 2);
235
235
  const isFullscreen = this.options.stdout.isTTY && outputHeight >= rows;
236
236
  const outputToRender = isFullscreen ? output : output + '\n';
237
+ // After resize, terminal reflow makes cursor position and line counts
238
+ // unpredictable. The only reliable approach: clear everything and
239
+ // rewrite from scratch. fullStaticOutput contains the entire
240
+ // conversation history, so the user sees zero content loss.
237
241
  const sync = shouldSynchronize(this.options.stdout);
238
242
  if (sync) this.options.stdout.write(bsu);
239
- // Clear via log-update first to reset its tracking, then erase any
240
- // remaining ghost lines that log-update didn't know about.
241
- this.log.clear();
242
243
  this.options.stdout.write(
243
- ansiEscapes.eraseLines(safeErase) +
244
- (hasStaticOutput ? staticOutput : '') +
244
+ ansiEscapes.clearTerminal +
245
+ this.fullStaticOutput +
245
246
  outputToRender
246
247
  );
247
248
  if (sync) this.options.stdout.write(esu);
248
249
  this.lastOutput = output;
249
250
  this.lastOutputToRender = outputToRender;
250
251
  this.lastOutputHeight = outputHeight;
251
- // Sync log-update with visual line count so subsequent renders erase correctly
252
- const newVisualLines = countVisualLines(outputToRender, currentWidth);
253
- this.log.sync(outputToRender, newVisualLines);
254
- this.lastTerminalWidth = currentWidth;
252
+ this.log.sync(outputToRender);
255
253
  };
256
254
  resolveExitPromise = () => { };
257
255
  rejectExitPromise = () => { };
@@ -359,21 +357,67 @@ export default class Ink {
359
357
  // Only apply when writing to a real TTY — piped output always gets trailing newlines.
360
358
  const isFullscreen = this.options.stdout.isTTY && outputHeight >= this.options.stdout.rows;
361
359
  const outputToRender = isFullscreen ? output : output + '\n';
362
- if (this.lastOutputHeight >= this.options.stdout.rows) {
360
+ // ── Fullscreen handling ──
361
+ // When the live area fills/exceeds the terminal, log-update's cursor
362
+ // math breaks (can't reach scrolled-off lines). Two modes:
363
+ //
364
+ // Sustained fullscreen: move cursor to home and overwrite the screen
365
+ // in place with the live area. No clearTerminal (causes flash), no
366
+ // eraseLines (destroys visible static content). Static content that
367
+ // was pushed to scrollback by the transition frame stays untouched.
368
+ // \x1b[J erases any leftover lines if the output shrinks.
369
+ //
370
+ // Transition OUT: clearTerminal + fullStaticOutput to restore the
371
+ // conversation onto the visible screen.
372
+ if (isFullscreen) {
373
+ if (output === this.lastOutput && !hasStaticOutput) {
374
+ this.lastWasFullscreen = true;
375
+ return;
376
+ }
363
377
  const sync = shouldSynchronize(this.options.stdout);
364
- if (sync) {
365
- this.options.stdout.write(bsu);
378
+ if (sync) this.options.stdout.write(bsu);
379
+ if (!this.lastWasFullscreen) {
380
+ // Entering fullscreen: full rewrite to push static to scrollback
381
+ this.options.stdout.write(
382
+ ansiEscapes.clearTerminal +
383
+ this.fullStaticOutput +
384
+ outputToRender
385
+ );
386
+ } else {
387
+ // Sustained: cursor home, overwrite live area, erase remainder
388
+ this.options.stdout.write(
389
+ '\x1b[H' +
390
+ (hasStaticOutput ? staticOutput : '') +
391
+ outputToRender +
392
+ '\x1b[J'
393
+ );
366
394
  }
367
- this.options.stdout.write(ansiEscapes.clearTerminal + this.fullStaticOutput + output);
368
395
  this.lastOutput = output;
369
396
  this.lastOutputToRender = outputToRender;
370
397
  this.lastOutputHeight = outputHeight;
398
+ this.lastWasFullscreen = true;
371
399
  this.log.sync(outputToRender);
372
- if (sync) {
373
- this.options.stdout.write(esu);
374
- }
400
+ if (sync) this.options.stdout.write(esu);
401
+ return;
402
+ }
403
+ if (this.lastWasFullscreen) {
404
+ // Exiting fullscreen: restore static content to visible screen
405
+ this.lastWasFullscreen = false;
406
+ const sync = shouldSynchronize(this.options.stdout);
407
+ if (sync) this.options.stdout.write(bsu);
408
+ this.options.stdout.write(
409
+ ansiEscapes.clearTerminal +
410
+ this.fullStaticOutput +
411
+ outputToRender
412
+ );
413
+ this.lastOutput = output;
414
+ this.lastOutputToRender = outputToRender;
415
+ this.lastOutputHeight = outputHeight;
416
+ this.log.sync(outputToRender);
417
+ if (sync) this.options.stdout.write(esu);
375
418
  return;
376
419
  }
420
+ // ── Normal (non-fullscreen) rendering ──
377
421
  // To ensure static output is cleanly rendered before main output, clear main output first
378
422
  if (hasStaticOutput) {
379
423
  const sync = shouldSynchronize(this.options.stdout);
@@ -0,0 +1,152 @@
1
+ # `react-devtools-core`
2
+
3
+ This package provides low-level APIs to support renderers like [React Native](https://github.com/facebook/react-native). If you're looking for the standalone React DevTools UI, **we suggest using [`react-devtools`](https://github.com/facebook/react/tree/main/packages/react-devtools) instead of using this package directly**.
4
+
5
+ This package provides two entrypoints: labeled "backend" and "standalone" (frontend). Both APIs are described below.
6
+
7
+ # Backend API
8
+
9
+ Backend APIs are embedded in _development_ builds of renderers like [React Native](https://github.com/facebook/react-native) in order to connect to the React DevTools UI.
10
+
11
+ ### Example
12
+
13
+ If you are building a non-browser-based React renderer, you can use the backend API like so:
14
+
15
+ ```js
16
+ if (process.env.NODE_ENV !== 'production') {
17
+ const { initialize, connectToDevTools } = require("react-devtools-core");
18
+
19
+ initialize(settings);
20
+ // Must be called before packages like react or react-native are imported
21
+ connectToDevTools({...config});
22
+ }
23
+ ```
24
+
25
+ > **NOTE** that this API (`connectToDevTools`) must be (1) run in the same context as React and (2) must be called before React packages are imported (e.g. `react`, `react-dom`, `react-native`).
26
+
27
+ ### `initialize` arguments
28
+ | Argument | Description |
29
+ |------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
30
+ | `settings` | Optional. If not specified, or received as null, then default settings are used. Can be plain object or a Promise that resolves with the [plain settings object](#Settings). If Promise rejects, the console will not be patched and some console features from React DevTools will not work. |
31
+
32
+ #### `Settings`
33
+ | Spec | Default value |
34
+ |--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
35
+ | <pre>{<br> appendComponentStack: boolean,<br> breakOnConsoleErrors: boolean,<br> showInlineWarningsAndErrors: boolean,<br> hideConsoleLogsInStrictMode: boolean<br>}</pre> | <pre>{<br> appendComponentStack: true,<br> breakOnConsoleErrors: false,<br> showInlineWarningsAndErrors: true,<br> hideConsoleLogsInStrictMode: false<br>}</pre> |
36
+
37
+ ### `connectToDevTools` options
38
+ | Prop | Default | Description |
39
+ |------------------------|---------------|---------------------------------------------------------------------------------------------------------------------------|
40
+ | `host` | `"localhost"` | Socket connection to frontend should use this host. |
41
+ | `isAppActive` | | (Optional) function that returns true/false, telling DevTools when it's ready to connect to React. |
42
+ | `port` | `8097` | Socket connection to frontend should use this port. |
43
+ | `resolveRNStyle` | | (Optional) function that accepts a key (number) and returns a style (object); used by React Native. |
44
+ | `retryConnectionDelay` | `200` | Delay (ms) to wait between retrying a failed Websocket connection |
45
+ | `useHttps` | `false` | Socket connection to frontend should use secure protocol (wss). |
46
+ | `websocket` | | Custom `WebSocket` connection to frontend; overrides `host` and `port` settings. |
47
+ | `onSettingsUpdated` | | A callback that will be called when the user updates the settings in the UI. You can use it for persisting user settings. | |
48
+
49
+
50
+ ### `connectWithCustomMessagingProtocol` options
51
+ | Prop | Description |
52
+ |---------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|
53
+ | `onSubscribe` | Function, which receives listener (function, with a single argument) as an argument. Called when backend subscribes to messages from the other end (frontend). |
54
+ | `onUnsubscribe` | Function, which receives listener (function) as an argument. Called when backend unsubscribes to messages from the other end (frontend). |
55
+ | `onMessage` | Function, which receives 2 arguments: event (string) and payload (any). Called when backend emits a message, which should be sent to the frontend. |
56
+ | `onSettingsUpdated` | A callback that will be called when the user updates the settings in the UI. You can use it for persisting user settings. |
57
+
58
+ Unlike `connectToDevTools`, `connectWithCustomMessagingProtocol` returns a callback, which can be used for unsubscribing the backend from the global DevTools hook.
59
+
60
+ # Frontend API
61
+
62
+ Frontend APIs can be used to render the DevTools UI into a DOM node. One example of this is [`react-devtools`](https://github.com/facebook/react/tree/main/packages/react-devtools) which wraps DevTools in an Electron app.
63
+
64
+ ### Example
65
+ ```js
66
+ import DevtoolsUI from "react-devtools-core/standalone";
67
+
68
+ // See the full list of API methods in documentation below.
69
+ const { setContentDOMNode, startServer } = DevtoolsUI;
70
+
71
+ // Render DevTools UI into a DOM element.
72
+ setContentDOMNode(document.getElementById("container"));
73
+
74
+ // Start socket server used to communicate between backend and frontend.
75
+ startServer(
76
+ // Port defaults to 8097
77
+ 1234,
78
+
79
+ // Host defaults to "localhost"
80
+ "example.devserver.com",
81
+
82
+ // Optional config for secure socket (WSS).
83
+ {
84
+ key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
85
+ cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
86
+ }
87
+ );
88
+ ```
89
+
90
+ ### Exported methods
91
+ The `default` export is an object defining the methods described below.
92
+
93
+ These methods support chaining for convenience. For example:
94
+ ```js
95
+ const DevtoolsUI = require("react-devtools-core/standalone");
96
+ DevtoolsUI.setContentDOMNode(element).startServer();
97
+ ```
98
+
99
+ #### `connectToSocket(socket: WebSocket)`
100
+ > This is an advanced config function that is typically not used.
101
+
102
+ Custom `WebSocket` connection to use for communication between DevTools frontend and backend. Calling this method automatically initializes the DevTools UI (similar to calling `startServer()`).
103
+
104
+ #### `openProfiler()`
105
+ Automatically select the "Profiler" tab in the DevTools UI.
106
+
107
+ #### `setContentDOMNode(element: HTMLElement)`
108
+ Set the DOM element DevTools UI should be rendered into on initialization.
109
+
110
+ #### `setDisconnectedCallback(callback: Function)`
111
+ _Optional_ callback to be notified when DevTools `WebSocket` closes (or errors).
112
+
113
+ #### `setProjectRoots(roots: Array<string>)`
114
+ _Optional_ set of root directories for source files. These roots can be used to open an inspected component's source code using an IDE.
115
+
116
+ #### `setStatusListener(callback: Function)`
117
+ _Optional_ callback to be notified of socket server events (e.g. initialized, errored, connected).
118
+
119
+ This callback receives two parameters:
120
+ ```js
121
+ function onStatus(
122
+ message: string,
123
+ status: 'server-connected' | 'devtools-connected' | 'error'
124
+ ): void {
125
+ // ...
126
+ }
127
+ ```
128
+
129
+ #### `startServer(port?: number, host?: string, httpsOptions?: Object, loggerOptions?: Object)`
130
+ Start a socket server (used to communicate between backend and frontend) and renders the DevTools UI.
131
+
132
+ This method accepts the following parameters:
133
+ | Name | Default | Description |
134
+ |---|---|---|
135
+ | `port` | `8097` | Socket connection to backend should use this port. |
136
+ | `host` | `"localhost"` | Socket connection to backend should use this host. |
137
+ | `httpsOptions` | | _Optional_ object defining `key` and `cert` strings. |
138
+ | `loggerOptions` | | _Optional_ object defining a `surface` string (to be included with DevTools logging events). |
139
+
140
+ # Development
141
+
142
+ Watch for changes made to the backend entry point and rebuild:
143
+ ```sh
144
+ yarn start:backend
145
+ ```
146
+
147
+ Watch for changes made to the standalone UI entry point and rebuild:
148
+ ```sh
149
+ yarn start:standalone
150
+ ```
151
+
152
+ Run the standalone UI using `yarn start` in the [`react-devtools`](https://github.com/facebook/react/tree/main/packages/react-devtools).
@@ -0,0 +1 @@
1
+ module.exports = require('./dist/backend');