@bastani/atomic 0.9.5-alpha.7 → 0.9.5-alpha.9

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 (317) hide show
  1. package/CHANGELOG.md +33 -2
  2. package/dist/builtin/cursor/package.json +2 -2
  3. package/dist/builtin/intercom/CHANGELOG.md +17 -0
  4. package/dist/builtin/intercom/README.md +27 -21
  5. package/dist/builtin/intercom/broker/broker.ts +3 -6
  6. package/dist/builtin/intercom/broker/paths.ts +42 -5
  7. package/dist/builtin/intercom/broker/spawn.ts +78 -10
  8. package/dist/builtin/intercom/config.ts +6 -3
  9. package/dist/builtin/intercom/contact-supervisor-tool.ts +6 -4
  10. package/dist/builtin/intercom/index-heavy.ts +1 -1
  11. package/dist/builtin/intercom/index.ts +162 -130
  12. package/dist/builtin/intercom/intercom-tool.ts +9 -3
  13. package/dist/builtin/intercom/package.json +10 -1
  14. package/dist/builtin/intercom/result-renderers.ts +1 -1
  15. package/dist/builtin/intercom/ui/compose.ts +2 -2
  16. package/dist/builtin/intercom/ui/inline-message.ts +2 -2
  17. package/dist/builtin/intercom/ui/session-list.ts +2 -2
  18. package/dist/builtin/mcp/CHANGELOG.md +11 -0
  19. package/dist/builtin/mcp/README.md +6 -6
  20. package/dist/builtin/mcp/direct-tools.ts +41 -23
  21. package/dist/builtin/mcp/index.ts +31 -4
  22. package/dist/builtin/mcp/init.ts +4 -43
  23. package/dist/builtin/mcp/metadata-hydration.ts +37 -0
  24. package/dist/builtin/mcp/package.json +1 -1
  25. package/dist/builtin/mcp/proxy-info-modes.ts +67 -14
  26. package/dist/builtin/mcp/startup-warmup.ts +98 -0
  27. package/dist/builtin/mcp/tool-result-renderer.ts +3 -3
  28. package/dist/builtin/subagents/CHANGELOG.md +18 -0
  29. package/dist/builtin/subagents/package.json +1 -1
  30. package/dist/builtin/subagents/src/extension/index.ts +14 -25
  31. package/dist/builtin/subagents/src/extension/startup-maintenance.ts +89 -0
  32. package/dist/builtin/subagents/src/runs/background/async-execution-common.ts +23 -18
  33. package/dist/builtin/subagents/src/runs/background/result-watcher.ts +20 -10
  34. package/dist/builtin/subagents/src/runs/background/subagent-runner-streaming.ts +13 -3
  35. package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +10 -2
  36. package/dist/builtin/subagents/src/runs/shared/pi-spawn.ts +28 -1
  37. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +15 -48
  38. package/dist/builtin/subagents/src/tui/render-layout.ts +9 -0
  39. package/dist/builtin/subagents/src/tui/render-widget-graph.ts +27 -25
  40. package/dist/builtin/subagents/src/tui/render-widget.ts +72 -66
  41. package/dist/builtin/subagents/src/tui/render.ts +1 -1
  42. package/dist/builtin/web-access/package.json +1 -1
  43. package/dist/builtin/workflows/CHANGELOG.md +29 -0
  44. package/dist/builtin/workflows/README.md +4 -2
  45. package/dist/builtin/workflows/builtin/goal-artifacts.ts +3 -1
  46. package/dist/builtin/workflows/builtin/goal-prompts.ts +23 -2
  47. package/dist/builtin/workflows/builtin/goal-reducer.ts +21 -0
  48. package/dist/builtin/workflows/builtin/goal-review.ts +60 -6
  49. package/dist/builtin/workflows/builtin/goal-runner.ts +71 -22
  50. package/dist/builtin/workflows/builtin/goal-types.ts +7 -1
  51. package/dist/builtin/workflows/builtin/ralph-core.ts +52 -4
  52. package/dist/builtin/workflows/builtin/ralph-review-gate.ts +10 -3
  53. package/dist/builtin/workflows/builtin/ralph-reviewer-prompt.ts +23 -2
  54. package/dist/builtin/workflows/builtin/ralph-runner.ts +38 -16
  55. package/dist/builtin/workflows/builtin/review-convergence.ts +111 -0
  56. package/dist/builtin/workflows/package.json +1 -1
  57. package/dist/builtin/workflows/skills/create-spec/SKILL.md +2 -0
  58. package/dist/builtin/workflows/skills/impeccable/SKILL.md +16 -13
  59. package/dist/builtin/workflows/skills/impeccable/reference/adapt.md +1 -0
  60. package/dist/builtin/workflows/skills/impeccable/reference/adapt.native.md +58 -0
  61. package/dist/builtin/workflows/skills/impeccable/reference/android.md +40 -0
  62. package/dist/builtin/workflows/skills/impeccable/reference/animate.md +2 -0
  63. package/dist/builtin/workflows/skills/impeccable/reference/audit.md +2 -0
  64. package/dist/builtin/workflows/skills/impeccable/reference/audit.native.md +139 -0
  65. package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +69 -62
  66. package/dist/builtin/workflows/skills/impeccable/reference/critique.md +21 -7
  67. package/dist/builtin/workflows/skills/impeccable/reference/document.md +1 -1
  68. package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +92 -0
  69. package/dist/builtin/workflows/skills/impeccable/reference/init.md +29 -7
  70. package/dist/builtin/workflows/skills/impeccable/reference/ios.md +45 -0
  71. package/dist/builtin/workflows/skills/impeccable/reference/layout.md +25 -1
  72. package/dist/builtin/workflows/skills/impeccable/reference/typeset.md +23 -1
  73. package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +2 -1
  74. package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +75 -14
  75. package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +1 -1
  76. package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +31 -0
  77. package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +64 -0
  78. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +118 -11
  79. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +16 -11
  80. package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +66 -0
  81. package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +42 -10
  82. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/fonts.mjs +30 -0
  83. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/page.mjs +4 -6
  84. package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +660 -0
  85. package/dist/builtin/workflows/skills/impeccable/scripts/hook-before-edit.mjs +516 -0
  86. package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +1764 -0
  87. package/dist/builtin/workflows/skills/impeccable/scripts/hook.mjs +61 -0
  88. package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +4 -2
  89. package/dist/builtin/workflows/skills/impeccable/scripts/lib/is-generated.mjs +2 -2
  90. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-component.mjs +13 -16
  91. package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +17 -11
  92. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +104 -37
  93. package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +9 -0
  94. package/dist/builtin/workflows/src/durable/backend.ts +12 -0
  95. package/dist/builtin/workflows/src/durable/child-primitive.ts +12 -8
  96. package/dist/builtin/workflows/src/durable/dbos-backend.ts +63 -2
  97. package/dist/builtin/workflows/src/durable/dbos-envelope.ts +28 -0
  98. package/dist/builtin/workflows/src/durable/resume-catalog.ts +12 -0
  99. package/dist/builtin/workflows/src/durable/resume-runtime.ts +5 -2
  100. package/dist/builtin/workflows/src/durable/stage-primitive.ts +165 -27
  101. package/dist/builtin/workflows/src/durable/types.ts +30 -1
  102. package/dist/builtin/workflows/src/engine/primitives/task.ts +1 -0
  103. package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +1 -2
  104. package/dist/builtin/workflows/src/engine/run-returned-status.ts +50 -16
  105. package/dist/builtin/workflows/src/engine/run.ts +32 -32
  106. package/dist/builtin/workflows/src/engine/runtime.ts +5 -0
  107. package/dist/builtin/workflows/src/extension/extension-factory.ts +3 -0
  108. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +9 -2
  109. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +137 -27
  110. package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +22 -6
  111. package/dist/builtin/workflows/src/extension/public-types.ts +1 -1
  112. package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +13 -1
  113. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +19 -4
  114. package/dist/builtin/workflows/src/extension/workflow-command-surfaces.ts +9 -0
  115. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +2 -0
  116. package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +48 -23
  117. package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +20 -8
  118. package/dist/builtin/workflows/src/extension/workflow-tool.ts +24 -8
  119. package/dist/builtin/workflows/src/runs/background/status.ts +4 -3
  120. package/dist/builtin/workflows/src/runs/foreground/executor-continuation.ts +13 -3
  121. package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +29 -8
  122. package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +2 -1
  123. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +4 -3
  124. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +18 -19
  125. package/dist/builtin/workflows/src/runs/foreground/stage-runner-unresolved-overflow.ts +38 -0
  126. package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +155 -20
  127. package/dist/builtin/workflows/src/runs/shared/worktree-types.ts +6 -0
  128. package/dist/builtin/workflows/src/runs/shared/worktree.ts +2 -1
  129. package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +18 -1
  130. package/dist/builtin/workflows/src/shared/persistence-restore.ts +23 -5
  131. package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +4 -0
  132. package/dist/builtin/workflows/src/shared/returned-run-status.ts +116 -0
  133. package/dist/builtin/workflows/src/shared/workflow-failures-decisions.ts +2 -0
  134. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +21 -3
  135. package/dist/builtin/workflows/src/tui/graph-view-state.ts +3 -0
  136. package/dist/builtin/workflows/src/tui/graph-view-types.ts +3 -0
  137. package/dist/builtin/workflows/src/tui/status-list.ts +22 -15
  138. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +4 -4
  139. package/dist/bun/internal-intercom-broker.d.ts +6 -0
  140. package/dist/bun/internal-intercom-broker.d.ts.map +1 -0
  141. package/dist/bun/internal-intercom-broker.js +39 -0
  142. package/dist/bun/internal-intercom-broker.js.map +1 -0
  143. package/dist/bun/split-loader.d.ts.map +1 -1
  144. package/dist/bun/split-loader.js +21 -8
  145. package/dist/bun/split-loader.js.map +1 -1
  146. package/dist/core/agent-session-auto-compaction.d.ts +21 -2
  147. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  148. package/dist/core/agent-session-auto-compaction.js +163 -11
  149. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  150. package/dist/core/agent-session-events.d.ts.map +1 -1
  151. package/dist/core/agent-session-events.js +10 -1
  152. package/dist/core/agent-session-events.js.map +1 -1
  153. package/dist/core/agent-session-methods.d.ts +12 -3
  154. package/dist/core/agent-session-methods.d.ts.map +1 -1
  155. package/dist/core/agent-session-methods.js.map +1 -1
  156. package/dist/core/agent-session-models.d.ts +2 -2
  157. package/dist/core/agent-session-models.d.ts.map +1 -1
  158. package/dist/core/agent-session-models.js.map +1 -1
  159. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  160. package/dist/core/agent-session-prompt.js +1 -0
  161. package/dist/core/agent-session-prompt.js.map +1 -1
  162. package/dist/core/agent-session-retry.d.ts +2 -0
  163. package/dist/core/agent-session-retry.d.ts.map +1 -1
  164. package/dist/core/agent-session-retry.js +152 -4
  165. package/dist/core/agent-session-retry.js.map +1 -1
  166. package/dist/core/agent-session-services.d.ts +1 -0
  167. package/dist/core/agent-session-services.d.ts.map +1 -1
  168. package/dist/core/agent-session-services.js +1 -0
  169. package/dist/core/agent-session-services.js.map +1 -1
  170. package/dist/core/agent-session-types.d.ts +15 -1
  171. package/dist/core/agent-session-types.d.ts.map +1 -1
  172. package/dist/core/agent-session-types.js.map +1 -1
  173. package/dist/core/agent-session.d.ts +6 -0
  174. package/dist/core/agent-session.d.ts.map +1 -1
  175. package/dist/core/agent-session.js +6 -0
  176. package/dist/core/agent-session.js.map +1 -1
  177. package/dist/core/compaction/context-compaction-runner.d.ts.map +1 -1
  178. package/dist/core/compaction/context-compaction-runner.js +36 -20
  179. package/dist/core/compaction/context-compaction-runner.js.map +1 -1
  180. package/dist/core/copilot-anthropic-sse-repair.d.ts +23 -0
  181. package/dist/core/copilot-anthropic-sse-repair.d.ts.map +1 -0
  182. package/dist/core/copilot-anthropic-sse-repair.js +340 -0
  183. package/dist/core/copilot-anthropic-sse-repair.js.map +1 -0
  184. package/dist/core/copilot-gemini-reasoning.d.ts +16 -8
  185. package/dist/core/copilot-gemini-reasoning.d.ts.map +1 -1
  186. package/dist/core/copilot-gemini-reasoning.js +27 -22
  187. package/dist/core/copilot-gemini-reasoning.js.map +1 -1
  188. package/dist/core/copilot-hosts.d.ts +12 -0
  189. package/dist/core/copilot-hosts.d.ts.map +1 -0
  190. package/dist/core/copilot-hosts.js +33 -0
  191. package/dist/core/copilot-hosts.js.map +1 -0
  192. package/dist/core/extensions/agent-events.d.ts +1 -1
  193. package/dist/core/extensions/agent-events.d.ts.map +1 -1
  194. package/dist/core/extensions/agent-events.js.map +1 -1
  195. package/dist/core/extensions/loader-virtual-modules.d.ts +8 -1
  196. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  197. package/dist/core/extensions/loader-virtual-modules.js +2 -1
  198. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  199. package/dist/core/footer-data-provider.d.ts +6 -0
  200. package/dist/core/footer-data-provider.d.ts.map +1 -1
  201. package/dist/core/footer-data-provider.js +72 -29
  202. package/dist/core/footer-data-provider.js.map +1 -1
  203. package/dist/core/http-dispatcher.d.ts.map +1 -1
  204. package/dist/core/http-dispatcher.js +5 -5
  205. package/dist/core/http-dispatcher.js.map +1 -1
  206. package/dist/core/openai-responses-payload-sanitizer.d.ts +1 -0
  207. package/dist/core/openai-responses-payload-sanitizer.d.ts.map +1 -1
  208. package/dist/core/openai-responses-payload-sanitizer.js +24 -9
  209. package/dist/core/openai-responses-payload-sanitizer.js.map +1 -1
  210. package/dist/core/sdk-types.d.ts +2 -0
  211. package/dist/core/sdk-types.d.ts.map +1 -1
  212. package/dist/core/sdk-types.js.map +1 -1
  213. package/dist/core/sdk.d.ts.map +1 -1
  214. package/dist/core/sdk.js +1 -0
  215. package/dist/core/sdk.js.map +1 -1
  216. package/dist/core/settings-manager-basic-accessors.d.ts +1 -0
  217. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  218. package/dist/core/settings-manager-basic-accessors.js +6 -0
  219. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  220. package/dist/core/settings-types.d.ts +1 -0
  221. package/dist/core/settings-types.d.ts.map +1 -1
  222. package/dist/core/settings-types.js.map +1 -1
  223. package/dist/core/slash-commands.d.ts +2 -0
  224. package/dist/core/slash-commands.d.ts.map +1 -1
  225. package/dist/core/slash-commands.js +141 -0
  226. package/dist/core/slash-commands.js.map +1 -1
  227. package/dist/index-extensions.d.ts +1 -1
  228. package/dist/index-extensions.d.ts.map +1 -1
  229. package/dist/index-extensions.js.map +1 -1
  230. package/dist/index.d.ts +1 -0
  231. package/dist/index.d.ts.map +1 -1
  232. package/dist/index.js +1 -0
  233. package/dist/index.js.map +1 -1
  234. package/dist/main-deferred-startup.d.ts +12 -0
  235. package/dist/main-deferred-startup.d.ts.map +1 -1
  236. package/dist/main-deferred-startup.js +23 -2
  237. package/dist/main-deferred-startup.js.map +1 -1
  238. package/dist/main-early-input.d.ts +41 -0
  239. package/dist/main-early-input.d.ts.map +1 -0
  240. package/dist/main-early-input.js +154 -0
  241. package/dist/main-early-input.js.map +1 -0
  242. package/dist/main.d.ts +0 -6
  243. package/dist/main.d.ts.map +1 -1
  244. package/dist/main.js +20 -14
  245. package/dist/main.js.map +1 -1
  246. package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -1
  247. package/dist/modes/interactive/components/chat-session-host-actions.js +0 -1
  248. package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -1
  249. package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
  250. package/dist/modes/interactive/components/chat-session-host-events.js +15 -0
  251. package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
  252. package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -1
  253. package/dist/modes/interactive/interactive-agent-events.js +25 -0
  254. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  255. package/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  256. package/dist/modes/interactive/interactive-autocomplete.js +21 -9
  257. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  258. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
  259. package/dist/modes/interactive/interactive-deferred-startup.js +41 -28
  260. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  261. package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -1
  262. package/dist/modes/interactive/interactive-hotkeys-debug.js +1 -0
  263. package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -1
  264. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  265. package/dist/modes/interactive/interactive-input-handling.js +318 -185
  266. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  267. package/dist/modes/interactive/interactive-mode-base.d.ts +12 -0
  268. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  269. package/dist/modes/interactive/interactive-mode-base.js +39 -0
  270. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  271. package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -1
  272. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  273. package/dist/modes/interactive/interactive-mode-deps.js +1 -1
  274. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  275. package/dist/modes/interactive/interactive-mode-surface.d.ts +6 -2
  276. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  277. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  278. package/dist/modes/interactive/interactive-mode-types.d.ts +3 -0
  279. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  280. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  281. package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
  282. package/dist/modes/interactive/interactive-model-routing.js +3 -1
  283. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  284. package/dist/modes/interactive/interactive-process-lifecycle.d.ts.map +1 -1
  285. package/dist/modes/interactive/interactive-process-lifecycle.js +0 -3
  286. package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
  287. package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -1
  288. package/dist/modes/interactive/interactive-render-chat.js +36 -10
  289. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  290. package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -1
  291. package/dist/modes/interactive/interactive-session-routing.js +5 -1
  292. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  293. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  294. package/dist/modes/interactive/interactive-startup.js +26 -22
  295. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  296. package/dist/modes/interactive/theme/global-theme.d.ts.map +1 -1
  297. package/dist/modes/interactive/theme/global-theme.js +26 -2
  298. package/dist/modes/interactive/theme/global-theme.js.map +1 -1
  299. package/dist/utils/fs-watch.d.ts +24 -1
  300. package/dist/utils/fs-watch.d.ts.map +1 -1
  301. package/dist/utils/fs-watch.js +60 -5
  302. package/dist/utils/fs-watch.js.map +1 -1
  303. package/docs/compaction.md +8 -0
  304. package/docs/development.md +4 -0
  305. package/docs/extensions.md +5 -0
  306. package/docs/json.md +3 -1
  307. package/docs/providers.md +1 -0
  308. package/docs/quickstart.md +1 -1
  309. package/docs/rpc.md +3 -1
  310. package/docs/settings.md +27 -1
  311. package/docs/subagents.md +4 -0
  312. package/docs/terminal-setup.md +4 -0
  313. package/docs/usage.md +2 -2
  314. package/docs/windows.md +4 -0
  315. package/docs/workflows.md +21 -9
  316. package/npm-shrinkwrap.json +513 -23
  317. package/package.json +3 -2
@@ -1,24 +1,28 @@
1
- import { InteractiveModeBase } from "./interactive-mode-base.js";
2
- import { pasteClipboardImageToEditor } from "./interactive-mode-deps.js";
1
+ import { InteractiveModeBase, seedStartupInput } from "./interactive-mode-base.js";
2
+ import { pasteClipboardImageToEditor, recordTimeSinceReset } from "./interactive-mode-deps.js";
3
3
  import { yieldToEventLoop } from "../../utils/event-loop.js";
4
4
  InteractiveModeBase.prototype.runUserPromptTurn = async function (userInput) {
5
5
  // Show the working spinner immediately on submit so there is no visible gap
6
6
  // while prompt preflight runs before the agent emits `agent_start`.
7
7
  this.showWorkingLoaderNow();
8
- if (this.deferredStartupPending) {
8
+ const deferredStartupNeedsPromptGate = this.deferredStartupPending || this.deferredStartupPromise !== undefined;
9
+ if (deferredStartupNeedsPromptGate) {
9
10
  this.deferLoadedResourcesDisclosureUntilAgentEnd = true;
10
11
  }
11
12
  // Yield once so the freshly-mounted spinner paints before synchronous
12
13
  // preflight work can block the event loop.
13
14
  await yieldToEventLoop();
14
15
  try {
15
- await this.ensureDeferredStartupComplete();
16
+ if (deferredStartupNeedsPromptGate) {
17
+ await this.ensureDeferredStartupComplete();
18
+ }
16
19
  await this.session.prompt(userInput);
17
20
  this.deferLoadedResourcesDisclosureUntilAgentEnd = false;
18
21
  if (this.pendingLoadedResourcesDisclosure) {
19
22
  this.pendingLoadedResourcesDisclosure = false;
20
23
  this.showLoadedResources({ force: true, showDiagnosticsWhenQuiet: true, targetContainer: this.startupNoticesContainer });
21
24
  void this.maybeWarnAboutAnthropicSubscriptionAuth(undefined, this.startupNoticesContainer);
25
+ this.showStartupNoticesIfNeeded(this.startupNoticesContainer);
22
26
  }
23
27
  }
24
28
  catch (error) {
@@ -85,11 +89,26 @@ InteractiveModeBase.prototype.setupKeyHandlers = function () {
85
89
  this.defaultEditor.onCtrlD = () => this.handleCtrlD();
86
90
  this.defaultEditor.onAction("app.suspend", () => this.handleCtrlZ());
87
91
  this.defaultEditor.onAction("app.thinking.cycle", () => this.cycleThinkingLevel());
88
- this.defaultEditor.onAction("app.model.cycleForward", () => this.cycleModel("forward"));
89
- this.defaultEditor.onAction("app.model.cycleBackward", () => this.cycleModel("backward"));
92
+ this.defaultEditor.onAction("app.model.cycleForward", () => {
93
+ void (async () => {
94
+ await this.ensureDeferredStartupComplete();
95
+ await this.cycleModel("forward");
96
+ })();
97
+ });
98
+ this.defaultEditor.onAction("app.model.cycleBackward", () => {
99
+ void (async () => {
100
+ await this.ensureDeferredStartupComplete();
101
+ await this.cycleModel("backward");
102
+ })();
103
+ });
90
104
  // Global debug handler on TUI (works regardless of focus)
91
105
  this.ui.onDebug = () => this.handleDebugCommand();
92
- this.defaultEditor.onAction("app.model.select", () => this.showModelSelector());
106
+ this.defaultEditor.onAction("app.model.select", () => {
107
+ void (async () => {
108
+ await this.ensureDeferredStartupComplete();
109
+ this.showModelSelector();
110
+ })();
111
+ });
93
112
  this.defaultEditor.onAction("app.tools.expand", () => this.toggleToolOutputExpansion());
94
113
  this.defaultEditor.onAction("app.thinking.toggle", () => this.toggleThinkingBlockVisibility());
95
114
  this.defaultEditor.onAction("app.editor.external", () => this.openExternalEditor());
@@ -116,208 +135,322 @@ InteractiveModeBase.prototype.handleClipboardImagePaste = async function () {
116
135
  showWarning: (message) => this.showWarning(message),
117
136
  });
118
137
  };
119
- InteractiveModeBase.prototype.setupEditorSubmitHandler = function () {
120
- this.defaultEditor.onSubmit = async (text) => {
121
- text = text.trim();
122
- if (!text)
123
- return;
124
- // Handle commands
125
- if (text === "/settings") {
126
- this.showSettingsSelector();
127
- this.editor.setText("");
128
- return;
129
- }
130
- if (text === "/fast") {
131
- this.editor.setText("");
132
- this.showFastModeSelector();
133
- return;
134
- }
135
- if (text === "/scoped-models") {
136
- this.editor.setText("");
137
- await this.showModelsSelector();
138
- return;
139
- }
140
- if (text === "/model" || text.startsWith("/model ")) {
141
- const searchTerm = text.startsWith("/model ")
142
- ? text.slice(7).trim()
143
- : undefined;
144
- this.editor.setText("");
145
- await this.handleModelCommand(searchTerm);
146
- return;
147
- }
148
- if (text === "/export" || text.startsWith("/export ")) {
149
- await this.handleExportCommand(text);
150
- this.editor.setText("");
151
- return;
152
- }
153
- if (text === "/import" || text.startsWith("/import ")) {
154
- await this.handleImportCommand(text);
155
- this.editor.setText("");
156
- return;
157
- }
158
- if (text === "/share") {
159
- await this.handleShareCommand();
160
- this.editor.setText("");
161
- return;
162
- }
163
- if (text === "/copy") {
164
- await this.handleCopyCommand();
165
- this.editor.setText("");
166
- return;
167
- }
168
- if (text === "/name" || text.startsWith("/name ")) {
169
- this.handleNameCommand(text);
170
- this.editor.setText("");
171
- return;
172
- }
173
- if (text === "/session") {
174
- this.handleSessionCommand();
175
- this.editor.setText("");
176
- return;
177
- }
178
- if (text === "/changelog") {
179
- this.handleChangelogCommand();
180
- this.editor.setText("");
181
- return;
182
- }
183
- if (text === "/atomic" || text.startsWith("/atomic ")) {
184
- this.editor.setText("");
185
- await this.session.prompt(text);
186
- return;
187
- }
188
- if (text === "/hotkeys") {
189
- this.handleHotkeysCommand();
190
- this.editor.setText("");
191
- return;
192
- }
193
- if (text === "/fork") {
194
- this.showUserMessageSelector();
195
- this.editor.setText("");
196
- return;
197
- }
198
- if (text === "/clone") {
199
- this.editor.setText("");
200
- await this.handleCloneCommand();
201
- return;
202
- }
203
- if (text === "/tree") {
204
- this.showTreeSelector();
138
+ InteractiveModeBase.prototype.deliverStartupReplayPrompt = function (text) {
139
+ if (this.onInputCallback) {
140
+ if (!text.startsWith("/")) {
141
+ this.renderDeferredUserInput(text);
142
+ }
143
+ const callback = this.onInputCallback;
144
+ this.onInputCallback = undefined;
145
+ callback(text);
146
+ }
147
+ else {
148
+ this.pendingUserInputs.push(text);
149
+ }
150
+ };
151
+ InteractiveModeBase.prototype.recoverCookedStartupInput = function () {
152
+ if (this.startupCookedInputRecovered || this.pendingUserInputs.length > 0)
153
+ return true;
154
+ const text = this.editor.getText();
155
+ const cookedLines = text.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
156
+ const isCommandLike = (line) => line !== undefined && (line.startsWith("/") || line.startsWith("!"));
157
+ const singleCommandLike = cookedLines.length === 1 && isCommandLike(cookedLines[0]);
158
+ if (cookedLines.length < 2 && !singleCommandLike)
159
+ return false;
160
+ this.startupCookedInputRecovered = true;
161
+ const activeInput = this.startupReplayActiveInput?.trim();
162
+ let draftText = "";
163
+ let submissions = cookedLines;
164
+ if (activeInput === undefined &&
165
+ cookedLines.length > 1 &&
166
+ !isCommandLike(cookedLines[cookedLines.length - 1]) &&
167
+ (!isCommandLike(cookedLines[0]) || cookedLines.length > 2)) {
168
+ draftText = cookedLines[cookedLines.length - 1] ?? "";
169
+ submissions = cookedLines.slice(0, -1);
170
+ }
171
+ else if (activeInput && cookedLines.length > 1 && !isCommandLike(cookedLines[cookedLines.length - 1])) {
172
+ draftText = cookedLines[cookedLines.length - 1] ?? "";
173
+ submissions = cookedLines.slice(0, -1);
174
+ }
175
+ if (submissions.length === 0)
176
+ return true;
177
+ if (activeInput) {
178
+ const queuedSubmissions = submissions[0] === activeInput ? submissions.slice(1) : submissions;
179
+ this.editor.setText(draftText);
180
+ this.startupReplayInputs.push(...queuedSubmissions);
181
+ return true;
182
+ }
183
+ this.editor.setText("");
184
+ seedStartupInput(this.pendingUserInputs, this.editor, { text: draftText, submissions }, this.startupReplayInputs, (draft) => {
185
+ this.startupDraftText = draft;
186
+ }, (active) => {
187
+ this.startupReplayActiveInput = active;
188
+ });
189
+ return true;
190
+ };
191
+ InteractiveModeBase.prototype.drainStartupReplayCommands = async function () {
192
+ while (this.pendingUserInputs.length === 0 && this.startupReplayActiveInput) {
193
+ const activeInput = this.startupReplayActiveInput;
194
+ await this.defaultEditor.onSubmit?.(activeInput);
195
+ if (this.editor.getText().trim() === activeInput.trim()) {
205
196
  this.editor.setText("");
206
- return;
207
197
  }
208
- if (text === "/trust") {
209
- this.showTrustSelector();
210
- this.editor.setText("");
198
+ if (this.startupReplayActiveInput?.trim() === activeInput.trim())
199
+ break;
200
+ }
201
+ };
202
+ InteractiveModeBase.prototype.advanceStartupInputReplay = function (submittedText) {
203
+ if (this.startupReplayActiveInput?.trim() !== submittedText.trim())
204
+ return;
205
+ this.startupReplayActiveInput = undefined;
206
+ while (this.startupReplayInputs.length > 0) {
207
+ const nextInput = this.startupReplayInputs.shift();
208
+ if (nextInput === undefined)
209
+ break;
210
+ const trimmed = nextInput.trimStart();
211
+ if (trimmed.startsWith("/") || trimmed.startsWith("!")) {
212
+ this.startupReplayActiveInput = nextInput.trim();
213
+ this.editor.setText(this.startupReplayActiveInput);
214
+ this.ui.requestRender();
211
215
  return;
212
216
  }
213
- if (text === "/login") {
214
- this.showOAuthSelector("login");
215
- this.editor.setText("");
216
- return;
217
+ this.deliverStartupReplayPrompt(nextInput);
218
+ }
219
+ if (this.startupDraftText !== undefined) {
220
+ this.editor.setText(this.startupDraftText);
221
+ this.startupDraftText = undefined;
222
+ this.ui.requestRender();
223
+ }
224
+ };
225
+ InteractiveModeBase.prototype.setupEditorSubmitHandler = function () {
226
+ this.defaultEditor.onSubmit = async (text) => {
227
+ if (!this.firstSubmitRecorded) {
228
+ this.firstSubmitRecorded = true;
229
+ recordTimeSinceReset("interactive-first-submit");
217
230
  }
218
- if (text === "/logout") {
219
- this.showOAuthSelector("logout");
220
- this.editor.setText("");
231
+ text = text.trim();
232
+ if (!text)
221
233
  return;
222
- }
223
- if (text === "/new") {
234
+ if (this.startupReplayActiveInput && this.startupReplayActiveInput.trim() !== text.trim()) {
235
+ this.startupReplayInputs.push(text);
236
+ this.editor.addToHistory?.(text);
224
237
  this.editor.setText("");
225
- await this.handleClearCommand();
226
238
  return;
227
239
  }
228
- if (/^\/compact(?:\s|$)/.test(text)) {
229
- this.editor.setText("");
230
- if (text !== "/compact") {
231
- this.showWarning("Usage: /compact");
240
+ try {
241
+ // Handle commands
242
+ if (text === "/settings") {
243
+ this.showSettingsSelector();
244
+ this.editor.setText("");
232
245
  return;
233
246
  }
234
- await this.handleCompactCommand();
235
- return;
236
- }
237
- if (text === "/reload") {
238
- this.editor.setText("");
239
- await this.handleReloadCommand();
240
- return;
241
- }
242
- if (text === "/debug") {
243
- this.handleDebugCommand();
244
- this.editor.setText("");
245
- return;
246
- }
247
- if (text === "/arminsayshi") {
248
- this.handleArminSaysHi();
249
- this.editor.setText("");
250
- return;
251
- }
252
- if (text === "/dementedelves") {
253
- this.handleDementedDelves();
254
- this.editor.setText("");
255
- return;
256
- }
257
- if (text === "/resume") {
258
- this.showSessionSelector();
259
- this.editor.setText("");
260
- return;
261
- }
262
- if (text === "/quit" || text === "/exit") {
263
- this.editor.setText("");
264
- await this.shutdown();
265
- return;
266
- }
267
- // Handle bash command (! for normal, !! for excluded from context)
268
- if (text.startsWith("!")) {
269
- const isExcluded = text.startsWith("!!");
270
- const command = isExcluded
271
- ? text.slice(2).trim()
272
- : text.slice(1).trim();
273
- if (command) {
274
- if (this.session.isBashRunning) {
275
- this.showWarning("A bash command is already running. esc cancel first.");
276
- this.editor.setText(text);
247
+ if (text === "/fast") {
248
+ this.editor.setText("");
249
+ this.showFastModeSelector();
250
+ return;
251
+ }
252
+ if (text === "/scoped-models") {
253
+ this.editor.setText("");
254
+ await this.ensureDeferredStartupComplete();
255
+ await this.showModelsSelector();
256
+ return;
257
+ }
258
+ if (text === "/model" || text.startsWith("/model ")) {
259
+ const searchTerm = text.startsWith("/model ")
260
+ ? text.slice(7).trim()
261
+ : undefined;
262
+ this.editor.setText("");
263
+ await this.ensureDeferredStartupComplete();
264
+ await this.handleModelCommand(searchTerm);
265
+ return;
266
+ }
267
+ if (text === "/export" || text.startsWith("/export ")) {
268
+ await this.handleExportCommand(text);
269
+ this.editor.setText("");
270
+ return;
271
+ }
272
+ if (text === "/import" || text.startsWith("/import ")) {
273
+ await this.handleImportCommand(text);
274
+ this.editor.setText("");
275
+ return;
276
+ }
277
+ if (text === "/share") {
278
+ await this.handleShareCommand();
279
+ this.editor.setText("");
280
+ return;
281
+ }
282
+ if (text === "/copy") {
283
+ await this.handleCopyCommand();
284
+ this.editor.setText("");
285
+ return;
286
+ }
287
+ if (text === "/name" || text.startsWith("/name ")) {
288
+ this.handleNameCommand(text);
289
+ this.editor.setText("");
290
+ return;
291
+ }
292
+ if (text === "/session") {
293
+ this.handleSessionCommand();
294
+ this.editor.setText("");
295
+ return;
296
+ }
297
+ if (text === "/changelog") {
298
+ this.handleChangelogCommand();
299
+ this.editor.setText("");
300
+ return;
301
+ }
302
+ if (text === "/atomic" || text.startsWith("/atomic ")) {
303
+ this.editor.setText("");
304
+ await this.session.prompt(text);
305
+ return;
306
+ }
307
+ if (text === "/hotkeys") {
308
+ this.handleHotkeysCommand();
309
+ this.editor.setText("");
310
+ return;
311
+ }
312
+ if (text === "/fork") {
313
+ this.showUserMessageSelector();
314
+ this.editor.setText("");
315
+ return;
316
+ }
317
+ if (text === "/clone") {
318
+ this.editor.setText("");
319
+ await this.handleCloneCommand();
320
+ return;
321
+ }
322
+ if (text === "/tree") {
323
+ this.showTreeSelector();
324
+ this.editor.setText("");
325
+ return;
326
+ }
327
+ if (text === "/trust") {
328
+ this.showTrustSelector();
329
+ this.editor.setText("");
330
+ return;
331
+ }
332
+ if (text === "/login") {
333
+ this.showOAuthSelector("login");
334
+ this.editor.setText("");
335
+ return;
336
+ }
337
+ if (text === "/logout") {
338
+ this.showOAuthSelector("logout");
339
+ this.editor.setText("");
340
+ return;
341
+ }
342
+ if (text === "/new") {
343
+ this.editor.setText("");
344
+ await this.handleClearCommand();
345
+ return;
346
+ }
347
+ if (/^\/compact(?:\s|$)/.test(text)) {
348
+ this.editor.setText("");
349
+ if (text !== "/compact") {
350
+ this.showWarning("Usage: /compact");
277
351
  return;
278
352
  }
279
- this.editor.addToHistory?.(text);
280
- await this.handleBashCommand(command, isExcluded);
281
- this.isBashMode = false;
282
- this.updateEditorBorderColor();
353
+ await this.handleCompactCommand();
283
354
  return;
284
355
  }
285
- }
286
- // Queue input during compaction (extension commands execute immediately)
287
- if (this.session.isCompacting) {
288
- if (this.isExtensionCommand(text)) {
356
+ if (text === "/reload") {
357
+ this.editor.setText("");
358
+ await this.ensureDeferredStartupComplete();
359
+ await this.handleReloadCommand();
360
+ return;
361
+ }
362
+ if (text === "/debug") {
363
+ this.handleDebugCommand();
364
+ this.editor.setText("");
365
+ return;
366
+ }
367
+ if (text === "/arminsayshi") {
368
+ this.handleArminSaysHi();
369
+ this.editor.setText("");
370
+ return;
371
+ }
372
+ if (text === "/dementedelves") {
373
+ this.handleDementedDelves();
374
+ this.editor.setText("");
375
+ return;
376
+ }
377
+ if (text === "/resume") {
378
+ this.showSessionSelector();
379
+ this.editor.setText("");
380
+ return;
381
+ }
382
+ if (text === "/quit" || text === "/exit") {
383
+ this.editor.setText("");
384
+ await this.shutdown();
385
+ return;
386
+ }
387
+ if (text.startsWith("/") && this.deferredStartupPending) {
289
388
  this.editor.addToHistory?.(text);
290
389
  this.editor.setText("");
390
+ this.ui.requestRender();
391
+ await yieldToEventLoop();
392
+ await this.ensureDeferredStartupComplete();
291
393
  await this.session.prompt(text);
394
+ return;
395
+ }
396
+ // Handle bash command (! for normal, !! for excluded from context)
397
+ if (text.startsWith("!")) {
398
+ const isExcluded = text.startsWith("!!");
399
+ const command = isExcluded
400
+ ? text.slice(2).trim()
401
+ : text.slice(1).trim();
402
+ if (command) {
403
+ if (this.session.isBashRunning) {
404
+ this.showWarning("A bash command is already running. esc cancel first.");
405
+ this.editor.setText(text);
406
+ return;
407
+ }
408
+ this.editor.addToHistory?.(text);
409
+ await this.handleBashCommand(command, isExcluded);
410
+ this.isBashMode = false;
411
+ this.updateEditorBorderColor();
412
+ return;
413
+ }
414
+ }
415
+ // Queue input during compaction (extension commands execute immediately)
416
+ if (this.session.isCompacting) {
417
+ if (this.isExtensionCommand(text)) {
418
+ this.editor.addToHistory?.(text);
419
+ this.editor.setText("");
420
+ await this.session.prompt(text);
421
+ }
422
+ else {
423
+ this.queueCompactionMessage(text, "steer");
424
+ }
425
+ return;
426
+ }
427
+ // If streaming, use prompt() with steer behavior
428
+ // This handles extension commands (execute immediately), prompt template expansion, and queueing
429
+ if (this.session.isStreaming) {
430
+ this.editor.addToHistory?.(text);
431
+ this.editor.setText("");
432
+ await this.session.prompt(text, { streamingBehavior: "steer" });
433
+ this.updatePendingMessagesDisplay();
434
+ this.ui.requestRender();
435
+ return;
436
+ }
437
+ // Normal message submission
438
+ // First, move any pending bash components to chat
439
+ this.flushPendingBashComponents();
440
+ if (this.onInputCallback) {
441
+ if (!text.startsWith("/")) {
442
+ this.renderDeferredUserInput(text);
443
+ }
444
+ this.onInputCallback(text);
292
445
  }
293
446
  else {
294
- this.queueCompactionMessage(text, "steer");
447
+ this.pendingUserInputs.push(text);
295
448
  }
296
- return;
297
- }
298
- // If streaming, use prompt() with steer behavior
299
- // This handles extension commands (execute immediately), prompt template expansion, and queueing
300
- if (this.session.isStreaming) {
301
449
  this.editor.addToHistory?.(text);
302
- this.editor.setText("");
303
- await this.session.prompt(text, { streamingBehavior: "steer" });
304
- this.updatePendingMessagesDisplay();
305
- this.ui.requestRender();
306
- return;
307
- }
308
- // Normal message submission
309
- // First, move any pending bash components to chat
310
- this.flushPendingBashComponents();
311
- if (this.onInputCallback) {
312
- if (!text.startsWith("/")) {
313
- this.renderDeferredUserInput(text);
314
- }
315
- this.onInputCallback(text);
316
450
  }
317
- else {
318
- this.pendingUserInputs.push(text);
451
+ finally {
452
+ this.advanceStartupInputReplay?.(text);
319
453
  }
320
- this.editor.addToHistory?.(text);
321
454
  };
322
455
  };
323
456
  //# sourceMappingURL=interactive-input-handling.js.map