@alumbwe/anvil 1.0.0 → 1.0.1

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 (529) hide show
  1. package/bin/anvil +1 -1
  2. package/dist/bundled.js +79559 -0
  3. package/dist/bundled.js.map +581 -0
  4. package/package.json +5 -2
  5. package/src/__tests__/README.md +0 -256
  6. package/src/__tests__/bash-mode.test.ts +0 -442
  7. package/src/__tests__/cli-args.test.ts +0 -181
  8. package/src/__tests__/cli-harness.test.ts +0 -52
  9. package/src/__tests__/e2e/first-time-login.test.ts +0 -173
  10. package/src/__tests__/e2e/logout-relogin-flow.test.ts +0 -110
  11. package/src/__tests__/e2e/returning-user-auth.test.ts +0 -113
  12. package/src/__tests__/e2e-cli.test.ts +0 -183
  13. package/src/__tests__/helpers/launcher-disconnect-fixture.cjs +0 -176
  14. package/src/__tests__/helpers/mock-api-client.ts +0 -64
  15. package/src/__tests__/helpers/renderer-cleanup-fixture.tsx +0 -89
  16. package/src/__tests__/helpers/terminal-watchdog-fixture.ts +0 -75
  17. package/src/__tests__/home-directory-detection.test.ts +0 -213
  18. package/src/__tests__/integration/api-integration.test.ts +0 -288
  19. package/src/__tests__/integration/credentials-storage.test.ts +0 -486
  20. package/src/__tests__/integration/local-agents.test.ts +0 -1187
  21. package/src/__tests__/integration/login-flow-instrumentation.test.ts +0 -134
  22. package/src/__tests__/integration/login-polling-working.test.ts +0 -285
  23. package/src/__tests__/integration/queue-editing.test.tsx +0 -261
  24. package/src/__tests__/integration/usage-refresh-on-completion.test.ts +0 -168
  25. package/src/__tests__/integration-tmux.test.ts +0 -188
  26. package/src/__tests__/launcher-avx2-fallback.test.ts +0 -630
  27. package/src/__tests__/launcher-disconnect.test.ts +0 -104
  28. package/src/__tests__/mocks/hover-toggle-controller.ts +0 -71
  29. package/src/__tests__/open-tui-native-bundle.test.ts +0 -378
  30. package/src/__tests__/path-completion.test.ts +0 -243
  31. package/src/__tests__/project-files-chat-id.test.ts +0 -34
  32. package/src/__tests__/release/proxy-http-get.test.ts +0 -667
  33. package/src/__tests__/release/wrapper-safety.test.ts +0 -412
  34. package/src/__tests__/renderer-cleanup.test.ts +0 -174
  35. package/src/__tests__/rerender-perf.integration.test.ts +0 -283
  36. package/src/__tests__/terminal-reset-sequences.test.ts +0 -36
  37. package/src/__tests__/terminal-watchdog.test.ts +0 -388
  38. package/src/__tests__/test-utils.ts +0 -271
  39. package/src/__tests__/tmux-poc.ts +0 -150
  40. package/src/__tests__/unit/agent-mode-toggle.test.ts +0 -137
  41. package/src/__tests__/unit/copy-button.test.ts +0 -157
  42. package/src/__tests__/unit/create-run-config.test.ts +0 -66
  43. package/src/__tests__/unit/publish-confirmation.test.ts +0 -70
  44. package/src/__tests__/unit/segmented-control.test.ts +0 -152
  45. package/src/__tests__/utils/env.test.ts +0 -169
  46. package/src/__tests__/utils/project-picker.test.ts +0 -39
  47. package/src/agents/bundled-agents.generated.d.ts +0 -14
  48. package/src/agents/bundled-agents.generated.ts +0 -3692
  49. package/src/app.tsx +0 -399
  50. package/src/chat.tsx +0 -1698
  51. package/src/cli-args.ts +0 -134
  52. package/src/commands/__tests__/bash-command.test.ts +0 -445
  53. package/src/commands/__tests__/command-args.test.ts +0 -349
  54. package/src/commands/__tests__/copy-conversation-clipboard.test.ts +0 -108
  55. package/src/commands/__tests__/copy-conversation.test.ts +0 -226
  56. package/src/commands/__tests__/diagnostics-command.test.ts +0 -35
  57. package/src/commands/__tests__/freebuff-command-aliases.test.ts +0 -56
  58. package/src/commands/__tests__/image.test.ts +0 -99
  59. package/src/commands/__tests__/init.test.ts +0 -456
  60. package/src/commands/__tests__/new-command-rotates-chat.test.ts +0 -91
  61. package/src/commands/__tests__/process-diagnostics.test.ts +0 -54
  62. package/src/commands/__tests__/prompt-builders.test.ts +0 -28
  63. package/src/commands/__tests__/router-input.test.ts +0 -298
  64. package/src/commands/ads.ts +0 -44
  65. package/src/commands/command-registry.ts +0 -726
  66. package/src/commands/copy-conversation.ts +0 -392
  67. package/src/commands/help.ts +0 -13
  68. package/src/commands/image.ts +0 -20
  69. package/src/commands/init.ts +0 -121
  70. package/src/commands/process-diagnostics.ts +0 -120
  71. package/src/commands/prompt-builders.ts +0 -100
  72. package/src/commands/publish.ts +0 -203
  73. package/src/commands/router-utils.ts +0 -80
  74. package/src/commands/router.ts +0 -487
  75. package/src/commands/usage.ts +0 -26
  76. package/src/components/__tests__/ad-banner.test.tsx +0 -83
  77. package/src/components/__tests__/chat-input-bar.test.tsx +0 -130
  78. package/src/components/__tests__/freebuff-landing-heading-row.test.tsx +0 -91
  79. package/src/components/__tests__/freebuff-model-selector.test.tsx +0 -519
  80. package/src/components/__tests__/freebuff-offer-invariants.test.ts +0 -54
  81. package/src/components/__tests__/freebuff-takeover-prompt.test.tsx +0 -212
  82. package/src/components/__tests__/grid-layout.integration.test.tsx +0 -304
  83. package/src/components/__tests__/grid-layout.test.tsx +0 -1051
  84. package/src/components/__tests__/message-block.completion.test.tsx +0 -104
  85. package/src/components/__tests__/message-block.streaming.test.tsx +0 -78
  86. package/src/components/__tests__/message-with-agents.test.tsx +0 -579
  87. package/src/components/__tests__/multiline-input.test.tsx +0 -1132
  88. package/src/components/__tests__/queue-panel.test.tsx +0 -398
  89. package/src/components/__tests__/selectable-list.test.ts +0 -232
  90. package/src/components/__tests__/status-bar.test.tsx +0 -44
  91. package/src/components/__tests__/status-indicator.test.tsx +0 -204
  92. package/src/components/__tests__/terminal-thinking-orb.test.tsx +0 -111
  93. package/src/components/__tests__/user-error-banner.test.tsx +0 -102
  94. package/src/components/ad-banner.tsx +0 -323
  95. package/src/components/agent-checklist.tsx +0 -350
  96. package/src/components/agent-mode-toggle.tsx +0 -241
  97. package/src/components/anvil-mark.tsx +0 -52
  98. package/src/components/ask-user/__tests__/multiple-choice-form.test.ts +0 -432
  99. package/src/components/ask-user/__tests__/validation.test.ts +0 -213
  100. package/src/components/ask-user/components/accordion-question.tsx +0 -153
  101. package/src/components/ask-user/components/custom-answer-input.tsx +0 -66
  102. package/src/components/ask-user/components/options-list.tsx +0 -133
  103. package/src/components/ask-user/components/question-header.tsx +0 -80
  104. package/src/components/ask-user/components/question-option.tsx +0 -89
  105. package/src/components/ask-user/constants.ts +0 -38
  106. package/src/components/ask-user/index.tsx +0 -631
  107. package/src/components/ask-user/utils/validation.ts +0 -85
  108. package/src/components/attachment-card.tsx +0 -65
  109. package/src/components/blocks/agent-block-grid.tsx +0 -58
  110. package/src/components/blocks/agent-branch-item.tsx +0 -311
  111. package/src/components/blocks/agent-branch-wrapper.tsx +0 -493
  112. package/src/components/blocks/agent-list-branch.tsx +0 -77
  113. package/src/components/blocks/ask-user-branch.tsx +0 -81
  114. package/src/components/blocks/block-helpers.ts +0 -11
  115. package/src/components/blocks/blocks-renderer.tsx +0 -289
  116. package/src/components/blocks/content-with-markdown.tsx +0 -33
  117. package/src/components/blocks/image-block.tsx +0 -128
  118. package/src/components/blocks/implementor-row.tsx +0 -429
  119. package/src/components/blocks/single-block.tsx +0 -201
  120. package/src/components/blocks/thinking-block.tsx +0 -67
  121. package/src/components/blocks/tool-block-group.tsx +0 -57
  122. package/src/components/blocks/tool-branch.tsx +0 -206
  123. package/src/components/blocks/user-content-copy.tsx +0 -157
  124. package/src/components/bottom-banner.tsx +0 -136
  125. package/src/components/build-mode-buttons.tsx +0 -110
  126. package/src/components/button.tsx +0 -66
  127. package/src/components/chat-header.tsx +0 -77
  128. package/src/components/chat-history-screen.tsx +0 -413
  129. package/src/components/chat-input-bar.tsx +0 -523
  130. package/src/components/clickable-title-box.tsx +0 -66
  131. package/src/components/clickable.tsx +0 -119
  132. package/src/components/collapse-button.tsx +0 -34
  133. package/src/components/copy-button.tsx +0 -203
  134. package/src/components/elapsed-timer.tsx +0 -55
  135. package/src/components/error-boundary.tsx +0 -55
  136. package/src/components/feedback-container.tsx +0 -181
  137. package/src/components/feedback-icon-button.tsx +0 -89
  138. package/src/components/feedback-input-mode.tsx +0 -344
  139. package/src/components/file-attachment-card.tsx +0 -98
  140. package/src/components/freebuff-active-session-summary.tsx +0 -63
  141. package/src/components/freebuff-landing-screen.tsx +0 -865
  142. package/src/components/freebuff-model-selector.tsx +0 -1087
  143. package/src/components/freebuff-referral-banner.tsx +0 -604
  144. package/src/components/freebuff-superseded-screen.tsx +0 -62
  145. package/src/components/grid-layout.tsx +0 -80
  146. package/src/components/help-banner.tsx +0 -127
  147. package/src/components/highlighted-text.tsx +0 -52
  148. package/src/components/image-card.tsx +0 -167
  149. package/src/components/image-thumbnail.tsx +0 -114
  150. package/src/components/input-cursor.tsx +0 -77
  151. package/src/components/input-mode-banner.tsx +0 -57
  152. package/src/components/load-previous-button.tsx +0 -48
  153. package/src/components/login-modal.tsx +0 -475
  154. package/src/components/message-block.tsx +0 -346
  155. package/src/components/message-footer.tsx +0 -258
  156. package/src/components/message-with-agents.tsx +0 -506
  157. package/src/components/mode-divider.tsx +0 -43
  158. package/src/components/multiline-input.tsx +0 -1241
  159. package/src/components/out-of-credits-banner.tsx +0 -160
  160. package/src/components/pending-attachments-banner.tsx +0 -116
  161. package/src/components/pending-bash-message.tsx +0 -59
  162. package/src/components/progress-bar.tsx +0 -81
  163. package/src/components/project-picker-screen.tsx +0 -485
  164. package/src/components/publish-confirmation.tsx +0 -493
  165. package/src/components/publish-container.tsx +0 -687
  166. package/src/components/queue-panel.tsx +0 -310
  167. package/src/components/raised-pill.tsx +0 -95
  168. package/src/components/renderers/plan-box.tsx +0 -59
  169. package/src/components/review-screen.tsx +0 -112
  170. package/src/components/scroll-to-bottom-button.tsx +0 -34
  171. package/src/components/segmented-control.tsx +0 -187
  172. package/src/components/selectable-list.tsx +0 -248
  173. package/src/components/selected-chips.tsx +0 -80
  174. package/src/components/separator.tsx +0 -40
  175. package/src/components/session-ended-banner.tsx +0 -226
  176. package/src/components/shimmer-text.tsx +0 -248
  177. package/src/components/status-bar.tsx +0 -313
  178. package/src/components/subscription-limit-banner.tsx +0 -206
  179. package/src/components/suggested-prompts.tsx +0 -184
  180. package/src/components/suggestion-menu.tsx +0 -215
  181. package/src/components/terminal-command-display.tsx +0 -151
  182. package/src/components/terminal-link.tsx +0 -97
  183. package/src/components/terminal-thinking-orb.tsx +0 -95
  184. package/src/components/text-attachment-card.tsx +0 -77
  185. package/src/components/thinking.tsx +0 -109
  186. package/src/components/tools/__tests__/apply-patch.test.tsx +0 -84
  187. package/src/components/tools/__tests__/code-search.test.tsx +0 -45
  188. package/src/components/tools/__tests__/gravity-index.test.ts +0 -76
  189. package/src/components/tools/__tests__/render-ui.test.tsx +0 -92
  190. package/src/components/tools/__tests__/run-terminal-command.test.ts +0 -233
  191. package/src/components/tools/apply-patch.tsx +0 -95
  192. package/src/components/tools/code-search.tsx +0 -45
  193. package/src/components/tools/composio.tsx +0 -152
  194. package/src/components/tools/diff-viewer.tsx +0 -76
  195. package/src/components/tools/glob.tsx +0 -61
  196. package/src/components/tools/gravity-index.tsx +0 -77
  197. package/src/components/tools/list-directory.tsx +0 -61
  198. package/src/components/tools/read-docs.tsx +0 -37
  199. package/src/components/tools/read-files.tsx +0 -91
  200. package/src/components/tools/read-subtree.tsx +0 -44
  201. package/src/components/tools/read-url.tsx +0 -33
  202. package/src/components/tools/registry.ts +0 -126
  203. package/src/components/tools/render-ui.tsx +0 -122
  204. package/src/components/tools/run-terminal-command.tsx +0 -79
  205. package/src/components/tools/skill.tsx +0 -29
  206. package/src/components/tools/str-replace.tsx +0 -77
  207. package/src/components/tools/suggest-followups.tsx +0 -369
  208. package/src/components/tools/task-completed.tsx +0 -16
  209. package/src/components/tools/tool-call-item.tsx +0 -273
  210. package/src/components/tools/types.ts +0 -55
  211. package/src/components/tools/web-search.tsx +0 -33
  212. package/src/components/tools/write-file.tsx +0 -16
  213. package/src/components/tools/write-todos.tsx +0 -95
  214. package/src/components/top-banner.tsx +0 -178
  215. package/src/components/usage-banner.tsx +0 -244
  216. package/src/components/user-error-banner.tsx +0 -56
  217. package/src/components/validation-error-popover.tsx +0 -192
  218. package/src/contexts/__tests__/chat-runtime-context.test.tsx +0 -149
  219. package/src/contexts/chat-runtime-context.tsx +0 -240
  220. package/src/data/slash-commands.test.ts +0 -24
  221. package/src/data/slash-commands.ts +0 -249
  222. package/src/entry.ts +0 -12
  223. package/src/hooks/__tests__/holds-live-freebuff-slot.test.ts +0 -49
  224. package/src/hooks/__tests__/session-fetch-signal.test.ts +0 -63
  225. package/src/hooks/__tests__/use-activity-query.test.ts +0 -1000
  226. package/src/hooks/__tests__/use-ask-user-bridge.test.ts +0 -176
  227. package/src/hooks/__tests__/use-auth-query.test.ts +0 -21
  228. package/src/hooks/__tests__/use-chat-input-remount.test.tsx +0 -66
  229. package/src/hooks/__tests__/use-clipboard.test.tsx +0 -73
  230. package/src/hooks/__tests__/use-connection-status.test.ts +0 -112
  231. package/src/hooks/__tests__/use-directory-browser.test.ts +0 -203
  232. package/src/hooks/__tests__/use-gravity-ad.test.ts +0 -73
  233. package/src/hooks/__tests__/use-grid-layout.test.ts +0 -349
  234. package/src/hooks/__tests__/use-input-history.test.ts +0 -699
  235. package/src/hooks/__tests__/use-message-queue-editing.test.tsx +0 -209
  236. package/src/hooks/__tests__/use-message-queue.test.tsx +0 -71
  237. package/src/hooks/__tests__/use-path-tab-completion.test.ts +0 -315
  238. package/src/hooks/__tests__/use-queue-controls.test.ts +0 -68
  239. package/src/hooks/__tests__/use-queue-ui.test.tsx +0 -83
  240. package/src/hooks/__tests__/use-searchable-list.test.ts +0 -359
  241. package/src/hooks/__tests__/use-send-message-timer.test.ts +0 -146
  242. package/src/hooks/__tests__/use-suggestion-engine-mention.test.ts +0 -361
  243. package/src/hooks/__tests__/use-suggestion-engine.test.ts +0 -485
  244. package/src/hooks/__tests__/use-terminal-focus.test.ts +0 -66
  245. package/src/hooks/__tests__/use-terminal-layout.test.ts +0 -675
  246. package/src/hooks/__tests__/use-timeout.test.ts +0 -330
  247. package/src/hooks/__tests__/use-usage-query.test.ts +0 -502
  248. package/src/hooks/__tests__/use-user-details-query.test.ts +0 -195
  249. package/src/hooks/helpers/__tests__/send-message.test.ts +0 -1918
  250. package/src/hooks/helpers/send-message.ts +0 -654
  251. package/src/hooks/stream-state.ts +0 -83
  252. package/src/hooks/use-activity-query.ts +0 -668
  253. package/src/hooks/use-agent-validation.ts +0 -74
  254. package/src/hooks/use-ask-user-bridge.ts +0 -92
  255. package/src/hooks/use-auth-query.ts +0 -253
  256. package/src/hooks/use-auth-state.ts +0 -152
  257. package/src/hooks/use-chat-input.ts +0 -105
  258. package/src/hooks/use-chat-keyboard.ts +0 -321
  259. package/src/hooks/use-chat-messages.ts +0 -254
  260. package/src/hooks/use-chat-state.ts +0 -165
  261. package/src/hooks/use-chat-streaming.ts +0 -180
  262. package/src/hooks/use-chat-ui.ts +0 -131
  263. package/src/hooks/use-clipboard.ts +0 -151
  264. package/src/hooks/use-connection-status.ts +0 -142
  265. package/src/hooks/use-directory-browser.ts +0 -88
  266. package/src/hooks/use-elapsed-time.ts +0 -116
  267. package/src/hooks/use-event.ts +0 -34
  268. package/src/hooks/use-exit-handler.ts +0 -66
  269. package/src/hooks/use-fetch-login-url.ts +0 -65
  270. package/src/hooks/use-fingerprint.ts +0 -61
  271. package/src/hooks/use-freebuff-ctrl-c-exit.ts +0 -23
  272. package/src/hooks/use-freebuff-session-progress.ts +0 -34
  273. package/src/hooks/use-freebuff-session.ts +0 -806
  274. package/src/hooks/use-freebuff-streak-query.ts +0 -61
  275. package/src/hooks/use-gravity-ad.ts +0 -656
  276. package/src/hooks/use-grid-layout.ts +0 -73
  277. package/src/hooks/use-input-history.ts +0 -173
  278. package/src/hooks/use-login-keyboard-handlers.ts +0 -75
  279. package/src/hooks/use-login-polling.ts +0 -114
  280. package/src/hooks/use-logo.tsx +0 -161
  281. package/src/hooks/use-message-queue.ts +0 -387
  282. package/src/hooks/use-now.ts +0 -20
  283. package/src/hooks/use-path-tab-completion.ts +0 -88
  284. package/src/hooks/use-publish-mutation.ts +0 -60
  285. package/src/hooks/use-queue-controls.ts +0 -68
  286. package/src/hooks/use-queue-ui.ts +0 -74
  287. package/src/hooks/use-scroll-management.ts +0 -184
  288. package/src/hooks/use-searchable-list.ts +0 -98
  289. package/src/hooks/use-send-message.ts +0 -773
  290. package/src/hooks/use-sheen-animation.tsx +0 -88
  291. package/src/hooks/use-subscription-query.ts +0 -71
  292. package/src/hooks/use-suggestion-engine.ts +0 -783
  293. package/src/hooks/use-terminal-breakpoints.ts +0 -77
  294. package/src/hooks/use-terminal-dimensions.ts +0 -46
  295. package/src/hooks/use-terminal-focus.ts +0 -29
  296. package/src/hooks/use-terminal-layout.ts +0 -189
  297. package/src/hooks/use-theme.tsx +0 -140
  298. package/src/hooks/use-timeout.ts +0 -85
  299. package/src/hooks/use-update-preference.ts +0 -66
  300. package/src/hooks/use-usage-monitor.ts +0 -55
  301. package/src/hooks/use-usage-query.ts +0 -124
  302. package/src/hooks/use-user-details-query.ts +0 -93
  303. package/src/hooks/use-why-did-you-update.ts +0 -177
  304. package/src/index.tsx +0 -441
  305. package/src/init/__tests__/init-direnv.test.ts +0 -526
  306. package/src/init/init-app.ts +0 -34
  307. package/src/init/init-direnv.ts +0 -133
  308. package/src/login/constants.ts +0 -60
  309. package/src/login/login-flow.ts +0 -204
  310. package/src/login/plain-login.ts +0 -108
  311. package/src/login/utils.ts +0 -183
  312. package/src/native/ripgrep.ts +0 -80
  313. package/src/polyfills/bun-strip-ansi.ts +0 -12
  314. package/src/pre-init/tree-sitter-wasm.ts +0 -96
  315. package/src/project-files.ts +0 -102
  316. package/src/smoke/terminal-command-broker.ts +0 -439
  317. package/src/state/__tests__/chat-store-focus.test.ts +0 -22
  318. package/src/state/__tests__/feedback-store.test.ts +0 -257
  319. package/src/state/chat-history-store.ts +0 -30
  320. package/src/state/chat-store.ts +0 -544
  321. package/src/state/feedback-store.ts +0 -160
  322. package/src/state/freebuff-model-store.ts +0 -42
  323. package/src/state/freebuff-session-store.ts +0 -53
  324. package/src/state/login-store.ts +0 -150
  325. package/src/state/message-block-store.ts +0 -149
  326. package/src/state/publish-store.ts +0 -146
  327. package/src/state/queue-panel-store.ts +0 -26
  328. package/src/state/review-store.ts +0 -24
  329. package/src/testing/env.ts +0 -46
  330. package/src/types/chat-state.ts +0 -15
  331. package/src/types/chat.ts +0 -241
  332. package/src/types/contracts/send-message.ts +0 -12
  333. package/src/types/env.ts +0 -98
  334. package/src/types/freebuff-session.ts +0 -17
  335. package/src/types/function-params.ts +0 -28
  336. package/src/types/react19-compat.d.ts +0 -19
  337. package/src/types/store.ts +0 -111
  338. package/src/types/theme-system.ts +0 -144
  339. package/src/types/utils.ts +0 -3
  340. package/src/utils/__tests__/active-run.test.ts +0 -140
  341. package/src/utils/__tests__/activity-tracker.test.ts +0 -440
  342. package/src/utils/__tests__/agent-display.test.ts +0 -139
  343. package/src/utils/__tests__/analytics-client.test.ts +0 -262
  344. package/src/utils/__tests__/anonymous-id.test.ts +0 -74
  345. package/src/utils/__tests__/anvil-api.test.ts +0 -578
  346. package/src/utils/__tests__/arrays.test.ts +0 -264
  347. package/src/utils/__tests__/bash-context-processor.test.ts +0 -38
  348. package/src/utils/__tests__/block-processor.test.ts +0 -810
  349. package/src/utils/__tests__/chat-history.test.ts +0 -203
  350. package/src/utils/__tests__/chat-input-key-intercept.test.ts +0 -40
  351. package/src/utils/__tests__/chat-meta.test.ts +0 -130
  352. package/src/utils/__tests__/clipboard-linux.test.ts +0 -359
  353. package/src/utils/__tests__/clipboard.test.ts +0 -910
  354. package/src/utils/__tests__/code-search-summary.test.ts +0 -84
  355. package/src/utils/__tests__/collapse-helpers.test.ts +0 -1109
  356. package/src/utils/__tests__/error-handling.test.ts +0 -658
  357. package/src/utils/__tests__/exit-cleanly.test.ts +0 -110
  358. package/src/utils/__tests__/feedback-helpers.test.ts +0 -444
  359. package/src/utils/__tests__/feedback-submission.test.ts +0 -26
  360. package/src/utils/__tests__/fetch-usage.test.ts +0 -355
  361. package/src/utils/__tests__/fingerprint.test.ts +0 -144
  362. package/src/utils/__tests__/fixtures/terminal-command-broker-child.ts +0 -7
  363. package/src/utils/__tests__/fixtures/terminal-command-broker-entry.ts +0 -3
  364. package/src/utils/__tests__/fixtures/terminal-command-broker-owner.ts +0 -33
  365. package/src/utils/__tests__/format-elapsed-time.test.ts +0 -103
  366. package/src/utils/__tests__/format-timeout.test.ts +0 -87
  367. package/src/utils/__tests__/freebuff-instance-owner.test.ts +0 -69
  368. package/src/utils/__tests__/freebuff-model-navigation.test.ts +0 -102
  369. package/src/utils/__tests__/freebuff-premium-reset.test.ts +0 -79
  370. package/src/utils/__tests__/freebuff-referral-cache.test.ts +0 -116
  371. package/src/utils/__tests__/freebuff-session-api.test.ts +0 -215
  372. package/src/utils/__tests__/freebuff-session-display.test.ts +0 -23
  373. package/src/utils/__tests__/freebuff-streak-line.test.ts +0 -217
  374. package/src/utils/__tests__/image-dimensions.test.ts +0 -249
  375. package/src/utils/__tests__/image-processor.test.ts +0 -209
  376. package/src/utils/__tests__/implementor-helpers.test.ts +0 -1458
  377. package/src/utils/__tests__/keyboard-actions.test.ts +0 -660
  378. package/src/utils/__tests__/layout-helpers.test.ts +0 -36
  379. package/src/utils/__tests__/lazy-response-ads.test.ts +0 -167
  380. package/src/utils/__tests__/log-shipper.test.ts +0 -53
  381. package/src/utils/__tests__/markdown-renderer.test.tsx +0 -421
  382. package/src/utils/__tests__/message-block-helpers.test.ts +0 -1263
  383. package/src/utils/__tests__/message-updater.test.ts +0 -645
  384. package/src/utils/__tests__/osc-timeout-scenarios.test.ts +0 -172
  385. package/src/utils/__tests__/pending-attachments.test.ts +0 -277
  386. package/src/utils/__tests__/polling-backoff.test.ts +0 -51
  387. package/src/utils/__tests__/queue-panel-actions.test.ts +0 -148
  388. package/src/utils/__tests__/run-state-storage.test.ts +0 -919
  389. package/src/utils/__tests__/safe-json.test.ts +0 -77
  390. package/src/utils/__tests__/sdk-event-handlers.test.ts +0 -685
  391. package/src/utils/__tests__/send-message-helpers.test.ts +0 -1898
  392. package/src/utils/__tests__/send-message-timer.test.ts +0 -64
  393. package/src/utils/__tests__/settings.test.ts +0 -99
  394. package/src/utils/__tests__/strings.test.ts +0 -192
  395. package/src/utils/__tests__/terminal-color-detection.test.ts +0 -425
  396. package/src/utils/__tests__/terminal-command-broker.test.ts +0 -528
  397. package/src/utils/__tests__/terminal-enter-detection.test.ts +0 -77
  398. package/src/utils/__tests__/terminal-io.test.ts +0 -137
  399. package/src/utils/__tests__/terminal-protocol-controller.test.ts +0 -119
  400. package/src/utils/__tests__/text-layout.test.ts +0 -82
  401. package/src/utils/__tests__/theme-platform-detection.test.ts +0 -125
  402. package/src/utils/__tests__/think-tag-parser.test.ts +0 -159
  403. package/src/utils/__tests__/trace-writer.test.ts +0 -223
  404. package/src/utils/__tests__/trim-chat-logs.test.ts +0 -78
  405. package/src/utils/__tests__/usage-banner-state.test.ts +0 -298
  406. package/src/utils/__tests__/validation-error-formatting.test.ts +0 -126
  407. package/src/utils/__tests__/windows-terminal-health.test.ts +0 -101
  408. package/src/utils/__tests__/write-file-atomic.test.ts +0 -127
  409. package/src/utils/active-run.ts +0 -131
  410. package/src/utils/activity-tracker.ts +0 -66
  411. package/src/utils/agent-display.ts +0 -87
  412. package/src/utils/agent-helpers.ts +0 -27
  413. package/src/utils/agent-id-utils.ts +0 -14
  414. package/src/utils/ai-message-id.ts +0 -12
  415. package/src/utils/analytics.ts +0 -361
  416. package/src/utils/anonymous-id.ts +0 -87
  417. package/src/utils/anvil-api.ts +0 -612
  418. package/src/utils/anvil-client.ts +0 -217
  419. package/src/utils/arrays.ts +0 -117
  420. package/src/utils/auth.ts +0 -258
  421. package/src/utils/bash-context-processor.ts +0 -47
  422. package/src/utils/bash-messages.ts +0 -108
  423. package/src/utils/block-margins.ts +0 -35
  424. package/src/utils/block-operations.ts +0 -523
  425. package/src/utils/block-processor.ts +0 -213
  426. package/src/utils/chat-history.ts +0 -253
  427. package/src/utils/chat-input-key-intercept.ts +0 -52
  428. package/src/utils/chat-meta.ts +0 -90
  429. package/src/utils/chat-scroll-accel.ts +0 -151
  430. package/src/utils/clipboard-image.ts +0 -588
  431. package/src/utils/clipboard.ts +0 -397
  432. package/src/utils/code-search-summary.ts +0 -70
  433. package/src/utils/collapse-helpers.ts +0 -256
  434. package/src/utils/config-dir.ts +0 -24
  435. package/src/utils/constants.ts +0 -190
  436. package/src/utils/create-event-handler-state.ts +0 -73
  437. package/src/utils/create-run-config.ts +0 -121
  438. package/src/utils/detect-shell.ts +0 -116
  439. package/src/utils/directory-browser.ts +0 -72
  440. package/src/utils/engagement.ts +0 -55
  441. package/src/utils/env.ts +0 -92
  442. package/src/utils/error-handling.ts +0 -255
  443. package/src/utils/error-messages.ts +0 -62
  444. package/src/utils/exit-cleanly.ts +0 -86
  445. package/src/utils/feedback-helpers.ts +0 -103
  446. package/src/utils/feedback-submission.ts +0 -22
  447. package/src/utils/fetch-usage.ts +0 -76
  448. package/src/utils/fingerprint.ts +0 -245
  449. package/src/utils/format-elapsed-time.ts +0 -33
  450. package/src/utils/format-session-units.ts +0 -6
  451. package/src/utils/format-timeout.ts +0 -28
  452. package/src/utils/format-validation-errors-for-message.ts +0 -84
  453. package/src/utils/freebuff-agent-selection.ts +0 -33
  454. package/src/utils/freebuff-instance-owner.ts +0 -66
  455. package/src/utils/freebuff-model-navigation.ts +0 -50
  456. package/src/utils/freebuff-premium-reset.ts +0 -55
  457. package/src/utils/freebuff-referral-cache.ts +0 -51
  458. package/src/utils/freebuff-session-api.ts +0 -243
  459. package/src/utils/freebuff-session-display.ts +0 -21
  460. package/src/utils/freebuff-streak-line.ts +0 -93
  461. package/src/utils/git.ts +0 -17
  462. package/src/utils/helpers.ts +0 -47
  463. package/src/utils/image-display.ts +0 -67
  464. package/src/utils/image-handler.ts +0 -325
  465. package/src/utils/image-processor.ts +0 -133
  466. package/src/utils/image-thumbnail.ts +0 -78
  467. package/src/utils/implementor-helpers.ts +0 -787
  468. package/src/utils/input-modes.ts +0 -174
  469. package/src/utils/keyboard-actions.ts +0 -392
  470. package/src/utils/keypad-keys.ts +0 -47
  471. package/src/utils/layout-helpers.ts +0 -33
  472. package/src/utils/lazy-response-ads.ts +0 -1
  473. package/src/utils/local-agent-registry.ts +0 -474
  474. package/src/utils/log-shipper.ts +0 -126
  475. package/src/utils/logger.ts +0 -327
  476. package/src/utils/markdown-renderer.tsx +0 -1090
  477. package/src/utils/math.ts +0 -3
  478. package/src/utils/message-block-helpers.ts +0 -684
  479. package/src/utils/message-history.ts +0 -143
  480. package/src/utils/message-tree-utils.ts +0 -67
  481. package/src/utils/message-updater.ts +0 -279
  482. package/src/utils/open-file.ts +0 -146
  483. package/src/utils/open-url.ts +0 -63
  484. package/src/utils/path-completion.ts +0 -111
  485. package/src/utils/path-helpers.ts +0 -38
  486. package/src/utils/pending-attachments.ts +0 -360
  487. package/src/utils/polling-backoff.ts +0 -59
  488. package/src/utils/project-picker.ts +0 -12
  489. package/src/utils/queue-panel-actions.ts +0 -70
  490. package/src/utils/recent-projects.ts +0 -156
  491. package/src/utils/renderer-cleanup.ts +0 -233
  492. package/src/utils/response-ad-positions.ts +0 -1
  493. package/src/utils/run-state-storage.ts +0 -603
  494. package/src/utils/safe-json.ts +0 -153
  495. package/src/utils/sdk-event-handlers.ts +0 -571
  496. package/src/utils/send-message-helpers.ts +0 -210
  497. package/src/utils/send-message-timer.ts +0 -110
  498. package/src/utils/settings.ts +0 -226
  499. package/src/utils/skill-registry.ts +0 -94
  500. package/src/utils/spawn-agent-matcher.ts +0 -55
  501. package/src/utils/status-indicator-state.ts +0 -107
  502. package/src/utils/stream-chunk-processor.ts +0 -57
  503. package/src/utils/strings.ts +0 -271
  504. package/src/utils/subscription.ts +0 -31
  505. package/src/utils/syntax-highlighter.tsx +0 -19
  506. package/src/utils/terminal-color-detection.ts +0 -474
  507. package/src/utils/terminal-command-broker.ts +0 -467
  508. package/src/utils/terminal-enter-detection.ts +0 -63
  509. package/src/utils/terminal-images.ts +0 -229
  510. package/src/utils/terminal-io.ts +0 -85
  511. package/src/utils/terminal-protocol-controller.ts +0 -173
  512. package/src/utils/terminal-reset-sequences.ts +0 -33
  513. package/src/utils/terminal-title.ts +0 -84
  514. package/src/utils/terminal-watchdog.ts +0 -366
  515. package/src/utils/text-layout.ts +0 -149
  516. package/src/utils/theme-config.ts +0 -141
  517. package/src/utils/theme-system.ts +0 -1206
  518. package/src/utils/think-tag-parser.ts +0 -95
  519. package/src/utils/time-format.ts +0 -21
  520. package/src/utils/trace-writer.ts +0 -162
  521. package/src/utils/ui-constants.ts +0 -69
  522. package/src/utils/update-checker.ts +0 -110
  523. package/src/utils/usage-banner-state.ts +0 -146
  524. package/src/utils/validation-error-formatting.ts +0 -86
  525. package/src/utils/validation-error-helpers.ts +0 -19
  526. package/src/utils/windows-terminal-health.ts +0 -124
  527. package/src/utils/word-wrap-utils.ts +0 -53
  528. package/src/utils/write-file-atomic.ts +0 -54
  529. package/src/utils/yield-to-event-loop.ts +0 -9
@@ -1,654 +0,0 @@
1
- import { FREEBUFF_PROVIDER_USAGE_MESSAGE } from '@anvil/common/constants/freebuff-errors'
2
- import { isDirectDeepSeekMode } from '@anvil/common/constants/deepseek-direct'
3
- import { getErrorObject } from '@anvil/common/util/error'
4
-
5
- import {
6
- markFreebuffSessionCountryBlocked,
7
- markFreebuffSessionEnded,
8
- markFreebuffSessionSuperseded,
9
- refreshFreebuffSession,
10
- } from '../use-freebuff-session'
11
- import { getProjectRoot } from '../../project-files'
12
- import { useChatStore } from '../../state/chat-store'
13
- import { IS_FREEBUFF } from '../../utils/constants'
14
- import { processBashContext } from '../../utils/bash-context-processor'
15
- import { markRunningAgentsAsCancelled } from '../../utils/block-operations'
16
- import {
17
- getCountryBlockFromFreeModeError,
18
- getFreeModeUnavailableErrorMessage,
19
- getFreebuffGateErrorKind,
20
- getFreebuffRateLimitErrorMessage,
21
- isOutOfCreditsError,
22
- isFreebuffProviderUsageError,
23
- isFreeModeUnavailableError,
24
- OUT_OF_CREDITS_MESSAGE,
25
- } from '../../utils/error-handling'
26
- import { formatElapsedTime } from '../../utils/format-elapsed-time'
27
- import { processImagesForMessage } from '../../utils/image-processor'
28
- import { logger } from '../../utils/logger'
29
- import { appendInterruptionNotice } from '../../utils/message-block-helpers'
30
- import { getUserMessage } from '../../utils/message-history'
31
- import {
32
- createBatchedMessageUpdater,
33
- type BatchedMessageUpdater,
34
- } from '../../utils/message-updater'
35
- import { createModeDividerMessage } from '../../utils/send-message-helpers'
36
- import { yieldToEventLoop } from '../../utils/yield-to-event-loop'
37
- import { invalidateActivityQuery } from '../use-activity-query'
38
- import { usageQueryKeys } from '../use-usage-query'
39
-
40
- import type {
41
- PendingAttachment,
42
- PendingFileAttachment,
43
- PendingImageAttachment,
44
- PendingTextAttachment,
45
- } from '../../types/store'
46
- import type { ChatMessage } from '../../types/chat'
47
- import type { AgentMode } from '../../utils/constants'
48
- import type { SendMessageTimerController } from '../../utils/send-message-timer'
49
- import type { StreamController } from '../stream-state'
50
- import type { StreamStatus } from '../use-message-queue'
51
- import type { MessageContent, RunState } from '@anvil/sdk'
52
- import type { MutableRefObject, SetStateAction } from 'react'
53
-
54
- /** Resets queue state on early return (before streaming starts). */
55
- export type ResetEarlyReturnStateParams = {
56
- setCanProcessQueue: (can: boolean) => void
57
- updateChainInProgress: (value: boolean) => void
58
- isProcessingQueueRef?: MutableRefObject<boolean>
59
- isQueuePausedRef?: MutableRefObject<boolean>
60
- }
61
-
62
- export const resetEarlyReturnState = (
63
- params: ResetEarlyReturnStateParams,
64
- ): void => {
65
- const {
66
- setCanProcessQueue,
67
- updateChainInProgress,
68
- isProcessingQueueRef,
69
- isQueuePausedRef,
70
- } = params
71
-
72
- updateChainInProgress(false)
73
- setCanProcessQueue(!isQueuePausedRef?.current)
74
- if (isProcessingQueueRef) {
75
- isProcessingQueueRef.current = false
76
- }
77
- }
78
-
79
- /** Resets queue state after streaming completes, aborts, or errors. */
80
- export type FinalizeQueueStateParams = {
81
- setStreamStatus: (status: StreamStatus) => void
82
- setCanProcessQueue: (can: boolean) => void
83
- updateChainInProgress: (value: boolean) => void
84
- isProcessingQueueRef?: MutableRefObject<boolean>
85
- isQueuePausedRef?: MutableRefObject<boolean>
86
- resumeQueue?: () => void
87
- }
88
-
89
- export const finalizeQueueState = (params: FinalizeQueueStateParams): void => {
90
- const {
91
- setStreamStatus,
92
- setCanProcessQueue,
93
- updateChainInProgress,
94
- isProcessingQueueRef,
95
- isQueuePausedRef,
96
- resumeQueue,
97
- } = params
98
-
99
- setStreamStatus('idle')
100
- // Release lock here as part of normal completion flow.
101
- // Also released in finally block and .catch() as safety nets (idempotent).
102
- if (isProcessingQueueRef) {
103
- isProcessingQueueRef.current = false
104
- }
105
- if (resumeQueue) {
106
- resumeQueue()
107
- } else {
108
- setCanProcessQueue(!isQueuePausedRef?.current)
109
- }
110
- updateChainInProgress(false)
111
- }
112
-
113
- const DEFAULT_RUN_OUTPUT_ERROR_MESSAGE = 'No output from agent run'
114
-
115
- export type PrepareUserMessageDeps = {
116
- setMessages: (update: SetStateAction<ChatMessage[]>) => void
117
- lastMessageMode: AgentMode | null
118
- setLastMessageMode: (mode: AgentMode | null) => void
119
- scrollToLatest: () => void
120
- setHasReceivedPlanResponse: (value: boolean) => void
121
- }
122
-
123
- export const prepareUserMessage = async (params: {
124
- content: string
125
- agentMode: AgentMode
126
- postUserMessage?: (prev: ChatMessage[]) => ChatMessage[]
127
- attachments?: PendingAttachment[]
128
- signal?: AbortSignal
129
- deps: PrepareUserMessageDeps
130
- }): Promise<{
131
- userMessageId: string
132
- messageContent: MessageContent[] | undefined
133
- bashContextForPrompt: string
134
- finalContent: string
135
- }> => {
136
- const { content, agentMode, postUserMessage, attachments, signal, deps } =
137
- params
138
- const { setMessages, lastMessageMode, setLastMessageMode, scrollToLatest } =
139
- deps
140
-
141
- const { pendingBashMessages, clearPendingBashMessages } =
142
- useChatStore.getState()
143
- const { bashMessages, bashContextForPrompt } =
144
- processBashContext(pendingBashMessages)
145
-
146
- if (bashMessages.length > 0) {
147
- setMessages((prev) => [...prev, ...bashMessages])
148
- }
149
- clearPendingBashMessages()
150
-
151
- // Split attachments by kind
152
- const allAttachments =
153
- attachments ?? useChatStore.getState().pendingAttachments
154
- if (!attachments && allAttachments.length > 0) {
155
- useChatStore.getState().clearPendingAttachments()
156
- }
157
-
158
- const pendingImages = allAttachments.filter(
159
- (a): a is PendingImageAttachment => a.kind === 'image',
160
- )
161
- const pendingTextAttachments = allAttachments.filter(
162
- (a): a is PendingTextAttachment => a.kind === 'text',
163
- )
164
-
165
- const pendingFileAttachments = allAttachments.filter(
166
- (a): a is PendingFileAttachment => a.kind === 'file',
167
- )
168
-
169
- // Append text attachments to the content
170
- let finalContent = content
171
- if (pendingTextAttachments.length > 0) {
172
- const textAttachmentContent = pendingTextAttachments
173
- .map((att) => `[Pasted Text]\n${att.content}`)
174
- .join('\n\n')
175
- finalContent = content
176
- ? `${content}\n\n${textAttachmentContent}`
177
- : textAttachmentContent
178
- }
179
-
180
- // Append file/folder attachments to the content
181
- if (pendingFileAttachments.length > 0) {
182
- const fileAttachmentContent = pendingFileAttachments
183
- .filter((att) => att.status === 'ready')
184
- .map((att) =>
185
- att.isDirectory
186
- ? `[Directory: ${att.path}]\n${att.content}`
187
- : `[File: ${att.path}]\n${att.content}`,
188
- )
189
- .join('\n\n')
190
- if (fileAttachmentContent) {
191
- finalContent = finalContent
192
- ? `${finalContent}\n\n${fileAttachmentContent}`
193
- : fileAttachmentContent
194
- }
195
- }
196
-
197
- const { attachments: imageAttachments, messageContent } =
198
- await processImagesForMessage({
199
- content: finalContent,
200
- pendingImages,
201
- projectRoot: getProjectRoot(),
202
- })
203
-
204
- // A chat switch can happen while image processing is awaiting filesystem
205
- // work. Do not append the old prompt after the destination chat has reset.
206
- if (signal?.aborted) {
207
- throw new Error('Message preparation aborted')
208
- }
209
-
210
- const shouldInsertDivider =
211
- lastMessageMode === null || lastMessageMode !== agentMode
212
-
213
- // Convert pending text attachments to stored text attachments for display
214
- const textAttachmentsForMessage = pendingTextAttachments.map((att) => ({
215
- id: att.id,
216
- content: att.content,
217
- preview: att.preview,
218
- charCount: att.charCount,
219
- }))
220
-
221
- // Convert pending file attachments to stored file attachments for display
222
- const fileAttachmentsForMessage = pendingFileAttachments
223
- .filter((att) => att.status === 'ready')
224
- .map((att) => ({
225
- path: att.path,
226
- filename: att.filename,
227
- isDirectory: att.isDirectory,
228
- note: att.note,
229
- }))
230
-
231
- // Pass original content (not finalContent) for display, but finalContent goes to agent
232
- const userMessage = getUserMessage(
233
- content,
234
- imageAttachments,
235
- textAttachmentsForMessage,
236
- fileAttachmentsForMessage,
237
- )
238
- const userMessageId = userMessage.id
239
- if (imageAttachments.length > 0) {
240
- userMessage.attachments = imageAttachments
241
- }
242
-
243
- setMessages((prev) => {
244
- let next = [...prev]
245
- if (shouldInsertDivider) {
246
- next.push(createModeDividerMessage(agentMode))
247
- }
248
- next.push(userMessage)
249
- if (postUserMessage) {
250
- next = postUserMessage(next)
251
- }
252
- // Keep the full transcript: this array is what saveChatState persists to
253
- // chat-messages.json, so trimming here would permanently lose history.
254
- // Rendering stays cheap because useChatMessages paginates what's shown.
255
- return next
256
- })
257
-
258
- setLastMessageMode(agentMode)
259
- await yieldToEventLoop()
260
- setTimeout(() => scrollToLatest(), 0)
261
-
262
- return {
263
- userMessageId,
264
- messageContent,
265
- bashContextForPrompt,
266
- finalContent,
267
- }
268
- }
269
-
270
- export const setupStreamingContext = (params: {
271
- aiMessageId: string
272
- timerController: SendMessageTimerController
273
- setMessages: (updater: (messages: ChatMessage[]) => ChatMessage[]) => void
274
- streamRefs: StreamController
275
- abortController?: AbortController
276
- setStreamStatus: (status: StreamStatus) => void
277
- setCanProcessQueue: (can: boolean) => void
278
- isQueuePausedRef?: MutableRefObject<boolean>
279
- isProcessingQueueRef?: MutableRefObject<boolean>
280
- updateChainInProgress: (value: boolean) => void
281
- setIsRetrying: (value: boolean) => void
282
- setStreamingAgents: (updater: (prev: Set<string>) => Set<string>) => void
283
- }) => {
284
- const {
285
- timerController,
286
- setMessages,
287
- streamRefs,
288
- setStreamStatus,
289
- setCanProcessQueue,
290
- isQueuePausedRef,
291
- isProcessingQueueRef,
292
- updateChainInProgress,
293
- setIsRetrying,
294
- setStreamingAgents,
295
- } = params
296
- const { aiMessageId } = params
297
-
298
- streamRefs.reset()
299
- timerController.start(aiMessageId)
300
- const updater = createBatchedMessageUpdater(aiMessageId, setMessages)
301
- // Clear any previous UI-only error on this message when starting a new run
302
- updater.clearUserError()
303
- const hasReceivedContentRef = { current: false }
304
- const abortController = params.abortController ?? new AbortController()
305
-
306
- abortController.signal.addEventListener('abort', () => {
307
- // Abort means the user stopped streaming; update UI with an interruption notice.
308
- // Release the chain lock immediately so new messages can be sent directly instead
309
- // of being queued. The minor trade-off is that if the user sends a new message
310
- // before client.run() resolves, it may use stale previousRunStateRef. This is
311
- // acceptable because: (1) the user explicitly cancelled, and (2) client.run()
312
- // will update previousRunStateRef when it eventually resolves, so subsequent
313
- // runs will have the full state.
314
- streamRefs.setters.setWasAbortedByUser(true)
315
- setIsRetrying(false)
316
- timerController.stop('aborted')
317
-
318
- // Update stream status so the UI reflects cancellation visually
319
- setStreamStatus('idle')
320
-
321
- // Clear streaming agents so cancelled status displays correctly in UI
322
- setStreamingAgents(() => new Set())
323
-
324
- // Release chain lock and queue state so new messages are sent directly
325
- updateChainInProgress(false)
326
- setCanProcessQueue(!isQueuePausedRef?.current)
327
- if (isProcessingQueueRef) {
328
- isProcessingQueueRef.current = false
329
- }
330
-
331
- updater.updateAiMessageBlocks((blocks) => {
332
- const cancelledBlocks = markRunningAgentsAsCancelled(blocks)
333
- return appendInterruptionNotice(cancelledBlocks)
334
- })
335
- updater.markComplete()
336
- })
337
-
338
- return { updater, hasReceivedContentRef, abortController }
339
- }
340
-
341
- export const handleRunCompletion = (params: {
342
- runState: RunState
343
- actualCredits: number | undefined
344
- agentMode: AgentMode
345
- timerController: SendMessageTimerController
346
- updater: BatchedMessageUpdater
347
- aiMessageId: string
348
- wasAbortedByUser: boolean
349
- /** Whether the run streamed any content before finishing. A freebuff gate
350
- * rejection with no content means the prompt was consumed unprocessed —
351
- * surfaced as an inline error instead of silently looking sent. */
352
- hasReceivedContent?: boolean
353
- setStreamStatus: (status: StreamStatus) => void
354
- setCanProcessQueue: (can: boolean) => void
355
- updateChainInProgress: (value: boolean) => void
356
- setHasReceivedPlanResponse: (value: boolean) => void
357
- resumeQueue?: () => void
358
- isProcessingQueueRef?: MutableRefObject<boolean>
359
- isQueuePausedRef?: MutableRefObject<boolean>
360
- }) => {
361
- const {
362
- runState,
363
- actualCredits,
364
- agentMode,
365
- timerController,
366
- updater,
367
- wasAbortedByUser,
368
- setStreamStatus,
369
- setCanProcessQueue,
370
- updateChainInProgress,
371
- setHasReceivedPlanResponse,
372
- resumeQueue,
373
- isProcessingQueueRef,
374
- isQueuePausedRef,
375
- } = params
376
-
377
- // If user aborted, the abort handler already handled UI updates and released the
378
- // chain lock. Don't finalize queue state again to avoid interfering with any new
379
- // run that may have started after the abort. Uses per-run abort signal (not shared
380
- // streamRefs) so a newer run's reset() can't clear this flag.
381
- if (wasAbortedByUser) {
382
- return
383
- }
384
-
385
- const output = runState.output
386
- const finalizeAfterError = () => {
387
- finalizeQueueState({
388
- setStreamStatus,
389
- setCanProcessQueue,
390
- updateChainInProgress,
391
- isProcessingQueueRef,
392
- isQueuePausedRef,
393
- })
394
- timerController.stop('error')
395
- }
396
-
397
- if (!output) {
398
- if (!wasAbortedByUser) {
399
- updater.setError(DEFAULT_RUN_OUTPUT_ERROR_MESSAGE)
400
- finalizeAfterError()
401
- }
402
- return
403
- }
404
-
405
- if (output.type === 'error') {
406
- if (IS_FREEBUFF && isFreebuffProviderUsageError(output)) {
407
- updater.setError(FREEBUFF_PROVIDER_USAGE_MESSAGE)
408
- finalizeAfterError()
409
- return
410
- }
411
-
412
- // Direct-to-DeepSeek mode has no Anvil credits system: a 402 from the
413
- // provider means the user's own DeepSeek account is out of balance, not
414
- // that Anvil credits need topping up. Surface the provider's message and
415
- // keep the input usable instead of entering the Anvil out-of-credits
416
- // flow (which links to the Anvil billing page and polls the Anvil usage
417
- // endpoint).
418
- if (isOutOfCreditsError(output)) {
419
- if (isDirectDeepSeekMode()) {
420
- updater.setError(
421
- output.message ??
422
- 'Your DeepSeek account is out of balance. Add funds at https://platform.deepseek.com/top_up and try again.',
423
- )
424
- finalizeAfterError()
425
- return
426
- }
427
- updater.setError(OUT_OF_CREDITS_MESSAGE)
428
- useChatStore.getState().setInputMode('outOfCredits')
429
- invalidateActivityQuery(usageQueryKeys.current())
430
- finalizeAfterError()
431
- return
432
- }
433
-
434
- if (isFreeModeUnavailableError(output)) {
435
- updater.setError(getFreeModeUnavailableErrorMessage(output))
436
- if (IS_FREEBUFF) {
437
- markFreebuffSessionCountryBlocked(
438
- getCountryBlockFromFreeModeError(output) ?? {
439
- countryCode: 'UNKNOWN',
440
- },
441
- )
442
- }
443
- finalizeAfterError()
444
- return
445
- }
446
-
447
- const gateKind = getFreebuffGateErrorKind(output)
448
- if (gateKind) {
449
- handleFreebuffGateError(gateKind, updater, {
450
- messageWasDropped: params.hasReceivedContent === false,
451
- })
452
- finalizeAfterError()
453
- return
454
- }
455
-
456
- const freebuffRateLimitMessage = IS_FREEBUFF
457
- ? getFreebuffRateLimitErrorMessage(output)
458
- : null
459
- if (freebuffRateLimitMessage) {
460
- updater.setError(freebuffRateLimitMessage)
461
- finalizeAfterError()
462
- return
463
- }
464
-
465
- // Pass the raw error message to setError (displayed in UserErrorBanner without additional wrapper formatting)
466
- updater.setError(output.message ?? DEFAULT_RUN_OUTPUT_ERROR_MESSAGE)
467
-
468
- finalizeAfterError()
469
- return
470
- }
471
-
472
- invalidateActivityQuery(usageQueryKeys.current())
473
-
474
- finalizeQueueState({
475
- setStreamStatus,
476
- setCanProcessQueue,
477
- updateChainInProgress,
478
- isProcessingQueueRef,
479
- isQueuePausedRef,
480
- resumeQueue,
481
- })
482
- const timerResult = timerController.stop('success')
483
-
484
- if (agentMode === 'PLAN') {
485
- setHasReceivedPlanResponse(true)
486
- }
487
-
488
- const elapsedMs = timerResult?.elapsedMs ?? 0
489
- const elapsedSeconds = Math.floor(elapsedMs / 1000)
490
- let completionTime: string | undefined
491
- if (elapsedSeconds > 0) {
492
- completionTime = formatElapsedTime(elapsedSeconds)
493
- }
494
-
495
- updater.markComplete({
496
- ...(completionTime && { completionTime }),
497
- ...(actualCredits !== undefined && { credits: actualCredits }),
498
- metadata: {
499
- runState,
500
- },
501
- })
502
- }
503
-
504
- export const handleRunError = (params: {
505
- error: unknown
506
- timerController: SendMessageTimerController
507
- updater: BatchedMessageUpdater
508
- setIsRetrying: (value: boolean) => void
509
- setStreamStatus: (status: StreamStatus) => void
510
- setCanProcessQueue: (can: boolean) => void
511
- updateChainInProgress: (value: boolean) => void
512
- isProcessingQueueRef?: MutableRefObject<boolean>
513
- isQueuePausedRef?: MutableRefObject<boolean>
514
- /** See handleRunCompletion — flags an unprocessed prompt on gate errors. */
515
- hasReceivedContent?: boolean
516
- }) => {
517
- const {
518
- error,
519
- timerController,
520
- updater,
521
- setIsRetrying,
522
- setStreamStatus,
523
- setCanProcessQueue,
524
- updateChainInProgress,
525
- isProcessingQueueRef,
526
- isQueuePausedRef,
527
- hasReceivedContent,
528
- } = params
529
-
530
- const errorInfo = getErrorObject(error, { includeRawError: true })
531
-
532
- logger.error({ error: errorInfo }, 'SDK client.run() failed')
533
- setIsRetrying(false)
534
- finalizeQueueState({
535
- setStreamStatus,
536
- setCanProcessQueue,
537
- updateChainInProgress,
538
- isProcessingQueueRef,
539
- isQueuePausedRef,
540
- })
541
- timerController.stop('error')
542
-
543
- if (IS_FREEBUFF && isFreebuffProviderUsageError(error)) {
544
- updater.setError(FREEBUFF_PROVIDER_USAGE_MESSAGE)
545
- return
546
- }
547
-
548
- if (isOutOfCreditsError(error)) {
549
- // Direct-to-DeepSeek mode: the 402 is the provider's own insufficient-
550
- // balance rejection, not an Anvil credits problem — show the provider's
551
- // message and stay in the normal input flow.
552
- if (isDirectDeepSeekMode()) {
553
- updater.setError(
554
- errorInfo.message ||
555
- 'Your DeepSeek account is out of balance. Add funds at https://platform.deepseek.com/top_up and try again.',
556
- )
557
- return
558
- }
559
- updater.setError(OUT_OF_CREDITS_MESSAGE)
560
- useChatStore.getState().setInputMode('outOfCredits')
561
- invalidateActivityQuery(usageQueryKeys.current())
562
- return
563
- }
564
-
565
- if (isFreeModeUnavailableError(error)) {
566
- updater.setError(getFreeModeUnavailableErrorMessage(error))
567
- if (IS_FREEBUFF) {
568
- markFreebuffSessionCountryBlocked(
569
- getCountryBlockFromFreeModeError(error) ?? {
570
- countryCode: 'UNKNOWN',
571
- },
572
- )
573
- }
574
- return
575
- }
576
-
577
- const gateKind = getFreebuffGateErrorKind(error)
578
- if (gateKind) {
579
- handleFreebuffGateError(gateKind, updater, {
580
- messageWasDropped: hasReceivedContent === false,
581
- })
582
- return
583
- }
584
-
585
- const freebuffRateLimitMessage = IS_FREEBUFF
586
- ? getFreebuffRateLimitErrorMessage(error)
587
- : null
588
- if (freebuffRateLimitMessage) {
589
- updater.setError(freebuffRateLimitMessage)
590
- return
591
- }
592
-
593
- // Use setError for all errors so they display in UserErrorBanner consistently
594
- const errorMessage = errorInfo.message || 'An unexpected error occurred'
595
- updater.setError(errorMessage)
596
- }
597
-
598
- /**
599
- * Surface + recover from a session gate rejection. The server rejected
600
- * the request because our session is no longer valid; update local state so
601
- * the UI reflects reality and we stop sending requests until we re-admit.
602
- */
603
- function handleFreebuffGateError(
604
- kind: ReturnType<typeof getFreebuffGateErrorKind>,
605
- updater: BatchedMessageUpdater,
606
- opts: { messageWasDropped?: boolean } = {},
607
- ) {
608
- switch (kind) {
609
- case 'session_expired':
610
- case 'waiting_room_required':
611
- case 'session_model_mismatch':
612
- // Our seat is gone mid-chat. Finalize the AI message so its streaming
613
- // indicator stops — otherwise `isComplete` stays false and the message
614
- // keeps rendering a blinking cursor forever, making the user think the
615
- // agent is still working even though the SessionEndedBanner is visible
616
- // and actionable. Also disposes the batched-updater flush interval.
617
- updater.markComplete()
618
- // Rejected before producing anything (the run-start guard missed
619
- // because only the server knew the slot was gone): the prompt won't be
620
- // processed and isn't re-queued, so say so instead of leaving it
621
- // looking sent. Runs that got partway keep the quieter banner-only UX.
622
- if (opts.messageWasDropped) {
623
- updater.setError(
624
- 'Your free session ended before this message was processed. Send it again after starting a new session.',
625
- )
626
- }
627
- // Flip to `ended` instead of auto re-queuing: the Chat surface stays
628
- // mounted so any in-flight agent work can finish under the server-side
629
- // grace period, and the session-ended banner prompts the user to press
630
- // Enter when they're ready to rejoin.
631
- markFreebuffSessionEnded()
632
- return
633
- case 'waiting_room_queued':
634
- // Legacy error code: sessions are admitted immediately now, so this is
635
- // only reachable in a transient race with a concurrent session request.
636
- updater.setError(
637
- 'Your free session is still being set up. Try again in a moment.',
638
- )
639
- // Re-sync without resetting chat — this is a "we'll wait", not a
640
- // "let's start fresh".
641
- refreshFreebuffSession().catch(() => {})
642
- return
643
- case 'session_superseded':
644
- updater.setError(
645
- 'Another freebuff CLI took over this account. Close the other instance, then restart.',
646
- )
647
- // Terminal state: stop polling and flip UI to a "please restart" screen
648
- // so we don't silently fight the other instance for the seat.
649
- markFreebuffSessionSuperseded()
650
- return
651
- default:
652
- return
653
- }
654
- }