@bastani/atomic 0.9.11-alpha.2 → 0.9.11-alpha.4

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 (495) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/builtin/cursor/package.json +2 -2
  3. package/dist/builtin/intercom/package.json +1 -1
  4. package/dist/builtin/mcp/package.json +1 -1
  5. package/dist/builtin/subagents/CHANGELOG.md +6 -0
  6. package/dist/builtin/subagents/package.json +1 -1
  7. package/dist/builtin/subagents/src/runs/background/notify.ts +3 -1
  8. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +5 -2
  9. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +2 -1
  10. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +5 -2
  11. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +34 -0
  12. package/dist/builtin/web-access/package.json +1 -1
  13. package/dist/builtin/workflows/CHANGELOG.md +20 -0
  14. package/dist/builtin/workflows/builtin/goal-prompts.ts +8 -3
  15. package/dist/builtin/workflows/builtin/goal.ts +4 -4
  16. package/dist/builtin/workflows/builtin/ralph-forked-prompts.ts +1 -1
  17. package/dist/builtin/workflows/builtin/ralph-reviewer-prompt.ts +3 -1
  18. package/dist/builtin/workflows/builtin/ralph-runner.ts +2 -0
  19. package/dist/builtin/workflows/builtin/ralph.ts +4 -4
  20. package/dist/builtin/workflows/builtin/shared-prompts.ts +16 -0
  21. package/dist/builtin/workflows/package.json +2 -2
  22. package/dist/builtin/workflows/src/authoring/workflow.ts +1 -0
  23. package/dist/builtin/workflows/src/durable/dbos-lifecycle.ts +27 -1
  24. package/dist/builtin/workflows/src/durable/factory.ts +29 -3
  25. package/dist/builtin/workflows/src/durable/index.ts +2 -0
  26. package/dist/builtin/workflows/src/engine/run-durable-admission.ts +50 -0
  27. package/dist/builtin/workflows/src/engine/run.ts +12 -17
  28. package/dist/builtin/workflows/src/extension/extension-factory.ts +16 -1
  29. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +16 -2
  30. package/dist/builtin/workflows/src/extension/index.bundle.mjs +71724 -0
  31. package/dist/builtin/workflows/src/extension/runtime.ts +5 -3
  32. package/dist/builtin/workflows/src/extension/ui-surface.ts +4 -0
  33. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +4 -1
  34. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +3 -1
  35. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +1 -0
  36. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +1 -0
  37. package/dist/builtin/workflows/src/shared/types.ts +7 -0
  38. package/dist/builtin/workflows/src/shared/workflow-authoring-types.d.ts +1 -0
  39. package/dist/builtin/workflows/src/shared/workflow-authoring-types.ts +1 -0
  40. package/dist/builtin/workflows/src/tui/host-input-form.ts +1 -1
  41. package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +6 -8
  42. package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +2 -0
  43. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +4 -0
  44. package/dist/cli/args.d.ts +8 -0
  45. package/dist/cli/args.d.ts.map +1 -1
  46. package/dist/cli/args.js +18 -2
  47. package/dist/cli/args.js.map +1 -1
  48. package/dist/cli/config-selector.d.ts +4 -2
  49. package/dist/cli/config-selector.d.ts.map +1 -1
  50. package/dist/cli/config-selector.js +1 -1
  51. package/dist/cli/config-selector.js.map +1 -1
  52. package/dist/cli/startup-ui.d.ts +3 -0
  53. package/dist/cli/startup-ui.d.ts.map +1 -1
  54. package/dist/cli/startup-ui.js +50 -1
  55. package/dist/cli/startup-ui.js.map +1 -1
  56. package/dist/cli.js +2 -0
  57. package/dist/cli.js.map +1 -1
  58. package/dist/config-command-parser.d.ts +9 -0
  59. package/dist/config-command-parser.d.ts.map +1 -0
  60. package/dist/config-command-parser.js +22 -0
  61. package/dist/config-command-parser.js.map +1 -0
  62. package/dist/config-self-update.d.ts +6 -2
  63. package/dist/config-self-update.d.ts.map +1 -1
  64. package/dist/config-self-update.js +17 -10
  65. package/dist/config-self-update.js.map +1 -1
  66. package/dist/config.d.ts +3 -3
  67. package/dist/config.d.ts.map +1 -1
  68. package/dist/config.js +4 -4
  69. package/dist/config.js.map +1 -1
  70. package/dist/core/agent-session-export.d.ts.map +1 -1
  71. package/dist/core/agent-session-export.js +32 -25
  72. package/dist/core/agent-session-export.js.map +1 -1
  73. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  74. package/dist/core/agent-session-extension-bindings.js +9 -3
  75. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  76. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  77. package/dist/core/agent-session-prompt.js +5 -0
  78. package/dist/core/agent-session-prompt.js.map +1 -1
  79. package/dist/core/agent-session-services.d.ts +2 -0
  80. package/dist/core/agent-session-services.d.ts.map +1 -1
  81. package/dist/core/agent-session-services.js +8 -5
  82. package/dist/core/agent-session-services.js.map +1 -1
  83. package/dist/core/agent-session-tree.d.ts.map +1 -1
  84. package/dist/core/agent-session-tree.js +3 -1
  85. package/dist/core/agent-session-tree.js.map +1 -1
  86. package/dist/core/agent-session-types.d.ts +5 -0
  87. package/dist/core/agent-session-types.d.ts.map +1 -1
  88. package/dist/core/agent-session-types.js.map +1 -1
  89. package/dist/core/auth-storage.d.ts +6 -2
  90. package/dist/core/auth-storage.d.ts.map +1 -1
  91. package/dist/core/auth-storage.js +5 -1
  92. package/dist/core/auth-storage.js.map +1 -1
  93. package/dist/core/cache-stats.d.ts +25 -0
  94. package/dist/core/cache-stats.d.ts.map +1 -0
  95. package/dist/core/cache-stats.js +68 -0
  96. package/dist/core/cache-stats.js.map +1 -0
  97. package/dist/core/compaction/branch-summarization.d.ts +2 -1
  98. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  99. package/dist/core/compaction/branch-summarization.js +1 -0
  100. package/dist/core/compaction/branch-summarization.js.map +1 -1
  101. package/dist/core/extensions/agent-events.d.ts +10 -0
  102. package/dist/core/extensions/agent-events.d.ts.map +1 -1
  103. package/dist/core/extensions/agent-events.js.map +1 -1
  104. package/dist/core/extensions/api-types.d.ts +8 -2
  105. package/dist/core/extensions/api-types.d.ts.map +1 -1
  106. package/dist/core/extensions/api-types.js.map +1 -1
  107. package/dist/core/extensions/event-types.d.ts +2 -2
  108. package/dist/core/extensions/event-types.d.ts.map +1 -1
  109. package/dist/core/extensions/event-types.js.map +1 -1
  110. package/dist/core/extensions/index.d.ts +1 -1
  111. package/dist/core/extensions/index.d.ts.map +1 -1
  112. package/dist/core/extensions/index.js.map +1 -1
  113. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  114. package/dist/core/extensions/loader-api.js +13 -2
  115. package/dist/core/extensions/loader-api.js.map +1 -1
  116. package/dist/core/extensions/loader-core.d.ts.map +1 -1
  117. package/dist/core/extensions/loader-core.js +1 -0
  118. package/dist/core/extensions/loader-core.js.map +1 -1
  119. package/dist/core/extensions/loader-runtime.d.ts.map +1 -1
  120. package/dist/core/extensions/loader-runtime.js +15 -7
  121. package/dist/core/extensions/loader-runtime.js.map +1 -1
  122. package/dist/core/extensions/message-types.d.ts +5 -0
  123. package/dist/core/extensions/message-types.d.ts.map +1 -1
  124. package/dist/core/extensions/message-types.js.map +1 -1
  125. package/dist/core/extensions/provider-types.d.ts +46 -0
  126. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  127. package/dist/core/extensions/provider-types.js.map +1 -1
  128. package/dist/core/extensions/runner-registries.d.ts +2 -1
  129. package/dist/core/extensions/runner-registries.d.ts.map +1 -1
  130. package/dist/core/extensions/runner-registries.js +8 -0
  131. package/dist/core/extensions/runner-registries.js.map +1 -1
  132. package/dist/core/extensions/runner.d.ts +5 -2
  133. package/dist/core/extensions/runner.d.ts.map +1 -1
  134. package/dist/core/extensions/runner.js +35 -13
  135. package/dist/core/extensions/runner.js.map +1 -1
  136. package/dist/core/extensions/runtime-types.d.ts +8 -2
  137. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  138. package/dist/core/extensions/runtime-types.js.map +1 -1
  139. package/dist/core/extensions/ui-types.d.ts +4 -0
  140. package/dist/core/extensions/ui-types.d.ts.map +1 -1
  141. package/dist/core/extensions/ui-types.js.map +1 -1
  142. package/dist/core/http-dispatcher.d.ts +1 -0
  143. package/dist/core/http-dispatcher.d.ts.map +1 -1
  144. package/dist/core/http-dispatcher.js +16 -2
  145. package/dist/core/http-dispatcher.js.map +1 -1
  146. package/dist/core/keybindings.d.ts +6 -1
  147. package/dist/core/keybindings.d.ts.map +1 -1
  148. package/dist/core/keybindings.js +3 -1
  149. package/dist/core/keybindings.js.map +1 -1
  150. package/dist/core/model-registry-auth.d.ts +2 -0
  151. package/dist/core/model-registry-auth.d.ts.map +1 -1
  152. package/dist/core/model-registry-auth.js +18 -1
  153. package/dist/core/model-registry-auth.js.map +1 -1
  154. package/dist/core/model-registry-custom-loader.d.ts.map +1 -1
  155. package/dist/core/model-registry-custom-loader.js +14 -2
  156. package/dist/core/model-registry-custom-loader.js.map +1 -1
  157. package/dist/core/model-registry-dynamic.js +2 -2
  158. package/dist/core/model-registry-dynamic.js.map +1 -1
  159. package/dist/core/model-registry-loader.d.ts.map +1 -1
  160. package/dist/core/model-registry-loader.js +2 -1
  161. package/dist/core/model-registry-loader.js.map +1 -1
  162. package/dist/core/model-registry-schemas.d.ts +17 -0
  163. package/dist/core/model-registry-schemas.d.ts.map +1 -1
  164. package/dist/core/model-registry-schemas.js +2 -0
  165. package/dist/core/model-registry-schemas.js.map +1 -1
  166. package/dist/core/model-registry-types.d.ts +10 -1
  167. package/dist/core/model-registry-types.d.ts.map +1 -1
  168. package/dist/core/model-registry-types.js.map +1 -1
  169. package/dist/core/model-registry.d.ts +26 -36
  170. package/dist/core/model-registry.d.ts.map +1 -1
  171. package/dist/core/model-registry.js +72 -67
  172. package/dist/core/model-registry.js.map +1 -1
  173. package/dist/core/model-resolver-defaults.d.ts.map +1 -1
  174. package/dist/core/model-resolver-defaults.js +3 -0
  175. package/dist/core/model-resolver-defaults.js.map +1 -1
  176. package/dist/core/model-runtime.d.ts +52 -0
  177. package/dist/core/model-runtime.d.ts.map +1 -0
  178. package/dist/core/model-runtime.js +120 -0
  179. package/dist/core/model-runtime.js.map +1 -0
  180. package/dist/core/oauth-provider-bridge.d.ts +3 -1
  181. package/dist/core/oauth-provider-bridge.d.ts.map +1 -1
  182. package/dist/core/oauth-provider-bridge.js +6 -4
  183. package/dist/core/oauth-provider-bridge.js.map +1 -1
  184. package/dist/core/package-manager-resolver.js +22 -11
  185. package/dist/core/package-manager-resolver.js.map +1 -1
  186. package/dist/core/package-manager-resource-collector.d.ts.map +1 -1
  187. package/dist/core/package-manager-resource-collector.js +8 -2
  188. package/dist/core/package-manager-resource-collector.js.map +1 -1
  189. package/dist/core/package-manager-resource-patterns.d.ts +1 -0
  190. package/dist/core/package-manager-resource-patterns.d.ts.map +1 -1
  191. package/dist/core/package-manager-resource-patterns.js +15 -0
  192. package/dist/core/package-manager-resource-patterns.js.map +1 -1
  193. package/dist/core/package-manager-source.d.ts.map +1 -1
  194. package/dist/core/package-manager-source.js +15 -8
  195. package/dist/core/package-manager-source.js.map +1 -1
  196. package/dist/core/package-manager-types.d.ts +1 -0
  197. package/dist/core/package-manager-types.d.ts.map +1 -1
  198. package/dist/core/package-manager-types.js.map +1 -1
  199. package/dist/core/provider-display-names.d.ts.map +1 -1
  200. package/dist/core/provider-display-names.js +4 -0
  201. package/dist/core/provider-display-names.js.map +1 -1
  202. package/dist/core/resource-loader-core.d.ts.map +1 -1
  203. package/dist/core/resource-loader-core.js.map +1 -1
  204. package/dist/core/resource-loader-extensions.d.ts.map +1 -1
  205. package/dist/core/resource-loader-extensions.js +5 -2
  206. package/dist/core/resource-loader-extensions.js.map +1 -1
  207. package/dist/core/resource-loader-helpers.d.ts.map +1 -1
  208. package/dist/core/resource-loader-helpers.js +1 -0
  209. package/dist/core/resource-loader-helpers.js.map +1 -1
  210. package/dist/core/resource-loader-internals.d.ts +2 -2
  211. package/dist/core/resource-loader-internals.d.ts.map +1 -1
  212. package/dist/core/resource-loader-internals.js.map +1 -1
  213. package/dist/core/resource-loader-types.d.ts +3 -3
  214. package/dist/core/resource-loader-types.d.ts.map +1 -1
  215. package/dist/core/resource-loader-types.js.map +1 -1
  216. package/dist/core/sdk-exports.d.ts +1 -1
  217. package/dist/core/sdk-exports.d.ts.map +1 -1
  218. package/dist/core/sdk-exports.js.map +1 -1
  219. package/dist/core/sdk-types.d.ts +3 -0
  220. package/dist/core/sdk-types.d.ts.map +1 -1
  221. package/dist/core/sdk-types.js.map +1 -1
  222. package/dist/core/sdk.js +6 -2
  223. package/dist/core/sdk.js.map +1 -1
  224. package/dist/core/session-manager-core.d.ts +1 -1
  225. package/dist/core/session-manager-core.d.ts.map +1 -1
  226. package/dist/core/session-manager-core.js +2 -2
  227. package/dist/core/session-manager-core.js.map +1 -1
  228. package/dist/core/session-manager-entries.d.ts +2 -2
  229. package/dist/core/session-manager-entries.d.ts.map +1 -1
  230. package/dist/core/session-manager-entries.js +2 -1
  231. package/dist/core/session-manager-entries.js.map +1 -1
  232. package/dist/core/session-manager-history.d.ts +5 -0
  233. package/dist/core/session-manager-history.d.ts.map +1 -1
  234. package/dist/core/session-manager-history.js +33 -0
  235. package/dist/core/session-manager-history.js.map +1 -1
  236. package/dist/core/session-manager-types.d.ts +4 -2
  237. package/dist/core/session-manager-types.d.ts.map +1 -1
  238. package/dist/core/session-manager-types.js.map +1 -1
  239. package/dist/core/session-manager.d.ts +1 -1
  240. package/dist/core/session-manager.d.ts.map +1 -1
  241. package/dist/core/session-manager.js +1 -1
  242. package/dist/core/session-manager.js.map +1 -1
  243. package/dist/core/settings-manager-basic-accessors.d.ts +7 -0
  244. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  245. package/dist/core/settings-manager-basic-accessors.js +35 -0
  246. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  247. package/dist/core/settings-manager-resource-accessors.d.ts +3 -0
  248. package/dist/core/settings-manager-resource-accessors.d.ts.map +1 -1
  249. package/dist/core/settings-manager-resource-accessors.js +16 -0
  250. package/dist/core/settings-manager-resource-accessors.js.map +1 -1
  251. package/dist/core/settings-types.d.ts +8 -2
  252. package/dist/core/settings-types.d.ts.map +1 -1
  253. package/dist/core/settings-types.js.map +1 -1
  254. package/dist/core/slash-commands.d.ts +1 -0
  255. package/dist/core/slash-commands.d.ts.map +1 -1
  256. package/dist/core/slash-commands.js +1 -1
  257. package/dist/core/slash-commands.js.map +1 -1
  258. package/dist/core/usage-totals.d.ts +18 -0
  259. package/dist/core/usage-totals.d.ts.map +1 -0
  260. package/dist/core/usage-totals.js +40 -0
  261. package/dist/core/usage-totals.js.map +1 -0
  262. package/dist/extensions/index.d.ts +3 -0
  263. package/dist/extensions/index.d.ts.map +1 -0
  264. package/dist/extensions/index.js +5 -0
  265. package/dist/extensions/index.js.map +1 -0
  266. package/dist/extensions/llama/client.d.ts +61 -0
  267. package/dist/extensions/llama/client.d.ts.map +1 -0
  268. package/dist/extensions/llama/client.js +300 -0
  269. package/dist/extensions/llama/client.js.map +1 -0
  270. package/dist/extensions/llama/huggingface-ui.d.ts +33 -0
  271. package/dist/extensions/llama/huggingface-ui.d.ts.map +1 -0
  272. package/dist/extensions/llama/huggingface-ui.js +166 -0
  273. package/dist/extensions/llama/huggingface-ui.js.map +1 -0
  274. package/dist/extensions/llama/huggingface.d.ts +23 -0
  275. package/dist/extensions/llama/huggingface.d.ts.map +1 -0
  276. package/dist/extensions/llama/huggingface.js +139 -0
  277. package/dist/extensions/llama/huggingface.js.map +1 -0
  278. package/dist/extensions/llama/index.d.ts +3 -0
  279. package/dist/extensions/llama/index.d.ts.map +1 -0
  280. package/dist/extensions/llama/index.js +208 -0
  281. package/dist/extensions/llama/index.js.map +1 -0
  282. package/dist/extensions/llama/provider.d.ts +11 -0
  283. package/dist/extensions/llama/provider.d.ts.map +1 -0
  284. package/dist/extensions/llama/provider.js +93 -0
  285. package/dist/extensions/llama/provider.js.map +1 -0
  286. package/dist/extensions/llama/ui.d.ts +42 -0
  287. package/dist/extensions/llama/ui.d.ts.map +1 -0
  288. package/dist/extensions/llama/ui.js +237 -0
  289. package/dist/extensions/llama/ui.js.map +1 -0
  290. package/dist/index-extensions.d.ts +1 -1
  291. package/dist/index-extensions.d.ts.map +1 -1
  292. package/dist/index-extensions.js.map +1 -1
  293. package/dist/index.d.ts +4 -3
  294. package/dist/index.d.ts.map +1 -1
  295. package/dist/index.js +4 -3
  296. package/dist/index.js.map +1 -1
  297. package/dist/main-first-time-setup.d.ts +6 -0
  298. package/dist/main-first-time-setup.d.ts.map +1 -0
  299. package/dist/main-first-time-setup.js +10 -0
  300. package/dist/main-first-time-setup.js.map +1 -0
  301. package/dist/main-types.d.ts +2 -2
  302. package/dist/main-types.d.ts.map +1 -1
  303. package/dist/main-types.js.map +1 -1
  304. package/dist/main.d.ts.map +1 -1
  305. package/dist/main.js +17 -7
  306. package/dist/main.js.map +1 -1
  307. package/dist/modes/interactive/chat-input-actions.d.ts.map +1 -1
  308. package/dist/modes/interactive/chat-input-actions.js +14 -2
  309. package/dist/modes/interactive/chat-input-actions.js.map +1 -1
  310. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -1
  311. package/dist/modes/interactive/components/chat-session-host-rendering.js +5 -1
  312. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  313. package/dist/modes/interactive/components/config-selector-list.d.ts +6 -6
  314. package/dist/modes/interactive/components/config-selector-list.d.ts.map +1 -1
  315. package/dist/modes/interactive/components/config-selector-list.js +64 -125
  316. package/dist/modes/interactive/components/config-selector-list.js.map +1 -1
  317. package/dist/modes/interactive/components/config-selector-project-scope.d.ts +4 -0
  318. package/dist/modes/interactive/components/config-selector-project-scope.d.ts.map +1 -0
  319. package/dist/modes/interactive/components/config-selector-project-scope.js +61 -0
  320. package/dist/modes/interactive/components/config-selector-project-scope.js.map +1 -0
  321. package/dist/modes/interactive/components/config-selector.d.ts +8 -5
  322. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  323. package/dist/modes/interactive/components/config-selector.js +46 -22
  324. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  325. package/dist/modes/interactive/components/custom-entry.d.ts +16 -0
  326. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -0
  327. package/dist/modes/interactive/components/custom-entry.js +45 -0
  328. package/dist/modes/interactive/components/custom-entry.js.map +1 -0
  329. package/dist/modes/interactive/components/first-time-setup.d.ts +24 -0
  330. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
  331. package/dist/modes/interactive/components/first-time-setup.js +69 -0
  332. package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
  333. package/dist/modes/interactive/components/footer.d.ts +7 -1
  334. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  335. package/dist/modes/interactive/components/footer.js +55 -27
  336. package/dist/modes/interactive/components/footer.js.map +1 -1
  337. package/dist/modes/interactive/components/host-input-form.d.ts +2 -0
  338. package/dist/modes/interactive/components/host-input-form.d.ts.map +1 -1
  339. package/dist/modes/interactive/components/host-input-form.js +6 -3
  340. package/dist/modes/interactive/components/host-input-form.js.map +1 -1
  341. package/dist/modes/interactive/components/idle-status.d.ts +8 -0
  342. package/dist/modes/interactive/components/idle-status.d.ts.map +1 -0
  343. package/dist/modes/interactive/components/idle-status.js +13 -0
  344. package/dist/modes/interactive/components/idle-status.js.map +1 -0
  345. package/dist/modes/interactive/components/index.d.ts +3 -0
  346. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  347. package/dist/modes/interactive/components/index.js +3 -0
  348. package/dist/modes/interactive/components/index.js.map +1 -1
  349. package/dist/modes/interactive/components/login-dialog.d.ts +5 -5
  350. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  351. package/dist/modes/interactive/components/login-dialog.js +14 -6
  352. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  353. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  354. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  355. package/dist/modes/interactive/components/oauth-selector.js +10 -6
  356. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  357. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
  358. package/dist/modes/interactive/components/settings-selector-handlers.js +6 -0
  359. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
  360. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  361. package/dist/modes/interactive/components/settings-selector-items.js +14 -0
  362. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  363. package/dist/modes/interactive/components/settings-selector-types.d.ts +4 -0
  364. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  365. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  366. package/dist/modes/interactive/interactive-agent-events.js +21 -0
  367. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  368. package/dist/modes/interactive/interactive-auth-login.js +17 -8
  369. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  370. package/dist/modes/interactive/interactive-auth-routing.d.ts +2 -0
  371. package/dist/modes/interactive/interactive-auth-routing.d.ts.map +1 -1
  372. package/dist/modes/interactive/interactive-auth-routing.js +88 -40
  373. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  374. package/dist/modes/interactive/interactive-autocomplete.js +6 -0
  375. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  376. package/dist/modes/interactive/interactive-extension-runtime.js +4 -0
  377. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  378. package/dist/modes/interactive/interactive-global-clear.d.ts +10 -2
  379. package/dist/modes/interactive/interactive-global-clear.d.ts.map +1 -1
  380. package/dist/modes/interactive/interactive-global-clear.js +3 -1
  381. package/dist/modes/interactive/interactive-global-clear.js.map +1 -1
  382. package/dist/modes/interactive/interactive-input-handling.js +6 -4
  383. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  384. package/dist/modes/interactive/interactive-mode-helpers.d.ts +2 -1
  385. package/dist/modes/interactive/interactive-mode-helpers.d.ts.map +1 -1
  386. package/dist/modes/interactive/interactive-mode-helpers.js +6 -10
  387. package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -1
  388. package/dist/modes/interactive/interactive-mode-surface.d.ts +11 -2
  389. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  390. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  391. package/dist/modes/interactive/interactive-render-chat.js +69 -12
  392. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  393. package/dist/modes/interactive/interactive-resource-rendering.js +1 -1
  394. package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
  395. package/dist/modes/interactive/interactive-selectors.js +10 -0
  396. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  397. package/dist/modes/interactive/interactive-session-routing.js +3 -0
  398. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  399. package/dist/modes/interactive/interactive-slash-commands.js +14 -0
  400. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  401. package/dist/modes/interactive/login-provider-options.d.ts +21 -0
  402. package/dist/modes/interactive/login-provider-options.d.ts.map +1 -0
  403. package/dist/modes/interactive/login-provider-options.js +51 -0
  404. package/dist/modes/interactive/login-provider-options.js.map +1 -0
  405. package/dist/modes/interactive-engine/engine-input-form.d.ts +1 -1
  406. package/dist/modes/interactive-engine/engine-input-form.d.ts.map +1 -1
  407. package/dist/modes/interactive-engine/engine-input-form.js +10 -2
  408. package/dist/modes/interactive-engine/engine-input-form.js.map +1 -1
  409. package/dist/modes/interactive-engine/engine-monitor.d.ts +8 -1
  410. package/dist/modes/interactive-engine/engine-monitor.d.ts.map +1 -1
  411. package/dist/modes/interactive-engine/engine-monitor.js +13 -15
  412. package/dist/modes/interactive-engine/engine-monitor.js.map +1 -1
  413. package/dist/modes/interactive-engine/input-form-host.d.ts.map +1 -1
  414. package/dist/modes/interactive-engine/input-form-host.js +7 -2
  415. package/dist/modes/interactive-engine/input-form-host.js.map +1 -1
  416. package/dist/modes/interactive-engine/isolated-runtime.js +1 -1
  417. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  418. package/dist/modes/interactive-engine/protocol.d.ts +5 -0
  419. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
  420. package/dist/modes/interactive-engine/protocol.js +9 -1
  421. package/dist/modes/interactive-engine/protocol.js.map +1 -1
  422. package/dist/modes/interactive-engine/remote-model-catalog.d.ts +2 -0
  423. package/dist/modes/interactive-engine/remote-model-catalog.d.ts.map +1 -1
  424. package/dist/modes/interactive-engine/remote-model-catalog.js +33 -0
  425. package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
  426. package/dist/modes/rpc/rpc-client-api.d.ts +3 -1
  427. package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
  428. package/dist/modes/rpc/rpc-client-api.js +15 -0
  429. package/dist/modes/rpc/rpc-client-api.js.map +1 -1
  430. package/dist/modes/rpc/rpc-client-process.d.ts.map +1 -1
  431. package/dist/modes/rpc/rpc-client-process.js +3 -0
  432. package/dist/modes/rpc/rpc-client-process.js.map +1 -1
  433. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  434. package/dist/modes/rpc/rpc-client.js +1 -0
  435. package/dist/modes/rpc/rpc-client.js.map +1 -1
  436. package/dist/modes/rpc/rpc-command-handler.d.ts +5 -1
  437. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  438. package/dist/modes/rpc/rpc-command-handler.js +62 -2
  439. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  440. package/dist/modes/rpc/rpc-extension-ui.d.ts +3 -1
  441. package/dist/modes/rpc/rpc-extension-ui.d.ts.map +1 -1
  442. package/dist/modes/rpc/rpc-extension-ui.js +7 -2
  443. package/dist/modes/rpc/rpc-extension-ui.js.map +1 -1
  444. package/dist/modes/rpc/rpc-input-scheduler.d.ts.map +1 -1
  445. package/dist/modes/rpc/rpc-input-scheduler.js +1 -0
  446. package/dist/modes/rpc/rpc-input-scheduler.js.map +1 -1
  447. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  448. package/dist/modes/rpc/rpc-mode.js +1 -0
  449. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  450. package/dist/modes/rpc/rpc-session-binding.d.ts +1 -0
  451. package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -1
  452. package/dist/modes/rpc/rpc-session-binding.js +66 -43
  453. package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
  454. package/dist/modes/rpc/rpc-types.d.ts +31 -0
  455. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  456. package/dist/modes/rpc/rpc-types.js.map +1 -1
  457. package/dist/package-manager-cli.d.ts +3 -3
  458. package/dist/package-manager-cli.d.ts.map +1 -1
  459. package/dist/package-manager-cli.js +55 -51
  460. package/dist/package-manager-cli.js.map +1 -1
  461. package/dist/rpc-entry.js +6 -2
  462. package/dist/rpc-entry.js.map +1 -1
  463. package/dist/self-update-plan.d.ts +12 -0
  464. package/dist/self-update-plan.d.ts.map +1 -0
  465. package/dist/self-update-plan.js +42 -0
  466. package/dist/self-update-plan.js.map +1 -0
  467. package/dist/utils/clipboard-native.d.ts +1 -0
  468. package/dist/utils/clipboard-native.d.ts.map +1 -1
  469. package/dist/utils/clipboard-native.js.map +1 -1
  470. package/dist/utils/clipboard.d.ts +3 -0
  471. package/dist/utils/clipboard.d.ts.map +1 -1
  472. package/dist/utils/clipboard.js +10 -0
  473. package/dist/utils/clipboard.js.map +1 -1
  474. package/dist/utils/compile-cache.d.ts +8 -0
  475. package/dist/utils/compile-cache.d.ts.map +1 -0
  476. package/dist/utils/compile-cache.js +31 -0
  477. package/dist/utils/compile-cache.js.map +1 -0
  478. package/dist/utils/version-check.d.ts +1 -0
  479. package/dist/utils/version-check.d.ts.map +1 -1
  480. package/dist/utils/version-check.js +3 -3
  481. package/dist/utils/version-check.js.map +1 -1
  482. package/docs/docs.json +2 -1
  483. package/docs/extensions.md +56 -4
  484. package/docs/keybindings.md +3 -0
  485. package/docs/llama-cpp.md +70 -0
  486. package/docs/models.md +8 -3
  487. package/docs/packages.md +4 -2
  488. package/docs/providers.md +37 -3
  489. package/docs/sdk.md +18 -0
  490. package/docs/settings.md +19 -3
  491. package/docs/tui.md +2 -0
  492. package/docs/usage.md +7 -0
  493. package/docs/workflows.md +34 -11
  494. package/npm-shrinkwrap.json +23 -23
  495. package/package.json +2 -2
@@ -88,6 +88,9 @@ Modifier combinations: `ctrl+shift+x`, `alt+ctrl+x`, `ctrl+shift+alt+x`, `ctrl+1
88
88
  | `app.suspend` | `ctrl+z` (none on Windows) | Suspend to background |
89
89
  | `app.editor.external` | `ctrl+g` | Open in external editor (`$VISUAL` or `$EDITOR`) |
90
90
  | `app.clipboard.pasteImage` | `ctrl+v` (`alt+v` on Windows) | Paste image from clipboard |
91
+ | `app.message.copy` | `ctrl+x` | Copy the last assistant message (or the selected message in `/tree`) |
92
+
93
+ When `app.clipboard.pasteImage` finds text rather than an image, Atomic inserts that clipboard text into the editor instead of reporting an image-paste failure.
91
94
 
92
95
  ### Sessions
93
96
 
@@ -0,0 +1,70 @@
1
+ # llama.cpp
2
+
3
+ Atomic supports the [llama.cpp](https://github.com/ggml-org/llama.cpp) router server. The router discovers multiple GGUF models and loads or unloads them on demand.
4
+
5
+ Use a current llama.cpp build with router support. Follow its [build instructions](https://github.com/ggml-org/llama.cpp/blob/master/docs/build.md) or install a [prebuilt release](https://github.com/ggml-org/llama.cpp/releases).
6
+
7
+ ## Start the router
8
+
9
+ Start `llama-server` without `--model` or `-m`; those options start single-model mode instead of router mode.
10
+
11
+ ```bash
12
+ llama-server \
13
+ --models-dir ~/models \
14
+ --no-models-autoload \
15
+ --jinja \
16
+ --host 127.0.0.1 \
17
+ --port 8080 \
18
+ -ngl 999 \
19
+ -c 32768
20
+ ```
21
+
22
+ - `--models-dir` discovers local GGUF files.
23
+ - `--no-models-autoload` leaves loading under explicit `/llama` control.
24
+ - `--jinja` enables compatible chat templates and tool calling.
25
+ - `-ngl 999` offloads as many layers as possible to the GPU.
26
+ - `-c 32768` sets each model's context window. Omit it to use the model's native context, which may require substantially more memory.
27
+
28
+ Single-file models can sit directly in the model directory. Put multimodal and multi-shard models in separate subdirectories with their projection or shard files. Restart the router after manually adding files. Per-model context sizes and other options can be set with [model presets](https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md#model-presets).
29
+
30
+ ## Configure Atomic
31
+
32
+ Run:
33
+
34
+ ```text
35
+ /login llama.cpp
36
+ ```
37
+
38
+ Enter the router URL and optional API key. The default URL is `http://127.0.0.1:8080`. The same values can be supplied without `/login`:
39
+
40
+ ```bash
41
+ export LLAMA_BASE_URL=http://127.0.0.1:8080
42
+ export LLAMA_API_KEY=optional-secret
43
+ atomic
44
+ ```
45
+
46
+ If the server requires a key, start `llama-server` with the matching `--api-key`. Keep `--host 127.0.0.1` for local-only access.
47
+
48
+ ## Manage models
49
+
50
+ Run `/llama` in interactive mode:
51
+
52
+ - Select an unloaded model to load it, or a loaded model to unload it.
53
+ - Select **Download model…**, search Hugging Face, then choose a repository and quantization. Exact `owner/repository[:quant]` values also work.
54
+ - Press Escape during a load or download to confirm cancellation.
55
+
56
+ Hugging Face search uses `HF_TOKEN` when set, then checks `$HF_TOKEN_PATH`, `$HF_HOME/token`, `$XDG_CACHE_HOME/huggingface/token`, and `~/.cache/huggingface/token`. Unauthenticated search has lower rate limits. Atomic warns before gated downloads and links to the access page. Because llama.cpp performs the download, its process must also have `HF_TOKEN` for gated repositories.
57
+
58
+ Atomic asks before unloading other models, never silently unloads models, and never deletes model files. `/llama` always displays the router's current state because other clients may share it. Only loaded models appear in `/model`; load one first, then select it there. If the router disconnects, choose **Retry** to reconnect and refresh state without replaying the interrupted operation.
59
+
60
+ ## Troubleshooting
61
+
62
+ ```bash
63
+ curl http://127.0.0.1:8080/health
64
+ curl http://127.0.0.1:8080/models
65
+ ```
66
+
67
+ - **No models in `/llama`:** Check `--models-dir`, the directory layout, and restart the router.
68
+ - **Model missing from `/model`:** Load it with `/llama` first.
69
+ - **Load fails or uses too much memory:** Lower `-c` or unload another model.
70
+ - **Server is not in router mode:** Start it without `--model`, `-m`, or `-hf`.
package/docs/models.md CHANGED
@@ -136,18 +136,22 @@ The `baseUrl` is required when adding custom models to the `google-generative-ai
136
136
 
137
137
  Set `api` at provider level (default for all models) or model level (override per model).
138
138
 
139
+ These four values are the generic custom-provider APIs supported by `models.json`. Atomic's installed native provider runtime also implements provider-owned APIs including `mistral-conversations`, `azure-openai-responses`, `openai-codex-responses`, `bedrock-converse-stream`, `google-vertex`, and `pi-messages`; those native APIs are not implied to be stable generic custom-provider contracts.
140
+
139
141
  ## Provider Configuration
140
142
 
141
143
  | Field | Description |
142
144
  | ---------------- | ---------------------------------------------------------------- |
143
- | `baseUrl` | API endpoint URL |
144
- | `api` | API type (see above) |
145
- | `apiKey` | API key (see value resolution below) |
145
+ | `baseUrl` | API endpoint or gateway URL |
146
+ | `api` | Generic custom-provider API type (see above) |
147
+ | `apiKey` | Optional API key (see value resolution below); omit when auth comes from `/login`, `auth.json`, or `--api-key` |
148
+ | `oauth` | Dynamic OAuth provider type. Currently `"radius"`; requires the gateway `baseUrl` |
146
149
  | `headers` | Custom headers (see value resolution below) |
147
150
  | `authHeader` | Set `true` to add `Authorization: Bearer <apiKey>` automatically |
148
151
  | `models` | Array of model configurations |
149
152
  | `modelOverrides` | Per-model overrides for matching built-in or extension-registered models on this provider |
150
153
 
154
+ For a custom Radius gateway, set `"oauth": "radius"` and its `baseUrl`. Atomic uses Radius OAuth credentials and the gateway's dynamic `pi-messages` catalog.
151
155
  ### Value Resolution
152
156
 
153
157
  The `apiKey` and `headers` fields support three formats:
@@ -208,6 +212,7 @@ If your command is slow, expensive, rate-limited, or should keep using a previou
208
212
  | `maxTokens` | No | `16384` | Maximum output tokens |
209
213
  | `cost` | No | all zeros | Complete base rates per million tokens plus optional request-wide `tiers` (see below) |
210
214
  | `compat` | No | provider `compat` | Provider compatibility overrides. Merged with provider-level `compat` when both are set. |
215
+ | `deferredToolsMode` | No | omitted | Deferred tool-loading protocol; set to `"kimi"` for Kimi-compatible deferred tools |
211
216
 
212
217
  Current behavior:
213
218
  - `/model`, `--list-models`, and the interactive footer display entries by model `id`.
package/docs/packages.md CHANGED
@@ -47,6 +47,8 @@ atomic update --extension npm:@foo/bar
47
47
 
48
48
  These commands manage Atomic packages and `atomic update` can update the Atomic CLI installation. To uninstall Atomic itself, see [Quickstart](/quickstart#uninstall).
49
49
 
50
+ Self-update resolves an exact advertised package/version target and installs that pinned spec, so the update cannot drift to a newer registry release during installation. Any release note supplied by the update service is shown before installation. Atomic only updates installations it can verify are writable and managed by the detected global package manager; otherwise it prints a manual command. On Windows, loaded native dependencies are temporarily quarantined during replacement and stale quarantine directories are cleaned on later update attempts.
51
+
50
52
  By default, `install` and `remove` write to user settings (`~/.atomic/agent/settings.json`). Use `-l` to write to project settings (`.atomic/settings.json`; legacy `.pi/settings.json` is also read) instead. Project settings can be shared with your team, and Atomic installs any missing packages automatically on startup after the project is trusted.
51
53
 
52
54
  To try a package without installing it, use `--extension` or `-e`. This installs to a temporary directory for the current run only:
@@ -237,11 +239,11 @@ Filter what a package loads using the object form in settings:
237
239
 
238
240
  ## Enable and Disable Resources
239
241
 
240
- Use `atomic config` to enable or disable extensions, skills, prompt templates, and themes from installed packages and local directories. Works for both global (`~/.atomic/agent`) and project (`.atomic/`) scopes. Workflow package filters can be configured in settings with `workflows` patterns.
242
+ Use `atomic config` to enable or disable extensions, skills, prompt templates, and themes. It starts in global settings (`~/.atomic/agent/settings.json`); press Tab to switch global/project scope. Use `atomic config -l` to start in project overrides (`.atomic/settings.json`) with inherited global resources dimmed. Workflow package filters can be configured with `workflows` patterns.
241
243
 
242
244
  ## Scope and Deduplication
243
245
 
244
- Packages can appear in both global and project settings. If the same package appears in both, the project entry wins. Identity is determined by:
246
+ Packages can appear in both global and project settings. The project entry normally wins. A project entry with `autoload: false` instead acts as a delta over the global entry: it starts with no newly auto-discovered resources while explicit include/exclude patterns adjust the inherited package resources. Identity is determined by:
245
247
 
246
248
  - npm: package name
247
249
  - git: repository URL without ref
package/docs/providers.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Providers
2
2
 
3
- Atomic supports subscription-based providers via OAuth and API key providers via environment variables or auth file. Atomic knows the available models for each provider, and the list is updated with every Atomic release.
3
+ Atomic supports subscription-based providers via OAuth and API-key providers via environment variables or the auth file. Built-in catalogs ship with Atomic; configured and native providers may refresh newer catalogs independently and cache them in `~/.atomic/agent/models-store.json` for offline use.
4
4
 
5
5
  ## Table of Contents
6
6
 
@@ -8,8 +8,9 @@ Atomic supports subscription-based providers via OAuth and API key providers via
8
8
  - [API Keys](#api-keys)
9
9
  - [Auth File](#auth-file)
10
10
  - [Cloud Providers](#cloud-providers)
11
- - [Custom Providers](#custom-providers)
11
+ - [llama.cpp](#llamacpp)
12
12
  - [Resolution Order](#resolution-order)
13
+ - [Custom Providers](#custom-providers)
13
14
 
14
15
  ## Subscriptions
15
16
 
@@ -18,8 +19,9 @@ Use `/login` in interactive mode, then select a provider:
18
19
  - ChatGPT Plus/Pro (Codex)
19
20
  - Claude Pro/Max
20
21
  - GitHub Copilot
22
+ - xAI (Grok/X subscription)
23
+ - Radius
21
24
  - Cursor (experimental)
22
-
23
25
  Use `/logout` to clear credentials. Logout immediately invalidates authentication in the active interactive engine and removes the selected provider from both `~/.atomic/agent/auth.json` and any effective legacy `~/.pi/agent/auth.json`, so the provider remains logged out after restart. Environment variables, command-line credentials, and `models.json` configuration cannot be cleared by Atomic; when one of those sources still authenticates the provider, the logout status names the remaining source. Stored tokens auto-refresh when expired.
24
26
 
25
27
  ### OpenAI Codex
@@ -48,6 +50,14 @@ Anthropic subscription auth is active for Claude Pro/Max accounts. Third-party h
48
50
  - **Gemini models** (`github-copilot/gemini-3.1-pro-preview`, `github-copilot/gemini-3.5-flash`, …) are served through Copilot's CAPI gateway, which re-translates the OpenAI request into Google's GenAI format and enforces Gemini's stricter `FunctionDeclaration` schema (it rejects a tool-parameter `anyOf`/`oneOf` whose branch is a complex object, returning `400 invalid request body`). Atomic automatically sanitizes outbound tool/function JSON Schemas for these models into the supported subset — resolving object/array-bearing unions to their most expressive branch, converting `const`/literal unions to `enum`, collapsing nullable unions to `nullable`, and dropping non-portable keywords such as `additionalProperties`, `patternProperties`, `format`, and numeric/length bounds. Gemini also serializes array/object tool-call **arguments** as flattened indexed keys (`keywords[0]`, `keywords[1]`, …); Atomic reconstructs these back into proper arrays/objects before validation so tool calls (including `structured_output` and MCP tools) don't fail and loop. Both transforms are transparent and scoped to GitHub Copilot Gemini models only; no configuration is required and other providers/models are unaffected.
49
51
  - **Claude/Anthropic Messages models** served through GitHub Copilot use Copilot SSE transport. If Copilot cleanly ends a `/v1/messages` stream after Anthropic terminal stop-reason evidence but omits the required `message_stop` event, Atomic adds that one terminal event before provider parsing so the turn can finish normally, including when the final complete SSE frame reaches EOF without a trailing blank-line separator. The repair covers public Copilot hosts and GHE tenant routes such as `copilot-api.<enterprise>.ghe.com`, and is otherwise limited to closed, non-error Copilot Anthropic event streams; malformed, truncated, already well-formed, non-Copilot/look-alike host, non-SSE, Gemini, and OpenAI-style streams continue through the normal parser and retry behavior.
50
52
 
53
+ ### xAI (Grok/X subscription)
54
+
55
+ Run `/login xai`, then select **Use a subscription**. `XAI_API_KEY` remains available through **Use an API key**.
56
+
57
+ ### Radius
58
+
59
+ Radius is a dynamic `pi-messages` gateway. `/login radius` stores OAuth tokens in `auth.json`; its model catalog refreshes independently and is cached in `models-store.json`. API-key authentication is also available through `/login radius` or `RADIUS_API_KEY`. Custom Radius gateways can be declared in `models.json` with `"oauth": "radius"` and the gateway `baseUrl`.
60
+
51
61
  ### Cursor (experimental)
52
62
 
53
63
  Cursor support is bundled as the first-party `@bastani/cursor` extension and appears in `/login` as **Cursor (Experimental)**. It uses Cursor's browser PKCE flow and stores OAuth credentials in `~/.atomic/agent/auth.json`; do not paste Cursor tokens into environment variables, command-line arguments, or custom proxies. Atomic identifies as a Cursor CLI-compatible client against private endpoints; maintainers and users should explicitly accept that this may conflict with Cursor's terms of service, stop working without notice, or affect the Cursor account used to authenticate.
@@ -100,6 +110,7 @@ After a successful API-key or OAuth login, Atomic refreshes provider credentials
100
110
  | ZAI Coding Plan (China) | `ZAI_CODING_CN_API_KEY` | `zai-coding-cn` |
101
111
  | OpenCode Zen | `OPENCODE_API_KEY` | `opencode` |
102
112
  | OpenCode Go | `OPENCODE_API_KEY` | `opencode-go` |
113
+ | Radius | `RADIUS_API_KEY` | `radius` |
103
114
  | Hugging Face | `HF_TOKEN` | `huggingface` |
104
115
  | Fireworks | `FIREWORKS_API_KEY` | `fireworks` |
105
116
  | Together AI | `TOGETHER_API_KEY` | `together` |
@@ -143,6 +154,25 @@ Store credentials in `~/.atomic/agent/auth.json`:
143
154
 
144
155
  The file is created with `0600` permissions (user read/write only). Auth file credentials take priority over environment variables.
145
156
 
157
+ API-key credentials may include provider-scoped `env` values. They take precedence over process environment variables while resolving the credential key, provider/model headers, and provider configuration such as Cloudflare account IDs, Azure settings, Vertex project/location, Bedrock settings, cache retention, and `HTTP_PROXY`/`HTTPS_PROXY`:
158
+
159
+ ```json
160
+ {
161
+ "cloudflare-ai-gateway": {
162
+ "type": "api_key",
163
+ "key": "$CLOUDFLARE_API_KEY",
164
+ "env": {
165
+ "CLOUDFLARE_API_KEY": "...",
166
+ "CLOUDFLARE_ACCOUNT_ID": "account-id",
167
+ "CLOUDFLARE_GATEWAY_ID": "gateway-id"
168
+ }
169
+ }
170
+ }
171
+ ```
172
+
173
+ Use this when Atomic should use provider settings different from the project shell environment.
174
+
175
+
146
176
  ### Key Resolution
147
177
 
148
178
  The `key` field supports command execution, environment interpolation, and literals:
@@ -279,6 +309,10 @@ export GOOGLE_CLOUD_LOCATION=us-central1
279
309
 
280
310
  Or set `GOOGLE_APPLICATION_CREDENTIALS` to a service account key file.
281
311
 
312
+ ## llama.cpp
313
+
314
+ For router-mode discovery, load/unload management, and Hugging Face downloads with a local llama.cpp server, see [llama.cpp](/llama-cpp). Configure it with `/login llama.cpp` or `LLAMA_BASE_URL` and manage models with `/llama`.
315
+
282
316
  ## Custom Providers
283
317
 
284
318
  **Via models.json:** Add Ollama, LM Studio, vLLM, or any provider that speaks a supported API (OpenAI Completions, OpenAI Responses, Anthropic Messages, Google Generative AI). See [Custom models](/models).
package/docs/sdk.md CHANGED
@@ -37,6 +37,24 @@ session.subscribe((event) => {
37
37
  await session.prompt("What files are in the current directory?");
38
38
  ```
39
39
 
40
+ `ModelRuntime` is the canonical asynchronous provider runtime when an integration wants provider-owned credentials, dynamic catalogs, and native providers in one object:
41
+
42
+ ```typescript
43
+ import { createAgentSession, ModelRuntime, SessionManager } from "@bastani/atomic";
44
+
45
+ const modelRuntime = await ModelRuntime.create();
46
+ const { session } = await createAgentSession({
47
+ sessionManager: SessionManager.inMemory(),
48
+ modelRuntime,
49
+ });
50
+ ```
51
+
52
+ `ModelRuntime.create()` accepts custom `authPath`, `modelsPath`, credential storage, and runtime auth overrides. `ModelRegistry` and `AuthStorage` remain available as Atomic's synchronous compatibility facades. Use `readStoredCredential(provider, authPath?)` for a lightweight read of one stored provider credential.
53
+
54
+ Extensions supplied directly to SDK sessions can use the exported `InlineExtension` type. Extension APIs and event types include native `registerProvider(Provider)`, `registerEntryRenderer`, `entry_appended`, `before_provider_headers`, and `agent_settled`.
55
+
56
+ The package root also exports `buildContextEntries`, `sessionEntryToContextMessages`, and `CompactionEntry` for converting durable session branches into model context. The equivalent active-session operation is `sessionManager.buildContextEntries()`.
57
+
40
58
  ## Installation
41
59
 
42
60
  Install `@bastani/atomic` as a project dependency with npm, pnpm, or Bun:
package/docs/settings.md CHANGED
@@ -36,6 +36,7 @@ Settings and trust JSON files may start with a UTF-8 BOM, as commonly written by
36
36
  | `defaultThinkingLevel` | string | - | `"off"`, `"minimal"`, `"low"`, `"medium"`, `"high"`, `"xhigh"`, `"max"`; the active model must support the selected level |
37
37
  | `hideThinkingBlock` | boolean | `false` | Hide thinking blocks in output |
38
38
  | `thinkingBudgets` | object | - | Custom token budgets per thinking level |
39
+ | `showCacheMissNotices` | boolean | `false` | Show transcript notices for significant prompt-cache misses and their attributed wasted tokens |
39
40
  | `fallbackModels` | string[] | - | Ordered main-chat fallback models, written as `"provider/model"` with optional model-supported reasoning suffixes such as `:high`, `:xhigh`, or `:max` |
40
41
 
41
42
  #### thinkingBudgets
@@ -102,6 +103,8 @@ Use `/fast` in interactive mode to edit these settings. Atomic applies fast mode
102
103
  | `enableInstallTelemetry` | boolean | `true` | Send an anonymous install/update version ping after first install or changelog-detected updates. This does not control update checks |
103
104
  | `firstRunOnboardingStartedVersion` | string | - | Internal first-run onboarding start marker used when no prior Atomic startup state identifies the user as returning |
104
105
  | `onboardedVersion` | string | - | Internal one-time first-run onboarding completion marker. Returning-user detection from prior startup state or displaying the first-run workflow-engine explanation sets it |
106
+ | `enableAnalytics` | boolean | `false` | Opt in to analytics during first-run setup |
107
+ | `trackingId` | string | - | Locally generated analytics identifier when analytics is enabled |
105
108
  | `doubleEscapeAction` | string | `"tree"` | Action for double-escape: `"tree"`, `"fork"`, or `"none"` |
106
109
  | `treeFilterMode` | string | `"default"` | Default filter for `/tree`: `"default"`, `"no-tools"`, `"user-only"`, `"labeled-only"`, `"all"` |
107
110
  | `editorPaddingX` | number | `0` | Horizontal padding for input editor (0-3) |
@@ -116,6 +119,19 @@ Use `/fast` in interactive mode to edit these settings. Atomic applies fast mode
116
119
 
117
120
  Set `ATOMIC_SKIP_VERSION_CHECK=1` to disable the Atomic version update check. Use `--offline` or `ATOMIC_OFFLINE=1` to disable all startup network operations described here, including update checks, package update checks, and install/update telemetry. Legacy `PI_*` aliases are also supported for app-specific environment variables.
118
121
 
122
+
123
+ On a genuine first run, Atomic previews available themes and asks whether to opt into analytics. The choice and locally generated identifier are stored as `enableAnalytics` and `trackingId`; analytics remains off unless explicitly enabled.
124
+
125
+ ### Network proxy
126
+
127
+ | Setting | Type | Default | Description |
128
+ |---------|------|---------|-------------|
129
+ | `httpProxy` | string | - | HTTP proxy URL applied as `HTTP_PROXY` and `HTTPS_PROXY`. Global setting only. |
130
+
131
+ ```json
132
+ { "httpProxy": "http://127.0.0.1:7890" }
133
+ ```
134
+
119
135
  ### Warnings
120
136
 
121
137
  | Setting | Type | Default | Description |
@@ -195,7 +211,7 @@ When a provider requests a retry delay longer than `retry.provider.maxRetryDelay
195
211
 
196
212
  | Setting | Type | Default | Description |
197
213
  |---------|------|---------|-------------|
198
- | `httpIdleTimeoutMs` | number | `600000` | HTTP header/body idle timeout in milliseconds. Must be a non-negative finite number; decimals are rounded down. Set to `0` to disable the idle timeout. |
214
+ | `httpIdleTimeoutMs` | number or string | `600000` | HTTP idle timeout as milliseconds, a duration such as `"30s"`, `"5m"`, or `"1h"`, or `"disabled"`. `0` also disables it. |
199
215
 
200
216
  Atomic applies this timeout to the global HTTP dispatcher used by `fetch` and provider SDK HTTP clients. The default is 600,000 ms (10 minutes), which keeps slow long-context requests working while reclaiming stale idle connections. Atomic does not impose a separate fixed connect-phase timeout; connection failures surface through the provider and agent retry/error paths.
201
217
 
@@ -208,7 +224,7 @@ The `/settings` picker offers these presets:
208
224
  | `5 min` | `300000` |
209
225
  | `10 min` | `600000` |
210
226
  | `30 min` | `1800000` |
211
- | `Disabled` | `0` |
227
+ | `Disabled` | `"disabled"` (or `0`) |
212
228
 
213
229
  ```json
214
230
  {
@@ -223,7 +239,7 @@ The `/settings` picker offers these presets:
223
239
  | `steeringMode` | string | `"one-at-a-time"` | How steering messages are sent: `"all"` or `"one-at-a-time"` |
224
240
  | `followUpMode` | string | `"one-at-a-time"` | How follow-up messages are sent: `"all"` or `"one-at-a-time"` |
225
241
  | `transport` | string | `"auto"` | Preferred transport for providers that support multiple transports: `"sse"`, `"websocket"`, `"websocket-cached"`, or `"auto"` |
226
- | `httpIdleTimeoutMs` | number | `600000` | HTTP header/body idle timeout in milliseconds, also used by providers with explicit stream idle timeouts. Set to `0` to disable. |
242
+ | `httpIdleTimeoutMs` | number or string | `600000` | HTTP idle timeout in milliseconds, a duration string, or `"disabled"`; also used by providers with explicit stream idle timeouts. |
227
243
  | `websocketConnectTimeoutMs` | number | `15000` | WebSocket connect/open handshake timeout in milliseconds for providers that support WebSocket transports. Set to `0` to disable. |
228
244
 
229
245
  ### Terminal & Images
package/docs/tui.md CHANGED
@@ -871,6 +871,8 @@ ctx.ui.setFooter((tui, theme, footerData) => ({
871
871
  ctx.ui.setFooter(undefined); // restore default
872
872
  ```
873
873
 
874
+ `ctx.ui.getFooterDataProvider()` exposes the same read-only provider to embedded extension UIs. In isolated interactive mode Atomic maintains the provider inside the engine session, mirrors every `setStatus()` update into it, and uses the session cwd with the same cached Git-branch watcher, so synchronous renderers can read current status and branch data without an RPC round trip or per-render Git process.
875
+
874
876
  Token stats available via `ctx.sessionManager.getBranch()` and `ctx.model`.
875
877
 
876
878
  **Examples:** [custom-footer.ts](https://github.com/bastani-inc/atomic/blob/main/packages/coding-agent/examples/extensions/custom-footer.ts)
package/docs/usage.md CHANGED
@@ -130,6 +130,12 @@ Treat exported and shared sessions as sensitive: transcripts can contain source
130
130
  atomic [options] [@files...] [messages...]
131
131
  ```
132
132
 
133
+ Use `--` to end option parsing when positional prompt text begins with `-`, `--`, or `@`. Every argument after the terminator is treated as literal message text rather than an option or file argument:
134
+
135
+ ```bash
136
+ atomic --print -- "- leading-dash prompt"
137
+ ```
138
+
133
139
  ### Package Commands
134
140
 
135
141
  ```bash
@@ -290,6 +296,7 @@ atomic --tools read,search,find,ls -p "Review the code"
290
296
  | `ATOMIC_OFFLINE` | Disable startup network operations, including update checks, package update checks, and install/update telemetry |
291
297
  | `ATOMIC_SKIP_VERSION_CHECK` | Skip the Atomic version update check at startup. This prevents the latest-version request |
292
298
  | `ATOMIC_TELEMETRY` | Override install/update telemetry: `1`/`true`/`yes` or `0`/`false`/`no`. This does not disable update checks |
299
+ | `NODE_COMPILE_CACHE` | Override the directory for Node's persistent compile cache, which Atomic enables automatically on Node >= 22.8 to speed up startup (most noticeable on Windows). Set `NODE_DISABLE_COMPILE_CACHE=1` to opt out |
293
300
  | `PI_CACHE_RETENTION` | Provider/upstream-specific prompt-cache retention knob; set to `long` where supported |
294
301
  | `VISUAL`, `EDITOR` | External editor for CTRL+G |
295
302
 
package/docs/workflows.md CHANGED
@@ -110,7 +110,7 @@ List and run it like any other workflow:
110
110
  /workflow <name> key=value ...
111
111
  ```
112
112
 
113
- Named workflow runs execute in the background. After launch, expect a run id and monitor it with `/workflow status <run-id>`, F2, or `/workflow connect <run-id>`.
113
+ Named workflow runs execute in the background. By default, after launch expect a run id and monitor it with `/workflow status <run-id>`, F2, or `/workflow connect <run-id>`. A definition with `autoAttach: true` instead opens the graph overlay as soon as an interactive top-level named launch through `/workflow <name>` or the registered `workflow` tool is accepted. This option does not affect headless launches or nested `ctx.workflow(...)` calls, and existing input-form launch behavior is unchanged.
114
114
 
115
115
  While a workflow is running, the visible below-editor `BACKGROUND` panel advances its elapsed label every second from the moment the run starts; it does not require opening or switching to the orchestrator. Updates repaint the existing mounted panel in place, paused timers stay frozen, and terminal cards retain their short recent-run expiry.
116
116
 
@@ -414,12 +414,12 @@ Inputs:
414
414
 
415
415
  | Input | Type | Required | Default | Description |
416
416
  |---|---|---|---|---|
417
- | `objective` | text | yes | — | Goal-runner objective or delta. Include the desired end state, expected outcome, testing/validation instructions, and any explicit done criteria. |
417
+ | `objective` | text | yes | — | Goal-runner objective or delta. Include the desired end state, expected outcome, testing/validation instructions, and any explicit done criteria. Do not include PR/MR submission instructions here; strip them from the task text and request them via `create_pr=true` instead. |
418
418
  | `acceptance_criteria` | text | no | objective | Original immutable task contract that the run must remain consistent with. When launching a follow-up `goal` run from review findings, pass the ORIGINAL task text here so reviewer suggestions cannot drift or contradict the literal contract. |
419
419
  | `max_turns` | number | no | `10` | Maximum worker/review turns before human follow-up is needed. |
420
420
  | `base_branch` | string | no | `origin/main` | Branch reviewers and the optional final stage compare the current code delta against; also used to create a missing worktree. |
421
- | `git_worktree_dir` | string | no | `""` | Optional reusable Git worktree root. Empty runs in the invoking checkout; non-empty values run Goal stages in the created/reused worktree. |
422
- | `create_pr` | boolean | no | `false` | Safe-by-default PR creation flag. Omitted or `false` skips the final `pull-request` stage and omits `pr_report`; prompt text alone does not opt in, and only strict `true` authorizes the final `pull-request` stage to attempt provider-appropriate PR/MR/review creation after Goal reaches `complete`. |
421
+ | `git_worktree_dir` | string | no | `""` | Optional reusable Git worktree root. Empty runs in the invoking checkout; non-empty values run Goal stages in the created/reused worktree. Set it only when the user explicitly requested worktree isolation — worker stages are instructed never to create git worktrees, clones, or repository copies on their own. |
422
+ | `create_pr` | boolean | no | `false` | Safe-by-default PR creation flag. Omitted or `false` skips the final `pull-request` stage and omits `pr_report`; prompt text alone does not opt in, and only strict `true` authorizes the final `pull-request` stage to attempt provider-appropriate PR/MR/review creation after Goal reaches `complete`. If the delegated task asks to submit a PR/MR/review, remove that instruction from `objective` and set `create_pr=true` instead. |
423
423
 
424
424
  `goal` defaults to 10 worker/review turns. Reviewer quorum is fixed internally at 2 reviewer `complete` votes, and approval is deterministic on each reviewer's self-reported `stop_review_loop` boolean: a reviewer approves exactly when it returns `stop_review_loop=true` with no `reviewer_error` (schema-parse failures count as non-approval), and the reducer completes the run when quorum of those booleans is met without recomputing approval from findings arrays or traceability statuses. The repeated-blocker threshold defaults to 3 consecutive same-blocker turns and is clamped to `max_turns` when you run fewer than 3 turns.
425
425
 
@@ -429,7 +429,7 @@ Run examples:
429
429
  /workflow goal objective="Implement specs/2026-03-rate-limit.md, add the requested regression tests, run bun test packages/api/rate-limit.test.ts, and finish only when burst traffic returns 429 with Retry-After"
430
430
  /workflow goal objective="Update the CLI docs to describe the new --json flag, include one usage example, and verify the docs build still passes" max_turns=3
431
431
  /workflow goal objective="Fix the settings form validation bug; add/adjust the focused test and consider it done when invalid emails show the inline error without submitting"
432
- /workflow goal objective="Implement the focused docs fix, run the docs validation command, and open a PR when complete" create_pr=true
432
+ /workflow goal objective="Implement the focused docs fix and run the docs validation command" create_pr=true
433
433
  /workflow goal objective="Fix the flaky package install test in an isolated worktree and run the focused regression" git_worktree_dir=../atomic-goal-install-wt base_branch=main
434
434
  ```
435
435
 
@@ -449,12 +449,14 @@ Goal worker/reviewer prompts treat the objective and acceptance criteria as the
449
449
 
450
450
  Reviewer findings carry `objective_alignment` (`required_by_objective`, `consistent_with_objective`, `beyond_objective`, or `contradicts_objective`); `beyond_objective` and `contradicts_objective` findings are reported but do not block completion and must not be promoted into follow-up objectives without reconciling them against the acceptance criteria. Severity labels alone never dismiss objective-relevant findings: `required_by_objective` findings block at any priority (P3 included), while `consistent_with_objective` P3 nice-to-haves stay non-blocking.
451
451
 
452
- Review decisions also include `requirements_traceability`, a clause-by-clause evidence map over every explicit objective/acceptance-criteria requirement. Findings and traceability are audit evidence that drive how each reviewer derives its authoritative `stop_review_loop` boolean; the harness gates approval on that boolean alone, and Goal tells reviewers that process-only clauses (reviewer quorum/approval counts, and the authorized post-approval PR/MR/review final action when `create_pr=true`) must never hold the flag at `false`.
452
+ Review decisions also include `requirements_traceability`, a clause-by-clause evidence map over every explicit objective/acceptance-criteria requirement. Findings and traceability are audit evidence that drive how each reviewer derives its authoritative `stop_review_loop` boolean; the harness gates approval on that boolean alone, and Goal tells reviewers that process-only clauses (reviewer quorum/approval counts, and the authorized post-approval PR/MR/review final action when `create_pr=true`) must never hold the flag at `false`. Reviewers must also first prove the code delta actually exists in the review checkout (the invoking cwd or explicitly configured worktree): receipts claiming implemented work over an empty or unrelated delta are a blocking finding rather than grounds for approval, and modifications, renames, or deletions of pre-existing tests require explicit justification.
453
453
 
454
454
  Passing worker-authored tests or snapshots alone is circular evidence unless tied to independent current-state proof.
455
455
 
456
456
  The worker may claim readiness, but it cannot finalize completion. Before implementing, Goal prompts the worker to derive an observable acceptance/contract matrix from the literal objective/acceptance criteria (one row per clause, each mapped to the concrete check that proves it) and to model states, transitions, and invariants explicitly when the work is stateful.
457
457
 
458
+ Delivery is part of readiness: unless the objective or acceptance criteria explicitly forbid committing, worker prompts require committing the work in the current checkout with a descriptive message before claiming readiness — verifying a clean working tree with the repository's version-control status command — and reporting the commit identifier in the receipt. Reviewers back this with the code-delta contract: uncommitted work at claimed readiness is remaining work, and a checkout whose delta is empty or unrelated to the objective can never be approved regardless of what receipts claim. Verification stays with prompts and reviewers using the repository's own version-control tooling, so no single VCS provider is hardcoded into the runner.
459
+
458
460
  Goal consolidates the latest reviewer findings into a deduplicated cross-reviewer batch persisted in the round artifact (`consolidated_findings` in `review-round-latest.json`), and the next worker prompt instructs the worker to plan and repair the whole batch — with durable regression evidence for reproduced findings — rather than fixing one finding per turn. Goal prompts workers and reviewers to verify user-visible behavior end-to-end when practical, using `playwright-cli`-skilled subagents for web/frontend flows that may depend on backend/API behavior and tmux-skilled subagents for TUI or terminal-app scenarios.
459
461
 
460
462
  They must assume credentials/auth/environment access exists until concrete checks plus an actual app/flow launch attempt prove otherwise; reviewers accept skipped E2E only when the worker records the exact attempted commands and observed failure output. Goal reviewers also look for any QA E2E video referenced by the ledger or receipt and must inspect the actual video before treating it as proof.
@@ -500,12 +502,12 @@ Inputs:
500
502
 
501
503
  | Input | Type | Required | Default | Description |
502
504
  |---|---|---|---|---|
503
- | `prompt` | text | yes | — | Task, feature request, issue summary, or spec path to research, execute, refine, and review. |
505
+ | `prompt` | text | yes | — | Task, feature request, issue summary, or spec path to research, execute, refine, and review. Do not include PR/MR submission instructions here; strip them from the task text and request them via `create_pr=true` instead. |
504
506
  | `acceptance_criteria` | text | no | prompt | Original immutable task contract that the run must remain consistent with. When launching a follow-up `ralph` run from review findings, pass the ORIGINAL task text here so reviewer suggestions cannot drift or contradict the literal contract. |
505
507
  | `max_loops` | number | no | `10` | Maximum research/orchestrate/review iterations before the workflow completes or reports the remaining work without reviewer approval. |
506
508
  | `base_branch` | string | no | `origin/main` | Branch reviewers and the optional final stage compare the current code delta against; also used to create a missing worktree. |
507
- | `git_worktree_dir` | string | no | `""` | Optional reusable Git worktree root. Empty runs in the invoking checkout; non-empty values run Ralph stages in the created/reused worktree. |
508
- | `create_pr` | boolean | no | `false` | Safe-by-default PR creation flag. Omitted or `false` skips the final `pull-request` stage and omits `pr_report`; prompt text alone does not opt in, and only strict `true` authorizes the final `pull-request` stage to attempt provider-appropriate PR/MR/review creation. |
509
+ | `git_worktree_dir` | string | no | `""` | Optional reusable Git worktree root. Empty runs in the invoking checkout; non-empty values run Ralph stages in the created/reused worktree. Set it only when the user explicitly requested worktree isolation — orchestrator stages are instructed never to create git worktrees, clones, or repository copies on their own. |
510
+ | `create_pr` | boolean | no | `false` | Safe-by-default PR creation flag. Omitted or `false` skips the final `pull-request` stage and omits `pr_report`; prompt text alone does not opt in, and only strict `true` authorizes the final `pull-request` stage to attempt provider-appropriate PR/MR/review creation. If the delegated task asks to submit a PR/MR/review, remove that instruction from `prompt` and set `create_pr=true` instead. |
509
511
 
510
512
  Run examples:
511
513
 
@@ -533,7 +535,7 @@ If reviewers find issues, the next `research-prompt-refinement` and research sta
533
535
 
534
536
  Ralph findings include the same `objective_alignment` classification used by Goal, and each reviewer derives a single authoritative `stop_review_loop` boolean from that evidence: `required_by_objective` findings mean `false` at any priority (P3 included, because severity labels alone never dismiss objective-relevant findings), `consistent_with_objective` P0/P1/P2 findings mean `false` while P3 remains a non-blocking nice-to-have, and `beyond_objective`/`contradicts_objective` findings are surfaced but non-blocking so they are not silently converted into new requirements.
535
537
 
536
- The loop gate approves deterministically on `stop_review_loop=true` plus a null `reviewer_error` (parse failures count as non-approval) without recomputing approval from the findings arrays. Ralph review decisions also include `requirements_traceability`, a clause-by-clause evidence map over every explicit prompt/acceptance-criteria requirement kept as audit evidence for deriving the flag; reviewers are explicitly told that process-only clauses (reviewer quorum, and the authorized post-approval PR/MR/review final action when `create_pr=true`) must never hold the flag at `false`.
538
+ The loop gate approves deterministically on `stop_review_loop=true` plus a null `reviewer_error` (parse failures count as non-approval) without recomputing approval from the findings arrays. Ralph review decisions also include `requirements_traceability`, a clause-by-clause evidence map over every explicit prompt/acceptance-criteria requirement kept as audit evidence for deriving the flag; reviewers are explicitly told that process-only clauses (reviewer quorum, and the authorized post-approval PR/MR/review final action when `create_pr=true`) must never hold the flag at `false`. Reviewers must also first prove the code delta actually exists in the review checkout (the invoking cwd or explicitly configured worktree): receipts claiming implemented work over an empty or unrelated delta are a blocking finding rather than grounds for approval, and modifications, renames, or deletions of pre-existing tests require explicit justification.
537
539
 
538
540
  Passing worker-authored tests or snapshots is circular evidence unless tied to independent current-state proof. By default Ralph does not start the final `pull-request` stage, and `pr_report` is omitted. Prompt text alone does not opt in. Pass `create_pr=true` only when you explicitly want the final `pull-request` stage to inspect provider credentials and attempt provider-appropriate PR/MR/review creation, such as GitHub `gh`, Azure Repos `az repos pr create`, or Sapling/Phabricator tooling; Ralph's own PR-creation instructions live in that final stage and run only after approval.
539
541
 
@@ -728,6 +730,7 @@ Authoring basics:
728
730
  - `workflow({ ... })` returns the workflow definition directly for discovery; there is no builder terminal step.
729
731
  - Workflow names normalize for lookup: trim, lowercase, convert whitespace/underscore to hyphen, remove other punctuation, and collapse hyphens.
730
732
  - `description` sets the listing text.
733
+ - `autoAttach: true` opens the graph overlay when an interactive top-level named launch through `/workflow <name>` or the registered `workflow` tool is accepted. Only exact `true` is retained on the compiled definition; omission and `false` do not opt a definition into auto-attachment. Existing input-form launch behavior is unchanged.
731
734
  - `inputs` declares typed user inputs.
732
735
  - `worktreeFromInputs` optionally maps input names to workflow-wide reusable Git worktree defaults.
733
736
  - `outputs` declares typed outputs that parent workflows receive from `ctx.workflow(childWorkflow, ...)`.
@@ -1226,6 +1229,14 @@ readonly description: string;
1226
1229
 
1227
1230
  Discovery and inspection surfaces show this required listing text. The compiled definition preserves it unchanged.
1228
1231
 
1232
+ ### `autoAttach`
1233
+
1234
+ ```typescript
1235
+ readonly autoAttach?: boolean;
1236
+ ```
1237
+
1238
+ Exact `true` opts interactive top-level named launches through `/workflow <name>` and the registered `workflow` tool into opening the graph overlay immediately. Omission and `false` do not opt in. This option does not affect headless launches, nested `ctx.workflow(...)` calls, or the existing input-form launch path. Compiled definitions retain this field only as literal `true`.
1239
+
1229
1240
  ### `inputs`
1230
1241
 
1231
1242
  ```typescript
@@ -1301,6 +1312,7 @@ interface WorkflowDefinition<
1301
1312
  readonly name: string;
1302
1313
  readonly normalizedName: string;
1303
1314
  readonly description: string;
1315
+ readonly autoAttach?: true;
1304
1316
  readonly inputs: WorkflowInputSchemaMap;
1305
1317
  readonly outputs?: WorkflowOutputSchemaMap;
1306
1318
  readonly inputBindings?: { readonly worktree?: WorkflowWorktreeInputBinding };
@@ -1343,6 +1355,14 @@ readonly cwd?: string;
1343
1355
 
1344
1356
  Invocation working directory for workflow-owned artifacts. It defaults to the host process cwd when omitted.
1345
1357
 
1358
+ ### `ctx.models`
1359
+
1360
+ ```typescript
1361
+ readonly models?: WorkflowModelCatalogPort;
1362
+ ```
1363
+
1364
+ Model catalog port for the invoking session, when the host provides one. `models.currentModel` is the user-selected session model; leading a stage's model chain with it (bare, without a `:thinking` suffix) runs the stage at the session's model and default thinking level. `models.listModels()` returns the available catalog. The field is absent when no host catalog exists (for example some detached executions), so definitions should treat it as optional and fall back to their own model configuration.
1365
+
1346
1366
  ### `ctx.task(name, options)`
1347
1367
 
1348
1368
  ```typescript
@@ -1588,10 +1608,12 @@ readonly group?: string | true;
1588
1608
 
1589
1609
  Sets the stage session's [Intercom](/intercom) home group so orchestrated stages can be isolated into coordination groups: a stage in group G can only intercom peers in G. Provide a named string to join that group, or boolean `true` to auto-generate one shared UUID group **per `ctx.parallel(...)` set** (minted once and shared across every item in that set — never a fresh id per item), so a whole level of reviewers lands in the same isolated group. Authored workflow values accept the trimmed, case-insensitive string sentinels `"true"` and `"auto"`. Those two names are reserved for automatic grouping; use a different name when you need a literal named group. Omit `group` to inherit per the precedence chain (ultimately `"default"`).
1590
1610
 
1591
- `group` is accepted at every level — run-level defaults (`context`), `stage`/`task`, `parallel` step options, and per parallel itemand resolves most-specific-first: `parallel-item > task/stage > parallel-step > run-level`. The resolved value is injected per-session (race-safe across concurrently running in-process stages, stable across model fallback). Group assignment is **gated on intercom capability**: a stage with `noTools`, a `tools` allowlist that omits `intercom`, or `excludedTools` containing `intercom` is never placed into a group (so an agent is never isolated into a group it cannot use). Subagents spawned by a grouped stage inherit that stage's group by default (see [subagents.md](/subagents)), so a reviewer level and its helper subagents form one isolated group. The subagent-only `contact_supervisor` channel still reaches the supervisor across group boundaries through a broker capability bound to the child/supervisor relationship and restored across reconnects; ordinary client `send` frames never gain cross-group authority from a channel flag.
1611
+ `group` is accepted on `stage`/`task` options, on `ctx.parallel(...)` options, and per parallel stepa step-level `group` overrides the parallel options' `group`. The resolved value is injected per-session (race-safe across concurrently running in-process stages, stable across model fallback). Group assignment is **gated on intercom capability**: a stage with `noTools`, a `tools` allowlist that omits `intercom`, or `excludedTools` containing `intercom` is never placed into a group (so an agent is never isolated into a group it cannot use). Subagents spawned by a grouped stage inherit that stage's group by default (see [subagents.md](/subagents)), so a reviewer level and its helper subagents form one isolated group. The subagent-only `contact_supervisor` channel still reaches the supervisor across group boundaries through a broker capability bound to the child/supervisor relationship and restored across reconnects; ordinary client `send` frames never gain cross-group authority from a channel flag.
1592
1612
 
1593
1613
  The builtin `goal` and `ralph` workflows use this to isolate each reviewer level into its own group (`goal-reviewers-turn-N` / `ralph-reviewers-iter-N`): same-level reviewers coordinate with each other but cannot reach the worker, orchestrator, parent chat, or other levels, which also keeps reviewer intercom chatter out of the main/parent context window.
1594
1614
 
1615
+ **Recommended default:** unless the user requests otherwise, give each workflow invocation its own intercom group. To share one group across every stage of the invocation, mint one invocation-scoped literal name inside the workflow's `run` function (for example `const group = "myflow-" + randomUUID();` from `node:crypto`) and pass it via the `group` option on each stage, task, or parallel step; note that `group: true` is only shared per `ctx.parallel(...)` set and mints a fresh UUID per non-parallel stage, so it isolates stages from each other rather than grouping the whole run. Ungrouped sessions all collapse into the shared `"default"` group, so an ungrouped workflow's stage and subagent intercom traffic — including async subagent-result notices — can reach the parent chat and other concurrent runs. The shipped workflow prompt guidance instructs agents to isolate invocations this way by default.
1616
+
1595
1617
  ### `model`
1596
1618
 
1597
1619
  ```typescript
@@ -2281,6 +2303,7 @@ Surface behavior:
2281
2303
  - **Reserved keys** - `ctrl+d` and `q` do not navigate workflow surfaces; `ctrl+d` keeps its ordinary editor or prompt behavior where applicable, and `q` remains printable in text-owning prompts. Existing `esc`, `ctrl+c`, and graph `h` close/hide controls are unchanged.
2282
2304
  - **Wheel and trackpad** - While the workflow graph is active, vertical wheel/trackpad gestures pan it up and down, and horizontal gestures pan wide graphs left and right when the terminal exposes horizontal wheel events; these gestures remain scoped to the graph instead of leaking into the main chat or terminal scrollback. Attached stage chats capture mouse/trackpad wheel events by default so scrolling stays inside the active stage transcript or prompt instead of falling through to terminal/main-chat scrollback.
2283
2305
  - **Tool and node detail** - Attached stage chats match main chat's tool-detail expansion behavior while keeping expansion state local to the workflow UI context. Press Ctrl+O (the configurable `app.tools.expand` binding) to expand every visible workflow node and tool card, including single, parallel, and chain subagent progress, current tool activity, and artifact paths; press it again to collapse them. The toggle works for active, completed, and archived stage views, including at the supported 40-column terminal minimum. A mounted prompt, custom question, or other input-owning overlay keeps the key instead of changing expansion.
2306
+ - **Footer context** - An attached live stage chat carries the main chat's current-folder and Git-branch identity into its themed footer and mirrors live extension status lines such as the MCP server indicator. Branch changes trigger a repaint through the host's cached footer provider, and extension status changes are read from that same provider rather than recomputed by the workflow UI.
2284
2307
  - **Async statusline** - If an async/background subagent is running while the fullscreen workflow graph is open, the graph statusline mirrors the async summary so the background run remains visible; hide the graph with `h`, leave it with `ctrl+x`, or reconnect later to return to the full below-editor async widget.
2285
2308
  - **Copy mode** - Press `ctrl+t` inside an attached stage chat to toggle **copy mode**: copy mode disables workflow-chat mouse reporting so normal terminal/tmux text selection can work; press `ctrl+t` again to leave copy mode and restore transcript or prompt scrolling. Archived read-only stage transcripts expose the same footer and copy-mode status, so their text can also be selected and copied; `esc` closes the transcript and `ctrl+x` returns to the graph. While copy mode is on, wheel/trackpad gestures are handled by the terminal/tmux and may scroll terminal scrollback, so leave copy mode before using the wheel again.
2286
2309
  - **Run control** - Use `interrupt`, `pause`, and `resume` for resumable live work; `resume` on a non-paused run reopens the saved snapshot or overlay. Use `quit` to pause a live run gracefully while preserving it for `/workflow resume`.