@bastani/atomic 0.9.21-alpha.1 → 0.9.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 (516) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/dist/builtin/intercom/package.json +1 -1
  3. package/dist/builtin/mcp/package.json +1 -1
  4. package/dist/builtin/subagents/CHANGELOG.md +22 -0
  5. package/dist/builtin/subagents/package.json +1 -1
  6. package/dist/builtin/subagents/src/extension/index.bundle.mjs +292 -60
  7. package/dist/builtin/web-access/package.json +1 -1
  8. package/dist/builtin/workflows/CHANGELOG.md +23 -0
  9. package/dist/builtin/workflows/builtin/adversarial-verification.js +3 -3
  10. package/dist/builtin/workflows/builtin/{chunk-cw86srkf.js → chunk-632fxeb8.js} +1 -1
  11. package/dist/builtin/workflows/builtin/{chunk-w18kbz63.js → chunk-94f8zfz1.js} +1 -1
  12. package/dist/builtin/workflows/builtin/{chunk-kspvwc24.js → chunk-9cm2ckq2.js} +1 -1
  13. package/dist/builtin/workflows/builtin/{chunk-jaj27rqc.js → chunk-a1ar035d.js} +1 -1
  14. package/dist/builtin/workflows/builtin/{chunk-wh19f5ee.js → chunk-d3xhj946.js} +5 -4
  15. package/dist/builtin/workflows/builtin/{chunk-crw7q5g1.js → chunk-gyjck9z8.js} +1 -1
  16. package/dist/builtin/workflows/builtin/{chunk-maqv731g.js → chunk-hj8mh07f.js} +10 -6
  17. package/dist/builtin/workflows/builtin/{chunk-0nrgfbag.js → chunk-kb7s3gx2.js} +1 -1
  18. package/dist/builtin/workflows/builtin/{chunk-73c5tayt.js → chunk-kgn5wz1c.js} +19 -1
  19. package/dist/builtin/workflows/builtin/{chunk-2hak3b7g.js → chunk-nkj4qhj6.js} +1 -1
  20. package/dist/builtin/workflows/builtin/{chunk-bzdvx2xr.js → chunk-r97ndfvt.js} +1 -1
  21. package/dist/builtin/workflows/builtin/{chunk-vkmpdat4.js → chunk-wf876n16.js} +1 -1
  22. package/dist/builtin/workflows/builtin/classify-and-act.js +3 -3
  23. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.js +3 -3
  24. package/dist/builtin/workflows/builtin/generate-and-filter.js +3 -3
  25. package/dist/builtin/workflows/builtin/goal.js +4 -4
  26. package/dist/builtin/workflows/builtin/index.js +12 -12
  27. package/dist/builtin/workflows/builtin/loop-until-done.js +3 -3
  28. package/dist/builtin/workflows/builtin/open-claude-design.js +3 -3
  29. package/dist/builtin/workflows/builtin/ralph.js +4 -4
  30. package/dist/builtin/workflows/builtin/steering-context.js +1 -1
  31. package/dist/builtin/workflows/builtin/tournament.js +3 -3
  32. package/dist/builtin/workflows/package.json +1 -1
  33. package/dist/builtin/workflows/src/extension/index.bundle.mjs +40 -11
  34. package/dist/builtin/workflows/src/index.js +9 -3
  35. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +6 -1
  36. package/dist/cli/auth-command.js +5 -0
  37. package/dist/cli/auth-command.js.map +1 -1
  38. package/dist/cli/credential-print.js +2 -0
  39. package/dist/cli/credential-print.js.map +1 -1
  40. package/dist/cli/experimental/command.js +5 -2
  41. package/dist/cli/experimental/command.js.map +1 -1
  42. package/dist/cli.js +1 -1
  43. package/dist/cli.js.map +1 -1
  44. package/dist/config.d.ts +4 -4
  45. package/dist/config.js +4 -4
  46. package/dist/config.js.map +1 -1
  47. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  48. package/dist/core/agent-session-extension-bindings.js +9 -4
  49. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  50. package/dist/core/agent-session-methods.d.ts +4 -4
  51. package/dist/core/agent-session-methods.d.ts.map +1 -1
  52. package/dist/core/agent-session-methods.js.map +1 -1
  53. package/dist/core/agent-session-prompt.d.ts +4 -4
  54. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  55. package/dist/core/agent-session-prompt.js +38 -15
  56. package/dist/core/agent-session-prompt.js.map +1 -1
  57. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  58. package/dist/core/agent-session-runtime.js +14 -9
  59. package/dist/core/agent-session-runtime.js.map +1 -1
  60. package/dist/core/agent-session-types.d.ts +4 -1
  61. package/dist/core/agent-session-types.d.ts.map +1 -1
  62. package/dist/core/agent-session-types.js.map +1 -1
  63. package/dist/core/agent-session.d.ts +1 -1
  64. package/dist/core/agent-session.d.ts.map +1 -1
  65. package/dist/core/agent-session.js +140 -95
  66. package/dist/core/agent-session.js.map +1 -1
  67. package/dist/core/auth-storage-backends.js +2 -3
  68. package/dist/core/auth-storage-backends.js.map +1 -1
  69. package/dist/core/auth-storage.js +4 -1
  70. package/dist/core/auth-storage.js.map +1 -1
  71. package/dist/core/builtin-resource-loader.js +9 -0
  72. package/dist/core/builtin-resource-loader.js.map +1 -1
  73. package/dist/core/cache-warmer.js +8 -1
  74. package/dist/core/cache-warmer.js.map +1 -1
  75. package/dist/core/compaction/range-planner.js +6 -0
  76. package/dist/core/compaction/range-planner.js.map +1 -1
  77. package/dist/core/execution-model-router.d.ts +13 -3
  78. package/dist/core/execution-model-router.d.ts.map +1 -1
  79. package/dist/core/execution-model-router.js +227 -131
  80. package/dist/core/execution-model-router.js.map +1 -1
  81. package/dist/core/export-html/template-js/entries-navigation.js +16 -6
  82. package/dist/core/export-html/template-js/initialization.js +34 -11
  83. package/dist/core/export-html/template.css +10 -0
  84. package/dist/core/export-html/template.js +50 -17
  85. package/dist/core/extensions/context-types.d.ts +2 -0
  86. package/dist/core/extensions/context-types.d.ts.map +1 -1
  87. package/dist/core/extensions/context-types.js.map +1 -1
  88. package/dist/core/extensions/host-input.js +8 -4
  89. package/dist/core/extensions/host-input.js.map +1 -1
  90. package/dist/core/extensions/reactive-widget.js +1 -0
  91. package/dist/core/extensions/reactive-widget.js.map +1 -1
  92. package/dist/core/extensions/runner-context.d.ts +1 -0
  93. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  94. package/dist/core/extensions/runner-context.js +4 -0
  95. package/dist/core/extensions/runner-context.js.map +1 -1
  96. package/dist/core/extensions/runner.d.ts +1 -0
  97. package/dist/core/extensions/runner.d.ts.map +1 -1
  98. package/dist/core/extensions/runner.js +48 -30
  99. package/dist/core/extensions/runner.js.map +1 -1
  100. package/dist/core/extensions/runtime-types.d.ts +1 -0
  101. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  102. package/dist/core/extensions/runtime-types.js.map +1 -1
  103. package/dist/core/extensions/workflow-activity-hub.js +9 -7
  104. package/dist/core/extensions/workflow-activity-hub.js.map +1 -1
  105. package/dist/core/footer-data-provider.js +24 -23
  106. package/dist/core/footer-data-provider.js.map +1 -1
  107. package/dist/core/keybindings.js +1 -0
  108. package/dist/core/keybindings.js.map +1 -1
  109. package/dist/core/mandatory-resource-loader.js +4 -1
  110. package/dist/core/mandatory-resource-loader.js.map +1 -1
  111. package/dist/core/model-config.js +2 -0
  112. package/dist/core/model-config.js.map +1 -1
  113. package/dist/core/model-registry.js +1 -0
  114. package/dist/core/model-registry.js.map +1 -1
  115. package/dist/core/model-resolver-defaults.js +1 -1
  116. package/dist/core/model-resolver-defaults.js.map +1 -1
  117. package/dist/core/{model-routing-task.d.ts → model-routing-bytes.d.ts} +1 -4
  118. package/dist/core/model-routing-bytes.d.ts.map +1 -0
  119. package/dist/core/model-routing-bytes.js +33 -0
  120. package/dist/core/model-routing-bytes.js.map +1 -0
  121. package/dist/core/model-routing-candidates.d.ts +42 -0
  122. package/dist/core/model-routing-candidates.d.ts.map +1 -0
  123. package/dist/core/model-routing-candidates.js +309 -0
  124. package/dist/core/model-routing-candidates.js.map +1 -0
  125. package/dist/core/model-routing-constraints.d.ts +4 -0
  126. package/dist/core/model-routing-constraints.d.ts.map +1 -1
  127. package/dist/core/model-routing-constraints.js +13 -1
  128. package/dist/core/model-routing-constraints.js.map +1 -1
  129. package/dist/core/model-routing-debug.d.ts +9 -0
  130. package/dist/core/model-routing-debug.d.ts.map +1 -0
  131. package/dist/core/model-routing-debug.js +14 -0
  132. package/dist/core/model-routing-debug.js.map +1 -0
  133. package/dist/core/model-routing-evals.d.ts +50 -0
  134. package/dist/core/model-routing-evals.d.ts.map +1 -0
  135. package/dist/core/model-routing-evals.js +190 -0
  136. package/dist/core/model-routing-evals.js.map +1 -0
  137. package/dist/core/model-routing-needs.d.ts +75 -0
  138. package/dist/core/model-routing-needs.d.ts.map +1 -0
  139. package/dist/core/model-routing-needs.js +176 -0
  140. package/dist/core/model-routing-needs.js.map +1 -0
  141. package/dist/core/model-runtime-streaming.js +3 -0
  142. package/dist/core/model-runtime-streaming.js.map +1 -1
  143. package/dist/core/model-runtime.js +26 -14
  144. package/dist/core/model-runtime.js.map +1 -1
  145. package/dist/core/models-store.js +2 -3
  146. package/dist/core/models-store.js.map +1 -1
  147. package/dist/core/output-guard.js +1 -0
  148. package/dist/core/output-guard.js.map +1 -1
  149. package/dist/core/package-manager-paths.d.ts +2 -1
  150. package/dist/core/package-manager-paths.d.ts.map +1 -1
  151. package/dist/core/package-manager-paths.js +4 -3
  152. package/dist/core/package-manager-paths.js.map +1 -1
  153. package/dist/core/package-manager.js +1 -0
  154. package/dist/core/package-manager.js.map +1 -1
  155. package/dist/core/resource-loader-assets.d.ts.map +1 -1
  156. package/dist/core/resource-loader-assets.js +9 -7
  157. package/dist/core/resource-loader-assets.js.map +1 -1
  158. package/dist/core/resource-loader-core.js +49 -0
  159. package/dist/core/resource-loader-core.js.map +1 -1
  160. package/dist/core/runtime-credentials.js +2 -1
  161. package/dist/core/runtime-credentials.js.map +1 -1
  162. package/dist/core/session-cwd.js +1 -0
  163. package/dist/core/session-cwd.js.map +1 -1
  164. package/dist/core/session-manager-archive.d.ts.map +1 -1
  165. package/dist/core/session-manager-archive.js +4 -2
  166. package/dist/core/session-manager-archive.js.map +1 -1
  167. package/dist/core/session-manager-core.js +11 -7
  168. package/dist/core/session-manager-core.js.map +1 -1
  169. package/dist/core/session-manager-storage.d.ts +10 -4
  170. package/dist/core/session-manager-storage.d.ts.map +1 -1
  171. package/dist/core/session-manager-storage.js +12 -6
  172. package/dist/core/session-manager-storage.js.map +1 -1
  173. package/dist/core/settings-manager-basic-accessors.d.ts +2 -1
  174. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  175. package/dist/core/settings-manager-basic-accessors.js +21 -0
  176. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  177. package/dist/core/settings-manager-core.js +13 -7
  178. package/dist/core/settings-manager-core.js.map +1 -1
  179. package/dist/core/settings-manager.d.ts +1 -1
  180. package/dist/core/settings-manager.d.ts.map +1 -1
  181. package/dist/core/settings-manager.js.map +1 -1
  182. package/dist/core/settings-storage.js +6 -0
  183. package/dist/core/settings-storage.js.map +1 -1
  184. package/dist/core/settings-types.d.ts +8 -0
  185. package/dist/core/settings-types.d.ts.map +1 -1
  186. package/dist/core/settings-types.js.map +1 -1
  187. package/dist/core/structured-output/index.d.ts.map +1 -1
  188. package/dist/core/structured-output/index.js +4 -1
  189. package/dist/core/structured-output/index.js.map +1 -1
  190. package/dist/core/structured-output/invalid-output.js +1 -0
  191. package/dist/core/structured-output/invalid-output.js.map +1 -1
  192. package/dist/core/tasks/agent-adapter.js +5 -3
  193. package/dist/core/tasks/agent-adapter.js.map +1 -1
  194. package/dist/core/tasks/child-command-owner.js +3 -7
  195. package/dist/core/tasks/child-command-owner.js.map +1 -1
  196. package/dist/core/tasks/completion.js +5 -1
  197. package/dist/core/tasks/completion.js.map +1 -1
  198. package/dist/core/tasks/owner-store.js +12 -8
  199. package/dist/core/tasks/owner-store.js.map +1 -1
  200. package/dist/core/tasks/supervisor.js +14 -35
  201. package/dist/core/tasks/supervisor.js.map +1 -1
  202. package/dist/core/tools/ask-user-question/state/build-questionnaire.js +13 -4
  203. package/dist/core/tools/ask-user-question/state/build-questionnaire.js.map +1 -1
  204. package/dist/core/tools/ask-user-question/state/questionnaire-session.js +11 -1
  205. package/dist/core/tools/ask-user-question/state/questionnaire-session.js.map +1 -1
  206. package/dist/core/tools/ask-user-question/view/components/chat-row-view.js +1 -0
  207. package/dist/core/tools/ask-user-question/view/components/chat-row-view.js.map +1 -1
  208. package/dist/core/tools/ask-user-question/view/components/multi-select-view.js +1 -0
  209. package/dist/core/tools/ask-user-question/view/components/multi-select-view.js.map +1 -1
  210. package/dist/core/tools/ask-user-question/view/components/option-list-view.js +1 -0
  211. package/dist/core/tools/ask-user-question/view/components/option-list-view.js.map +1 -1
  212. package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.js +5 -0
  213. package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.js.map +1 -1
  214. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.js +2 -0
  215. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.js.map +1 -1
  216. package/dist/core/tools/ask-user-question/view/components/preview/preview-pane.js +13 -8
  217. package/dist/core/tools/ask-user-question/view/components/preview/preview-pane.js.map +1 -1
  218. package/dist/core/tools/ask-user-question/view/components/submit-picker.js +1 -0
  219. package/dist/core/tools/ask-user-question/view/components/submit-picker.js.map +1 -1
  220. package/dist/core/tools/ask-user-question/view/components/tab-bar.js +1 -0
  221. package/dist/core/tools/ask-user-question/view/components/tab-bar.js.map +1 -1
  222. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js +30 -24
  223. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js.map +1 -1
  224. package/dist/core/tools/ask-user-question/view/dialog-builder.js +5 -0
  225. package/dist/core/tools/ask-user-question/view/dialog-builder.js.map +1 -1
  226. package/dist/core/tools/ask-user-question/view/props-adapter.js +8 -0
  227. package/dist/core/tools/ask-user-question/view/props-adapter.js.map +1 -1
  228. package/dist/core/tools/ask-user-question/view/tab-content-strategy.js +4 -4
  229. package/dist/core/tools/ask-user-question/view/tab-content-strategy.js.map +1 -1
  230. package/dist/core/tools/bash.js +5 -8
  231. package/dist/core/tools/bash.js.map +1 -1
  232. package/dist/core/tools/edit-batch.js +4 -0
  233. package/dist/core/tools/edit-batch.js.map +1 -1
  234. package/dist/core/tools/edit.js +2 -0
  235. package/dist/core/tools/edit.js.map +1 -1
  236. package/dist/core/tools/file-mutation-coordinator.js +9 -0
  237. package/dist/core/tools/file-mutation-coordinator.js.map +1 -1
  238. package/dist/core/tools/find.js +1 -1
  239. package/dist/core/tools/find.js.map +1 -1
  240. package/dist/core/tools/hashline-engine/fs.js +1 -1
  241. package/dist/core/tools/hashline-engine/fs.js.map +1 -1
  242. package/dist/core/tools/hashline-engine/input.js +4 -0
  243. package/dist/core/tools/hashline-engine/input.js.map +1 -1
  244. package/dist/core/tools/hashline-engine/mismatch.js +6 -0
  245. package/dist/core/tools/hashline-engine/mismatch.js.map +1 -1
  246. package/dist/core/tools/hashline-engine/patcher.js +13 -0
  247. package/dist/core/tools/hashline-engine/patcher.js.map +1 -1
  248. package/dist/core/tools/hashline-engine/recovery.js +1 -0
  249. package/dist/core/tools/hashline-engine/recovery.js.map +1 -1
  250. package/dist/core/tools/output-accumulator.js +20 -13
  251. package/dist/core/tools/output-accumulator.js.map +1 -1
  252. package/dist/core/tools/persisted-output-file.js +9 -3
  253. package/dist/core/tools/persisted-output-file.js.map +1 -1
  254. package/dist/core/tools/resource-selectors.js +1 -0
  255. package/dist/core/tools/resource-selectors.js.map +1 -1
  256. package/dist/core/tools/write.js +1 -0
  257. package/dist/core/tools/write.js.map +1 -1
  258. package/dist/core/trust-manager.js +1 -0
  259. package/dist/core/trust-manager.js.map +1 -1
  260. package/dist/core/workflow-stage-admission.js +17 -10
  261. package/dist/core/workflow-stage-admission.js.map +1 -1
  262. package/dist/extensions/llama/client.js +2 -0
  263. package/dist/extensions/llama/client.js.map +1 -1
  264. package/dist/extensions/llama/huggingface-ui.js +17 -9
  265. package/dist/extensions/llama/huggingface-ui.js.map +1 -1
  266. package/dist/extensions/llama/huggingface.js +2 -0
  267. package/dist/extensions/llama/huggingface.js.map +1 -1
  268. package/dist/extensions/llama/ui.js +11 -3
  269. package/dist/extensions/llama/ui.js.map +1 -1
  270. package/dist/index.d.ts +4 -2
  271. package/dist/index.d.ts.map +1 -1
  272. package/dist/index.js +3 -1
  273. package/dist/index.js.map +1 -1
  274. package/dist/modes/interactive/components/armin.js +10 -6
  275. package/dist/modes/interactive/components/armin.js.map +1 -1
  276. package/dist/modes/interactive/components/assistant-message.js +10 -2
  277. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  278. package/dist/modes/interactive/components/atomic-working-status.js +10 -2
  279. package/dist/modes/interactive/components/atomic-working-status.js.map +1 -1
  280. package/dist/modes/interactive/components/bash-execution.js +9 -4
  281. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  282. package/dist/modes/interactive/components/bordered-loader.js +3 -0
  283. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  284. package/dist/modes/interactive/components/branch-summary-message.js +4 -1
  285. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  286. package/dist/modes/interactive/components/chat-message-renderer.js +2 -1
  287. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  288. package/dist/modes/interactive/components/chat-session-host-state.js +63 -31
  289. package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
  290. package/dist/modes/interactive/components/chat-session-host.js +8 -1
  291. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  292. package/dist/modes/interactive/components/chat-transcript.js +24 -14
  293. package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
  294. package/dist/modes/interactive/components/compaction-boundary-message.js +2 -1
  295. package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -1
  296. package/dist/modes/interactive/components/config-selector-list.js +15 -6
  297. package/dist/modes/interactive/components/config-selector-list.js.map +1 -1
  298. package/dist/modes/interactive/components/config-selector.js +7 -1
  299. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  300. package/dist/modes/interactive/components/countdown-timer.js +2 -0
  301. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  302. package/dist/modes/interactive/components/custom-editor.js +21 -1
  303. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  304. package/dist/modes/interactive/components/custom-entry.js +4 -1
  305. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  306. package/dist/modes/interactive/components/custom-message.js +9 -1
  307. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  308. package/dist/modes/interactive/components/daxnuts.js +8 -6
  309. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  310. package/dist/modes/interactive/components/dynamic-border.js +1 -0
  311. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  312. package/dist/modes/interactive/components/extension-editor.js +7 -1
  313. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  314. package/dist/modes/interactive/components/extension-input.js +8 -2
  315. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  316. package/dist/modes/interactive/components/extension-selector.js +9 -1
  317. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  318. package/dist/modes/interactive/components/first-time-setup.js +4 -2
  319. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  320. package/dist/modes/interactive/components/footer.js +5 -2
  321. package/dist/modes/interactive/components/footer.js.map +1 -1
  322. package/dist/modes/interactive/components/host-input-form.js +13 -2
  323. package/dist/modes/interactive/components/host-input-form.js.map +1 -1
  324. package/dist/modes/interactive/components/login-dialog.js +9 -3
  325. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  326. package/dist/modes/interactive/components/model-selector.js +24 -12
  327. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  328. package/dist/modes/interactive/components/oauth-selector.js +12 -3
  329. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  330. package/dist/modes/interactive/components/reserved-bottom-overlay.js +11 -2
  331. package/dist/modes/interactive/components/reserved-bottom-overlay.js.map +1 -1
  332. package/dist/modes/interactive/components/scoped-models-selector.js +13 -8
  333. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  334. package/dist/modes/interactive/components/scroll-widget.js +4 -0
  335. package/dist/modes/interactive/components/scroll-widget.js.map +1 -1
  336. package/dist/modes/interactive/components/session-selector-header.js +11 -7
  337. package/dist/modes/interactive/components/session-selector-header.js.map +1 -1
  338. package/dist/modes/interactive/components/session-selector-list.js +25 -12
  339. package/dist/modes/interactive/components/session-selector-list.js.map +1 -1
  340. package/dist/modes/interactive/components/session-selector.js +23 -15
  341. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  342. package/dist/modes/interactive/components/settings-selector-submenus.js +19 -1
  343. package/dist/modes/interactive/components/settings-selector-submenus.js.map +1 -1
  344. package/dist/modes/interactive/components/settings-selector.js +1 -0
  345. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  346. package/dist/modes/interactive/components/show-images-selector.js +1 -0
  347. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  348. package/dist/modes/interactive/components/skill-invocation-message.js +4 -1
  349. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  350. package/dist/modes/interactive/components/startup-identity.js +8 -3
  351. package/dist/modes/interactive/components/startup-identity.js.map +1 -1
  352. package/dist/modes/interactive/components/task-completion-message.js +2 -0
  353. package/dist/modes/interactive/components/task-completion-message.js.map +1 -1
  354. package/dist/modes/interactive/components/task-detail.js +2 -0
  355. package/dist/modes/interactive/components/task-detail.js.map +1 -1
  356. package/dist/modes/interactive/components/task-inspector.js +22 -12
  357. package/dist/modes/interactive/components/task-inspector.js.map +1 -1
  358. package/dist/modes/interactive/components/task-list.js +2 -0
  359. package/dist/modes/interactive/components/task-list.js.map +1 -1
  360. package/dist/modes/interactive/components/task-live-transcript.js +8 -3
  361. package/dist/modes/interactive/components/task-live-transcript.js.map +1 -1
  362. package/dist/modes/interactive/components/task-navigation.js +5 -2
  363. package/dist/modes/interactive/components/task-navigation.js.map +1 -1
  364. package/dist/modes/interactive/components/task-row.js +2 -0
  365. package/dist/modes/interactive/components/task-row.js.map +1 -1
  366. package/dist/modes/interactive/components/theme-selector.js +2 -0
  367. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  368. package/dist/modes/interactive/components/thinking-selector.js +7 -1
  369. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  370. package/dist/modes/interactive/components/tool-execution.js +25 -10
  371. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  372. package/dist/modes/interactive/components/transcript-follow-indicator.js +1 -0
  373. package/dist/modes/interactive/components/transcript-follow-indicator.js.map +1 -1
  374. package/dist/modes/interactive/components/tree-selector-component.js +7 -3
  375. package/dist/modes/interactive/components/tree-selector-component.js.map +1 -1
  376. package/dist/modes/interactive/components/tree-selector-help.js +1 -0
  377. package/dist/modes/interactive/components/tree-selector-help.js.map +1 -1
  378. package/dist/modes/interactive/components/tree-selector-label-input.js +6 -2
  379. package/dist/modes/interactive/components/tree-selector-label-input.js.map +1 -1
  380. package/dist/modes/interactive/components/tree-selector-list.js +4 -0
  381. package/dist/modes/interactive/components/tree-selector-list.js.map +1 -1
  382. package/dist/modes/interactive/components/trust-selector.js +6 -0
  383. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  384. package/dist/modes/interactive/components/user-message-selector.js +6 -3
  385. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  386. package/dist/modes/interactive/components/user-message.js +5 -0
  387. package/dist/modes/interactive/components/user-message.js.map +1 -1
  388. package/dist/modes/interactive/components/working-status.js +1 -0
  389. package/dist/modes/interactive/components/working-status.js.map +1 -1
  390. package/dist/modes/interactive/interactive-autocomplete.js +2 -0
  391. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  392. package/dist/modes/interactive/interactive-extension-runtime.js +1 -0
  393. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  394. package/dist/modes/interactive/interactive-mode-base.js +162 -120
  395. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  396. package/dist/modes/interactive/interactive-mode-helpers.js +3 -0
  397. package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -1
  398. package/dist/modes/interactive/interactive-mode-surface.d.ts +0 -6
  399. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  400. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  401. package/dist/modes/interactive/interactive-resource-disclosure.js +0 -4
  402. package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
  403. package/dist/modes/interactive/interactive-resource-rendering.js +0 -12
  404. package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
  405. package/dist/modes/interactive/interactive-startup-chat-container.js +1 -4
  406. package/dist/modes/interactive/interactive-startup-chat-container.js.map +1 -1
  407. package/dist/modes/interactive/model-catalog-refresh.js +1 -3
  408. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -1
  409. package/dist/modes/interactive/theme/color-utils.d.ts +5 -0
  410. package/dist/modes/interactive/theme/color-utils.d.ts.map +1 -1
  411. package/dist/modes/interactive/theme/color-utils.js +11 -0
  412. package/dist/modes/interactive/theme/color-utils.js.map +1 -1
  413. package/dist/modes/interactive/theme/global-theme.d.ts.map +1 -1
  414. package/dist/modes/interactive/theme/global-theme.js +4 -3
  415. package/dist/modes/interactive/theme/global-theme.js.map +1 -1
  416. package/dist/modes/interactive/theme/theme-class.js +7 -0
  417. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  418. package/dist/modes/interactive/theme/theme-controller.js +9 -2
  419. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  420. package/dist/modes/interactive-engine/activity-watchdog.js +8 -3
  421. package/dist/modes/interactive-engine/activity-watchdog.js.map +1 -1
  422. package/dist/modes/interactive-engine/engine-custom-ui.js +12 -8
  423. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
  424. package/dist/modes/interactive-engine/engine-dialog-host.js +7 -3
  425. package/dist/modes/interactive-engine/engine-dialog-host.js.map +1 -1
  426. package/dist/modes/interactive-engine/engine-health.js +23 -13
  427. package/dist/modes/interactive-engine/engine-health.js.map +1 -1
  428. package/dist/modes/interactive-engine/engine-input-form.js +3 -2
  429. package/dist/modes/interactive-engine/engine-input-form.js.map +1 -1
  430. package/dist/modes/interactive-engine/engine-monitor.js +13 -1
  431. package/dist/modes/interactive-engine/engine-monitor.js.map +1 -1
  432. package/dist/modes/interactive-engine/engine-project-trust.js +2 -1
  433. package/dist/modes/interactive-engine/engine-project-trust.js.map +1 -1
  434. package/dist/modes/interactive-engine/engine-render-service.js +7 -4
  435. package/dist/modes/interactive-engine/engine-render-service.js.map +1 -1
  436. package/dist/modes/interactive-engine/engine-session-picker.js +3 -2
  437. package/dist/modes/interactive-engine/engine-session-picker.js.map +1 -1
  438. package/dist/modes/interactive-engine/input-form-host.js +5 -1
  439. package/dist/modes/interactive-engine/input-form-host.js.map +1 -1
  440. package/dist/modes/interactive-engine/isolated-runtime.js +37 -23
  441. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  442. package/dist/modes/interactive-engine/remote-command-catalog.js +4 -3
  443. package/dist/modes/interactive-engine/remote-command-catalog.js.map +1 -1
  444. package/dist/modes/interactive-engine/remote-component.js +24 -12
  445. package/dist/modes/interactive-engine/remote-component.js.map +1 -1
  446. package/dist/modes/interactive-engine/remote-frame-clamp.js +3 -3
  447. package/dist/modes/interactive-engine/remote-frame-clamp.js.map +1 -1
  448. package/dist/modes/interactive-engine/remote-model-catalog.js +5 -4
  449. package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
  450. package/dist/modes/interactive-engine/remote-queue-pause.js +3 -1
  451. package/dist/modes/interactive-engine/remote-queue-pause.js.map +1 -1
  452. package/dist/modes/interactive-engine/remote-renderer.js +24 -13
  453. package/dist/modes/interactive-engine/remote-renderer.js.map +1 -1
  454. package/dist/modes/interactive-engine/resource-readiness-error.js +1 -0
  455. package/dist/modes/interactive-engine/resource-readiness-error.js.map +1 -1
  456. package/dist/modes/interactive-engine/session-picker-host.js +5 -1
  457. package/dist/modes/interactive-engine/session-picker-host.js.map +1 -1
  458. package/dist/modes/interactive-engine/terminal-mode-controller.js +2 -1
  459. package/dist/modes/interactive-engine/terminal-mode-controller.js.map +1 -1
  460. package/dist/modes/rpc/queued-writer.js +13 -4
  461. package/dist/modes/rpc/queued-writer.js.map +1 -1
  462. package/dist/modes/rpc/rpc-bash-request-owners.js +2 -1
  463. package/dist/modes/rpc/rpc-bash-request-owners.js.map +1 -1
  464. package/dist/modes/rpc/rpc-client-api.d.ts +8 -4
  465. package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
  466. package/dist/modes/rpc/rpc-client-api.js +10 -3
  467. package/dist/modes/rpc/rpc-client-api.js.map +1 -1
  468. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  469. package/dist/modes/rpc/rpc-client.js +35 -22
  470. package/dist/modes/rpc/rpc-client.js.map +1 -1
  471. package/dist/modes/rpc/rpc-command-handler.js +6 -6
  472. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  473. package/dist/modes/rpc/rpc-event-buffer.js +3 -1
  474. package/dist/modes/rpc/rpc-event-buffer.js.map +1 -1
  475. package/dist/modes/rpc/rpc-generation-buffer.js +1 -3
  476. package/dist/modes/rpc/rpc-generation-buffer.js.map +1 -1
  477. package/dist/modes/rpc/rpc-keybindings-reload.js +4 -1
  478. package/dist/modes/rpc/rpc-keybindings-reload.js.map +1 -1
  479. package/dist/modes/rpc/rpc-output-buffer.js +3 -4
  480. package/dist/modes/rpc/rpc-output-buffer.js.map +1 -1
  481. package/dist/modes/rpc/rpc-pending-requests.js +1 -3
  482. package/dist/modes/rpc/rpc-pending-requests.js.map +1 -1
  483. package/dist/modes/rpc/rpc-provider-auth.js +3 -1
  484. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  485. package/dist/modes/rpc/rpc-resource-readiness.js +4 -5
  486. package/dist/modes/rpc/rpc-resource-readiness.js.map +1 -1
  487. package/dist/modes/rpc/rpc-session-binding.js +15 -0
  488. package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
  489. package/dist/modes/rpc/rpc-terminal-drain.js +3 -0
  490. package/dist/modes/rpc/rpc-terminal-drain.js.map +1 -1
  491. package/dist/modes/rpc/rpc-types.d.ts +10 -1
  492. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  493. package/dist/modes/rpc/rpc-types.js.map +1 -1
  494. package/docs/models/evals.md +883 -39
  495. package/docs/models/model-selection.md +7 -8
  496. package/docs/rpc/examples.md +1 -1
  497. package/docs/rpc/protocol.md +9 -3
  498. package/docs/sdk/structured-decisions.md +1 -1
  499. package/docs/sdk.md +3 -3
  500. package/docs/settings.md +24 -3
  501. package/docs/subagents/reference.md +22 -4
  502. package/docs/subagents.md +2 -0
  503. package/docs/usage.md +3 -3
  504. package/docs/workflows/api-reference.md +1 -1
  505. package/docs/workflows/authoring.md +1 -7
  506. package/docs/workflows/builtins.md +1 -1
  507. package/docs/workflows/reliable-design.md +1 -1
  508. package/examples/extensions/custom-provider-gitlab-duo/test.ts +5 -5
  509. package/examples/extensions/gondolin/package.json +1 -1
  510. package/examples/rpc-client.ts +1 -1
  511. package/examples/rpc-extension-ui.ts +1 -1
  512. package/npm-shrinkwrap.json +70 -33
  513. package/package.json +6 -7
  514. package/dist/core/model-routing-task.d.ts.map +0 -1
  515. package/dist/core/model-routing-task.js +0 -120
  516. package/dist/core/model-routing-task.js.map +0 -1
@@ -11,21 +11,18 @@ For specific benchmark records, read [Evals](/models/evals). That page is the da
11
11
 
12
12
  ## Automatic subagent and workflow-stage routing
13
13
 
14
- Subagent and workflow-stage `model: "auto"` routes before execution starts. Atomic sends the router:
14
+ Subagent and workflow-stage `model: "auto"` routes before execution starts, in at most two short requests:
15
15
 
16
- - the final task or stage prompt,
17
- - the agent or stage name and description,
18
- - the eligible provider/model and effort choices with catalog capabilities and prices,
19
- - hard `modelConstraints`, and
20
- - the factual markdown tables in [Evals](/models/evals).
16
+ 1. **Questions about the task, answered by a chat model.** Kind of work, difficulty, mistake cost, image input, very large context, and whether speed matters. The chat model is `routerModel` when that is a chat model, otherwise your current one; a classifier such as Jev never reads the task. A task too large for that model's window is read by the cheapest eligible model that holds it. Anything the caller states in `taskNeeds` is not asked, and when the caller states all six this request is skipped. Computer-use tasks count as needing images unless the caller says otherwise.
17
+ 2. **A choice between a shortlist, made by the router without the task.** Atomic narrows the eligible models in code: it drops models that cannot read images when the task needs them and prefers 400k-token windows for long-context tasks, then ranks the rest on the [Evals](/models/evals) results for that kind of work, weighing proven quality against price by how demanding the task is and preferring newer releases. The top six different models form the shortlist; a model's fast route and the same model on another provider share one place. When the caller lists models in `modelConstraints.allowedModels`, those eligible models are the shortlist instead (as many as fit one routing request). Each option carries its own evidence (release date, price tier, image input, and how it was measured on this kind of work and overall), ranked against every model you could route to. With a single option, this request is skipped.
21
18
 
22
- The router returns one primary `{ model, effort }` pair and up to two ordered fallback pairs. It cannot add candidates, bypass constraints, alter the execution prompt, or change the selected chat model. [`routerModel`](/settings#routermodel) chooses the decision model only: an explicit registered classifier or chat language model. Unset and `auto` use the current chat model, regardless of saved classifier credentials. An image-generation model cannot decide.
19
+ Effort follows the task's difficulty, one level lower when speed matters, limited to the levels the chosen model supports. The two fallbacks are the next models in Atomic's ranking. The router cannot add candidates, bypass constraints, alter the execution prompt, or change the selected chat model. [`routerModel`](/settings#routermodel) chooses the decision model only: an explicit registered classifier or chat language model. Unset and `auto` use the current chat model, regardless of saved classifier credentials. An image-generation model cannot decide.
23
20
 
24
21
  Only chat language models are eligible for execution `auto`, including models that accept image or PDF input. Image-generation and classifier models cannot be execution candidates, even when a classifier makes the routing decision.
25
22
 
26
23
  In authored workflows, a classifier can make a structured triage decision without executing the stage; an image model can generate an asset inside a durable tool step. See [classifier and image models in `ctx.tool`](/workflows/authoring#classifier-and-image-models-in-ctx-tool).
27
24
 
28
- Long tasks may be excerpted for routing so the decision fits the decision provider's input budget. Execution still receives the full task. The excerpt keeps the beginning and end of the task plus `<keepContext>...</keepContext>` spans, and marks cuts `[... truncated ...]`. Put the role and objective at the start or end, or in a short protected span, and keep bulky reference text in the middle.
25
+ To keep some providers out of routing entirely, set [`modelRouting`](/settings#modelrouting).
29
26
 
30
27
  ## Benchmarks are evidence, not policy
31
28
 
@@ -33,6 +30,8 @@ Benchmark results are measurements under named harnesses, dates, models, efforts
33
30
 
34
31
  Missing evidence is unknown, not zero. A rounded lead is not proof of significance. A result for one provider, model version, effort, agent, fallback setting, or benchmark harness does not transfer to another identity.
35
32
 
33
+ Prefer recency. Each row in [Evals](/models/evals) has a release date. When candidates fit the same role tier and price range, choose the most recently released model over an older one from the same provider or family; a newer release usually supersedes it. Do not let an older model win only because it has no published results: its missing evidence stays unknown, and a recent comparable model with evidence is the safer choice. Recency does not override the role's cost tier or explicit constraints.
34
+
36
35
  ## Role-based thinking effort
37
36
 
38
37
  Use these starting defaults unless the user requests a level. Higher effort can improve hard reasoning, but it also costs more and can be slower. `max` is an exception, not a default.
@@ -9,7 +9,7 @@ description: Additional RPC client implementations.
9
9
 
10
10
  See [`test/rpc-example.ts`](https://github.com/bastani-inc/atomic/blob/main/packages/coding-agent/test/rpc-example.ts) for a complete interactive example, or [`src/modes/rpc/rpc-client.ts`](https://github.com/bastani-inc/atomic/blob/main/packages/coding-agent/src/modes/rpc/rpc-client.ts) for a typed client implementation.
11
11
 
12
- [`examples/rpc-client.ts`](https://github.com/bastani-inc/atomic/blob/main/packages/coding-agent/examples/rpc-client.ts) uses the exported `RpcClient` to run Atomic in a child process, stream events, and wait for the run to settle. Build the coding-agent package first, then run `npx tsx examples/rpc-client.ts "Explain this repository"` from a repository checkout. `RpcClient` launches the CLI under Bun by default; pass `runtimeExecutable: process.execPath` to run it under Node.
12
+ [`examples/rpc-client.ts`](https://github.com/bastani-inc/atomic/blob/main/packages/coding-agent/examples/rpc-client.ts) uses the exported `RpcClient` to run Atomic in a child process, stream events, and wait for the run to settle. Build the coding-agent package first, then run `node examples/rpc-client.ts "Explain this repository"` from a repository checkout. `RpcClient` launches the CLI under Bun by default; pass `runtimeExecutable: process.execPath` to run it under Node.
13
13
 
14
14
  For a complete example of handling the extension UI protocol, see [`examples/rpc-extension-ui.ts`](https://github.com/bastani-inc/atomic/blob/main/packages/coding-agent/examples/rpc-extension-ui.ts) which pairs with the [`examples/extensions/rpc-demo.ts`](https://github.com/bastani-inc/atomic/blob/main/packages/coding-agent/examples/extensions/rpc-demo.ts) extension.
15
15
 
@@ -39,9 +39,11 @@ If the agent is streaming and no `streamingBehavior` is specified, the command r
39
39
 
40
40
  Response:
41
41
  ```json
42
- {"id": "req-1", "type": "response", "command": "prompt", "success": true}
42
+ {"id": "req-1", "type": "response", "command": "prompt", "success": true, "data": {"disposition": "started"}}
43
43
  ```
44
44
 
45
+ `data.disposition` is `"handled"` if an extension command or input handler consumed the prompt, `"queued"` if Atomic queued it during a run or held it because the message queue was paused before its run began, or `"started"` if Atomic started a run for it. This describes the submitted prompt, not independent work started by an extension or a guarantee of completion. If it is `"handled"`, no run started for this prompt, so don't wait for `agent_end` or `agent_settled`.
46
+
45
47
  `success: true` means the prompt was accepted, queued, or handled immediately. `success: false` means the prompt was rejected before acceptance. Failures after acceptance are reported through the normal event and message stream, not as a second `response` for the same request id.
46
48
 
47
49
  The `images` field is optional. Each image uses `ImageContent` format: `{"type": "image", "data": "base64-encoded-data", "mimeType": "image/png"}`.
@@ -63,9 +65,11 @@ The `images` field is optional. Each image uses `ImageContent` format (same as `
63
65
 
64
66
  Response:
65
67
  ```json
66
- {"type": "response", "command": "steer", "success": true}
68
+ {"type": "response", "command": "steer", "success": true, "data": {"disposition": "queued"}}
67
69
  ```
68
70
 
71
+ `data.disposition` is `"handled"` if an input handler consumed this steer, or `"queued"` if Atomic queued it (including after a handler transformed it). It does not guarantee this message remains queued.
72
+
69
73
  See [set_steering_mode](#set_steering_mode) for controlling how steering messages are processed.
70
74
 
71
75
  #### follow_up
@@ -85,9 +89,11 @@ The `images` field is optional. Each image uses `ImageContent` format (same as `
85
89
 
86
90
  Response:
87
91
  ```json
88
- {"type": "response", "command": "follow_up", "success": true}
92
+ {"type": "response", "command": "follow_up", "success": true, "data": {"disposition": "queued"}}
89
93
  ```
90
94
 
95
+ `data.disposition` has the same `"handled"` or `"queued"` meaning as for `steer`, applied to this follow-up.
96
+
91
97
  See [set_follow_up_mode](#set_follow_up_mode) for controlling how follow-up messages are processed.
92
98
 
93
99
  #### abort
@@ -79,7 +79,7 @@ A registered classifier receives shared state and choice questions through the g
79
79
 
80
80
  The structured-decision path never trims supplied state. A general structured-output call skips an incompatible classifier candidate and continues with the next fallback. A provider size rejection advances the same way without repeating the rejected request. Supply concise context or select a chat model with enough capacity when needed.
81
81
 
82
- Automatic subagent and workflow-stage model selection uses a [bounded task excerpt](/subagents/reference#automatic-model-selection) for its routing decision. That excerpt preserves protected spans and does not replace the execution prompt. Direct SDK calls do not apply this task-excerpt policy.
82
+ Automatic subagent and workflow-stage model selection has a chat model read the task and sends a classifier only the resulting answers and candidate models; see [automatic model selection](/subagents/reference#automatic-model-selection).
83
83
 
84
84
  Classifier response bodies are limited by the provider operation. Atomic validates that every question receives a known Choice option. The classify result does not report token usage. Reported model, probabilities, and confidence are advisory and never reject an otherwise valid decision.
85
85
 
package/docs/sdk.md CHANGED
@@ -425,13 +425,13 @@ interface PromptOptions {
425
425
  images?: ImageContent[];
426
426
  streamingBehavior?: "steer" | "followUp";
427
427
  source?: InputSource;
428
- preflightResult?: (success: boolean) => void;
428
+ preflightResult?: (success: boolean, disposition?: "handled" | "queued" | "started") => void;
429
429
  }
430
430
  ```
431
431
 
432
432
  `preflightResult` is called once per `prompt()` invocation:
433
433
 
434
- - `true` when the prompt was accepted, queued, or handled immediately
434
+ - `true` when the prompt was accepted, queued, or handled immediately. The second argument says which: `"handled"` if an extension command or input handler consumed it, `"queued"` if it was queued during a run, or `"started"` if it started a run
435
435
  - `false` when prompt preflight rejected before acceptance
436
436
 
437
437
  It fires before `prompt()` resolves. `prompt()` still resolves only after the full accepted run finishes, including retries. Failures after acceptance are reported through the normal event and message stream, not through `preflightResult(false)`.
@@ -469,7 +469,7 @@ await session.steer("New instruction");
469
469
  await session.followUp("After you're done, also do this");
470
470
  ```
471
471
 
472
- Both `steer()` and `followUp()` expand file-based prompt templates but error on extension commands (extension commands cannot be queued).
472
+ Both `steer()` and `followUp()` expand file-based prompt templates but error on extension commands (extension commands cannot be queued). They return `"queued"` if the input was queued (including after an extension transformed it), or `"handled"` if an extension consumed it.
473
473
 
474
474
  `pauseQueuedMessages()` synchronously holds existing raw steering/follow-up entries before an abort boundary. Later context-bearing arrivals also stay queued without starting a provider turn. These include trigger-turn custom messages, batches, interrupts, `sendUserMessage()`, and ordinary `prompt()` calls.
475
475
 
package/docs/settings.md CHANGED
@@ -56,6 +56,7 @@ See [Herdr](/herdr) for state aggregation, reporter conflicts, privacy, and Herd
56
56
  | `defaultProvider` | string | - | Startup provider, saved automatically when you switch models interactively |
57
57
  | `defaultModel` | string | - | Startup model ID, saved automatically when you switch models interactively |
58
58
  | `routerModel` | string | `""` | Inference model for workflow-stage and subagent `model: "auto"` selection only. An exact `provider/model` selects a registered chat or classifier model. `auto` and empty use the current chat model. Does not change chat or `structured_output` tool inference. |
59
+ | `modelRouting` | object | `{}` | Provider filters for the models `model: "auto"` may select: `allowedProviders` and `excludedProviders` (provider ID arrays). Does not change `routerModel`. See [modelRouting](#modelrouting). |
59
60
  | `defaultThinkingLevel` | string | - | Startup thinking level, saved automatically on interactive model/thinking changes: `"off"`, `"minimal"`, `"low"`, `"medium"`, `"high"`, `"xhigh"`, `"max"`; clamped to the active model's supported levels |
60
61
  | `modelThinkingLevels` | object | - | Per-model startup thinking levels keyed by `"provider/modelId"`; updated automatically on interactive model/thinking changes, or configured from `/settings` → Default thinking level per model |
61
62
  | `hideThinkingBlock` | boolean | `false` | Hide thinking blocks in output |
@@ -83,16 +84,36 @@ Use `/settings` → **Router model** to change the effective selection. If the p
83
84
 
84
85
  An explicit ID other than `auto` is resolved through the current model registry: a registered classifier first, otherwise a chat model. Gateway classifier IDs are not registered automatically; configure their classifier models and operations before selecting them. An invalid explicit ID, image-generation model, non-string value, or surrounding whitespace fails the decision instead of silently changing providers. An explicit empty project value overrides a global selection and restores the current chat model.
85
86
 
86
- A failed explicit classifier routing attempt switches to the current chat model when one exists. That includes missing credentials, an unavailable classify operation, a provider size or context rejection, a refusal, and a malformed answer. Transient retries follow the provider operation and retry settings. Chat routing gets an initial attempt plus three corrective retries for invalid output, using the same context. Routing has no built-in wall-clock deadline; cancel the request to stop waiting. Independent provider, credential-preparation, and enclosing tool-request limits still apply. Atomic reports the fallback; it can incur chat-provider charges. Cancellation does not trigger fallback.
87
+ A failed explicit classifier routing attempt switches to the current chat model when one exists. That includes missing credentials, an unavailable classify operation, a provider size or context rejection, a refusal, and a malformed answer. Transient retries follow the provider operation and retry settings. Chat routing gets an initial attempt plus three corrective retries for invalid output, using the same context. Routing has no built-in wall-clock deadline; cancel the request to stop waiting. Independent provider, credential-preparation, and enclosing tool-request limits still apply. The fallback can incur chat-provider charges. Cancellation does not trigger fallback.
87
88
 
88
- Automatic subagent and workflow-stage model selection uses a bounded excerpt for long tasks, keeping the beginning, end, and `<keepContext>...</keepContext>` spans. Only the router's copy is shortened; execution receives the full task and hard model constraints stay enforced. Put essential model-selection requirements in protected spans. Unprotected middle text may be omitted, so excerpts can affect model choice. This does not truncate general structured decisions.
89
+ A classifier `routerModel` such as Jev only chooses between the shortlisted models and never receives the task; a chat model (`routerModel` when it is one, otherwise the current chat model) reads the task to answer the routing questions. If the selected classifier rejects the request, routing switches to the current chat model.
89
90
 
90
- If the selected classifier rejects the request for size or context, routing switches to the current chat model.
91
+ Routing fallbacks are recovered automatically and are not printed to the terminal or added to the conversation. Set `ATOMIC_MODEL_ROUTING_DEBUG=1` to print them while debugging model selection.
91
92
 
92
93
  This setting selects inference for [workflow-stage `model: "auto"`](/workflows/authoring#automatic-stage-model-selection) and [subagent `model: "auto"`](/subagents/reference#automatic-model-selection). It does not directly select the child execution model or change the selected chat model, `structured_output` tool, or general structured-output inference. The decision provider may be any registered classifier or chat model, never an image-generation model; execution `auto` selects only chat language models, including multimodal-input chat. The selected router provider receives the routing context, so choose a provider permitted to process that data. Authenticate a pinned classifier with that provider's login, such as `/login typesafe` or `TYPESAFE_API_KEY` for TypeSafe Jev. See [Structured decisions](/sdk/structured-decisions) and [TypeSafe Jev](/providers#typesafe-jev).
93
94
 
94
95
  Remove secrets from routing tasks, inputs, and workflow descriptions/contracts before calling the tool. A routing-context credential error stops before inference or launch. Known configured credentials are screened even when they belong to a provider other than the router. Remove the credential from the supplied context or registered definition, reload a changed definition, then retry explicitly. The guard does not detect every possible secret.
95
96
 
97
+ #### modelRouting
98
+
99
+ ```json
100
+ {
101
+ "modelRouting": {
102
+ "allowedProviders": ["github-copilot", "openai-codex", "anthropic"],
103
+ "excludedProviders": ["openrouter"]
104
+ }
105
+ }
106
+ ```
107
+
108
+ Limits which providers' models workflow stages and subagents with `model: "auto"` can be routed to. It filters the candidates only; the model that makes the decision is still `routerModel`.
109
+
110
+ - `allowedProviders`: when nonempty, only models from these providers are candidates.
111
+ - `excludedProviders`: models from these providers are never candidates, even if they are also allowed.
112
+
113
+ Use provider IDs as shown by `/model` or `workflow({ action: "models" })`, such as `github-copilot`, `openai-codex`, `anthropic`, or `openrouter`. For example, to route only to your subscriptions, exclude the API-billed providers you have configured. The Claude subscription and the Anthropic API both use the `anthropic` provider, so this setting cannot separate them.
114
+
115
+ A project list replaces the global list of the same name; the other list is kept. A subagent call or workflow stage that sets `modelConstraints.allowedProviders` or `excludedProviders`, for example because you asked for a provider, uses its own lists instead of these for that call. Provider lists in an agent definition or inherited from a parent workflow only narrow these settings; they never lift an exclusion. If the filters leave no eligible model, the stage or subagent fails before launch with an error that names this setting. A run resumed after you exclude a provider rejects a recorded selection from that provider instead of using it.
116
+
96
117
  #### thinkingBudgets
97
118
 
98
119
  ```json
@@ -21,11 +21,28 @@ The same value works on individual parallel tasks and in an agent definition's `
21
21
 
22
22
  Workflow stages also support [prompt-based `model: "auto"`](/workflows/authoring#automatic-stage-model-selection), using the same decision provider and evaluation guidance. Stage model selection is separate from choosing which workflow to launch.
23
23
 
24
- Put requirements that should influence model selection in the task. Atomic supplies `task`, `agent` (name and description), `evals` containing the factual markdown tables from [Evals](/models/evals), and `model_selection_guide`, a fixed policy excerpt from [Model Selection](/models/model-selection) covering benchmarks-as-evidence and the role-based model cost tier and thinking effort table, so exploration and routine implementation lean toward cheaper models while review and verification get frontier ones. Eligible provider-qualified models and efforts, capabilities and prices appear in the choices. There is no separate policy-version field or provider-name filter. You do not need to attach eval records yourself.
24
+ Routing takes at most two short requests, described in [Model Selection](/models/model-selection#automatic-subagent-and-workflow-stage-routing): a chat model answers questions about the task, then the router chooses between a shortlist of models that each carry their own [Evals](/models/evals) results, seeing only those answers and never the task. Effort follows the task's difficulty.
25
+
26
+ When you launch a subagent, fill in `taskNeeds` with everything you can judge; stated fields are not asked, and stating all six skips the task-reading request. To choose the contenders yourself, list them in `modelConstraints.allowedModels`; the eligible ones become the shortlist:
27
+
28
+ ```typescript
29
+ subagent({
30
+ agent: "worker",
31
+ task: "Open Xcode, build the app and verify the settings screen by screenshot",
32
+ model: "auto",
33
+ taskNeeds: {
34
+ work: "computer_use", difficulty: "hard", mistakeCost: "moderate",
35
+ needsImages: true, longContext: false, latencySensitive: false,
36
+ },
37
+ modelConstraints: { allowedModels: ["anthropic/claude-opus-5-5", "openai-codex/gpt-6-astra"] },
38
+ })
39
+ ```
40
+
41
+ `work` is one of `computer_use`, `coding`, `code_review`, `codebase_lookup`, `research`, `business_workflow`, `math_science` or `writing`; `difficulty` is `trivial`, `easy`, `moderate`, `hard` or `very_hard`; `mistakeCost` is `negligible`, `low`, `moderate`, `high` or `severe`; `needsImages`, `longContext` (must hold a very large codebase or document set) and `latencySensitive` (a fast answer matters more than extra reasoning) are true or false. When listing candidates, prefer the user's subscription models over pay-per-token API models unless the user asked for API models or has none. To keep providers out of routing entirely, use the [`modelRouting`](/settings#modelrouting) setting. You do not need to attach eval records yourself.
25
42
 
26
43
  The agent's system prompt is not routing metadata. For a self-contained agent with no task, it remains the task fallback. The router weighs task-relevant evidence, cost, and latency rather than always choosing a benchmark winner or maximum effort. Benchmark measurement effort does not prescribe execution effort.
27
44
 
28
- Long tasks use a model-selection excerpt of at most 9,000 JSON-encoded UTF-8 bytes (roughly 1,200 words), smaller when many model/effort pairs are eligible. It retains the beginning, end, and `<keepContext>...</keepContext>` spans in source order and marks each cut `[... truncated ...]`. Put the child's role and objective at the start or end of the task, or in a short protected span, and keep bulky reference text in the middle; unprotected middle text may be cut. If the protected spans alone do not fit, the router receives the start and end of the task and the middle is cut, including protected text. This applies to the routing request, not execution: the child still receives its complete task. If a classifier still rejects the request, routing falls back to the current chat model and the warning names the HTTP status and error type. Hard `modelConstraints` are never truncated.
45
+ The chat model reads the complete task; a task too large for its context window is read by the cheapest eligible model whose window holds it. If a classifier rejects the choice request, routing falls back to the current chat model. Fallbacks are silent unless `ATOMIC_MODEL_ROUTING_DEBUG=1`, which prints them with the HTTP status and error type. Hard `modelConstraints` are never truncated.
29
46
 
30
47
  The shared [`routerModel`](/settings#routermodel) setting chooses the model making the decision, not the child model. Selection follows this order:
31
48
 
@@ -38,7 +55,7 @@ Routing has no built-in wall-clock deadline. Slow decisions can finish; cancel t
38
55
 
39
56
  The result records a primary `{ model, effort }` and up to two ordered `fallbacks`, each with its own model and effort. Atomic ranks three distinct eligible provider/model IDs, or all available IDs when fewer than three qualify. It selects each rank from the remaining models, excluding all efforts of earlier choices. A supported `"off"` is distinct from `null`, which means no configurable reasoning. The catalog reflects configured authentication, not proof of valid credentials, quota, or entitlement.
40
57
 
41
- The child does not start if no candidates are eligible, availability changes, or cancellation occurs. A classifier provider failure, missing credentials, unsupported classify operation, size rejection, or malformed answer triggers a reported switch to the current chat model. Transient provider failures are retried up to three times first. The chat model gets its own output-repair allowance. If routing inference fails completely, the child runs on the current chat model instead of failing, with a reported warning, but only when that model is available and satisfies every routing constraint (such as `allowedModels` and effort, cost, context and input limits). Otherwise the launch fails. Invalid inputs, conflicting constraints, cancellation and stale-catalog failures never trigger fallback. No partial decision can launch a child.
58
+ The child does not start if no candidates are eligible, availability changes, or cancellation occurs. A classifier provider failure, missing credentials, unsupported classify operation, size rejection, or malformed answer switches to the current chat model. Transient provider failures are retried up to three times first. The chat model gets its own output-repair allowance. If routing inference fails completely, or Atomic cannot pick a model itself (the task needs images and no eligible model reads them, `allowedModels` lists more models than one routing request holds (roughly 100), or `evals.md` is missing), the child runs on the current chat model instead of failing, but only when that model is available and satisfies every routing constraint (such as `allowedModels` and effort, cost, context and input limits). Otherwise the launch fails. Invalid inputs, conflicting constraints, cancellation and stale-catalog failures never trigger fallback. No partial decision can launch a child. These switches are silent unless `ATOMIC_MODEL_ROUTING_DEBUG=1` is set.
42
59
 
43
60
  Router classification is one classify request for the prepared choices. If the provider rejects the request size, routing uses the current chat model. See [structured decision limits](/sdk/structured-decisions#provider-behavior-and-limits).
44
61
 
@@ -53,12 +70,13 @@ For automatic routing, optional `modelConstraints` on a call, parallel task, or
53
70
  | Field | Meaning |
54
71
  | --- | --- |
55
72
  | `allowedModels` | Exact provider/model IDs permitted to receive the task |
73
+ | `allowedProviders`, `excludedProviders` | Provider IDs whose models may or may never be used. On a call, setting either replaces the [`modelRouting`](/settings#modelrouting) provider settings for that call, so set them only when the user asks; in an agent definition they only narrow those settings |
56
74
  | `maxInputCost`, `maxOutputCost` | Maximum catalog price in USD per million input or output tokens, not a total spending cap |
57
75
  | `minContextWindow` | Minimum advertised context window in tokens |
58
76
  | `requiredInputs` | Required input types, `"text"` or `"image"` |
59
77
  | `allowedEfforts` | Permitted supported effort values, including `null` for non-reasoning models |
60
78
 
61
- Unknown keys and invalid limits fail validation. An empty eligible set stops the launch. These constraints do not turn a concrete model call into an automatic one. The catalog does not establish a latency SLA or a provider's privacy guarantees. Express hard provider restrictions through `allowedModels`; describe softer preferences in the task.
79
+ Unknown keys and invalid limits fail validation. An empty eligible set stops the launch. These constraints do not turn a concrete model call into an automatic one. The catalog does not establish a latency SLA or a provider's privacy guarantees. Express hard provider restrictions through `allowedProviders`, `excludedProviders` or `allowedModels`; describe softer preferences in the task.
62
80
 
63
81
  For a persistent builtin override, put this in your user or project settings:
64
82
 
package/docs/subagents.md CHANGED
@@ -76,6 +76,8 @@ Runtime-created session contexts bind single launches to their actual session or
76
76
 
77
77
  Use `subagent({action: "wait", id: taskId})` to observe an existing task in the same owner without restarting it. It uses the owner's observation budget unless explicitly overridden.
78
78
 
79
+ When a task has settled, the launch result, `action: "wait"`, and `action: "status"` show its output after the task record: up to 16 KB of text, a `Full output:` path to a private copy of the complete result, and a `Requested output:` line naming the `output` file you asked for (background runs included). The private copies live in a temporary directory readable only by you and are removed when Atomic exits. With `outputMode: "file-only"` the text is only the saved-file reference, and the private copy holds the file's contents. A child that stops to ask a question through `contact_supervisor` settles with the question and a ready-to-run follow-up call in this output.
80
+
79
81
  The agent may choose foreground-first or background observation for each authorized call without asking the user merely to select a mode. When a foreground observation expires, the returned task is still running. Wait for terminal completion before using its result in dependent work. See [Choosing how long to wait](/background-tasks#choose-how-long-to-wait) for shell and subagent defaults and the separate execution-timeout behavior.
80
82
 
81
83
  User steering or an incoming Intercom ask/send admitted to the waiting parent releases its active subagent observations, including both foreground launches and `action: "wait"`. This applies to main chat and live workflow-stage chat. The parent can handle the queued message and reply without cancelling the child, closing its owner, or interrupting another owner's waits. User input yields with reason `input-needed`; Intercom coordination yields with reason `intercom-coordination`. The original task can be observed again after handling the message.
package/docs/usage.md CHANGED
@@ -17,7 +17,7 @@ This page covers interactive use: the interactive loop, slash commands, the mess
17
17
 
18
18
  The interface has four main areas:
19
19
 
20
- - **Startup header** - shortcuts plus named lists of loaded context files, prompt templates, skills, extensions, and themes; use the expand-tools shortcut (Ctrl+O by default) to switch those lists to source paths
20
+ - **Startup header** - shortcuts plus named lists of loaded context files, prompt templates, skills, and extensions; use the expand-tools shortcut (Ctrl+O by default) to switch those lists to source paths
21
21
  - **Messages** - user messages, assistant responses, tool calls, tool results, notifications, errors, and extension UI
22
22
  - **Editor** - where you type; border color indicates the current thinking level
23
23
  - **Footer** - working directory, session name, token/cache usage, cost, context usage, and current model
@@ -28,7 +28,7 @@ The editor can be replaced temporarily by built-in UI such as `/settings` or by
28
28
 
29
29
  The startup animation shows Atomic's identity. Press any key, including Ctrl+C, to finish it immediately and continue normal input. Quiet startup suppresses it; non-TTY sessions and `ATOMIC_REDUCED_MOTION=1` show the settled identity without animation. `NO_COLOR` removes foreground colors while retaining weight emphasis.
30
30
 
31
- Startup lists loaded context files, skills, prompts, extensions, and themes by name. Duplicate local extension names include path information. Expand the startup disclosure to see source paths.
31
+ Startup lists loaded context files, skills, prompts, and extensions by name. Custom themes are not listed; choose them in `/settings`. Duplicate local extension names include path information. Expand the startup disclosure to see source paths.
32
32
 
33
33
  While the agent works, `∀` pulses beside a working message. Retry, fallback, compaction, cancellation, and error messages take precedence; approval prompts hide ordinary activity. Set `ATOMIC_REDUCED_MOTION=1` for a static indicator or `NO_COLOR` for activity without foreground colors. Extensions can [customize the indicator](/tui#pattern-4b-working-indicator-customization).
34
34
 
@@ -177,7 +177,7 @@ Tasks done without a workflow record `Assistant-workflow: inline`. Each `Assista
177
177
 
178
178
  ## Exporting and Sharing Sessions
179
179
 
180
- Use `/export [file]` to write a session to HTML.
180
+ Use `/export [file]` to write a session to HTML. In the exported page, press `T` to toggle thinking, `O` to toggle tool output, and `H` to show custom messages that are hidden in the terminal. Hidden messages stay hidden until you toggle them, and selecting one in the sidebar reveals them.
181
181
 
182
182
  Use `/share` to upload a private GitHub gist with a shareable HTML link.
183
183
 
@@ -546,7 +546,7 @@ Selects the primary stage model. String values can carry the reasoning suffix de
546
546
 
547
547
  Use `model: "auto"` for prompt-based selection of an execution model and supported effort before session admission. Omission and concrete models keep prior behavior. Shared chain/parallel defaults accept `auto`; each stage receives one decision. The router sees the final supplied prompt, including interpolated inputs and supplied task context, rather than only a stage name.
548
548
 
549
- `modelConstraints?: ModelConstraints` applies hard restrictions to auto selection and execution/compaction fallbacks. Fields are `allowedModels?: string[]`, `allowedEfforts?: (string | null)[]`, `maxInputCost?: number`, `maxOutputCost?: number`, `minContextWindow?: number`, and `requiredInputs?: ("text" | "image")[]`. Model IDs are exact provider/model IDs. Costs are catalog USD per million tokens including pricing tiers, not task budgets. Efforts are `off`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max`, or `null` for nonreasoning models. Empty allowlists admit nothing. Inherited and stage restrictions all hold; a task override cannot widen shared restrictions. An authored `thinkingLevel` restricts auto selection to that supported effort.
549
+ `modelConstraints?: ModelConstraints` applies hard restrictions to auto selection and execution/compaction fallbacks. Fields are `allowedModels?: string[]`, `allowedProviders?: string[]`, `excludedProviders?: string[]`, `allowedEfforts?: (string | null)[]`, `maxInputCost?: number`, `maxOutputCost?: number`, `minContextWindow?: number`, and `requiredInputs?: ("text" | "image")[]`. Model IDs are exact provider/model IDs. Costs are catalog USD per million tokens including pricing tiers, not task budgets. Efforts are `off`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max`, or `null` for nonreasoning models. Empty allowlists admit nothing. Inherited and stage restrictions all hold; a task override cannot widen shared restrictions. An authored `thinkingLevel` restricts auto selection to that supported effort.
550
550
 
551
551
  An auto stage has no session until it receives prompt text. Model-dependent operations such as `compact()` or `cycleModel()` before that point report an error; call `prompt()` first or deliberately select a concrete model with `setModel()`. Session operations after admission keep their normal behavior.
552
552
 
@@ -60,13 +60,7 @@ const result = await ctx.task("analyze", {
60
60
 
61
61
  `ctx.stage("analyze", { model: "auto" }).prompt(text)` works too. Set `model: "auto"` in chain or parallel shared options to route each stage separately. The decision uses the actual supplied prompt after input interpolation and chain context expansion, eligible models and efforts, and compact dated evaluation evidence rather than full guides. It ranks up to three distinct models with an effort for each, trying them in order before remaining configured fallbacks and the current chat model. File references remain references, not guessed file contents. See [automatic model selection](/subagents/reference#automatic-model-selection) for ranking and limits.
62
62
 
63
- Long prompts are excerpted for model selection only; the stage still receives the full execution prompt. The router sees the beginning of the prompt, its end, and every `<keepContext>...</keepContext>` span, with each cut marked `[... truncated ...]`. The excerpt is at most about 9 KB (roughly 1,200 words) and can be smaller when many models are eligible. Hard `modelConstraints` remain enforced independently.
64
-
65
- Structure `model: "auto"` prompts so the router sees what decides the model:
66
-
67
- - Put the stage's role and objective in the first or last lines, or in a short `<keepContext>` span. Text in the unprotected middle may be cut.
68
- - Put bulky material (issue bodies, artifact reads, prior-stage output) in the middle, or pass it through files and `reads`.
69
- - Keep `<keepContext>` spans to a few lines of constraints. If the spans alone exceed the excerpt, the router receives only the start and end of the prompt, cutting through the middle of the protected text.
63
+ A chat model reads the complete stage prompt to answer the routing questions; a classifier router such as Jev never sees it. Hard `modelConstraints` remain enforced independently. Set `taskNeeds` in the stage options when you already know the task's kind of work, difficulty, mistake cost, or need for images, a very large context or a fast answer; stating all six skips the chat model's read, and list the contenders in `modelConstraints.allowedModels` to choose them yourself.
70
64
 
71
65
  ```ts
72
66
  const prompt = [
@@ -144,7 +144,7 @@ All six can run by name or as nested definitions. Prefer composition over copyin
144
144
 
145
145
  Goal keeps the literal objective and immutable acceptance criteria in a durable ledger, delegates implementation, and asks independent reviewers to inspect current changes. Its decision is `complete`, `blocked`, or `needs_human`. Resume retains the run identity and checkpointed progress without repeating completed effects.
146
146
 
147
- Goal reviewers derive checks from the literal objective before consulting implementation receipts, inspect the actual checkout delta, and report commands, observed output, and file:line evidence rather than internal reasoning. Shared contracts cover acceptance-matrix traceability, contract-fidelity risks, end-to-end and QA-video evidence, and independent verification. `stop_review_loop` is the authoritative convergence signal: it remains `false` for P0–P2 findings, any `required_by_objective` finding, or unproven implementation/validation requirements; it becomes `true` only when independent evidence proves the objective and only non-blocking or authorized post-approval work remains. The deterministic reducer consumes that signal without reinterpreting free-form prose.
147
+ Goal reviewers derive checks from the literal objective before consulting implementation receipts, inspect the actual checkout delta, and report commands, observed output, and file:line evidence rather than internal reasoning. Shared contracts cover acceptance-matrix traceability, contract-fidelity risks, end-to-end and QA-video evidence, and independent verification. `stop_review_loop` is the authoritative convergence signal: it remains `false` for P0–P2 findings, any `required_by_objective` finding, or unproven implementation/validation requirements; it becomes `true` only when independent evidence proves the objective and only non-blocking or authorized post-approval work remains. The deterministic reducer consumes that signal without reinterpreting free-form prose, but a `stop_review_loop=true` vote does not count toward the reviewer quorum when the same review reports `overall_correctness: "patch is incorrect"`, `goal_oracle_satisfied: false`, or a blocking finding (P0–P2, or any `required_by_objective` finding). Ralph applies the same check to its reviews.
148
148
  Goal and Ralph worker, reviewer and final handoff prompts share [verification and evidence guidance](/workflows/verification): browser, terminal and desktop/simulator routing; environment-aware setup and truthful fallback; qlty initialization or manual offline configuration selected from user/repository priorities; and authorized native GitHub media attachment with hosted-link confirmation. Existing config, read-only tasks and authoritative project checks remain protected. Explicit task-scoped inline/no-workflow steering overrides an existing execution plan and requires safe reconciliation of active work before continuing without duplicate execution.
149
149
  Both workflows also share repository-intent mining guidance: implementers and reviewers infer maintainer and requesting-user conventions from repository behavior — git history (including `git log --show-signature`), merged PRs, issues and their comments, review comments, commit subjects and trailers, and CI/branch-protection config — covering norms written docs rarely state, such as commit signing, message style and issue linking, changelog discipline, and review etiquette. The dominant, recent, intentional pattern wins over accidental drift, the requesting user's own activity weighs highest, implementers match the inferred conventions (an unsigned commit in a signed history is a miss, not a preference), and reviewers report deviations as convention findings. Behavioral evidence fills contract gaps; it never overrides the literal objective, acceptance criteria, or explicit `AGENTS.md`/`CLAUDE.md` guidance.
150
150
  Goal and Ralph share the same low-confidence finding re-verification and per-round convergence evidence, documented under [`ralph`](/workflows/builtins#ralph).
@@ -433,7 +433,7 @@ Do not tag bulk context. Protected lines count against the keep target rather th
433
433
 
434
434
  Every builtin does this for its own invariants: the steering propagation contract, the literal objective contract, scope discipline, worktree discipline, per-run acceptance criteria, and the research/review role constraints are all protected. See [Compaction](/compaction#keepcontext-tags) for the retention mechanism.
435
435
 
436
- The same tags guide automatic model selection. A `model: "auto"` stage routes on an excerpt of its prompt: the beginning, the end, and every protected span. Short spans that name the role and objective keep that decision grounded. Large spans crowd out the beginning and end, and spans that alone exceed the excerpt are cut through the middle. See [automatic stage model selection](/workflows/authoring#automatic-stage-model-selection).
436
+ For automatic model selection, a chat model reads the whole `model: "auto"` stage prompt; stating `taskNeeds` in the stage options saves that read. See [automatic stage model selection](/workflows/authoring#automatic-stage-model-selection).
437
437
 
438
438
  #### Tagging is not only for workflow authors
439
439
 
@@ -1,16 +1,16 @@
1
1
  /**
2
2
  * Test script for GitLab Duo extension
3
- * Run: npx tsx test.ts [model-id] [--thinking]
3
+ * Run: node test.ts [model-id] [--thinking]
4
4
  *
5
5
  * Examples:
6
- * npx tsx test.ts # Test default (claude-sonnet-4-5-20250929)
7
- * npx tsx test.ts gpt-5-codex # Test GPT-5 Codex
8
- * npx tsx test.ts claude-sonnet-4-5-20250929 --thinking
6
+ * node test.ts # Test default (claude-sonnet-4-5-20250929)
7
+ * node test.ts gpt-5-codex # Test GPT-5 Codex
8
+ * node test.ts claude-sonnet-4-5-20250929 --thinking
9
9
  */
10
10
 
11
+ import { getAgentDir } from "@bastani/atomic";
11
12
  import { type Api, type Context, type Model, registerApiProvider, streamSimple } from "@bastani/pi-ai/compat";
12
13
  import { readFileSync } from "fs";
13
- import { getAgentDir } from "packages/coding-agent/src/config.js";
14
14
  import { join } from "path";
15
15
  import { MODELS, streamGitLabDuo } from "./index.ts";
16
16
 
@@ -6,7 +6,7 @@
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
8
8
  "build": "echo 'nothing to build'",
9
- "check": "tsgo -p ../../../test/tsconfig.remote-examples.json"
9
+ "check": "tsc -p ../../../test/tsconfig.remote-examples.json"
10
10
  },
11
11
  "dependencies": {
12
12
  "@earendil-works/gondolin": "0.12.0"
@@ -2,7 +2,7 @@
2
2
  * Run one prompt through an Atomic RPC child process.
3
3
  *
4
4
  * Build the coding-agent package first, then run:
5
- * npx tsx examples/rpc-client.ts "Explain this repository"
5
+ * node examples/rpc-client.ts "Explain this repository"
6
6
  *
7
7
  * RpcClient launches the CLI under Bun by default; pass
8
8
  * `runtimeExecutable: process.execPath` to run it under Node instead.
@@ -5,7 +5,7 @@
5
5
  * Demonstrates how to build a custom UI on top of the RPC protocol,
6
6
  * including handling extension UI requests (select, confirm, input, editor).
7
7
  *
8
- * Usage: npx tsx examples/rpc-extension-ui.ts
8
+ * Usage: bun examples/rpc-extension-ui.ts
9
9
  *
10
10
  * Slash commands:
11
11
  * /select - demo select dialog