savant-code 0.0.19 → 0.0.21

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 (1591) hide show
  1. package/README.md +402 -550
  2. package/{cli/release/index.js → index.js} +0 -0
  3. package/{cli/release-core/launcher.js → launcher.js} +138 -32
  4. package/package.json +44 -71
  5. package/.agents/skills/coding-csharp/SKILL.md +0 -82
  6. package/.agents/skills/coding-go/SKILL.md +0 -76
  7. package/.agents/skills/coding-java/SKILL.md +0 -79
  8. package/.agents/skills/coding-python/SKILL.md +0 -87
  9. package/.agents/skills/coding-rust/SKILL.md +0 -83
  10. package/.agents/skills/coding-typescript/SKILL.md +0 -90
  11. package/.agents/skills/release-workflow/SKILL.md +0 -69
  12. package/.bun-version +0 -1
  13. package/.commandcode/settings.json +0 -11
  14. package/.commandcode/taste/workflow/taste.md +0 -6
  15. package/.env.example +0 -95
  16. package/.gitattributes +0 -43
  17. package/.githooks/pre-push +0 -35
  18. package/.github/workflows/build-release-binaries.yml +0 -163
  19. package/.markdownlint.json +0 -42
  20. package/.markdownlintignore +0 -21
  21. package/.prettierignore +0 -9
  22. package/.prettierrc +0 -23
  23. package/.savantignore +0 -3
  24. package/AGENTS.md +0 -97
  25. package/ARCHITECTURE.md +0 -241
  26. package/CHANGELOG.md +0 -2631
  27. package/CONTRIBUTING.md +0 -88
  28. package/ECHO-freebuff.md +0 -22
  29. package/ECHO.md +0 -722
  30. package/FREEREADME.md +0 -35
  31. package/LEARNINGS.md +0 -345
  32. package/NOTICE +0 -15
  33. package/README.zh-CN.md +0 -479
  34. package/SECURITY.md +0 -8
  35. package/VERSION +0 -1
  36. package/WINDOWS.md +0 -238
  37. package/agents/README.md +0 -41
  38. package/agents/base-chat.ts +0 -44
  39. package/agents/basher.ts +0 -107
  40. package/agents/browser-use/browser-use.test.ts +0 -211
  41. package/agents/browser-use/browser-use.ts +0 -259
  42. package/agents/constants.ts +0 -1
  43. package/agents/context-pruner.ts +0 -1076
  44. package/agents/detective/detective.ts +0 -168
  45. package/agents/editor/best-of-n/best-of-n-selector2.ts +0 -148
  46. package/agents/editor/best-of-n/editor-implementor-gpt-5.ts +0 -7
  47. package/agents/editor/best-of-n/editor-implementor-opus.ts +0 -7
  48. package/agents/editor/best-of-n/editor-implementor.ts +0 -196
  49. package/agents/editor/best-of-n/editor-multi-prompt.ts +0 -265
  50. package/agents/file-explorer/directory-lister.ts +0 -92
  51. package/agents/file-explorer/glob-matcher.ts +0 -96
  52. package/agents/forge/forge.ts +0 -146
  53. package/agents/librarian/librarian.test.ts +0 -289
  54. package/agents/librarian/librarian.ts +0 -158
  55. package/agents/package.json +0 -11
  56. package/agents/recorder/recorder.ts +0 -104
  57. package/agents/researcher/researcher-docs.ts +0 -32
  58. package/agents/researcher/researcher-web.ts +0 -40
  59. package/agents/savant/savant-analyze.ts +0 -11
  60. package/agents/savant/savant-free-deepseek-flash.ts +0 -13
  61. package/agents/savant/savant-free-deepseek.ts +0 -13
  62. package/agents/savant/savant-free-evals.ts +0 -9
  63. package/agents/savant/savant-free-glm.ts +0 -13
  64. package/agents/savant/savant-free-kimi.ts +0 -13
  65. package/agents/savant/savant-free-mimo-pro.ts +0 -13
  66. package/agents/savant/savant-free-mimo.ts +0 -13
  67. package/agents/savant/savant-free-minimax-m3.ts +0 -13
  68. package/agents/savant/savant-free.ts +0 -9
  69. package/agents/savant/savant-scaffold.ts +0 -15
  70. package/agents/savant/savant.ts +0 -706
  71. package/agents/scout/scout.ts +0 -305
  72. package/agents/scribe/scribe.ts +0 -54
  73. package/agents/thinker/thinker-gemini.ts +0 -26
  74. package/agents/thinker/thinker-gpt.ts +0 -21
  75. package/agents/thinker/thinker-with-files-gemini.ts +0 -66
  76. package/agents/thinker/thinker.ts +0 -99
  77. package/agents/tmux-cli.ts +0 -724
  78. package/agents/tsconfig.json +0 -12
  79. package/agents/types/agent-definition.ts +0 -1
  80. package/agents/types/secret-agent-definition.ts +0 -103
  81. package/agents/types/tools.ts +0 -465
  82. package/agents/types/util-types.ts +0 -167
  83. package/agents/verifier/verifier.ts +0 -80
  84. package/art/savant-redesign.md +0 -7
  85. package/art/savant-text-graf.md +0 -5
  86. package/art/savant_ascii.md +0 -88
  87. package/assets/banner.png +0 -0
  88. package/bun.lock +0 -1979
  89. package/bunfig.toml +0 -7
  90. package/cli/README.md +0 -111
  91. package/cli/bunfig.toml +0 -2
  92. package/cli/cli_exit +0 -1
  93. package/cli/package.json +0 -66
  94. package/cli/release/README.md +0 -348
  95. package/cli/release/package.json +0 -56
  96. package/cli/release-core/README.md +0 -20
  97. package/cli/release-core/package.json +0 -4
  98. package/cli/release-core/prepare-package.js +0 -31
  99. package/cli/release-staging/README.md +0 -70
  100. package/cli/release-staging/index.js +0 -42
  101. package/cli/release-staging/package.json +0 -43
  102. package/cli/scripts/build-binary.ts +0 -469
  103. package/cli/scripts/clean.ts +0 -16
  104. package/cli/scripts/prebuild-agents.ts +0 -250
  105. package/cli/scripts/release.ts +0 -103
  106. package/cli/scripts/smoke-binary.ts +0 -280
  107. package/cli/scripts/test-sdk-file-hooks.sh +0 -87
  108. package/cli/scripts/validate-cli-with-tmux.sh +0 -43
  109. package/cli/src/__tests__/README.md +0 -256
  110. package/cli/src/__tests__/bash-mode.test.ts +0 -442
  111. package/cli/src/__tests__/cli-args.test.ts +0 -241
  112. package/cli/src/__tests__/e2e/first-time-login.test.ts +0 -173
  113. package/cli/src/__tests__/e2e/logout-relogin-flow.test.ts +0 -110
  114. package/cli/src/__tests__/e2e/returning-user-auth.test.ts +0 -111
  115. package/cli/src/__tests__/e2e-cli.test.ts +0 -185
  116. package/cli/src/__tests__/helpers/mock-api-client.ts +0 -64
  117. package/cli/src/__tests__/helpers/terminal-watchdog-fixture.ts +0 -50
  118. package/cli/src/__tests__/home-directory-detection.test.ts +0 -213
  119. package/cli/src/__tests__/integration/agent-toolnames-validation.test.ts +0 -63
  120. package/cli/src/__tests__/integration/api-integration.test.ts +0 -289
  121. package/cli/src/__tests__/integration/credentials-storage.test.ts +0 -453
  122. package/cli/src/__tests__/integration/local-agents.test.ts +0 -1187
  123. package/cli/src/__tests__/integration/login-flow-instrumentation.test.ts +0 -146
  124. package/cli/src/__tests__/integration/login-polling-working.test.ts +0 -287
  125. package/cli/src/__tests__/integration/usage-refresh-on-completion.test.ts +0 -177
  126. package/cli/src/__tests__/integration-tmux.test.ts +0 -186
  127. package/cli/src/__tests__/mocks/hover-toggle-controller.ts +0 -71
  128. package/cli/src/__tests__/path-completion.test.ts +0 -243
  129. package/cli/src/__tests__/project-files-chat-id.test.ts +0 -34
  130. package/cli/src/__tests__/release/proxy-http-get.test.ts +0 -670
  131. package/cli/src/__tests__/release/wrapper-safety.test.ts +0 -177
  132. package/cli/src/__tests__/rerender-perf.integration.test.ts +0 -283
  133. package/cli/src/__tests__/terminal-reset-sequences.test.ts +0 -36
  134. package/cli/src/__tests__/terminal-watchdog.test.ts +0 -114
  135. package/cli/src/__tests__/test-utils.ts +0 -266
  136. package/cli/src/__tests__/tmux-poc.ts +0 -150
  137. package/cli/src/__tests__/unit/agent-mode-toggle.test.ts +0 -138
  138. package/cli/src/__tests__/unit/copy-button.test.tsx +0 -188
  139. package/cli/src/__tests__/unit/create-run-config.test.ts +0 -77
  140. package/cli/src/__tests__/unit/publish-confirmation.test.ts +0 -70
  141. package/cli/src/__tests__/unit/segmented-control.test.ts +0 -167
  142. package/cli/src/__tests__/utils/env.test.ts +0 -210
  143. package/cli/src/__tests__/utils/project-picker.test.ts +0 -39
  144. package/cli/src/agents/bundled-agents.generated.d.ts +0 -14
  145. package/cli/src/agents/bundled-agents.generated.ts +0 -1962
  146. package/cli/src/app.tsx +0 -383
  147. package/cli/src/chat.tsx +0 -2008
  148. package/cli/src/cli-args.ts +0 -183
  149. package/cli/src/commands/__tests__/bash-command.test.ts +0 -449
  150. package/cli/src/commands/__tests__/command-args.test.ts +0 -325
  151. package/cli/src/commands/__tests__/copy-conversation.test.ts +0 -240
  152. package/cli/src/commands/__tests__/dev-command.test.ts +0 -128
  153. package/cli/src/commands/__tests__/diagnostics-command.test.ts +0 -35
  154. package/cli/src/commands/__tests__/image.test.ts +0 -99
  155. package/cli/src/commands/__tests__/init.test.ts +0 -479
  156. package/cli/src/commands/__tests__/loop-command.test.ts +0 -89
  157. package/cli/src/commands/__tests__/new-command-rotates-chat.test.ts +0 -87
  158. package/cli/src/commands/__tests__/permissions-command.test.ts +0 -93
  159. package/cli/src/commands/__tests__/process-diagnostics.test.ts +0 -54
  160. package/cli/src/commands/__tests__/prompt-builders.test.ts +0 -69
  161. package/cli/src/commands/__tests__/registry-gating.test.ts +0 -125
  162. package/cli/src/commands/__tests__/rewind-command.test.ts +0 -227
  163. package/cli/src/commands/__tests__/router-connect-chatgpt.test.ts +0 -72
  164. package/cli/src/commands/__tests__/router-input.test.ts +0 -302
  165. package/cli/src/commands/__tests__/router-provider-setup.test.ts +0 -180
  166. package/cli/src/commands/__tests__/savant-free-command-aliases.test.ts +0 -56
  167. package/cli/src/commands/ads.ts +0 -45
  168. package/cli/src/commands/command-registry.ts +0 -1112
  169. package/cli/src/commands/copy-conversation.ts +0 -386
  170. package/cli/src/commands/goal.ts +0 -87
  171. package/cli/src/commands/health-command.ts +0 -61
  172. package/cli/src/commands/help.ts +0 -13
  173. package/cli/src/commands/image.ts +0 -20
  174. package/cli/src/commands/init.ts +0 -121
  175. package/cli/src/commands/loop.ts +0 -182
  176. package/cli/src/commands/process-diagnostics.ts +0 -120
  177. package/cli/src/commands/prompt-builders.ts +0 -140
  178. package/cli/src/commands/publish.ts +0 -261
  179. package/cli/src/commands/rewind.ts +0 -130
  180. package/cli/src/commands/router-utils.ts +0 -80
  181. package/cli/src/commands/router.ts +0 -589
  182. package/cli/src/commands/telemetry.ts +0 -68
  183. package/cli/src/commands/usage.ts +0 -26
  184. package/cli/src/components/__tests__/ad-banner.test.tsx +0 -84
  185. package/cli/src/components/__tests__/block-helpers.test.tsx +0 -139
  186. package/cli/src/components/__tests__/clickable.test.tsx +0 -39
  187. package/cli/src/components/__tests__/grid-layout.integration.test.tsx +0 -365
  188. package/cli/src/components/__tests__/grid-layout.test.tsx +0 -1033
  189. package/cli/src/components/__tests__/markdown-content.test.tsx +0 -163
  190. package/cli/src/components/__tests__/message-block.completion.test.tsx +0 -104
  191. package/cli/src/components/__tests__/message-block.streaming.test.tsx +0 -78
  192. package/cli/src/components/__tests__/message-with-agents.test.tsx +0 -571
  193. package/cli/src/components/__tests__/multiline-input.test.tsx +0 -1129
  194. package/cli/src/components/__tests__/selectable-list.test.ts +0 -232
  195. package/cli/src/components/__tests__/shimmer-text.test.tsx +0 -32
  196. package/cli/src/components/__tests__/status-indicator.test.tsx +0 -184
  197. package/cli/src/components/__tests__/user-error-banner.test.tsx +0 -100
  198. package/cli/src/components/ad-banner.tsx +0 -351
  199. package/cli/src/components/agent-checklist.tsx +0 -385
  200. package/cli/src/components/agent-mode-toggle.tsx +0 -294
  201. package/cli/src/components/ask-user/__tests__/multiple-choice-form.test.ts +0 -432
  202. package/cli/src/components/ask-user/__tests__/validation.test.ts +0 -213
  203. package/cli/src/components/ask-user/components/accordion-question.tsx +0 -153
  204. package/cli/src/components/ask-user/components/custom-answer-input.tsx +0 -66
  205. package/cli/src/components/ask-user/components/options-list.tsx +0 -139
  206. package/cli/src/components/ask-user/components/question-header.tsx +0 -80
  207. package/cli/src/components/ask-user/components/question-option.tsx +0 -94
  208. package/cli/src/components/ask-user/constants.ts +0 -35
  209. package/cli/src/components/ask-user/index.tsx +0 -660
  210. package/cli/src/components/ask-user/utils/validation.ts +0 -85
  211. package/cli/src/components/attachment-card.tsx +0 -67
  212. package/cli/src/components/blocks/agent-block-grid.tsx +0 -58
  213. package/cli/src/components/blocks/agent-branch-item.tsx +0 -230
  214. package/cli/src/components/blocks/agent-branch-wrapper.tsx +0 -524
  215. package/cli/src/components/blocks/agent-list-branch.tsx +0 -77
  216. package/cli/src/components/blocks/ask-user-branch.tsx +0 -98
  217. package/cli/src/components/blocks/block-helpers.tsx +0 -257
  218. package/cli/src/components/blocks/blocks-renderer.tsx +0 -296
  219. package/cli/src/components/blocks/content-with-markdown.tsx +0 -34
  220. package/cli/src/components/blocks/copy-button.tsx +0 -106
  221. package/cli/src/components/blocks/copyable-block.tsx +0 -47
  222. package/cli/src/components/blocks/image-block.tsx +0 -128
  223. package/cli/src/components/blocks/implementor-row.tsx +0 -453
  224. package/cli/src/components/blocks/markdown-content.tsx +0 -360
  225. package/cli/src/components/blocks/markdown-renderables.tsx +0 -347
  226. package/cli/src/components/blocks/single-block.tsx +0 -210
  227. package/cli/src/components/blocks/thinking-block.tsx +0 -77
  228. package/cli/src/components/blocks/tool-block-group.tsx +0 -72
  229. package/cli/src/components/blocks/tool-branch.tsx +0 -196
  230. package/cli/src/components/blocks/user-content-copy.tsx +0 -171
  231. package/cli/src/components/bottom-banner.tsx +0 -145
  232. package/cli/src/components/build-mode-buttons.tsx +0 -110
  233. package/cli/src/components/button.tsx +0 -75
  234. package/cli/src/components/chat-header.tsx +0 -11
  235. package/cli/src/components/chat-history-screen.tsx +0 -417
  236. package/cli/src/components/chat-input-bar.tsx +0 -535
  237. package/cli/src/components/chatgpt-connect-banner.tsx +0 -234
  238. package/cli/src/components/clickable.tsx +0 -149
  239. package/cli/src/components/collapse-button.tsx +0 -36
  240. package/cli/src/components/command-palette.tsx +0 -166
  241. package/cli/src/components/copy-button.tsx +0 -219
  242. package/cli/src/components/dialog.tsx +0 -111
  243. package/cli/src/components/elapsed-timer.tsx +0 -56
  244. package/cli/src/components/error-boundary.tsx +0 -63
  245. package/cli/src/components/feedback-container.tsx +0 -206
  246. package/cli/src/components/feedback-icon-button.tsx +0 -89
  247. package/cli/src/components/feedback-input-mode.tsx +0 -352
  248. package/cli/src/components/file-attachment-card.tsx +0 -89
  249. package/cli/src/components/grid-layout.tsx +0 -83
  250. package/cli/src/components/help-banner.tsx +0 -136
  251. package/cli/src/components/highlighted-text.tsx +0 -52
  252. package/cli/src/components/image-card.tsx +0 -167
  253. package/cli/src/components/image-thumbnail.tsx +0 -112
  254. package/cli/src/components/input-cursor.tsx +0 -77
  255. package/cli/src/components/input-mode-banner.tsx +0 -70
  256. package/cli/src/components/load-previous-button.tsx +0 -48
  257. package/cli/src/components/login-modal.tsx +0 -450
  258. package/cli/src/components/message-block.tsx +0 -337
  259. package/cli/src/components/message-footer.tsx +0 -269
  260. package/cli/src/components/message-with-agents.tsx +0 -594
  261. package/cli/src/components/mode-divider.tsx +0 -43
  262. package/cli/src/components/model-picker.tsx +0 -371
  263. package/cli/src/components/multiline-input.tsx +0 -1276
  264. package/cli/src/components/out-of-credits-banner.tsx +0 -155
  265. package/cli/src/components/pending-attachments-banner.tsx +0 -125
  266. package/cli/src/components/pending-bash-message.tsx +0 -57
  267. package/cli/src/components/progress-bar.tsx +0 -81
  268. package/cli/src/components/project-picker-screen.tsx +0 -469
  269. package/cli/src/components/provider-picker.tsx +0 -139
  270. package/cli/src/components/publish-confirmation.tsx +0 -514
  271. package/cli/src/components/publish-container.tsx +0 -737
  272. package/cli/src/components/raised-pill.tsx +0 -89
  273. package/cli/src/components/renderers/plan-box.tsx +0 -70
  274. package/cli/src/components/review-screen.tsx +0 -114
  275. package/cli/src/components/rewind-picker.tsx +0 -276
  276. package/cli/src/components/right-sidebar.tsx +0 -296
  277. package/cli/src/components/savant-free-active-session-summary.tsx +0 -63
  278. package/cli/src/components/savant-free-landing-screen.tsx +0 -756
  279. package/cli/src/components/savant-free-model-selector.tsx +0 -815
  280. package/cli/src/components/savant-free-referral-banner.tsx +0 -423
  281. package/cli/src/components/savant-free-superseded-screen.tsx +0 -62
  282. package/cli/src/components/savant-ui/animation/pulse.tsx +0 -26
  283. package/cli/src/components/savant-ui/animation/typewriter.tsx +0 -40
  284. package/cli/src/components/savant-ui/branding.tsx +0 -59
  285. package/cli/src/components/savant-ui/data-display/badge.tsx +0 -52
  286. package/cli/src/components/savant-ui/data-display/code-block.tsx +0 -55
  287. package/cli/src/components/savant-ui/data-display/key-value.tsx +0 -34
  288. package/cli/src/components/savant-ui/data-display/sparkline.tsx +0 -42
  289. package/cli/src/components/savant-ui/data-display/timeline.tsx +0 -44
  290. package/cli/src/components/savant-ui/data-display/tree-view.tsx +0 -55
  291. package/cli/src/components/savant-ui/echo/__tests__/sidebar-collapse.test.tsx +0 -90
  292. package/cli/src/components/savant-ui/echo/agent-stack.tsx +0 -72
  293. package/cli/src/components/savant-ui/echo/agent-status.tsx +0 -66
  294. package/cli/src/components/savant-ui/echo/fid-card.tsx +0 -89
  295. package/cli/src/components/savant-ui/echo/fid-list.tsx +0 -68
  296. package/cli/src/components/savant-ui/echo/loop-status-panel.tsx +0 -64
  297. package/cli/src/components/savant-ui/echo/perfection-loop.tsx +0 -118
  298. package/cli/src/components/savant-ui/echo/phase-indicator.tsx +0 -68
  299. package/cli/src/components/savant-ui/echo/phase-info.ts +0 -72
  300. package/cli/src/components/savant-ui/echo/token-meter.tsx +0 -39
  301. package/cli/src/components/savant-ui/feedback/alert.tsx +0 -45
  302. package/cli/src/components/savant-ui/feedback/cost-tracker.tsx +0 -54
  303. package/cli/src/components/savant-ui/feedback/progress-bar.tsx +0 -71
  304. package/cli/src/components/savant-ui/feedback/spinner.tsx +0 -40
  305. package/cli/src/components/savant-ui/icon-theme-keys.ts +0 -67
  306. package/cli/src/components/savant-ui/icon.tsx +0 -53
  307. package/cli/src/components/savant-ui/index.ts +0 -75
  308. package/cli/src/components/savant-ui/input/select.tsx +0 -26
  309. package/cli/src/components/savant-ui/input/toggle.tsx +0 -28
  310. package/cli/src/components/savant-ui/layout/grid.tsx +0 -52
  311. package/cli/src/components/savant-ui/layout/header.tsx +0 -28
  312. package/cli/src/components/savant-ui/navigation/stepper.tsx +0 -41
  313. package/cli/src/components/savant-ui/primitives/key-hint.tsx +0 -45
  314. package/cli/src/components/savant-ui/primitives/key-value-row.tsx +0 -41
  315. package/cli/src/components/savant-ui/primitives/panel.tsx +0 -42
  316. package/cli/src/components/savant-ui/primitives/separator.tsx +0 -34
  317. package/cli/src/components/savant-ui/primitives/sidebar-section.tsx +0 -64
  318. package/cli/src/components/savant-ui/primitives/spacer.tsx +0 -13
  319. package/cli/src/components/savant-ui/primitives/stack.tsx +0 -35
  320. package/cli/src/components/savant-ui/theme.ts +0 -45
  321. package/cli/src/components/scroll-to-bottom-button.tsx +0 -34
  322. package/cli/src/components/segmented-control.tsx +0 -199
  323. package/cli/src/components/selectable-list.tsx +0 -249
  324. package/cli/src/components/selected-chips.tsx +0 -86
  325. package/cli/src/components/separator.tsx +0 -40
  326. package/cli/src/components/session-ended-banner.tsx +0 -183
  327. package/cli/src/components/shimmer-text.tsx +0 -254
  328. package/cli/src/components/status-bar.tsx +0 -279
  329. package/cli/src/components/subscription-limit-banner.tsx +0 -269
  330. package/cli/src/components/suggested-prompts.tsx +0 -184
  331. package/cli/src/components/suggestion-menu.tsx +0 -219
  332. package/cli/src/components/terminal-command-display.tsx +0 -152
  333. package/cli/src/components/terminal-link.tsx +0 -97
  334. package/cli/src/components/text-attachment-card.tsx +0 -77
  335. package/cli/src/components/thinking.tsx +0 -108
  336. package/cli/src/components/toast.tsx +0 -109
  337. package/cli/src/components/tools/__tests__/apply-patch.test.tsx +0 -97
  338. package/cli/src/components/tools/__tests__/code-search.test.tsx +0 -45
  339. package/cli/src/components/tools/__tests__/gravity-index.test.ts +0 -76
  340. package/cli/src/components/tools/__tests__/render-ui.test.tsx +0 -556
  341. package/cli/src/components/tools/__tests__/run-terminal-command.test.ts +0 -274
  342. package/cli/src/components/tools/__tests__/tool-call-item.test.tsx +0 -73
  343. package/cli/src/components/tools/apply-patch.tsx +0 -101
  344. package/cli/src/components/tools/code-search.tsx +0 -50
  345. package/cli/src/components/tools/composio.tsx +0 -140
  346. package/cli/src/components/tools/diff-viewer.tsx +0 -21
  347. package/cli/src/components/tools/glob.tsx +0 -66
  348. package/cli/src/components/tools/gravity-index.tsx +0 -80
  349. package/cli/src/components/tools/list-directory.tsx +0 -66
  350. package/cli/src/components/tools/read-docs.tsx +0 -36
  351. package/cli/src/components/tools/read-files.tsx +0 -97
  352. package/cli/src/components/tools/read-subtree.tsx +0 -40
  353. package/cli/src/components/tools/read-url.tsx +0 -32
  354. package/cli/src/components/tools/registry.ts +0 -131
  355. package/cli/src/components/tools/render-ui.tsx +0 -466
  356. package/cli/src/components/tools/run-terminal-command.tsx +0 -86
  357. package/cli/src/components/tools/skill.tsx +0 -26
  358. package/cli/src/components/tools/str-replace.tsx +0 -77
  359. package/cli/src/components/tools/suggest-followups.tsx +0 -373
  360. package/cli/src/components/tools/task-completed.tsx +0 -16
  361. package/cli/src/components/tools/tool-call-item.tsx +0 -163
  362. package/cli/src/components/tools/types.ts +0 -100
  363. package/cli/src/components/tools/web-search.tsx +0 -32
  364. package/cli/src/components/tools/write-file.tsx +0 -20
  365. package/cli/src/components/tools/write-todos.tsx +0 -105
  366. package/cli/src/components/top-banner.tsx +0 -187
  367. package/cli/src/components/usage-banner.tsx +0 -296
  368. package/cli/src/components/user-error-banner.tsx +0 -54
  369. package/cli/src/components/validation-error-popover.tsx +0 -191
  370. package/cli/src/data/slash-commands.ts +0 -306
  371. package/cli/src/hooks/__tests__/holds-live-savant-free-slot.test.ts +0 -49
  372. package/cli/src/hooks/__tests__/run-outcome.test.ts +0 -178
  373. package/cli/src/hooks/__tests__/session-fetch-signal.test.ts +0 -45
  374. package/cli/src/hooks/__tests__/use-activity-query.test.ts +0 -810
  375. package/cli/src/hooks/__tests__/use-ask-user-bridge.test.ts +0 -175
  376. package/cli/src/hooks/__tests__/use-auth-query.test.ts +0 -21
  377. package/cli/src/hooks/__tests__/use-chat-messages-collapse.test.ts +0 -96
  378. package/cli/src/hooks/__tests__/use-connection-status.test.ts +0 -112
  379. package/cli/src/hooks/__tests__/use-directory-browser.test.ts +0 -215
  380. package/cli/src/hooks/__tests__/use-gravity-ad.test.ts +0 -73
  381. package/cli/src/hooks/__tests__/use-grid-layout.test.ts +0 -346
  382. package/cli/src/hooks/__tests__/use-input-history.test.ts +0 -704
  383. package/cli/src/hooks/__tests__/use-loop-scheduler.test.ts +0 -247
  384. package/cli/src/hooks/__tests__/use-path-tab-completion.test.ts +0 -324
  385. package/cli/src/hooks/__tests__/use-queue-controls.test.ts +0 -68
  386. package/cli/src/hooks/__tests__/use-searchable-list.test.ts +0 -364
  387. package/cli/src/hooks/__tests__/use-send-message-timer.test.ts +0 -146
  388. package/cli/src/hooks/__tests__/use-suggestion-engine-mention.test.ts +0 -364
  389. package/cli/src/hooks/__tests__/use-suggestion-engine.test.ts +0 -485
  390. package/cli/src/hooks/__tests__/use-terminal-focus.test.ts +0 -66
  391. package/cli/src/hooks/__tests__/use-terminal-layout.test.ts +0 -675
  392. package/cli/src/hooks/__tests__/use-timeout.test.ts +0 -330
  393. package/cli/src/hooks/__tests__/use-usage-query.test.ts +0 -526
  394. package/cli/src/hooks/__tests__/use-user-details-query.test.ts +0 -225
  395. package/cli/src/hooks/helpers/__tests__/send-message.test.ts +0 -1851
  396. package/cli/src/hooks/helpers/send-message.ts +0 -553
  397. package/cli/src/hooks/run-outcome.ts +0 -64
  398. package/cli/src/hooks/stream-state.ts +0 -106
  399. package/cli/src/hooks/use-activity-query.ts +0 -696
  400. package/cli/src/hooks/use-agent-validation.ts +0 -80
  401. package/cli/src/hooks/use-ask-user-bridge.ts +0 -102
  402. package/cli/src/hooks/use-auth-query.ts +0 -261
  403. package/cli/src/hooks/use-auth-state.ts +0 -155
  404. package/cli/src/hooks/use-chat-input.ts +0 -87
  405. package/cli/src/hooks/use-chat-keyboard.ts +0 -325
  406. package/cli/src/hooks/use-chat-messages.ts +0 -273
  407. package/cli/src/hooks/use-chat-state.ts +0 -219
  408. package/cli/src/hooks/use-chat-streaming.ts +0 -270
  409. package/cli/src/hooks/use-chat-ui.ts +0 -136
  410. package/cli/src/hooks/use-clipboard.ts +0 -154
  411. package/cli/src/hooks/use-connection-status.ts +0 -156
  412. package/cli/src/hooks/use-directory-browser.ts +0 -88
  413. package/cli/src/hooks/use-elapsed-time.ts +0 -116
  414. package/cli/src/hooks/use-event.ts +0 -36
  415. package/cli/src/hooks/use-exit-handler.ts +0 -108
  416. package/cli/src/hooks/use-fetch-login-url.ts +0 -65
  417. package/cli/src/hooks/use-fids.ts +0 -48
  418. package/cli/src/hooks/use-fingerprint.ts +0 -64
  419. package/cli/src/hooks/use-gravity-ad.ts +0 -688
  420. package/cli/src/hooks/use-grid-layout.ts +0 -78
  421. package/cli/src/hooks/use-input-history.ts +0 -173
  422. package/cli/src/hooks/use-login-keyboard-handlers.ts +0 -74
  423. package/cli/src/hooks/use-login-polling.ts +0 -120
  424. package/cli/src/hooks/use-logo.tsx +0 -178
  425. package/cli/src/hooks/use-loop-scheduler.ts +0 -481
  426. package/cli/src/hooks/use-message-queue.ts +0 -301
  427. package/cli/src/hooks/use-now.ts +0 -20
  428. package/cli/src/hooks/use-path-tab-completion.ts +0 -88
  429. package/cli/src/hooks/use-publish-mutation.ts +0 -60
  430. package/cli/src/hooks/use-queue-controls.ts +0 -70
  431. package/cli/src/hooks/use-queue-ui.ts +0 -55
  432. package/cli/src/hooks/use-savant-free-ctrl-c-exit.ts +0 -23
  433. package/cli/src/hooks/use-savant-free-session-progress.ts +0 -34
  434. package/cli/src/hooks/use-savant-free-session.ts +0 -679
  435. package/cli/src/hooks/use-savant-free-streak-query.ts +0 -72
  436. package/cli/src/hooks/use-scaffold-confirm.ts +0 -62
  437. package/cli/src/hooks/use-scaffold-revert-subscriber.ts +0 -66
  438. package/cli/src/hooks/use-scroll-management.ts +0 -182
  439. package/cli/src/hooks/use-searchable-list.ts +0 -99
  440. package/cli/src/hooks/use-send-message.ts +0 -1038
  441. package/cli/src/hooks/use-sheen-animation.tsx +0 -88
  442. package/cli/src/hooks/use-subscription-query.ts +0 -106
  443. package/cli/src/hooks/use-suggestion-engine.ts +0 -793
  444. package/cli/src/hooks/use-terminal-breakpoints.ts +0 -77
  445. package/cli/src/hooks/use-terminal-dimensions.ts +0 -50
  446. package/cli/src/hooks/use-terminal-focus.ts +0 -146
  447. package/cli/src/hooks/use-terminal-layout.ts +0 -189
  448. package/cli/src/hooks/use-theme.tsx +0 -140
  449. package/cli/src/hooks/use-timeout.ts +0 -88
  450. package/cli/src/hooks/use-toast.ts +0 -114
  451. package/cli/src/hooks/use-update-preference.ts +0 -77
  452. package/cli/src/hooks/use-usage-monitor.ts +0 -59
  453. package/cli/src/hooks/use-usage-query.ts +0 -138
  454. package/cli/src/hooks/use-user-details-query.ts +0 -104
  455. package/cli/src/hooks/use-why-did-you-update.ts +0 -178
  456. package/cli/src/index.tsx +0 -484
  457. package/cli/src/init/__tests__/init-direnv.test.ts +0 -597
  458. package/cli/src/init/init-app.ts +0 -54
  459. package/cli/src/init/init-direnv.ts +0 -133
  460. package/cli/src/login/constants.ts +0 -71
  461. package/cli/src/login/login-flow.ts +0 -224
  462. package/cli/src/login/plain-login.ts +0 -107
  463. package/cli/src/login/utils.ts +0 -183
  464. package/cli/src/native/ripgrep.ts +0 -82
  465. package/cli/src/polyfills/bun-strip-ansi.ts +0 -12
  466. package/cli/src/pre-init/load-dev-env.ts +0 -98
  467. package/cli/src/pre-init/tree-sitter-wasm.ts +0 -98
  468. package/cli/src/project-files.ts +0 -102
  469. package/cli/src/state/__tests__/chat-store-focus.test.ts +0 -22
  470. package/cli/src/state/__tests__/feedback-store.test.ts +0 -260
  471. package/cli/src/state/chat-history-store.ts +0 -27
  472. package/cli/src/state/chat-store.ts +0 -791
  473. package/cli/src/state/feedback-store.ts +0 -162
  474. package/cli/src/state/gateway-catalog-store.ts +0 -45
  475. package/cli/src/state/login-store.ts +0 -150
  476. package/cli/src/state/message-block-store.ts +0 -143
  477. package/cli/src/state/model-picker-store.ts +0 -67
  478. package/cli/src/state/provider-picker-store.ts +0 -53
  479. package/cli/src/state/publish-store.ts +0 -141
  480. package/cli/src/state/review-store.ts +0 -24
  481. package/cli/src/state/rewind-picker-store.ts +0 -74
  482. package/cli/src/state/savant-free-model-store.ts +0 -59
  483. package/cli/src/state/savant-free-session-store.ts +0 -32
  484. package/cli/src/test-setup.ts +0 -20
  485. package/cli/src/testing/env.ts +0 -46
  486. package/cli/src/types/chat-state.ts +0 -15
  487. package/cli/src/types/chat.ts +0 -242
  488. package/cli/src/types/contracts/send-message.ts +0 -16
  489. package/cli/src/types/env.ts +0 -107
  490. package/cli/src/types/function-params.ts +0 -35
  491. package/cli/src/types/opentui-augmentation.d.ts +0 -11
  492. package/cli/src/types/react19-compat.d.ts +0 -19
  493. package/cli/src/types/savant-free-session.ts +0 -17
  494. package/cli/src/types/store.ts +0 -112
  495. package/cli/src/types/theme-system.ts +0 -194
  496. package/cli/src/types/utils.ts +0 -3
  497. package/cli/src/utils/__tests__/activity-tracker.test.ts +0 -440
  498. package/cli/src/utils/__tests__/agent-display.test.ts +0 -139
  499. package/cli/src/utils/__tests__/analytics-client.test.ts +0 -311
  500. package/cli/src/utils/__tests__/anonymous-id.test.ts +0 -74
  501. package/cli/src/utils/__tests__/arrays.test.ts +0 -264
  502. package/cli/src/utils/__tests__/bash-context-processor.test.ts +0 -38
  503. package/cli/src/utils/__tests__/block-processor.test.ts +0 -690
  504. package/cli/src/utils/__tests__/chat-history.test.ts +0 -247
  505. package/cli/src/utils/__tests__/chat-input-key-intercept.test.ts +0 -40
  506. package/cli/src/utils/__tests__/chat-layout.test.ts +0 -32
  507. package/cli/src/utils/__tests__/chat-meta.test.ts +0 -160
  508. package/cli/src/utils/__tests__/chatgpt-oauth.test.ts +0 -50
  509. package/cli/src/utils/__tests__/clipboard.test.ts +0 -998
  510. package/cli/src/utils/__tests__/code-search-summary.test.ts +0 -84
  511. package/cli/src/utils/__tests__/collapse-helpers.test.ts +0 -1272
  512. package/cli/src/utils/__tests__/error-handling.test.ts +0 -611
  513. package/cli/src/utils/__tests__/feedback-helpers.test.ts +0 -452
  514. package/cli/src/utils/__tests__/feedback-submission.test.ts +0 -26
  515. package/cli/src/utils/__tests__/fetch-usage.test.ts +0 -355
  516. package/cli/src/utils/__tests__/fingerprint.test.ts +0 -147
  517. package/cli/src/utils/__tests__/format-elapsed-time.test.ts +0 -103
  518. package/cli/src/utils/__tests__/format-timeout.test.ts +0 -87
  519. package/cli/src/utils/__tests__/image-dimensions.test.ts +0 -243
  520. package/cli/src/utils/__tests__/image-processor.test.ts +0 -250
  521. package/cli/src/utils/__tests__/implementor-helpers.test.ts +0 -1457
  522. package/cli/src/utils/__tests__/keyboard-actions.test.ts +0 -686
  523. package/cli/src/utils/__tests__/layout-helpers.test.ts +0 -36
  524. package/cli/src/utils/__tests__/lazy-response-ads.test.ts +0 -167
  525. package/cli/src/utils/__tests__/logger-sanitize-secrets.test.ts +0 -80
  526. package/cli/src/utils/__tests__/markdown-renderer.test.tsx +0 -518
  527. package/cli/src/utils/__tests__/markdown-streaming.test.ts +0 -64
  528. package/cli/src/utils/__tests__/message-block-helpers.test.ts +0 -1197
  529. package/cli/src/utils/__tests__/message-updater.test.ts +0 -659
  530. package/cli/src/utils/__tests__/ollama-onboarding.test.ts +0 -239
  531. package/cli/src/utils/__tests__/openrouter-models.test.ts +0 -295
  532. package/cli/src/utils/__tests__/osc-timeout-scenarios.test.ts +0 -172
  533. package/cli/src/utils/__tests__/pending-attachments.test.ts +0 -278
  534. package/cli/src/utils/__tests__/provider-setup.test.ts +0 -183
  535. package/cli/src/utils/__tests__/run-state-storage.test.ts +0 -741
  536. package/cli/src/utils/__tests__/savant-code-api.test.ts +0 -634
  537. package/cli/src/utils/__tests__/savant-free-instance-owner.test.ts +0 -69
  538. package/cli/src/utils/__tests__/savant-free-model-navigation.test.ts +0 -104
  539. package/cli/src/utils/__tests__/savant-free-premium-reset.test.ts +0 -81
  540. package/cli/src/utils/__tests__/savant-free-referral-cache.test.ts +0 -67
  541. package/cli/src/utils/__tests__/savant-free-session-display.test.ts +0 -23
  542. package/cli/src/utils/__tests__/savant-free-streak-line.test.ts +0 -76
  543. package/cli/src/utils/__tests__/sdk-event-handlers.test.ts +0 -615
  544. package/cli/src/utils/__tests__/send-message-helpers.test.ts +0 -1875
  545. package/cli/src/utils/__tests__/send-message-timer.test.ts +0 -68
  546. package/cli/src/utils/__tests__/settings.test.ts +0 -138
  547. package/cli/src/utils/__tests__/strings.test.ts +0 -210
  548. package/cli/src/utils/__tests__/syntax-theme.test.ts +0 -91
  549. package/cli/src/utils/__tests__/terminal-color-detection.test.ts +0 -425
  550. package/cli/src/utils/__tests__/terminal-enter-detection.test.ts +0 -77
  551. package/cli/src/utils/__tests__/text-layout.test.ts +0 -82
  552. package/cli/src/utils/__tests__/think-tag-parser.test.ts +0 -159
  553. package/cli/src/utils/__tests__/trace-writer.test.ts +0 -193
  554. package/cli/src/utils/__tests__/trim-chat-logs.test.ts +0 -79
  555. package/cli/src/utils/__tests__/usage-banner-state.test.ts +0 -298
  556. package/cli/src/utils/__tests__/validation-error-formatting.test.ts +0 -126
  557. package/cli/src/utils/__tests__/write-file-atomic.test.ts +0 -130
  558. package/cli/src/utils/active-run.ts +0 -22
  559. package/cli/src/utils/activity-tracker.ts +0 -66
  560. package/cli/src/utils/agent-display.ts +0 -87
  561. package/cli/src/utils/agent-helpers.ts +0 -47
  562. package/cli/src/utils/ai-message-id.ts +0 -12
  563. package/cli/src/utils/analytics.ts +0 -407
  564. package/cli/src/utils/anonymous-id.ts +0 -87
  565. package/cli/src/utils/arrays.ts +0 -117
  566. package/cli/src/utils/auth.ts +0 -258
  567. package/cli/src/utils/bash-context-processor.ts +0 -47
  568. package/cli/src/utils/bash-messages.ts +0 -108
  569. package/cli/src/utils/block-margins.ts +0 -35
  570. package/cli/src/utils/block-operations.ts +0 -548
  571. package/cli/src/utils/block-processor.ts +0 -212
  572. package/cli/src/utils/chat-history.ts +0 -265
  573. package/cli/src/utils/chat-input-key-intercept.ts +0 -52
  574. package/cli/src/utils/chat-layout.ts +0 -44
  575. package/cli/src/utils/chat-meta.ts +0 -101
  576. package/cli/src/utils/chat-scroll-accel.ts +0 -151
  577. package/cli/src/utils/chatgpt-oauth.ts +0 -350
  578. package/cli/src/utils/clipboard-image.ts +0 -610
  579. package/cli/src/utils/clipboard.ts +0 -307
  580. package/cli/src/utils/code-search-summary.ts +0 -69
  581. package/cli/src/utils/collapse-helpers.ts +0 -265
  582. package/cli/src/utils/config-dir.ts +0 -30
  583. package/cli/src/utils/constants.ts +0 -159
  584. package/cli/src/utils/create-event-handler-state.ts +0 -79
  585. package/cli/src/utils/create-run-config.ts +0 -160
  586. package/cli/src/utils/db-storage.ts +0 -254
  587. package/cli/src/utils/detect-shell.ts +0 -112
  588. package/cli/src/utils/directory-browser.ts +0 -74
  589. package/cli/src/utils/engagement.ts +0 -55
  590. package/cli/src/utils/env.ts +0 -109
  591. package/cli/src/utils/error-handling.ts +0 -246
  592. package/cli/src/utils/error-messages.ts +0 -84
  593. package/cli/src/utils/feedback-helpers.ts +0 -115
  594. package/cli/src/utils/feedback-submission.ts +0 -24
  595. package/cli/src/utils/fetch-usage.ts +0 -75
  596. package/cli/src/utils/fid-loader.ts +0 -135
  597. package/cli/src/utils/fingerprint.ts +0 -263
  598. package/cli/src/utils/finish-logic.ts +0 -154
  599. package/cli/src/utils/format-elapsed-time.ts +0 -33
  600. package/cli/src/utils/format-session-units.ts +0 -6
  601. package/cli/src/utils/format-timeout.ts +0 -28
  602. package/cli/src/utils/format-validation-errors-for-message.ts +0 -85
  603. package/cli/src/utils/git.ts +0 -17
  604. package/cli/src/utils/glyphs.ts +0 -188
  605. package/cli/src/utils/helpers.ts +0 -47
  606. package/cli/src/utils/image-display.ts +0 -73
  607. package/cli/src/utils/image-handler.ts +0 -336
  608. package/cli/src/utils/image-processor.ts +0 -133
  609. package/cli/src/utils/image-thumbnail.ts +0 -83
  610. package/cli/src/utils/implementor-helpers.ts +0 -817
  611. package/cli/src/utils/input-modes.ts +0 -196
  612. package/cli/src/utils/keyboard-actions.ts +0 -394
  613. package/cli/src/utils/keypad-keys.ts +0 -47
  614. package/cli/src/utils/layout-helpers.ts +0 -36
  615. package/cli/src/utils/lazy-response-ads.ts +0 -1
  616. package/cli/src/utils/loading-phrases.ts +0 -68
  617. package/cli/src/utils/local-agent-registry.ts +0 -611
  618. package/cli/src/utils/log-shipper.ts +0 -116
  619. package/cli/src/utils/logger.ts +0 -435
  620. package/cli/src/utils/markdown-renderer.tsx +0 -1315
  621. package/cli/src/utils/math.ts +0 -3
  622. package/cli/src/utils/message-block-helpers.ts +0 -667
  623. package/cli/src/utils/message-history.ts +0 -153
  624. package/cli/src/utils/message-tree-utils.ts +0 -67
  625. package/cli/src/utils/message-updater.ts +0 -279
  626. package/cli/src/utils/ollama-onboarding.ts +0 -215
  627. package/cli/src/utils/open-file.ts +0 -144
  628. package/cli/src/utils/open-url.ts +0 -63
  629. package/cli/src/utils/openrouter-models.ts +0 -945
  630. package/cli/src/utils/path-completion.ts +0 -111
  631. package/cli/src/utils/path-helpers.ts +0 -38
  632. package/cli/src/utils/pending-attachments.ts +0 -363
  633. package/cli/src/utils/post-processing.ts +0 -99
  634. package/cli/src/utils/project-picker.ts +0 -12
  635. package/cli/src/utils/provider-setup.ts +0 -259
  636. package/cli/src/utils/recent-projects.ts +0 -156
  637. package/cli/src/utils/renderer-cleanup.ts +0 -142
  638. package/cli/src/utils/response-ad-positions.ts +0 -1
  639. package/cli/src/utils/rewind.ts +0 -175
  640. package/cli/src/utils/run-state-storage.ts +0 -480
  641. package/cli/src/utils/savant-code-api.ts +0 -686
  642. package/cli/src/utils/savant-code-client.ts +0 -217
  643. package/cli/src/utils/savant-free-agent-selection.ts +0 -12
  644. package/cli/src/utils/savant-free-exit.ts +0 -24
  645. package/cli/src/utils/savant-free-instance-owner.ts +0 -66
  646. package/cli/src/utils/savant-free-model-navigation.ts +0 -46
  647. package/cli/src/utils/savant-free-premium-reset.ts +0 -52
  648. package/cli/src/utils/savant-free-referral-cache.ts +0 -35
  649. package/cli/src/utils/savant-free-session-display.ts +0 -21
  650. package/cli/src/utils/savant-free-streak-line.ts +0 -67
  651. package/cli/src/utils/sdk-event-handlers.ts +0 -587
  652. package/cli/src/utils/send-message-helpers.ts +0 -199
  653. package/cli/src/utils/send-message-timer.ts +0 -110
  654. package/cli/src/utils/settings.ts +0 -388
  655. package/cli/src/utils/skill-registry.ts +0 -100
  656. package/cli/src/utils/spawn-agent-matcher.ts +0 -56
  657. package/cli/src/utils/status-indicator-state.ts +0 -100
  658. package/cli/src/utils/stream-chunk-processor.ts +0 -65
  659. package/cli/src/utils/strings.ts +0 -272
  660. package/cli/src/utils/subscription.ts +0 -31
  661. package/cli/src/utils/syntax-highlighter.tsx +0 -19
  662. package/cli/src/utils/syntax-theme.ts +0 -131
  663. package/cli/src/utils/terminal-color-detection.ts +0 -472
  664. package/cli/src/utils/terminal-enter-detection.ts +0 -63
  665. package/cli/src/utils/terminal-images.ts +0 -223
  666. package/cli/src/utils/terminal-reset-sequences.ts +0 -33
  667. package/cli/src/utils/terminal-title.ts +0 -113
  668. package/cli/src/utils/terminal-watchdog.ts +0 -246
  669. package/cli/src/utils/text-layout.ts +0 -153
  670. package/cli/src/utils/theme-config.ts +0 -143
  671. package/cli/src/utils/theme-system.ts +0 -1265
  672. package/cli/src/utils/think-tag-parser.ts +0 -105
  673. package/cli/src/utils/trace-writer.ts +0 -147
  674. package/cli/src/utils/ui-constants.ts +0 -69
  675. package/cli/src/utils/usage-banner-state.ts +0 -146
  676. package/cli/src/utils/validation-error-formatting.ts +0 -92
  677. package/cli/src/utils/validation-error-helpers.ts +0 -19
  678. package/cli/src/utils/version.ts +0 -23
  679. package/cli/src/utils/word-wrap-utils.ts +0 -53
  680. package/cli/src/utils/write-file-atomic.ts +0 -82
  681. package/cli/src/utils/yield-to-event-loop.ts +0 -9
  682. package/cli/tsconfig.json +0 -26
  683. package/coding-standards/csharp.md +0 -77
  684. package/coding-standards/go.md +0 -71
  685. package/coding-standards/java.md +0 -74
  686. package/coding-standards/python.md +0 -82
  687. package/coding-standards/rust.md +0 -78
  688. package/coding-standards/typescript.md +0 -85
  689. package/coding-standards/x402.md +0 -227
  690. package/common/README.md +0 -41
  691. package/common/common_exit +0 -1
  692. package/common/package.json +0 -45
  693. package/common/src/__tests__/agent-validation.test.ts +0 -861
  694. package/common/src/__tests__/agents.test.ts +0 -16
  695. package/common/src/__tests__/dynamic-agent-template-schema.test.ts +0 -420
  696. package/common/src/__tests__/env-ci.test.ts +0 -167
  697. package/common/src/__tests__/env-process.test.ts +0 -145
  698. package/common/src/__tests__/free-agents.test.ts +0 -269
  699. package/common/src/__tests__/handlesteps-parsing.test.ts +0 -247
  700. package/common/src/__tests__/model-config.test.ts +0 -41
  701. package/common/src/__tests__/project-file-tree.test.ts +0 -82
  702. package/common/src/__tests__/response-ad-positions.test.ts +0 -78
  703. package/common/src/__tests__/savant-free-models.test.ts +0 -460
  704. package/common/src/__tests__/savant-free-referral-tiers.test.ts +0 -122
  705. package/common/src/__tests__/user-state.test.ts +0 -30
  706. package/common/src/actions.ts +0 -215
  707. package/common/src/analytics-core.ts +0 -73
  708. package/common/src/analytics.ts +0 -96
  709. package/common/src/api-keys/constants.ts +0 -26
  710. package/common/src/browser-actions.ts +0 -414
  711. package/common/src/constants/agents.ts +0 -250
  712. package/common/src/constants/analytics-events.ts +0 -318
  713. package/common/src/constants/anthropic.ts +0 -72
  714. package/common/src/constants/byok.ts +0 -2
  715. package/common/src/constants/chatgpt-oauth.ts +0 -85
  716. package/common/src/constants/composio.ts +0 -34
  717. package/common/src/constants/feedback.ts +0 -18
  718. package/common/src/constants/free-agents.ts +0 -347
  719. package/common/src/constants/gemini.ts +0 -6
  720. package/common/src/constants/grant-priorities.ts +0 -13
  721. package/common/src/constants/hosts.ts +0 -6
  722. package/common/src/constants/images.ts +0 -53
  723. package/common/src/constants/index.ts +0 -8
  724. package/common/src/constants/knowledge.ts +0 -46
  725. package/common/src/constants/limits.ts +0 -23
  726. package/common/src/constants/model-config.ts +0 -469
  727. package/common/src/constants/paths.ts +0 -69
  728. package/common/src/constants/savant-code-config.ts +0 -12
  729. package/common/src/constants/savant-free-gemini-thinker.ts +0 -30
  730. package/common/src/constants/savant-free-models.ts +0 -855
  731. package/common/src/constants/savant-free-referral-tiers.ts +0 -169
  732. package/common/src/constants/skills.ts +0 -60
  733. package/common/src/constants/subscription-plans.ts +0 -54
  734. package/common/src/constants/ui.ts +0 -25
  735. package/common/src/env-ci.ts +0 -36
  736. package/common/src/env-process.ts +0 -95
  737. package/common/src/env-schema.ts +0 -42
  738. package/common/src/env.ts +0 -69
  739. package/common/src/mcp/client.ts +0 -308
  740. package/common/src/old-constants.ts +0 -10
  741. package/common/src/project-file-tree.ts +0 -361
  742. package/common/src/reddit-capi.ts +0 -175
  743. package/common/src/schemas/feedback.ts +0 -57
  744. package/common/src/schemas/logs.ts +0 -66
  745. package/common/src/templates/agent-validation.ts +0 -436
  746. package/common/src/templates/initial-agents-dir/LICENSE +0 -202
  747. package/common/src/templates/initial-agents-dir/README.md +0 -314
  748. package/common/src/templates/initial-agents-dir/examples/01-basic-diff-reviewer.ts +0 -17
  749. package/common/src/templates/initial-agents-dir/examples/02-intermediate-git-committer.ts +0 -78
  750. package/common/src/templates/initial-agents-dir/examples/03-advanced-file-explorer.ts +0 -76
  751. package/common/src/templates/initial-agents-dir/my-custom-agent.ts +0 -40
  752. package/common/src/templates/initial-agents-dir/package.json +0 -6
  753. package/common/src/templates/initial-agents-dir/skills/README.md +0 -66
  754. package/common/src/templates/initial-agents-dir/skills/example-skill/SKILL.md +0 -29
  755. package/common/src/templates/initial-agents-dir/types/agent-definition.ts +0 -484
  756. package/common/src/templates/initial-agents-dir/types/tools.ts +0 -452
  757. package/common/src/templates/initial-agents-dir/types/util-types.ts +0 -167
  758. package/common/src/testing/TESTING_PATTERNS.md +0 -353
  759. package/common/src/testing/errors.ts +0 -33
  760. package/common/src/testing/fixtures/agent-runtime.ts +0 -325
  761. package/common/src/testing/impl/agent-runtime.ts +0 -6
  762. package/common/src/testing/index.ts +0 -84
  763. package/common/src/testing/mock-modules.ts +0 -54
  764. package/common/src/testing/mock-types.ts +0 -123
  765. package/common/src/testing/mocks/analytics.ts +0 -262
  766. package/common/src/testing/mocks/child-process.ts +0 -93
  767. package/common/src/testing/mocks/crypto.ts +0 -218
  768. package/common/src/testing/mocks/database.ts +0 -337
  769. package/common/src/testing/mocks/filesystem.ts +0 -166
  770. package/common/src/testing/mocks/index.ts +0 -83
  771. package/common/src/testing/mocks/logger.ts +0 -136
  772. package/common/src/testing/mocks/stream.ts +0 -314
  773. package/common/src/testing/mocks/timers.ts +0 -132
  774. package/common/src/testing/mocks/tree-sitter.ts +0 -127
  775. package/common/src/testing/setup.ts +0 -282
  776. package/common/src/testing-env-ci.ts +0 -15
  777. package/common/src/testing-env-process.ts +0 -78
  778. package/common/src/tools/__tests__/compile-tool-definitions.test.ts +0 -34
  779. package/common/src/tools/__tests__/thought-session.test.ts +0 -256
  780. package/common/src/tools/compile-tool-definitions.ts +0 -194
  781. package/common/src/tools/constants.ts +0 -132
  782. package/common/src/tools/list.ts +0 -193
  783. package/common/src/tools/params/__tests__/coerce-to-array.test.ts +0 -237
  784. package/common/src/tools/params/__tests__/sequential-thinking-coercion.test.ts +0 -98
  785. package/common/src/tools/params/tool/add-message.ts +0 -36
  786. package/common/src/tools/params/tool/add-subgoal.ts +0 -57
  787. package/common/src/tools/params/tool/apply-patch.ts +0 -110
  788. package/common/src/tools/params/tool/ask-user.ts +0 -181
  789. package/common/src/tools/params/tool/browser-logs.ts +0 -85
  790. package/common/src/tools/params/tool/code-search.ts +0 -144
  791. package/common/src/tools/params/tool/composio.ts +0 -131
  792. package/common/src/tools/params/tool/create-plan.ts +0 -80
  793. package/common/src/tools/params/tool/end-turn.ts +0 -54
  794. package/common/src/tools/params/tool/find-files.ts +0 -60
  795. package/common/src/tools/params/tool/glob.ts +0 -74
  796. package/common/src/tools/params/tool/gravity-index.ts +0 -92
  797. package/common/src/tools/params/tool/list-directory.ts +0 -58
  798. package/common/src/tools/params/tool/lookup-agent-info.ts +0 -37
  799. package/common/src/tools/params/tool/propose-str-replace.ts +0 -103
  800. package/common/src/tools/params/tool/propose-write-file.ts +0 -71
  801. package/common/src/tools/params/tool/read-docs.ts +0 -85
  802. package/common/src/tools/params/tool/read-files.ts +0 -61
  803. package/common/src/tools/params/tool/read-subtree.ts +0 -83
  804. package/common/src/tools/params/tool/read-url.ts +0 -81
  805. package/common/src/tools/params/tool/render-ui.ts +0 -203
  806. package/common/src/tools/params/tool/run-file-change-hooks.ts +0 -57
  807. package/common/src/tools/params/tool/run-readonly-command.ts +0 -76
  808. package/common/src/tools/params/tool/run-terminal-command.ts +0 -185
  809. package/common/src/tools/params/tool/sequential-thinking.ts +0 -110
  810. package/common/src/tools/params/tool/set-messages.ts +0 -42
  811. package/common/src/tools/params/tool/set-output.ts +0 -62
  812. package/common/src/tools/params/tool/set-scaffold-complete.ts +0 -51
  813. package/common/src/tools/params/tool/skill.ts +0 -56
  814. package/common/src/tools/params/tool/spawn-agent-inline.ts +0 -57
  815. package/common/src/tools/params/tool/spawn-agents.ts +0 -154
  816. package/common/src/tools/params/tool/str-replace.ts +0 -107
  817. package/common/src/tools/params/tool/suggest-followups.ts +0 -94
  818. package/common/src/tools/params/tool/task-completed.ts +0 -58
  819. package/common/src/tools/params/tool/think-deeply.ts +0 -53
  820. package/common/src/tools/params/tool/transition-phase.ts +0 -57
  821. package/common/src/tools/params/tool/update-subgoal.ts +0 -89
  822. package/common/src/tools/params/tool/web-search.ts +0 -73
  823. package/common/src/tools/params/tool/write-file.ts +0 -71
  824. package/common/src/tools/params/tool/write-todos.ts +0 -67
  825. package/common/src/tools/params/utils.ts +0 -152
  826. package/common/src/tools/safety-registry.ts +0 -274
  827. package/common/src/tools/safety.ts +0 -42
  828. package/common/src/tools/sequential-thinking.ts +0 -340
  829. package/common/src/tools/utils.ts +0 -25
  830. package/common/src/types/__tests__/dynamic-agent-template.test.ts +0 -20
  831. package/common/src/types/agent-template.ts +0 -223
  832. package/common/src/types/api/agents/publish.ts +0 -63
  833. package/common/src/types/contracts/agent-runtime.ts +0 -84
  834. package/common/src/types/contracts/analytics.ts +0 -12
  835. package/common/src/types/contracts/bigquery.ts +0 -55
  836. package/common/src/types/contracts/billing.ts +0 -46
  837. package/common/src/types/contracts/client.ts +0 -52
  838. package/common/src/types/contracts/database.ts +0 -104
  839. package/common/src/types/contracts/env.ts +0 -203
  840. package/common/src/types/contracts/llm.ts +0 -183
  841. package/common/src/types/contracts/logger.ts +0 -29
  842. package/common/src/types/contracts/logs.ts +0 -34
  843. package/common/src/types/contracts/trace.ts +0 -21
  844. package/common/src/types/dynamic-agent-template.ts +0 -290
  845. package/common/src/types/filesystem.ts +0 -10
  846. package/common/src/types/function-params.ts +0 -35
  847. package/common/src/types/grant.ts +0 -20
  848. package/common/src/types/gravity-index.ts +0 -170
  849. package/common/src/types/json.ts +0 -26
  850. package/common/src/types/mcp.ts +0 -26
  851. package/common/src/types/messages/content-part.ts +0 -59
  852. package/common/src/types/messages/data-content.ts +0 -14
  853. package/common/src/types/messages/provider-metadata.ts +0 -10
  854. package/common/src/types/messages/savant-code-message.ts +0 -55
  855. package/common/src/types/organization.ts +0 -118
  856. package/common/src/types/print-mode.ts +0 -167
  857. package/common/src/types/publisher.ts +0 -67
  858. package/common/src/types/savant-free-session.ts +0 -295
  859. package/common/src/types/savant-free-streak.ts +0 -6
  860. package/common/src/types/session-state.ts +0 -237
  861. package/common/src/types/skill.ts +0 -56
  862. package/common/src/types/source.ts +0 -11
  863. package/common/src/types/spawn.ts +0 -13
  864. package/common/src/types/subscription.ts +0 -68
  865. package/common/src/types/usage.ts +0 -16
  866. package/common/src/types/util.ts +0 -3
  867. package/common/src/util/__tests__/analytics-dispatcher.test.ts +0 -145
  868. package/common/src/util/__tests__/analytics-log.test.ts +0 -110
  869. package/common/src/util/__tests__/analytics-sampling.test.ts +0 -131
  870. package/common/src/util/__tests__/axiom-only-log.test.ts +0 -64
  871. package/common/src/util/__tests__/engagement-tracker.test.ts +0 -115
  872. package/common/src/util/__tests__/error-abort.test.ts +0 -822
  873. package/common/src/util/__tests__/error-api-details.test.ts +0 -190
  874. package/common/src/util/__tests__/format-code-search.test.ts +0 -60
  875. package/common/src/util/__tests__/log-mirror.test.ts +0 -31
  876. package/common/src/util/__tests__/messages.test.ts +0 -1118
  877. package/common/src/util/__tests__/partial-json-delta.test.ts +0 -505
  878. package/common/src/util/__tests__/paths.test.ts +0 -289
  879. package/common/src/util/__tests__/promise.test.ts +0 -334
  880. package/common/src/util/__tests__/protocol-config.test.ts +0 -119
  881. package/common/src/util/__tests__/rate-limit.test.ts +0 -28
  882. package/common/src/util/__tests__/reddit-savant-free-retention.test.ts +0 -120
  883. package/common/src/util/__tests__/savant-free-streak.test.ts +0 -142
  884. package/common/src/util/__tests__/saxy.test.ts +0 -1008
  885. package/common/src/util/__tests__/string.test.ts +0 -238
  886. package/common/src/util/__tests__/zoned-time.test.ts +0 -88
  887. package/common/src/util/agent-file-utils.ts +0 -110
  888. package/common/src/util/agent-id-parsing.ts +0 -147
  889. package/common/src/util/agent-name-normalization.ts +0 -39
  890. package/common/src/util/analytics-dispatcher.ts +0 -81
  891. package/common/src/util/analytics-log.ts +0 -84
  892. package/common/src/util/analytics-sampling.ts +0 -225
  893. package/common/src/util/array.ts +0 -63
  894. package/common/src/util/axiom-only-log.ts +0 -79
  895. package/common/src/util/cache-debug.ts +0 -191
  896. package/common/src/util/credentials.ts +0 -12
  897. package/common/src/util/currency.ts +0 -25
  898. package/common/src/util/dates.ts +0 -81
  899. package/common/src/util/engagement-tracker.ts +0 -133
  900. package/common/src/util/error.ts +0 -580
  901. package/common/src/util/file.ts +0 -363
  902. package/common/src/util/format-code-search.ts +0 -115
  903. package/common/src/util/lazy-response-ads.ts +0 -93
  904. package/common/src/util/log-data.ts +0 -57
  905. package/common/src/util/log-mirror.ts +0 -34
  906. package/common/src/util/lru-cache.ts +0 -67
  907. package/common/src/util/messages.ts +0 -600
  908. package/common/src/util/model-utils.ts +0 -25
  909. package/common/src/util/object.ts +0 -137
  910. package/common/src/util/param-helpers.ts +0 -49
  911. package/common/src/util/partial-json-delta.ts +0 -100
  912. package/common/src/util/paths.ts +0 -194
  913. package/common/src/util/promise.ts +0 -87
  914. package/common/src/util/protocol-config.ts +0 -141
  915. package/common/src/util/random.ts +0 -15
  916. package/common/src/util/rate-limit.ts +0 -56
  917. package/common/src/util/reddit-capi-events.ts +0 -40
  918. package/common/src/util/reddit-savant-free-retention.ts +0 -69
  919. package/common/src/util/response-ad-positions.ts +0 -54
  920. package/common/src/util/savant-free-privacy.ts +0 -78
  921. package/common/src/util/savant-free-streak.ts +0 -153
  922. package/common/src/util/saxy.ts +0 -739
  923. package/common/src/util/skills.ts +0 -32
  924. package/common/src/util/stop-sequence.ts +0 -60
  925. package/common/src/util/string.ts +0 -419
  926. package/common/src/util/system-info.ts +0 -51
  927. package/common/src/util/type-narrowing.ts +0 -125
  928. package/common/src/util/xml.ts +0 -17
  929. package/common/src/util/zod-schema.ts +0 -80
  930. package/common/src/util/zoned-time.ts +0 -136
  931. package/common/src/utils/ask-user-bridge.ts +0 -47
  932. package/common/tsconfig.json +0 -8
  933. package/database.db +0 -0
  934. package/dev/LEARNINGS.md +0 -309
  935. package/dev/fids/.gitkeep +0 -0
  936. package/dev/fids/archive/.gitkeep +0 -0
  937. package/dev/fids/archive/FID-2026-0802-008-sdk-package-audit-client-run-run-state.md +0 -238
  938. package/dev/fids/archive/FID-2026-0803-001-echo-enforcement-layer-drift.md +0 -404
  939. package/dev/fids/archive/FID-2026-0803-002-llm-providers-database-audit.md +0 -348
  940. package/dev/fids/archive/FID-2026-0803-003-sdk-impl-common-util-audit.md +0 -277
  941. package/dev/fids/archive/FID-2026-0803-004-checkpoint-rewind.md +0 -181
  942. package/dev/fids/archive/FID-2026-0803-005-quality-scan-hygiene-fixes.md +0 -265
  943. package/dev/fids/archive/FID-2026-0803-006-code-map-audit-hygiene.md +0 -243
  944. package/dev/fids/archive/FID-2026-0803-007-evals-benchmark-audit-hygiene.md +0 -296
  945. package/dev/fids/archive/FID-2026-0803-009-echo-enforcement-doc-drift.md +0 -112
  946. package/dev/fids/archive/FID-2026-0803-010-database-llm-providers-low-fixes.md +0 -255
  947. package/dev/fids/archive/FID-2026-0803-011-build-artifact-hygiene.md +0 -169
  948. package/dev/fids/archive/FID-2026-0803-012-release-readiness-audit.md +0 -162
  949. package/dev/fids/archive/FID-2026-0803-013-agent-roster-over-reporting.md +0 -146
  950. package/dev/fids/archive/FID-2026-0803-014-freebuff-to-savant-rebrand-sweep.md +0 -185
  951. package/dev/nova/reports/2026-08-02-top-25-ai-inference-providers-competitive-intel.md +0 -213
  952. package/dev/nova/specs/echo-v0.1.2-freebuff.md +0 -391
  953. package/dev/nova/specs/goal-loop-feature-spec.md +0 -245
  954. package/dev/nova/specs/launch-strategy-research-prompt.md +0 -88
  955. package/dev/releases/README.md +0 -50
  956. package/dev/scratchpad/.gitkeep +0 -0
  957. package/dev/session-summaries/.gitkeep +0 -0
  958. package/dev/session-summaries/2026-07-16-1255.md +0 -128
  959. package/dev/session-summaries/2026-07-17-1000.md +0 -64
  960. package/dev/session-summaries/2026-07-19-eslint-zero-tolerance-cleanup.md +0 -145
  961. package/dev/session-summaries/2026-07-19-fid-026-debugging-and-rename.md +0 -79
  962. package/dev/session-summaries/2026-07-19-fid-026-phase-b-rebrand.md +0 -76
  963. package/dev/session-summaries/2026-07-19-fid-027-clean-break.md +0 -47
  964. package/dev/session-summaries/2026-07-19-pre-push-house-cleaning.md +0 -100
  965. package/dev/session-summaries/2026-07-19-v0.0.2-release-session.md +0 -229
  966. package/dev/session-summaries/2026-07-20-1805-fid-loop-closure.md +0 -95
  967. package/dev/session-summaries/2026-07-22-1800.md +0 -52
  968. package/dev/session-summaries/2026-07-23-fsm-optimization.md +0 -88
  969. package/dev/session-summaries/2026-07-25-0000.md +0 -80
  970. package/dev/session-summaries/2026-07-25-1200-context-compaction.md +0 -154
  971. package/dev/session-summaries/2026-07-25-1600-layer4-reactive-compact.md +0 -96
  972. package/dev/session-summaries/2026-07-25-1700-dev-folder-audit.md +0 -161
  973. package/dev/session-summaries/2026-07-25-2000-benchmark-v2-filters.md +0 -147
  974. package/dev/session-summaries/2026-07-25-2000.md +0 -77
  975. package/dev/session-summaries/2026-07-27-0000.md +0 -63
  976. package/dev/session-summaries/2026-07-28-history-capture-handoff.md +0 -206
  977. package/dev/session-summaries/2026-07-31-freebuff-echo-compliance-remediation.md +0 -156
  978. package/dev/session-summaries/2026-07-31-pre-launch-optimization-execution.md +0 -46
  979. package/dev/session-summaries/2026-0721-1800.md +0 -44
  980. package/dev/session-summaries/2026-08-01-sidebar-folded-startup.md +0 -159
  981. package/dev/session-summaries/2026-08-02-0.0.15-release-closeout.md +0 -32
  982. package/dev/session-summaries/2026-08-02-repository-hygiene.md +0 -51
  983. package/dev/session-summaries/2026-08-03-agent-roster-fix-and-ready-check-closeout.md +0 -73
  984. package/dev/session-summaries/2026-08-03-build-artifact-hygiene-closeout.md +0 -40
  985. package/dev/session-summaries/2026-08-03-code-map-audit-closeout.md +0 -44
  986. package/dev/session-summaries/2026-08-03-database-llm-providers-low-fixes-closeout.md +0 -47
  987. package/dev/session-summaries/2026-08-03-echo-enforcement-doc-drift-closeout.md +0 -43
  988. package/dev/session-summaries/2026-08-03-evals-benchmark-audit-closeout.md +0 -50
  989. package/dev/session-summaries/2026-08-03-quality-scan-hygiene-fixes-closeout.md +0 -57
  990. package/dev/session-summaries/2026-08-03-quality-session-checkpoint-rewind-closeout.md +0 -56
  991. package/dev/session-summaries/2026-08-03-release-readiness-audit-closeout.md +0 -60
  992. package/dev/test-prompts/archive/0.0.2-final-pass.md +0 -209
  993. package/dev/test-prompts/archive/agent-capabilities-full-test.md +0 -361
  994. package/dev/test-prompts/archive/agent-capabilities-test.md +0 -471
  995. package/dev/test-prompts/archive/comprehensive-az-system-test-v1.md +0 -441
  996. package/dev/test-prompts/archive/comprehensive-az-system-test-v2-report.md +0 -377
  997. package/dev/test-prompts/archive/comprehensive-az-system-test-v2.md +0 -544
  998. package/dev/test-prompts/archive/comprehensive-az-system-test.md +0 -396
  999. package/dev/test-prompts/archive/comprehensive-az-test-final.md +0 -900
  1000. package/dev/test-prompts/archive/comprehensive-az-test-v11.md +0 -141
  1001. package/dev/test-prompts/archive/comprehensive-az-test-v12.md +0 -29
  1002. package/dev/test-prompts/archive/comprehensive-az-test-v6.md +0 -631
  1003. package/dev/test-prompts/archive/comprehensive-az-test-v7.md +0 -625
  1004. package/dev/test-prompts/archive/fid-007-ability-confirmation.md +0 -248
  1005. package/dev/test-prompts/archive/fid-2026-0801-006-thinker-tool-call-boundary.md +0 -86
  1006. package/dev/test-prompts/archive/fid-2026-0801-007-child-tool-set-fallback-cli.md +0 -101
  1007. package/dev/test-prompts/archive/fid-2026-0801-008-provider-tool-call-accumulation-cli.md +0 -111
  1008. package/dev/test-prompts/archive/fid-2026-0801-012-thinker-state-output-cli.md +0 -134
  1009. package/dev/test-prompts/archive/gemini-deep-research-sidebar-highlight.md +0 -598
  1010. package/dev/test-prompts/archive/goal-loop-cli-test.md +0 -142
  1011. package/dev/test-prompts/archive/rebrand-qa.md +0 -258
  1012. package/dev/test-prompts/archive/release-az-test-fid-085.md +0 -306
  1013. package/dev/test-prompts/archive/release-az-test-fid-087.md +0 -219
  1014. package/dev/test-prompts/archive/release-az-test-fid-2026-0726-001.md +0 -270
  1015. package/dev/test-prompts/archive/release-az-test-fid-2026-0728-008.md +0 -213
  1016. package/dev/test-prompts/archive/release-az-test-fid-2026-0728-launch-tracks.md +0 -253
  1017. package/dev/test-prompts/archive/release-az-test-fid-2026-0731-pre-launch.md +0 -102
  1018. package/docs/AI Coding Agents Market Research.md +0 -516
  1019. package/docs/Agent Harness Feature Pairing Research.md +0 -166
  1020. package/docs/CLI Agent Inference Backend Research.md +0 -446
  1021. package/docs/Codebuff Rebranding And Migration Plan.md +0 -418
  1022. package/docs/ECHO-EVOLUTION-ARCH.md +0 -77
  1023. package/docs/Harness Engineering for Coding Agents Research.md +0 -196
  1024. package/docs/Launch Plan Review and Optimization.md +0 -178
  1025. package/docs/OpenTUI Sidebar Bug Fix.md +0 -245
  1026. package/docs/SAVANT-VERSIONING.md +0 -31
  1027. package/docs/Savant Code Launch Strategy.md +0 -270
  1028. package/docs/Savant-Code Business And Backend Research.md +0 -222
  1029. package/docs/agents-and-tools.md +0 -217
  1030. package/docs/cloudflare-llms-full.md +0 -9623
  1031. package/docs/design/OpenTUI Terminal Visualization Guide.md +0 -471
  1032. package/docs/design/database-architecture.md +0 -217
  1033. package/docs/design/deep-research-report.md +0 -295
  1034. package/docs/design/thinker-sequentialthinking-regression-diagnostic.md +0 -366
  1035. package/docs/discord-server-design.md +0 -167
  1036. package/docs/gravity-integration-starter.md +0 -202
  1037. package/docs/launch/hn-first-comment.md +0 -44
  1038. package/docs/launch/hn-post.md +0 -35
  1039. package/docs/launch/incident-response.md +0 -88
  1040. package/docs/launch/landing/index.html +0 -233
  1041. package/docs/launch/mastodon-thread.md +0 -52
  1042. package/docs/launch/newsletter-pitch.md +0 -49
  1043. package/docs/launch/twitter-thread.md +0 -62
  1044. package/docs/privacy.md +0 -186
  1045. package/docs/reports/Savant-Code Benchmark Specification.md +0 -206
  1046. package/docs/reports/Thinker Agent Architecture Research.md +0 -284
  1047. package/docs/reports/adoptable-features-2026-07-25.md +0 -604
  1048. package/docs/reports/adoptable-features-master.md +0 -480
  1049. package/docs/reports/codebuff-discord-feedback.md +0 -43
  1050. package/docs/reports/feature-parity-report.md +0 -810
  1051. package/docs/reports/repos/AionUi.md +0 -75
  1052. package/docs/reports/repos/OpenHands.md +0 -76
  1053. package/docs/reports/repos/SWE-agent.md +0 -82
  1054. package/docs/reports/repos/agno.md +0 -89
  1055. package/docs/reports/repos/aider.md +0 -74
  1056. package/docs/reports/repos/cline.md +0 -83
  1057. package/docs/reports/repos/codex.md +0 -83
  1058. package/docs/reports/repos/gemini-cli.md +0 -92
  1059. package/docs/reports/repos/goose.md +0 -65
  1060. package/docs/reports/repos/gpt-pilot.md +0 -52
  1061. package/docs/reports/repos/hermes-agent.md +0 -101
  1062. package/docs/reports/repos/kilocode.md +0 -79
  1063. package/docs/reports/repos/openclaude.md +0 -99
  1064. package/docs/reports/repos/openclaw.md +0 -100
  1065. package/docs/reports/repos/opencode-dev.md +0 -78
  1066. package/docs/reports/repos/zero.md +0 -123
  1067. package/docs/reports/savant-code-benchmark-v2-2026-08-03.md +0 -76
  1068. package/docs/savant-code-modes.md +0 -338
  1069. package/docs/testing.md +0 -51
  1070. package/docs/visual-mockup-neon-slate.txt +0 -41
  1071. package/eslint.config.js +0 -211
  1072. package/evals/README.md +0 -45
  1073. package/evals/benchmark/README.md +0 -449
  1074. package/evals/benchmark/agent-runner.ts +0 -217
  1075. package/evals/benchmark/analyze-task-scores.ts +0 -496
  1076. package/evals/benchmark/eval-codebuff-hard.json +0 -3343
  1077. package/evals/benchmark/eval-codebuff.json +0 -3193
  1078. package/evals/benchmark/eval-codebuff2.json +0 -2494
  1079. package/evals/benchmark/eval-manifold-hard.json +0 -2525
  1080. package/evals/benchmark/eval-manifold.json +0 -1675
  1081. package/evals/benchmark/eval-manifold2.json +0 -1945
  1082. package/evals/benchmark/eval-plane-hard.json +0 -4372
  1083. package/evals/benchmark/eval-plane.json +0 -2028
  1084. package/evals/benchmark/eval-plane2.json +0 -3517
  1085. package/evals/benchmark/eval-saleor-hard.json +0 -6081
  1086. package/evals/benchmark/eval-saleor.json +0 -1829
  1087. package/evals/benchmark/eval-saleor2.json +0 -3273
  1088. package/evals/benchmark/eval-task-generator.ts +0 -158
  1089. package/evals/benchmark/filter-supplemental-files.ts +0 -225
  1090. package/evals/benchmark/format-output.ts +0 -215
  1091. package/evals/benchmark/gen-evals.ts +0 -294
  1092. package/evals/benchmark/gen-repo-eval.ts +0 -71
  1093. package/evals/benchmark/judge.ts +0 -308
  1094. package/evals/benchmark/lessons-extractor.ts +0 -247
  1095. package/evals/benchmark/main-hard-tasks.ts +0 -49
  1096. package/evals/benchmark/main-single-eval.ts +0 -23
  1097. package/evals/benchmark/main.ts +0 -29
  1098. package/evals/benchmark/meta-analyzer.ts +0 -329
  1099. package/evals/benchmark/pick-commits.ts +0 -627
  1100. package/evals/benchmark/run-benchmark.ts +0 -657
  1101. package/evals/benchmark/runners/claude.ts +0 -176
  1102. package/evals/benchmark/runners/codex.ts +0 -143
  1103. package/evals/benchmark/runners/index.ts +0 -4
  1104. package/evals/benchmark/runners/opencode.ts +0 -253
  1105. package/evals/benchmark/runners/runner.ts +0 -13
  1106. package/evals/benchmark/runners/savant.ts +0 -148
  1107. package/evals/benchmark/setup-test-repo.ts +0 -314
  1108. package/evals/benchmark/trace-analyzer.ts +0 -257
  1109. package/evals/benchmark/trace-utils.ts +0 -80
  1110. package/evals/benchmark/types.ts +0 -83
  1111. package/evals/bunfig.toml +0 -4
  1112. package/evals/logger.ts +0 -87
  1113. package/evals/package.json +0 -31
  1114. package/evals/subagents/test-repo-utils.ts +0 -131
  1115. package/evals/tsconfig.json +0 -13
  1116. package/evals/v2/README.md +0 -149
  1117. package/evals/v2/reports/report.json +0 -261
  1118. package/evals/v2/reports/report.md +0 -15
  1119. package/evals/v2/schema/task.schema.json +0 -172
  1120. package/evals/v2/src/cli.ts +0 -216
  1121. package/evals/v2/src/golden.ts +0 -73
  1122. package/evals/v2/src/harness.ts +0 -293
  1123. package/evals/v2/src/metrics.ts +0 -326
  1124. package/evals/v2/src/registry.ts +0 -179
  1125. package/evals/v2/src/reports.ts +0 -126
  1126. package/evals/v2/src/runner.ts +0 -143
  1127. package/evals/v2/src/runners/savant.ts +0 -105
  1128. package/evals/v2/src/sandbox.ts +0 -42
  1129. package/evals/v2/src/sandboxes/docker.ts +0 -49
  1130. package/evals/v2/src/sandboxes/tempdir.ts +0 -120
  1131. package/evals/v2/src/schema.ts +0 -83
  1132. package/evals/v2/src/trace.ts +0 -186
  1133. package/evals/v2/src/verify.ts +0 -199
  1134. package/evals/v2/tasks/error_recovery/env-fault/calculator.js +0 -11
  1135. package/evals/v2/tasks/error_recovery/env-fault/calculator.test.js +0 -15
  1136. package/evals/v2/tasks/error_recovery/env-fault/golden.patch +0 -15
  1137. package/evals/v2/tasks/error_recovery/env-fault/task.yaml +0 -20
  1138. package/evals/v2/tasks/multi_agent_orchestration/options-contract/app.js +0 -5
  1139. package/evals/v2/tasks/multi_agent_orchestration/options-contract/app.test.js +0 -7
  1140. package/evals/v2/tasks/multi_agent_orchestration/options-contract/golden.patch +0 -19
  1141. package/evals/v2/tasks/multi_agent_orchestration/options-contract/greet.js +0 -3
  1142. package/evals/v2/tasks/multi_agent_orchestration/options-contract/orchestration.test.js +0 -30
  1143. package/evals/v2/tasks/multi_agent_orchestration/options-contract/task.yaml +0 -29
  1144. package/evals/v2/tasks/pure_coding/add-fix/add.js +0 -3
  1145. package/evals/v2/tasks/pure_coding/add-fix/add.test.js +0 -11
  1146. package/evals/v2/tasks/pure_coding/add-fix/golden.patch +0 -7
  1147. package/evals/v2/tasks/pure_coding/add-fix/task.yaml +0 -20
  1148. package/evals/v2/tasks/pure_coding/rename-greet/app.js +0 -5
  1149. package/evals/v2/tasks/pure_coding/rename-greet/app.test.js +0 -32
  1150. package/evals/v2/tasks/pure_coding/rename-greet/golden.patch +0 -19
  1151. package/evals/v2/tasks/pure_coding/rename-greet/greet.js +0 -5
  1152. package/evals/v2/tasks/pure_coding/rename-greet/task.yaml +0 -21
  1153. package/evals/v2/tests/golden.test.ts +0 -104
  1154. package/evals/v2/tests/harness.test.ts +0 -204
  1155. package/evals/v2/tests/metrics.test.ts +0 -353
  1156. package/evals/v2/tests/registry.test.ts +0 -210
  1157. package/evals/v2/tests/reports.test.ts +0 -218
  1158. package/evals/v2/tests/savant-runner.test.ts +0 -218
  1159. package/evals/v2/tests/schema.test.ts +0 -127
  1160. package/evals/v2/tests/tempdir-sandbox.test.ts +0 -49
  1161. package/evals/v2/tests/trace.test.ts +0 -76
  1162. package/evals/v2/tests/verify.test.ts +0 -224
  1163. package/license +0 -202
  1164. package/packages/agent-runtime/README.md +0 -46
  1165. package/packages/agent-runtime/agent_exit +0 -1
  1166. package/packages/agent-runtime/bunfig.toml +0 -2
  1167. package/packages/agent-runtime/package.json +0 -34
  1168. package/packages/agent-runtime/src/__tests__/apply-patch-tool.test.ts +0 -202
  1169. package/packages/agent-runtime/src/__tests__/cost-aggregation.test.ts +0 -397
  1170. package/packages/agent-runtime/src/__tests__/generate-diffs-prompt.test.ts +0 -107
  1171. package/packages/agent-runtime/src/__tests__/get-file-reading-updates.test.ts +0 -59
  1172. package/packages/agent-runtime/src/__tests__/gravity-index-tool.test.ts +0 -501
  1173. package/packages/agent-runtime/src/__tests__/loop-agent-steps.test.ts +0 -1512
  1174. package/packages/agent-runtime/src/__tests__/main-prompt.test.ts +0 -452
  1175. package/packages/agent-runtime/src/__tests__/n-parameter.test.ts +0 -984
  1176. package/packages/agent-runtime/src/__tests__/process-file-block.test.ts +0 -196
  1177. package/packages/agent-runtime/src/__tests__/process-str-replace.test.ts +0 -512
  1178. package/packages/agent-runtime/src/__tests__/programmatic-tool-authorization.test.ts +0 -219
  1179. package/packages/agent-runtime/src/__tests__/prompt-caching-subagents.test.ts +0 -749
  1180. package/packages/agent-runtime/src/__tests__/prompts-schema-handling.test.ts +0 -454
  1181. package/packages/agent-runtime/src/__tests__/propose-tools.test.ts +0 -824
  1182. package/packages/agent-runtime/src/__tests__/read-docs-tool.test.ts +0 -394
  1183. package/packages/agent-runtime/src/__tests__/run-agent-step-prefill.test.ts +0 -161
  1184. package/packages/agent-runtime/src/__tests__/run-agent-step-tools.test.ts +0 -612
  1185. package/packages/agent-runtime/src/__tests__/run-programmatic-step.test.ts +0 -1743
  1186. package/packages/agent-runtime/src/__tests__/sandbox-generator.test.ts +0 -154
  1187. package/packages/agent-runtime/src/__tests__/spawn-agents-image-content.test.ts +0 -354
  1188. package/packages/agent-runtime/src/__tests__/spawn-agents-message-history.test.ts +0 -280
  1189. package/packages/agent-runtime/src/__tests__/spawn-agents-permissions.test.ts +0 -664
  1190. package/packages/agent-runtime/src/__tests__/stream-parser-abort.test.ts +0 -250
  1191. package/packages/agent-runtime/src/__tests__/stream-parser-reasoning.test.ts +0 -194
  1192. package/packages/agent-runtime/src/__tests__/subagent-streaming.test.ts +0 -230
  1193. package/packages/agent-runtime/src/__tests__/test-utils.ts +0 -96
  1194. package/packages/agent-runtime/src/__tests__/thinker-convergence-gate.test.ts +0 -242
  1195. package/packages/agent-runtime/src/__tests__/to-token-count-input-schema.test.ts +0 -81
  1196. package/packages/agent-runtime/src/__tests__/tool-executor-sandbox.test.ts +0 -167
  1197. package/packages/agent-runtime/src/__tests__/tool-stream-parser.test.ts +0 -682
  1198. package/packages/agent-runtime/src/__tests__/tool-validation-error.test.ts +0 -1380
  1199. package/packages/agent-runtime/src/__tests__/web-search-tool.test.ts +0 -402
  1200. package/packages/agent-runtime/src/__tests__/xml-tool-result-ordering.test.ts +0 -264
  1201. package/packages/agent-runtime/src/constants.ts +0 -12
  1202. package/packages/agent-runtime/src/context-compactor.ts +0 -425
  1203. package/packages/agent-runtime/src/find-files/__tests__/request-files-prompt.test.ts +0 -190
  1204. package/packages/agent-runtime/src/find-files/custom-file-picker-config.ts +0 -61
  1205. package/packages/agent-runtime/src/find-files/request-files-prompt.ts +0 -462
  1206. package/packages/agent-runtime/src/generate-diffs-prompt.ts +0 -38
  1207. package/packages/agent-runtime/src/get-file-reading-updates.ts +0 -27
  1208. package/packages/agent-runtime/src/llm-api/__tests__/gemini-with-fallbacks.test.ts +0 -267
  1209. package/packages/agent-runtime/src/llm-api/__tests__/serper-api.test.ts +0 -297
  1210. package/packages/agent-runtime/src/llm-api/claude.ts +0 -7
  1211. package/packages/agent-runtime/src/llm-api/context7-api.ts +0 -290
  1212. package/packages/agent-runtime/src/llm-api/gemini-with-fallbacks.ts +0 -104
  1213. package/packages/agent-runtime/src/llm-api/savant-code-web-api.ts +0 -370
  1214. package/packages/agent-runtime/src/llm-api/serper-api.ts +0 -193
  1215. package/packages/agent-runtime/src/main-prompt.ts +0 -251
  1216. package/packages/agent-runtime/src/mcp-constants.ts +0 -12
  1217. package/packages/agent-runtime/src/mcp.ts +0 -83
  1218. package/packages/agent-runtime/src/process-file-block.ts +0 -118
  1219. package/packages/agent-runtime/src/process-str-replace.ts +0 -213
  1220. package/packages/agent-runtime/src/prompt-agent-stream.ts +0 -119
  1221. package/packages/agent-runtime/src/run-agent-step.ts +0 -1632
  1222. package/packages/agent-runtime/src/run-programmatic-step.ts +0 -633
  1223. package/packages/agent-runtime/src/system-prompt/prompts.ts +0 -215
  1224. package/packages/agent-runtime/src/system-prompt/search-system-prompt.ts +0 -89
  1225. package/packages/agent-runtime/src/system-prompt/truncate-file-tree.ts +0 -414
  1226. package/packages/agent-runtime/src/templates/README.md +0 -160
  1227. package/packages/agent-runtime/src/templates/__tests__/agent-registry.test.ts +0 -489
  1228. package/packages/agent-runtime/src/templates/__tests__/strings.test.ts +0 -465
  1229. package/packages/agent-runtime/src/templates/agent-registry.ts +0 -122
  1230. package/packages/agent-runtime/src/templates/prompts.ts +0 -189
  1231. package/packages/agent-runtime/src/templates/strings.ts +0 -292
  1232. package/packages/agent-runtime/src/templates/types.ts +0 -61
  1233. package/packages/agent-runtime/src/tool-stream-parser.ts +0 -260
  1234. package/packages/agent-runtime/src/tools/filter-tool-set.ts +0 -18
  1235. package/packages/agent-runtime/src/tools/handlers/__tests__/glob.test.ts +0 -331
  1236. package/packages/agent-runtime/src/tools/handlers/__tests__/read-subtree.test.ts +0 -346
  1237. package/packages/agent-runtime/src/tools/handlers/__tests__/run-readonly-command.test.ts +0 -284
  1238. package/packages/agent-runtime/src/tools/handlers/handler-function-type.ts +0 -77
  1239. package/packages/agent-runtime/src/tools/handlers/list.ts +0 -105
  1240. package/packages/agent-runtime/src/tools/handlers/tool/__tests__/checkpoint-store.test.ts +0 -394
  1241. package/packages/agent-runtime/src/tools/handlers/tool/__tests__/skill.test.ts +0 -98
  1242. package/packages/agent-runtime/src/tools/handlers/tool/__tests__/write-file.test.ts +0 -24
  1243. package/packages/agent-runtime/src/tools/handlers/tool/add-message.ts +0 -37
  1244. package/packages/agent-runtime/src/tools/handlers/tool/add-subgoal.ts +0 -30
  1245. package/packages/agent-runtime/src/tools/handlers/tool/apply-patch.ts +0 -120
  1246. package/packages/agent-runtime/src/tools/handlers/tool/ask-user.ts +0 -25
  1247. package/packages/agent-runtime/src/tools/handlers/tool/browser-logs.ts +0 -21
  1248. package/packages/agent-runtime/src/tools/handlers/tool/checkpoint-store.ts +0 -378
  1249. package/packages/agent-runtime/src/tools/handlers/tool/code-search.ts +0 -21
  1250. package/packages/agent-runtime/src/tools/handlers/tool/composio.ts +0 -52
  1251. package/packages/agent-runtime/src/tools/handlers/tool/create-plan.ts +0 -63
  1252. package/packages/agent-runtime/src/tools/handlers/tool/end-turn.ts +0 -15
  1253. package/packages/agent-runtime/src/tools/handlers/tool/find-files.ts +0 -161
  1254. package/packages/agent-runtime/src/tools/handlers/tool/glob.ts +0 -22
  1255. package/packages/agent-runtime/src/tools/handlers/tool/gravity-index.ts +0 -230
  1256. package/packages/agent-runtime/src/tools/handlers/tool/list-directory.ts +0 -22
  1257. package/packages/agent-runtime/src/tools/handlers/tool/lookup-agent-info.ts +0 -105
  1258. package/packages/agent-runtime/src/tools/handlers/tool/propose-str-replace.ts +0 -111
  1259. package/packages/agent-runtime/src/tools/handlers/tool/propose-write-file.ts +0 -89
  1260. package/packages/agent-runtime/src/tools/handlers/tool/proposed-content-store.ts +0 -64
  1261. package/packages/agent-runtime/src/tools/handlers/tool/read-docs.ts +0 -160
  1262. package/packages/agent-runtime/src/tools/handlers/tool/read-files.ts +0 -43
  1263. package/packages/agent-runtime/src/tools/handlers/tool/read-subtree.ts +0 -198
  1264. package/packages/agent-runtime/src/tools/handlers/tool/read-url.ts +0 -21
  1265. package/packages/agent-runtime/src/tools/handlers/tool/render-ui.ts +0 -15
  1266. package/packages/agent-runtime/src/tools/handlers/tool/run-file-change-hooks.ts +0 -20
  1267. package/packages/agent-runtime/src/tools/handlers/tool/run-readonly-command.ts +0 -215
  1268. package/packages/agent-runtime/src/tools/handlers/tool/run-terminal-command.ts +0 -33
  1269. package/packages/agent-runtime/src/tools/handlers/tool/sequential-thinking.ts +0 -53
  1270. package/packages/agent-runtime/src/tools/handlers/tool/set-messages.ts +0 -19
  1271. package/packages/agent-runtime/src/tools/handlers/tool/set-output.ts +0 -104
  1272. package/packages/agent-runtime/src/tools/handlers/tool/set-scaffold-complete.ts +0 -32
  1273. package/packages/agent-runtime/src/tools/handlers/tool/skill.ts +0 -146
  1274. package/packages/agent-runtime/src/tools/handlers/tool/spawn-agent-inline.ts +0 -149
  1275. package/packages/agent-runtime/src/tools/handlers/tool/spawn-agent-utils.ts +0 -436
  1276. package/packages/agent-runtime/src/tools/handlers/tool/spawn-agents.ts +0 -286
  1277. package/packages/agent-runtime/src/tools/handlers/tool/str-replace.ts +0 -135
  1278. package/packages/agent-runtime/src/tools/handlers/tool/suggest-followups.ts +0 -20
  1279. package/packages/agent-runtime/src/tools/handlers/tool/task-completed.ts +0 -15
  1280. package/packages/agent-runtime/src/tools/handlers/tool/think-deeply.ts +0 -25
  1281. package/packages/agent-runtime/src/tools/handlers/tool/transition-phase.ts +0 -160
  1282. package/packages/agent-runtime/src/tools/handlers/tool/update-subgoal.ts +0 -48
  1283. package/packages/agent-runtime/src/tools/handlers/tool/web-search.ts +0 -151
  1284. package/packages/agent-runtime/src/tools/handlers/tool/write-file.ts +0 -281
  1285. package/packages/agent-runtime/src/tools/handlers/tool/write-todos.ts +0 -19
  1286. package/packages/agent-runtime/src/tools/prompts.ts +0 -233
  1287. package/packages/agent-runtime/src/tools/sandbox/__tests__/engine.test.ts +0 -169
  1288. package/packages/agent-runtime/src/tools/sandbox/__tests__/shell-denylist.test.ts +0 -104
  1289. package/packages/agent-runtime/src/tools/sandbox/engine.ts +0 -109
  1290. package/packages/agent-runtime/src/tools/sandbox/index.ts +0 -14
  1291. package/packages/agent-runtime/src/tools/sandbox/shell-denylist.ts +0 -119
  1292. package/packages/agent-runtime/src/tools/stream-parser.ts +0 -407
  1293. package/packages/agent-runtime/src/tools/thinker-convergence-gate.ts +0 -162
  1294. package/packages/agent-runtime/src/tools/thought-session-store.ts +0 -43
  1295. package/packages/agent-runtime/src/tools/tool-executor.ts +0 -1098
  1296. package/packages/agent-runtime/src/util/__tests__/messages.test.ts +0 -995
  1297. package/packages/agent-runtime/src/util/__tests__/parse-tool-calls-from-text.test.ts +0 -363
  1298. package/packages/agent-runtime/src/util/__tests__/simplify-tool-results.test.ts +0 -382
  1299. package/packages/agent-runtime/src/util/__tests__/stream-xml-parser.test.ts +0 -285
  1300. package/packages/agent-runtime/src/util/__tests__/think-tags.test.ts +0 -49
  1301. package/packages/agent-runtime/src/util/__tests__/token-counter.test.ts +0 -121
  1302. package/packages/agent-runtime/src/util/activity-tracking.ts +0 -252
  1303. package/packages/agent-runtime/src/util/agent-output.ts +0 -102
  1304. package/packages/agent-runtime/src/util/cache-debug.ts +0 -330
  1305. package/packages/agent-runtime/src/util/format-value.ts +0 -16
  1306. package/packages/agent-runtime/src/util/messages.ts +0 -461
  1307. package/packages/agent-runtime/src/util/parse-tool-calls-from-text.ts +0 -122
  1308. package/packages/agent-runtime/src/util/render-read-files-result.ts +0 -18
  1309. package/packages/agent-runtime/src/util/simplify-tool-results.ts +0 -61
  1310. package/packages/agent-runtime/src/util/stream-xml-parser.ts +0 -259
  1311. package/packages/agent-runtime/src/util/think-tags.ts +0 -33
  1312. package/packages/agent-runtime/src/util/token-counter.ts +0 -136
  1313. package/packages/agent-runtime/tsconfig.json +0 -8
  1314. package/packages/code-map/README.md +0 -43
  1315. package/packages/code-map/__tests__/integration.test.ts +0 -278
  1316. package/packages/code-map/__tests__/languages.test.ts +0 -240
  1317. package/packages/code-map/__tests__/parse.test.ts +0 -640
  1318. package/packages/code-map/__tests__/test-langs/test.c +0 -42
  1319. package/packages/code-map/__tests__/test-langs/test.cpp +0 -34
  1320. package/packages/code-map/__tests__/test-langs/test.cs +0 -34
  1321. package/packages/code-map/__tests__/test-langs/test.go +0 -27
  1322. package/packages/code-map/__tests__/test-langs/test.java +0 -31
  1323. package/packages/code-map/__tests__/test-langs/test.js +0 -50
  1324. package/packages/code-map/__tests__/test-langs/test.php +0 -34
  1325. package/packages/code-map/__tests__/test-langs/test.py +0 -25
  1326. package/packages/code-map/__tests__/test-langs/test.rb +0 -28
  1327. package/packages/code-map/__tests__/test-langs/test.rs +0 -28
  1328. package/packages/code-map/__tests__/test-langs/test.ts +0 -31
  1329. package/packages/code-map/package.json +0 -33
  1330. package/packages/code-map/src/index.ts +0 -4
  1331. package/packages/code-map/src/init-node.ts +0 -185
  1332. package/packages/code-map/src/languages.ts +0 -344
  1333. package/packages/code-map/src/parse.ts +0 -410
  1334. package/packages/code-map/src/tree-sitter-queries/readme.md +0 -24
  1335. package/packages/code-map/src/tree-sitter-queries/tree-sitter-c-tags.scm +0 -16
  1336. package/packages/code-map/src/tree-sitter-queries/tree-sitter-c_sharp-tags.scm +0 -23
  1337. package/packages/code-map/src/tree-sitter-queries/tree-sitter-cpp-tags.scm +0 -29
  1338. package/packages/code-map/src/tree-sitter-queries/tree-sitter-go-tags.scm +0 -26
  1339. package/packages/code-map/src/tree-sitter-queries/tree-sitter-java-tags.scm +0 -19
  1340. package/packages/code-map/src/tree-sitter-queries/tree-sitter-javascript-tags.scm +0 -16
  1341. package/packages/code-map/src/tree-sitter-queries/tree-sitter-php-tags.scm +0 -23
  1342. package/packages/code-map/src/tree-sitter-queries/tree-sitter-python-tags.scm +0 -12
  1343. package/packages/code-map/src/tree-sitter-queries/tree-sitter-ruby-tags.scm +0 -58
  1344. package/packages/code-map/src/tree-sitter-queries/tree-sitter-rust-tags.scm +0 -26
  1345. package/packages/code-map/src/tree-sitter-queries/tree-sitter-typescript-tags.scm +0 -22
  1346. package/packages/code-map/src/types.ts +0 -11
  1347. package/packages/code-map/src/utils.ts +0 -12
  1348. package/packages/code-map/tsconfig.json +0 -10
  1349. package/packages/database/README.md +0 -43
  1350. package/packages/database/package.json +0 -28
  1351. package/packages/database/src/__tests__/service.test.ts +0 -167
  1352. package/packages/database/src/index.ts +0 -146
  1353. package/packages/database/src/service.ts +0 -342
  1354. package/packages/database/tsconfig.json +0 -9
  1355. package/packages/llm-providers/README.md +0 -42
  1356. package/packages/llm-providers/package.json +0 -42
  1357. package/packages/llm-providers/src/ollama/__tests__/detect.test.ts +0 -59
  1358. package/packages/llm-providers/src/ollama/detect.ts +0 -113
  1359. package/packages/llm-providers/src/ollama/index.ts +0 -2
  1360. package/packages/llm-providers/src/openai-compatible/chat/convert-to-openai-compatible-chat-messages.test.ts +0 -855
  1361. package/packages/llm-providers/src/openai-compatible/chat/convert-to-openai-compatible-chat-messages.ts +0 -177
  1362. package/packages/llm-providers/src/openai-compatible/chat/get-response-metadata.ts +0 -15
  1363. package/packages/llm-providers/src/openai-compatible/chat/map-openai-compatible-finish-reason.ts +0 -19
  1364. package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-api-types.ts +0 -60
  1365. package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-chat-language-model.test.ts +0 -549
  1366. package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-chat-language-model.ts +0 -474
  1367. package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-chat-options.ts +0 -25
  1368. package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-metadata-extractor.ts +0 -49
  1369. package/packages/llm-providers/src/openai-compatible/chat/openai-compatible-prepare-tools.ts +0 -162
  1370. package/packages/llm-providers/src/openai-compatible/chat/stream-transform.test.ts +0 -106
  1371. package/packages/llm-providers/src/openai-compatible/chat/stream-transform.ts +0 -585
  1372. package/packages/llm-providers/src/openai-compatible/completion/convert-to-openai-compatible-completion-prompt.ts +0 -98
  1373. package/packages/llm-providers/src/openai-compatible/completion/openai-compatible-completion-language-model.test.ts +0 -173
  1374. package/packages/llm-providers/src/openai-compatible/completion/openai-compatible-completion-language-model.ts +0 -414
  1375. package/packages/llm-providers/src/openai-compatible/completion/openai-compatible-completion-options.ts +0 -33
  1376. package/packages/llm-providers/src/openai-compatible/embedding/openai-compatible-embedding-model.ts +0 -143
  1377. package/packages/llm-providers/src/openai-compatible/embedding/openai-compatible-embedding-options.ts +0 -21
  1378. package/packages/llm-providers/src/openai-compatible/image/openai-compatible-image-model.ts +0 -129
  1379. package/packages/llm-providers/src/openai-compatible/image/openai-compatible-image-settings.ts +0 -1
  1380. package/packages/llm-providers/src/openai-compatible/index.ts +0 -27
  1381. package/packages/llm-providers/src/openai-compatible/openai-compatible-error.ts +0 -34
  1382. package/packages/llm-providers/src/openai-compatible/openai-compatible-provider.ts +0 -174
  1383. package/packages/llm-providers/src/openai-compatible/version.ts +0 -5
  1384. package/packages/llm-providers/tsconfig.json +0 -9
  1385. package/protocol.config.yaml +0 -113
  1386. package/savant-free/README.md +0 -73
  1387. package/savant-free/SPEC.md +0 -385
  1388. package/savant-free/cli/build.ts +0 -49
  1389. package/savant-free/cli/release/README.md +0 -55
  1390. package/savant-free/cli/release/index.js +0 -37
  1391. package/savant-free/cli/release/package.json +0 -43
  1392. package/savant-free/cli/release.ts +0 -128
  1393. package/savant-free/cli/smoke-test.test.ts +0 -257
  1394. package/savant-free/e2e/README.md +0 -173
  1395. package/savant-free/e2e/agent/savant-free-tester.ts +0 -52
  1396. package/savant-free/e2e/tests/ads-behavior.e2e.test.ts +0 -51
  1397. package/savant-free/e2e/tests/agent-startup.e2e.test.ts +0 -61
  1398. package/savant-free/e2e/tests/code-edit.e2e.test.ts +0 -78
  1399. package/savant-free/e2e/tests/help-command.e2e.test.ts +0 -97
  1400. package/savant-free/e2e/tests/knowledge-file.e2e.test.ts +0 -66
  1401. package/savant-free/e2e/tests/slash-commands.e2e.test.ts +0 -119
  1402. package/savant-free/e2e/tests/startup.e2e.test.ts +0 -56
  1403. package/savant-free/e2e/tests/terminal-command.e2e.test.ts +0 -71
  1404. package/savant-free/e2e/tests/version.e2e.test.ts +0 -50
  1405. package/savant-free/e2e/utils/binary-helpers.ts +0 -24
  1406. package/savant-free/e2e/utils/index.ts +0 -17
  1407. package/savant-free/e2e/utils/savant-free-session.ts +0 -229
  1408. package/savant-free/e2e/utils/tmux-custom-tools.ts +0 -156
  1409. package/savant-free/e2e/utils/tmux-helpers.ts +0 -79
  1410. package/savant-free/package.json +0 -20
  1411. package/scripts/eslint-rules/__fixtures__/debug-ast.mjs +0 -20
  1412. package/scripts/eslint-rules/__fixtures__/probe.mjs +0 -41
  1413. package/scripts/eslint-rules/__fixtures__/probe2.mjs +0 -43
  1414. package/scripts/eslint-rules/__fixtures__/rule-test.mjs +0 -44
  1415. package/scripts/eslint-rules/__fixtures__/rule-test2.mjs +0 -27
  1416. package/scripts/eslint-rules/__fixtures__/unknown-bad.ts +0 -21
  1417. package/scripts/eslint-rules/__fixtures__/unknown-good.ts +0 -35
  1418. package/scripts/eslint-rules/no-unknown-in-signatures.js +0 -141
  1419. package/scripts/release.py +0 -360
  1420. package/scripts/run-az-test.sh +0 -1150
  1421. package/scripts/sync-agents.py +0 -337
  1422. package/scripts/tmux/README.md +0 -359
  1423. package/scripts/tmux/package.json +0 -9
  1424. package/scripts/tmux/tmux-capture.sh +0 -231
  1425. package/scripts/tmux/tmux-cli.sh +0 -160
  1426. package/scripts/tmux/tmux-env.sh +0 -34
  1427. package/scripts/tmux/tmux-send.sh +0 -339
  1428. package/scripts/tmux/tmux-start.sh +0 -264
  1429. package/scripts/tmux/tmux-stop.sh +0 -157
  1430. package/scripts/tmux/tmux-viewer/README.md +0 -254
  1431. package/scripts/tmux/tmux-viewer/components/session-viewer.tsx +0 -556
  1432. package/scripts/tmux/tmux-viewer/components/theme.ts +0 -54
  1433. package/scripts/tmux/tmux-viewer/gif-encoder-2.d.ts +0 -28
  1434. package/scripts/tmux/tmux-viewer/gif-exporter.ts +0 -278
  1435. package/scripts/tmux/tmux-viewer/index.tsx +0 -237
  1436. package/scripts/tmux/tmux-viewer/package.json +0 -9
  1437. package/scripts/tmux/tmux-viewer/session-loader.ts +0 -234
  1438. package/scripts/tmux/tmux-viewer/tsconfig.json +0 -9
  1439. package/scripts/tmux/tmux-viewer/types.ts +0 -76
  1440. package/sdk/CHANGELOG.md +0 -126
  1441. package/sdk/PUBLISHING.md +0 -55
  1442. package/sdk/README.md +0 -334
  1443. package/sdk/bunfig.toml +0 -6
  1444. package/sdk/e2e/README.md +0 -158
  1445. package/sdk/e2e/custom-agents/api-integration-agent.e2e.test.ts +0 -145
  1446. package/sdk/e2e/custom-agents/apply-patch-tool.e2e.test.ts +0 -62
  1447. package/sdk/e2e/custom-agents/database-query-agent.e2e.test.ts +0 -135
  1448. package/sdk/e2e/custom-agents/weather-agent.e2e.test.ts +0 -120
  1449. package/sdk/e2e/examples/code-explainer.example.ts +0 -62
  1450. package/sdk/e2e/examples/code-reviewer.example.ts +0 -52
  1451. package/sdk/e2e/examples/commit-message-generator.example.ts +0 -61
  1452. package/sdk/e2e/examples/sdk-lint.example.ts +0 -65
  1453. package/sdk/e2e/examples/sdk-refactor.example.ts +0 -63
  1454. package/sdk/e2e/examples/sdk-test-gen.example.ts +0 -62
  1455. package/sdk/e2e/features/knowledge-files.e2e.test.ts +0 -82
  1456. package/sdk/e2e/features/max-agent-steps.e2e.test.ts +0 -65
  1457. package/sdk/e2e/features/project-files.e2e.test.ts +0 -80
  1458. package/sdk/e2e/integration/connection-check.integration.test.ts +0 -33
  1459. package/sdk/e2e/integration/event-ordering.integration.test.ts +0 -186
  1460. package/sdk/e2e/integration/event-types.integration.test.ts +0 -183
  1461. package/sdk/e2e/integration/stream-chunks.integration.test.ts +0 -191
  1462. package/sdk/e2e/streaming/concurrent-streams.e2e.test.ts +0 -164
  1463. package/sdk/e2e/streaming/subagent-streaming.e2e.test.ts +0 -158
  1464. package/sdk/e2e/utils/__tests__/event-collector.test.ts +0 -297
  1465. package/sdk/e2e/utils/e2e-mocks.ts +0 -458
  1466. package/sdk/e2e/utils/event-collector.ts +0 -145
  1467. package/sdk/e2e/utils/get-api-key.ts +0 -76
  1468. package/sdk/e2e/utils/index.ts +0 -3
  1469. package/sdk/e2e/utils/test-fixtures.ts +0 -196
  1470. package/sdk/e2e/workflows/error-recovery.e2e.test.ts +0 -112
  1471. package/sdk/e2e/workflows/multi-turn-conversation.e2e.test.ts +0 -132
  1472. package/sdk/examples/readme-example-1.ts +0 -34
  1473. package/sdk/examples/readme-example-2.ts +0 -76
  1474. package/sdk/package.json +0 -82
  1475. package/sdk/scripts/build.ts +0 -349
  1476. package/sdk/scripts/fetch-ripgrep.ts +0 -172
  1477. package/sdk/scripts/publish.ts +0 -51
  1478. package/sdk/scripts/release.js +0 -100
  1479. package/sdk/scripts/verify.ts +0 -204
  1480. package/sdk/sdk_exit +0 -1
  1481. package/sdk/smoke-test-dist.ts +0 -248
  1482. package/sdk/src/__tests__/apply-overrides-resume.test.ts +0 -83
  1483. package/sdk/src/__tests__/apply-patch.test.ts +0 -438
  1484. package/sdk/src/__tests__/build-file-tree.test.ts +0 -31
  1485. package/sdk/src/__tests__/change-file.test.ts +0 -212
  1486. package/sdk/src/__tests__/client.test.ts +0 -142
  1487. package/sdk/src/__tests__/clone-session-state.test.ts +0 -158
  1488. package/sdk/src/__tests__/code-search.test.ts +0 -896
  1489. package/sdk/src/__tests__/composio.test.ts +0 -86
  1490. package/sdk/src/__tests__/credentials.test.ts +0 -344
  1491. package/sdk/src/__tests__/database.test.ts +0 -153
  1492. package/sdk/src/__tests__/env.test.ts +0 -137
  1493. package/sdk/src/__tests__/error-utils.test.ts +0 -253
  1494. package/sdk/src/__tests__/fixtures/windows-stubborn-grandchild.ts +0 -26
  1495. package/sdk/src/__tests__/initial-session-state.test.ts +0 -447
  1496. package/sdk/src/__tests__/knowledge-file-selection.test.ts +0 -335
  1497. package/sdk/src/__tests__/load-agents.test.ts +0 -935
  1498. package/sdk/src/__tests__/load-mcp-config.test.ts +0 -285
  1499. package/sdk/src/__tests__/load-skills.test.ts +0 -325
  1500. package/sdk/src/__tests__/model-provider.test.ts +0 -44
  1501. package/sdk/src/__tests__/path-utils.test.ts +0 -66
  1502. package/sdk/src/__tests__/read-files.test.ts +0 -573
  1503. package/sdk/src/__tests__/read-url.test.ts +0 -371
  1504. package/sdk/src/__tests__/researcher-web.integration.test.ts +0 -130
  1505. package/sdk/src/__tests__/run-cancellation.test.ts +0 -1321
  1506. package/sdk/src/__tests__/run-error-preserves-history.test.ts +0 -335
  1507. package/sdk/src/__tests__/run-event-dispatch.test.ts +0 -80
  1508. package/sdk/src/__tests__/run-file-filter.test.ts +0 -530
  1509. package/sdk/src/__tests__/run-handle-event.test.ts +0 -142
  1510. package/sdk/src/__tests__/run-mcp-tool-filter.test.ts +0 -124
  1511. package/sdk/src/__tests__/run-state-child-process.test.ts +0 -72
  1512. package/sdk/src/__tests__/run-terminal-command.test.ts +0 -236
  1513. package/sdk/src/__tests__/run.integration.test.ts +0 -170
  1514. package/sdk/src/__tests__/user-knowledge-files.test.ts +0 -361
  1515. package/sdk/src/__tests__/validate-agents.test.ts +0 -943
  1516. package/sdk/src/agents/load-agents.ts +0 -339
  1517. package/sdk/src/agents/load-mcp-config.ts +0 -275
  1518. package/sdk/src/client.ts +0 -87
  1519. package/sdk/src/composio.ts +0 -78
  1520. package/sdk/src/constants.ts +0 -29
  1521. package/sdk/src/credentials.ts +0 -303
  1522. package/sdk/src/custom-tool.ts +0 -66
  1523. package/sdk/src/env.ts +0 -116
  1524. package/sdk/src/error-utils.ts +0 -127
  1525. package/sdk/src/impl/__tests__/llm-chatgpt-oauth-policy.test.ts +0 -67
  1526. package/sdk/src/impl/__tests__/llm-native-tool-call.test.ts +0 -38
  1527. package/sdk/src/impl/__tests__/llm-stream-yielded-content.test.ts +0 -118
  1528. package/sdk/src/impl/__tests__/model-provider-free-mode.test.ts +0 -166
  1529. package/sdk/src/impl/__tests__/prompt-result.test.ts +0 -210
  1530. package/sdk/src/impl/__tests__/provider-options-metadata.test.ts +0 -67
  1531. package/sdk/src/impl/agent-runtime.ts +0 -159
  1532. package/sdk/src/impl/chatgpt-backend-fetch.ts +0 -588
  1533. package/sdk/src/impl/database.ts +0 -516
  1534. package/sdk/src/impl/llm.ts +0 -852
  1535. package/sdk/src/impl/model-provider.ts +0 -638
  1536. package/sdk/src/impl/openrouter-key-resolver.ts +0 -78
  1537. package/sdk/src/index.ts +0 -133
  1538. package/sdk/src/native/ripgrep.ts +0 -141
  1539. package/sdk/src/retry-config.ts +0 -51
  1540. package/sdk/src/run-state.ts +0 -897
  1541. package/sdk/src/run.ts +0 -1222
  1542. package/sdk/src/skills/load-skills.ts +0 -253
  1543. package/sdk/src/testing/env.ts +0 -19
  1544. package/sdk/src/tools/apply-patch.ts +0 -690
  1545. package/sdk/src/tools/change-file.ts +0 -155
  1546. package/sdk/src/tools/code-search.ts +0 -547
  1547. package/sdk/src/tools/glob.ts +0 -58
  1548. package/sdk/src/tools/index.ts +0 -19
  1549. package/sdk/src/tools/list-directory.ts +0 -52
  1550. package/sdk/src/tools/path-utils.ts +0 -101
  1551. package/sdk/src/tools/read-files.ts +0 -110
  1552. package/sdk/src/tools/read-url.ts +0 -469
  1553. package/sdk/src/tools/run-file-change-hooks.ts +0 -22
  1554. package/sdk/src/tools/run-terminal-command.ts +0 -483
  1555. package/sdk/src/tools/ssrf.ts +0 -120
  1556. package/sdk/src/types/env.ts +0 -40
  1557. package/sdk/src/utils/logger.ts +0 -15
  1558. package/sdk/src/validate-agents.ts +0 -157
  1559. package/sdk/test/cjs-compatibility/package-lock.json +0 -423
  1560. package/sdk/test/cjs-compatibility/package.json +0 -21
  1561. package/sdk/test/cjs-compatibility/test-imports.js +0 -77
  1562. package/sdk/test/cjs-compatibility/test-types.ts +0 -54
  1563. package/sdk/test/cjs-compatibility/tsconfig.json +0 -17
  1564. package/sdk/test/esm-compatibility/package-lock.json +0 -423
  1565. package/sdk/test/esm-compatibility/package.json +0 -21
  1566. package/sdk/test/esm-compatibility/test-imports.js +0 -83
  1567. package/sdk/test/esm-compatibility/test-types.ts +0 -59
  1568. package/sdk/test/esm-compatibility/tsconfig.json +0 -17
  1569. package/sdk/test/ripgrep-bundling/package-lock.json +0 -423
  1570. package/sdk/test/ripgrep-bundling/package.json +0 -21
  1571. package/sdk/test/ripgrep-bundling/test-ripgrep-types.ts +0 -132
  1572. package/sdk/test/ripgrep-bundling/test-ripgrep.js +0 -257
  1573. package/sdk/test/ripgrep-bundling/tsconfig.json +0 -15
  1574. package/sdk/test/setup-env.ts +0 -54
  1575. package/sdk/test/test-sdk.ts +0 -25
  1576. package/sdk/test/tree-sitter-queries/package-lock.json +0 -47
  1577. package/sdk/test/tree-sitter-queries/package.json +0 -12
  1578. package/sdk/test/tree-sitter-queries/test-query-files.js +0 -256
  1579. package/sdk/tsconfig.build.json +0 -32
  1580. package/sdk/tsconfig.json +0 -27
  1581. package/sdk/vendor/ripgrep/arm64-darwin/rg +0 -0
  1582. package/sdk/vendor/ripgrep/arm64-linux/rg +0 -0
  1583. package/sdk/vendor/ripgrep/x64-darwin/rg +0 -0
  1584. package/sdk/vendor/ripgrep/x64-linux/rg +0 -0
  1585. package/sdk/vendor/ripgrep/x64-win32/rg.exe +0 -0
  1586. package/templates/FID-TEMPLATE.md +0 -125
  1587. package/templates/README-TEMPLATE.md +0 -87
  1588. package/templates/SESSION-SUMMARY.md +0 -135
  1589. package/tsconfig.base.json +0 -18
  1590. package/tsconfig.json +0 -27
  1591. /package/{cli/release-core/http.js → http.js} +0 -0
@@ -1,1851 +0,0 @@
1
- import { createPaymentRequiredError } from '@savant-code/sdk'
2
- import { describe, expect, test, mock, beforeEach, afterEach } from 'bun:test'
3
-
4
- import type { ChatMessage } from '../../../types/chat'
5
- import type { SendMessageTimerController } from '../../../utils/send-message-timer'
6
- import type { StreamStatus } from '../../use-message-queue'
7
- import type { RunState } from '@savant-code/sdk'
8
-
9
- // Ensure required env vars exist so logger/env parsing succeeds in tests
10
- const ensureEnv = () => {
11
- process.env.NEXT_PUBLIC_CB_ENVIRONMENT =
12
- process.env.NEXT_PUBLIC_CB_ENVIRONMENT || 'test'
13
- process.env.NEXT_PUBLIC_SAVANT_CODE_APP_URL =
14
- process.env.NEXT_PUBLIC_SAVANT_CODE_APP_URL ||
15
- 'https://app.savant-code.test'
16
- process.env.NEXT_PUBLIC_SUPPORT_EMAIL =
17
- process.env.NEXT_PUBLIC_SUPPORT_EMAIL || 'support@savant-code.test'
18
- process.env.NEXT_PUBLIC_POSTHOG_API_KEY =
19
- process.env.NEXT_PUBLIC_POSTHOG_API_KEY || 'phc_test_key'
20
- process.env.NEXT_PUBLIC_POSTHOG_HOST_URL =
21
- process.env.NEXT_PUBLIC_POSTHOG_HOST_URL ||
22
- 'https://posthog.savant-code.test'
23
- process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY =
24
- process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY || 'pk_test_123'
25
- process.env.NEXT_PUBLIC_STRIPE_CUSTOMER_PORTAL =
26
- process.env.NEXT_PUBLIC_STRIPE_CUSTOMER_PORTAL ||
27
- 'https://stripe.savant-code.test'
28
- process.env.NEXT_PUBLIC_WEB_PORT = process.env.NEXT_PUBLIC_WEB_PORT || '3000'
29
- }
30
-
31
- ensureEnv()
32
-
33
- const { useChatStore } = await import('../../../state/chat-store')
34
- const { createStreamController } = await import('../../stream-state')
35
- const {
36
- setupStreamingContext,
37
- handleRunCompletion,
38
- handleRunError,
39
- finalizeQueueState,
40
- resetEarlyReturnState,
41
- } = await import('../send-message')
42
- const { createBatchedMessageUpdater } =
43
- await import('../../../utils/message-updater')
44
-
45
- const createMockTimerController = (): SendMessageTimerController & {
46
- startCalls: string[]
47
- stopCalls: Array<'success' | 'error' | 'aborted'>
48
- } => {
49
- const startCalls: string[] = []
50
- const stopCalls: Array<'success' | 'error' | 'aborted'> = []
51
-
52
- return {
53
- startCalls,
54
- stopCalls,
55
- start: (messageId: string) => {
56
- startCalls.push(messageId)
57
- },
58
- stop: (outcome: 'success' | 'error' | 'aborted') => {
59
- stopCalls.push(outcome)
60
- return { finishedAt: Date.now(), elapsedMs: 100 }
61
- },
62
- pause: () => {},
63
- resume: () => {},
64
- isActive: () => startCalls.length > stopCalls.length,
65
- }
66
- }
67
-
68
- const createBaseMessages = (): ChatMessage[] => [
69
- {
70
- id: 'ai-1',
71
- variant: 'ai',
72
- content: 'Partial streamed content',
73
- blocks: [{ type: 'text', content: 'Some text' }],
74
- timestamp: 'now',
75
- },
76
- ]
77
-
78
- describe('setupStreamingContext', () => {
79
- describe('abort flow', () => {
80
- test('abort handler appends interruption notice, marks complete, and releases chain lock', () => {
81
- let messages = createBaseMessages()
82
- const streamRefs = createStreamController()
83
- const timerController = createMockTimerController()
84
- const abortControllerRef = { current: null as AbortController | null }
85
- let _streamStatus: StreamStatus = 'idle'
86
- let _canProcessQueue = false
87
- let _chainInProgress = true
88
- let isRetrying = true
89
-
90
- const { updater, abortController } = setupStreamingContext({
91
- aiMessageId: 'ai-1',
92
- timerController,
93
- setMessages: (fn: any) => {
94
- messages = fn(messages)
95
- },
96
- streamRefs,
97
- abortControllerRef,
98
- setStreamStatus: (status: StreamStatus) => {
99
- _streamStatus = status
100
- },
101
- setCanProcessQueue: (can: boolean) => {
102
- _canProcessQueue = can
103
- },
104
- updateChainInProgress: (value: boolean) => {
105
- _chainInProgress = value
106
- },
107
- setIsRetrying: (value: boolean) => {
108
- isRetrying = value
109
- },
110
- setStreamingAgents: () => {},
111
- })
112
-
113
- // Trigger abort
114
- abortController.abort()
115
-
116
- // Verify wasAbortedByUser is set
117
- expect(streamRefs.state.wasAbortedByUser).toBe(true)
118
-
119
- // Verify stream status reset for UI feedback
120
- expect(_streamStatus).toBe('idle')
121
-
122
- // Chain lock is released immediately so new messages can be sent directly
123
- expect(_chainInProgress).toBe(false)
124
- expect(_canProcessQueue).toBe(true)
125
-
126
- // Verify retrying reset
127
- expect(isRetrying).toBe(false)
128
-
129
- // Verify timer stopped with 'aborted' outcome
130
- expect(timerController.stopCalls).toContain('aborted')
131
-
132
- // Flush any pending updates to check interruption notice
133
- updater.flush()
134
-
135
- // Verify interruption notice appended (the message should have been updated)
136
- const aiMessage = messages.find((m: ChatMessage) => m.id === 'ai-1')
137
- expect(aiMessage).toBeDefined()
138
-
139
- // The interruption notice should be added to blocks
140
- const lastBlock = aiMessage!.blocks?.[aiMessage!.blocks.length - 1]
141
- expect(lastBlock?.type).toBe('text')
142
- const textBlock = lastBlock as { type: 'text'; content: string }
143
- expect(textBlock?.content).toContain('[response interrupted]')
144
-
145
- // Verify message marked complete
146
- expect(aiMessage!.isComplete).toBe(true)
147
- })
148
-
149
- test('abort sets _canProcessQueue based on queue pause state', () => {
150
- let messages = createBaseMessages()
151
- const streamRefs = createStreamController()
152
- const timerController = createMockTimerController()
153
- const abortControllerRef = { current: null as AbortController | null }
154
- const isQueuePausedRef = { current: true }
155
- let _canProcessQueue = false
156
- let _canProcessQueueCallCount = 0
157
-
158
- const { abortController } = setupStreamingContext({
159
- aiMessageId: 'ai-1',
160
- timerController,
161
- setMessages: (fn: any) => {
162
- messages = fn(messages)
163
- },
164
- streamRefs,
165
- abortControllerRef,
166
- setStreamStatus: () => {},
167
- setCanProcessQueue: (can: boolean) => {
168
- _canProcessQueue = can
169
- _canProcessQueueCallCount++
170
- },
171
- isQueuePausedRef,
172
- updateChainInProgress: () => {},
173
- setIsRetrying: () => {},
174
- setStreamingAgents: () => {},
175
- })
176
-
177
- // Trigger abort
178
- abortController.abort()
179
-
180
- // Abort handler sets _canProcessQueue respecting queue pause state
181
- expect(_canProcessQueueCallCount).toBe(1)
182
- // Queue was paused, so _canProcessQueue stays false
183
- expect(_canProcessQueue).toBe(false)
184
- })
185
-
186
- test('abort resets isProcessingQueueRef', () => {
187
- let messages = createBaseMessages()
188
- const streamRefs = createStreamController()
189
- const timerController = createMockTimerController()
190
- const abortControllerRef = { current: null as AbortController | null }
191
- const isProcessingQueueRef = { current: true }
192
-
193
- const { abortController } = setupStreamingContext({
194
- aiMessageId: 'ai-1',
195
- timerController,
196
- setMessages: (fn: any) => {
197
- messages = fn(messages)
198
- },
199
- streamRefs,
200
- abortControllerRef,
201
- setStreamStatus: () => {},
202
- setCanProcessQueue: () => {},
203
- isProcessingQueueRef,
204
- updateChainInProgress: () => {},
205
- setIsRetrying: () => {},
206
- setStreamingAgents: () => {},
207
- })
208
-
209
- // Verify ref starts as true
210
- expect(isProcessingQueueRef.current).toBe(true)
211
-
212
- // Trigger abort
213
- abortController.abort()
214
-
215
- // isProcessingQueueRef is reset by abort handler so new messages can be sent
216
- expect(isProcessingQueueRef.current).toBe(false)
217
- })
218
-
219
- test('abort releases chain lock and processing state, respects queue pause', () => {
220
- let messages = createBaseMessages()
221
- const streamRefs = createStreamController()
222
- const timerController = createMockTimerController()
223
- const abortControllerRef = { current: null as AbortController | null }
224
- const isProcessingQueueRef = { current: true }
225
- const isQueuePausedRef = { current: true }
226
- let _streamStatus = 'streaming' as StreamStatus
227
- let _canProcessQueue = true
228
- let _chainInProgress = true
229
- let isRetrying = true
230
-
231
- const { abortController } = setupStreamingContext({
232
- aiMessageId: 'ai-1',
233
- timerController,
234
- setMessages: (fn: any) => {
235
- messages = fn(messages)
236
- },
237
- streamRefs,
238
- abortControllerRef,
239
- setStreamStatus: (status) => {
240
- _streamStatus = status
241
- },
242
- setCanProcessQueue: (can) => {
243
- _canProcessQueue = can
244
- },
245
- isQueuePausedRef,
246
- isProcessingQueueRef,
247
- updateChainInProgress: (value) => {
248
- _chainInProgress = value
249
- },
250
- setIsRetrying: (value) => {
251
- isRetrying = value
252
- },
253
- setStreamingAgents: () => {},
254
- })
255
-
256
- // Sanity check initial state
257
- expect(isProcessingQueueRef.current).toBe(true)
258
- expect(isQueuePausedRef.current).toBe(true)
259
- expect(_streamStatus).toBe('streaming')
260
- expect(_canProcessQueue).toBe(true)
261
- expect(_chainInProgress).toBe(true)
262
- expect(isRetrying).toBe(true)
263
-
264
- // Trigger abort
265
- abortController.abort()
266
-
267
- // After abort, chain lock and processing lock are released immediately
268
- // so new messages can be sent directly instead of being queued.
269
- expect(isProcessingQueueRef.current).toBe(false)
270
- expect(_canProcessQueue).toBe(false) // Respects isQueuePausedRef (true)
271
- expect(_chainInProgress).toBe(false) // Released immediately
272
- expect(isRetrying).toBe(false)
273
- expect(_streamStatus).toBe('idle')
274
- })
275
-
276
- test('abort handler stores abortController in ref', () => {
277
- let messages = createBaseMessages()
278
- const streamRefs = createStreamController()
279
- const timerController = createMockTimerController()
280
- const abortControllerRef = { current: null as AbortController | null }
281
-
282
- const { abortController } = setupStreamingContext({
283
- aiMessageId: 'ai-1',
284
- timerController,
285
- setMessages: (fn: any) => {
286
- messages = fn(messages)
287
- },
288
- streamRefs,
289
- abortControllerRef,
290
- setStreamStatus: () => {},
291
- setCanProcessQueue: () => {},
292
- updateChainInProgress: () => {},
293
- setIsRetrying: () => {},
294
- setStreamingAgents: () => {},
295
- })
296
-
297
- // Verify abortController is stored in ref
298
- expect(abortControllerRef.current).toBe(abortController)
299
- })
300
-
301
- test('setupStreamingContext resets streamRefs and starts timer', () => {
302
- let messages = createBaseMessages()
303
- const streamRefs = createStreamController()
304
- // Pre-populate some state
305
- streamRefs.state.rootStreamBuffer = 'some old content'
306
- streamRefs.state.rootStreamSeen = true
307
-
308
- const timerController = createMockTimerController()
309
- const abortControllerRef = { current: null as AbortController | null }
310
-
311
- setupStreamingContext({
312
- aiMessageId: 'ai-1',
313
- timerController,
314
- setMessages: (fn: any) => {
315
- messages = fn(messages)
316
- },
317
- streamRefs,
318
- abortControllerRef,
319
- setStreamStatus: () => {},
320
- setCanProcessQueue: () => {},
321
- updateChainInProgress: () => {},
322
- setIsRetrying: () => {},
323
- setStreamingAgents: () => {},
324
- })
325
-
326
- // Verify streamRefs was reset
327
- expect(streamRefs.state.rootStreamBuffer).toBe('')
328
- expect(streamRefs.state.rootStreamSeen).toBe(false)
329
-
330
- // Verify timer was started with correct message ID
331
- expect(timerController.startCalls).toContain('ai-1')
332
- })
333
- })
334
- })
335
-
336
- describe('handleRunCompletion', () => {
337
- describe('abort path', () => {
338
- test('skips finalizeQueueState when wasAbortedByUser is true (abort handler already released locks)', () => {
339
- const timerController = createMockTimerController()
340
- let messages = createBaseMessages()
341
- const updater = createBatchedMessageUpdater('ai-1', (fn: any) => {
342
- messages = fn(messages)
343
- })
344
-
345
- // These simulate state that was already cleaned up by the abort handler
346
- let _streamStatus: StreamStatus = 'idle'
347
- let _canProcessQueue = true
348
- let _chainInProgress = false
349
- const isProcessingQueueRef = { current: false }
350
- const isQueuePausedRef = { current: false }
351
- let _hasReceivedPlanResponse = false
352
-
353
- // Track if setters are called (they shouldn't be)
354
- let setStreamStatusCalled = false
355
- let setCanProcessQueueCalled = false
356
- let updateChainInProgressCalled = false
357
-
358
- const runState = {
359
- traceSessionId: 'trace-test',
360
- sessionState: undefined,
361
- output: { type: 'lastMessage' as const, value: [] },
362
- }
363
-
364
- handleRunCompletion({
365
- runState,
366
- actualCredits: undefined,
367
- agentMode: 'EDIT',
368
- timerController,
369
- updater,
370
- aiMessageId: 'ai-1',
371
- wasAbortedByUser: true,
372
- setStreamStatus: (status: StreamStatus) => {
373
- setStreamStatusCalled = true
374
- _streamStatus = status
375
- },
376
- setCanProcessQueue: (can: boolean) => {
377
- setCanProcessQueueCalled = true
378
- _canProcessQueue = can
379
- },
380
- updateChainInProgress: (value: boolean) => {
381
- updateChainInProgressCalled = true
382
- _chainInProgress = value
383
- },
384
- setHasReceivedPlanResponse: (value: boolean) => {
385
- _hasReceivedPlanResponse = value
386
- },
387
- isProcessingQueueRef,
388
- isQueuePausedRef,
389
- })
390
-
391
- // handleRunCompletion should NOT call finalizeQueueState for aborted runs
392
- // (the abort handler already released the locks)
393
- expect(setStreamStatusCalled).toBe(false)
394
- expect(setCanProcessQueueCalled).toBe(false)
395
- expect(updateChainInProgressCalled).toBe(false)
396
- })
397
-
398
- test('does not process server response when wasAbortedByUser is true', () => {
399
- const timerController = createMockTimerController()
400
- let messages = createBaseMessages()
401
- const updater = createBatchedMessageUpdater('ai-1', (fn: any) => {
402
- messages = fn(messages)
403
- })
404
-
405
- let _hasReceivedPlanResponse = false
406
-
407
- const runState = {
408
- traceSessionId: 'trace-test',
409
- sessionState: undefined,
410
- output: {
411
- type: 'lastMessage' as const,
412
- value: [
413
- {
414
- role: 'assistant' as const,
415
- content: [
416
- {
417
- type: 'text' as const,
418
- text: 'Server response that should be ignored',
419
- },
420
- ],
421
- },
422
- ],
423
- },
424
- }
425
-
426
- handleRunCompletion({
427
- runState,
428
- actualCredits: 42,
429
- agentMode: 'SCAFFOLD',
430
- timerController,
431
- updater,
432
- aiMessageId: 'ai-1',
433
- wasAbortedByUser: true,
434
- setStreamStatus: () => {},
435
- setCanProcessQueue: () => {},
436
- updateChainInProgress: () => {},
437
- setHasReceivedPlanResponse: (value: boolean) => {
438
- _hasReceivedPlanResponse = value
439
- },
440
- })
441
-
442
- // Should NOT set plan response (abort path returns early before processing output)
443
- expect(_hasReceivedPlanResponse).toBe(false)
444
-
445
- // Timer should NOT be stopped by handleRunCompletion (abort handler already stopped it)
446
- expect(timerController.stopCalls).not.toContain('success')
447
- expect(timerController.stopCalls).not.toContain('error')
448
- })
449
-
450
- test('does not call resumeQueue in abort path (abort handler already released locks)', () => {
451
- const timerController = createMockTimerController()
452
- let messages = createBaseMessages()
453
- const updater = createBatchedMessageUpdater('ai-1', (fn: any) => {
454
- messages = fn(messages)
455
- })
456
-
457
- let resumeQueueCalled = false
458
- let _canProcessQueueCalled = false
459
-
460
- const runState = {
461
- traceSessionId: 'trace-test',
462
- sessionState: undefined,
463
- output: { type: 'lastMessage' as const, value: [] },
464
- }
465
-
466
- handleRunCompletion({
467
- runState,
468
- actualCredits: undefined,
469
- agentMode: 'EDIT',
470
- timerController,
471
- updater,
472
- aiMessageId: 'ai-1',
473
- wasAbortedByUser: true,
474
- setStreamStatus: () => {},
475
- setCanProcessQueue: () => {
476
- _canProcessQueueCalled = true
477
- },
478
- updateChainInProgress: () => {},
479
- setHasReceivedPlanResponse: () => {},
480
- resumeQueue: () => {
481
- resumeQueueCalled = true
482
- },
483
- })
484
-
485
- // Neither should be called - abort handler already handled cleanup
486
- expect(resumeQueueCalled).toBe(false)
487
- expect(_canProcessQueueCalled).toBe(false)
488
- })
489
- })
490
- })
491
-
492
- describe('finalizeQueueState', () => {
493
- test('sets stream status to idle and resets queue state', () => {
494
- let _streamStatus = 'streaming' as StreamStatus
495
- let _canProcessQueue = false
496
- let _chainInProgress = true
497
- const isProcessingQueueRef = { current: true }
498
-
499
- finalizeQueueState({
500
- setStreamStatus: (status) => {
501
- _streamStatus = status
502
- },
503
- setCanProcessQueue: (can) => {
504
- _canProcessQueue = can
505
- },
506
- updateChainInProgress: (value) => {
507
- _chainInProgress = value
508
- },
509
- isProcessingQueueRef,
510
- })
511
-
512
- expect(_streamStatus).toBe('idle')
513
- expect(_canProcessQueue).toBe(true)
514
- expect(_chainInProgress).toBe(false)
515
- expect(isProcessingQueueRef.current).toBe(false)
516
- })
517
-
518
- test('calls resumeQueue instead of setCanProcessQueue when provided', () => {
519
- let _streamStatus = 'streaming' as StreamStatus
520
- let _canProcessQueueCalled = false
521
- let resumeQueueCalled = false
522
- let _chainInProgress = true
523
-
524
- finalizeQueueState({
525
- setStreamStatus: (status) => {
526
- _streamStatus = status
527
- },
528
- setCanProcessQueue: () => {
529
- _canProcessQueueCalled = true
530
- },
531
- updateChainInProgress: (value) => {
532
- _chainInProgress = value
533
- },
534
- resumeQueue: () => {
535
- resumeQueueCalled = true
536
- },
537
- })
538
-
539
- expect(_streamStatus).toBe('idle')
540
- expect(resumeQueueCalled).toBe(true)
541
- expect(_canProcessQueueCalled).toBe(false)
542
- expect(_chainInProgress).toBe(false)
543
- })
544
-
545
- test('respects isQueuePausedRef when no resumeQueue provided', () => {
546
- let _canProcessQueue = true
547
- const isQueuePausedRef = { current: true }
548
-
549
- finalizeQueueState({
550
- setStreamStatus: () => {},
551
- setCanProcessQueue: (can) => {
552
- _canProcessQueue = can
553
- },
554
- updateChainInProgress: () => {},
555
- isQueuePausedRef,
556
- })
557
-
558
- // When queue was paused before streaming, _canProcessQueue should be false
559
- expect(_canProcessQueue).toBe(false)
560
- })
561
- })
562
-
563
- describe('handleRunError', () => {
564
- let originalGetState: typeof useChatStore.getState
565
-
566
- beforeEach(() => {
567
- originalGetState = useChatStore.getState
568
- })
569
-
570
- afterEach(() => {
571
- useChatStore.getState = originalGetState
572
- })
573
-
574
- test('stores error in userError field for regular errors', () => {
575
- let messages: ChatMessage[] = [
576
- {
577
- id: 'ai-1',
578
- variant: 'ai',
579
- content: 'Partial streamed content',
580
- blocks: [],
581
- timestamp: 'now',
582
- },
583
- ]
584
-
585
- const timerController = createMockTimerController()
586
- const updater = createBatchedMessageUpdater('ai-1', (fn: any) => {
587
- messages = fn(messages)
588
- })
589
-
590
- let _streamStatus: StreamStatus = 'idle'
591
- let _canProcessQueue = false
592
- let _chainInProgress = true
593
- let isRetrying = true
594
-
595
- handleRunError({
596
- error: new Error('Network timeout'),
597
- timerController,
598
- updater,
599
- setIsRetrying: (value: boolean) => {
600
- isRetrying = value
601
- },
602
- setStreamStatus: (status: StreamStatus) => {
603
- _streamStatus = status
604
- },
605
- setCanProcessQueue: (can: boolean) => {
606
- _canProcessQueue = can
607
- },
608
- updateChainInProgress: (value: boolean) => {
609
- _chainInProgress = value
610
- },
611
- })
612
-
613
- const aiMessage = messages.find((m) => m.id === 'ai-1')
614
- expect(aiMessage).toBeDefined()
615
-
616
- // Content should be preserved, error stored in userError
617
- expect(aiMessage!.content).toBe('Partial streamed content')
618
- expect(aiMessage!.userError).toBe('Network timeout')
619
-
620
- // Verify state resets
621
- expect(_streamStatus).toBe('idle')
622
- expect(_canProcessQueue).toBe(true)
623
- expect(_chainInProgress).toBe(false)
624
- expect(isRetrying).toBe(false)
625
-
626
- // Verify timer stopped with error
627
- expect(timerController.stopCalls).toContain('error')
628
-
629
- // Verify message marked complete
630
- expect(aiMessage!.isComplete).toBe(true)
631
- })
632
-
633
- test('handles empty existing content gracefully', () => {
634
- let messages: ChatMessage[] = [
635
- {
636
- id: 'ai-1',
637
- variant: 'ai',
638
- content: '',
639
- blocks: [],
640
- timestamp: 'now',
641
- },
642
- ]
643
-
644
- const timerController = createMockTimerController()
645
- const updater = createBatchedMessageUpdater('ai-1', (fn: any) => {
646
- messages = fn(messages)
647
- })
648
-
649
- handleRunError({
650
- error: new Error('Something failed'),
651
- timerController,
652
- updater,
653
- setIsRetrying: () => {},
654
- setStreamStatus: () => {},
655
- setCanProcessQueue: () => {},
656
- updateChainInProgress: () => {},
657
- })
658
-
659
- const aiMessage = messages.find((m) => m.id === 'ai-1')
660
- // Error should be in userError field
661
- expect(aiMessage!.userError).toBe('Something failed')
662
- expect(aiMessage!.isComplete).toBe(true)
663
- })
664
-
665
- test('handles regular errors without switching input mode', () => {
666
- let messages: ChatMessage[] = [
667
- {
668
- id: 'ai-1',
669
- variant: 'ai',
670
- content: '',
671
- blocks: [],
672
- timestamp: 'now',
673
- },
674
- ]
675
-
676
- const timerController = createMockTimerController()
677
- const updater = createBatchedMessageUpdater('ai-1', (fn: any) => {
678
- messages = fn(messages)
679
- })
680
-
681
- const setInputModeMock = mock(() => {})
682
- useChatStore.getState = () => ({
683
- ...originalGetState(),
684
- setInputMode: setInputModeMock,
685
- })
686
-
687
- handleRunError({
688
- error: new Error('Regular error'),
689
- timerController,
690
- updater,
691
- setIsRetrying: () => {},
692
- setStreamStatus: () => {},
693
- setCanProcessQueue: () => {},
694
- updateChainInProgress: () => {},
695
- })
696
-
697
- // Should NOT switch input mode for regular errors
698
- expect(setInputModeMock).not.toHaveBeenCalled()
699
- })
700
-
701
- test('resets isProcessingQueueRef to false on error', () => {
702
- let messages: ChatMessage[] = [
703
- {
704
- id: 'ai-1',
705
- variant: 'ai',
706
- content: '',
707
- blocks: [],
708
- timestamp: 'now',
709
- },
710
- ]
711
-
712
- const timerController = createMockTimerController()
713
- const updater = createBatchedMessageUpdater('ai-1', (fn: any) => {
714
- messages = fn(messages)
715
- })
716
- const isProcessingQueueRef = { current: true }
717
-
718
- // Verify ref starts as true
719
- expect(isProcessingQueueRef.current).toBe(true)
720
-
721
- handleRunError({
722
- error: new Error('Some error'),
723
- timerController,
724
- updater,
725
- setIsRetrying: () => {},
726
- setStreamStatus: () => {},
727
- setCanProcessQueue: () => {},
728
- updateChainInProgress: () => {},
729
- isProcessingQueueRef,
730
- })
731
-
732
- // Verify isProcessingQueueRef is reset to false
733
- expect(isProcessingQueueRef.current).toBe(false)
734
- })
735
-
736
- test('respects isQueuePausedRef when setting _canProcessQueue on error', () => {
737
- let messages: ChatMessage[] = [
738
- {
739
- id: 'ai-1',
740
- variant: 'ai',
741
- content: '',
742
- blocks: [],
743
- timestamp: 'now',
744
- },
745
- ]
746
-
747
- const timerController = createMockTimerController()
748
- const updater = createBatchedMessageUpdater('ai-1', (fn: any) => {
749
- messages = fn(messages)
750
- })
751
- const isQueuePausedRef = { current: true }
752
- let _canProcessQueue = true
753
-
754
- handleRunError({
755
- error: new Error('Some error'),
756
- timerController,
757
- updater,
758
- setIsRetrying: () => {},
759
- setStreamStatus: () => {},
760
- setCanProcessQueue: (can: boolean) => {
761
- _canProcessQueue = can
762
- },
763
- updateChainInProgress: () => {},
764
- isQueuePausedRef,
765
- })
766
-
767
- // When queue was paused before streaming, _canProcessQueue should be false
768
- expect(_canProcessQueue).toBe(false)
769
- })
770
-
771
- test('context length exceeded error (AI_APICallError) stores error in userError and preserves content', () => {
772
- let messages: ChatMessage[] = [
773
- {
774
- id: 'ai-1',
775
- variant: 'ai',
776
- content: 'Partial streamed content before error',
777
- blocks: [{ type: 'text', content: 'some block content' }],
778
- timestamp: 'now',
779
- },
780
- ]
781
-
782
- const timerController = createMockTimerController()
783
- const updater = createBatchedMessageUpdater('ai-1', (fn: any) => {
784
- messages = fn(messages)
785
- })
786
-
787
- // Create an error that matches the real AI_APICallError structure
788
- const contextLengthError = Object.assign(
789
- new Error(
790
- 'This endpoint\'s maximum context length is 200000 tokens. However, you requested about 201209 tokens (158536 of text input, 10673 of tool input, 32000 in the output). Please reduce the length of either one, or use the "middle-out" transform to compress your prompt automatically.',
791
- ),
792
- {
793
- name: 'AI_APICallError',
794
- statusCode: 400,
795
- },
796
- )
797
-
798
- let _streamStatus = 'streaming' as StreamStatus
799
- let _canProcessQueue = false
800
- let _chainInProgress = true
801
- let isRetrying = true
802
-
803
- handleRunError({
804
- error: contextLengthError,
805
- timerController,
806
- updater,
807
- setIsRetrying: (value: boolean) => {
808
- isRetrying = value
809
- },
810
- setStreamStatus: (status: StreamStatus) => {
811
- _streamStatus = status
812
- },
813
- setCanProcessQueue: (can: boolean) => {
814
- _canProcessQueue = can
815
- },
816
- updateChainInProgress: (value: boolean) => {
817
- _chainInProgress = value
818
- },
819
- })
820
-
821
- const aiMessage = messages.find((m) => m.id === 'ai-1')
822
- expect(aiMessage).toBeDefined()
823
-
824
- // Content should be preserved
825
- expect(aiMessage!.content).toBe('Partial streamed content before error')
826
-
827
- // Blocks should be preserved
828
- expect(aiMessage!.blocks).toEqual([
829
- { type: 'text', content: 'some block content' },
830
- ])
831
-
832
- // Error should be stored in userError (displayed in UserErrorBanner)
833
- expect(aiMessage!.userError).toContain(
834
- 'maximum context length is 200000 tokens',
835
- )
836
- expect(aiMessage!.userError).toContain('201209 tokens')
837
-
838
- // Message should be marked complete
839
- expect(aiMessage!.isComplete).toBe(true)
840
-
841
- // State should be reset
842
- expect(_streamStatus).toBe('idle')
843
- expect(_canProcessQueue).toBe(true)
844
- expect(_chainInProgress).toBe(false)
845
- expect(isRetrying).toBe(false)
846
-
847
- // Timer should be stopped with error
848
- expect(timerController.stopCalls).toContain('error')
849
- })
850
-
851
- test('Payment required error (402) uses setError, invalidates queries, and switches input mode', () => {
852
- let messages: ChatMessage[] = [
853
- {
854
- id: 'ai-1',
855
- variant: 'ai',
856
- content: 'Partial streamed content',
857
- blocks: [{ type: 'text', content: 'some block' }],
858
- timestamp: 'now',
859
- },
860
- ]
861
-
862
- const timerController = createMockTimerController()
863
- const updater = createBatchedMessageUpdater('ai-1', (fn: any) => {
864
- messages = fn(messages)
865
- })
866
-
867
- const setInputModeMock = mock(() => {})
868
- useChatStore.getState = () => ({
869
- ...originalGetState(),
870
- setInputMode: setInputModeMock,
871
- })
872
-
873
- const paymentError = createPaymentRequiredError('Out of credits')
874
-
875
- handleRunError({
876
- error: paymentError,
877
- timerController,
878
- updater,
879
- setIsRetrying: () => {},
880
- setStreamStatus: () => {},
881
- setCanProcessQueue: () => {},
882
- updateChainInProgress: () => {},
883
- })
884
-
885
- const aiMessage = messages.find((m) => m.id === 'ai-1')
886
- expect(aiMessage).toBeDefined()
887
-
888
- // For PaymentRequiredError, setError sets userError (not content)
889
- // Content is preserved, error is stored in userError field
890
- expect(aiMessage!.content).toBe('Partial streamed content')
891
- expect(aiMessage!.userError).toContain('Out of credits')
892
-
893
- // Blocks should be preserved for debugging context
894
- expect(aiMessage!.blocks).toEqual([{ type: 'text', content: 'some block' }])
895
-
896
- // Message should be marked complete
897
- expect(aiMessage!.isComplete).toBe(true)
898
-
899
- // Input mode should switch to outOfCredits
900
- expect(setInputModeMock).toHaveBeenCalledWith('outOfCredits')
901
-
902
- // Timer should still be stopped with error
903
- expect(timerController.stopCalls).toContain('error')
904
- })
905
- })
906
-
907
- /**
908
- * CLI-level async race test: reproduces the exact bug scenario where aborting
909
- * run A and attempting run B before A resolves would lose message history.
910
- *
911
- * This test simulates the full lifecycle at the helper level:
912
- * 1. Start run A (setupStreamingContext)
913
- * 2. Abort run A mid-stream
914
- * 3. Attempt run B — verify it's blocked (chain lock held)
915
- * 4. Resolve run A (handleRunCompletion with updated state)
916
- * 5. Verify run B is now unblocked and can use state from A
917
- */
918
- describe('CLI-level race condition: abort run A, attempt run B before A resolves', () => {
919
- /**
920
- * Simulates the queue-processing gate checks from useMessageQueue.processNextMessage.
921
- * Returns true if a queued message would be allowed to proceed.
922
- */
923
- const canQueueProcessNextMessage = (opts: {
924
- isChainInProgress: boolean
925
- _canProcessQueue: boolean
926
- _streamStatus: StreamStatus
927
- isProcessingQueue: boolean
928
- isQueuePaused: boolean
929
- }): boolean => {
930
- if (opts.isQueuePaused) return false
931
- if (!opts._canProcessQueue) return false
932
- if (opts._streamStatus !== 'idle') return false
933
- if (opts.isChainInProgress) return false
934
- if (opts.isProcessingQueue) return false
935
- return true
936
- }
937
-
938
- test('run B can proceed immediately after abort (chain lock released by abort handler)', () => {
939
- // --- Shared mutable state (simulates React refs and state in the CLI) ---
940
- let _streamStatus: StreamStatus = 'idle'
941
- let _canProcessQueue = false
942
- let _chainInProgress = true // Set true at start of sendMessage
943
- const isProcessingQueueRef = { current: false }
944
- const isQueuePausedRef = { current: false }
945
-
946
- const setStreamStatus = (status: StreamStatus) => {
947
- _streamStatus = status
948
- }
949
- const setCanProcessQueue = (can: boolean) => {
950
- _canProcessQueue = can
951
- }
952
- const updateChainInProgress = (value: boolean) => {
953
- _chainInProgress = value
954
- }
955
-
956
- // --- PHASE 1: Start run A (setupStreamingContext) ---
957
- let messagesA = createBaseMessages()
958
- const streamRefsA = createStreamController()
959
- const timerControllerA = createMockTimerController()
960
- const abortControllerRefA = { current: null as AbortController | null }
961
-
962
- const { updater: _updaterA, abortController: abortControllerA } =
963
- setupStreamingContext({
964
- aiMessageId: 'ai-1',
965
- timerController: timerControllerA,
966
- setMessages: (fn: any) => {
967
- messagesA = fn(messagesA)
968
- },
969
- streamRefs: streamRefsA,
970
- abortControllerRef: abortControllerRefA,
971
- setStreamStatus,
972
- setCanProcessQueue,
973
- isQueuePausedRef,
974
- isProcessingQueueRef,
975
- updateChainInProgress,
976
- setIsRetrying: () => {},
977
- setStreamingAgents: () => {},
978
- })
979
-
980
- // Simulate streaming has started
981
- _streamStatus = 'streaming'
982
-
983
- // Verify run A is actively streaming
984
- expect(_streamStatus).toBe('streaming')
985
- expect(_chainInProgress).toBe(true)
986
-
987
- // --- PHASE 2: User aborts run A ---
988
- abortControllerA.abort()
989
-
990
- // Abort handler fires synchronously: UI is updated AND chain lock is released
991
- expect(streamRefsA.state.wasAbortedByUser).toBe(true)
992
- expect(_streamStatus as StreamStatus).toBe('idle')
993
- expect(_chainInProgress).toBe(false) // Chain lock released immediately!
994
- expect(_canProcessQueue).toBe(true)
995
-
996
- // --- PHASE 3: User types run B — verify it's UNBLOCKED ---
997
- const canProcessRunB = canQueueProcessNextMessage({
998
- isChainInProgress: _chainInProgress,
999
- _canProcessQueue,
1000
- _streamStatus,
1001
- isProcessingQueue: isProcessingQueueRef.current,
1002
- isQueuePaused: isQueuePausedRef.current,
1003
- })
1004
-
1005
- // Run B can proceed immediately — this is the core fix.
1006
- // New messages are sent directly instead of being queued.
1007
- expect(canProcessRunB).toBe(true)
1008
- })
1009
-
1010
- test('handleRunCompletion does not interfere after abort (no-op for aborted runs)', () => {
1011
- // After abort releases the chain lock, handleRunCompletion should be a no-op
1012
- // to avoid interfering with any new run that may have started.
1013
-
1014
- let _streamStatus: StreamStatus = 'idle'
1015
- let _canProcessQueue = true
1016
- let _chainInProgress = false // Already released by abort handler
1017
- const isProcessingQueueRef = { current: false }
1018
- const isQueuePausedRef = { current: false }
1019
-
1020
- const timerController = createMockTimerController()
1021
- let messages = createBaseMessages()
1022
- const updater = createBatchedMessageUpdater('ai-1', (fn: any) => {
1023
- messages = fn(messages)
1024
- })
1025
-
1026
- // Track calls
1027
- let setStreamStatusCallCount = 0
1028
- let updateChainInProgressCallCount = 0
1029
-
1030
- const runState: RunState = {
1031
- traceSessionId: 'trace-test',
1032
- sessionState: {} as any,
1033
- output: { type: 'lastMessage' as const, value: [] },
1034
- }
1035
-
1036
- handleRunCompletion({
1037
- runState,
1038
- actualCredits: undefined,
1039
- agentMode: 'EDIT',
1040
- timerController,
1041
- updater,
1042
- aiMessageId: 'ai-1',
1043
- wasAbortedByUser: true,
1044
- setStreamStatus: () => {
1045
- setStreamStatusCallCount++
1046
- },
1047
- setCanProcessQueue: (can: boolean) => {
1048
- _canProcessQueue = can
1049
- },
1050
- updateChainInProgress: () => {
1051
- updateChainInProgressCallCount++
1052
- },
1053
- setHasReceivedPlanResponse: () => {},
1054
- isProcessingQueueRef,
1055
- isQueuePausedRef,
1056
- })
1057
-
1058
- // handleRunCompletion should be a no-op for aborted runs
1059
- expect(setStreamStatusCallCount).toBe(0)
1060
- expect(updateChainInProgressCallCount).toBe(0)
1061
- // State should be unchanged (still in the "released" state from abort handler)
1062
- expect(_chainInProgress).toBe(false)
1063
- expect(_canProcessQueue).toBe(true)
1064
- })
1065
-
1066
- test('aborted run A finally block must not clear isProcessingQueueRef owned by run B', () => {
1067
- // Regression test for overlap hazard: after abort releases the chain lock,
1068
- // run B can start from the queue and set isProcessingQueueRef = true.
1069
- // Run A's late-executing finally block must NOT clear it.
1070
- //
1071
- // This tests the pattern used in use-send-message.ts where the finally block
1072
- // guards isProcessingQueueRef cleanup with !abortController.signal.aborted.
1073
-
1074
- const isProcessingQueueRef = { current: false }
1075
- const isQueuePausedRef = { current: false }
1076
- let _chainInProgress = true
1077
- let _canProcessQueue = false
1078
- let _streamStatus: StreamStatus = 'idle'
1079
-
1080
- // --- Run A setup and abort ---
1081
- let messagesA = createBaseMessages()
1082
- const sharedStreamRefs = createStreamController()
1083
- const timerA = createMockTimerController()
1084
- const abortRefA = { current: null as AbortController | null }
1085
-
1086
- const { abortController: abortA } = setupStreamingContext({
1087
- aiMessageId: 'ai-run-a',
1088
- timerController: timerA,
1089
- setMessages: (fn: any) => {
1090
- messagesA = fn(messagesA)
1091
- },
1092
- streamRefs: sharedStreamRefs,
1093
- abortControllerRef: abortRefA,
1094
- setStreamStatus: (status: StreamStatus) => {
1095
- _streamStatus = status
1096
- },
1097
- setCanProcessQueue: (can: boolean) => {
1098
- _canProcessQueue = can
1099
- },
1100
- isQueuePausedRef,
1101
- isProcessingQueueRef,
1102
- updateChainInProgress: (value: boolean) => {
1103
- _chainInProgress = value
1104
- },
1105
- setIsRetrying: () => {},
1106
- setStreamingAgents: () => {},
1107
- })
1108
-
1109
- // Abort run A
1110
- abortA.abort()
1111
- expect(_chainInProgress).toBe(false)
1112
- expect(isProcessingQueueRef.current).toBe(false)
1113
-
1114
- // --- Run B starts from queue, takes ownership of isProcessingQueueRef ---
1115
- isProcessingQueueRef.current = true // Queue's processNextMessage sets this
1116
- _chainInProgress = true
1117
- _canProcessQueue = false
1118
-
1119
- // --- Simulate run A's finally block (late execution) ---
1120
- // In use-send-message.ts, the finally block guards with !abortController.signal.aborted.
1121
- // Verify abortA.signal.aborted is true so the guard would skip cleanup.
1122
- expect(abortA.signal.aborted).toBe(true)
1123
-
1124
- // The finally block pattern: only clean up if NOT aborted
1125
- if (!abortA.signal.aborted) {
1126
- // This should NOT execute
1127
- isProcessingQueueRef.current = false
1128
- }
1129
-
1130
- // isProcessingQueueRef must still be true (owned by run B)
1131
- expect(isProcessingQueueRef.current).toBe(true)
1132
- // _chainInProgress must still be true (owned by run B)
1133
- expect(_chainInProgress).toBe(true)
1134
- })
1135
-
1136
- test('reject-after-abort must not run handleRunError cleanup that could clobber run B', () => {
1137
- // Regression test: if client.run() rejects after abort (e.g., network teardown),
1138
- // handleRunError should NOT run because it would reset shared queue/stream state
1139
- // that run B may have already claimed.
1140
- //
1141
- // This tests the pattern used in use-send-message.ts where the catch block
1142
- // guards handleRunError with !abortController.signal.aborted.
1143
-
1144
- let _streamStatus: StreamStatus = 'idle'
1145
- let _canProcessQueue = true
1146
- let _chainInProgress = false // Released by abort handler
1147
- const isProcessingQueueRef = { current: false }
1148
- const isQueuePausedRef = { current: false }
1149
-
1150
- // --- Simulate run A was aborted ---
1151
- const abortController = new AbortController()
1152
- abortController.abort()
1153
- expect(abortController.signal.aborted).toBe(true)
1154
-
1155
- // --- Run B has started and claimed shared state ---
1156
- _chainInProgress = true
1157
- _canProcessQueue = false
1158
- isProcessingQueueRef.current = true
1159
- _streamStatus = 'streaming'
1160
-
1161
- // --- Simulate what happens if client.run() rejects after abort ---
1162
- // The catch block pattern: only handle error if NOT aborted
1163
- const error = new Error('AbortError: The operation was aborted')
1164
-
1165
- if (!abortController.signal.aborted) {
1166
- // This should NOT execute — handleRunError would clobber run B's state
1167
- handleRunError({
1168
- error,
1169
- timerController: createMockTimerController(),
1170
- updater: createBatchedMessageUpdater('ai-1', () => {}),
1171
- setIsRetrying: () => {},
1172
- setStreamStatus: (status: StreamStatus) => {
1173
- _streamStatus = status
1174
- },
1175
- setCanProcessQueue: (can: boolean) => {
1176
- _canProcessQueue = can
1177
- },
1178
- updateChainInProgress: (value: boolean) => {
1179
- _chainInProgress = value
1180
- },
1181
- isProcessingQueueRef,
1182
- isQueuePausedRef,
1183
- })
1184
- }
1185
-
1186
- // Run B's state must be untouched
1187
- expect(_chainInProgress).toBe(true) // Still owned by run B
1188
- expect(_canProcessQueue).toBe(false) // Still owned by run B
1189
- expect(isProcessingQueueRef.current).toBe(true) // Still owned by run B
1190
- expect(_streamStatus).toBe('streaming') // Still owned by run B
1191
- })
1192
-
1193
- test('handleRunError WOULD clobber run B state if called without abort guard (documents why guard is needed)', () => {
1194
- // This test proves that handleRunError resets shared state, which is why
1195
- // the catch block in use-send-message.ts MUST guard it with abort check.
1196
-
1197
- let _streamStatus: StreamStatus = 'streaming'
1198
- let _canProcessQueue = false
1199
- let _chainInProgress = true
1200
- const isProcessingQueueRef = { current: true }
1201
- const isQueuePausedRef = { current: false }
1202
-
1203
- // Call handleRunError without guard (simulates the bug scenario)
1204
- handleRunError({
1205
- error: new Error('AbortError'),
1206
- timerController: createMockTimerController(),
1207
- updater: createBatchedMessageUpdater('ai-1', (fn: any) => {}),
1208
- setIsRetrying: () => {},
1209
- setStreamStatus: (status: StreamStatus) => {
1210
- _streamStatus = status
1211
- },
1212
- setCanProcessQueue: (can: boolean) => {
1213
- _canProcessQueue = can
1214
- },
1215
- updateChainInProgress: (value: boolean) => {
1216
- _chainInProgress = value
1217
- },
1218
- isProcessingQueueRef,
1219
- isQueuePausedRef,
1220
- })
1221
-
1222
- // handleRunError resets ALL shared state — this would clobber run B
1223
- expect(_chainInProgress).toBe(false) // Clobbered!
1224
- expect(_canProcessQueue).toBe(true) // Clobbered!
1225
- expect(isProcessingQueueRef.current).toBe(false) // Clobbered!
1226
- expect(_streamStatus as StreamStatus).toBe('idle') // Clobbered!
1227
- })
1228
-
1229
- test('full two-run lifecycle with shared streamRefs: run A abort → run B starts immediately', () => {
1230
- // End-to-end test: two complete runs sharing the SAME streamRefs instance
1231
- // (matching production behavior where streamRefs is reused across sends).
1232
- // Verifies that run B can start immediately after abort, and that run A's
1233
- // late-resolving handleRunCompletion does NOT interfere with run B.
1234
-
1235
- let _streamStatus: StreamStatus = 'idle'
1236
- let _canProcessQueue = false
1237
- let _chainInProgress = true
1238
- const isProcessingQueueRef = { current: false }
1239
- const isQueuePausedRef = { current: false }
1240
- let previousRunState: RunState | null = null
1241
-
1242
- const setStreamStatus = (status: StreamStatus) => {
1243
- _streamStatus = status
1244
- }
1245
- const setCanProcessQueue = (can: boolean) => {
1246
- _canProcessQueue = can
1247
- }
1248
- const updateChainInProgress = (value: boolean) => {
1249
- _chainInProgress = value
1250
- }
1251
-
1252
- // CRITICAL: Use a single shared streamRefs instance, just like production.
1253
- // In production, streamRefsRef is created once via useRef and reused.
1254
- const sharedStreamRefs = createStreamController()
1255
-
1256
- // === RUN A ===
1257
- let messagesA = createBaseMessages()
1258
- const timerA = createMockTimerController()
1259
- const abortRefA = { current: null as AbortController | null }
1260
-
1261
- const { updater: updaterA, abortController: abortA } =
1262
- setupStreamingContext({
1263
- aiMessageId: 'ai-run-a',
1264
- timerController: timerA,
1265
- setMessages: (fn: any) => {
1266
- messagesA = fn(messagesA)
1267
- },
1268
- streamRefs: sharedStreamRefs,
1269
- abortControllerRef: abortRefA,
1270
- setStreamStatus,
1271
- setCanProcessQueue,
1272
- isQueuePausedRef,
1273
- isProcessingQueueRef,
1274
- updateChainInProgress,
1275
- setIsRetrying: () => {},
1276
- setStreamingAgents: () => {},
1277
- })
1278
-
1279
- _streamStatus = 'streaming'
1280
-
1281
- // Abort run A
1282
- abortA.abort()
1283
- expect(_chainInProgress).toBe(false) // Lock released immediately!
1284
- expect(_canProcessQueue).toBe(true)
1285
- expect(sharedStreamRefs.state.wasAbortedByUser).toBe(true)
1286
-
1287
- // === RUN B starts immediately (before A's client.run() resolves) ===
1288
- _chainInProgress = true
1289
- _canProcessQueue = false
1290
-
1291
- let messagesB: ChatMessage[] = [
1292
- {
1293
- id: 'ai-run-b',
1294
- variant: 'ai',
1295
- content: '',
1296
- blocks: [],
1297
- timestamp: 'now',
1298
- },
1299
- ]
1300
- const timerB = createMockTimerController()
1301
- const abortRefB = { current: null as AbortController | null }
1302
-
1303
- // Run B's setupStreamingContext calls sharedStreamRefs.reset(),
1304
- // which clears wasAbortedByUser. This is the key race condition.
1305
- const { updater: updaterB, abortController: abortB } =
1306
- setupStreamingContext({
1307
- aiMessageId: 'ai-run-b',
1308
- timerController: timerB,
1309
- setMessages: (fn: any) => {
1310
- messagesB = fn(messagesB)
1311
- },
1312
- streamRefs: sharedStreamRefs,
1313
- abortControllerRef: abortRefB,
1314
- setStreamStatus,
1315
- setCanProcessQueue,
1316
- isQueuePausedRef,
1317
- isProcessingQueueRef,
1318
- updateChainInProgress,
1319
- setIsRetrying: () => {},
1320
- setStreamingAgents: () => {},
1321
- })
1322
-
1323
- // After B starts, shared streamRefs.wasAbortedByUser is reset to false.
1324
- // This is why we use per-run abortController.signal.aborted instead.
1325
- expect(sharedStreamRefs.state.wasAbortedByUser).toBe(false)
1326
-
1327
- // Now run A's client.run() resolves (after B has already started and reset shared state).
1328
- // handleRunCompletion uses the per-run wasAbortedByUser boolean (from abortA.signal.aborted),
1329
- // NOT the shared streamRefs, so it correctly knows A was aborted.
1330
- const runStateA: RunState = {
1331
- traceSessionId: 'trace-test-a',
1332
- sessionState: {
1333
- id: 'session-abc',
1334
- messages: [
1335
- { role: 'user', content: 'first message' },
1336
- { role: 'assistant', content: 'partial response before cancel' },
1337
- ],
1338
- } as any,
1339
- output: { type: 'lastMessage' as const, value: [] },
1340
- }
1341
- previousRunState = runStateA
1342
-
1343
- handleRunCompletion({
1344
- runState: runStateA,
1345
- actualCredits: undefined,
1346
- agentMode: 'EDIT',
1347
- timerController: timerA,
1348
- updater: updaterA,
1349
- aiMessageId: 'ai-run-a',
1350
- wasAbortedByUser: abortA.signal.aborted, // per-run flag, not shared state
1351
- setStreamStatus,
1352
- setCanProcessQueue,
1353
- updateChainInProgress,
1354
- setHasReceivedPlanResponse: () => {},
1355
- isProcessingQueueRef,
1356
- isQueuePausedRef,
1357
- })
1358
-
1359
- // handleRunCompletion for aborted run A should be a no-op
1360
- // (it should NOT interfere with run B's chain lock)
1361
- expect(_chainInProgress).toBe(true) // Still true from run B!
1362
-
1363
- // Simulate run B completing normally
1364
- const runStateB: RunState = {
1365
- traceSessionId: 'trace-test-b',
1366
- sessionState: {
1367
- id: 'session-abc',
1368
- messages: [
1369
- { role: 'user', content: 'first message' },
1370
- { role: 'assistant', content: 'partial response before cancel' },
1371
- { role: 'user', content: 'second message' },
1372
- { role: 'assistant', content: 'full response to second message' },
1373
- ],
1374
- } as any,
1375
- output: {
1376
- type: 'lastMessage' as const,
1377
- value: [
1378
- {
1379
- role: 'assistant' as const,
1380
- content: [{ type: 'text' as const, text: 'full response' }],
1381
- },
1382
- ],
1383
- },
1384
- }
1385
- previousRunState = runStateB
1386
-
1387
- handleRunCompletion({
1388
- runState: runStateB,
1389
- actualCredits: 5,
1390
- agentMode: 'EDIT',
1391
- timerController: timerB,
1392
- updater: updaterB,
1393
- aiMessageId: 'ai-run-b',
1394
- wasAbortedByUser: abortB.signal.aborted, // per-run flag: false (B was not aborted)
1395
- setStreamStatus,
1396
- setCanProcessQueue,
1397
- updateChainInProgress,
1398
- setHasReceivedPlanResponse: () => {},
1399
- isProcessingQueueRef,
1400
- isQueuePausedRef,
1401
- })
1402
-
1403
- // Final state: run B completed normally
1404
- expect(previousRunState!.sessionState as any).toEqual({
1405
- id: 'session-abc',
1406
- messages: [
1407
- { role: 'user', content: 'first message' },
1408
- { role: 'assistant', content: 'partial response before cancel' },
1409
- { role: 'user', content: 'second message' },
1410
- { role: 'assistant', content: 'full response to second message' },
1411
- ],
1412
- })
1413
- expect(_chainInProgress).toBe(false)
1414
- expect(_canProcessQueue).toBe(true)
1415
- })
1416
- })
1417
-
1418
- /**
1419
- * Tests for early return queue state reset in sendMessage.
1420
- * These test the resetEarlyReturnState helper used across multiple early return paths:
1421
- * - prepareUserMessage exception
1422
- * - validation failure (success: false)
1423
- * - validation exception
1424
- */
1425
- describe('resetEarlyReturnState', () => {
1426
- describe('prepareUserMessage exception path', () => {
1427
- test('resets chain in progress to false', () => {
1428
- let _chainInProgress = true
1429
-
1430
- resetEarlyReturnState({
1431
- updateChainInProgress: (value) => {
1432
- _chainInProgress = value
1433
- },
1434
- setCanProcessQueue: () => {},
1435
- })
1436
-
1437
- expect(_chainInProgress).toBe(false)
1438
- })
1439
-
1440
- test('sets _canProcessQueue to true when queue is not paused', () => {
1441
- let _canProcessQueue = false
1442
- const isQueuePausedRef = { current: false }
1443
-
1444
- resetEarlyReturnState({
1445
- updateChainInProgress: () => {},
1446
- setCanProcessQueue: (can) => {
1447
- _canProcessQueue = can
1448
- },
1449
- isQueuePausedRef,
1450
- })
1451
-
1452
- expect(_canProcessQueue).toBe(true)
1453
- })
1454
-
1455
- test('sets _canProcessQueue to false when queue is paused', () => {
1456
- let _canProcessQueue = true
1457
- const isQueuePausedRef = { current: true }
1458
-
1459
- resetEarlyReturnState({
1460
- updateChainInProgress: () => {},
1461
- setCanProcessQueue: (can) => {
1462
- _canProcessQueue = can
1463
- },
1464
- isQueuePausedRef,
1465
- })
1466
-
1467
- expect(_canProcessQueue).toBe(false)
1468
- })
1469
-
1470
- test('resets isProcessingQueueRef to false', () => {
1471
- const isProcessingQueueRef = { current: true }
1472
-
1473
- resetEarlyReturnState({
1474
- updateChainInProgress: () => {},
1475
- setCanProcessQueue: () => {},
1476
- isProcessingQueueRef,
1477
- })
1478
-
1479
- expect(isProcessingQueueRef.current).toBe(false)
1480
- })
1481
-
1482
- test('handles missing isProcessingQueueRef gracefully', () => {
1483
- // Should not throw when isProcessingQueueRef is undefined
1484
- expect(() => {
1485
- resetEarlyReturnState({
1486
- updateChainInProgress: () => {},
1487
- setCanProcessQueue: () => {},
1488
- })
1489
- }).not.toThrow()
1490
- })
1491
-
1492
- test('handles missing isQueuePausedRef gracefully (defaults to _canProcessQueue=true)', () => {
1493
- let _canProcessQueue = false
1494
-
1495
- resetEarlyReturnState({
1496
- updateChainInProgress: () => {},
1497
- setCanProcessQueue: (can) => {
1498
- _canProcessQueue = can
1499
- },
1500
- // No isQueuePausedRef - should default to !undefined = true
1501
- })
1502
-
1503
- expect(_canProcessQueue).toBe(true)
1504
- })
1505
- })
1506
-
1507
- describe('validation failure path (success: false)', () => {
1508
- test('resets all queue state correctly when processing queued message', () => {
1509
- let _chainInProgress = true
1510
- let _canProcessQueue = false
1511
- const isProcessingQueueRef = { current: true }
1512
- const isQueuePausedRef = { current: false }
1513
-
1514
- resetEarlyReturnState({
1515
- updateChainInProgress: (value) => {
1516
- _chainInProgress = value
1517
- },
1518
- setCanProcessQueue: (can) => {
1519
- _canProcessQueue = can
1520
- },
1521
- isProcessingQueueRef,
1522
- isQueuePausedRef,
1523
- })
1524
-
1525
- expect(_chainInProgress).toBe(false)
1526
- expect(_canProcessQueue).toBe(true)
1527
- expect(isProcessingQueueRef.current).toBe(false)
1528
- })
1529
-
1530
- test('respects queue paused state after validation failure', () => {
1531
- let _chainInProgress = true
1532
- let _canProcessQueue = true
1533
- const isProcessingQueueRef = { current: true }
1534
- const isQueuePausedRef = { current: true }
1535
-
1536
- resetEarlyReturnState({
1537
- updateChainInProgress: (value) => {
1538
- _chainInProgress = value
1539
- },
1540
- setCanProcessQueue: (can) => {
1541
- _canProcessQueue = can
1542
- },
1543
- isProcessingQueueRef,
1544
- isQueuePausedRef,
1545
- })
1546
-
1547
- expect(_chainInProgress).toBe(false)
1548
- expect(_canProcessQueue).toBe(false) // Queue was paused, should stay paused
1549
- expect(isProcessingQueueRef.current).toBe(false)
1550
- })
1551
- })
1552
-
1553
- describe('validation exception path', () => {
1554
- test('resets all queue state correctly when validation throws', () => {
1555
- let _chainInProgress = true
1556
- let _canProcessQueue = false
1557
- const isProcessingQueueRef = { current: true }
1558
- const isQueuePausedRef = { current: false }
1559
-
1560
- // Simulating what happens after catching validation exception
1561
- resetEarlyReturnState({
1562
- updateChainInProgress: (value) => {
1563
- _chainInProgress = value
1564
- },
1565
- setCanProcessQueue: (can) => {
1566
- _canProcessQueue = can
1567
- },
1568
- isProcessingQueueRef,
1569
- isQueuePausedRef,
1570
- })
1571
-
1572
- expect(_chainInProgress).toBe(false)
1573
- expect(_canProcessQueue).toBe(true)
1574
- expect(isProcessingQueueRef.current).toBe(false)
1575
- })
1576
-
1577
- test('preserves queue pause state when validation throws', () => {
1578
- let _canProcessQueue = true
1579
- const isQueuePausedRef = { current: true }
1580
- const isProcessingQueueRef = { current: true }
1581
-
1582
- resetEarlyReturnState({
1583
- updateChainInProgress: () => {},
1584
- setCanProcessQueue: (can) => {
1585
- _canProcessQueue = can
1586
- },
1587
- isProcessingQueueRef,
1588
- isQueuePausedRef,
1589
- })
1590
-
1591
- // Queue was explicitly paused before, should remain paused after error
1592
- expect(_canProcessQueue).toBe(false)
1593
- // But processing lock should be released to allow manual resume
1594
- expect(isProcessingQueueRef.current).toBe(false)
1595
- })
1596
- })
1597
-
1598
- describe('complete early return scenarios', () => {
1599
- test('queue can process next message after prepareUserMessage exception', () => {
1600
- // Scenario: Message was being processed from queue, prepareUserMessage throws
1601
- let _chainInProgress = true
1602
- let _canProcessQueue = false
1603
- const isProcessingQueueRef = { current: true }
1604
- const isQueuePausedRef = { current: false }
1605
-
1606
- // After exception, reset is called
1607
- resetEarlyReturnState({
1608
- updateChainInProgress: (value) => {
1609
- _chainInProgress = value
1610
- },
1611
- setCanProcessQueue: (can) => {
1612
- _canProcessQueue = can
1613
- },
1614
- isProcessingQueueRef,
1615
- isQueuePausedRef,
1616
- })
1617
-
1618
- // Queue should be able to process next message
1619
- expect(_chainInProgress).toBe(false)
1620
- expect(_canProcessQueue).toBe(true)
1621
- expect(isProcessingQueueRef.current).toBe(false)
1622
- })
1623
-
1624
- test('queue can process next message after validation returns success=false', () => {
1625
- // Scenario: Message was being processed, validation returns failure
1626
- let _chainInProgress = true
1627
- let _canProcessQueue = false
1628
- const isProcessingQueueRef = { current: true }
1629
- const isQueuePausedRef = { current: false }
1630
-
1631
- resetEarlyReturnState({
1632
- updateChainInProgress: (value) => {
1633
- _chainInProgress = value
1634
- },
1635
- setCanProcessQueue: (can) => {
1636
- _canProcessQueue = can
1637
- },
1638
- isProcessingQueueRef,
1639
- isQueuePausedRef,
1640
- })
1641
-
1642
- // All locks released, queue can continue
1643
- expect(_chainInProgress).toBe(false)
1644
- expect(_canProcessQueue).toBe(true)
1645
- expect(isProcessingQueueRef.current).toBe(false)
1646
- })
1647
-
1648
- test('queue can process next message after validation throws exception', () => {
1649
- // Scenario: Message was being processed, validation throws
1650
- let _chainInProgress = true
1651
- let _canProcessQueue = false
1652
- const isProcessingQueueRef = { current: true }
1653
- const isQueuePausedRef = { current: false }
1654
-
1655
- resetEarlyReturnState({
1656
- updateChainInProgress: (value) => {
1657
- _chainInProgress = value
1658
- },
1659
- setCanProcessQueue: (can) => {
1660
- _canProcessQueue = can
1661
- },
1662
- isProcessingQueueRef,
1663
- isQueuePausedRef,
1664
- })
1665
-
1666
- // All locks released, queue can continue
1667
- expect(_chainInProgress).toBe(false)
1668
- expect(_canProcessQueue).toBe(true)
1669
- expect(isProcessingQueueRef.current).toBe(false)
1670
- })
1671
-
1672
- test('queue remains blocked after error if user had paused it', () => {
1673
- // Scenario: User paused queue, then an error occurred
1674
- // Queue should remain paused after error recovery
1675
- let _chainInProgress = true
1676
- let _canProcessQueue = true
1677
- const isProcessingQueueRef = { current: true }
1678
- const isQueuePausedRef = { current: true } // User explicitly paused
1679
-
1680
- resetEarlyReturnState({
1681
- updateChainInProgress: (value) => {
1682
- _chainInProgress = value
1683
- },
1684
- setCanProcessQueue: (can) => {
1685
- _canProcessQueue = can
1686
- },
1687
- isProcessingQueueRef,
1688
- isQueuePausedRef,
1689
- })
1690
-
1691
- // Chain is no longer in progress
1692
- expect(_chainInProgress).toBe(false)
1693
- // But queue should remain blocked because user paused it
1694
- expect(_canProcessQueue).toBe(false)
1695
- // Processing lock is released though
1696
- expect(isProcessingQueueRef.current).toBe(false)
1697
- })
1698
- })
1699
- })
1700
-
1701
- describe('savant-free gate errors', () => {
1702
- const makeUpdater = (messages: ChatMessage[]) => {
1703
- const updater = createBatchedMessageUpdater('ai-1', (fn: any) => {
1704
- const next = fn(messages)
1705
- messages.length = 0
1706
- messages.push(...next)
1707
- })
1708
- return updater
1709
- }
1710
-
1711
- const baseMessage = (): ChatMessage[] => [
1712
- {
1713
- id: 'ai-1',
1714
- variant: 'ai',
1715
- content: '',
1716
- blocks: [],
1717
- timestamp: 'now',
1718
- },
1719
- ]
1720
-
1721
- const gateError = (kind: string, statusCode: number) => ({
1722
- error: kind,
1723
- statusCode,
1724
- message: 'server said so',
1725
- })
1726
-
1727
- test('handleRunError maps 409 session_superseded to the restart-required message', () => {
1728
- const messages = baseMessage()
1729
- const updater = makeUpdater(messages)
1730
- handleRunError({
1731
- error: gateError('session_superseded', 409),
1732
- timerController: createMockTimerController(),
1733
- updater,
1734
- setIsRetrying: () => {},
1735
- setStreamStatus: () => {},
1736
- setCanProcessQueue: () => {},
1737
- updateChainInProgress: () => {},
1738
- })
1739
- updater.flush()
1740
- expect(messages[0].userError).toContain('Another savant-free CLI took over')
1741
- })
1742
-
1743
- test('handleRunError suppresses the inline error for 410 session_expired (ended banner takes over)', () => {
1744
- const messages = baseMessage()
1745
- const updater = makeUpdater(messages)
1746
- handleRunError({
1747
- error: gateError('session_expired', 410),
1748
- timerController: createMockTimerController(),
1749
- updater,
1750
- setIsRetrying: () => {},
1751
- setStreamStatus: () => {},
1752
- setCanProcessQueue: () => {},
1753
- updateChainInProgress: () => {},
1754
- })
1755
- updater.flush()
1756
- // New contract: the gate handler flips the session store into `ended`
1757
- // and the session-ended banner is the user-facing signal, so we do NOT
1758
- // also surface an inline userError inside the chat transcript.
1759
- expect(messages[0].userError).toBeUndefined()
1760
- })
1761
-
1762
- test('handleRunError suppresses the inline error for 428 waiting_room_required (ended banner takes over)', () => {
1763
- const messages = baseMessage()
1764
- const updater = makeUpdater(messages)
1765
- handleRunError({
1766
- error: gateError('waiting_room_required', 428),
1767
- timerController: createMockTimerController(),
1768
- updater,
1769
- setIsRetrying: () => {},
1770
- setStreamStatus: () => {},
1771
- setCanProcessQueue: () => {},
1772
- updateChainInProgress: () => {},
1773
- })
1774
- updater.flush()
1775
- expect(messages[0].userError).toBeUndefined()
1776
- })
1777
-
1778
- test('handleRunError maps 429 waiting_room_queued to the session-pending message', () => {
1779
- const messages = baseMessage()
1780
- const updater = makeUpdater(messages)
1781
- handleRunError({
1782
- error: gateError('waiting_room_queued', 429),
1783
- timerController: createMockTimerController(),
1784
- updater,
1785
- setIsRetrying: () => {},
1786
- setStreamStatus: () => {},
1787
- setCanProcessQueue: () => {},
1788
- updateChainInProgress: () => {},
1789
- })
1790
- updater.flush()
1791
- expect(messages[0].userError).toContain('still being set up')
1792
- })
1793
-
1794
- test('handleRunError ignores gate-shaped errors with non-matching status code', () => {
1795
- // An error body with error: 'session_superseded' but a 500 status should
1796
- // NOT be classified as a gate error (prevents generic 5xx from mimicking
1797
- // the structured gate responses).
1798
- const messages = baseMessage()
1799
- const updater = makeUpdater(messages)
1800
- const err = Object.assign(new Error('oops'), {
1801
- error: 'session_superseded',
1802
- statusCode: 500,
1803
- })
1804
- handleRunError({
1805
- error: err,
1806
- timerController: createMockTimerController(),
1807
- updater,
1808
- setIsRetrying: () => {},
1809
- setStreamStatus: () => {},
1810
- setCanProcessQueue: () => {},
1811
- updateChainInProgress: () => {},
1812
- })
1813
- updater.flush()
1814
- expect(messages[0].userError).toBe('oops')
1815
- expect(messages[0].userError).not.toContain('took over')
1816
- })
1817
-
1818
- test('handleRunCompletion with gate error output routes through the gate handler', () => {
1819
- const messages = baseMessage()
1820
- const updater = makeUpdater(messages)
1821
- const runState: RunState = {
1822
- traceSessionId: 'trace-test',
1823
- sessionState: undefined as any,
1824
- output: {
1825
- type: 'error',
1826
- message: 'server said so',
1827
- error: 'session_expired',
1828
- statusCode: 410,
1829
- } as any,
1830
- }
1831
- handleRunCompletion({
1832
- runState,
1833
- actualCredits: undefined,
1834
- agentMode: 'EDIT',
1835
- timerController: createMockTimerController(),
1836
- updater,
1837
- aiMessageId: 'ai-1',
1838
- wasAbortedByUser: false,
1839
- setStreamStatus: () => {},
1840
- setCanProcessQueue: () => {},
1841
- updateChainInProgress: () => {},
1842
- setHasReceivedPlanResponse: () => {},
1843
- })
1844
- updater.flush()
1845
- // 410 is now handled by the ended banner, not an inline error. The
1846
- // assertion here just confirms routing happened via the gate handler
1847
- // (which swallows the userError) rather than the generic error path
1848
- // (which would set a userError from the message).
1849
- expect(messages[0].userError).toBeUndefined()
1850
- })
1851
- })