@bastani/atomic 0.9.5-alpha.8 → 0.9.5

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 (530) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/README.md +2 -2
  3. package/dist/builtin/cursor/CHANGELOG.md +12 -0
  4. package/dist/builtin/cursor/package.json +3 -3
  5. package/dist/builtin/cursor/src/model-mapper.ts +6 -3
  6. package/dist/builtin/intercom/CHANGELOG.md +37 -0
  7. package/dist/builtin/intercom/README.md +4 -2
  8. package/dist/builtin/intercom/broker/broker.ts +6 -114
  9. package/dist/builtin/intercom/broker/client.ts +29 -54
  10. package/dist/builtin/intercom/broker/delivered-message-cache.ts +44 -0
  11. package/dist/builtin/intercom/broker/pending-send-registry.ts +142 -0
  12. package/dist/builtin/intercom/broker/send-handler.ts +106 -0
  13. package/dist/builtin/intercom/broker/send-signature.ts +37 -0
  14. package/dist/builtin/intercom/foreground-detach-handoff.ts +136 -0
  15. package/dist/builtin/intercom/index-heavy.ts +49 -53
  16. package/dist/builtin/intercom/index.ts +278 -262
  17. package/dist/builtin/intercom/lazy-heavy-proxy.ts +114 -0
  18. package/dist/builtin/intercom/lazy-subagent-ack.ts +20 -0
  19. package/dist/builtin/intercom/lazy-tool-execution.ts +39 -0
  20. package/dist/builtin/intercom/lifecycle-lease.ts +51 -0
  21. package/dist/builtin/intercom/lifecycle.ts +37 -20
  22. package/dist/builtin/intercom/package.json +3 -6
  23. package/dist/builtin/intercom/reply-routing.ts +17 -0
  24. package/dist/builtin/intercom/subagent-relay.ts +58 -12
  25. package/dist/builtin/intercom/types.ts +3 -3
  26. package/dist/builtin/mcp/CHANGELOG.md +38 -0
  27. package/dist/builtin/mcp/OAUTH.md +1 -0
  28. package/dist/builtin/mcp/README.md +10 -6
  29. package/dist/builtin/mcp/apps-cancellation.ts +32 -0
  30. package/dist/builtin/mcp/call-tool-result.ts +9 -0
  31. package/dist/builtin/mcp/caller-wait.ts +50 -0
  32. package/dist/builtin/mcp/command-registration.ts +82 -0
  33. package/dist/builtin/mcp/direct-tool-executor.ts +279 -0
  34. package/dist/builtin/mcp/direct-tools.ts +40 -255
  35. package/dist/builtin/mcp/host-html-template.ts +4 -2
  36. package/dist/builtin/mcp/index.ts +274 -239
  37. package/dist/builtin/mcp/init.ts +96 -126
  38. package/dist/builtin/mcp/mcp-auth-flow.ts +247 -237
  39. package/dist/builtin/mcp/mcp-callback-server.ts +89 -68
  40. package/dist/builtin/mcp/mcp-oauth-provider.ts +23 -1
  41. package/dist/builtin/mcp/metadata-hydration.ts +52 -0
  42. package/dist/builtin/mcp/package.json +3 -3
  43. package/dist/builtin/mcp/proxy-auth.ts +4 -4
  44. package/dist/builtin/mcp/proxy-call.ts +111 -40
  45. package/dist/builtin/mcp/proxy-connect.ts +35 -15
  46. package/dist/builtin/mcp/proxy-info-modes.ts +106 -23
  47. package/dist/builtin/mcp/proxy-modes.ts +3 -3
  48. package/dist/builtin/mcp/session-cleanup-barrier.ts +43 -0
  49. package/dist/builtin/mcp/startup-warmup.ts +98 -0
  50. package/dist/builtin/mcp/state-lease.ts +12 -0
  51. package/dist/builtin/mcp/tool-result-renderer.ts +3 -3
  52. package/dist/builtin/mcp/ui-server.ts +8 -8
  53. package/dist/builtin/mcp/ui-session.ts +9 -18
  54. package/dist/builtin/subagents/CHANGELOG.md +78 -0
  55. package/dist/builtin/subagents/README.md +30 -29
  56. package/dist/builtin/subagents/agents/code-simplifier.md +2 -2
  57. package/dist/builtin/subagents/agents/codebase-analyzer.md +2 -2
  58. package/dist/builtin/subagents/agents/codebase-locator.md +2 -2
  59. package/dist/builtin/subagents/agents/codebase-online-researcher.md +2 -2
  60. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +2 -2
  61. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +2 -2
  62. package/dist/builtin/subagents/agents/codebase-research-locator.md +2 -2
  63. package/dist/builtin/subagents/agents/debugger.md +2 -2
  64. package/dist/builtin/subagents/agents/worker.md +2 -2
  65. package/dist/builtin/subagents/package.json +5 -5
  66. package/dist/builtin/subagents/prompts/review-loop.md +1 -1
  67. package/dist/builtin/subagents/skills/subagent/SKILL.md +37 -36
  68. package/dist/builtin/subagents/src/extension/api-lifecycle.ts +64 -0
  69. package/dist/builtin/subagents/src/extension/fanout-child.ts +44 -51
  70. package/dist/builtin/subagents/src/extension/index.ts +289 -320
  71. package/dist/builtin/subagents/src/extension/prompt-guidance.ts +7 -10
  72. package/dist/builtin/subagents/src/extension/schemas.ts +22 -5
  73. package/dist/builtin/subagents/src/extension/startup-maintenance.ts +89 -0
  74. package/dist/builtin/subagents/src/extension/tool-description.ts +29 -0
  75. package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +13 -2
  76. package/dist/builtin/subagents/src/intercom/result-intercom.ts +4 -4
  77. package/dist/builtin/subagents/src/runs/background/async-event-journal.ts +106 -0
  78. package/dist/builtin/subagents/src/runs/background/async-execution-common.ts +26 -20
  79. package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +13 -2
  80. package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +3 -0
  81. package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +1 -1
  82. package/dist/builtin/subagents/src/runs/background/completion-claims.ts +189 -0
  83. package/dist/builtin/subagents/src/runs/background/completion-dedupe.ts +44 -7
  84. package/dist/builtin/subagents/src/runs/background/completion-notification.ts +34 -0
  85. package/dist/builtin/subagents/src/runs/background/notify.ts +72 -22
  86. package/dist/builtin/subagents/src/runs/background/result-delivery-processor.ts +232 -0
  87. package/dist/builtin/subagents/src/runs/background/result-file-claims.ts +151 -0
  88. package/dist/builtin/subagents/src/runs/background/result-quarantine.ts +72 -0
  89. package/dist/builtin/subagents/src/runs/background/result-retry-scheduler.ts +48 -0
  90. package/dist/builtin/subagents/src/runs/background/result-status.ts +81 -0
  91. package/dist/builtin/subagents/src/runs/background/result-watcher-data.ts +59 -0
  92. package/dist/builtin/subagents/src/runs/background/result-watcher.ts +177 -233
  93. package/dist/builtin/subagents/src/runs/background/run-id-resolver.ts +3 -2
  94. package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +73 -14
  95. package/dist/builtin/subagents/src/runs/background/subagent-runner-streaming.ts +29 -15
  96. package/dist/builtin/subagents/src/runs/background/top-level-async.ts +1 -2
  97. package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +1 -0
  98. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +1 -0
  99. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +1 -0
  100. package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +7 -9
  101. package/dist/builtin/subagents/src/runs/foreground/chain-execution-types.ts +3 -13
  102. package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +2 -15
  103. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-finalize.ts +2 -2
  104. package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +63 -46
  105. package/dist/builtin/subagents/src/runs/foreground/execution-detach-reservations.ts +48 -0
  106. package/dist/builtin/subagents/src/runs/foreground/execution-detach-route.ts +17 -0
  107. package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +39 -26
  108. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +3 -1
  109. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +3 -51
  110. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +6 -11
  111. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +11 -2
  112. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +2 -0
  113. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +5 -112
  114. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +2 -0
  115. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +68 -118
  116. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +79 -7
  117. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +2 -2
  118. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +3 -0
  119. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +2 -2
  120. package/dist/builtin/subagents/src/runs/shared/pi-spawn.ts +55 -12
  121. package/dist/builtin/subagents/src/shared/artifacts.ts +22 -11
  122. package/dist/builtin/subagents/src/shared/event-jsonl-writer.ts +294 -0
  123. package/dist/builtin/subagents/src/shared/exclusive-file-publication.ts +44 -0
  124. package/dist/builtin/subagents/src/shared/jsonl-writer.ts +1 -0
  125. package/dist/builtin/subagents/src/shared/model-info.ts +2 -2
  126. package/dist/builtin/subagents/src/shared/settings.ts +20 -10
  127. package/dist/builtin/subagents/src/shared/types-async.ts +3 -1
  128. package/dist/builtin/subagents/src/shared/types-config.ts +2 -0
  129. package/dist/builtin/subagents/src/shared/types-runtime.ts +3 -2
  130. package/dist/builtin/subagents/src/slash/slash-commands.ts +9 -12
  131. package/dist/builtin/subagents/src/slash/slash-live-state.ts +63 -32
  132. package/dist/builtin/subagents/src/tui/render-result.ts +7 -0
  133. package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -0
  134. package/dist/builtin/subagents/src/tui/render-widget.ts +157 -89
  135. package/dist/builtin/web-access/CHANGELOG.md +28 -0
  136. package/dist/builtin/web-access/README.md +4 -0
  137. package/dist/builtin/web-access/content-tools.ts +8 -3
  138. package/dist/builtin/web-access/index-heavy.ts +1 -1
  139. package/dist/builtin/web-access/index.ts +190 -46
  140. package/dist/builtin/web-access/lifecycle-lease.ts +38 -0
  141. package/dist/builtin/web-access/package.json +2 -2
  142. package/dist/builtin/web-access/result-renderers.ts +1 -1
  143. package/dist/builtin/web-access/summary-review.ts +1 -1
  144. package/dist/builtin/web-access/web-search-activity.ts +1 -1
  145. package/dist/builtin/web-access/web-search-return.ts +7 -0
  146. package/dist/builtin/web-access/web-search-summary.ts +1 -1
  147. package/dist/builtin/web-access/web-search-tool.ts +4 -2
  148. package/dist/builtin/workflows/CHANGELOG.md +86 -0
  149. package/dist/builtin/workflows/README.md +5 -5
  150. package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +27 -4
  151. package/dist/builtin/workflows/builtin/goal-runner.ts +86 -27
  152. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +10 -0
  153. package/dist/builtin/workflows/builtin/ralph-core.ts +9 -9
  154. package/dist/builtin/workflows/builtin/ralph-models.ts +71 -36
  155. package/dist/builtin/workflows/builtin/ralph-runner.ts +20 -31
  156. package/dist/builtin/workflows/package.json +2 -2
  157. package/dist/builtin/workflows/skills/impeccable/SKILL.md +16 -13
  158. package/dist/builtin/workflows/skills/impeccable/reference/adapt.md +1 -0
  159. package/dist/builtin/workflows/skills/impeccable/reference/adapt.native.md +58 -0
  160. package/dist/builtin/workflows/skills/impeccable/reference/android.md +40 -0
  161. package/dist/builtin/workflows/skills/impeccable/reference/animate.md +2 -0
  162. package/dist/builtin/workflows/skills/impeccable/reference/audit.md +2 -0
  163. package/dist/builtin/workflows/skills/impeccable/reference/audit.native.md +139 -0
  164. package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +69 -62
  165. package/dist/builtin/workflows/skills/impeccable/reference/critique.md +21 -7
  166. package/dist/builtin/workflows/skills/impeccable/reference/document.md +1 -1
  167. package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +92 -0
  168. package/dist/builtin/workflows/skills/impeccable/reference/init.md +29 -7
  169. package/dist/builtin/workflows/skills/impeccable/reference/ios.md +45 -0
  170. package/dist/builtin/workflows/skills/impeccable/reference/layout.md +25 -1
  171. package/dist/builtin/workflows/skills/impeccable/reference/typeset.md +23 -1
  172. package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +2 -1
  173. package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +75 -14
  174. package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +1 -1
  175. package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +31 -0
  176. package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +64 -0
  177. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +118 -11
  178. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +16 -11
  179. package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +66 -0
  180. package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +42 -10
  181. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/fonts.mjs +30 -0
  182. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/page.mjs +4 -6
  183. package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +660 -0
  184. package/dist/builtin/workflows/skills/impeccable/scripts/hook-before-edit.mjs +516 -0
  185. package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +1764 -0
  186. package/dist/builtin/workflows/skills/impeccable/scripts/hook.mjs +61 -0
  187. package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +4 -2
  188. package/dist/builtin/workflows/skills/impeccable/scripts/lib/is-generated.mjs +2 -2
  189. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-component.mjs +13 -16
  190. package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +17 -11
  191. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +104 -37
  192. package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +9 -0
  193. package/dist/builtin/workflows/src/durable/backend.ts +12 -0
  194. package/dist/builtin/workflows/src/durable/dbos-backend.ts +17 -1
  195. package/dist/builtin/workflows/src/durable/resume-catalog.ts +12 -0
  196. package/dist/builtin/workflows/src/durable/resume-runtime.ts +5 -2
  197. package/dist/builtin/workflows/src/durable/stage-primitive.ts +2 -1
  198. package/dist/builtin/workflows/src/durable/types.ts +16 -0
  199. package/dist/builtin/workflows/src/engine/primitives/task.ts +3 -1
  200. package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +1 -2
  201. package/dist/builtin/workflows/src/engine/run-returned-status.ts +50 -16
  202. package/dist/builtin/workflows/src/engine/run.ts +20 -19
  203. package/dist/builtin/workflows/src/engine/runtime.ts +5 -0
  204. package/dist/builtin/workflows/src/extension/extension-factory.ts +3 -0
  205. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +9 -2
  206. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +137 -27
  207. package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +22 -6
  208. package/dist/builtin/workflows/src/extension/public-types.ts +1 -1
  209. package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +13 -1
  210. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +19 -4
  211. package/dist/builtin/workflows/src/extension/workflow-command-surfaces.ts +9 -0
  212. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +17 -22
  213. package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +48 -23
  214. package/dist/builtin/workflows/src/extension/workflow-schema.ts +15 -2
  215. package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +20 -8
  216. package/dist/builtin/workflows/src/extension/workflow-tool.ts +24 -8
  217. package/dist/builtin/workflows/src/runs/background/status.ts +4 -3
  218. package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +29 -8
  219. package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +1 -1
  220. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +3 -2
  221. package/dist/builtin/workflows/src/runs/shared/model-fallback-candidates.ts +1 -1
  222. package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +155 -20
  223. package/dist/builtin/workflows/src/runs/shared/worktree-types.ts +6 -0
  224. package/dist/builtin/workflows/src/runs/shared/worktree.ts +2 -1
  225. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +2 -2
  226. package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +2 -2
  227. package/dist/builtin/workflows/src/shared/resume-continuation.ts +2 -0
  228. package/dist/builtin/workflows/src/shared/returned-run-status.ts +116 -0
  229. package/dist/builtin/workflows/src/shared/workflow-failures-decisions.ts +2 -0
  230. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +21 -3
  231. package/dist/builtin/workflows/src/tui/graph-view-state.ts +3 -0
  232. package/dist/builtin/workflows/src/tui/graph-view-types.ts +3 -0
  233. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +1 -23
  234. package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +54 -9
  235. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +5 -2
  236. package/dist/builtin/workflows/src/tui/status-list.ts +22 -15
  237. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +4 -4
  238. package/dist/cli/args.d.ts.map +1 -1
  239. package/dist/cli/args.js +2 -2
  240. package/dist/cli/args.js.map +1 -1
  241. package/dist/core/agent-session-auto-compaction.d.ts +23 -3
  242. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  243. package/dist/core/agent-session-auto-compaction.js +129 -17
  244. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  245. package/dist/core/agent-session-events.d.ts.map +1 -1
  246. package/dist/core/agent-session-events.js +9 -1
  247. package/dist/core/agent-session-events.js.map +1 -1
  248. package/dist/core/agent-session-message-queue.d.ts.map +1 -1
  249. package/dist/core/agent-session-message-queue.js +1 -1
  250. package/dist/core/agent-session-message-queue.js.map +1 -1
  251. package/dist/core/agent-session-methods.d.ts +6 -3
  252. package/dist/core/agent-session-methods.d.ts.map +1 -1
  253. package/dist/core/agent-session-methods.js.map +1 -1
  254. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  255. package/dist/core/agent-session-prompt.js +2 -2
  256. package/dist/core/agent-session-prompt.js.map +1 -1
  257. package/dist/core/agent-session-retry.d.ts.map +1 -1
  258. package/dist/core/agent-session-retry.js +1 -1
  259. package/dist/core/agent-session-retry.js.map +1 -1
  260. package/dist/core/agent-session-services.d.ts.map +1 -1
  261. package/dist/core/agent-session-services.js +3 -2
  262. package/dist/core/agent-session-services.js.map +1 -1
  263. package/dist/core/agent-session-types.d.ts.map +1 -1
  264. package/dist/core/agent-session-types.js +1 -1
  265. package/dist/core/agent-session-types.js.map +1 -1
  266. package/dist/core/agent-session.d.ts +4 -2
  267. package/dist/core/agent-session.d.ts.map +1 -1
  268. package/dist/core/agent-session.js +4 -2
  269. package/dist/core/agent-session.js.map +1 -1
  270. package/dist/core/anthropic-thinking-guard.d.ts +5 -5
  271. package/dist/core/anthropic-thinking-guard.d.ts.map +1 -1
  272. package/dist/core/anthropic-thinking-guard.js +42 -32
  273. package/dist/core/anthropic-thinking-guard.js.map +1 -1
  274. package/dist/core/atomic-guide-command.d.ts.map +1 -1
  275. package/dist/core/atomic-guide-command.js +15 -15
  276. package/dist/core/atomic-guide-command.js.map +1 -1
  277. package/dist/core/auth-storage.d.ts.map +1 -1
  278. package/dist/core/auth-storage.js +14 -9
  279. package/dist/core/auth-storage.js.map +1 -1
  280. package/dist/core/compaction/compaction.d.ts +2 -0
  281. package/dist/core/compaction/compaction.d.ts.map +1 -1
  282. package/dist/core/compaction/compaction.js +79 -46
  283. package/dist/core/compaction/compaction.js.map +1 -1
  284. package/dist/core/compaction/context-assistant-turns.d.ts +42 -0
  285. package/dist/core/compaction/context-assistant-turns.d.ts.map +1 -0
  286. package/dist/core/compaction/context-assistant-turns.js +87 -0
  287. package/dist/core/compaction/context-assistant-turns.js.map +1 -0
  288. package/dist/core/compaction/context-compaction-critical.d.ts +1 -1
  289. package/dist/core/compaction/context-compaction-critical.d.ts.map +1 -1
  290. package/dist/core/compaction/context-compaction-critical.js +2 -2
  291. package/dist/core/compaction/context-compaction-critical.js.map +1 -1
  292. package/dist/core/compaction/context-compaction-eviction-alternates.d.ts +18 -0
  293. package/dist/core/compaction/context-compaction-eviction-alternates.d.ts.map +1 -0
  294. package/dist/core/compaction/context-compaction-eviction-alternates.js +186 -0
  295. package/dist/core/compaction/context-compaction-eviction-alternates.js.map +1 -0
  296. package/dist/core/compaction/context-compaction-eviction.d.ts +10 -2
  297. package/dist/core/compaction/context-compaction-eviction.d.ts.map +1 -1
  298. package/dist/core/compaction/context-compaction-eviction.js +196 -146
  299. package/dist/core/compaction/context-compaction-eviction.js.map +1 -1
  300. package/dist/core/compaction/context-compaction-prompt.d.ts.map +1 -1
  301. package/dist/core/compaction/context-compaction-prompt.js +1 -1
  302. package/dist/core/compaction/context-compaction-prompt.js.map +1 -1
  303. package/dist/core/compaction/context-compaction-types.d.ts +2 -0
  304. package/dist/core/compaction/context-compaction-types.d.ts.map +1 -1
  305. package/dist/core/compaction/context-compaction-types.js.map +1 -1
  306. package/dist/core/compaction/context-deletion-application.d.ts +5 -4
  307. package/dist/core/compaction/context-deletion-application.d.ts.map +1 -1
  308. package/dist/core/compaction/context-deletion-application.js +17 -15
  309. package/dist/core/compaction/context-deletion-application.js.map +1 -1
  310. package/dist/core/compaction/context-deletion-store.d.ts.map +1 -1
  311. package/dist/core/compaction/context-deletion-store.js +1 -1
  312. package/dist/core/compaction/context-deletion-store.js.map +1 -1
  313. package/dist/core/compaction/context-deletion-targets.d.ts +2 -1
  314. package/dist/core/compaction/context-deletion-targets.d.ts.map +1 -1
  315. package/dist/core/compaction/context-deletion-targets.js +36 -31
  316. package/dist/core/compaction/context-deletion-targets.js.map +1 -1
  317. package/dist/core/compaction/context-deletion-tool-helpers.d.ts.map +1 -1
  318. package/dist/core/compaction/context-deletion-tool-helpers.js +116 -43
  319. package/dist/core/compaction/context-deletion-tool-helpers.js.map +1 -1
  320. package/dist/core/compaction/context-transcript-analysis.d.ts +1 -2
  321. package/dist/core/compaction/context-transcript-analysis.d.ts.map +1 -1
  322. package/dist/core/compaction/context-transcript-analysis.js +33 -37
  323. package/dist/core/compaction/context-transcript-analysis.js.map +1 -1
  324. package/dist/core/copilot-model-synthesis.d.ts.map +1 -1
  325. package/dist/core/copilot-model-synthesis.js +3 -1
  326. package/dist/core/copilot-model-synthesis.js.map +1 -1
  327. package/dist/core/extensions/loader-virtual-modules.d.ts +8 -1
  328. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  329. package/dist/core/extensions/loader-virtual-modules.js +2 -1
  330. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  331. package/dist/core/extensions/provider-types.d.ts +2 -7
  332. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  333. package/dist/core/extensions/provider-types.js.map +1 -1
  334. package/dist/core/footer-data-provider.d.ts +6 -0
  335. package/dist/core/footer-data-provider.d.ts.map +1 -1
  336. package/dist/core/footer-data-provider.js +72 -29
  337. package/dist/core/footer-data-provider.js.map +1 -1
  338. package/dist/core/messages.d.ts +9 -0
  339. package/dist/core/messages.d.ts.map +1 -1
  340. package/dist/core/messages.js +100 -18
  341. package/dist/core/messages.js.map +1 -1
  342. package/dist/core/model-registry-builtins.d.ts.map +1 -1
  343. package/dist/core/model-registry-builtins.js +5 -0
  344. package/dist/core/model-registry-builtins.js.map +1 -1
  345. package/dist/core/model-registry-custom-loader.d.ts.map +1 -1
  346. package/dist/core/model-registry-custom-loader.js +49 -8
  347. package/dist/core/model-registry-custom-loader.js.map +1 -1
  348. package/dist/core/model-registry-dynamic.d.ts.map +1 -1
  349. package/dist/core/model-registry-dynamic.js +11 -5
  350. package/dist/core/model-registry-dynamic.js.map +1 -1
  351. package/dist/core/model-registry-loader.d.ts.map +1 -1
  352. package/dist/core/model-registry-loader.js +8 -0
  353. package/dist/core/model-registry-loader.js.map +1 -1
  354. package/dist/core/model-registry-schemas.d.ts +93 -8
  355. package/dist/core/model-registry-schemas.d.ts.map +1 -1
  356. package/dist/core/model-registry-schemas.js +24 -12
  357. package/dist/core/model-registry-schemas.js.map +1 -1
  358. package/dist/core/model-registry-types.d.ts +7 -6
  359. package/dist/core/model-registry-types.d.ts.map +1 -1
  360. package/dist/core/model-registry-types.js.map +1 -1
  361. package/dist/core/model-registry.d.ts +5 -0
  362. package/dist/core/model-registry.d.ts.map +1 -1
  363. package/dist/core/model-registry.js +23 -0
  364. package/dist/core/model-registry.js.map +1 -1
  365. package/dist/core/model-resolver-cli.d.ts.map +1 -1
  366. package/dist/core/model-resolver-cli.js +33 -5
  367. package/dist/core/model-resolver-cli.js.map +1 -1
  368. package/dist/core/model-resolver-initial.d.ts +6 -1
  369. package/dist/core/model-resolver-initial.d.ts.map +1 -1
  370. package/dist/core/model-resolver-initial.js +12 -7
  371. package/dist/core/model-resolver-initial.js.map +1 -1
  372. package/dist/core/model-resolver.d.ts +1 -1
  373. package/dist/core/model-resolver.d.ts.map +1 -1
  374. package/dist/core/model-resolver.js +1 -1
  375. package/dist/core/model-resolver.js.map +1 -1
  376. package/dist/core/openai-responses-payload-sanitizer.d.ts +1 -0
  377. package/dist/core/openai-responses-payload-sanitizer.d.ts.map +1 -1
  378. package/dist/core/openai-responses-payload-sanitizer.js +24 -9
  379. package/dist/core/openai-responses-payload-sanitizer.js.map +1 -1
  380. package/dist/core/resource-loader-context-files.d.ts +1 -0
  381. package/dist/core/resource-loader-context-files.d.ts.map +1 -1
  382. package/dist/core/resource-loader-context-files.js +13 -10
  383. package/dist/core/resource-loader-context-files.js.map +1 -1
  384. package/dist/core/sdk.d.ts.map +1 -1
  385. package/dist/core/sdk.js +2 -2
  386. package/dist/core/sdk.js.map +1 -1
  387. package/dist/core/session-entry-normalization.d.ts +7 -0
  388. package/dist/core/session-entry-normalization.d.ts.map +1 -0
  389. package/dist/core/session-entry-normalization.js +14 -0
  390. package/dist/core/session-entry-normalization.js.map +1 -0
  391. package/dist/core/session-manager-core.d.ts.map +1 -1
  392. package/dist/core/session-manager-core.js +1 -0
  393. package/dist/core/session-manager-core.js.map +1 -1
  394. package/dist/core/session-manager-history.d.ts +2 -2
  395. package/dist/core/session-manager-history.d.ts.map +1 -1
  396. package/dist/core/session-manager-history.js +127 -108
  397. package/dist/core/session-manager-history.js.map +1 -1
  398. package/dist/core/settings-manager-basic-accessors.d.ts +2 -2
  399. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  400. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  401. package/dist/core/settings-types.d.ts +1 -1
  402. package/dist/core/settings-types.d.ts.map +1 -1
  403. package/dist/core/settings-types.js.map +1 -1
  404. package/dist/core/slash-commands.d.ts +2 -0
  405. package/dist/core/slash-commands.d.ts.map +1 -1
  406. package/dist/core/slash-commands.js +141 -0
  407. package/dist/core/slash-commands.js.map +1 -1
  408. package/dist/core/tools/bash.d.ts.map +1 -1
  409. package/dist/core/tools/bash.js +11 -8
  410. package/dist/core/tools/bash.js.map +1 -1
  411. package/dist/index.d.ts +1 -0
  412. package/dist/index.d.ts.map +1 -1
  413. package/dist/index.js +1 -0
  414. package/dist/index.js.map +1 -1
  415. package/dist/main-deferred-startup.d.ts.map +1 -1
  416. package/dist/main-deferred-startup.js +2 -2
  417. package/dist/main-deferred-startup.js.map +1 -1
  418. package/dist/main-early-input.d.ts.map +1 -1
  419. package/dist/main-early-input.js +7 -0
  420. package/dist/main-early-input.js.map +1 -1
  421. package/dist/main-session.d.ts.map +1 -1
  422. package/dist/main-session.js +1 -0
  423. package/dist/main-session.js.map +1 -1
  424. package/dist/main.d.ts.map +1 -1
  425. package/dist/main.js +1 -1
  426. package/dist/main.js.map +1 -1
  427. package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -1
  428. package/dist/modes/interactive/components/chat-session-host-actions.js +0 -1
  429. package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -1
  430. package/dist/modes/interactive/components/settings-selector-options.d.ts.map +1 -1
  431. package/dist/modes/interactive/components/settings-selector-options.js +3 -1
  432. package/dist/modes/interactive/components/settings-selector-options.js.map +1 -1
  433. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  434. package/dist/modes/interactive/components/thinking-selector.js +2 -1
  435. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  436. package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -1
  437. package/dist/modes/interactive/interactive-agent-events.js +3 -1
  438. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  439. package/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  440. package/dist/modes/interactive/interactive-autocomplete.js +21 -9
  441. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  442. package/dist/modes/interactive/interactive-child-ordering.d.ts +7 -0
  443. package/dist/modes/interactive/interactive-child-ordering.d.ts.map +1 -0
  444. package/dist/modes/interactive/interactive-child-ordering.js +26 -0
  445. package/dist/modes/interactive/interactive-child-ordering.js.map +1 -0
  446. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
  447. package/dist/modes/interactive/interactive-deferred-startup.js +43 -30
  448. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  449. package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -1
  450. package/dist/modes/interactive/interactive-hotkeys-debug.js +1 -0
  451. package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -1
  452. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  453. package/dist/modes/interactive/interactive-input-handling.js +41 -6
  454. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  455. package/dist/modes/interactive/interactive-mode-base.d.ts +3 -0
  456. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  457. package/dist/modes/interactive/interactive-mode-base.js +3 -0
  458. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  459. package/dist/modes/interactive/interactive-mode-deps.d.ts +2 -2
  460. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  461. package/dist/modes/interactive/interactive-mode-deps.js +2 -2
  462. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  463. package/dist/modes/interactive/interactive-mode-surface.d.ts +2 -2
  464. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  465. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  466. package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
  467. package/dist/modes/interactive/interactive-model-routing.js +11 -4
  468. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  469. package/dist/modes/interactive/interactive-process-lifecycle.d.ts.map +1 -1
  470. package/dist/modes/interactive/interactive-process-lifecycle.js +0 -3
  471. package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
  472. package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -1
  473. package/dist/modes/interactive/interactive-render-chat.js +15 -1
  474. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  475. package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -1
  476. package/dist/modes/interactive/interactive-session-routing.js +5 -1
  477. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  478. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  479. package/dist/modes/interactive/interactive-startup.js +20 -21
  480. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  481. package/dist/modes/interactive/theme/global-theme.d.ts.map +1 -1
  482. package/dist/modes/interactive/theme/global-theme.js +26 -2
  483. package/dist/modes/interactive/theme/global-theme.js.map +1 -1
  484. package/dist/modes/interactive/theme/theme-class.d.ts +1 -1
  485. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  486. package/dist/modes/interactive/theme/theme-class.js +2 -0
  487. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  488. package/dist/utils/clipboard-image.d.ts.map +1 -1
  489. package/dist/utils/clipboard-image.js +3 -0
  490. package/dist/utils/clipboard-image.js.map +1 -1
  491. package/dist/utils/fs-watch.d.ts +24 -1
  492. package/dist/utils/fs-watch.d.ts.map +1 -1
  493. package/dist/utils/fs-watch.js +60 -5
  494. package/dist/utils/fs-watch.js.map +1 -1
  495. package/docs/changelog.mdx +19 -0
  496. package/docs/compaction.md +60 -49
  497. package/docs/custom-provider.md +18 -5
  498. package/docs/development.md +4 -0
  499. package/docs/extensions.md +11 -2
  500. package/docs/json.md +1 -1
  501. package/docs/models.md +69 -10
  502. package/docs/providers.md +1 -1
  503. package/docs/quickstart.md +12 -8
  504. package/docs/rpc.md +2 -2
  505. package/docs/sdk.md +1 -1
  506. package/docs/settings.md +4 -4
  507. package/docs/subagents.md +40 -5
  508. package/docs/tools.md +1 -1
  509. package/docs/usage.md +4 -2
  510. package/docs/windows.md +4 -0
  511. package/docs/workflows.md +33 -48
  512. package/examples/extensions/preset.ts +2 -2
  513. package/examples/extensions/subagent/README.md +2 -2
  514. package/examples/extensions/subagent/index.ts +1 -2
  515. package/examples/extensions/subagent/schemas.ts +4 -1
  516. package/examples/sdk/12-full-control.ts +1 -1
  517. package/npm-shrinkwrap.json +48 -51
  518. package/package.json +7 -7
  519. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-behavior.ts +0 -75
  520. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-component.ts +0 -202
  521. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-edit.ts +0 -97
  522. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-editor.ts +0 -160
  523. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-frame.ts +0 -72
  524. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-modes.ts +0 -161
  525. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-selectors.ts +0 -203
  526. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-selectors.ts +0 -234
  527. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-state.ts +0 -103
  528. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-types.ts +0 -29
  529. package/dist/builtin/subagents/src/runs/foreground/chain-clarify.ts +0 -9
  530. package/dist/builtin/subagents/src/runs/foreground/chain-execution-clarify.ts +0 -117
@@ -24,7 +24,7 @@ import type { LiveStageMutableState, LiveStageRuntime, StageContextWithMeta, Sta
24
24
  import { createStageControlHandle } from "./executor-stage-control.js";
25
25
  import { createTrackedStageCaller } from "./executor-stage-call.js";
26
26
  import { createStageContext } from "./executor-stage-context.js";
27
- import { stageOptionsWithGitWorktree, stageOptionsWithInputDefaults } from "./executor-direct-helpers.js";
27
+ import { stageOptionsWithGitWorktree, stageOptionsWithInputDefaults, type GitWorktreeSetupCache } from "./executor-direct-helpers.js";
28
28
 
29
29
  export function createWorkflowStageFactory(input: {
30
30
  readonly runId: string;
@@ -38,6 +38,7 @@ export function createWorkflowStageFactory(input: {
38
38
  readonly limiter: ConcurrencyLimiter;
39
39
  readonly inputRuntimeDefaults: Partial<StageOptions>;
40
40
  readonly workflowInvocationCwd: string;
41
+ readonly gitWorktreeSetupCache: GitWorktreeSetupCache;
41
42
  readonly stageRegistry: StageControlRegistry;
42
43
  readonly exit: WorkflowExitManager;
43
44
  readonly classifyExecutorFailure: (error: unknown) => WorkflowFailure;
@@ -45,7 +46,7 @@ export function createWorkflowStageFactory(input: {
45
46
  }): (name: string, options?: StageOptions, stageFailFastScope?: ParallelFailFastScope) => StageContextWithMeta {
46
47
  return (name: string, options?: StageOptions, stageFailFastScope?: ParallelFailFastScope): StageContextWithMeta => {
47
48
  input.exit.throwIfWorkflowExitSelected();
48
- options = stageOptionsWithGitWorktree(stageOptionsWithInputDefaults(options, input.inputRuntimeDefaults), input.workflowInvocationCwd);
49
+ options = stageOptionsWithGitWorktree(stageOptionsWithInputDefaults(options, input.inputRuntimeDefaults), input.workflowInvocationCwd, input.gitWorktreeSetupCache);
49
50
  const stageId = crypto.randomUUID();
50
51
  const provisionalParentIds = input.tracker.onSpawn(stageId, name);
51
52
  const scopedParentIds = input.opts.continuation === undefined ? stageFailFastScope?.parentIds : undefined;
@@ -140,7 +140,7 @@ function resolveLongContextWindow(value: WorkflowModelValue): number | undefined
140
140
  return longTier > defaultContextWindow ? longTier : undefined;
141
141
  }
142
142
 
143
- const WORKFLOW_THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"] as const satisfies readonly WorkflowThinkingLevel[];
143
+ const WORKFLOW_THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh", "max"] as const satisfies readonly WorkflowThinkingLevel[];
144
144
  const WORKFLOW_THINKING_LEVEL_SET: ReadonlySet<string> = new Set(WORKFLOW_THINKING_LEVELS);
145
145
 
146
146
  export function splitReasoningSuffix(model: string): { readonly baseModel: string; readonly level?: WorkflowThinkingLevel } {
@@ -5,41 +5,160 @@ import { createGitEnvironment } from "@bastani/atomic";
5
5
  import type { GitResult, GitWorktreeSetupOptions, GitWorktreeSetupResult } from "./worktree-types.js";
6
6
 
7
7
  const DISABLED_GIT_HOOKS_PATH = process.platform === "win32" ? "NUL" : "/dev/null";
8
+ const GIT_COMMAND_TIMEOUT_MS = 60_000;
9
+ const GIT_READ_ONLY_PROBE_TIMEOUT_ATTEMPTS = 2;
8
10
 
9
- export function runGit(cwd: string, args: string[]): GitResult {
10
- const result = spawnSync("git", [
11
+ export type GitRunner = (cwd: string, args: readonly string[]) => GitResult;
12
+
13
+ let gitRunnerOverride: GitRunner | undefined;
14
+
15
+ function gitCommandArgs(args: readonly string[]): string[] {
16
+ return [
11
17
  "-c",
12
18
  `core.hooksPath=${DISABLED_GIT_HOOKS_PATH}`,
13
19
  "-c",
14
20
  "core.fsmonitor=false",
15
21
  ...args,
16
- ], {
22
+ ];
23
+ }
24
+
25
+ function gitCommandArgv(args: readonly string[]): string[] {
26
+ return ["git", ...gitCommandArgs(args)];
27
+ }
28
+
29
+ function withGitResultDiagnostics(result: GitResult, cwd: string, args: readonly string[]): GitResult {
30
+ return {
31
+ ...result,
32
+ argv: result.argv ?? gitCommandArgv(args),
33
+ cwd: result.cwd ?? cwd,
34
+ timeoutMs: result.timeoutMs ?? GIT_COMMAND_TIMEOUT_MS,
35
+ };
36
+ }
37
+
38
+ function runGitProcess(cwd: string, args: readonly string[]): GitResult {
39
+ const startedAt = Date.now();
40
+ const result = spawnSync("git", gitCommandArgs(args), {
17
41
  cwd,
18
42
  encoding: "utf-8",
19
- env: createGitEnvironment({ GIT_OPTIONAL_LOCKS: "0" }),
20
- timeout: 5000,
43
+ env: createGitEnvironment({
44
+ GIT_OPTIONAL_LOCKS: "0",
45
+ GIT_TERMINAL_PROMPT: "0",
46
+ GCM_INTERACTIVE: "never",
47
+ }),
48
+ timeout: GIT_COMMAND_TIMEOUT_MS,
21
49
  });
22
50
  return {
23
51
  stdout: result.stdout ?? "",
24
52
  stderr: result.stderr ?? "",
25
- status: result.status,
53
+ status: result.status ?? null,
54
+ signal: result.signal ?? null,
55
+ elapsedMs: Math.max(0, Date.now() - startedAt),
26
56
  ...(result.error === undefined ? {} : { error: result.error }),
27
57
  };
28
58
  }
29
59
 
30
- export function runGitChecked(cwd: string, args: string[]): string {
31
- const result = runGit(cwd, args);
32
- if (result.status !== 0) {
33
- const command = `git -C ${cwd} ${args.join(" ")}`;
34
- const message = result.stderr.trim() || result.stdout.trim() || `${command} failed`;
35
- throw new Error(message);
60
+ export function withGitRunnerForTest<T>(runner: GitRunner, callback: () => T): T {
61
+ const previous = gitRunnerOverride;
62
+ gitRunnerOverride = runner;
63
+ try {
64
+ return callback();
65
+ } finally {
66
+ gitRunnerOverride = previous;
36
67
  }
68
+ }
69
+
70
+ export function runGit(cwd: string, args: readonly string[]): GitResult {
71
+ return withGitResultDiagnostics((gitRunnerOverride ?? runGitProcess)(cwd, args), cwd, args);
72
+ }
73
+
74
+ export function runGitChecked(cwd: string, args: readonly string[]): string {
75
+ const result = runGit(cwd, args);
76
+ if (result.status !== 0) throw new Error(gitFailureMessage(result));
37
77
  return result.stdout;
38
78
  }
39
79
 
80
+ function gitErrorCode(error: Error): string | undefined {
81
+ return "code" in error ? String((error as Error & { readonly code?: unknown }).code) : undefined;
82
+ }
83
+
84
+ export function isGitTimeoutResult(result: GitResult): boolean {
85
+ const error = result.error;
86
+ if (error === undefined) return false;
87
+ const code = gitErrorCode(error)?.toUpperCase();
88
+ const message = error.message.toLowerCase();
89
+ return code === "ETIMEDOUT" || message.includes("etimedout") || message.includes("timed out");
90
+ }
91
+
92
+ function formatGitDiagnosticArg(value: string): string {
93
+ if (/^[A-Za-z0-9_./:@%+=,\\-]+$/.test(value)) return value;
94
+ return JSON.stringify(value);
95
+ }
96
+
97
+ function formatGitCommand(argv: readonly string[]): string {
98
+ return argv.map(formatGitDiagnosticArg).join(" ");
99
+ }
100
+
101
+ function gitDiagnosticSuffix(result: GitResult): string {
102
+ const details: string[] = [];
103
+ if (result.argv !== undefined && result.argv.length > 0) details.push(`command: ${formatGitCommand(result.argv)}`);
104
+ if (result.cwd !== undefined) details.push(`cwd: ${result.cwd}`);
105
+ if (result.timeoutMs !== undefined) details.push(`timeout: ${result.timeoutMs}ms`);
106
+ if (result.elapsedMs !== undefined) details.push(`elapsed: ${result.elapsedMs}ms`);
107
+ details.push(`status: ${result.status === null ? "null" : result.status}`);
108
+ if (result.signal !== undefined) details.push(`signal: ${result.signal ?? "null"}`);
109
+ if (result.attempts !== undefined && result.attempts > 1) details.push(`attempts: ${result.attempts}`);
110
+ return details.length === 0 ? "" : ` (${details.join("; ")})`;
111
+ }
112
+
40
113
  export function gitFailureMessage(result: GitResult): string {
41
- if (result.error !== undefined) return result.error.message;
42
- return result.stderr.trim() || result.stdout.trim() || `git exited with status ${result.status}`;
114
+ if (result.error !== undefined) {
115
+ const code = gitErrorCode(result.error);
116
+ if (isGitTimeoutResult(result)) {
117
+ return `git command timed out after ${result.timeoutMs ?? GIT_COMMAND_TIMEOUT_MS}ms${code === undefined ? "" : ` (${code})`}: ${result.error.message}${gitDiagnosticSuffix(result)}`;
118
+ }
119
+ return `${code === undefined ? result.error.message : `${code}: ${result.error.message}`}${gitDiagnosticSuffix(result)}`;
120
+ }
121
+ return `${result.stderr.trim() || result.stdout.trim() || `git exited with status ${result.status}`}${gitDiagnosticSuffix(result)}`;
122
+ }
123
+
124
+ function runGitReadOnlyProbe(cwd: string, args: readonly string[]): GitResult {
125
+ let attempts = 1;
126
+ let result = runGit(cwd, args);
127
+ while (attempts < GIT_READ_ONLY_PROBE_TIMEOUT_ATTEMPTS && result.status !== 0 && isGitTimeoutResult(result)) {
128
+ attempts += 1;
129
+ result = runGit(cwd, args);
130
+ }
131
+ return attempts > 1 ? { ...result, attempts } : result;
132
+ }
133
+
134
+ export interface GitWorktreeSetupCache {
135
+ get(options: GitWorktreeSetupOptions): GitWorktreeSetupResult;
136
+ }
137
+
138
+ function gitWorktreeSetupCacheKey(options: GitWorktreeSetupOptions): string {
139
+ return JSON.stringify([
140
+ path.resolve(options.cwd),
141
+ options.gitWorktreeDir.trim(),
142
+ options.baseBranch?.trim() ?? "",
143
+ ]);
144
+ }
145
+
146
+ export function createGitWorktreeSetupCache(): GitWorktreeSetupCache {
147
+ const results = new Map<string, GitWorktreeSetupResult>();
148
+ return {
149
+ get(options) {
150
+ const key = gitWorktreeSetupCacheKey(options);
151
+ const cached = results.get(key);
152
+ if (cached !== undefined) return cached;
153
+ const setup = setupGitWorktree(options);
154
+ results.set(key, setup);
155
+ return setup;
156
+ },
157
+ };
158
+ }
159
+
160
+ export function setupGitWorktreeCached(options: GitWorktreeSetupOptions, cache?: GitWorktreeSetupCache): GitWorktreeSetupResult {
161
+ return cache?.get(options) ?? setupGitWorktree(options);
43
162
  }
44
163
 
45
164
  function quoteShellArg(value: string): string {
@@ -122,22 +241,38 @@ function pathExistsSync(value: string): boolean {
122
241
  }
123
242
 
124
243
  function repositoryRootForGitWorktree(cwd: string): string {
125
- const result = runGit(cwd, ["rev-parse", "--show-toplevel"]);
244
+ const result = runGitReadOnlyProbe(cwd, ["rev-parse", "--show-toplevel"]);
126
245
  if (result.status !== 0) {
246
+ if (isGitTimeoutResult(result)) {
247
+ throw new Error(`Timed out while checking the Git repository for gitWorktreeDir from ${cwd}. Git reported: ${gitFailureMessage(result)}`);
248
+ }
127
249
  throw new Error(`gitWorktreeDir requires the workflow to be invoked from inside a Git repository. Start from a Git checkout or omit gitWorktreeDir. Git reported: ${gitFailureMessage(result)}`);
128
250
  }
129
251
  return result.stdout.trim();
130
252
  }
131
253
 
132
- function gitTopLevel(cwd: string): string | undefined {
133
- const result = runGit(cwd, ["rev-parse", "--show-toplevel"]);
134
- if (result.status !== 0) return undefined;
254
+ export function gitTopLevelFromResult(result: GitResult, cwd: string, description: string): string | undefined {
255
+ if (result.status !== 0) {
256
+ if (isGitTimeoutResult(result)) {
257
+ throw new Error(`Timed out while validating ${description}. Git reported: ${gitFailureMessage(result)}`);
258
+ }
259
+ return undefined;
260
+ }
135
261
  return gitPathFromOutput(result.stdout, cwd);
136
262
  }
137
263
 
264
+ function gitTopLevel(cwd: string): string | undefined {
265
+ return gitTopLevelFromResult(runGitReadOnlyProbe(cwd, ["rev-parse", "--show-toplevel"]), cwd, `gitWorktreeDir ${cwd}`);
266
+ }
267
+
138
268
  function gitCommonDirForWorktree(cwd: string): string {
139
- const result = runGit(cwd, ["rev-parse", "--git-common-dir"]);
140
- if (result.status !== 0) throw new Error(gitFailureMessage(result));
269
+ const result = runGitReadOnlyProbe(cwd, ["rev-parse", "--git-common-dir"]);
270
+ if (result.status !== 0) {
271
+ if (isGitTimeoutResult(result)) {
272
+ throw new Error(`Timed out while validating Git common directory for gitWorktreeDir ${cwd}. Git reported: ${gitFailureMessage(result)}`);
273
+ }
274
+ throw new Error(`Failed to validate Git common directory for gitWorktreeDir ${cwd}. Git reported: ${gitFailureMessage(result)}`);
275
+ }
141
276
  const gitPath = gitPathFromOutput(result.stdout, cwd);
142
277
  if (gitPath === undefined) throw new Error("git rev-parse --git-common-dir returned an empty path");
143
278
  return gitPath;
@@ -65,7 +65,13 @@ export interface GitResult {
65
65
  stdout: string;
66
66
  stderr: string;
67
67
  status: number | null;
68
+ signal?: NodeJS.Signals | null;
68
69
  error?: Error;
70
+ argv?: readonly string[];
71
+ cwd?: string;
72
+ timeoutMs?: number;
73
+ elapsedMs?: number;
74
+ attempts?: number;
69
75
  }
70
76
 
71
77
  export interface GitWorktreeSetupOptions {
@@ -1,4 +1,4 @@
1
- export { setupGitWorktree } from "./worktree-git.js";
1
+ export { createGitWorktreeSetupCache, setupGitWorktree, setupGitWorktreeCached } from "./worktree-git.js";
2
2
  export {
3
3
  cleanupWorktrees,
4
4
  createWorktrees,
@@ -16,3 +16,4 @@ export type {
16
16
  WorktreeSetup,
17
17
  WorktreeTaskCwdConflict,
18
18
  } from "./worktree-types.js";
19
+ export type { GitWorktreeSetupCache } from "./worktree-git.js";
@@ -20,7 +20,7 @@ export type WorkflowInputSchema = TSchema;
20
20
  export type WorkflowOutputSchema = TSchema;
21
21
  export type WorkflowOutputMode = "inline" | "file-only";
22
22
  export type WorkflowContextMode = "fresh" | "fork";
23
- export type WorkflowThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
23
+ export type WorkflowThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
24
24
  export type WorkflowExecutionMode = "interactive" | "non_interactive";
25
25
  export type WorkflowExitStatus = "completed" | "skipped" | "cancelled" | "blocked";
26
26
  export type RunStatus = "pending" | "running" | "paused" | WorkflowExitStatus | "failed" | "killed";
@@ -34,7 +34,7 @@ export interface WorkflowExitOptions<TOutputs extends WorkflowOutputValues = Wor
34
34
  readonly outputs?: WorkflowExitOutputValues<TOutputs>;
35
35
  }
36
36
  export interface WorkflowModelFallbackFields {
37
- /** Ordered model IDs to try after `model` fails; entries may use `:off|minimal|low|medium|high|xhigh` reasoning suffixes. */
37
+ /** Ordered model IDs to try after `model` fails; entries may use `:off|minimal|low|medium|high|xhigh|max` reasoning suffixes. */
38
38
  readonly fallbackModels?: readonly string[];
39
39
  /** Optional deprecated compatibility helper aligned to `fallbackModels`; ignored for entries with a reasoning suffix. */
40
40
  readonly fallbackThinkingLevels?: readonly string[];
@@ -29,7 +29,7 @@ export type WorkflowOutputSchema = TSchema;
29
29
 
30
30
  export type WorkflowOutputMode = "inline" | "file-only";
31
31
  export type WorkflowContextMode = "fresh" | "fork";
32
- export type WorkflowThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
32
+ export type WorkflowThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
33
33
  export type WorkflowExecutionMode = "interactive" | "non_interactive";
34
34
  export type WorkflowExitStatus = "completed" | "skipped" | "cancelled" | "blocked";
35
35
  export type RunStatus = "pending" | "running" | "paused" | WorkflowExitStatus | "failed" | "killed";
@@ -48,7 +48,7 @@ export interface WorkflowExitOptions<TOutputs extends WorkflowOutputValues = Wor
48
48
  }
49
49
 
50
50
  export interface WorkflowModelFallbackFields {
51
- /** Ordered model IDs to try after `model` fails; entries may use `:off|minimal|low|medium|high|xhigh` reasoning suffixes. */
51
+ /** Ordered model IDs to try after `model` fails; entries may use `:off|minimal|low|medium|high|xhigh|max` reasoning suffixes. */
52
52
  readonly fallbackModels?: readonly string[];
53
53
  /** Optional deprecated compatibility helper aligned to `fallbackModels`; ignored for entries with a reasoning suffix. */
54
54
  readonly fallbackThinkingLevels?: readonly string[];
@@ -0,0 +1,2 @@
1
+ export const RESUME_CONTINUATION_PROMPT =
2
+ "Continue where you left off. If you believe you are finished with your original task (or a redefined task if the user told you), stop.";
@@ -0,0 +1,116 @@
1
+ import type { RunEndMetadata } from "./store-public-types.js";
2
+ import type { RunSnapshot, RunStatus, StageSnapshot, WorkflowFailureKind } from "./store-types.js";
3
+ import type { WorkflowOutputValues } from "./types.js";
4
+
5
+ const RETURNED_BLOCKED_STATUSES = new Set([
6
+ "blocked",
7
+ "needs_human",
8
+ "incomplete",
9
+ "auth_blocked",
10
+ "active",
11
+ ]);
12
+
13
+ export interface StructuredRecoverableWorkflowFailure {
14
+ readonly error: string;
15
+ readonly metadata: RunEndMetadata;
16
+ }
17
+
18
+ export function normalizeReturnedWorkflowStatus(status: unknown): string | undefined {
19
+ if (typeof status !== "string") return undefined;
20
+ const normalized = status.trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "");
21
+ return normalized.length > 0 ? normalized : undefined;
22
+ }
23
+
24
+ export function isReturnedBlockedWorkflowStatus(status: string): boolean {
25
+ return RETURNED_BLOCKED_STATUSES.has(status);
26
+ }
27
+
28
+ export function isReturnedResumableBlockedWorkflowStatus(status: string): boolean {
29
+ return status !== "blocked" && isReturnedBlockedWorkflowStatus(status);
30
+ }
31
+
32
+ export function actionableReturnedStatusText(result: WorkflowOutputValues | undefined): string | undefined {
33
+ return stringResultField(result, "summary") ?? stringResultField(result, "remaining_work") ?? stringResultField(result, "result");
34
+ }
35
+
36
+ export function structuredRecoverableWorkflowFailure(
37
+ run: Pick<RunSnapshot,
38
+ | "error"
39
+ | "failureKind"
40
+ | "failureCode"
41
+ | "failureRecoverability"
42
+ | "failureDisposition"
43
+ | "failureMessage"
44
+ | "failedStageId"
45
+ | "retryAfterMs"
46
+ | "stages"
47
+ >,
48
+ ): StructuredRecoverableWorkflowFailure | undefined {
49
+ const runFailure = structuredRecoverableFailureFromSnapshot(run);
50
+ if (runFailure !== undefined) return runFailure;
51
+ if (run.failedStageId === undefined) return undefined;
52
+
53
+ const failedStage = run.stages.find((stage) => stage.id === run.failedStageId);
54
+ return failedStage === undefined
55
+ ? undefined
56
+ : structuredRecoverableFailureFromSnapshot(failedStage, failedStage.id);
57
+ }
58
+
59
+ export function structuredRecoverableWorkflowFailureText(
60
+ run: Pick<RunSnapshot,
61
+ | "error"
62
+ | "failureKind"
63
+ | "failureCode"
64
+ | "failureRecoverability"
65
+ | "failureDisposition"
66
+ | "failureMessage"
67
+ | "failedStageId"
68
+ | "retryAfterMs"
69
+ | "stages"
70
+ >,
71
+ ): string | undefined {
72
+ return structuredRecoverableWorkflowFailure(run)?.error;
73
+ }
74
+
75
+ export function effectiveRunStatus(run: RunSnapshot): RunStatus {
76
+ if (run.status !== "completed") return run.status;
77
+ if (structuredRecoverableWorkflowFailure(run) !== undefined) return "blocked";
78
+ const returnedStatus = normalizeReturnedWorkflowStatus(run.result?.["status"]);
79
+ if (returnedStatus === "failed") return "failed";
80
+ if (returnedStatus !== undefined && isReturnedBlockedWorkflowStatus(returnedStatus)) return "blocked";
81
+ return run.status;
82
+ }
83
+
84
+ function structuredRecoverableFailureFromSnapshot(
85
+ snapshot: Pick<RunSnapshot | StageSnapshot, "error" | "failureKind" | "failureCode" | "failureRecoverability" | "failureDisposition" | "failureMessage" | "retryAfterMs">,
86
+ failedStageId?: string,
87
+ ): StructuredRecoverableWorkflowFailure | undefined {
88
+ if (snapshot.failureDisposition !== "active_blocked") return undefined;
89
+ if (snapshot.failureRecoverability !== "recoverable") return undefined;
90
+ if (!isRecoverableProviderFailureKind(snapshot.failureKind)) return undefined;
91
+ const error = snapshot.error ?? snapshot.failureMessage ?? "Workflow is blocked by a recoverable provider failure.";
92
+ return {
93
+ error,
94
+ metadata: {
95
+ failureKind: snapshot.failureKind,
96
+ ...(snapshot.failureCode !== undefined ? { failureCode: snapshot.failureCode } : {}),
97
+ failureRecoverability: snapshot.failureRecoverability,
98
+ failureDisposition: snapshot.failureDisposition,
99
+ failureMessage: snapshot.failureMessage ?? error,
100
+ ...(failedStageId !== undefined ? { failedStageId } : {}),
101
+ resumable: true,
102
+ ...(snapshot.retryAfterMs !== undefined ? { retryAfterMs: snapshot.retryAfterMs } : {}),
103
+ },
104
+ };
105
+ }
106
+
107
+ function isRecoverableProviderFailureKind(kind: WorkflowFailureKind | undefined): kind is "auth" | "rate_limit" | "provider" {
108
+ return kind === "auth" || kind === "rate_limit" || kind === "provider";
109
+ }
110
+
111
+
112
+
113
+ function stringResultField(result: WorkflowOutputValues | undefined, key: string): string | undefined {
114
+ const value = result?.[key];
115
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
116
+ }
@@ -186,6 +186,8 @@ const PROVIDER_UNAVAILABLE_PHRASES: readonly TokenMatch[] = [
186
186
  ["provider", "error"],
187
187
  ["model", "unavailable"],
188
188
  ["503"],
189
+ ["git", "command", "timed", "out"],
190
+ ["spawnsync", "git", "etimedout"],
189
191
  ];
190
192
 
191
193
  const AUTH_CONTEXT = new Set([
@@ -5,6 +5,7 @@ import {
5
5
  OVERLAY_LINE_COUNT,
6
6
  OVERLAY_VERTICAL_MARGIN_ROWS,
7
7
  } from "./graph-view-constants.js";
8
+ import { WORKFLOW_STATUS_KEY } from "./workflow-status.js";
8
9
  import { GraphViewState } from "./graph-view-state.js";
9
10
  import { renderOutlinePill } from "./header.js";
10
11
  import { NODE_H, NODE_W } from "./layout.js";
@@ -78,12 +79,25 @@ export abstract class GraphViewRenderHelpers extends GraphViewState {
78
79
  * the header band: `backgroundPanel` chrome, outlined accent pill
79
80
  * flush-left, hints flowing right on the centre row.
80
81
  */
82
+ protected _externalStatusText(): string | null {
83
+ const entries = Array.from(this.footerData?.getExtensionStatuses() ?? [])
84
+ .filter(([key, value]) => (
85
+ value.trim().length > 0 &&
86
+ key !== WORKFLOW_STATUS_KEY &&
87
+ !key.startsWith(`${WORKFLOW_STATUS_KEY}:`)
88
+ ))
89
+ .sort(([a], [b]) => a.localeCompare(b));
90
+ if (entries.length === 0) return null;
91
+ return entries.map(([, value]) => value.trim()).join(" · ");
92
+ }
93
+
81
94
  protected _renderStatusline(width: number): string[] {
82
95
  const t = this.graphTheme;
83
96
  const chromeBg = hexBg(t.backgroundPanel);
84
97
  const text = hexToAnsi(t.text);
85
98
  const muted = hexToAnsi(t.textMuted);
86
99
  const dim = hexToAnsi(t.dim);
100
+ const accent = hexToAnsi(t.accent);
87
101
 
88
102
  const {
89
103
  top,
@@ -92,13 +106,17 @@ export abstract class GraphViewRenderHelpers extends GraphViewState {
92
106
  visibleWidth: pillW,
93
107
  } = renderOutlinePill(MODE_PILL_LABEL, t.accent, chromeBg);
94
108
 
95
- // Hints — `<key> <label>` separated by ` · `.
109
+ // Hints — `<key> <label>` separated by ` · `. When other extensions
110
+ // publish status text (for example the async subagent widget), include it
111
+ // ahead of the controls so fullscreen workflow overlays do not hide it.
96
112
  const sep = `${chromeBg} ${dim}·${RESET}${chromeBg} `;
97
- const segments = HINT_KEYS.map(
113
+ const statusText = this._externalStatusText();
114
+ const statusSegment = statusText ? [`${accent}${statusText}${RESET}${chromeBg}`] : [];
115
+ const hintSegments = HINT_KEYS.map(
98
116
  ({ key, label }) =>
99
117
  `${text}${BOLD}${key}${RESET}${chromeBg} ${muted}${label}${RESET}${chromeBg}`,
100
118
  );
101
- const hintsStyledRaw = segments.join(sep);
119
+ const hintsStyledRaw = [...statusSegment, ...hintSegments].join(sep);
102
120
 
103
121
  const leftEdgePad = 1;
104
122
  const rightEdgePad = 2;
@@ -1,3 +1,4 @@
1
+ import type { ReadonlyFooterDataProvider } from "@bastani/atomic";
1
2
  import type { Store } from "../shared/store.js";
2
3
  import type {
3
4
  PendingPrompt,
@@ -63,6 +64,7 @@ export abstract class GraphViewState {
63
64
  protected getViewportRows?: () => number | undefined;
64
65
  protected requestRender?: () => void;
65
66
  protected piKeybindings?: unknown;
67
+ protected footerData?: ReadonlyFooterDataProvider;
66
68
 
67
69
  /** Active HIL prompt state, set when `_rebuildLayout` sees a new prompt id. */
68
70
  protected promptState: PromptCardState | null = null;
@@ -102,6 +104,7 @@ export abstract class GraphViewState {
102
104
  this.getViewportRows = opts.getViewportRows;
103
105
  this.requestRender = opts.requestRender;
104
106
  this.piKeybindings = opts.piKeybindings;
107
+ this.footerData = opts.footerData;
105
108
 
106
109
  this._unsubscribe = this.store.subscribe((snap) => {
107
110
  this.currentSnapshot = snap;
@@ -1,3 +1,4 @@
1
+ import type { ReadonlyFooterDataProvider } from "@bastani/atomic";
1
2
  import type { Store } from "../shared/store.js";
2
3
  import type { GraphTheme } from "./graph-theme.js";
3
4
 
@@ -66,4 +67,6 @@ export interface GraphViewOpts {
66
67
  requestRender?: () => void;
67
68
  /** Host Pi keybindings manager used by run-level prompt cards. */
68
69
  piKeybindings?: unknown;
70
+ /** Host footer/status provider used to surface non-workflow extension statuses inside the fullscreen graph overlay. */
71
+ footerData?: ReadonlyFooterDataProvider;
69
72
  }
@@ -24,7 +24,7 @@ export function renderReadOnlyArchiveBody(
24
24
  }
25
25
 
26
26
  const t = ctx.theme;
27
- const calloutRows = 6;
27
+ const calloutRows = 5;
28
28
  const transcriptBudget = Math.max(1, budget - calloutRows);
29
29
  const lines = ctx.chatHost.renderBody(width, transcriptBudget);
30
30
  const callout: string[] = [];
@@ -46,17 +46,6 @@ export function renderReadOnlyArchiveBody(
46
46
  0,
47
47
  ).render(width),
48
48
  );
49
- callout.push(
50
- ...new Text(
51
- paint("esc", t.accent, { bold: true }) +
52
- paint(" close", t.textMuted) +
53
- paint(" · ", t.dim) +
54
- paint("ctrl+d", t.accent, { bold: true }) +
55
- paint(" return to graph", t.textMuted),
56
- 2,
57
- 0,
58
- ).render(width),
59
- );
60
49
  lines.push(...callout);
61
50
  while (lines.length < budget) lines.push(blankLine(width));
62
51
  if (lines.length > budget) lines.length = budget;
@@ -111,17 +100,6 @@ function renderReadOnlyPromptArchiveBody(
111
100
  bodyLines.push(...new Text(paint("your response", t.textMuted, { bold: true }), 2, 0).render(innerWidth));
112
101
  bodyLines.push(...new Text(paint(answer, answer.startsWith("(") ? t.dim : t.text), 4, 0).render(innerWidth));
113
102
  bodyLines.push("");
114
- bodyLines.push(
115
- ...new Text(
116
- paint("esc", t.accent, { bold: true }) +
117
- paint(" close", t.textMuted) +
118
- paint(" · ", t.dim) +
119
- paint("ctrl+d", t.accent, { bold: true }) +
120
- paint(" return to graph", t.textMuted),
121
- 2,
122
- 0,
123
- ).render(innerWidth),
124
- );
125
103
 
126
104
  const title = stage.status === "skipped" ? "QUESTION SKIPPED" : "QUESTION ASKED";
127
105
  const cardLines = renderRoundedBoxLines({