@bastani/atomic 0.9.2-alpha.1 → 0.9.3-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (455) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/README.md +2 -2
  3. package/dist/builtin/cursor/CHANGELOG.md +6 -0
  4. package/dist/builtin/cursor/package.json +2 -2
  5. package/dist/builtin/intercom/CHANGELOG.md +6 -0
  6. package/dist/builtin/intercom/package.json +1 -1
  7. package/dist/builtin/mcp/CHANGELOG.md +12 -0
  8. package/dist/builtin/mcp/direct-tools.ts +4 -2
  9. package/dist/builtin/mcp/package.json +1 -1
  10. package/dist/builtin/mcp/proxy-call.ts +3 -1
  11. package/dist/builtin/mcp/utils.ts +18 -7
  12. package/dist/builtin/subagents/CHANGELOG.md +17 -0
  13. package/dist/builtin/subagents/README.md +6 -6
  14. package/dist/builtin/subagents/agents/code-simplifier.md +7 -6
  15. package/dist/builtin/subagents/agents/codebase-analyzer.md +5 -4
  16. package/dist/builtin/subagents/agents/codebase-locator.md +3 -3
  17. package/dist/builtin/subagents/agents/codebase-online-researcher.md +10 -10
  18. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +4 -4
  19. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +3 -3
  20. package/dist/builtin/subagents/agents/codebase-research-locator.md +4 -4
  21. package/dist/builtin/subagents/agents/debugger.md +5 -5
  22. package/dist/builtin/subagents/agents/worker.md +56 -0
  23. package/dist/builtin/subagents/package.json +1 -1
  24. package/dist/builtin/subagents/skills/subagent/SKILL.md +11 -11
  25. package/dist/builtin/subagents/src/agents/agent-loaders.ts +3 -5
  26. package/dist/builtin/subagents/src/agents/agent-management-helpers.ts +3 -3
  27. package/dist/builtin/subagents/src/extension/schemas.ts +2 -2
  28. package/dist/builtin/subagents/src/intercom/result-intercom.ts +4 -3
  29. package/dist/builtin/subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +1 -1
  30. package/dist/builtin/subagents/src/runs/shared/nested-render.ts +2 -2
  31. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +2 -1
  32. package/dist/builtin/subagents/src/shared/types-depth.ts +5 -5
  33. package/dist/builtin/subagents/src/shared/types-runtime.ts +2 -1
  34. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +2 -2
  35. package/dist/builtin/web-access/CHANGELOG.md +6 -0
  36. package/dist/builtin/web-access/package.json +1 -1
  37. package/dist/builtin/workflows/CHANGELOG.md +21 -0
  38. package/dist/builtin/workflows/README.md +2 -2
  39. package/dist/builtin/workflows/builtin/goal-artifacts.ts +11 -6
  40. package/dist/builtin/workflows/builtin/goal-ledger.ts +33 -1
  41. package/dist/builtin/workflows/builtin/goal-prompts.ts +23 -28
  42. package/dist/builtin/workflows/builtin/goal-reducer.ts +2 -2
  43. package/dist/builtin/workflows/builtin/goal-reports.ts +2 -5
  44. package/dist/builtin/workflows/builtin/goal-review.ts +1 -1
  45. package/dist/builtin/workflows/builtin/goal-runner.ts +10 -17
  46. package/dist/builtin/workflows/builtin/open-claude-design-feedback.ts +3 -3
  47. package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +1 -3
  48. package/dist/builtin/workflows/builtin/open-claude-design-setup.ts +1 -1
  49. package/dist/builtin/workflows/builtin/ralph-core.ts +7 -17
  50. package/dist/builtin/workflows/builtin/ralph-runner.ts +11 -18
  51. package/dist/builtin/workflows/builtin/shared-prompts.ts +1 -1
  52. package/dist/builtin/workflows/package.json +1 -1
  53. package/dist/builtin/workflows/src/extension/config-loader.ts +35 -15
  54. package/dist/builtin/workflows/src/extension/discovery.ts +20 -8
  55. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +1 -2
  56. package/dist/builtin/workflows/src/extension/wiring.ts +1 -1
  57. package/dist/builtin/workflows/src/tui/dispatch-confirm.ts +11 -10
  58. package/dist/cli/args.d.ts.map +1 -1
  59. package/dist/cli/args.js +9 -9
  60. package/dist/cli/args.js.map +1 -1
  61. package/dist/config-self-update.d.ts.map +1 -1
  62. package/dist/config-self-update.js +3 -4
  63. package/dist/config-self-update.js.map +1 -1
  64. package/dist/config.d.ts.map +1 -1
  65. package/dist/config.js +4 -5
  66. package/dist/config.js.map +1 -1
  67. package/dist/core/agent-session-bash.d.ts +1 -0
  68. package/dist/core/agent-session-bash.d.ts.map +1 -1
  69. package/dist/core/agent-session-bash.js +1 -0
  70. package/dist/core/agent-session-bash.js.map +1 -1
  71. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  72. package/dist/core/agent-session-tool-registry.js +23 -0
  73. package/dist/core/agent-session-tool-registry.js.map +1 -1
  74. package/dist/core/bash-executor.d.ts +2 -0
  75. package/dist/core/bash-executor.d.ts.map +1 -1
  76. package/dist/core/bash-executor.js +1 -0
  77. package/dist/core/bash-executor.js.map +1 -1
  78. package/dist/core/compaction/compaction.d.ts +29 -0
  79. package/dist/core/compaction/compaction.d.ts.map +1 -1
  80. package/dist/core/compaction/compaction.js +36 -1
  81. package/dist/core/compaction/compaction.js.map +1 -1
  82. package/dist/core/compaction/context-compaction-metrics.d.ts +14 -2
  83. package/dist/core/compaction/context-compaction-metrics.d.ts.map +1 -1
  84. package/dist/core/compaction/context-compaction-metrics.js +50 -1
  85. package/dist/core/compaction/context-compaction-metrics.js.map +1 -1
  86. package/dist/core/compaction/context-compaction-prompt.d.ts.map +1 -1
  87. package/dist/core/compaction/context-compaction-prompt.js +2 -0
  88. package/dist/core/compaction/context-compaction-prompt.js.map +1 -1
  89. package/dist/core/compaction/context-compaction-runner.d.ts.map +1 -1
  90. package/dist/core/compaction/context-compaction-runner.js +1 -1
  91. package/dist/core/compaction/context-compaction-runner.js.map +1 -1
  92. package/dist/core/compaction/context-deletion-application.d.ts.map +1 -1
  93. package/dist/core/compaction/context-deletion-application.js +5 -5
  94. package/dist/core/compaction/context-deletion-application.js.map +1 -1
  95. package/dist/core/compaction/context-deletion-targets.d.ts +2 -0
  96. package/dist/core/compaction/context-deletion-targets.d.ts.map +1 -1
  97. package/dist/core/compaction/context-deletion-targets.js +23 -3
  98. package/dist/core/compaction/context-deletion-targets.js.map +1 -1
  99. package/dist/core/compaction/context-deletion-tool-definitions.d.ts +6 -0
  100. package/dist/core/compaction/context-deletion-tool-definitions.d.ts.map +1 -1
  101. package/dist/core/compaction/context-deletion-tool-definitions.js.map +1 -1
  102. package/dist/core/compaction/context-deletion-tools.d.ts.map +1 -1
  103. package/dist/core/compaction/context-deletion-tools.js +18 -10
  104. package/dist/core/compaction/context-deletion-tools.js.map +1 -1
  105. package/dist/core/compaction/context-transcript-analysis.d.ts.map +1 -1
  106. package/dist/core/compaction/context-transcript-analysis.js +2 -4
  107. package/dist/core/compaction/context-transcript-analysis.js.map +1 -1
  108. package/dist/core/copilot-gemini-tool-arguments.d.ts.map +1 -1
  109. package/dist/core/copilot-gemini-tool-arguments.js +2 -60
  110. package/dist/core/copilot-gemini-tool-arguments.js.map +1 -1
  111. package/dist/core/extensions/context-types.d.ts +2 -0
  112. package/dist/core/extensions/context-types.d.ts.map +1 -1
  113. package/dist/core/extensions/context-types.js.map +1 -1
  114. package/dist/core/extensions/index.d.ts +2 -2
  115. package/dist/core/extensions/index.d.ts.map +1 -1
  116. package/dist/core/extensions/index.js +1 -1
  117. package/dist/core/extensions/index.js.map +1 -1
  118. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  119. package/dist/core/extensions/loader-virtual-modules.js +11 -3
  120. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  121. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  122. package/dist/core/extensions/runner-context.js +11 -0
  123. package/dist/core/extensions/runner-context.js.map +1 -1
  124. package/dist/core/extensions/tool-events.d.ts +13 -13
  125. package/dist/core/extensions/tool-events.d.ts.map +1 -1
  126. package/dist/core/extensions/tool-events.js +3 -3
  127. package/dist/core/extensions/tool-events.js.map +1 -1
  128. package/dist/core/extensions/types.d.ts +1 -1
  129. package/dist/core/extensions/types.d.ts.map +1 -1
  130. package/dist/core/extensions/types.js +1 -1
  131. package/dist/core/extensions/types.js.map +1 -1
  132. package/dist/core/flattened-tool-arguments.d.ts +18 -0
  133. package/dist/core/flattened-tool-arguments.d.ts.map +1 -1
  134. package/dist/core/flattened-tool-arguments.js +104 -0
  135. package/dist/core/flattened-tool-arguments.js.map +1 -1
  136. package/dist/core/sdk-exports.d.ts +1 -1
  137. package/dist/core/sdk-exports.d.ts.map +1 -1
  138. package/dist/core/sdk-exports.js +1 -1
  139. package/dist/core/sdk-exports.js.map +1 -1
  140. package/dist/core/sdk-types.d.ts +2 -2
  141. package/dist/core/sdk-types.d.ts.map +1 -1
  142. package/dist/core/sdk-types.js.map +1 -1
  143. package/dist/core/settings-manager-basic-accessors.d.ts +4 -0
  144. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  145. package/dist/core/settings-manager-basic-accessors.js +18 -0
  146. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  147. package/dist/core/settings-manager-resource-accessors.d.ts +4 -0
  148. package/dist/core/settings-manager-resource-accessors.d.ts.map +1 -1
  149. package/dist/core/settings-manager-resource-accessors.js +15 -0
  150. package/dist/core/settings-manager-resource-accessors.js.map +1 -1
  151. package/dist/core/settings-types.d.ts +11 -0
  152. package/dist/core/settings-types.d.ts.map +1 -1
  153. package/dist/core/settings-types.js.map +1 -1
  154. package/dist/core/system-prompt.d.ts +1 -1
  155. package/dist/core/system-prompt.d.ts.map +1 -1
  156. package/dist/core/system-prompt.js +3 -2
  157. package/dist/core/system-prompt.js.map +1 -1
  158. package/dist/core/tools/artifact-protocol.d.ts +11 -0
  159. package/dist/core/tools/artifact-protocol.d.ts.map +1 -0
  160. package/dist/core/tools/artifact-protocol.js +76 -0
  161. package/dist/core/tools/artifact-protocol.js.map +1 -0
  162. package/dist/core/tools/artifacts.d.ts +18 -0
  163. package/dist/core/tools/artifacts.d.ts.map +1 -0
  164. package/dist/core/tools/artifacts.js +90 -0
  165. package/dist/core/tools/artifacts.js.map +1 -0
  166. package/dist/core/tools/bash-async-jobs.d.ts +20 -0
  167. package/dist/core/tools/bash-async-jobs.d.ts.map +1 -0
  168. package/dist/core/tools/bash-async-jobs.js +59 -0
  169. package/dist/core/tools/bash-async-jobs.js.map +1 -0
  170. package/dist/core/tools/bash-async-output.d.ts +10 -0
  171. package/dist/core/tools/bash-async-output.d.ts.map +1 -0
  172. package/dist/core/tools/bash-async-output.js +80 -0
  173. package/dist/core/tools/bash-async-output.js.map +1 -0
  174. package/dist/core/tools/bash-interceptor.d.ts +10 -0
  175. package/dist/core/tools/bash-interceptor.d.ts.map +1 -0
  176. package/dist/core/tools/bash-interceptor.js +39 -0
  177. package/dist/core/tools/bash-interceptor.js.map +1 -0
  178. package/dist/core/tools/bash-leading-cd.d.ts +7 -0
  179. package/dist/core/tools/bash-leading-cd.d.ts.map +1 -0
  180. package/dist/core/tools/bash-leading-cd.js +59 -0
  181. package/dist/core/tools/bash-leading-cd.js.map +1 -0
  182. package/dist/core/tools/bash-pty-native.d.ts +14 -0
  183. package/dist/core/tools/bash-pty-native.d.ts.map +1 -0
  184. package/dist/core/tools/bash-pty-native.js +71 -0
  185. package/dist/core/tools/bash-pty-native.js.map +1 -0
  186. package/dist/core/tools/bash.d.ts +28 -17
  187. package/dist/core/tools/bash.d.ts.map +1 -1
  188. package/dist/core/tools/bash.js +152 -35
  189. package/dist/core/tools/bash.js.map +1 -1
  190. package/dist/core/tools/block-resolver.d.ts +16 -0
  191. package/dist/core/tools/block-resolver.d.ts.map +1 -0
  192. package/dist/core/tools/block-resolver.js +74 -0
  193. package/dist/core/tools/block-resolver.js.map +1 -0
  194. package/dist/core/tools/conflict-registry.d.ts +16 -0
  195. package/dist/core/tools/conflict-registry.d.ts.map +1 -0
  196. package/dist/core/tools/conflict-registry.js +44 -0
  197. package/dist/core/tools/conflict-registry.js.map +1 -0
  198. package/dist/core/tools/directory-tree.d.ts +13 -0
  199. package/dist/core/tools/directory-tree.d.ts.map +1 -0
  200. package/dist/core/tools/directory-tree.js +81 -0
  201. package/dist/core/tools/directory-tree.js.map +1 -0
  202. package/dist/core/tools/edit.d.ts +4 -29
  203. package/dist/core/tools/edit.d.ts.map +1 -1
  204. package/dist/core/tools/edit.js +136 -228
  205. package/dist/core/tools/edit.js.map +1 -1
  206. package/dist/core/tools/fetch-url.d.ts +74 -0
  207. package/dist/core/tools/fetch-url.d.ts.map +1 -0
  208. package/dist/core/tools/fetch-url.js +518 -0
  209. package/dist/core/tools/fetch-url.js.map +1 -0
  210. package/dist/core/tools/find.d.ts +27 -9
  211. package/dist/core/tools/find.d.ts.map +1 -1
  212. package/dist/core/tools/find.js +400 -176
  213. package/dist/core/tools/find.js.map +1 -1
  214. package/dist/core/tools/glob-path-utils.d.ts +8 -0
  215. package/dist/core/tools/glob-path-utils.d.ts.map +1 -0
  216. package/dist/core/tools/glob-path-utils.js +26 -0
  217. package/dist/core/tools/glob-path-utils.js.map +1 -0
  218. package/dist/core/tools/grep.d.ts +12 -0
  219. package/dist/core/tools/grep.d.ts.map +1 -1
  220. package/dist/core/tools/grep.js +141 -17
  221. package/dist/core/tools/grep.js.map +1 -1
  222. package/dist/core/tools/hashline-engine/apply.d.ts +11 -0
  223. package/dist/core/tools/hashline-engine/apply.d.ts.map +1 -0
  224. package/dist/core/tools/hashline-engine/apply.js +752 -0
  225. package/dist/core/tools/hashline-engine/apply.js.map +1 -0
  226. package/dist/core/tools/hashline-engine/block.d.ts +40 -0
  227. package/dist/core/tools/hashline-engine/block.d.ts.map +1 -0
  228. package/dist/core/tools/hashline-engine/block.js +117 -0
  229. package/dist/core/tools/hashline-engine/block.js.map +1 -0
  230. package/dist/core/tools/hashline-engine/diff-preview.d.ts +15 -0
  231. package/dist/core/tools/hashline-engine/diff-preview.d.ts.map +1 -0
  232. package/dist/core/tools/hashline-engine/diff-preview.js +98 -0
  233. package/dist/core/tools/hashline-engine/diff-preview.js.map +1 -0
  234. package/dist/core/tools/hashline-engine/format.d.ts +71 -0
  235. package/dist/core/tools/hashline-engine/format.d.ts.map +1 -0
  236. package/dist/core/tools/hashline-engine/format.js +178 -0
  237. package/dist/core/tools/hashline-engine/format.js.map +1 -0
  238. package/dist/core/tools/hashline-engine/fs.d.ts +81 -0
  239. package/dist/core/tools/hashline-engine/fs.d.ts.map +1 -0
  240. package/dist/core/tools/hashline-engine/fs.js +143 -0
  241. package/dist/core/tools/hashline-engine/fs.js.map +1 -0
  242. package/dist/core/tools/hashline-engine/index.d.ts +18 -0
  243. package/dist/core/tools/hashline-engine/index.d.ts.map +1 -0
  244. package/dist/core/tools/hashline-engine/index.js +20 -0
  245. package/dist/core/tools/hashline-engine/index.js.map +1 -0
  246. package/dist/core/tools/hashline-engine/input.d.ts +101 -0
  247. package/dist/core/tools/hashline-engine/input.d.ts.map +1 -0
  248. package/dist/core/tools/hashline-engine/input.js +398 -0
  249. package/dist/core/tools/hashline-engine/input.js.map +1 -0
  250. package/dist/core/tools/hashline-engine/messages.d.ts +99 -0
  251. package/dist/core/tools/hashline-engine/messages.d.ts.map +1 -0
  252. package/dist/core/tools/hashline-engine/messages.js +144 -0
  253. package/dist/core/tools/hashline-engine/messages.js.map +1 -0
  254. package/dist/core/tools/hashline-engine/mismatch.d.ts +45 -0
  255. package/dist/core/tools/hashline-engine/mismatch.d.ts.map +1 -0
  256. package/dist/core/tools/hashline-engine/mismatch.js +90 -0
  257. package/dist/core/tools/hashline-engine/mismatch.js.map +1 -0
  258. package/dist/core/tools/hashline-engine/normalize.d.ts +21 -0
  259. package/dist/core/tools/hashline-engine/normalize.d.ts.map +1 -0
  260. package/dist/core/tools/hashline-engine/normalize.js +33 -0
  261. package/dist/core/tools/hashline-engine/normalize.js.map +1 -0
  262. package/dist/core/tools/hashline-engine/parser.d.ts +24 -0
  263. package/dist/core/tools/hashline-engine/parser.d.ts.map +1 -0
  264. package/dist/core/tools/hashline-engine/parser.js +381 -0
  265. package/dist/core/tools/hashline-engine/parser.js.map +1 -0
  266. package/dist/core/tools/hashline-engine/patcher.d.ts +118 -0
  267. package/dist/core/tools/hashline-engine/patcher.d.ts.map +1 -0
  268. package/dist/core/tools/hashline-engine/patcher.js +341 -0
  269. package/dist/core/tools/hashline-engine/patcher.js.map +1 -0
  270. package/dist/core/tools/hashline-engine/prefixes.d.ts +43 -0
  271. package/dist/core/tools/hashline-engine/prefixes.d.ts.map +1 -0
  272. package/dist/core/tools/hashline-engine/prefixes.js +135 -0
  273. package/dist/core/tools/hashline-engine/prefixes.js.map +1 -0
  274. package/dist/core/tools/hashline-engine/recovery.d.ts +41 -0
  275. package/dist/core/tools/hashline-engine/recovery.d.ts.map +1 -0
  276. package/dist/core/tools/hashline-engine/recovery.js +168 -0
  277. package/dist/core/tools/hashline-engine/recovery.js.map +1 -0
  278. package/dist/core/tools/hashline-engine/snapshots.d.ts +65 -0
  279. package/dist/core/tools/hashline-engine/snapshots.d.ts.map +1 -0
  280. package/dist/core/tools/hashline-engine/snapshots.js +108 -0
  281. package/dist/core/tools/hashline-engine/snapshots.js.map +1 -0
  282. package/dist/core/tools/hashline-engine/stream.d.ts +3 -0
  283. package/dist/core/tools/hashline-engine/stream.d.ts.map +1 -0
  284. package/dist/core/tools/hashline-engine/stream.js +111 -0
  285. package/dist/core/tools/hashline-engine/stream.js.map +1 -0
  286. package/dist/core/tools/hashline-engine/tokenizer.d.ts +69 -0
  287. package/dist/core/tools/hashline-engine/tokenizer.d.ts.map +1 -0
  288. package/dist/core/tools/hashline-engine/tokenizer.js +430 -0
  289. package/dist/core/tools/hashline-engine/tokenizer.js.map +1 -0
  290. package/dist/core/tools/hashline-engine/types.d.ts +166 -0
  291. package/dist/core/tools/hashline-engine/types.d.ts.map +1 -0
  292. package/dist/core/tools/hashline-engine/types.js +9 -0
  293. package/dist/core/tools/hashline-engine/types.js.map +1 -0
  294. package/dist/core/tools/hashline.d.ts +29 -0
  295. package/dist/core/tools/hashline.d.ts.map +1 -0
  296. package/dist/core/tools/hashline.js +110 -0
  297. package/dist/core/tools/hashline.js.map +1 -0
  298. package/dist/core/tools/index.d.ts +6 -4
  299. package/dist/core/tools/index.d.ts.map +1 -1
  300. package/dist/core/tools/index.js +52 -35
  301. package/dist/core/tools/index.js.map +1 -1
  302. package/dist/core/tools/notebook.d.ts +38 -0
  303. package/dist/core/tools/notebook.d.ts.map +1 -0
  304. package/dist/core/tools/notebook.js +125 -0
  305. package/dist/core/tools/notebook.js.map +1 -0
  306. package/dist/core/tools/read-document-extract.d.ts +9 -0
  307. package/dist/core/tools/read-document-extract.d.ts.map +1 -0
  308. package/dist/core/tools/read-document-extract.js +212 -0
  309. package/dist/core/tools/read-document-extract.js.map +1 -0
  310. package/dist/core/tools/read-selectors.d.ts +24 -0
  311. package/dist/core/tools/read-selectors.d.ts.map +1 -0
  312. package/dist/core/tools/read-selectors.js +277 -0
  313. package/dist/core/tools/read-selectors.js.map +1 -0
  314. package/dist/core/tools/read-url.d.ts +37 -0
  315. package/dist/core/tools/read-url.d.ts.map +1 -0
  316. package/dist/core/tools/read-url.js +39 -0
  317. package/dist/core/tools/read-url.js.map +1 -0
  318. package/dist/core/tools/read.d.ts +11 -11
  319. package/dist/core/tools/read.d.ts.map +1 -1
  320. package/dist/core/tools/read.js +224 -94
  321. package/dist/core/tools/read.js.map +1 -1
  322. package/dist/core/tools/resource-selectors.d.ts +44 -0
  323. package/dist/core/tools/resource-selectors.d.ts.map +1 -0
  324. package/dist/core/tools/resource-selectors.js +808 -0
  325. package/dist/core/tools/resource-selectors.js.map +1 -0
  326. package/dist/core/tools/search-details.d.ts +26 -0
  327. package/dist/core/tools/search-details.d.ts.map +1 -0
  328. package/dist/core/tools/search-details.js +24 -0
  329. package/dist/core/tools/search-details.js.map +1 -0
  330. package/dist/core/tools/search-line-ranges.d.ts +11 -0
  331. package/dist/core/tools/search-line-ranges.d.ts.map +1 -0
  332. package/dist/core/tools/search-line-ranges.js +65 -0
  333. package/dist/core/tools/search-line-ranges.js.map +1 -0
  334. package/dist/core/tools/search-native.d.ts +97 -0
  335. package/dist/core/tools/search-native.d.ts.map +1 -0
  336. package/dist/core/tools/search-native.js +27 -0
  337. package/dist/core/tools/search-native.js.map +1 -0
  338. package/dist/core/tools/search.d.ts +24 -0
  339. package/dist/core/tools/search.d.ts.map +1 -0
  340. package/dist/core/tools/search.js +573 -0
  341. package/dist/core/tools/search.js.map +1 -0
  342. package/dist/core/tools/truncate.d.ts +4 -4
  343. package/dist/core/tools/truncate.d.ts.map +1 -1
  344. package/dist/core/tools/truncate.js +3 -3
  345. package/dist/core/tools/truncate.js.map +1 -1
  346. package/dist/core/tools/url-ip-guards.d.ts +4 -0
  347. package/dist/core/tools/url-ip-guards.d.ts.map +1 -0
  348. package/dist/core/tools/url-ip-guards.js +126 -0
  349. package/dist/core/tools/url-ip-guards.js.map +1 -0
  350. package/dist/core/tools/write.d.ts +12 -2
  351. package/dist/core/tools/write.d.ts.map +1 -1
  352. package/dist/core/tools/write.js +166 -14
  353. package/dist/core/tools/write.js.map +1 -1
  354. package/dist/core/trust-manager.d.ts.map +1 -1
  355. package/dist/core/trust-manager.js +2 -3
  356. package/dist/core/trust-manager.js.map +1 -1
  357. package/dist/index-extensions.d.ts +2 -2
  358. package/dist/index-extensions.d.ts.map +1 -1
  359. package/dist/index-extensions.js +1 -1
  360. package/dist/index-extensions.js.map +1 -1
  361. package/dist/index.d.ts +3 -3
  362. package/dist/index.d.ts.map +1 -1
  363. package/dist/index.js +3 -3
  364. package/dist/index.js.map +1 -1
  365. package/dist/modes/interactive/components/custom-editor.d.ts +1 -0
  366. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  367. package/dist/modes/interactive/components/custom-editor.js +9 -2
  368. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  369. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
  370. package/dist/modes/interactive/components/settings-selector-handlers.js +3 -0
  371. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
  372. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  373. package/dist/modes/interactive/components/settings-selector-items.js +7 -0
  374. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  375. package/dist/modes/interactive/components/settings-selector-types.d.ts +2 -0
  376. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  377. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  378. package/dist/modes/interactive/components/tree-selector-content.d.ts.map +1 -1
  379. package/dist/modes/interactive/components/tree-selector-content.js +0 -5
  380. package/dist/modes/interactive/components/tree-selector-content.js.map +1 -1
  381. package/dist/modes/interactive/interactive-auth-login.d.ts.map +1 -1
  382. package/dist/modes/interactive/interactive-auth-login.js +1 -0
  383. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  384. package/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  385. package/dist/modes/interactive/interactive-autocomplete.js +80 -2
  386. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  387. package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -1
  388. package/dist/modes/interactive/interactive-hotkeys-debug.js +3 -0
  389. package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -1
  390. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  391. package/dist/modes/interactive/interactive-input-handling.js +51 -0
  392. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  393. package/dist/modes/interactive/interactive-mode-base.d.ts +5 -0
  394. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  395. package/dist/modes/interactive/interactive-mode-base.js +5 -0
  396. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  397. package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -1
  398. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  399. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  400. package/dist/modes/interactive/interactive-mode-surface.d.ts +12 -0
  401. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  402. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  403. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  404. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  405. package/dist/modes/interactive/interactive-mode.js +1 -0
  406. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  407. package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
  408. package/dist/modes/interactive/interactive-model-routing.js +4 -1
  409. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  410. package/dist/modes/interactive/interactive-onboarding.d.ts +11 -0
  411. package/dist/modes/interactive/interactive-onboarding.d.ts.map +1 -0
  412. package/dist/modes/interactive/interactive-onboarding.js +220 -0
  413. package/dist/modes/interactive/interactive-onboarding.js.map +1 -0
  414. package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -1
  415. package/dist/modes/interactive/interactive-selectors.js +4 -0
  416. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  417. package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -1
  418. package/dist/modes/interactive/interactive-session-routing.js +6 -0
  419. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  420. package/dist/modes/interactive/interactive-slash-commands.d.ts.map +1 -1
  421. package/dist/modes/interactive/interactive-slash-commands.js +9 -4
  422. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  423. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  424. package/dist/modes/interactive/interactive-startup.js +28 -0
  425. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  426. package/dist/utils/child-process.d.ts.map +1 -1
  427. package/dist/utils/child-process.js +21 -1
  428. package/dist/utils/child-process.js.map +1 -1
  429. package/dist/utils/markit.d.ts +8 -0
  430. package/dist/utils/markit.d.ts.map +1 -0
  431. package/dist/utils/markit.js +53 -0
  432. package/dist/utils/markit.js.map +1 -0
  433. package/dist/utils/paths.d.ts +2 -1
  434. package/dist/utils/paths.d.ts.map +1 -1
  435. package/dist/utils/paths.js +14 -1
  436. package/dist/utils/paths.js.map +1 -1
  437. package/docs/compaction.md +16 -1
  438. package/docs/containerization.md +1 -1
  439. package/docs/docs.json +1 -0
  440. package/docs/extensions.md +25 -36
  441. package/docs/quickstart.md +11 -6
  442. package/docs/sdk.md +5 -5
  443. package/docs/settings.md +7 -0
  444. package/docs/subagents.md +3 -2
  445. package/docs/tools.md +49 -0
  446. package/docs/usage.md +3 -3
  447. package/docs/workflows.md +7 -5
  448. package/examples/extensions/subagent/README.md +5 -5
  449. package/examples/extensions/subagent/agents/planner.md +1 -1
  450. package/examples/extensions/subagent/agents/reviewer.md +1 -1
  451. package/examples/extensions/subagent/agents/scout.md +2 -2
  452. package/examples/extensions/subagent/display.ts +3 -3
  453. package/examples/sdk/05-tools.ts +3 -3
  454. package/examples/sdk/README.md +1 -1
  455. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-model-routing.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-model-routing.ts"],"names":[],"mappings":"","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type Api, type Model, getAgentDir, findExactModelReferenceMatch, resolveModelScope, ContextWindowSelectorComponent, formatContextWindow, copilotApiBaseUrlFromToken, copilotCatalogCacheHost, copilotCatalogCachePath, fetchCopilotModelCatalog, readCopilotCatalogCache, setActiveCopilotModelCatalog, writeCopilotCatalogCache, ModelSelectorComponent, ScopedModelsSelectorComponent, UserMessageSelectorComponent } from \"./interactive-mode-deps.ts\";\nimport { ANTHROPIC_SUBSCRIPTION_AUTH_WARNING, isAnthropicSubscriptionAuthKey } from \"./interactive-mode-helpers.ts\";\n\nInteractiveModeBase.prototype.handleModelCommand = async function(this: InteractiveModeBase, searchTerm?: string): Promise<void> {\n if (!searchTerm) {\n this.showModelSelector();\n return;\n }\n\n const model = await this.findExactModelMatch(searchTerm);\n if (model) {\n try {\n await this.session.setModel(model);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n this.showStatus(`Model: ${model.id}`);\n void this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n this.checkDaxnutsEasterEgg(model);\n } catch (error) {\n this.showError(error instanceof Error ? error.message : String(error));\n }\n return;\n }\n\n this.showModelSelector(searchTerm);\n };\n\nInteractiveModeBase.prototype.findExactModelMatch = async function(this: InteractiveModeBase, searchTerm: string): Promise<Model<Api> | undefined> {\n const models = await this.getModelCandidates();\n return findExactModelReferenceMatch(searchTerm, models);\n };\n\nInteractiveModeBase.prototype.getModelCandidates = async function(this: InteractiveModeBase): Promise<Model<Api>[]> {\n if (this.session.scopedModels.length > 0) {\n return this.session.scopedModels.map((scoped) => scoped.model);\n }\n\n await this.refreshCopilotModelCatalog();\n this.session.modelRegistry.refresh();\n try {\n return await this.session.modelRegistry.getAvailable();\n } catch {\n return [];\n }\n };\n\nInteractiveModeBase.prototype.refreshCopilotModelCatalog = async function(this: InteractiveModeBase): Promise<void> {\n if (this.copilotCatalogApplied) return;\n if (!this.copilotCatalogInFlight) {\n this.copilotCatalogInFlight = this.loadCopilotModelCatalog();\n }\n try {\n await this.copilotCatalogInFlight;\n } finally {\n this.copilotCatalogInFlight = undefined;\n }\n };\n\nInteractiveModeBase.prototype.loadCopilotModelCatalog = async function(this: InteractiveModeBase): Promise<void> {\n const registry = this.session.modelRegistry;\n const cred = registry.authStorage.get(\"github-copilot\");\n // Gate: do nothing unless the user has the GitHub Copilot provider.\n if (!cred || cred.type !== \"oauth\") return;\n try {\n const token = await registry.getApiKeyForProvider(\"github-copilot\");\n if (!token) return;\n const baseUrl = copilotApiBaseUrlFromToken(token);\n const cachePath = copilotCatalogCachePath(getAgentDir());\n let catalog = readCopilotCatalogCache(cachePath, { host: copilotCatalogCacheHost(baseUrl) });\n if (!catalog) {\n catalog = await fetchCopilotModelCatalog({ token, baseUrl });\n writeCopilotCatalogCache(cachePath, baseUrl, catalog);\n }\n setActiveCopilotModelCatalog(catalog);\n registry.refresh();\n this.copilotCatalogApplied = true;\n } catch {\n // Best-effort: leave the active catalog as-is on any failure (offline, auth, parse).\n }\n };\n\nInteractiveModeBase.prototype.updateAvailableProviderCount = async function(this: InteractiveModeBase): Promise<void> {\n const models = await this.getModelCandidates();\n const uniqueProviders = new Set(models.map((m) => m.provider));\n this.footerDataProvider.setAvailableProviderCount(uniqueProviders.size);\n };\n\nInteractiveModeBase.prototype.maybeWarnAboutAnthropicSubscriptionAuth = async function(this: InteractiveModeBase, model: Model<Api> | undefined = this.session.model): Promise<void> {\n if (this.settingsManager.getWarnings().anthropicExtraUsage === false) {\n return;\n }\n if (this.anthropicSubscriptionWarningShown) {\n return;\n }\n if (!model || model.provider !== \"anthropic\") {\n return;\n }\n\n const storedCredential =\n this.session.modelRegistry.authStorage.get(\"anthropic\");\n if (storedCredential?.type === \"oauth\") {\n this.anthropicSubscriptionWarningShown = true;\n this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING);\n return;\n }\n\n try {\n const apiKey = await this.session.modelRegistry.getApiKeyForProvider(\n model.provider,\n );\n if (!isAnthropicSubscriptionAuthKey(apiKey)) {\n return;\n }\n this.anthropicSubscriptionWarningShown = true;\n this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING);\n } catch {\n // Ignore auth lookup failures for warning-only checks.\n }\n };\n\nInteractiveModeBase.prototype.showModelSelector = function(this: InteractiveModeBase, initialSearchInput?: string): void {\n this.showSelector((done) => {\n const selector = new ModelSelectorComponent(\n this.ui,\n this.session.model,\n this.settingsManager,\n this.session.modelRegistry,\n this.session.scopedModels,\n async (model) => {\n try {\n await this.session.setModel(model);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n done();\n void this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n this.checkDaxnutsEasterEgg(model);\n if (this.session.supportsContextWindowSelection()) {\n this.showContextWindowSelector(model);\n } else {\n this.showStatus(`Model: ${model.id}`);\n }\n } catch (error) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.ui.requestRender();\n },\n initialSearchInput,\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showContextWindowSelector = function(this: InteractiveModeBase, model: Model<Api>): void {\n const availableContextWindows = this.session.getAvailableContextWindows();\n const currentContextWindow =\n this.session.model?.contextWindow ?? availableContextWindows[0] ?? 0;\n this.showSelector((done) => {\n const selector = new ContextWindowSelectorComponent(\n model.name ?? model.id,\n availableContextWindows,\n currentContextWindow,\n (contextWindow) => {\n try {\n this.session.setContextWindow(contextWindow, {\n persistDefault: true,\n });\n this.footer.invalidate();\n this.usageMeter.invalidate();\n this.updateEditorBorderColor();\n done();\n this.showStatus(\n `Model: ${model.id} \\u00b7 ${formatContextWindow(contextWindow)} context`,\n );\n } catch (error) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.showStatus(`Model: ${model.id}`);\n },\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showModelsSelector = async function(this: InteractiveModeBase): Promise<void> {\n // Get all available models\n this.session.modelRegistry.refresh();\n const allModels = this.session.modelRegistry.getAvailable();\n\n if (allModels.length === 0) {\n this.showStatus(\"No models available\");\n return;\n }\n\n // Check if session has scoped models (from previous session-only changes or CLI --models)\n const sessionScopedModels = this.session.scopedModels;\n const hasSessionScope = sessionScopedModels.length > 0;\n\n // Build enabled model IDs from session state or settings\n let currentEnabledIds: string[] | null = null;\n\n if (hasSessionScope) {\n // Use current session's scoped models\n currentEnabledIds = sessionScopedModels.map(\n (scoped) => `${scoped.model.provider}/${scoped.model.id}`,\n );\n } else {\n // Fall back to settings\n const patterns = this.settingsManager.getEnabledModels();\n if (patterns !== undefined && patterns.length > 0) {\n const scopedModels = await resolveModelScope(\n patterns,\n this.session.modelRegistry,\n );\n currentEnabledIds = scopedModels.map(\n (scoped) => `${scoped.model.provider}/${scoped.model.id}`,\n );\n }\n }\n\n // Helper to update session's scoped models (session-only, no persist)\n const updateSessionModels = async (enabledIds: string[] | null) => {\n currentEnabledIds = enabledIds === null ? null : [...enabledIds];\n if (\n enabledIds &&\n enabledIds.length > 0 &&\n enabledIds.length < allModels.length\n ) {\n const newScopedModels = await resolveModelScope(\n enabledIds,\n this.session.modelRegistry,\n );\n this.session.setScopedModels(\n newScopedModels.map((sm) => ({\n model: sm.model,\n thinkingLevel: sm.thinkingLevel,\n })),\n );\n } else {\n // All enabled or none enabled = no filter\n this.session.setScopedModels([]);\n }\n await this.updateAvailableProviderCount();\n this.setupAutocompleteProvider();\n this.ui.requestRender();\n };\n\n this.showSelector((done) => {\n const selector = new ScopedModelsSelectorComponent(\n {\n allModels,\n enabledModelIds: currentEnabledIds,\n },\n {\n onChange: async (enabledIds) => {\n await updateSessionModels(enabledIds);\n },\n onPersist: (enabledIds) => {\n // Persist to settings\n const newPatterns =\n enabledIds === null || enabledIds.length === allModels.length\n ? undefined // All enabled = clear filter\n : enabledIds;\n this.settingsManager.setEnabledModels(\n newPatterns ? [...newPatterns] : undefined,\n );\n this.showStatus(\"Model selection saved to settings\");\n },\n onCancel: () => {\n done();\n this.ui.requestRender();\n },\n },\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showUserMessageSelector = function(this: InteractiveModeBase): void {\n const userMessages = this.session.getUserMessagesForForking();\n\n if (userMessages.length === 0) {\n this.showStatus(\"No messages to fork from\");\n return;\n }\n\n const initialSelectedId = userMessages[userMessages.length - 1]?.entryId;\n\n this.showSelector((done) => {\n const selector = new UserMessageSelectorComponent(\n userMessages.map((m) => ({ id: m.entryId, text: m.text })),\n async (entryId) => {\n try {\n const result = await this.runtimeHost.fork(entryId);\n if (result.cancelled) {\n done();\n this.ui.requestRender();\n return;\n }\n\n this.renderCurrentSessionState();\n this.editor.setText(result.selectedText ?? \"\");\n done();\n this.showStatus(\"Forked to new session\");\n } catch (error: unknown) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.ui.requestRender();\n },\n initialSelectedId,\n );\n return { component: selector, focus: selector.getMessageList() };\n });\n };\n"]}
1
+ {"version":3,"file":"interactive-model-routing.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-model-routing.ts"],"names":[],"mappings":"","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type Api, type Model, getAgentDir, findExactModelReferenceMatch, resolveModelScope, ContextWindowSelectorComponent, formatContextWindow, copilotApiBaseUrlFromToken, copilotCatalogCacheHost, copilotCatalogCachePath, fetchCopilotModelCatalog, readCopilotCatalogCache, setActiveCopilotModelCatalog, writeCopilotCatalogCache, ModelSelectorComponent, ScopedModelsSelectorComponent, UserMessageSelectorComponent } from \"./interactive-mode-deps.ts\";\nimport { ANTHROPIC_SUBSCRIPTION_AUTH_WARNING, isAnthropicSubscriptionAuthKey } from \"./interactive-mode-helpers.ts\";\n\nInteractiveModeBase.prototype.handleModelCommand = async function(this: InteractiveModeBase, searchTerm?: string): Promise<void> {\n if (!searchTerm) {\n this.showModelSelector();\n return;\n }\n\n const model = await this.findExactModelMatch(searchTerm);\n if (model) {\n try {\n await this.session.setModel(model);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n this.showStatus(`Model: ${model.id}`);\n void this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n this.checkDaxnutsEasterEgg(model);\n await this.resumePendingFirstRunOnboardingSeed();\n } catch (error) {\n this.showError(error instanceof Error ? error.message : String(error));\n }\n return;\n }\n\n this.showModelSelector(searchTerm);\n };\n\nInteractiveModeBase.prototype.findExactModelMatch = async function(this: InteractiveModeBase, searchTerm: string): Promise<Model<Api> | undefined> {\n const models = await this.getModelCandidates();\n return findExactModelReferenceMatch(searchTerm, models);\n };\n\nInteractiveModeBase.prototype.getModelCandidates = async function(this: InteractiveModeBase): Promise<Model<Api>[]> {\n if (this.session.scopedModels.length > 0) {\n return this.session.scopedModels.map((scoped) => scoped.model);\n }\n\n await this.refreshCopilotModelCatalog();\n this.session.modelRegistry.refresh();\n try {\n return await this.session.modelRegistry.getAvailable();\n } catch {\n return [];\n }\n };\n\nInteractiveModeBase.prototype.refreshCopilotModelCatalog = async function(this: InteractiveModeBase): Promise<void> {\n if (this.copilotCatalogApplied) return;\n if (!this.copilotCatalogInFlight) {\n this.copilotCatalogInFlight = this.loadCopilotModelCatalog();\n }\n try {\n await this.copilotCatalogInFlight;\n } finally {\n this.copilotCatalogInFlight = undefined;\n }\n };\n\nInteractiveModeBase.prototype.loadCopilotModelCatalog = async function(this: InteractiveModeBase): Promise<void> {\n const registry = this.session.modelRegistry;\n const cred = registry.authStorage.get(\"github-copilot\");\n // Gate: do nothing unless the user has the GitHub Copilot provider.\n if (!cred || cred.type !== \"oauth\") return;\n try {\n const token = await registry.getApiKeyForProvider(\"github-copilot\");\n if (!token) return;\n const baseUrl = copilotApiBaseUrlFromToken(token);\n const cachePath = copilotCatalogCachePath(getAgentDir());\n let catalog = readCopilotCatalogCache(cachePath, { host: copilotCatalogCacheHost(baseUrl) });\n if (!catalog) {\n catalog = await fetchCopilotModelCatalog({ token, baseUrl });\n writeCopilotCatalogCache(cachePath, baseUrl, catalog);\n }\n setActiveCopilotModelCatalog(catalog);\n registry.refresh();\n this.copilotCatalogApplied = true;\n } catch {\n // Best-effort: leave the active catalog as-is on any failure (offline, auth, parse).\n }\n };\n\nInteractiveModeBase.prototype.updateAvailableProviderCount = async function(this: InteractiveModeBase): Promise<void> {\n const models = await this.getModelCandidates();\n const uniqueProviders = new Set(models.map((m) => m.provider));\n this.footerDataProvider.setAvailableProviderCount(uniqueProviders.size);\n };\n\nInteractiveModeBase.prototype.maybeWarnAboutAnthropicSubscriptionAuth = async function(this: InteractiveModeBase, model: Model<Api> | undefined = this.session.model): Promise<void> {\n if (this.settingsManager.getWarnings().anthropicExtraUsage === false) {\n return;\n }\n if (this.anthropicSubscriptionWarningShown) {\n return;\n }\n if (!model || model.provider !== \"anthropic\") {\n return;\n }\n\n const storedCredential =\n this.session.modelRegistry.authStorage.get(\"anthropic\");\n if (storedCredential?.type === \"oauth\") {\n this.anthropicSubscriptionWarningShown = true;\n this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING);\n return;\n }\n\n try {\n const apiKey = await this.session.modelRegistry.getApiKeyForProvider(\n model.provider,\n );\n if (!isAnthropicSubscriptionAuthKey(apiKey)) {\n return;\n }\n this.anthropicSubscriptionWarningShown = true;\n this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING);\n } catch {\n // Ignore auth lookup failures for warning-only checks.\n }\n };\n\nInteractiveModeBase.prototype.showModelSelector = function(this: InteractiveModeBase, initialSearchInput?: string): void {\n this.showSelector((done) => {\n const selector = new ModelSelectorComponent(\n this.ui,\n this.session.model,\n this.settingsManager,\n this.session.modelRegistry,\n this.session.scopedModels,\n async (model) => {\n try {\n await this.session.setModel(model);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n done();\n void this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n this.checkDaxnutsEasterEgg(model);\n if (this.session.supportsContextWindowSelection()) {\n this.showContextWindowSelector(model);\n } else {\n this.showStatus(`Model: ${model.id}`);\n await this.resumePendingFirstRunOnboardingSeed();\n }\n } catch (error) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.ui.requestRender();\n },\n initialSearchInput,\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showContextWindowSelector = function(this: InteractiveModeBase, model: Model<Api>): void {\n const availableContextWindows = this.session.getAvailableContextWindows();\n const currentContextWindow =\n this.session.model?.contextWindow ?? availableContextWindows[0] ?? 0;\n this.showSelector((done) => {\n const selector = new ContextWindowSelectorComponent(\n model.name ?? model.id,\n availableContextWindows,\n currentContextWindow,\n async (contextWindow) => {\n try {\n this.session.setContextWindow(contextWindow, {\n persistDefault: true,\n });\n this.footer.invalidate();\n this.usageMeter.invalidate();\n this.updateEditorBorderColor();\n done();\n this.showStatus(\n `Model: ${model.id} \\u00b7 ${formatContextWindow(contextWindow)} context`,\n );\n await this.resumePendingFirstRunOnboardingSeed();\n } catch (error) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.showStatus(`Model: ${model.id}`);\n },\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showModelsSelector = async function(this: InteractiveModeBase): Promise<void> {\n // Get all available models\n this.session.modelRegistry.refresh();\n const allModels = this.session.modelRegistry.getAvailable();\n\n if (allModels.length === 0) {\n this.showStatus(\"No models available\");\n return;\n }\n\n // Check if session has scoped models (from previous session-only changes or CLI --models)\n const sessionScopedModels = this.session.scopedModels;\n const hasSessionScope = sessionScopedModels.length > 0;\n\n // Build enabled model IDs from session state or settings\n let currentEnabledIds: string[] | null = null;\n\n if (hasSessionScope) {\n // Use current session's scoped models\n currentEnabledIds = sessionScopedModels.map(\n (scoped) => `${scoped.model.provider}/${scoped.model.id}`,\n );\n } else {\n // Fall back to settings\n const patterns = this.settingsManager.getEnabledModels();\n if (patterns !== undefined && patterns.length > 0) {\n const scopedModels = await resolveModelScope(\n patterns,\n this.session.modelRegistry,\n );\n currentEnabledIds = scopedModels.map(\n (scoped) => `${scoped.model.provider}/${scoped.model.id}`,\n );\n }\n }\n\n // Helper to update session's scoped models (session-only, no persist)\n const updateSessionModels = async (enabledIds: string[] | null) => {\n currentEnabledIds = enabledIds === null ? null : [...enabledIds];\n if (\n enabledIds &&\n enabledIds.length > 0 &&\n enabledIds.length < allModels.length\n ) {\n const newScopedModels = await resolveModelScope(\n enabledIds,\n this.session.modelRegistry,\n );\n this.session.setScopedModels(\n newScopedModels.map((sm) => ({\n model: sm.model,\n thinkingLevel: sm.thinkingLevel,\n })),\n );\n } else {\n // All enabled or none enabled = no filter\n this.session.setScopedModels([]);\n }\n await this.updateAvailableProviderCount();\n this.setupAutocompleteProvider();\n this.ui.requestRender();\n };\n\n this.showSelector((done) => {\n const selector = new ScopedModelsSelectorComponent(\n {\n allModels,\n enabledModelIds: currentEnabledIds,\n },\n {\n onChange: async (enabledIds) => {\n await updateSessionModels(enabledIds);\n },\n onPersist: (enabledIds) => {\n // Persist to settings\n const newPatterns =\n enabledIds === null || enabledIds.length === allModels.length\n ? undefined // All enabled = clear filter\n : enabledIds;\n this.settingsManager.setEnabledModels(\n newPatterns ? [...newPatterns] : undefined,\n );\n this.showStatus(\"Model selection saved to settings\");\n },\n onCancel: () => {\n done();\n this.ui.requestRender();\n },\n },\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showUserMessageSelector = function(this: InteractiveModeBase): void {\n const userMessages = this.session.getUserMessagesForForking();\n\n if (userMessages.length === 0) {\n this.showStatus(\"No messages to fork from\");\n return;\n }\n\n const initialSelectedId = userMessages[userMessages.length - 1]?.entryId;\n\n this.showSelector((done) => {\n const selector = new UserMessageSelectorComponent(\n userMessages.map((m) => ({ id: m.entryId, text: m.text })),\n async (entryId) => {\n try {\n const result = await this.runtimeHost.fork(entryId);\n if (result.cancelled) {\n done();\n this.ui.requestRender();\n return;\n }\n\n this.renderCurrentSessionState();\n this.editor.setText(result.selectedText ?? \"\");\n done();\n this.showStatus(\"Forked to new session\");\n } catch (error: unknown) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.ui.requestRender();\n },\n initialSelectedId,\n );\n return { component: selector, focus: selector.getMessageList() };\n });\n };\n"]}
@@ -15,6 +15,7 @@ InteractiveModeBase.prototype.handleModelCommand = async function (searchTerm) {
15
15
  this.showStatus(`Model: ${model.id}`);
16
16
  void this.maybeWarnAboutAnthropicSubscriptionAuth(model);
17
17
  this.checkDaxnutsEasterEgg(model);
18
+ await this.resumePendingFirstRunOnboardingSeed();
18
19
  }
19
20
  catch (error) {
20
21
  this.showError(error instanceof Error ? error.message : String(error));
@@ -126,6 +127,7 @@ InteractiveModeBase.prototype.showModelSelector = function (initialSearchInput)
126
127
  }
127
128
  else {
128
129
  this.showStatus(`Model: ${model.id}`);
130
+ await this.resumePendingFirstRunOnboardingSeed();
129
131
  }
130
132
  }
131
133
  catch (error) {
@@ -143,7 +145,7 @@ InteractiveModeBase.prototype.showContextWindowSelector = function (model) {
143
145
  const availableContextWindows = this.session.getAvailableContextWindows();
144
146
  const currentContextWindow = this.session.model?.contextWindow ?? availableContextWindows[0] ?? 0;
145
147
  this.showSelector((done) => {
146
- const selector = new ContextWindowSelectorComponent(model.name ?? model.id, availableContextWindows, currentContextWindow, (contextWindow) => {
148
+ const selector = new ContextWindowSelectorComponent(model.name ?? model.id, availableContextWindows, currentContextWindow, async (contextWindow) => {
147
149
  try {
148
150
  this.session.setContextWindow(contextWindow, {
149
151
  persistDefault: true,
@@ -153,6 +155,7 @@ InteractiveModeBase.prototype.showContextWindowSelector = function (model) {
153
155
  this.updateEditorBorderColor();
154
156
  done();
155
157
  this.showStatus(`Model: ${model.id} \u00b7 ${formatContextWindow(contextWindow)} context`);
158
+ await this.resumePendingFirstRunOnboardingSeed();
156
159
  }
157
160
  catch (error) {
158
161
  done();
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-model-routing.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-model-routing.ts"],"names":[],"mappings":"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","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type Api, type Model, getAgentDir, findExactModelReferenceMatch, resolveModelScope, ContextWindowSelectorComponent, formatContextWindow, copilotApiBaseUrlFromToken, copilotCatalogCacheHost, copilotCatalogCachePath, fetchCopilotModelCatalog, readCopilotCatalogCache, setActiveCopilotModelCatalog, writeCopilotCatalogCache, ModelSelectorComponent, ScopedModelsSelectorComponent, UserMessageSelectorComponent } from \"./interactive-mode-deps.ts\";\nimport { ANTHROPIC_SUBSCRIPTION_AUTH_WARNING, isAnthropicSubscriptionAuthKey } from \"./interactive-mode-helpers.ts\";\n\nInteractiveModeBase.prototype.handleModelCommand = async function(this: InteractiveModeBase, searchTerm?: string): Promise<void> {\n if (!searchTerm) {\n this.showModelSelector();\n return;\n }\n\n const model = await this.findExactModelMatch(searchTerm);\n if (model) {\n try {\n await this.session.setModel(model);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n this.showStatus(`Model: ${model.id}`);\n void this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n this.checkDaxnutsEasterEgg(model);\n } catch (error) {\n this.showError(error instanceof Error ? error.message : String(error));\n }\n return;\n }\n\n this.showModelSelector(searchTerm);\n };\n\nInteractiveModeBase.prototype.findExactModelMatch = async function(this: InteractiveModeBase, searchTerm: string): Promise<Model<Api> | undefined> {\n const models = await this.getModelCandidates();\n return findExactModelReferenceMatch(searchTerm, models);\n };\n\nInteractiveModeBase.prototype.getModelCandidates = async function(this: InteractiveModeBase): Promise<Model<Api>[]> {\n if (this.session.scopedModels.length > 0) {\n return this.session.scopedModels.map((scoped) => scoped.model);\n }\n\n await this.refreshCopilotModelCatalog();\n this.session.modelRegistry.refresh();\n try {\n return await this.session.modelRegistry.getAvailable();\n } catch {\n return [];\n }\n };\n\nInteractiveModeBase.prototype.refreshCopilotModelCatalog = async function(this: InteractiveModeBase): Promise<void> {\n if (this.copilotCatalogApplied) return;\n if (!this.copilotCatalogInFlight) {\n this.copilotCatalogInFlight = this.loadCopilotModelCatalog();\n }\n try {\n await this.copilotCatalogInFlight;\n } finally {\n this.copilotCatalogInFlight = undefined;\n }\n };\n\nInteractiveModeBase.prototype.loadCopilotModelCatalog = async function(this: InteractiveModeBase): Promise<void> {\n const registry = this.session.modelRegistry;\n const cred = registry.authStorage.get(\"github-copilot\");\n // Gate: do nothing unless the user has the GitHub Copilot provider.\n if (!cred || cred.type !== \"oauth\") return;\n try {\n const token = await registry.getApiKeyForProvider(\"github-copilot\");\n if (!token) return;\n const baseUrl = copilotApiBaseUrlFromToken(token);\n const cachePath = copilotCatalogCachePath(getAgentDir());\n let catalog = readCopilotCatalogCache(cachePath, { host: copilotCatalogCacheHost(baseUrl) });\n if (!catalog) {\n catalog = await fetchCopilotModelCatalog({ token, baseUrl });\n writeCopilotCatalogCache(cachePath, baseUrl, catalog);\n }\n setActiveCopilotModelCatalog(catalog);\n registry.refresh();\n this.copilotCatalogApplied = true;\n } catch {\n // Best-effort: leave the active catalog as-is on any failure (offline, auth, parse).\n }\n };\n\nInteractiveModeBase.prototype.updateAvailableProviderCount = async function(this: InteractiveModeBase): Promise<void> {\n const models = await this.getModelCandidates();\n const uniqueProviders = new Set(models.map((m) => m.provider));\n this.footerDataProvider.setAvailableProviderCount(uniqueProviders.size);\n };\n\nInteractiveModeBase.prototype.maybeWarnAboutAnthropicSubscriptionAuth = async function(this: InteractiveModeBase, model: Model<Api> | undefined = this.session.model): Promise<void> {\n if (this.settingsManager.getWarnings().anthropicExtraUsage === false) {\n return;\n }\n if (this.anthropicSubscriptionWarningShown) {\n return;\n }\n if (!model || model.provider !== \"anthropic\") {\n return;\n }\n\n const storedCredential =\n this.session.modelRegistry.authStorage.get(\"anthropic\");\n if (storedCredential?.type === \"oauth\") {\n this.anthropicSubscriptionWarningShown = true;\n this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING);\n return;\n }\n\n try {\n const apiKey = await this.session.modelRegistry.getApiKeyForProvider(\n model.provider,\n );\n if (!isAnthropicSubscriptionAuthKey(apiKey)) {\n return;\n }\n this.anthropicSubscriptionWarningShown = true;\n this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING);\n } catch {\n // Ignore auth lookup failures for warning-only checks.\n }\n };\n\nInteractiveModeBase.prototype.showModelSelector = function(this: InteractiveModeBase, initialSearchInput?: string): void {\n this.showSelector((done) => {\n const selector = new ModelSelectorComponent(\n this.ui,\n this.session.model,\n this.settingsManager,\n this.session.modelRegistry,\n this.session.scopedModels,\n async (model) => {\n try {\n await this.session.setModel(model);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n done();\n void this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n this.checkDaxnutsEasterEgg(model);\n if (this.session.supportsContextWindowSelection()) {\n this.showContextWindowSelector(model);\n } else {\n this.showStatus(`Model: ${model.id}`);\n }\n } catch (error) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.ui.requestRender();\n },\n initialSearchInput,\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showContextWindowSelector = function(this: InteractiveModeBase, model: Model<Api>): void {\n const availableContextWindows = this.session.getAvailableContextWindows();\n const currentContextWindow =\n this.session.model?.contextWindow ?? availableContextWindows[0] ?? 0;\n this.showSelector((done) => {\n const selector = new ContextWindowSelectorComponent(\n model.name ?? model.id,\n availableContextWindows,\n currentContextWindow,\n (contextWindow) => {\n try {\n this.session.setContextWindow(contextWindow, {\n persistDefault: true,\n });\n this.footer.invalidate();\n this.usageMeter.invalidate();\n this.updateEditorBorderColor();\n done();\n this.showStatus(\n `Model: ${model.id} \\u00b7 ${formatContextWindow(contextWindow)} context`,\n );\n } catch (error) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.showStatus(`Model: ${model.id}`);\n },\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showModelsSelector = async function(this: InteractiveModeBase): Promise<void> {\n // Get all available models\n this.session.modelRegistry.refresh();\n const allModels = this.session.modelRegistry.getAvailable();\n\n if (allModels.length === 0) {\n this.showStatus(\"No models available\");\n return;\n }\n\n // Check if session has scoped models (from previous session-only changes or CLI --models)\n const sessionScopedModels = this.session.scopedModels;\n const hasSessionScope = sessionScopedModels.length > 0;\n\n // Build enabled model IDs from session state or settings\n let currentEnabledIds: string[] | null = null;\n\n if (hasSessionScope) {\n // Use current session's scoped models\n currentEnabledIds = sessionScopedModels.map(\n (scoped) => `${scoped.model.provider}/${scoped.model.id}`,\n );\n } else {\n // Fall back to settings\n const patterns = this.settingsManager.getEnabledModels();\n if (patterns !== undefined && patterns.length > 0) {\n const scopedModels = await resolveModelScope(\n patterns,\n this.session.modelRegistry,\n );\n currentEnabledIds = scopedModels.map(\n (scoped) => `${scoped.model.provider}/${scoped.model.id}`,\n );\n }\n }\n\n // Helper to update session's scoped models (session-only, no persist)\n const updateSessionModels = async (enabledIds: string[] | null) => {\n currentEnabledIds = enabledIds === null ? null : [...enabledIds];\n if (\n enabledIds &&\n enabledIds.length > 0 &&\n enabledIds.length < allModels.length\n ) {\n const newScopedModels = await resolveModelScope(\n enabledIds,\n this.session.modelRegistry,\n );\n this.session.setScopedModels(\n newScopedModels.map((sm) => ({\n model: sm.model,\n thinkingLevel: sm.thinkingLevel,\n })),\n );\n } else {\n // All enabled or none enabled = no filter\n this.session.setScopedModels([]);\n }\n await this.updateAvailableProviderCount();\n this.setupAutocompleteProvider();\n this.ui.requestRender();\n };\n\n this.showSelector((done) => {\n const selector = new ScopedModelsSelectorComponent(\n {\n allModels,\n enabledModelIds: currentEnabledIds,\n },\n {\n onChange: async (enabledIds) => {\n await updateSessionModels(enabledIds);\n },\n onPersist: (enabledIds) => {\n // Persist to settings\n const newPatterns =\n enabledIds === null || enabledIds.length === allModels.length\n ? undefined // All enabled = clear filter\n : enabledIds;\n this.settingsManager.setEnabledModels(\n newPatterns ? [...newPatterns] : undefined,\n );\n this.showStatus(\"Model selection saved to settings\");\n },\n onCancel: () => {\n done();\n this.ui.requestRender();\n },\n },\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showUserMessageSelector = function(this: InteractiveModeBase): void {\n const userMessages = this.session.getUserMessagesForForking();\n\n if (userMessages.length === 0) {\n this.showStatus(\"No messages to fork from\");\n return;\n }\n\n const initialSelectedId = userMessages[userMessages.length - 1]?.entryId;\n\n this.showSelector((done) => {\n const selector = new UserMessageSelectorComponent(\n userMessages.map((m) => ({ id: m.entryId, text: m.text })),\n async (entryId) => {\n try {\n const result = await this.runtimeHost.fork(entryId);\n if (result.cancelled) {\n done();\n this.ui.requestRender();\n return;\n }\n\n this.renderCurrentSessionState();\n this.editor.setText(result.selectedText ?? \"\");\n done();\n this.showStatus(\"Forked to new session\");\n } catch (error: unknown) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.ui.requestRender();\n },\n initialSelectedId,\n );\n return { component: selector, focus: selector.getMessageList() };\n });\n };\n"]}
1
+ {"version":3,"file":"interactive-model-routing.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-model-routing.ts"],"names":[],"mappings":"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","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type Api, type Model, getAgentDir, findExactModelReferenceMatch, resolveModelScope, ContextWindowSelectorComponent, formatContextWindow, copilotApiBaseUrlFromToken, copilotCatalogCacheHost, copilotCatalogCachePath, fetchCopilotModelCatalog, readCopilotCatalogCache, setActiveCopilotModelCatalog, writeCopilotCatalogCache, ModelSelectorComponent, ScopedModelsSelectorComponent, UserMessageSelectorComponent } from \"./interactive-mode-deps.ts\";\nimport { ANTHROPIC_SUBSCRIPTION_AUTH_WARNING, isAnthropicSubscriptionAuthKey } from \"./interactive-mode-helpers.ts\";\n\nInteractiveModeBase.prototype.handleModelCommand = async function(this: InteractiveModeBase, searchTerm?: string): Promise<void> {\n if (!searchTerm) {\n this.showModelSelector();\n return;\n }\n\n const model = await this.findExactModelMatch(searchTerm);\n if (model) {\n try {\n await this.session.setModel(model);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n this.showStatus(`Model: ${model.id}`);\n void this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n this.checkDaxnutsEasterEgg(model);\n await this.resumePendingFirstRunOnboardingSeed();\n } catch (error) {\n this.showError(error instanceof Error ? error.message : String(error));\n }\n return;\n }\n\n this.showModelSelector(searchTerm);\n };\n\nInteractiveModeBase.prototype.findExactModelMatch = async function(this: InteractiveModeBase, searchTerm: string): Promise<Model<Api> | undefined> {\n const models = await this.getModelCandidates();\n return findExactModelReferenceMatch(searchTerm, models);\n };\n\nInteractiveModeBase.prototype.getModelCandidates = async function(this: InteractiveModeBase): Promise<Model<Api>[]> {\n if (this.session.scopedModels.length > 0) {\n return this.session.scopedModels.map((scoped) => scoped.model);\n }\n\n await this.refreshCopilotModelCatalog();\n this.session.modelRegistry.refresh();\n try {\n return await this.session.modelRegistry.getAvailable();\n } catch {\n return [];\n }\n };\n\nInteractiveModeBase.prototype.refreshCopilotModelCatalog = async function(this: InteractiveModeBase): Promise<void> {\n if (this.copilotCatalogApplied) return;\n if (!this.copilotCatalogInFlight) {\n this.copilotCatalogInFlight = this.loadCopilotModelCatalog();\n }\n try {\n await this.copilotCatalogInFlight;\n } finally {\n this.copilotCatalogInFlight = undefined;\n }\n };\n\nInteractiveModeBase.prototype.loadCopilotModelCatalog = async function(this: InteractiveModeBase): Promise<void> {\n const registry = this.session.modelRegistry;\n const cred = registry.authStorage.get(\"github-copilot\");\n // Gate: do nothing unless the user has the GitHub Copilot provider.\n if (!cred || cred.type !== \"oauth\") return;\n try {\n const token = await registry.getApiKeyForProvider(\"github-copilot\");\n if (!token) return;\n const baseUrl = copilotApiBaseUrlFromToken(token);\n const cachePath = copilotCatalogCachePath(getAgentDir());\n let catalog = readCopilotCatalogCache(cachePath, { host: copilotCatalogCacheHost(baseUrl) });\n if (!catalog) {\n catalog = await fetchCopilotModelCatalog({ token, baseUrl });\n writeCopilotCatalogCache(cachePath, baseUrl, catalog);\n }\n setActiveCopilotModelCatalog(catalog);\n registry.refresh();\n this.copilotCatalogApplied = true;\n } catch {\n // Best-effort: leave the active catalog as-is on any failure (offline, auth, parse).\n }\n };\n\nInteractiveModeBase.prototype.updateAvailableProviderCount = async function(this: InteractiveModeBase): Promise<void> {\n const models = await this.getModelCandidates();\n const uniqueProviders = new Set(models.map((m) => m.provider));\n this.footerDataProvider.setAvailableProviderCount(uniqueProviders.size);\n };\n\nInteractiveModeBase.prototype.maybeWarnAboutAnthropicSubscriptionAuth = async function(this: InteractiveModeBase, model: Model<Api> | undefined = this.session.model): Promise<void> {\n if (this.settingsManager.getWarnings().anthropicExtraUsage === false) {\n return;\n }\n if (this.anthropicSubscriptionWarningShown) {\n return;\n }\n if (!model || model.provider !== \"anthropic\") {\n return;\n }\n\n const storedCredential =\n this.session.modelRegistry.authStorage.get(\"anthropic\");\n if (storedCredential?.type === \"oauth\") {\n this.anthropicSubscriptionWarningShown = true;\n this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING);\n return;\n }\n\n try {\n const apiKey = await this.session.modelRegistry.getApiKeyForProvider(\n model.provider,\n );\n if (!isAnthropicSubscriptionAuthKey(apiKey)) {\n return;\n }\n this.anthropicSubscriptionWarningShown = true;\n this.showWarning(ANTHROPIC_SUBSCRIPTION_AUTH_WARNING);\n } catch {\n // Ignore auth lookup failures for warning-only checks.\n }\n };\n\nInteractiveModeBase.prototype.showModelSelector = function(this: InteractiveModeBase, initialSearchInput?: string): void {\n this.showSelector((done) => {\n const selector = new ModelSelectorComponent(\n this.ui,\n this.session.model,\n this.settingsManager,\n this.session.modelRegistry,\n this.session.scopedModels,\n async (model) => {\n try {\n await this.session.setModel(model);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n done();\n void this.maybeWarnAboutAnthropicSubscriptionAuth(model);\n this.checkDaxnutsEasterEgg(model);\n if (this.session.supportsContextWindowSelection()) {\n this.showContextWindowSelector(model);\n } else {\n this.showStatus(`Model: ${model.id}`);\n await this.resumePendingFirstRunOnboardingSeed();\n }\n } catch (error) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.ui.requestRender();\n },\n initialSearchInput,\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showContextWindowSelector = function(this: InteractiveModeBase, model: Model<Api>): void {\n const availableContextWindows = this.session.getAvailableContextWindows();\n const currentContextWindow =\n this.session.model?.contextWindow ?? availableContextWindows[0] ?? 0;\n this.showSelector((done) => {\n const selector = new ContextWindowSelectorComponent(\n model.name ?? model.id,\n availableContextWindows,\n currentContextWindow,\n async (contextWindow) => {\n try {\n this.session.setContextWindow(contextWindow, {\n persistDefault: true,\n });\n this.footer.invalidate();\n this.usageMeter.invalidate();\n this.updateEditorBorderColor();\n done();\n this.showStatus(\n `Model: ${model.id} \\u00b7 ${formatContextWindow(contextWindow)} context`,\n );\n await this.resumePendingFirstRunOnboardingSeed();\n } catch (error) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.showStatus(`Model: ${model.id}`);\n },\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showModelsSelector = async function(this: InteractiveModeBase): Promise<void> {\n // Get all available models\n this.session.modelRegistry.refresh();\n const allModels = this.session.modelRegistry.getAvailable();\n\n if (allModels.length === 0) {\n this.showStatus(\"No models available\");\n return;\n }\n\n // Check if session has scoped models (from previous session-only changes or CLI --models)\n const sessionScopedModels = this.session.scopedModels;\n const hasSessionScope = sessionScopedModels.length > 0;\n\n // Build enabled model IDs from session state or settings\n let currentEnabledIds: string[] | null = null;\n\n if (hasSessionScope) {\n // Use current session's scoped models\n currentEnabledIds = sessionScopedModels.map(\n (scoped) => `${scoped.model.provider}/${scoped.model.id}`,\n );\n } else {\n // Fall back to settings\n const patterns = this.settingsManager.getEnabledModels();\n if (patterns !== undefined && patterns.length > 0) {\n const scopedModels = await resolveModelScope(\n patterns,\n this.session.modelRegistry,\n );\n currentEnabledIds = scopedModels.map(\n (scoped) => `${scoped.model.provider}/${scoped.model.id}`,\n );\n }\n }\n\n // Helper to update session's scoped models (session-only, no persist)\n const updateSessionModels = async (enabledIds: string[] | null) => {\n currentEnabledIds = enabledIds === null ? null : [...enabledIds];\n if (\n enabledIds &&\n enabledIds.length > 0 &&\n enabledIds.length < allModels.length\n ) {\n const newScopedModels = await resolveModelScope(\n enabledIds,\n this.session.modelRegistry,\n );\n this.session.setScopedModels(\n newScopedModels.map((sm) => ({\n model: sm.model,\n thinkingLevel: sm.thinkingLevel,\n })),\n );\n } else {\n // All enabled or none enabled = no filter\n this.session.setScopedModels([]);\n }\n await this.updateAvailableProviderCount();\n this.setupAutocompleteProvider();\n this.ui.requestRender();\n };\n\n this.showSelector((done) => {\n const selector = new ScopedModelsSelectorComponent(\n {\n allModels,\n enabledModelIds: currentEnabledIds,\n },\n {\n onChange: async (enabledIds) => {\n await updateSessionModels(enabledIds);\n },\n onPersist: (enabledIds) => {\n // Persist to settings\n const newPatterns =\n enabledIds === null || enabledIds.length === allModels.length\n ? undefined // All enabled = clear filter\n : enabledIds;\n this.settingsManager.setEnabledModels(\n newPatterns ? [...newPatterns] : undefined,\n );\n this.showStatus(\"Model selection saved to settings\");\n },\n onCancel: () => {\n done();\n this.ui.requestRender();\n },\n },\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showUserMessageSelector = function(this: InteractiveModeBase): void {\n const userMessages = this.session.getUserMessagesForForking();\n\n if (userMessages.length === 0) {\n this.showStatus(\"No messages to fork from\");\n return;\n }\n\n const initialSelectedId = userMessages[userMessages.length - 1]?.entryId;\n\n this.showSelector((done) => {\n const selector = new UserMessageSelectorComponent(\n userMessages.map((m) => ({ id: m.entryId, text: m.text })),\n async (entryId) => {\n try {\n const result = await this.runtimeHost.fork(entryId);\n if (result.cancelled) {\n done();\n this.ui.requestRender();\n return;\n }\n\n this.renderCurrentSessionState();\n this.editor.setText(result.selectedText ?? \"\");\n done();\n this.showStatus(\"Forked to new session\");\n } catch (error: unknown) {\n done();\n this.showError(\n error instanceof Error ? error.message : String(error),\n );\n }\n },\n () => {\n done();\n this.ui.requestRender();\n },\n initialSelectedId,\n );\n return { component: selector, focus: selector.getMessageList() };\n });\n };\n"]}
@@ -0,0 +1,11 @@
1
+ export declare const ONBOARDING_PLACEHOLDER = "Paste a ticket, issue, path to a spec, or task prompt\u2026";
2
+ export declare const ONBOARDING_COPY: string;
3
+ export declare const NORMAL_CHAT_TRANSITION_COPY: string;
4
+ export declare const ONBOARDING_SEED_STASHED_COPY: string;
5
+ export declare const ONBOARDING_SEED_REPLACED_COPY: string;
6
+ export declare const ONBOARDING_HANDOFF_NOTICE = "Handing your task to the normal coding-agent session.";
7
+ export declare const ONBOARDING_ROUTING_THINKING_LEVEL = "high";
8
+ export declare function isCwdLocalExistingPathSeed(seed: string, cwd: string): boolean;
9
+ export declare function isExistingAbsolutePathSeed(seed: string): boolean;
10
+ export declare function buildOnboardingHandoffPrompt(seed: string): string;
11
+ //# sourceMappingURL=interactive-onboarding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive-onboarding.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-onboarding.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,sBAAsB,gEAA2D,CAAC;AAE/F,eAAO,MAAM,eAAe,QAQhB,CAAC;AAEb,eAAO,MAAM,2BAA2B,QAM5B,CAAC;AAEb,eAAO,MAAM,4BAA4B,QAG7B,CAAC;AAEb,eAAO,MAAM,6BAA6B,QAG9B,CAAC;AAEb,eAAO,MAAM,yBAAyB,0DAA0D,CAAC;AACjG,eAAO,MAAM,iCAAiC,SAAS,CAAC;AA+BxD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAW7E;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAWhE;AAYD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqCjE","sourcesContent":["import { lstatSync, realpathSync, statSync } from \"node:fs\";\nimport { isAbsolute, resolve, relative } from \"node:path\";\nimport { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport type { Api, Model } from \"./interactive-mode-deps.ts\";\nimport { isUnknownModel } from \"./interactive-mode-helpers.ts\";\n\nexport const ONBOARDING_PLACEHOLDER = \"Paste a ticket, issue, path to a spec, or task prompt…\";\n\nexport const ONBOARDING_COPY = [\n \"Atomic runs agent loops as workflows you can watch and trust:\",\n \"implement a ticket, research a codebase, design a UI, or build\",\n \"your own loop.\",\n \"\",\n \"Paste a ticket description, GitHub issue, path to a spec, or task prompt to start.\",\n \"/chat to chat normally · /atomic for guides\",\n \"If you have not logged in yet, first run /login.\",\n].join(\"\\n\");\n\nexport const NORMAL_CHAT_TRANSITION_COPY = [\n \"You're in a normal coding-agent session now. Atomic can chat and edit like other\",\n \"coding agents, but it also runs loops and workflows. Ask Atomic to build any loop,\",\n \"or run a built-in workflow like `goal` for small focused changes or `ralph` for\",\n \"larger, cross-cutting work. Run `/workflow list` to see built-ins, and use `/atomic`\",\n \"for help running or building your own loops and workflows.\",\n].join(\"\\n\");\n\nexport const ONBOARDING_SEED_STASHED_COPY = [\n \"Task saved for after login. Run /login to connect a provider; once login finishes,\",\n \"Atomic will continue with your saved task.\",\n].join(\"\\n\");\n\nexport const ONBOARDING_SEED_REPLACED_COPY = [\n \"Latest task saved for after login, replacing the previous saved task. Run /login to\",\n \"connect a provider; once login finishes, Atomic will continue with the latest task.\",\n].join(\"\\n\");\n\nexport const ONBOARDING_HANDOFF_NOTICE = \"Handing your task to the normal coding-agent session.\";\nexport const ONBOARDING_ROUTING_THINKING_LEVEL = \"high\";\n\nfunction isInside(baseDir: string, candidate: string): boolean {\n const rel = relative(baseDir, candidate);\n return rel === \"\" || (!rel.startsWith(\"..\") && !isAbsolute(rel));\n}\n\nfunction pathCandidatesWithOptionalLocationSuffix(pathText: string): string[] {\n const candidates = [pathText, pathText.replace(/:\\d+:\\d+$/, \"\"), pathText.replace(/:\\d+$/, \"\")];\n return candidates.filter((candidate, index) => candidate && candidates.indexOf(candidate) === index);\n}\n\nfunction firstSeedLine(seed: string): string { return seed.trim().split(/\\r?\\n/, 1)[0]?.trim() ?? \"\"; }\n\nfunction getContainedExistingPath(pathText: string, cwd: string): string | undefined {\n if (!pathText || /\\r|\\n/.test(pathText) || /^[a-z]+:\\/\\//i.test(pathText)) return undefined;\n const root = resolve(cwd);\n let rootReal: string;\n try { rootReal = realpathSync(root); } catch { return undefined; }\n for (const candidate of pathCandidatesWithOptionalLocationSuffix(pathText)) {\n const absolute = isAbsolute(candidate) ? resolve(candidate) : resolve(cwd, candidate);\n if (!isInside(root, absolute)) continue;\n try {\n lstatSync(absolute);\n const real = realpathSync(absolute);\n if (isInside(rootReal, real)) return real;\n } catch {}\n }\n return undefined;\n}\n\nexport function isCwdLocalExistingPathSeed(seed: string, cwd: string): boolean {\n const trimmed = firstSeedLine(seed);\n if (!trimmed || !isAbsolute(trimmed)) return false;\n const real = getContainedExistingPath(trimmed, cwd);\n if (!real) return false;\n try {\n const stat = statSync(real);\n return stat.isFile() || stat.isDirectory();\n } catch {\n return false;\n }\n}\n\nexport function isExistingAbsolutePathSeed(seed: string): boolean {\n const trimmed = firstSeedLine(seed);\n if (!trimmed || /\\r|\\n/.test(trimmed) || /^[a-z]+:\\/\\//i.test(trimmed) || !isAbsolute(trimmed)) return false;\n for (const candidate of pathCandidatesWithOptionalLocationSuffix(trimmed)) {\n if (!isAbsolute(candidate)) continue;\n try {\n const stat = statSync(candidate);\n if (stat.isFile() || stat.isDirectory()) return true;\n } catch {}\n }\n return false;\n}\n\nfunction sameModel(a: Model<Api>, b: Model<Api>): boolean {\n return a.provider === b.provider && a.id === b.id;\n}\n\nfunction backtickFenceFor(seed: string): string {\n let longest = 0;\n for (const match of seed.matchAll(/`+/g)) longest = Math.max(longest, match[0].length);\n return \"`\".repeat(Math.max(3, longest + 1));\n}\n\nexport function buildOnboardingHandoffPrompt(seed: string): string {\n const fence = backtickFenceFor(seed);\n return [\n \"First-run onboarding handoff: continue as a normal Atomic coding-agent session.\",\n \"\",\n \"Original task seed:\",\n `${fence}text`,\n seed,\n fence,\n \"\",\n \"Perform a quick scope-routing pass before acting. Atomic has switched the selected model\",\n \"to high reasoning for this routing decision when the model supports it. First estimate the\",\n \"likely scope from the seed text alone: tickets, GitHub issues, and especially specs often\",\n \"name enough work items, files, systems, tests, docs, migrations, or acceptance criteria to\",\n \"classify the task without immediately inspecting the repo. Treat that text-only estimate as\",\n \"an initial confidence signal for routing, not as final implementation planning.\",\n \"\",\n \"If the seed makes the task clearly tiny or small and the routing choice is high-confidence,\",\n \"you may route directly without codebase probing. If the seed references a local path, issue,\",\n \"spec, or repo area that must be read to understand the task, inspect only that targeted\",\n \"context. When the scope is medium, large, unclear, risky, or otherwise not obviously tiny,\",\n \"gather quick read-only codebase context with targeted subagents such as `codebase-locator`,\",\n \"`codebase-analyzer`, and `codebase-pattern-finder`. Use those subagents with their normal\",\n \"default model/thinking settings; do not override their models just for routing. Do only the\",\n \"probing needed to route scope; do not turn this into an open-ended research project.\",\n \"\",\n \"Then make the final choice in this high-reasoning parent session using the existing Atomic\",\n \"workflow guidance: choose `goal` for clearly small, focused fixes or quick fixes; choose `ralph`\",\n \"for non-trivial, broad, cross-cutting, risky, unclear, or around-2K+-changed-line work.\",\n \"Start the selected workflow with the original seed. After the `goal` or `ralph` run is\",\n \"dispatched, show the new developer the workflow id and succinct next steps:\",\n \"- `/workflow status <workflow-id>` checks progress.\",\n \"- `/workflow connect <workflow-id>` opens the graph viewer to watch, attach, and steer.\",\n \"- They can ask in this chat for status or to steer the run at any point.\",\n \"Then continue normally in this session. Slash commands should behave like normal\",\n \"coding-agent slash commands from here on.\",\n ].join(\"\\n\");\n}\n\nInteractiveModeBase.prototype.isFirstRunOnboardingEligible = function(this: InteractiveModeBase): boolean {\n const hasInitialInput = Boolean(this.options.initialMessage) || Boolean(this.options.initialMessages?.length);\n return this.session.state.messages.length === 0\n && !hasInitialInput\n && !this.settingsManager.getOnboardedVersion()\n && Boolean(this.settingsManager.getFirstRunOnboardingStartedVersion());\n};\n\nInteractiveModeBase.prototype.isFirstRunOnboardingReadyForHandoff = function(this: InteractiveModeBase): boolean {\n const registry = this.session.modelRegistry;\n if (!registry) return true;\n const model = this.session.model;\n if (!model || isUnknownModel(model)) return false;\n if (typeof registry.hasConfiguredAuth === \"function\") {\n return registry.hasConfiguredAuth(model);\n }\n if (typeof registry.getAvailable === \"function\") {\n return registry.getAvailable().some((availableModel) => sameModel(availableModel, model));\n }\n return true;\n};\n\nInteractiveModeBase.prototype.stashFirstRunOnboardingSeed = function(this: InteractiveModeBase, seed: string): void {\n const replaced = Boolean(this.pendingFirstRunOnboardingSeed);\n this.pendingFirstRunOnboardingSeed = seed;\n this.showStatus(replaced ? ONBOARDING_SEED_REPLACED_COPY : ONBOARDING_SEED_STASHED_COPY);\n};\n\nInteractiveModeBase.prototype.resumePendingFirstRunOnboardingSeed = async function(this: InteractiveModeBase): Promise<void> {\n if (!this.firstRunOnboardingActive || !this.pendingFirstRunOnboardingSeed) return;\n if (!this.isFirstRunOnboardingReadyForHandoff()) return;\n const seed = this.pendingFirstRunOnboardingSeed;\n this.pendingFirstRunOnboardingSeed = undefined;\n try {\n await this.handleOnboardingWorkflowSeed(seed);\n } catch (error: unknown) {\n this.pendingFirstRunOnboardingSeed = seed;\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.showError(errorMessage);\n }\n};\n\nInteractiveModeBase.prototype.clearPendingFirstRunOnboardingSeed = function(this: InteractiveModeBase): void {\n this.firstRunOnboardingSeedInFlight = false;\n this.pendingFirstRunOnboardingSeed = undefined;\n};\n\nInteractiveModeBase.prototype.clearFirstRunOnboardingUi = function(this: InteractiveModeBase): void {\n this.firstRunOnboardingActive = false;\n InteractiveModeBase.prototype.clearPendingFirstRunOnboardingSeed.call(this);\n this.defaultEditor.setPlaceholder(undefined);\n if (this.firstRunOnboardingHeaderComponents.length > 0) {\n this.headerContainer.children = this.headerContainer.children.filter(\n (child) => !this.firstRunOnboardingHeaderComponents.includes(child),\n );\n this.firstRunOnboardingHeaderComponents = [];\n }\n this.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.completeFirstRunOnboarding = function(this: InteractiveModeBase): void {\n this.settingsManager.setOnboardedVersion(this.version);\n InteractiveModeBase.prototype.clearFirstRunOnboardingUi.call(this);\n};\n\nInteractiveModeBase.prototype.handleOnboardingWorkflowSeed = async function(\n this: InteractiveModeBase,\n seed: string,\n): Promise<void> {\n const handoffPrompt = buildOnboardingHandoffPrompt(seed);\n this.session.setThinkingLevel(ONBOARDING_ROUTING_THINKING_LEVEL);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n this.flushPendingBashComponents();\n if (this.onInputCallback) {\n this.onInputCallback(handoffPrompt);\n } else {\n this.pendingUserInputs.push(handoffPrompt);\n }\n this.showStatus(ONBOARDING_HANDOFF_NOTICE);\n this.completeFirstRunOnboarding();\n};\n"]}
@@ -0,0 +1,220 @@
1
+ import { lstatSync, realpathSync, statSync } from "node:fs";
2
+ import { isAbsolute, resolve, relative } from "node:path";
3
+ import { InteractiveModeBase } from "./interactive-mode-base.js";
4
+ import { isUnknownModel } from "./interactive-mode-helpers.js";
5
+ export const ONBOARDING_PLACEHOLDER = "Paste a ticket, issue, path to a spec, or task prompt…";
6
+ export const ONBOARDING_COPY = [
7
+ "Atomic runs agent loops as workflows you can watch and trust:",
8
+ "implement a ticket, research a codebase, design a UI, or build",
9
+ "your own loop.",
10
+ "",
11
+ "Paste a ticket description, GitHub issue, path to a spec, or task prompt to start.",
12
+ "/chat to chat normally · /atomic for guides",
13
+ "If you have not logged in yet, first run /login.",
14
+ ].join("\n");
15
+ export const NORMAL_CHAT_TRANSITION_COPY = [
16
+ "You're in a normal coding-agent session now. Atomic can chat and edit like other",
17
+ "coding agents, but it also runs loops and workflows. Ask Atomic to build any loop,",
18
+ "or run a built-in workflow like `goal` for small focused changes or `ralph` for",
19
+ "larger, cross-cutting work. Run `/workflow list` to see built-ins, and use `/atomic`",
20
+ "for help running or building your own loops and workflows.",
21
+ ].join("\n");
22
+ export const ONBOARDING_SEED_STASHED_COPY = [
23
+ "Task saved for after login. Run /login to connect a provider; once login finishes,",
24
+ "Atomic will continue with your saved task.",
25
+ ].join("\n");
26
+ export const ONBOARDING_SEED_REPLACED_COPY = [
27
+ "Latest task saved for after login, replacing the previous saved task. Run /login to",
28
+ "connect a provider; once login finishes, Atomic will continue with the latest task.",
29
+ ].join("\n");
30
+ export const ONBOARDING_HANDOFF_NOTICE = "Handing your task to the normal coding-agent session.";
31
+ export const ONBOARDING_ROUTING_THINKING_LEVEL = "high";
32
+ function isInside(baseDir, candidate) {
33
+ const rel = relative(baseDir, candidate);
34
+ return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel));
35
+ }
36
+ function pathCandidatesWithOptionalLocationSuffix(pathText) {
37
+ const candidates = [pathText, pathText.replace(/:\d+:\d+$/, ""), pathText.replace(/:\d+$/, "")];
38
+ return candidates.filter((candidate, index) => candidate && candidates.indexOf(candidate) === index);
39
+ }
40
+ function firstSeedLine(seed) { return seed.trim().split(/\r?\n/, 1)[0]?.trim() ?? ""; }
41
+ function getContainedExistingPath(pathText, cwd) {
42
+ if (!pathText || /\r|\n/.test(pathText) || /^[a-z]+:\/\//i.test(pathText))
43
+ return undefined;
44
+ const root = resolve(cwd);
45
+ let rootReal;
46
+ try {
47
+ rootReal = realpathSync(root);
48
+ }
49
+ catch {
50
+ return undefined;
51
+ }
52
+ for (const candidate of pathCandidatesWithOptionalLocationSuffix(pathText)) {
53
+ const absolute = isAbsolute(candidate) ? resolve(candidate) : resolve(cwd, candidate);
54
+ if (!isInside(root, absolute))
55
+ continue;
56
+ try {
57
+ lstatSync(absolute);
58
+ const real = realpathSync(absolute);
59
+ if (isInside(rootReal, real))
60
+ return real;
61
+ }
62
+ catch { }
63
+ }
64
+ return undefined;
65
+ }
66
+ export function isCwdLocalExistingPathSeed(seed, cwd) {
67
+ const trimmed = firstSeedLine(seed);
68
+ if (!trimmed || !isAbsolute(trimmed))
69
+ return false;
70
+ const real = getContainedExistingPath(trimmed, cwd);
71
+ if (!real)
72
+ return false;
73
+ try {
74
+ const stat = statSync(real);
75
+ return stat.isFile() || stat.isDirectory();
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ }
81
+ export function isExistingAbsolutePathSeed(seed) {
82
+ const trimmed = firstSeedLine(seed);
83
+ if (!trimmed || /\r|\n/.test(trimmed) || /^[a-z]+:\/\//i.test(trimmed) || !isAbsolute(trimmed))
84
+ return false;
85
+ for (const candidate of pathCandidatesWithOptionalLocationSuffix(trimmed)) {
86
+ if (!isAbsolute(candidate))
87
+ continue;
88
+ try {
89
+ const stat = statSync(candidate);
90
+ if (stat.isFile() || stat.isDirectory())
91
+ return true;
92
+ }
93
+ catch { }
94
+ }
95
+ return false;
96
+ }
97
+ function sameModel(a, b) {
98
+ return a.provider === b.provider && a.id === b.id;
99
+ }
100
+ function backtickFenceFor(seed) {
101
+ let longest = 0;
102
+ for (const match of seed.matchAll(/`+/g))
103
+ longest = Math.max(longest, match[0].length);
104
+ return "`".repeat(Math.max(3, longest + 1));
105
+ }
106
+ export function buildOnboardingHandoffPrompt(seed) {
107
+ const fence = backtickFenceFor(seed);
108
+ return [
109
+ "First-run onboarding handoff: continue as a normal Atomic coding-agent session.",
110
+ "",
111
+ "Original task seed:",
112
+ `${fence}text`,
113
+ seed,
114
+ fence,
115
+ "",
116
+ "Perform a quick scope-routing pass before acting. Atomic has switched the selected model",
117
+ "to high reasoning for this routing decision when the model supports it. First estimate the",
118
+ "likely scope from the seed text alone: tickets, GitHub issues, and especially specs often",
119
+ "name enough work items, files, systems, tests, docs, migrations, or acceptance criteria to",
120
+ "classify the task without immediately inspecting the repo. Treat that text-only estimate as",
121
+ "an initial confidence signal for routing, not as final implementation planning.",
122
+ "",
123
+ "If the seed makes the task clearly tiny or small and the routing choice is high-confidence,",
124
+ "you may route directly without codebase probing. If the seed references a local path, issue,",
125
+ "spec, or repo area that must be read to understand the task, inspect only that targeted",
126
+ "context. When the scope is medium, large, unclear, risky, or otherwise not obviously tiny,",
127
+ "gather quick read-only codebase context with targeted subagents such as `codebase-locator`,",
128
+ "`codebase-analyzer`, and `codebase-pattern-finder`. Use those subagents with their normal",
129
+ "default model/thinking settings; do not override their models just for routing. Do only the",
130
+ "probing needed to route scope; do not turn this into an open-ended research project.",
131
+ "",
132
+ "Then make the final choice in this high-reasoning parent session using the existing Atomic",
133
+ "workflow guidance: choose `goal` for clearly small, focused fixes or quick fixes; choose `ralph`",
134
+ "for non-trivial, broad, cross-cutting, risky, unclear, or around-2K+-changed-line work.",
135
+ "Start the selected workflow with the original seed. After the `goal` or `ralph` run is",
136
+ "dispatched, show the new developer the workflow id and succinct next steps:",
137
+ "- `/workflow status <workflow-id>` checks progress.",
138
+ "- `/workflow connect <workflow-id>` opens the graph viewer to watch, attach, and steer.",
139
+ "- They can ask in this chat for status or to steer the run at any point.",
140
+ "Then continue normally in this session. Slash commands should behave like normal",
141
+ "coding-agent slash commands from here on.",
142
+ ].join("\n");
143
+ }
144
+ InteractiveModeBase.prototype.isFirstRunOnboardingEligible = function () {
145
+ const hasInitialInput = Boolean(this.options.initialMessage) || Boolean(this.options.initialMessages?.length);
146
+ return this.session.state.messages.length === 0
147
+ && !hasInitialInput
148
+ && !this.settingsManager.getOnboardedVersion()
149
+ && Boolean(this.settingsManager.getFirstRunOnboardingStartedVersion());
150
+ };
151
+ InteractiveModeBase.prototype.isFirstRunOnboardingReadyForHandoff = function () {
152
+ const registry = this.session.modelRegistry;
153
+ if (!registry)
154
+ return true;
155
+ const model = this.session.model;
156
+ if (!model || isUnknownModel(model))
157
+ return false;
158
+ if (typeof registry.hasConfiguredAuth === "function") {
159
+ return registry.hasConfiguredAuth(model);
160
+ }
161
+ if (typeof registry.getAvailable === "function") {
162
+ return registry.getAvailable().some((availableModel) => sameModel(availableModel, model));
163
+ }
164
+ return true;
165
+ };
166
+ InteractiveModeBase.prototype.stashFirstRunOnboardingSeed = function (seed) {
167
+ const replaced = Boolean(this.pendingFirstRunOnboardingSeed);
168
+ this.pendingFirstRunOnboardingSeed = seed;
169
+ this.showStatus(replaced ? ONBOARDING_SEED_REPLACED_COPY : ONBOARDING_SEED_STASHED_COPY);
170
+ };
171
+ InteractiveModeBase.prototype.resumePendingFirstRunOnboardingSeed = async function () {
172
+ if (!this.firstRunOnboardingActive || !this.pendingFirstRunOnboardingSeed)
173
+ return;
174
+ if (!this.isFirstRunOnboardingReadyForHandoff())
175
+ return;
176
+ const seed = this.pendingFirstRunOnboardingSeed;
177
+ this.pendingFirstRunOnboardingSeed = undefined;
178
+ try {
179
+ await this.handleOnboardingWorkflowSeed(seed);
180
+ }
181
+ catch (error) {
182
+ this.pendingFirstRunOnboardingSeed = seed;
183
+ const errorMessage = error instanceof Error ? error.message : String(error);
184
+ this.showError(errorMessage);
185
+ }
186
+ };
187
+ InteractiveModeBase.prototype.clearPendingFirstRunOnboardingSeed = function () {
188
+ this.firstRunOnboardingSeedInFlight = false;
189
+ this.pendingFirstRunOnboardingSeed = undefined;
190
+ };
191
+ InteractiveModeBase.prototype.clearFirstRunOnboardingUi = function () {
192
+ this.firstRunOnboardingActive = false;
193
+ InteractiveModeBase.prototype.clearPendingFirstRunOnboardingSeed.call(this);
194
+ this.defaultEditor.setPlaceholder(undefined);
195
+ if (this.firstRunOnboardingHeaderComponents.length > 0) {
196
+ this.headerContainer.children = this.headerContainer.children.filter((child) => !this.firstRunOnboardingHeaderComponents.includes(child));
197
+ this.firstRunOnboardingHeaderComponents = [];
198
+ }
199
+ this.ui.requestRender();
200
+ };
201
+ InteractiveModeBase.prototype.completeFirstRunOnboarding = function () {
202
+ this.settingsManager.setOnboardedVersion(this.version);
203
+ InteractiveModeBase.prototype.clearFirstRunOnboardingUi.call(this);
204
+ };
205
+ InteractiveModeBase.prototype.handleOnboardingWorkflowSeed = async function (seed) {
206
+ const handoffPrompt = buildOnboardingHandoffPrompt(seed);
207
+ this.session.setThinkingLevel(ONBOARDING_ROUTING_THINKING_LEVEL);
208
+ this.footer.invalidate();
209
+ this.updateEditorBorderColor();
210
+ this.flushPendingBashComponents();
211
+ if (this.onInputCallback) {
212
+ this.onInputCallback(handoffPrompt);
213
+ }
214
+ else {
215
+ this.pendingUserInputs.push(handoffPrompt);
216
+ }
217
+ this.showStatus(ONBOARDING_HANDOFF_NOTICE);
218
+ this.completeFirstRunOnboarding();
219
+ };
220
+ //# sourceMappingURL=interactive-onboarding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive-onboarding.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-onboarding.ts"],"names":[],"mappings":"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","sourcesContent":["import { lstatSync, realpathSync, statSync } from \"node:fs\";\nimport { isAbsolute, resolve, relative } from \"node:path\";\nimport { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport type { Api, Model } from \"./interactive-mode-deps.ts\";\nimport { isUnknownModel } from \"./interactive-mode-helpers.ts\";\n\nexport const ONBOARDING_PLACEHOLDER = \"Paste a ticket, issue, path to a spec, or task prompt…\";\n\nexport const ONBOARDING_COPY = [\n \"Atomic runs agent loops as workflows you can watch and trust:\",\n \"implement a ticket, research a codebase, design a UI, or build\",\n \"your own loop.\",\n \"\",\n \"Paste a ticket description, GitHub issue, path to a spec, or task prompt to start.\",\n \"/chat to chat normally · /atomic for guides\",\n \"If you have not logged in yet, first run /login.\",\n].join(\"\\n\");\n\nexport const NORMAL_CHAT_TRANSITION_COPY = [\n \"You're in a normal coding-agent session now. Atomic can chat and edit like other\",\n \"coding agents, but it also runs loops and workflows. Ask Atomic to build any loop,\",\n \"or run a built-in workflow like `goal` for small focused changes or `ralph` for\",\n \"larger, cross-cutting work. Run `/workflow list` to see built-ins, and use `/atomic`\",\n \"for help running or building your own loops and workflows.\",\n].join(\"\\n\");\n\nexport const ONBOARDING_SEED_STASHED_COPY = [\n \"Task saved for after login. Run /login to connect a provider; once login finishes,\",\n \"Atomic will continue with your saved task.\",\n].join(\"\\n\");\n\nexport const ONBOARDING_SEED_REPLACED_COPY = [\n \"Latest task saved for after login, replacing the previous saved task. Run /login to\",\n \"connect a provider; once login finishes, Atomic will continue with the latest task.\",\n].join(\"\\n\");\n\nexport const ONBOARDING_HANDOFF_NOTICE = \"Handing your task to the normal coding-agent session.\";\nexport const ONBOARDING_ROUTING_THINKING_LEVEL = \"high\";\n\nfunction isInside(baseDir: string, candidate: string): boolean {\n const rel = relative(baseDir, candidate);\n return rel === \"\" || (!rel.startsWith(\"..\") && !isAbsolute(rel));\n}\n\nfunction pathCandidatesWithOptionalLocationSuffix(pathText: string): string[] {\n const candidates = [pathText, pathText.replace(/:\\d+:\\d+$/, \"\"), pathText.replace(/:\\d+$/, \"\")];\n return candidates.filter((candidate, index) => candidate && candidates.indexOf(candidate) === index);\n}\n\nfunction firstSeedLine(seed: string): string { return seed.trim().split(/\\r?\\n/, 1)[0]?.trim() ?? \"\"; }\n\nfunction getContainedExistingPath(pathText: string, cwd: string): string | undefined {\n if (!pathText || /\\r|\\n/.test(pathText) || /^[a-z]+:\\/\\//i.test(pathText)) return undefined;\n const root = resolve(cwd);\n let rootReal: string;\n try { rootReal = realpathSync(root); } catch { return undefined; }\n for (const candidate of pathCandidatesWithOptionalLocationSuffix(pathText)) {\n const absolute = isAbsolute(candidate) ? resolve(candidate) : resolve(cwd, candidate);\n if (!isInside(root, absolute)) continue;\n try {\n lstatSync(absolute);\n const real = realpathSync(absolute);\n if (isInside(rootReal, real)) return real;\n } catch {}\n }\n return undefined;\n}\n\nexport function isCwdLocalExistingPathSeed(seed: string, cwd: string): boolean {\n const trimmed = firstSeedLine(seed);\n if (!trimmed || !isAbsolute(trimmed)) return false;\n const real = getContainedExistingPath(trimmed, cwd);\n if (!real) return false;\n try {\n const stat = statSync(real);\n return stat.isFile() || stat.isDirectory();\n } catch {\n return false;\n }\n}\n\nexport function isExistingAbsolutePathSeed(seed: string): boolean {\n const trimmed = firstSeedLine(seed);\n if (!trimmed || /\\r|\\n/.test(trimmed) || /^[a-z]+:\\/\\//i.test(trimmed) || !isAbsolute(trimmed)) return false;\n for (const candidate of pathCandidatesWithOptionalLocationSuffix(trimmed)) {\n if (!isAbsolute(candidate)) continue;\n try {\n const stat = statSync(candidate);\n if (stat.isFile() || stat.isDirectory()) return true;\n } catch {}\n }\n return false;\n}\n\nfunction sameModel(a: Model<Api>, b: Model<Api>): boolean {\n return a.provider === b.provider && a.id === b.id;\n}\n\nfunction backtickFenceFor(seed: string): string {\n let longest = 0;\n for (const match of seed.matchAll(/`+/g)) longest = Math.max(longest, match[0].length);\n return \"`\".repeat(Math.max(3, longest + 1));\n}\n\nexport function buildOnboardingHandoffPrompt(seed: string): string {\n const fence = backtickFenceFor(seed);\n return [\n \"First-run onboarding handoff: continue as a normal Atomic coding-agent session.\",\n \"\",\n \"Original task seed:\",\n `${fence}text`,\n seed,\n fence,\n \"\",\n \"Perform a quick scope-routing pass before acting. Atomic has switched the selected model\",\n \"to high reasoning for this routing decision when the model supports it. First estimate the\",\n \"likely scope from the seed text alone: tickets, GitHub issues, and especially specs often\",\n \"name enough work items, files, systems, tests, docs, migrations, or acceptance criteria to\",\n \"classify the task without immediately inspecting the repo. Treat that text-only estimate as\",\n \"an initial confidence signal for routing, not as final implementation planning.\",\n \"\",\n \"If the seed makes the task clearly tiny or small and the routing choice is high-confidence,\",\n \"you may route directly without codebase probing. If the seed references a local path, issue,\",\n \"spec, or repo area that must be read to understand the task, inspect only that targeted\",\n \"context. When the scope is medium, large, unclear, risky, or otherwise not obviously tiny,\",\n \"gather quick read-only codebase context with targeted subagents such as `codebase-locator`,\",\n \"`codebase-analyzer`, and `codebase-pattern-finder`. Use those subagents with their normal\",\n \"default model/thinking settings; do not override their models just for routing. Do only the\",\n \"probing needed to route scope; do not turn this into an open-ended research project.\",\n \"\",\n \"Then make the final choice in this high-reasoning parent session using the existing Atomic\",\n \"workflow guidance: choose `goal` for clearly small, focused fixes or quick fixes; choose `ralph`\",\n \"for non-trivial, broad, cross-cutting, risky, unclear, or around-2K+-changed-line work.\",\n \"Start the selected workflow with the original seed. After the `goal` or `ralph` run is\",\n \"dispatched, show the new developer the workflow id and succinct next steps:\",\n \"- `/workflow status <workflow-id>` checks progress.\",\n \"- `/workflow connect <workflow-id>` opens the graph viewer to watch, attach, and steer.\",\n \"- They can ask in this chat for status or to steer the run at any point.\",\n \"Then continue normally in this session. Slash commands should behave like normal\",\n \"coding-agent slash commands from here on.\",\n ].join(\"\\n\");\n}\n\nInteractiveModeBase.prototype.isFirstRunOnboardingEligible = function(this: InteractiveModeBase): boolean {\n const hasInitialInput = Boolean(this.options.initialMessage) || Boolean(this.options.initialMessages?.length);\n return this.session.state.messages.length === 0\n && !hasInitialInput\n && !this.settingsManager.getOnboardedVersion()\n && Boolean(this.settingsManager.getFirstRunOnboardingStartedVersion());\n};\n\nInteractiveModeBase.prototype.isFirstRunOnboardingReadyForHandoff = function(this: InteractiveModeBase): boolean {\n const registry = this.session.modelRegistry;\n if (!registry) return true;\n const model = this.session.model;\n if (!model || isUnknownModel(model)) return false;\n if (typeof registry.hasConfiguredAuth === \"function\") {\n return registry.hasConfiguredAuth(model);\n }\n if (typeof registry.getAvailable === \"function\") {\n return registry.getAvailable().some((availableModel) => sameModel(availableModel, model));\n }\n return true;\n};\n\nInteractiveModeBase.prototype.stashFirstRunOnboardingSeed = function(this: InteractiveModeBase, seed: string): void {\n const replaced = Boolean(this.pendingFirstRunOnboardingSeed);\n this.pendingFirstRunOnboardingSeed = seed;\n this.showStatus(replaced ? ONBOARDING_SEED_REPLACED_COPY : ONBOARDING_SEED_STASHED_COPY);\n};\n\nInteractiveModeBase.prototype.resumePendingFirstRunOnboardingSeed = async function(this: InteractiveModeBase): Promise<void> {\n if (!this.firstRunOnboardingActive || !this.pendingFirstRunOnboardingSeed) return;\n if (!this.isFirstRunOnboardingReadyForHandoff()) return;\n const seed = this.pendingFirstRunOnboardingSeed;\n this.pendingFirstRunOnboardingSeed = undefined;\n try {\n await this.handleOnboardingWorkflowSeed(seed);\n } catch (error: unknown) {\n this.pendingFirstRunOnboardingSeed = seed;\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.showError(errorMessage);\n }\n};\n\nInteractiveModeBase.prototype.clearPendingFirstRunOnboardingSeed = function(this: InteractiveModeBase): void {\n this.firstRunOnboardingSeedInFlight = false;\n this.pendingFirstRunOnboardingSeed = undefined;\n};\n\nInteractiveModeBase.prototype.clearFirstRunOnboardingUi = function(this: InteractiveModeBase): void {\n this.firstRunOnboardingActive = false;\n InteractiveModeBase.prototype.clearPendingFirstRunOnboardingSeed.call(this);\n this.defaultEditor.setPlaceholder(undefined);\n if (this.firstRunOnboardingHeaderComponents.length > 0) {\n this.headerContainer.children = this.headerContainer.children.filter(\n (child) => !this.firstRunOnboardingHeaderComponents.includes(child),\n );\n this.firstRunOnboardingHeaderComponents = [];\n }\n this.ui.requestRender();\n};\n\nInteractiveModeBase.prototype.completeFirstRunOnboarding = function(this: InteractiveModeBase): void {\n this.settingsManager.setOnboardedVersion(this.version);\n InteractiveModeBase.prototype.clearFirstRunOnboardingUi.call(this);\n};\n\nInteractiveModeBase.prototype.handleOnboardingWorkflowSeed = async function(\n this: InteractiveModeBase,\n seed: string,\n): Promise<void> {\n const handoffPrompt = buildOnboardingHandoffPrompt(seed);\n this.session.setThinkingLevel(ONBOARDING_ROUTING_THINKING_LEVEL);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n this.flushPendingBashComponents();\n if (this.onInputCallback) {\n this.onInputCallback(handoffPrompt);\n } else {\n this.pendingUserInputs.push(handoffPrompt);\n }\n this.showStatus(ONBOARDING_HANDOFF_NOTICE);\n this.completeFirstRunOnboarding();\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-selectors.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-selectors.ts"],"names":[],"mappings":"","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type Component, setCodexFastModeEnvironmentSettings, configureHttpDispatcher, AssistantMessageComponent, FastModeSelectorComponent, SettingsSelectorComponent, ToolExecutionComponent, getAvailableThemes } from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.showSelector = function(this: InteractiveModeBase, create: (done: () => void) => { component: Component; focus: Component }): void {\n const done = () => {\n this.editorContainer.clear();\n this.editorContainer.addChild(this.editor);\n this.ui.setFocus(this.editor);\n };\n const { component, focus } = create(done);\n this.editorContainer.clear();\n this.editorContainer.addChild(component);\n this.ui.setFocus(focus);\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.showFastModeSelector = function(this: InteractiveModeBase): void {\n if (!this.hasCodexFastModeSupportedModels()) {\n this.showWarning(\n \"Codex fast mode requires an available openai/* or openai-codex/* model.\",\n );\n return;\n }\n\n this.showSelector((done) => {\n let pendingStatusMessage: string | undefined;\n const selector = new FastModeSelectorComponent(\n this.settingsManager.getCodexFastModeSettings(),\n {\n onChange: (settings, changedRow) => {\n this.settingsManager.setCodexFastModeSettings({ [changedRow]: settings[changedRow] });\n const effectiveSettings = this.settingsManager.getCodexFastModeSettings();\n setCodexFastModeEnvironmentSettings(effectiveSettings);\n this.footer.invalidate();\n this.refreshBuiltInHeader();\n const changedLabel = changedRow === \"chat\" ? \"Chat\" : \"Workflow\";\n const changedState = effectiveSettings[changedRow] ? \"on\" : \"off\";\n pendingStatusMessage = `${changedLabel} fast mode ${changedState}`;\n },\n onCancel: async () => {\n await this.settingsManager.flush();\n done();\n if (pendingStatusMessage) {\n this.showStatus(pendingStatusMessage);\n }\n this.ui.requestRender();\n },\n },\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showSettingsSelector = function(this: InteractiveModeBase): void {\n this.showSelector((done) => {\n const selector = new SettingsSelectorComponent(\n {\n autoCompact: this.session.autoCompactionEnabled,\n showImages: this.settingsManager.getShowImages(),\n imageWidthCells: this.settingsManager.getImageWidthCells(),\n autoResizeImages: this.settingsManager.getImageAutoResize(),\n blockImages: this.settingsManager.getBlockImages(),\n enableSkillCommands: this.settingsManager.getEnableSkillCommands(),\n steeringMode: this.session.steeringMode,\n followUpMode: this.session.followUpMode,\n transport: this.settingsManager.getTransport(),\n httpIdleTimeoutMs: this.settingsManager.getHttpIdleTimeoutMs(),\n thinkingLevel: this.session.thinkingLevel,\n availableThinkingLevels: this.session.getAvailableThinkingLevels(),\n currentTheme: this.settingsManager.getThemeSetting() || \"dark\",\n terminalTheme: this.themeController.getTerminalTheme(),\n availableThemes: getAvailableThemes(),\n hideThinkingBlock: this.hideThinkingBlock,\n collapseChangelog: this.settingsManager.getCollapseChangelog(),\n enableInstallTelemetry:\n this.settingsManager.getEnableInstallTelemetry(),\n doubleEscapeAction: this.settingsManager.getDoubleEscapeAction(),\n treeFilterMode: this.settingsManager.getTreeFilterMode(),\n showHardwareCursor: this.settingsManager.getShowHardwareCursor(),\n editorPaddingX: this.settingsManager.getEditorPaddingX(),\n autocompleteMaxVisible:\n this.settingsManager.getAutocompleteMaxVisible(),\n quietStartup: this.settingsManager.getQuietStartup(),\n defaultProjectTrust: this.settingsManager.getDefaultProjectTrust(),\n clearOnShrink: this.settingsManager.getClearOnShrink(),\n showTerminalProgress: this.settingsManager.getShowTerminalProgress(),\n warnings: this.settingsManager.getWarnings(),\n },\n {\n onAutoCompactChange: (enabled) => {\n this.session.setAutoCompactionEnabled(enabled);\n this.usageMeter.setAutoCompactEnabled(enabled);\n },\n onShowImagesChange: (enabled) => {\n this.settingsManager.setShowImages(enabled);\n for (const child of this.chatContainer.children) {\n if (child instanceof ToolExecutionComponent) {\n child.setShowImages(enabled);\n }\n }\n },\n onImageWidthCellsChange: (width) => {\n this.settingsManager.setImageWidthCells(width);\n for (const child of this.chatContainer.children) {\n if (child instanceof ToolExecutionComponent) {\n child.setImageWidthCells(width);\n }\n }\n },\n onAutoResizeImagesChange: (enabled) => {\n this.settingsManager.setImageAutoResize(enabled);\n },\n onBlockImagesChange: (blocked) => {\n this.settingsManager.setBlockImages(blocked);\n },\n onEnableSkillCommandsChange: (enabled) => {\n this.settingsManager.setEnableSkillCommands(enabled);\n this.setupAutocompleteProvider();\n },\n onSteeringModeChange: (mode) => {\n this.session.setSteeringMode(mode);\n },\n onFollowUpModeChange: (mode) => {\n this.session.setFollowUpMode(mode);\n },\n onTransportChange: (transport) => {\n this.settingsManager.setTransport(transport);\n this.session.agent.transport = transport;\n },\n onHttpIdleTimeoutChange: (timeoutMs) => {\n this.settingsManager.setHttpIdleTimeoutMs(timeoutMs);\n configureHttpDispatcher(timeoutMs);\n },\n onThinkingLevelChange: (level) => {\n this.session.setThinkingLevel(level);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n },\n onThemeChange: (themeSetting) => {\n this.settingsManager.setTheme(themeSetting);\n void this.themeController.applyFromSettings();\n },\n onThemePreview: (themeName) => this.themeController.preview(themeName),\n onHideThinkingBlockChange: (hidden) => {\n this.hideThinkingBlock = hidden;\n this.settingsManager.setHideThinkingBlock(hidden);\n for (const child of this.chatContainer.children) {\n if (child instanceof AssistantMessageComponent) {\n child.setHideThinkingBlock(hidden);\n }\n }\n this.chatContainer.clear();\n this.rebuildChatFromMessages();\n },\n onCollapseChangelogChange: (collapsed) => {\n this.settingsManager.setCollapseChangelog(collapsed);\n },\n onEnableInstallTelemetryChange: (enabled) => {\n this.settingsManager.setEnableInstallTelemetry(enabled);\n },\n onQuietStartupChange: (enabled) => {\n this.settingsManager.setQuietStartup(enabled);\n },\n onDefaultProjectTrustChange: (defaultProjectTrust) => {\n this.settingsManager.setDefaultProjectTrust(defaultProjectTrust);\n },\n onDoubleEscapeActionChange: (action) => {\n this.settingsManager.setDoubleEscapeAction(action);\n },\n onTreeFilterModeChange: (mode) => {\n this.settingsManager.setTreeFilterMode(mode);\n },\n onShowHardwareCursorChange: (enabled) => {\n this.settingsManager.setShowHardwareCursor(enabled);\n this.ui.setShowHardwareCursor(enabled);\n },\n onEditorPaddingXChange: (padding) => {\n this.settingsManager.setEditorPaddingX(padding);\n this.defaultEditor.setPaddingX(padding);\n if (\n this.editor !== this.defaultEditor &&\n this.editor.setPaddingX !== undefined\n ) {\n this.editor.setPaddingX(padding);\n }\n },\n onAutocompleteMaxVisibleChange: (maxVisible) => {\n this.settingsManager.setAutocompleteMaxVisible(maxVisible);\n this.defaultEditor.setAutocompleteMaxVisible(maxVisible);\n if (\n this.editor !== this.defaultEditor &&\n this.editor.setAutocompleteMaxVisible !== undefined\n ) {\n this.editor.setAutocompleteMaxVisible(maxVisible);\n }\n },\n onClearOnShrinkChange: (enabled) => {\n this.settingsManager.setClearOnShrink(enabled);\n this.ui.setClearOnShrink(enabled);\n },\n onShowTerminalProgressChange: (enabled) => {\n this.settingsManager.setShowTerminalProgress(enabled);\n },\n onWarningsChange: (warnings) => {\n this.settingsManager.setWarnings(warnings);\n },\n onCancel: () => {\n done();\n this.ui.requestRender();\n },\n },\n );\n return { component: selector, focus: selector.getSettingsList() };\n });\n };\n"]}
1
+ {"version":3,"file":"interactive-selectors.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-selectors.ts"],"names":[],"mappings":"","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport { type Component, setCodexFastModeEnvironmentSettings, configureHttpDispatcher, AssistantMessageComponent, FastModeSelectorComponent, SettingsSelectorComponent, ToolExecutionComponent, getAvailableThemes } from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.showSelector = function(this: InteractiveModeBase, create: (done: () => void) => { component: Component; focus: Component }): void {\n const done = () => {\n this.editorContainer.clear();\n this.editorContainer.addChild(this.editor);\n this.ui.setFocus(this.editor);\n };\n const { component, focus } = create(done);\n this.editorContainer.clear();\n this.editorContainer.addChild(component);\n this.ui.setFocus(focus);\n this.ui.requestRender();\n };\n\nInteractiveModeBase.prototype.showFastModeSelector = function(this: InteractiveModeBase): void {\n if (!this.hasCodexFastModeSupportedModels()) {\n this.showWarning(\n \"Codex fast mode requires an available openai/* or openai-codex/* model.\",\n );\n return;\n }\n\n this.showSelector((done) => {\n let pendingStatusMessage: string | undefined;\n const selector = new FastModeSelectorComponent(\n this.settingsManager.getCodexFastModeSettings(),\n {\n onChange: (settings, changedRow) => {\n this.settingsManager.setCodexFastModeSettings({ [changedRow]: settings[changedRow] });\n const effectiveSettings = this.settingsManager.getCodexFastModeSettings();\n setCodexFastModeEnvironmentSettings(effectiveSettings);\n this.footer.invalidate();\n this.refreshBuiltInHeader();\n const changedLabel = changedRow === \"chat\" ? \"Chat\" : \"Workflow\";\n const changedState = effectiveSettings[changedRow] ? \"on\" : \"off\";\n pendingStatusMessage = `${changedLabel} fast mode ${changedState}`;\n },\n onCancel: async () => {\n await this.settingsManager.flush();\n done();\n if (pendingStatusMessage) {\n this.showStatus(pendingStatusMessage);\n }\n this.ui.requestRender();\n },\n },\n );\n return { component: selector, focus: selector };\n });\n };\n\nInteractiveModeBase.prototype.showSettingsSelector = function(this: InteractiveModeBase): void {\n this.showSelector((done) => {\n const selector = new SettingsSelectorComponent(\n {\n autoCompact: this.session.autoCompactionEnabled,\n showImages: this.settingsManager.getShowImages(),\n imageWidthCells: this.settingsManager.getImageWidthCells(),\n autoResizeImages: this.settingsManager.getImageAutoResize(),\n blockImages: this.settingsManager.getBlockImages(),\n enableSkillCommands: this.settingsManager.getEnableSkillCommands(),\n steeringMode: this.session.steeringMode,\n followUpMode: this.session.followUpMode,\n transport: this.settingsManager.getTransport(),\n httpIdleTimeoutMs: this.settingsManager.getHttpIdleTimeoutMs(),\n bashInterceptorEnabled: this.settingsManager.getBashInterceptorEnabled(),\n thinkingLevel: this.session.thinkingLevel,\n availableThinkingLevels: this.session.getAvailableThinkingLevels(),\n currentTheme: this.settingsManager.getThemeSetting() || \"dark\",\n terminalTheme: this.themeController.getTerminalTheme(),\n availableThemes: getAvailableThemes(),\n hideThinkingBlock: this.hideThinkingBlock,\n collapseChangelog: this.settingsManager.getCollapseChangelog(),\n enableInstallTelemetry:\n this.settingsManager.getEnableInstallTelemetry(),\n doubleEscapeAction: this.settingsManager.getDoubleEscapeAction(),\n treeFilterMode: this.settingsManager.getTreeFilterMode(),\n showHardwareCursor: this.settingsManager.getShowHardwareCursor(),\n editorPaddingX: this.settingsManager.getEditorPaddingX(),\n autocompleteMaxVisible:\n this.settingsManager.getAutocompleteMaxVisible(),\n quietStartup: this.settingsManager.getQuietStartup(),\n defaultProjectTrust: this.settingsManager.getDefaultProjectTrust(),\n clearOnShrink: this.settingsManager.getClearOnShrink(),\n showTerminalProgress: this.settingsManager.getShowTerminalProgress(),\n warnings: this.settingsManager.getWarnings(),\n },\n {\n onAutoCompactChange: (enabled) => {\n this.session.setAutoCompactionEnabled(enabled);\n this.usageMeter.setAutoCompactEnabled(enabled);\n },\n onShowImagesChange: (enabled) => {\n this.settingsManager.setShowImages(enabled);\n for (const child of this.chatContainer.children) {\n if (child instanceof ToolExecutionComponent) {\n child.setShowImages(enabled);\n }\n }\n },\n onImageWidthCellsChange: (width) => {\n this.settingsManager.setImageWidthCells(width);\n for (const child of this.chatContainer.children) {\n if (child instanceof ToolExecutionComponent) {\n child.setImageWidthCells(width);\n }\n }\n },\n onAutoResizeImagesChange: (enabled) => {\n this.settingsManager.setImageAutoResize(enabled);\n },\n onBlockImagesChange: (blocked) => {\n this.settingsManager.setBlockImages(blocked);\n },\n onEnableSkillCommandsChange: (enabled) => {\n this.settingsManager.setEnableSkillCommands(enabled);\n this.setupAutocompleteProvider();\n },\n onSteeringModeChange: (mode) => {\n this.session.setSteeringMode(mode);\n },\n onFollowUpModeChange: (mode) => {\n this.session.setFollowUpMode(mode);\n },\n onTransportChange: (transport) => {\n this.settingsManager.setTransport(transport);\n this.session.agent.transport = transport;\n },\n onHttpIdleTimeoutChange: (timeoutMs) => {\n this.settingsManager.setHttpIdleTimeoutMs(timeoutMs);\n configureHttpDispatcher(timeoutMs);\n },\n onBashInterceptorEnabledChange: (enabled) => {\n this.settingsManager.setBashInterceptorEnabled(enabled);\n },\n onThinkingLevelChange: (level) => {\n this.session.setThinkingLevel(level);\n this.footer.invalidate();\n this.updateEditorBorderColor();\n },\n onThemeChange: (themeSetting) => {\n this.settingsManager.setTheme(themeSetting);\n void this.themeController.applyFromSettings();\n },\n onThemePreview: (themeName) => this.themeController.preview(themeName),\n onHideThinkingBlockChange: (hidden) => {\n this.hideThinkingBlock = hidden;\n this.settingsManager.setHideThinkingBlock(hidden);\n for (const child of this.chatContainer.children) {\n if (child instanceof AssistantMessageComponent) {\n child.setHideThinkingBlock(hidden);\n }\n }\n this.chatContainer.clear();\n this.rebuildChatFromMessages();\n },\n onCollapseChangelogChange: (collapsed) => {\n this.settingsManager.setCollapseChangelog(collapsed);\n },\n onEnableInstallTelemetryChange: (enabled) => {\n this.settingsManager.setEnableInstallTelemetry(enabled);\n },\n onQuietStartupChange: (enabled) => {\n this.settingsManager.setQuietStartup(enabled);\n },\n onDefaultProjectTrustChange: (defaultProjectTrust) => {\n this.settingsManager.setDefaultProjectTrust(defaultProjectTrust);\n },\n onDoubleEscapeActionChange: (action) => {\n this.settingsManager.setDoubleEscapeAction(action);\n },\n onTreeFilterModeChange: (mode) => {\n this.settingsManager.setTreeFilterMode(mode);\n },\n onShowHardwareCursorChange: (enabled) => {\n this.settingsManager.setShowHardwareCursor(enabled);\n this.ui.setShowHardwareCursor(enabled);\n },\n onEditorPaddingXChange: (padding) => {\n this.settingsManager.setEditorPaddingX(padding);\n this.defaultEditor.setPaddingX(padding);\n if (\n this.editor !== this.defaultEditor &&\n this.editor.setPaddingX !== undefined\n ) {\n this.editor.setPaddingX(padding);\n }\n },\n onAutocompleteMaxVisibleChange: (maxVisible) => {\n this.settingsManager.setAutocompleteMaxVisible(maxVisible);\n this.defaultEditor.setAutocompleteMaxVisible(maxVisible);\n if (\n this.editor !== this.defaultEditor &&\n this.editor.setAutocompleteMaxVisible !== undefined\n ) {\n this.editor.setAutocompleteMaxVisible(maxVisible);\n }\n },\n onClearOnShrinkChange: (enabled) => {\n this.settingsManager.setClearOnShrink(enabled);\n this.ui.setClearOnShrink(enabled);\n },\n onShowTerminalProgressChange: (enabled) => {\n this.settingsManager.setShowTerminalProgress(enabled);\n },\n onWarningsChange: (warnings) => {\n this.settingsManager.setWarnings(warnings);\n },\n onCancel: () => {\n done();\n this.ui.requestRender();\n },\n },\n );\n return { component: selector, focus: selector.getSettingsList() };\n });\n };\n"]}
@@ -55,6 +55,7 @@ InteractiveModeBase.prototype.showSettingsSelector = function () {
55
55
  followUpMode: this.session.followUpMode,
56
56
  transport: this.settingsManager.getTransport(),
57
57
  httpIdleTimeoutMs: this.settingsManager.getHttpIdleTimeoutMs(),
58
+ bashInterceptorEnabled: this.settingsManager.getBashInterceptorEnabled(),
58
59
  thinkingLevel: this.session.thinkingLevel,
59
60
  availableThinkingLevels: this.session.getAvailableThinkingLevels(),
60
61
  currentTheme: this.settingsManager.getThemeSetting() || "dark",
@@ -118,6 +119,9 @@ InteractiveModeBase.prototype.showSettingsSelector = function () {
118
119
  this.settingsManager.setHttpIdleTimeoutMs(timeoutMs);
119
120
  configureHttpDispatcher(timeoutMs);
120
121
  },
122
+ onBashInterceptorEnabledChange: (enabled) => {
123
+ this.settingsManager.setBashInterceptorEnabled(enabled);
124
+ },
121
125
  onThinkingLevelChange: (level) => {
122
126
  this.session.setThinkingLevel(level);
123
127
  this.footer.invalidate();