@bastani/atomic 0.9.9 → 0.9.10

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 (864) hide show
  1. package/CHANGELOG.md +132 -0
  2. package/README.md +2 -0
  3. package/dist/builtin/cursor/CHANGELOG.md +12 -0
  4. package/dist/builtin/cursor/package.json +3 -3
  5. package/dist/builtin/intercom/CHANGELOG.md +30 -0
  6. package/dist/builtin/intercom/README.md +12 -4
  7. package/dist/builtin/intercom/broker/broker.ts +96 -14
  8. package/dist/builtin/intercom/broker/client-message-validation.ts +39 -0
  9. package/dist/builtin/intercom/broker/client.ts +101 -92
  10. package/dist/builtin/intercom/broker/group-isolation.ts +28 -0
  11. package/dist/builtin/intercom/broker/send-handler.ts +62 -10
  12. package/dist/builtin/intercom/broker/send-signature.ts +3 -0
  13. package/dist/builtin/intercom/broker/supervisor-channel.ts +126 -0
  14. package/dist/builtin/intercom/closed-workflow-stage-message.ts +66 -0
  15. package/dist/builtin/intercom/config.ts +10 -0
  16. package/dist/builtin/intercom/contact-supervisor-tool.ts +14 -10
  17. package/dist/builtin/intercom/foreground-detach-handoff.ts +12 -2
  18. package/dist/builtin/intercom/group.ts +46 -0
  19. package/dist/builtin/intercom/inbound-message-admission.ts +79 -0
  20. package/dist/builtin/intercom/incoming-message-delivery.ts +49 -0
  21. package/dist/builtin/intercom/index-heavy.ts +148 -94
  22. package/dist/builtin/intercom/index.ts +66 -4
  23. package/dist/builtin/intercom/intercom-test-seams.ts +6 -0
  24. package/dist/builtin/intercom/intercom-tool.ts +71 -20
  25. package/dist/builtin/intercom/intercom-utils.ts +15 -2
  26. package/dist/builtin/intercom/late-stage-message-router.ts +148 -0
  27. package/dist/builtin/intercom/lifecycle.ts +10 -4
  28. package/dist/builtin/intercom/package.json +2 -2
  29. package/dist/builtin/intercom/reconnect-backoff.ts +6 -0
  30. package/dist/builtin/intercom/reply-tracker.ts +8 -0
  31. package/dist/builtin/intercom/skills/intercom/SKILL.md +2 -0
  32. package/dist/builtin/intercom/stable-delivery-retry.ts +32 -0
  33. package/dist/builtin/intercom/subagent-relay.ts +67 -14
  34. package/dist/builtin/intercom/supervisor-authorization-registry.ts +22 -0
  35. package/dist/builtin/intercom/terminal-ordering-barrier.ts +144 -25
  36. package/dist/builtin/intercom/types.ts +18 -5
  37. package/dist/builtin/intercom/workflow-reply-tracker.ts +19 -0
  38. package/dist/builtin/intercom/workflow-stage-admission.ts +43 -0
  39. package/dist/builtin/intercom/workflow-stage-delivery-failure.ts +77 -0
  40. package/dist/builtin/mcp/CHANGELOG.md +22 -0
  41. package/dist/builtin/mcp/README.md +6 -2
  42. package/dist/builtin/mcp/config.ts +8 -8
  43. package/dist/builtin/mcp/direct-tool-executor.ts +7 -6
  44. package/dist/builtin/mcp/package.json +3 -3
  45. package/dist/builtin/mcp/proxy-call.ts +5 -4
  46. package/dist/builtin/mcp/sampling-handler.ts +7 -2
  47. package/dist/builtin/mcp/tool-call-timeout.ts +101 -0
  48. package/dist/builtin/mcp/tool-result-renderer.ts +3 -2
  49. package/dist/builtin/mcp/types.ts +5 -0
  50. package/dist/builtin/mcp/ui-server.ts +3 -2
  51. package/dist/builtin/subagents/CHANGELOG.md +42 -0
  52. package/dist/builtin/subagents/README.md +6 -3
  53. package/dist/builtin/subagents/agents/code-simplifier.md +1 -1
  54. package/dist/builtin/subagents/agents/codebase-analyzer.md +1 -1
  55. package/dist/builtin/subagents/agents/codebase-locator.md +1 -1
  56. package/dist/builtin/subagents/agents/codebase-online-researcher.md +1 -1
  57. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +1 -1
  58. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +1 -1
  59. package/dist/builtin/subagents/agents/codebase-research-locator.md +1 -1
  60. package/dist/builtin/subagents/agents/debugger.md +1 -1
  61. package/dist/builtin/subagents/agents/worker.md +1 -1
  62. package/dist/builtin/subagents/package.json +4 -4
  63. package/dist/builtin/subagents/skills/subagent/SKILL.md +1 -1
  64. package/dist/builtin/subagents/src/extension/index.ts +37 -61
  65. package/dist/builtin/subagents/src/extension/notification-content.ts +80 -0
  66. package/dist/builtin/subagents/src/extension/schemas.ts +9 -0
  67. package/dist/builtin/subagents/src/extension/tool-description.ts +1 -0
  68. package/dist/builtin/subagents/src/intercom/supervisor-authorization.ts +23 -0
  69. package/dist/builtin/subagents/src/runs/background/async-execution-chain.ts +4 -0
  70. package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +2 -0
  71. package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +4 -0
  72. package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +75 -13
  73. package/dist/builtin/subagents/src/runs/background/async-status.ts +19 -0
  74. package/dist/builtin/subagents/src/runs/background/completion-notification.ts +4 -3
  75. package/dist/builtin/subagents/src/runs/background/notify.ts +76 -15
  76. package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +1 -1
  77. package/dist/builtin/subagents/src/runs/background/subagent-runner-dynamic.ts +13 -0
  78. package/dist/builtin/subagents/src/runs/background/subagent-runner-parallel.ts +1 -0
  79. package/dist/builtin/subagents/src/runs/background/subagent-runner-sequential.ts +1 -0
  80. package/dist/builtin/subagents/src/runs/background/subagent-runner-step.ts +2 -1
  81. package/dist/builtin/subagents/src/runs/background/subagent-runner-types.ts +4 -0
  82. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +13 -0
  83. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +19 -2
  84. package/dist/builtin/subagents/src/runs/foreground/detached-cleanup-barrier.ts +26 -0
  85. package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +19 -30
  86. package/dist/builtin/subagents/src/runs/foreground/execution-intercom-detach.ts +47 -0
  87. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +60 -2
  88. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +21 -0
  89. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +21 -2
  90. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +6 -1
  91. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +2 -0
  92. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +2 -0
  93. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +1 -1
  94. package/dist/builtin/subagents/src/runs/shared/intercom-group.ts +50 -0
  95. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +16 -0
  96. package/dist/builtin/subagents/src/runs/shared/worktree-post-create.ts +75 -0
  97. package/dist/builtin/subagents/src/runs/shared/worktree-root.ts +51 -0
  98. package/dist/builtin/subagents/src/runs/shared/worktree.ts +69 -77
  99. package/dist/builtin/subagents/src/shared/types-config.ts +6 -0
  100. package/dist/builtin/subagents/src/slash/slash-commands.ts +3 -2
  101. package/dist/builtin/subagents/src/tui/render-result-compact.ts +5 -3
  102. package/dist/builtin/subagents/src/tui/render-result.ts +5 -3
  103. package/dist/builtin/subagents/src/tui/render-widget-graph.ts +7 -4
  104. package/dist/builtin/web-access/CHANGELOG.md +22 -0
  105. package/dist/builtin/web-access/extract-frames.ts +14 -13
  106. package/dist/builtin/web-access/extract.ts +2 -2
  107. package/dist/builtin/web-access/gemini-api.ts +0 -3
  108. package/dist/builtin/web-access/gemini-web-config.ts +1 -3
  109. package/dist/builtin/web-access/gemini-web.ts +1 -0
  110. package/dist/builtin/web-access/package.json +2 -2
  111. package/dist/builtin/web-access/perplexity.ts +0 -3
  112. package/dist/builtin/web-access/result-renderers.ts +7 -5
  113. package/dist/builtin/web-access/subprocess.ts +100 -0
  114. package/dist/builtin/web-access/summary-review.ts +14 -3
  115. package/dist/builtin/web-access/video-extract.ts +12 -17
  116. package/dist/builtin/web-access/web-search-browser.ts +18 -10
  117. package/dist/builtin/web-access/web-search-summary.ts +9 -2
  118. package/dist/builtin/web-access/youtube-extract.ts +22 -25
  119. package/dist/builtin/workflows/CHANGELOG.md +153 -0
  120. package/dist/builtin/workflows/README.md +76 -38
  121. package/dist/builtin/workflows/ambient.d.ts +30 -0
  122. package/dist/builtin/workflows/builtin/adversarial-verification-prompts.ts +15 -0
  123. package/dist/builtin/workflows/builtin/adversarial-verification-runner.ts +93 -0
  124. package/dist/builtin/workflows/builtin/adversarial-verification.d.ts +11 -0
  125. package/dist/builtin/workflows/builtin/adversarial-verification.ts +24 -0
  126. package/dist/builtin/workflows/builtin/classify-and-act-prompts.ts +11 -0
  127. package/dist/builtin/workflows/builtin/classify-and-act-runner.ts +110 -0
  128. package/dist/builtin/workflows/builtin/classify-and-act.d.ts +24 -0
  129. package/dist/builtin/workflows/builtin/classify-and-act.ts +35 -0
  130. package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +8 -2
  131. package/dist/builtin/workflows/builtin/fan-out-and-synthesize-prompts.ts +11 -0
  132. package/dist/builtin/workflows/builtin/fan-out-and-synthesize-runner.ts +96 -0
  133. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.d.ts +23 -0
  134. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.ts +32 -0
  135. package/dist/builtin/workflows/builtin/generate-and-filter-prompts.ts +15 -0
  136. package/dist/builtin/workflows/builtin/generate-and-filter-runner.ts +75 -0
  137. package/dist/builtin/workflows/builtin/generate-and-filter.d.ts +11 -0
  138. package/dist/builtin/workflows/builtin/generate-and-filter.ts +26 -0
  139. package/dist/builtin/workflows/builtin/goal-models.ts +72 -0
  140. package/dist/builtin/workflows/builtin/goal-runner.ts +2 -64
  141. package/dist/builtin/workflows/builtin/index.d.ts +44 -0
  142. package/dist/builtin/workflows/builtin/index.ts +6 -0
  143. package/dist/builtin/workflows/builtin/loop-until-done-prompts.ts +79 -0
  144. package/dist/builtin/workflows/builtin/loop-until-done-runner.ts +189 -0
  145. package/dist/builtin/workflows/builtin/loop-until-done.d.ts +34 -0
  146. package/dist/builtin/workflows/builtin/loop-until-done.ts +31 -0
  147. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +6 -1
  148. package/dist/builtin/workflows/builtin/pattern-artifact-root.ts +28 -0
  149. package/dist/builtin/workflows/builtin/ralph-models.ts +26 -5
  150. package/dist/builtin/workflows/builtin/ralph-runner.ts +1 -0
  151. package/dist/builtin/workflows/builtin/tournament-prompts.ts +79 -0
  152. package/dist/builtin/workflows/builtin/tournament-runner.ts +188 -0
  153. package/dist/builtin/workflows/builtin/tournament.d.ts +33 -0
  154. package/dist/builtin/workflows/builtin/tournament.ts +34 -0
  155. package/dist/builtin/workflows/package.json +2 -2
  156. package/dist/builtin/workflows/src/authoring.d.ts +2 -6
  157. package/dist/builtin/workflows/src/durable/backend.ts +163 -120
  158. package/dist/builtin/workflows/src/durable/completed-catalog.ts +37 -64
  159. package/dist/builtin/workflows/src/durable/completed-inspection.ts +4 -72
  160. package/dist/builtin/workflows/src/durable/dbos-backend.ts +242 -195
  161. package/dist/builtin/workflows/src/durable/dbos-embedded-postgres.ts +207 -0
  162. package/dist/builtin/workflows/src/durable/dbos-envelope.ts +42 -42
  163. package/dist/builtin/workflows/src/durable/dbos-lifecycle.ts +155 -0
  164. package/dist/builtin/workflows/src/durable/dbos-local-postgres.ts +126 -0
  165. package/dist/builtin/workflows/src/durable/dbos-metadata.ts +105 -58
  166. package/dist/builtin/workflows/src/durable/dbos-prompt-reservations.ts +320 -0
  167. package/dist/builtin/workflows/src/durable/dbos-sdk-handle.ts +161 -0
  168. package/dist/builtin/workflows/src/durable/dbos-status-transition.ts +62 -0
  169. package/dist/builtin/workflows/src/durable/dbos-tombstone.ts +2 -2
  170. package/dist/builtin/workflows/src/durable/durable-hash.ts +20 -0
  171. package/dist/builtin/workflows/src/durable/factory.ts +23 -83
  172. package/dist/builtin/workflows/src/durable/format-version.ts +4 -10
  173. package/dist/builtin/workflows/src/durable/index.ts +16 -20
  174. package/dist/builtin/workflows/src/durable/local-command.ts +63 -0
  175. package/dist/builtin/workflows/src/durable/prompt-reservation-state.ts +177 -0
  176. package/dist/builtin/workflows/src/durable/prompt-reservations.ts +36 -0
  177. package/dist/builtin/workflows/src/durable/resume-catalog.ts +2 -200
  178. package/dist/builtin/workflows/src/durable/resume-eligibility.ts +42 -2
  179. package/dist/builtin/workflows/src/durable/resume-runtime.ts +121 -118
  180. package/dist/builtin/workflows/src/durable/retention-policy.ts +42 -0
  181. package/dist/builtin/workflows/src/durable/run-timing.ts +98 -0
  182. package/dist/builtin/workflows/src/durable/scoped-backend.ts +62 -14
  183. package/dist/builtin/workflows/src/durable/stage-primitive.ts +15 -2
  184. package/dist/builtin/workflows/src/durable/tool-primitive.ts +11 -7
  185. package/dist/builtin/workflows/src/durable/types.ts +25 -18
  186. package/dist/builtin/workflows/src/durable/ui-primitive.ts +117 -29
  187. package/dist/builtin/workflows/src/durable/workflow-status-transition.ts +30 -0
  188. package/dist/builtin/workflows/src/engine/primitives/parallel.ts +20 -5
  189. package/dist/builtin/workflows/src/engine/primitives/task.ts +3 -2
  190. package/dist/builtin/workflows/src/engine/primitives/ui.ts +6 -3
  191. package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +14 -22
  192. package/dist/builtin/workflows/src/engine/run-durable-stage-session.ts +14 -14
  193. package/dist/builtin/workflows/src/engine/run.ts +35 -37
  194. package/dist/builtin/workflows/src/engine/runtime.ts +3 -0
  195. package/dist/builtin/workflows/src/engine/workflow-activity.ts +9 -0
  196. package/dist/builtin/workflows/src/extension/completed-stage-intercom-ask.ts +155 -0
  197. package/dist/builtin/workflows/src/extension/config-file-loader.ts +13 -0
  198. package/dist/builtin/workflows/src/extension/config-loader.ts +20 -0
  199. package/dist/builtin/workflows/src/extension/dispatcher.ts +56 -17
  200. package/dist/builtin/workflows/src/extension/extension-factory.ts +13 -10
  201. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +37 -59
  202. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +16 -18
  203. package/dist/builtin/workflows/src/extension/lifecycle-notification-delivery.ts +83 -0
  204. package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +80 -41
  205. package/dist/builtin/workflows/src/extension/postmortem-deps.ts +73 -0
  206. package/dist/builtin/workflows/src/extension/public-types.ts +11 -51
  207. package/dist/builtin/workflows/src/extension/render-call.ts +3 -9
  208. package/dist/builtin/workflows/src/extension/render-result.ts +22 -7
  209. package/dist/builtin/workflows/src/extension/runtime-active-block-claim.ts +78 -0
  210. package/dist/builtin/workflows/src/extension/runtime-durable-resume.ts +50 -29
  211. package/dist/builtin/workflows/src/extension/runtime.ts +70 -219
  212. package/dist/builtin/workflows/src/extension/ui-surface.ts +107 -3
  213. package/dist/builtin/workflows/src/extension/wiring.ts +76 -7
  214. package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +10 -5
  215. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +27 -5
  216. package/dist/builtin/workflows/src/extension/workflow-durable-resume-command.ts +49 -19
  217. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +8 -8
  218. package/dist/builtin/workflows/src/extension/workflow-resume-picker-rows.ts +81 -0
  219. package/dist/builtin/workflows/src/extension/workflow-resume-shadow.ts +55 -0
  220. package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +193 -145
  221. package/dist/builtin/workflows/src/extension/workflow-schema.ts +9 -133
  222. package/dist/builtin/workflows/src/extension/workflow-status-summary.ts +189 -0
  223. package/dist/builtin/workflows/src/extension/workflow-targets.ts +1 -1
  224. package/dist/builtin/workflows/src/extension/workflow-tool-content.ts +78 -3
  225. package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +185 -89
  226. package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +92 -11
  227. package/dist/builtin/workflows/src/extension/workflow-tool.ts +18 -24
  228. package/dist/builtin/workflows/src/runs/background/durable-resume-transition.ts +63 -0
  229. package/dist/builtin/workflows/src/runs/background/quit.ts +139 -29
  230. package/dist/builtin/workflows/src/runs/background/resume-acknowledgements.ts +97 -0
  231. package/dist/builtin/workflows/src/runs/background/run-inspect.ts +111 -0
  232. package/dist/builtin/workflows/src/runs/background/runner.ts +46 -17
  233. package/dist/builtin/workflows/src/runs/background/startup-admission.ts +77 -0
  234. package/dist/builtin/workflows/src/runs/background/status.ts +133 -224
  235. package/dist/builtin/workflows/src/runs/background/workflow-lifecycle-aggregate.ts +44 -0
  236. package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +57 -256
  237. package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +7 -4
  238. package/dist/builtin/workflows/src/runs/foreground/executor-lifecycle.ts +12 -1
  239. package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +39 -0
  240. package/dist/builtin/workflows/src/runs/foreground/executor-queued-user-message.ts +75 -0
  241. package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +44 -12
  242. package/dist/builtin/workflows/src/runs/foreground/executor-stage-control.ts +63 -12
  243. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +30 -4
  244. package/dist/builtin/workflows/src/runs/foreground/executor-stage-replay.ts +3 -0
  245. package/dist/builtin/workflows/src/runs/foreground/executor-stage-types.ts +4 -1
  246. package/dist/builtin/workflows/src/runs/foreground/executor-task-prompts.ts +0 -67
  247. package/dist/builtin/workflows/src/runs/foreground/executor-types.ts +6 -0
  248. package/dist/builtin/workflows/src/runs/foreground/executor.ts +0 -1
  249. package/dist/builtin/workflows/src/runs/foreground/postmortem-stage-chat.ts +169 -0
  250. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +38 -1
  251. package/dist/builtin/workflows/src/runs/foreground/stage-runner-candidate.ts +21 -0
  252. package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +21 -3
  253. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +85 -84
  254. package/dist/builtin/workflows/src/runs/foreground/stage-runner-message-admission.ts +195 -0
  255. package/dist/builtin/workflows/src/runs/foreground/stage-runner-options.ts +12 -5
  256. package/dist/builtin/workflows/src/runs/foreground/stage-runner-replacement.ts +42 -0
  257. package/dist/builtin/workflows/src/runs/foreground/stage-runner-send-user-message.ts +100 -8
  258. package/dist/builtin/workflows/src/runs/foreground/stage-runner-session-options.ts +51 -0
  259. package/dist/builtin/workflows/src/runs/foreground/stage-runner-session.ts +19 -0
  260. package/dist/builtin/workflows/src/runs/foreground/stage-runner-types.ts +28 -2
  261. package/dist/builtin/workflows/src/runs/shared/prompt-callsite.ts +4 -6
  262. package/dist/builtin/workflows/src/runs/shared/worktree-git-runner.ts +89 -0
  263. package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +29 -133
  264. package/dist/builtin/workflows/src/runs/shared/worktree-post-create.ts +130 -0
  265. package/dist/builtin/workflows/src/runs/shared/worktree-root.ts +84 -0
  266. package/dist/builtin/workflows/src/runs/shared/worktree-setup.ts +77 -63
  267. package/dist/builtin/workflows/src/runs/shared/worktree-types.ts +4 -0
  268. package/dist/builtin/workflows/src/sdk-surface.ts +1 -1
  269. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +29 -22
  270. package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +26 -24
  271. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +5 -0
  272. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +5 -0
  273. package/dist/builtin/workflows/src/shared/intercom-group.ts +51 -0
  274. package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +6 -0
  275. package/dist/builtin/workflows/src/shared/persistence-restore.ts +4 -0
  276. package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +3 -0
  277. package/dist/builtin/workflows/src/shared/prompt-callsite-context.ts +13 -0
  278. package/dist/builtin/workflows/src/shared/returned-run-status.ts +2 -1
  279. package/dist/builtin/workflows/src/shared/session-transcript.ts +74 -0
  280. package/dist/builtin/workflows/src/shared/store-stage-methods.ts +1 -0
  281. package/dist/builtin/workflows/src/shared/store-types.ts +8 -0
  282. package/dist/builtin/workflows/src/shared/timing.ts +4 -1
  283. package/dist/builtin/workflows/src/shared/types.ts +2 -6
  284. package/dist/builtin/workflows/src/tui/chat-surface-message.ts +2 -42
  285. package/dist/builtin/workflows/src/tui/dispatch-confirm.ts +2 -2
  286. package/dist/builtin/workflows/src/tui/graph-view-constants.ts +7 -3
  287. package/dist/builtin/workflows/src/tui/graph-view-input.ts +29 -67
  288. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +15 -10
  289. package/dist/builtin/workflows/src/tui/graph-view-state.ts +0 -2
  290. package/dist/builtin/workflows/src/tui/graph-view-types.ts +3 -9
  291. package/dist/builtin/workflows/src/tui/host-input-form.ts +62 -0
  292. package/dist/builtin/workflows/src/tui/mouse-input.ts +63 -0
  293. package/dist/builtin/workflows/src/tui/node-card.ts +1 -0
  294. package/dist/builtin/workflows/src/tui/overlay-adapter.ts +67 -42
  295. package/dist/builtin/workflows/src/tui/overlay-terminal-modes.ts +49 -0
  296. package/dist/builtin/workflows/src/tui/session-overlays.ts +3 -104
  297. package/dist/builtin/workflows/src/tui/session-picker.ts +3 -12
  298. package/dist/builtin/workflows/src/tui/stage-chat-composer-drafts.ts +19 -0
  299. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +30 -10
  300. package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +19 -9
  301. package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +25 -38
  302. package/dist/builtin/workflows/src/tui/stage-chat-view-render-helpers.ts +1 -1
  303. package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +7 -6
  304. package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +7 -1
  305. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +3 -1
  306. package/dist/builtin/workflows/src/tui/store-widget-installer.ts +19 -20
  307. package/dist/builtin/workflows/src/tui/switcher.ts +4 -4
  308. package/dist/builtin/workflows/src/tui/widget.ts +46 -33
  309. package/dist/builtin/workflows/src/tui/workflow-attach-pane-handle.ts +26 -0
  310. package/dist/builtin/workflows/src/tui/workflow-attach-pane-types.ts +14 -2
  311. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +26 -27
  312. package/dist/builtin/workflows/src/tui/workflow-resume-selector.ts +208 -69
  313. package/dist/bun/cli.js +3 -0
  314. package/dist/bun/cli.js.map +1 -1
  315. package/dist/cli/session-picker.d.ts.map +1 -1
  316. package/dist/cli/session-picker.js +3 -0
  317. package/dist/cli/session-picker.js.map +1 -1
  318. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  319. package/dist/core/agent-session-auto-compaction.js +19 -2
  320. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  321. package/dist/core/agent-session-compaction.js +2 -2
  322. package/dist/core/agent-session-compaction.js.map +1 -1
  323. package/dist/core/agent-session-events.d.ts.map +1 -1
  324. package/dist/core/agent-session-events.js +5 -3
  325. package/dist/core/agent-session-events.js.map +1 -1
  326. package/dist/core/agent-session-export.js +1 -1
  327. package/dist/core/agent-session-export.js.map +1 -1
  328. package/dist/core/agent-session-extension-bindings.d.ts +2 -4
  329. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  330. package/dist/core/agent-session-extension-bindings.js +9 -2
  331. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  332. package/dist/core/agent-session-message-queue.d.ts +6 -0
  333. package/dist/core/agent-session-message-queue.d.ts.map +1 -1
  334. package/dist/core/agent-session-message-queue.js +107 -36
  335. package/dist/core/agent-session-message-queue.js.map +1 -1
  336. package/dist/core/agent-session-methods.d.ts +18 -7
  337. package/dist/core/agent-session-methods.d.ts.map +1 -1
  338. package/dist/core/agent-session-methods.js.map +1 -1
  339. package/dist/core/agent-session-models.d.ts +3 -1
  340. package/dist/core/agent-session-models.d.ts.map +1 -1
  341. package/dist/core/agent-session-models.js +1 -1
  342. package/dist/core/agent-session-models.js.map +1 -1
  343. package/dist/core/agent-session-post-tool-compaction.d.ts +16 -0
  344. package/dist/core/agent-session-post-tool-compaction.d.ts.map +1 -0
  345. package/dist/core/agent-session-post-tool-compaction.js +113 -0
  346. package/dist/core/agent-session-post-tool-compaction.js.map +1 -0
  347. package/dist/core/agent-session-prompt.d.ts +12 -1
  348. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  349. package/dist/core/agent-session-prompt.js +22 -5
  350. package/dist/core/agent-session-prompt.js.map +1 -1
  351. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  352. package/dist/core/agent-session-runtime.js +3 -0
  353. package/dist/core/agent-session-runtime.js.map +1 -1
  354. package/dist/core/agent-session-tool-hooks.d.ts.map +1 -1
  355. package/dist/core/agent-session-tool-hooks.js +21 -0
  356. package/dist/core/agent-session-tool-hooks.js.map +1 -1
  357. package/dist/core/agent-session-tree.d.ts.map +1 -1
  358. package/dist/core/agent-session-tree.js +2 -1
  359. package/dist/core/agent-session-tree.js.map +1 -1
  360. package/dist/core/agent-session-types.d.ts +7 -0
  361. package/dist/core/agent-session-types.d.ts.map +1 -1
  362. package/dist/core/agent-session-types.js.map +1 -1
  363. package/dist/core/agent-session.d.ts +6 -0
  364. package/dist/core/agent-session.d.ts.map +1 -1
  365. package/dist/core/agent-session.js +18 -1
  366. package/dist/core/agent-session.js.map +1 -1
  367. package/dist/core/async/job-manager.d.ts +1 -0
  368. package/dist/core/async/job-manager.d.ts.map +1 -1
  369. package/dist/core/async/job-manager.js +29 -5
  370. package/dist/core/async/job-manager.js.map +1 -1
  371. package/dist/core/async/session-manager.d.ts +2 -4
  372. package/dist/core/async/session-manager.d.ts.map +1 -1
  373. package/dist/core/async/session-manager.js +5 -32
  374. package/dist/core/async/session-manager.js.map +1 -1
  375. package/dist/core/atomic-guide-command.d.ts.map +1 -1
  376. package/dist/core/atomic-guide-command.js +2 -0
  377. package/dist/core/atomic-guide-command.js.map +1 -1
  378. package/dist/core/auth-storage.d.ts +20 -10
  379. package/dist/core/auth-storage.d.ts.map +1 -1
  380. package/dist/core/auth-storage.js +151 -92
  381. package/dist/core/auth-storage.js.map +1 -1
  382. package/dist/core/callback-activity.d.ts +27 -0
  383. package/dist/core/callback-activity.d.ts.map +1 -0
  384. package/dist/core/callback-activity.js +44 -0
  385. package/dist/core/callback-activity.js.map +1 -0
  386. package/dist/core/compaction/branch-summarization.d.ts +4 -1
  387. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  388. package/dist/core/compaction/branch-summarization.js +4 -3
  389. package/dist/core/compaction/branch-summarization.js.map +1 -1
  390. package/dist/core/compaction/compaction-boundary.d.ts +1 -1
  391. package/dist/core/compaction/compaction-boundary.d.ts.map +1 -1
  392. package/dist/core/compaction/compaction-boundary.js +10 -23
  393. package/dist/core/compaction/compaction-boundary.js.map +1 -1
  394. package/dist/core/compaction/compaction-runner.d.ts +4 -1
  395. package/dist/core/compaction/compaction-runner.d.ts.map +1 -1
  396. package/dist/core/compaction/compaction-runner.js +1 -1
  397. package/dist/core/compaction/compaction-runner.js.map +1 -1
  398. package/dist/core/compaction/compaction-types.d.ts +3 -2
  399. package/dist/core/compaction/compaction-types.d.ts.map +1 -1
  400. package/dist/core/compaction/compaction-types.js.map +1 -1
  401. package/dist/core/compaction/compaction.d.ts +6 -6
  402. package/dist/core/compaction/compaction.d.ts.map +1 -1
  403. package/dist/core/compaction/compaction.js +12 -9
  404. package/dist/core/compaction/compaction.js.map +1 -1
  405. package/dist/core/compaction/index.d.ts +1 -0
  406. package/dist/core/compaction/index.d.ts.map +1 -1
  407. package/dist/core/compaction/index.js +1 -0
  408. package/dist/core/compaction/index.js.map +1 -1
  409. package/dist/core/compaction/range-planner-diagnostics.d.ts +101 -0
  410. package/dist/core/compaction/range-planner-diagnostics.d.ts.map +1 -0
  411. package/dist/core/compaction/range-planner-diagnostics.js +116 -0
  412. package/dist/core/compaction/range-planner-diagnostics.js.map +1 -0
  413. package/dist/core/compaction/range-planner.d.ts +13 -3
  414. package/dist/core/compaction/range-planner.d.ts.map +1 -1
  415. package/dist/core/compaction/range-planner.js +117 -68
  416. package/dist/core/compaction/range-planner.js.map +1 -1
  417. package/dist/core/compaction/truncated-range-recovery.d.ts +47 -0
  418. package/dist/core/compaction/truncated-range-recovery.d.ts.map +1 -0
  419. package/dist/core/compaction/truncated-range-recovery.js +112 -0
  420. package/dist/core/compaction/truncated-range-recovery.js.map +1 -0
  421. package/dist/core/extensions/api-types.d.ts +2 -2
  422. package/dist/core/extensions/api-types.d.ts.map +1 -1
  423. package/dist/core/extensions/api-types.js.map +1 -1
  424. package/dist/core/extensions/context-types.d.ts +23 -1
  425. package/dist/core/extensions/context-types.d.ts.map +1 -1
  426. package/dist/core/extensions/context-types.js.map +1 -1
  427. package/dist/core/extensions/index.d.ts +1 -1
  428. package/dist/core/extensions/index.d.ts.map +1 -1
  429. package/dist/core/extensions/index.js.map +1 -1
  430. package/dist/core/extensions/loader-api.js +2 -2
  431. package/dist/core/extensions/loader-api.js.map +1 -1
  432. package/dist/core/extensions/loader-core.d.ts.map +1 -1
  433. package/dist/core/extensions/loader-core.js +8 -1
  434. package/dist/core/extensions/loader-core.js.map +1 -1
  435. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  436. package/dist/core/extensions/loader-virtual-modules.js +9 -6
  437. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  438. package/dist/core/extensions/message-types.d.ts +17 -0
  439. package/dist/core/extensions/message-types.d.ts.map +1 -1
  440. package/dist/core/extensions/message-types.js.map +1 -1
  441. package/dist/core/extensions/provider-types.d.ts +3 -0
  442. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  443. package/dist/core/extensions/provider-types.js.map +1 -1
  444. package/dist/core/extensions/runner-events.d.ts.map +1 -1
  445. package/dist/core/extensions/runner-events.js +11 -10
  446. package/dist/core/extensions/runner-events.js.map +1 -1
  447. package/dist/core/extensions/runtime-types.d.ts +2 -2
  448. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  449. package/dist/core/extensions/runtime-types.js.map +1 -1
  450. package/dist/core/extensions/ui-types.d.ts +78 -0
  451. package/dist/core/extensions/ui-types.d.ts.map +1 -1
  452. package/dist/core/extensions/ui-types.js.map +1 -1
  453. package/dist/core/model-registry-auth.d.ts +2 -1
  454. package/dist/core/model-registry-auth.d.ts.map +1 -1
  455. package/dist/core/model-registry-auth.js +25 -6
  456. package/dist/core/model-registry-auth.js.map +1 -1
  457. package/dist/core/model-registry-builtins.d.ts +3 -2
  458. package/dist/core/model-registry-builtins.d.ts.map +1 -1
  459. package/dist/core/model-registry-builtins.js +12 -6
  460. package/dist/core/model-registry-builtins.js.map +1 -1
  461. package/dist/core/model-registry-dynamic.d.ts +1 -0
  462. package/dist/core/model-registry-dynamic.d.ts.map +1 -1
  463. package/dist/core/model-registry-dynamic.js +53 -13
  464. package/dist/core/model-registry-dynamic.js.map +1 -1
  465. package/dist/core/model-registry-loader.d.ts +2 -1
  466. package/dist/core/model-registry-loader.d.ts.map +1 -1
  467. package/dist/core/model-registry-loader.js +2 -2
  468. package/dist/core/model-registry-loader.js.map +1 -1
  469. package/dist/core/model-registry-types.d.ts +10 -3
  470. package/dist/core/model-registry-types.d.ts.map +1 -1
  471. package/dist/core/model-registry-types.js.map +1 -1
  472. package/dist/core/model-registry.d.ts +15 -1
  473. package/dist/core/model-registry.d.ts.map +1 -1
  474. package/dist/core/model-registry.js +214 -30
  475. package/dist/core/model-registry.js.map +1 -1
  476. package/dist/core/models-store.d.ts +25 -0
  477. package/dist/core/models-store.d.ts.map +1 -0
  478. package/dist/core/models-store.js +73 -0
  479. package/dist/core/models-store.js.map +1 -0
  480. package/dist/core/oauth-compat.d.ts +17 -0
  481. package/dist/core/oauth-compat.d.ts.map +1 -0
  482. package/dist/core/oauth-compat.js +2 -0
  483. package/dist/core/oauth-compat.js.map +1 -0
  484. package/dist/core/oauth-provider-bridge.d.ts +40 -0
  485. package/dist/core/oauth-provider-bridge.d.ts.map +1 -0
  486. package/dist/core/oauth-provider-bridge.js +169 -0
  487. package/dist/core/oauth-provider-bridge.js.map +1 -0
  488. package/dist/core/output-guard.d.ts +2 -0
  489. package/dist/core/output-guard.d.ts.map +1 -1
  490. package/dist/core/output-guard.js +14 -0
  491. package/dist/core/output-guard.js.map +1 -1
  492. package/dist/core/remote-catalog-provider.d.ts +5 -0
  493. package/dist/core/remote-catalog-provider.d.ts.map +1 -0
  494. package/dist/core/remote-catalog-provider.js +138 -0
  495. package/dist/core/remote-catalog-provider.js.map +1 -0
  496. package/dist/core/sdk.d.ts.map +1 -1
  497. package/dist/core/sdk.js +8 -3
  498. package/dist/core/sdk.js.map +1 -1
  499. package/dist/core/session-manager-core.d.ts +1 -1
  500. package/dist/core/session-manager-core.d.ts.map +1 -1
  501. package/dist/core/session-manager-core.js +1 -1
  502. package/dist/core/session-manager-core.js.map +1 -1
  503. package/dist/core/session-manager-entries.d.ts +1 -1
  504. package/dist/core/session-manager-entries.d.ts.map +1 -1
  505. package/dist/core/session-manager-entries.js.map +1 -1
  506. package/dist/core/session-manager-history.d.ts +2 -2
  507. package/dist/core/session-manager-history.js +2 -2
  508. package/dist/core/session-manager-history.js.map +1 -1
  509. package/dist/core/session-manager-list.d.ts.map +1 -1
  510. package/dist/core/session-manager-list.js +65 -23
  511. package/dist/core/session-manager-list.js.map +1 -1
  512. package/dist/core/session-manager-types.d.ts +3 -2
  513. package/dist/core/session-manager-types.d.ts.map +1 -1
  514. package/dist/core/session-manager-types.js.map +1 -1
  515. package/dist/core/slash-commands.d.ts.map +1 -1
  516. package/dist/core/slash-commands.js +9 -5
  517. package/dist/core/slash-commands.js.map +1 -1
  518. package/dist/core/tools/bash.d.ts.map +1 -1
  519. package/dist/core/tools/bash.js +2 -3
  520. package/dist/core/tools/bash.js.map +1 -1
  521. package/dist/core/tools/find.js +2 -2
  522. package/dist/core/tools/find.js.map +1 -1
  523. package/dist/core/tools/grep.js +2 -2
  524. package/dist/core/tools/grep.js.map +1 -1
  525. package/dist/core/tools/ls.js +2 -2
  526. package/dist/core/tools/ls.js.map +1 -1
  527. package/dist/core/tools/read.d.ts.map +1 -1
  528. package/dist/core/tools/read.js +4 -3
  529. package/dist/core/tools/read.js.map +1 -1
  530. package/dist/core/tools/todos-render.d.ts.map +1 -1
  531. package/dist/core/tools/todos-render.js +3 -2
  532. package/dist/core/tools/todos-render.js.map +1 -1
  533. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  534. package/dist/core/tools/tool-definition-wrapper.js +3 -2
  535. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  536. package/dist/core/tools/write.js +2 -2
  537. package/dist/core/tools/write.js.map +1 -1
  538. package/dist/core/workflow-stage-admission.d.ts +29 -0
  539. package/dist/core/workflow-stage-admission.d.ts.map +1 -0
  540. package/dist/core/workflow-stage-admission.js +81 -0
  541. package/dist/core/workflow-stage-admission.js.map +1 -0
  542. package/dist/index-extensions.d.ts +1 -1
  543. package/dist/index-extensions.d.ts.map +1 -1
  544. package/dist/index-extensions.js.map +1 -1
  545. package/dist/index.d.ts +4 -1
  546. package/dist/index.d.ts.map +1 -1
  547. package/dist/index.js +4 -1
  548. package/dist/index.js.map +1 -1
  549. package/dist/main-types.d.ts +13 -0
  550. package/dist/main-types.d.ts.map +1 -0
  551. package/dist/main-types.js +2 -0
  552. package/dist/main-types.js.map +1 -0
  553. package/dist/main.d.ts +2 -5
  554. package/dist/main.d.ts.map +1 -1
  555. package/dist/main.js +25 -17
  556. package/dist/main.js.map +1 -1
  557. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  558. package/dist/modes/interactive/components/assistant-message.js +17 -12
  559. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  560. package/dist/modes/interactive/components/atomic-banner.d.ts +7 -0
  561. package/dist/modes/interactive/components/atomic-banner.d.ts.map +1 -1
  562. package/dist/modes/interactive/components/atomic-banner.js +20 -0
  563. package/dist/modes/interactive/components/atomic-banner.js.map +1 -1
  564. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  565. package/dist/modes/interactive/components/bash-execution.js +5 -3
  566. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  567. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  568. package/dist/modes/interactive/components/branch-summary-message.js +3 -4
  569. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  570. package/dist/modes/interactive/components/chat-message-renderer.d.ts +4 -0
  571. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  572. package/dist/modes/interactive/components/chat-message-renderer.js +4 -0
  573. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  574. package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
  575. package/dist/modes/interactive/components/chat-session-host-events.js +79 -8
  576. package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
  577. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -1
  578. package/dist/modes/interactive/components/chat-session-host-rendering.js +4 -2
  579. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  580. package/dist/modes/interactive/components/chat-session-host.d.ts +1 -0
  581. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  582. package/dist/modes/interactive/components/chat-session-host.js +4 -1
  583. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  584. package/dist/modes/interactive/components/compaction-boundary-message.d.ts.map +1 -1
  585. package/dist/modes/interactive/components/compaction-boundary-message.js +3 -4
  586. package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -1
  587. package/dist/modes/interactive/components/host-input-form-mount.d.ts +14 -0
  588. package/dist/modes/interactive/components/host-input-form-mount.d.ts.map +1 -0
  589. package/dist/modes/interactive/components/host-input-form-mount.js +79 -0
  590. package/dist/modes/interactive/components/host-input-form-mount.js.map +1 -0
  591. package/dist/modes/interactive/components/host-input-form.d.ts +52 -0
  592. package/dist/modes/interactive/components/host-input-form.d.ts.map +1 -0
  593. package/dist/modes/interactive/components/host-input-form.js +278 -0
  594. package/dist/modes/interactive/components/host-input-form.js.map +1 -0
  595. package/dist/modes/interactive/components/host-session-picker.d.ts +46 -0
  596. package/dist/modes/interactive/components/host-session-picker.d.ts.map +1 -0
  597. package/dist/modes/interactive/components/host-session-picker.js +183 -0
  598. package/dist/modes/interactive/components/host-session-picker.js.map +1 -0
  599. package/dist/modes/interactive/components/index.d.ts +1 -1
  600. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  601. package/dist/modes/interactive/components/index.js +1 -1
  602. package/dist/modes/interactive/components/index.js.map +1 -1
  603. package/dist/modes/interactive/components/keybinding-hints.d.ts +2 -0
  604. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  605. package/dist/modes/interactive/components/keybinding-hints.js +12 -0
  606. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  607. package/dist/modes/interactive/components/login-dialog.d.ts +3 -1
  608. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  609. package/dist/modes/interactive/components/login-dialog.js +8 -2
  610. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  611. package/dist/modes/interactive/components/model-selector.d.ts +7 -1
  612. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  613. package/dist/modes/interactive/components/model-selector.js +57 -10
  614. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  615. package/dist/modes/interactive/components/session-selector.d.ts +15 -0
  616. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  617. package/dist/modes/interactive/components/session-selector.js +35 -3
  618. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  619. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  620. package/dist/modes/interactive/components/skill-invocation-message.js +3 -2
  621. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  622. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  623. package/dist/modes/interactive/components/tool-execution.js +9 -0
  624. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  625. package/dist/modes/interactive/interactive-agent-events.js +24 -10
  626. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  627. package/dist/modes/interactive/interactive-auth-login.js +7 -1
  628. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  629. package/dist/modes/interactive/interactive-auth-routing.js +3 -3
  630. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  631. package/dist/modes/interactive/interactive-autocomplete.js +49 -0
  632. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  633. package/dist/modes/interactive/interactive-bash-compact.js +2 -0
  634. package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
  635. package/dist/modes/interactive/interactive-extension-context.js +14 -0
  636. package/dist/modes/interactive/interactive-extension-context.js.map +1 -1
  637. package/dist/modes/interactive/interactive-extension-runtime.js +1 -1
  638. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  639. package/dist/modes/interactive/interactive-global-clear.d.ts +13 -0
  640. package/dist/modes/interactive/interactive-global-clear.d.ts.map +1 -0
  641. package/dist/modes/interactive/interactive-global-clear.js +11 -0
  642. package/dist/modes/interactive/interactive-global-clear.js.map +1 -0
  643. package/dist/modes/interactive/interactive-input-handling.js +17 -10
  644. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  645. package/dist/modes/interactive/interactive-mode-base.d.ts +6 -1
  646. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  647. package/dist/modes/interactive/interactive-mode-base.js +25 -2
  648. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  649. package/dist/modes/interactive/interactive-mode-deps.d.ts +4 -3
  650. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  651. package/dist/modes/interactive/interactive-mode-deps.js +2 -2
  652. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  653. package/dist/modes/interactive/interactive-mode-helpers.d.ts +4 -1
  654. package/dist/modes/interactive/interactive-mode-helpers.d.ts.map +1 -1
  655. package/dist/modes/interactive/interactive-mode-helpers.js +14 -1
  656. package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -1
  657. package/dist/modes/interactive/interactive-mode-surface.d.ts +3 -2
  658. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  659. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  660. package/dist/modes/interactive/interactive-mode-types.d.ts +3 -0
  661. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  662. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  663. package/dist/modes/interactive/interactive-model-routing.js +7 -4
  664. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  665. package/dist/modes/interactive/interactive-queueing.js +2 -2
  666. package/dist/modes/interactive/interactive-queueing.js.map +1 -1
  667. package/dist/modes/interactive/interactive-render-chat.js +25 -4
  668. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  669. package/dist/modes/interactive/interactive-session-routing.js +3 -0
  670. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  671. package/dist/modes/interactive/interactive-slash-commands.js +5 -2
  672. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  673. package/dist/modes/interactive/interactive-startup.d.ts +1 -1
  674. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  675. package/dist/modes/interactive/interactive-startup.js +22 -9
  676. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  677. package/dist/modes/interactive/interactive-terminal-title.d.ts +6 -0
  678. package/dist/modes/interactive/interactive-terminal-title.d.ts.map +1 -0
  679. package/dist/modes/interactive/interactive-terminal-title.js +7 -0
  680. package/dist/modes/interactive/interactive-terminal-title.js.map +1 -0
  681. package/dist/modes/interactive-engine/activity-watchdog.d.ts +45 -0
  682. package/dist/modes/interactive-engine/activity-watchdog.d.ts.map +1 -0
  683. package/dist/modes/interactive-engine/activity-watchdog.js +74 -0
  684. package/dist/modes/interactive-engine/activity-watchdog.js.map +1 -0
  685. package/dist/modes/interactive-engine/create-isolated-runtime.d.ts +14 -0
  686. package/dist/modes/interactive-engine/create-isolated-runtime.d.ts.map +1 -0
  687. package/dist/modes/interactive-engine/create-isolated-runtime.js +56 -0
  688. package/dist/modes/interactive-engine/create-isolated-runtime.js.map +1 -0
  689. package/dist/modes/interactive-engine/engine-args.d.ts +10 -0
  690. package/dist/modes/interactive-engine/engine-args.d.ts.map +1 -0
  691. package/dist/modes/interactive-engine/engine-args.js +55 -0
  692. package/dist/modes/interactive-engine/engine-args.js.map +1 -0
  693. package/dist/modes/interactive-engine/engine-child-liveness.d.ts +7 -0
  694. package/dist/modes/interactive-engine/engine-child-liveness.d.ts.map +1 -0
  695. package/dist/modes/interactive-engine/engine-child-liveness.js +50 -0
  696. package/dist/modes/interactive-engine/engine-child-liveness.js.map +1 -0
  697. package/dist/modes/interactive-engine/engine-custom-ui.d.ts +47 -0
  698. package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -0
  699. package/dist/modes/interactive-engine/engine-custom-ui.js +276 -0
  700. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -0
  701. package/dist/modes/interactive-engine/engine-input-form.d.ts +13 -0
  702. package/dist/modes/interactive-engine/engine-input-form.d.ts.map +1 -0
  703. package/dist/modes/interactive-engine/engine-input-form.js +49 -0
  704. package/dist/modes/interactive-engine/engine-input-form.js.map +1 -0
  705. package/dist/modes/interactive-engine/engine-monitor.d.ts +18 -0
  706. package/dist/modes/interactive-engine/engine-monitor.d.ts.map +1 -0
  707. package/dist/modes/interactive-engine/engine-monitor.js +63 -0
  708. package/dist/modes/interactive-engine/engine-monitor.js.map +1 -0
  709. package/dist/modes/interactive-engine/engine-render-service.d.ts +17 -0
  710. package/dist/modes/interactive-engine/engine-render-service.d.ts.map +1 -0
  711. package/dist/modes/interactive-engine/engine-render-service.js +150 -0
  712. package/dist/modes/interactive-engine/engine-render-service.js.map +1 -0
  713. package/dist/modes/interactive-engine/engine-session-picker.d.ts +22 -0
  714. package/dist/modes/interactive-engine/engine-session-picker.d.ts.map +1 -0
  715. package/dist/modes/interactive-engine/engine-session-picker.js +106 -0
  716. package/dist/modes/interactive-engine/engine-session-picker.js.map +1 -0
  717. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts +23 -0
  718. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts.map +1 -0
  719. package/dist/modes/interactive-engine/extension-ui-bridge.js +126 -0
  720. package/dist/modes/interactive-engine/extension-ui-bridge.js.map +1 -0
  721. package/dist/modes/interactive-engine/input-form-host.d.ts +15 -0
  722. package/dist/modes/interactive-engine/input-form-host.d.ts.map +1 -0
  723. package/dist/modes/interactive-engine/input-form-host.js +44 -0
  724. package/dist/modes/interactive-engine/input-form-host.js.map +1 -0
  725. package/dist/modes/interactive-engine/isolated-runtime.d.ts +75 -0
  726. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -0
  727. package/dist/modes/interactive-engine/isolated-runtime.js +448 -0
  728. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -0
  729. package/dist/modes/interactive-engine/protocol.d.ts +184 -0
  730. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -0
  731. package/dist/modes/interactive-engine/protocol.js +254 -0
  732. package/dist/modes/interactive-engine/protocol.js.map +1 -0
  733. package/dist/modes/interactive-engine/remote-command-catalog.d.ts +33 -0
  734. package/dist/modes/interactive-engine/remote-command-catalog.d.ts.map +1 -0
  735. package/dist/modes/interactive-engine/remote-command-catalog.js +51 -0
  736. package/dist/modes/interactive-engine/remote-command-catalog.js.map +1 -0
  737. package/dist/modes/interactive-engine/remote-component.d.ts +16 -0
  738. package/dist/modes/interactive-engine/remote-component.d.ts.map +1 -0
  739. package/dist/modes/interactive-engine/remote-component.js +209 -0
  740. package/dist/modes/interactive-engine/remote-component.js.map +1 -0
  741. package/dist/modes/interactive-engine/remote-frame-clamp.d.ts +25 -0
  742. package/dist/modes/interactive-engine/remote-frame-clamp.d.ts.map +1 -0
  743. package/dist/modes/interactive-engine/remote-frame-clamp.js +43 -0
  744. package/dist/modes/interactive-engine/remote-frame-clamp.js.map +1 -0
  745. package/dist/modes/interactive-engine/remote-renderer.d.ts +59 -0
  746. package/dist/modes/interactive-engine/remote-renderer.d.ts.map +1 -0
  747. package/dist/modes/interactive-engine/remote-renderer.js +123 -0
  748. package/dist/modes/interactive-engine/remote-renderer.js.map +1 -0
  749. package/dist/modes/interactive-engine/session-picker-host.d.ts +25 -0
  750. package/dist/modes/interactive-engine/session-picker-host.d.ts.map +1 -0
  751. package/dist/modes/interactive-engine/session-picker-host.js +75 -0
  752. package/dist/modes/interactive-engine/session-picker-host.js.map +1 -0
  753. package/dist/modes/interactive-engine/terminal-mode-controller.d.ts +43 -0
  754. package/dist/modes/interactive-engine/terminal-mode-controller.d.ts.map +1 -0
  755. package/dist/modes/interactive-engine/terminal-mode-controller.js +109 -0
  756. package/dist/modes/interactive-engine/terminal-mode-controller.js.map +1 -0
  757. package/dist/modes/rpc/bounded-writer.d.ts +27 -0
  758. package/dist/modes/rpc/bounded-writer.d.ts.map +1 -0
  759. package/dist/modes/rpc/bounded-writer.js +103 -0
  760. package/dist/modes/rpc/bounded-writer.js.map +1 -0
  761. package/dist/modes/rpc/jsonl.d.ts +15 -12
  762. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  763. package/dist/modes/rpc/jsonl.js +102 -28
  764. package/dist/modes/rpc/jsonl.js.map +1 -1
  765. package/dist/modes/rpc/rpc-client-api.d.ts +83 -0
  766. package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -0
  767. package/dist/modes/rpc/rpc-client-api.js +64 -0
  768. package/dist/modes/rpc/rpc-client-api.js.map +1 -0
  769. package/dist/modes/rpc/rpc-client-process.d.ts +19 -0
  770. package/dist/modes/rpc/rpc-client-process.d.ts.map +1 -0
  771. package/dist/modes/rpc/rpc-client-process.js +79 -0
  772. package/dist/modes/rpc/rpc-client-process.js.map +1 -0
  773. package/dist/modes/rpc/rpc-client-waits.d.ts +8 -0
  774. package/dist/modes/rpc/rpc-client-waits.d.ts.map +1 -0
  775. package/dist/modes/rpc/rpc-client-waits.js +33 -0
  776. package/dist/modes/rpc/rpc-client-waits.js.map +1 -0
  777. package/dist/modes/rpc/rpc-client.d.ts +48 -124
  778. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  779. package/dist/modes/rpc/rpc-client.js +295 -249
  780. package/dist/modes/rpc/rpc-client.js.map +1 -1
  781. package/dist/modes/rpc/rpc-command-handler.d.ts +5 -1
  782. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  783. package/dist/modes/rpc/rpc-command-handler.js +79 -3
  784. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  785. package/dist/modes/rpc/rpc-event-buffer.d.ts +11 -0
  786. package/dist/modes/rpc/rpc-event-buffer.d.ts.map +1 -0
  787. package/dist/modes/rpc/rpc-event-buffer.js +30 -0
  788. package/dist/modes/rpc/rpc-event-buffer.js.map +1 -0
  789. package/dist/modes/rpc/rpc-extension-ui.d.ts +7 -1
  790. package/dist/modes/rpc/rpc-extension-ui.d.ts.map +1 -1
  791. package/dist/modes/rpc/rpc-extension-ui.js +54 -32
  792. package/dist/modes/rpc/rpc-extension-ui.js.map +1 -1
  793. package/dist/modes/rpc/rpc-input-scheduler.d.ts +16 -0
  794. package/dist/modes/rpc/rpc-input-scheduler.d.ts.map +1 -0
  795. package/dist/modes/rpc/rpc-input-scheduler.js +69 -0
  796. package/dist/modes/rpc/rpc-input-scheduler.js.map +1 -0
  797. package/dist/modes/rpc/rpc-input.d.ts +2 -1
  798. package/dist/modes/rpc/rpc-input.d.ts.map +1 -1
  799. package/dist/modes/rpc/rpc-input.js +4 -9
  800. package/dist/modes/rpc/rpc-input.js.map +1 -1
  801. package/dist/modes/rpc/rpc-keybindings-reload.d.ts +27 -0
  802. package/dist/modes/rpc/rpc-keybindings-reload.d.ts.map +1 -0
  803. package/dist/modes/rpc/rpc-keybindings-reload.js +69 -0
  804. package/dist/modes/rpc/rpc-keybindings-reload.js.map +1 -0
  805. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  806. package/dist/modes/rpc/rpc-mode.js +63 -8
  807. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  808. package/dist/modes/rpc/rpc-output-buffer.d.ts +10 -0
  809. package/dist/modes/rpc/rpc-output-buffer.d.ts.map +1 -0
  810. package/dist/modes/rpc/rpc-output-buffer.js +70 -0
  811. package/dist/modes/rpc/rpc-output-buffer.js.map +1 -0
  812. package/dist/modes/rpc/rpc-session-binding.d.ts +16 -1
  813. package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -1
  814. package/dist/modes/rpc/rpc-session-binding.js +16 -3
  815. package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
  816. package/dist/modes/rpc/rpc-types.d.ts +109 -0
  817. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  818. package/dist/modes/rpc/rpc-types.js.map +1 -1
  819. package/dist/package-manager-cli-parser.d.ts +2 -0
  820. package/dist/package-manager-cli-parser.d.ts.map +1 -1
  821. package/dist/package-manager-cli-parser.js +24 -5
  822. package/dist/package-manager-cli-parser.js.map +1 -1
  823. package/dist/package-manager-cli.d.ts +7 -0
  824. package/dist/package-manager-cli.d.ts.map +1 -1
  825. package/dist/package-manager-cli.js +65 -1
  826. package/dist/package-manager-cli.js.map +1 -1
  827. package/dist/utils/shell.d.ts +1 -0
  828. package/dist/utils/shell.d.ts.map +1 -1
  829. package/dist/utils/shell.js +46 -0
  830. package/dist/utils/shell.js.map +1 -1
  831. package/docs/changelog.mdx +11 -0
  832. package/docs/compaction.md +53 -17
  833. package/docs/custom-provider.md +24 -5
  834. package/docs/development.md +9 -7
  835. package/docs/docs.json +1 -0
  836. package/docs/extensions.md +30 -16
  837. package/docs/intercom.md +489 -0
  838. package/docs/json.md +1 -1
  839. package/docs/keybindings.md +1 -1
  840. package/docs/packages.md +1 -0
  841. package/docs/quickstart.md +11 -5
  842. package/docs/rpc.md +9 -7
  843. package/docs/sdk.md +6 -0
  844. package/docs/session-format.md +7 -6
  845. package/docs/sessions.md +4 -2
  846. package/docs/settings.md +2 -2
  847. package/docs/subagents.md +7 -2
  848. package/docs/tui.md +61 -2
  849. package/docs/usage.md +6 -5
  850. package/docs/workflows.md +2572 -1379
  851. package/examples/extensions/handoff.ts +1 -1
  852. package/examples/extensions/qna.ts +1 -1
  853. package/examples/extensions/summarize.ts +1 -1
  854. package/npm-shrinkwrap.json +225 -76
  855. package/package.json +7 -6
  856. package/dist/builtin/workflows/src/durable/file-backend.ts +0 -439
  857. package/dist/builtin/workflows/src/durable/file-lock.ts +0 -153
  858. package/dist/builtin/workflows/src/durable/file-state.ts +0 -104
  859. package/dist/builtin/workflows/src/extension/runtime-direct.ts +0 -96
  860. package/dist/builtin/workflows/src/extension/workflow-tool-helpers.ts +0 -66
  861. package/dist/builtin/workflows/src/runs/foreground/executor-direct-output.ts +0 -91
  862. package/dist/builtin/workflows/src/runs/foreground/executor-direct.ts +0 -282
  863. package/dist/builtin/workflows/src/shared/resumable-workflow-notices.ts +0 -43
  864. package/dist/builtin/workflows/src/tui/session-confirm.ts +0 -299
@@ -62,11 +62,17 @@ export interface RunSyncOptions {
62
62
  allowIntercomDetach?: boolean;
63
63
  intercomEvents?: IntercomEventBus;
64
64
  onDetachedExit?: (result: SingleResult) => void;
65
+ /** Shared foreground-group signal used to release sibling supervision after one exact child commits Intercom detach. */
66
+ intercomDetachSignal?: AbortSignal;
67
+ /** Releases every active foreground sibling only after this exact child accepts a detach commit. */
68
+ onIntercomDetachCommit?: () => void;
65
69
  onUpdate?: (r: AgentToolResult<Details>) => void;
66
70
  onControlEvent?: (event: ControlEvent) => void;
67
71
  controlConfig?: ResolvedControlConfig;
68
72
  intercomSessionName?: string;
69
73
  orchestratorIntercomTarget?: string;
74
+ /** Resolved intercom home group for the spawned child (explicit subagent group or inherited stage group). */
75
+ intercomGroup?: string;
70
76
  maxOutput?: MaxOutputConfig;
71
77
  artifactsDir?: string;
72
78
  artifactConfig?: ArtifactConfig;
@@ -1,7 +1,7 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import * as fs from "node:fs";
3
3
  import * as path from "node:path";
4
- import { keyHint, type ExtensionAPI, type ExtensionContext } from "@bastani/atomic";
4
+ import { keyHintIfBound, type ExtensionAPI, type ExtensionContext } from "@bastani/atomic";
5
5
  import { Key, matchesKey } from "@earendil-works/pi-tui";
6
6
  import { discoverAgents, discoverAgentsAll, type ChainConfig } from "../agents/agents.ts";
7
7
  import type { SubagentParamsLike } from "../runs/foreground/subagent-executor.ts";
@@ -164,7 +164,8 @@ async function requestSlashRun(
164
164
  if (!ctx.hasUI) return;
165
165
  const tool = update.currentTool ? ` ${update.currentTool}` : "";
166
166
  const count = update.toolCount ?? 0;
167
- ctx.ui.setStatus("subagent-slash", `${count} tools${tool} | ${keyHint("app.tools.expand", "live detail")}`);
167
+ const expandHint = keyHintIfBound("app.tools.expand", "live detail");
168
+ ctx.ui.setStatus("subagent-slash", `${count} tools${tool}${expandHint ? ` | ${expandHint}` : ""}`);
168
169
  };
169
170
 
170
171
  const onTerminalInput = ctx.hasUI
@@ -1,4 +1,4 @@
1
- import { keyHint } from "@bastani/atomic";
1
+ import { keyHintIfBound } from "@bastani/atomic";
2
2
  import { Container, Text, type Component } from "@earendil-works/pi-tui";
3
3
  import type { AgentProgress, AsyncJobStep, Details } from "../shared/types.ts";
4
4
  import { shortenPath } from "../shared/formatters.ts";
@@ -46,7 +46,8 @@ export function renderSingleCompact(d: Details, r: Details["results"][number], t
46
46
  c.addChild(new Text(truncLine(theme.fg("dim", ` ⎿ ${activity}`), width), 0, 0));
47
47
  const liveStatus = buildLiveStatusLine(r.progress, progressSnapshotNow);
48
48
  if (liveStatus && liveStatus !== activity) c.addChild(new Text(truncLine(theme.fg("dim", ` ${liveStatus}`), width), 0, 0));
49
- c.addChild(new Text(truncLine(theme.fg("accent", ` Press ${keyHint("app.tools.expand", "for live detail")}`), width), 0, 0));
49
+ const expandHint = keyHintIfBound("app.tools.expand", "for live detail");
50
+ if (expandHint) c.addChild(new Text(truncLine(theme.fg("accent", ` Press ${expandHint}`), width), 0, 0));
50
51
  if (r.artifactPaths) c.addChild(new Text(truncLine(theme.fg("dim", ` output: ${shortenPath(r.artifactPaths.outputPath)}`), width), 0, 0));
51
52
  return c;
52
53
  }
@@ -142,7 +143,8 @@ export function renderMultiCompact(d: Details, theme: Theme, now?: number, pulse
142
143
  if (rRunning && rProg && "status" in rProg) {
143
144
  const activity = compactCurrentActivity(rProg, now);
144
145
  c.addChild(new Text(truncLine(theme.fg("dim", ` ⎿ ${activity}`), width), 0, 0));
145
- c.addChild(new Text(truncLine(theme.fg("accent", ` Press ${keyHint("app.tools.expand", "for live detail")}`), width), 0, 0));
146
+ const expandHint = keyHintIfBound("app.tools.expand", "for live detail");
147
+ if (expandHint) c.addChild(new Text(truncLine(theme.fg("accent", ` Press ${expandHint}`), width), 0, 0));
146
148
  } else if (!rPending && (r.exitCode !== 0 || r.interrupted || r.detached || hasEmptyTextOutputWithoutOutputTarget(r.task, output))) {
147
149
  c.addChild(new Text(truncLine(theme.fg(r.exitCode !== 0 ? "error" : "dim", ` ⎿ ${resultStatusLine(r, output)}`), width), 0, 0));
148
150
  }
@@ -1,5 +1,5 @@
1
1
  import type { AgentToolResult } from "@earendil-works/pi-agent-core";
2
- import { getMarkdownTheme, keyHint } from "@bastani/atomic";
2
+ import { getMarkdownTheme, keyHintIfBound } from "@bastani/atomic";
3
3
  import { Container, Markdown, Spacer, Text, type Component } from "@earendil-works/pi-tui";
4
4
  import type { AgentProgress, AsyncJobStep, Details } from "../shared/types.ts";
5
5
  import { formatDuration, formatTokens, formatUsage, shortenPath } from "../shared/formatters.ts";
@@ -123,7 +123,8 @@ export function renderSubagentResult(
123
123
  if (liveStatusLine) {
124
124
  c.addChild(new Text(fit(theme.fg("accent", liveStatusLine)), 0, 0));
125
125
  }
126
- c.addChild(new Text(fit(theme.fg("accent", `Press ${keyHint("app.tools.expand", "for live detail")}`)), 0, 0));
126
+ const expandHint = keyHintIfBound("app.tools.expand", "for live detail");
127
+ if (expandHint) c.addChild(new Text(fit(theme.fg("accent", `Press ${expandHint}`)), 0, 0));
127
128
  if (r.artifactPaths) {
128
129
  c.addChild(new Text(fit(theme.fg("dim", `Artifacts: ${shortenPath(r.artifactPaths.outputPath)}`)), 0, 0));
129
130
  }
@@ -357,7 +358,8 @@ export function renderSubagentResult(
357
358
  if (liveStatusLine) {
358
359
  c.addChild(new Text(fit(theme.fg("accent", ` ${liveStatusLine}`)), 0, 0));
359
360
  }
360
- c.addChild(new Text(fit(theme.fg("accent", ` Press ${keyHint("app.tools.expand", "for live detail")}`)), 0, 0));
361
+ const expandHint = keyHintIfBound("app.tools.expand", "for live detail");
362
+ if (expandHint) c.addChild(new Text(fit(theme.fg("accent", ` Press ${expandHint}`)), 0, 0));
361
363
  if (r.artifactPaths) {
362
364
  c.addChild(new Text(fit(theme.fg("dim", ` artifacts: ${shortenPath(r.artifactPaths.outputPath)}`)), 0, 0));
363
365
  }
@@ -1,4 +1,4 @@
1
- import { keyHint } from "@bastani/atomic";
1
+ import { keyHintIfBound } from "@bastani/atomic";
2
2
  import type { AsyncJobState } from "../shared/types.ts";
3
3
  import { shortenPath } from "../shared/formatters.ts";
4
4
  import { aggregateStepStatus, formatParallelOutcome } from "../shared/status-format.ts";
@@ -79,7 +79,8 @@ export function foregroundStyleWidgetStepLines(
79
79
  lines.push(` ${nestedLine}`);
80
80
  }
81
81
  if (step.status === "running") {
82
- if (!expanded) lines.push(` ${theme.fg("accent", `Press ${keyHint("app.tools.expand", "for live detail")}`)}`);
82
+ const expandHint = keyHintIfBound("app.tools.expand", "for live detail");
83
+ if (!expanded && expandHint) lines.push(` ${theme.fg("accent", `Press ${expandHint}`)}`);
83
84
  const output = widgetOutputPath(job, step);
84
85
  if (output) lines.push(` ${theme.fg("dim", `output: ${shortenPath(output)}`)}`);
85
86
  if (expanded) {
@@ -150,7 +151,8 @@ export function compactSingleWidgetLines(job: AsyncJobState, theme: Theme, width
150
151
  if (output) lines.push(` ${theme.fg("dim", `output: ${shortenPath(output)}`)}`);
151
152
  }
152
153
  }
153
- if (job.steps.some((step) => step.status === "running")) lines.push(theme.fg("accent", ` Press ${keyHint("app.tools.expand", "for live detail")}`));
154
+ const expandHint = keyHintIfBound("app.tools.expand", "for live detail");
155
+ if (expandHint && job.steps.some((step) => step.status === "running")) lines.push(theme.fg("accent", ` Press ${expandHint}`));
154
156
  return lines.map((line) => truncLine(line, width));
155
157
  }
156
158
 
@@ -162,8 +164,9 @@ export function fitWidgetLineBudget(lines: string[], theme: Theme, width: number
162
164
  if (lines.length <= budget) return lines;
163
165
  const visibleLines = Math.max(1, budget - 1);
164
166
  const hiddenCount = lines.length - visibleLines;
167
+ const expandHint = keyHintIfBound("app.tools.expand", "expands");
165
168
  const hint = expanded
166
169
  ? `… ${hiddenCount} live-detail lines hidden`
167
- : `… ${hiddenCount} lines hidden · ${keyHint("app.tools.expand", "expands")}`;
170
+ : `… ${hiddenCount} lines hidden${expandHint ? ` · ${expandHint}` : ""}`;
168
171
  return [...lines.slice(0, visibleLines), truncLine(theme.fg("dim", hint), width)];
169
172
  }
@@ -4,6 +4,28 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.9.10] - 2026-07-20
8
+
9
+ ### Changed
10
+
11
+ - Converted the reachable synchronous subprocess paths in video/YouTube extraction and the Glimpse browser-curator probe to a shared asynchronous Bun subprocess helper (`runBunSubprocess`). `ffmpeg` frame capture, `ffprobe`/`yt-dlp` duration and stream probes, and the global `npm root -g` lookup no longer block the event loop via `execFileSync`: each child now streams stdout/stderr concurrently into byte-capped buffers (binary-safe for JPEG frame output), enforces a timeout with `SIGTERM`→`SIGKILL` escalation, honors an optional caller `AbortSignal` with the same tree-kill escalation, and maps timeout/abort/non-zero-exit/`ENOENT`/output-overflow into typed errors that preserve the existing user-facing `ffmpeg`/`ffprobe`/`yt-dlp` failure messages. Video and YouTube extraction functions now thread an optional `AbortSignal` from callers that already own one, and the Glimpse module resolver caches a single in-flight global-root probe so concurrent curator opens never spawn duplicate `npm` processes.
12
+
13
+ ### Fixed
14
+
15
+ - Fixed collapsed web-search results hardcoding `CTRL+O`; the line-count hint now uses the effective `app.tools.expand` binding and keeps its factual counts when expansion is unbound.
16
+ - Preserved provider-owned null header suppression and credential-specific `baseUrl` overrides for search-query rewriting and summary generation ([#1875](https://github.com/bastani-inc/atomic/issues/1875)).
17
+
18
+ ## [0.9.10-alpha.1] - 2026-07-19
19
+
20
+ ### Changed
21
+
22
+ - Converted the reachable synchronous subprocess paths in video/YouTube extraction and the Glimpse browser-curator probe to a shared asynchronous Bun subprocess helper (`runBunSubprocess`). `ffmpeg` frame capture, `ffprobe`/`yt-dlp` duration and stream probes, and the global `npm root -g` lookup no longer block the event loop via `execFileSync`: each child now streams stdout/stderr concurrently into byte-capped buffers (binary-safe for JPEG frame output), enforces a timeout with `SIGTERM`→`SIGKILL` escalation, honors an optional caller `AbortSignal` with the same tree-kill escalation, and maps timeout/abort/non-zero-exit/`ENOENT`/output-overflow into typed errors that preserve the existing user-facing `ffmpeg`/`ffprobe`/`yt-dlp` failure messages. Video and YouTube extraction functions now thread an optional `AbortSignal` from callers that already own one, and the Glimpse module resolver caches a single in-flight global-root probe so concurrent curator opens never spawn duplicate `npm` processes.
23
+
24
+ ### Fixed
25
+
26
+ - Fixed collapsed web-search results hardcoding `CTRL+O`; the line-count hint now uses the effective `app.tools.expand` binding and keeps its factual counts when expansion is unbound.
27
+ - Preserved provider-owned null header suppression and credential-specific `baseUrl` overrides for search-query rewriting and summary generation ([#1875](https://github.com/bastani-inc/atomic/issues/1875)).
28
+
7
29
  ## [0.9.9] - 2026-07-15
8
30
 
9
31
  ### Changed
@@ -66,10 +66,10 @@ function buildFrameResult(
66
66
  }
67
67
 
68
68
  async function extractLocalFrames(
69
- filePath: string, timestamps: number[],
69
+ filePath: string, timestamps: number[], signal?: AbortSignal,
70
70
  ): Promise<{ frames: VideoFrame[]; error: string | null }> {
71
71
  const results = await Promise.all(timestamps.map(async (t) => {
72
- const frame = await extractVideoFrame(filePath, t);
72
+ const frame = await extractVideoFrame(filePath, t, signal);
73
73
  if ("error" in frame) return { error: frame.error };
74
74
  return { ...frame, timestamp: formatSeconds(t) };
75
75
  }));
@@ -89,12 +89,13 @@ function safeVideoInfo(url: string): { info: ReturnType<typeof isVideoFile>; err
89
89
  export async function extractRequestedFrames(
90
90
  url: string,
91
91
  options?: ExtractOptions,
92
+ signal?: AbortSignal,
92
93
  ): Promise<ExtractedContent | null> {
93
94
  if (options?.frames && !options.timestamp) {
94
95
  const frameCount = options.frames;
95
96
  const ytInfo = isYouTubeURL(url);
96
97
  if (ytInfo.isYouTube && ytInfo.videoId) {
97
- const streamInfo = await getYouTubeStreamInfo(ytInfo.videoId);
98
+ const streamInfo = await getYouTubeStreamInfo(ytInfo.videoId, signal);
98
99
  if ("error" in streamInfo) {
99
100
  return { url, title: "Frames", content: streamInfo.error, error: streamInfo.error };
100
101
  }
@@ -104,7 +105,7 @@ export async function extractRequestedFrames(
104
105
  }
105
106
  const dur = Math.floor(streamInfo.duration);
106
107
  const timestamps = computeRangeTimestamps(0, dur, frameCount);
107
- const result = await extractYouTubeFrames(ytInfo.videoId, timestamps, streamInfo);
108
+ const result = await extractYouTubeFrames(ytInfo.videoId, timestamps, streamInfo, signal);
108
109
  const label = `${formatSeconds(0)}-${formatSeconds(dur)}`;
109
110
  return buildFrameResult(url, label, timestamps.length, result.frames, result.error, streamInfo.duration);
110
111
  }
@@ -114,13 +115,13 @@ export async function extractRequestedFrames(
114
115
  return { url, title: "", content: "", error: localVideo.error };
115
116
  }
116
117
  if (localVideo.info) {
117
- const durationResult = await getLocalVideoDuration(localVideo.info.absolutePath);
118
+ const durationResult = await getLocalVideoDuration(localVideo.info.absolutePath, signal);
118
119
  if (typeof durationResult !== "number") {
119
120
  return { url, title: "Frames", content: durationResult.error, error: durationResult.error };
120
121
  }
121
122
  const dur = Math.floor(durationResult);
122
123
  const timestamps = computeRangeTimestamps(0, dur, frameCount);
123
- const result = await extractLocalFrames(localVideo.info.absolutePath, timestamps);
124
+ const result = await extractLocalFrames(localVideo.info.absolutePath, timestamps, signal);
124
125
  const label = `${formatSeconds(0)}-${formatSeconds(dur)}`;
125
126
  return buildFrameResult(url, label, timestamps.length, result.frames, result.error, durationResult);
126
127
  }
@@ -142,7 +143,7 @@ export async function extractRequestedFrames(
142
143
  const frameCount = options.frames;
143
144
  const ytInfo = isYouTubeURL(url);
144
145
  if (ytInfo.isYouTube && ytInfo.videoId) {
145
- const streamInfo = await getYouTubeStreamInfo(ytInfo.videoId);
146
+ const streamInfo = await getYouTubeStreamInfo(ytInfo.videoId, signal);
146
147
  if ("error" in streamInfo) {
147
148
  if (spec.type === "range") {
148
149
  const label = `${formatSeconds(spec.start)}-${formatSeconds(spec.end)}`;
@@ -165,7 +166,7 @@ export async function extractRequestedFrames(
165
166
  const timestamps = frameCount
166
167
  ? computeRangeTimestamps(spec.start, spec.end, frameCount)
167
168
  : computeRangeTimestamps(spec.start, spec.end);
168
- const result = await extractYouTubeFrames(ytInfo.videoId, timestamps, streamInfo);
169
+ const result = await extractYouTubeFrames(ytInfo.videoId, timestamps, streamInfo, signal);
169
170
  return buildFrameResult(url, label, timestamps.length, result.frames, result.error, result.duration ?? undefined);
170
171
  }
171
172
 
@@ -177,7 +178,7 @@ export async function extractRequestedFrames(
177
178
  return { url, title: `Frames ${label}`, content: error, error };
178
179
  }
179
180
  const timestamps = computeRangeTimestamps(spec.seconds, end, frameCount);
180
- const result = await extractYouTubeFrames(ytInfo.videoId, timestamps, streamInfo);
181
+ const result = await extractYouTubeFrames(ytInfo.videoId, timestamps, streamInfo, signal);
181
182
  return buildFrameResult(url, label, timestamps.length, result.frames, result.error, result.duration ?? undefined);
182
183
  }
183
184
 
@@ -185,7 +186,7 @@ export async function extractRequestedFrames(
185
186
  const error = `Timestamp ${formatSeconds(spec.seconds)} exceeds video duration (${formatSeconds(Math.floor(streamInfo.duration))})`;
186
187
  return { url, title: `Frame at ${options.timestamp}`, content: error, error };
187
188
  }
188
- const frame = await extractYouTubeFrame(ytInfo.videoId, spec.seconds, streamInfo);
189
+ const frame = await extractYouTubeFrame(ytInfo.videoId, spec.seconds, streamInfo, signal);
189
190
  if ("error" in frame) {
190
191
  return { url, title: `Frame at ${options.timestamp}`, content: frame.error, error: frame.error };
191
192
  }
@@ -201,7 +202,7 @@ export async function extractRequestedFrames(
201
202
  const timestamps = frameCount
202
203
  ? computeRangeTimestamps(spec.start, spec.end, frameCount)
203
204
  : computeRangeTimestamps(spec.start, spec.end);
204
- const result = await extractLocalFrames(localVideo.info.absolutePath, timestamps);
205
+ const result = await extractLocalFrames(localVideo.info.absolutePath, timestamps, signal);
205
206
  const label = `${formatSeconds(spec.start)}-${formatSeconds(spec.end)}`;
206
207
  return buildFrameResult(url, label, timestamps.length, result.frames, result.error);
207
208
  }
@@ -209,12 +210,12 @@ export async function extractRequestedFrames(
209
210
  if (frameCount) {
210
211
  const end = spec.seconds + (frameCount - 1) * MIN_FRAME_INTERVAL;
211
212
  const timestamps = computeRangeTimestamps(spec.seconds, end, frameCount);
212
- const result = await extractLocalFrames(localVideo.info.absolutePath, timestamps);
213
+ const result = await extractLocalFrames(localVideo.info.absolutePath, timestamps, signal);
213
214
  const label = `${formatSeconds(spec.seconds)}-${formatSeconds(end)}`;
214
215
  return buildFrameResult(url, label, timestamps.length, result.frames, result.error);
215
216
  }
216
217
 
217
- const frame = await extractVideoFrame(localVideo.info.absolutePath, spec.seconds);
218
+ const frame = await extractVideoFrame(localVideo.info.absolutePath, spec.seconds, signal);
218
219
  if ("error" in frame) {
219
220
  return { url, title: `Frame at ${options.timestamp}`, content: frame.error, error: frame.error };
220
221
  }
@@ -145,7 +145,7 @@ export async function extractContent(
145
145
  return { url, title: "", content: "", error: "Aborted" };
146
146
  }
147
147
 
148
- const frameResult = await extractRequestedFrames(url, options);
148
+ const frameResult = await extractRequestedFrames(url, options, signal);
149
149
  if (frameResult) return frameResult;
150
150
 
151
151
  const localVideo = safeVideoInfo(url);
@@ -451,7 +451,7 @@ async function extractViaHttp(
451
451
  };
452
452
  }
453
453
 
454
- const markdown = turndown.turndown(article.content);
454
+ const markdown = turndown.turndown(article.content ?? "");
455
455
  activityMonitor.logComplete(activityId, response.status);
456
456
 
457
457
  if (markdown.length < MIN_USEFUL_CONTENT) {
@@ -1,7 +1,4 @@
1
1
  import { existsSync, readFileSync } from "node:fs";
2
- import { homedir } from "node:os";
3
- import { join } from "node:path";
4
- import { CONFIG_DIR_NAME } from "@bastani/atomic";
5
2
  import { findReadableConfigPath } from "./config-paths.ts";
6
3
 
7
4
  export const API_BASE = "https://generativelanguage.googleapis.com/v1beta";
@@ -1,7 +1,5 @@
1
1
  import { existsSync, readFileSync } from "node:fs";
2
- import { homedir } from "node:os";
3
- import { join } from "node:path";
4
- import { APP_NAME, CONFIG_DIR_NAME } from "@bastani/atomic";
2
+ import { APP_NAME } from "@bastani/atomic";
5
3
  import { findReadableConfigPath } from "./config-paths.ts";
6
4
 
7
5
  const CONFIG_PATH = findReadableConfigPath();
@@ -1,3 +1,4 @@
1
+ import { readFileSync } from "node:fs";
1
2
  import { basename } from "node:path";
2
3
  import { type CookieMap, getGoogleCookies } from "./chrome-cookies.js";
3
4
  import { getChromeProfileFromConfig, isBrowserCookieAccessAllowed, normalizeChromeProfile } from "./gemini-web-config.ts";
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/web-access",
3
- "version": "0.9.9",
3
+ "version": "0.9.10",
4
4
  "private": true,
5
5
  "description": "Atomic extension for web search, URL fetching, GitHub repo cloning, PDF/video extraction. Fork of: https://github.com/nicobailon/pi-web-access",
6
6
  "contributors": [
@@ -31,7 +31,7 @@
31
31
  },
32
32
  "peerDependencies": {
33
33
  "@bastani/atomic": "*",
34
- "@earendil-works/pi-tui": "^0.80.7"
34
+ "@earendil-works/pi-tui": "^0.80.10"
35
35
  },
36
36
  "peerDependenciesMeta": {
37
37
  "@bastani/atomic": {
@@ -1,7 +1,4 @@
1
1
  import { existsSync, readFileSync } from "node:fs";
2
- import { homedir } from "node:os";
3
- import { join } from "node:path";
4
- import { CONFIG_DIR_NAME } from "@bastani/atomic";
5
2
  import { activityMonitor } from "./activity.js";
6
3
  import type { ExtractedContent } from "./extract.js";
7
4
  import { findReadableConfigPath } from "./config-paths.ts";
@@ -1,4 +1,4 @@
1
- import type { ToolDefinition } from "@bastani/atomic";
1
+ import { keyHintIfBound, type ToolDefinition } from "@bastani/atomic";
2
2
  import { Box, Text } from "@earendil-works/pi-tui";
3
3
  import { formatSeconds } from "./utils.js";
4
4
 
@@ -89,7 +89,7 @@ function progressBar(progress: number): string {
89
89
  return "\u2588".repeat(filled) + "\u2591".repeat(10 - filled);
90
90
  }
91
91
 
92
- export const renderWebSearchResult: ToolResultRenderer = (result, { expanded, isPartial }, theme) => {
92
+ export const renderWebSearchResult = ((result, { expanded, isPartial }, theme) => {
93
93
  const details = result.details as WebSearchResultDetails | undefined;
94
94
 
95
95
  if (isPartial) {
@@ -241,13 +241,15 @@ export const renderWebSearchResult: ToolResultRenderer = (result, { expanded, is
241
241
  }
242
242
  const moreLines = Math.max(0, totalLines - collapsedLines);
243
243
  if (moreLines > 0) {
244
- box.addChild(new Text(theme.fg("muted", `\n... (${moreLines} more lines, ${totalLines} total, CTRL+O Expand)`), 0, 0));
244
+ const expandHint = keyHintIfBound("app.tools.expand", "Expand");
245
+ const prefix = theme.fg("muted", `\n... (${moreLines} more lines, ${totalLines} total${expandHint ? ", " : ")"}`);
246
+ box.addChild(new Text(prefix + (expandHint ? expandHint + theme.fg("muted", ")") : ""), 0, 0));
245
247
  }
246
248
  return box;
247
249
  }
248
250
 
249
251
  return new Text(lines.join("\n"), 0, 0);
250
- };
252
+ }) satisfies ToolResultRenderer;
251
253
 
252
254
  export const renderCodeSearchResult: ToolResultRenderer = (result, { expanded }, theme) => {
253
255
  const details = result.details as CodeSearchResultDetails | undefined;
@@ -349,7 +351,7 @@ export const renderGetSearchContentResult: ToolResultRenderer = (result, { expan
349
351
  export function renderWebAccessToolResult(name: string, args: ToolRenderResultArgs): ToolRenderResult {
350
352
  switch (name) {
351
353
  case "web_search":
352
- return renderWebSearchResult(...args);
354
+ return renderWebSearchResult(args[0], args[1], args[2]);
353
355
  case "code_search":
354
356
  return renderCodeSearchResult(...args);
355
357
  case "fetch_content":
@@ -0,0 +1,100 @@
1
+ export interface BunSubprocessOptions {
2
+ timeoutMs: number;
3
+ maxStdoutBytes: number;
4
+ maxStderrBytes?: number;
5
+ signal?: AbortSignal;
6
+ cwd?: string;
7
+ env?: Record<string, string>;
8
+ }
9
+
10
+ export interface BunSubprocessResult {
11
+ exitCode: number;
12
+ stdout: Buffer;
13
+ stderr: string;
14
+ }
15
+
16
+ export class AsyncSubprocessError extends Error {
17
+ readonly code?: string;
18
+ readonly stderr: string;
19
+ readonly killed: boolean;
20
+ constructor(message: string, options: { code?: string; stderr?: string; killed?: boolean } = {}) {
21
+ super(message);
22
+ this.name = "AsyncSubprocessError";
23
+ this.code = options.code;
24
+ this.stderr = options.stderr ?? "";
25
+ this.killed = options.killed === true;
26
+ }
27
+ }
28
+
29
+ async function readBounded(
30
+ stream: ReadableStream<Uint8Array>,
31
+ maxBytes: number,
32
+ onOverflow: () => void,
33
+ ): Promise<Buffer> {
34
+ const reader = stream.getReader();
35
+ const chunks: Uint8Array[] = [];
36
+ let bytes = 0;
37
+ try {
38
+ while (true) {
39
+ const { done, value } = await reader.read();
40
+ if (done) break;
41
+ bytes += value.byteLength;
42
+ if (bytes > maxBytes) {
43
+ onOverflow();
44
+ throw new AsyncSubprocessError(`Subprocess output exceeded ${maxBytes} bytes`, { code: "ENOBUFS", killed: true });
45
+ }
46
+ chunks.push(value);
47
+ }
48
+ } finally {
49
+ reader.releaseLock();
50
+ }
51
+ return Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)), bytes);
52
+ }
53
+
54
+ export async function runBunSubprocess(
55
+ command: string,
56
+ args: readonly string[],
57
+ options: BunSubprocessOptions,
58
+ ): Promise<BunSubprocessResult> {
59
+ let proc: ReturnType<typeof Bun.spawn>;
60
+ try {
61
+ proc = Bun.spawn([command, ...args], {
62
+ cwd: options.cwd,
63
+ env: options.env ? { ...process.env, ...options.env } : process.env,
64
+ stdin: "ignore",
65
+ stdout: "pipe",
66
+ stderr: "pipe",
67
+ });
68
+ } catch (error) {
69
+ const failure = error instanceof Error ? error : new Error(String(error));
70
+ throw new AsyncSubprocessError(failure.message, { code: (failure as Error & { code?: string }).code });
71
+ }
72
+ let timedOut = false;
73
+ let aborted = false;
74
+ const terminate = (): void => {
75
+ try { proc.kill("SIGTERM"); } catch {}
76
+ void Promise.race([proc.exited, Bun.sleep(500)]).then(() => {
77
+ if (proc.exitCode === null) try { proc.kill("SIGKILL"); } catch {}
78
+ });
79
+ };
80
+ const onAbort = (): void => { aborted = true; terminate(); };
81
+ options.signal?.addEventListener("abort", onAbort, { once: true });
82
+ const timeout = setTimeout(() => { timedOut = true; terminate(); }, options.timeoutMs);
83
+ try {
84
+ const stdoutPromise = readBounded(proc.stdout as ReadableStream<Uint8Array>, options.maxStdoutBytes, terminate);
85
+ const stderrPromise = readBounded(proc.stderr as ReadableStream<Uint8Array>, options.maxStderrBytes ?? 256 * 1024, terminate);
86
+ const [exitCode, stdout, stderrBuffer] = await Promise.all([proc.exited, stdoutPromise, stderrPromise]);
87
+ const stderr = stderrBuffer.toString("utf8");
88
+ if (timedOut) throw new AsyncSubprocessError(`${command} timed out`, { code: "ETIMEDOUT", stderr, killed: true });
89
+ if (aborted) throw new AsyncSubprocessError(`${command} aborted`, { code: "ABORT_ERR", stderr, killed: true });
90
+ if (exitCode !== 0) throw new AsyncSubprocessError(`${command} exited with code ${exitCode}`, { code: String(exitCode), stderr });
91
+ return { exitCode, stdout, stderr };
92
+ } catch (error) {
93
+ terminate();
94
+ if (error instanceof AsyncSubprocessError) throw error;
95
+ throw new AsyncSubprocessError(error instanceof Error ? error.message : String(error), { killed: true });
96
+ } finally {
97
+ clearTimeout(timeout);
98
+ options.signal?.removeEventListener("abort", onAbort);
99
+ }
100
+ }
@@ -1,3 +1,4 @@
1
+ import type { ProviderHeaders } from "@earendil-works/pi-ai";
1
2
  import { complete, getModel, type Message, type Model } from "@earendil-works/pi-ai/compat";
2
3
  import type { ExtensionContext } from "@bastani/atomic";
3
4
  import type { QueryResultData } from "./storage.js";
@@ -180,7 +181,7 @@ export function buildDeterministicSummary(results: QueryResultData[]): { summary
180
181
  async function resolveSummaryModel(
181
182
  ctx: SummaryGenerationContext,
182
183
  modelOverride?: string,
183
- ): Promise<{ model: Model; apiKey: string; headers?: Record<string, string> }> {
184
+ ): Promise<{ model: Model; apiKey: string; headers?: ProviderHeaders }> {
184
185
  const normalizedOverride = typeof modelOverride === "string" ? modelOverride.trim() : "";
185
186
  if (normalizedOverride.length > 0) {
186
187
  const slashIndex = normalizedOverride.indexOf("/");
@@ -197,14 +198,24 @@ async function resolveSummaryModel(
197
198
  if (!selectedAuth.ok || !selectedAuth.apiKey) {
198
199
  throw new Error(`No API key available for summary model ${normalizedOverride}`);
199
200
  }
200
- return { model: selectedModel, apiKey: selectedAuth.apiKey, headers: selectedAuth.headers };
201
+ return {
202
+ model: selectedAuth.baseUrl === undefined ? selectedModel : { ...selectedModel, baseUrl: selectedAuth.baseUrl },
203
+ apiKey: selectedAuth.apiKey,
204
+ headers: selectedAuth.headers,
205
+ };
201
206
  }
202
207
 
203
208
  for (const { provider, id } of PREFERRED_SUMMARY_MODELS) {
204
209
  const model = getModel(provider, id);
205
210
  if (!model) continue;
206
211
  const auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);
207
- if (auth.ok && auth.apiKey) return { model, apiKey: auth.apiKey, headers: auth.headers };
212
+ if (auth.ok && auth.apiKey) {
213
+ return {
214
+ model: auth.baseUrl === undefined ? model : { ...model, baseUrl: auth.baseUrl },
215
+ apiKey: auth.apiKey,
216
+ headers: auth.headers,
217
+ };
218
+ }
208
219
  }
209
220
 
210
221
  throw new Error(`No API key available for summary models: ${PREFERRED_SUMMARY_MODELS.map(c => `${c.provider}/${c.id}`).join(", ")}`);
@@ -1,15 +1,13 @@
1
- import { execFileSync } from "node:child_process";
2
1
  import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
3
2
  import { readFile } from "node:fs/promises";
4
3
  import { resolve, extname, basename, join, dirname } from "node:path";
5
- import { homedir } from "node:os";
6
- import { CONFIG_DIR_NAME } from "@bastani/atomic";
7
4
  import { activityMonitor } from "./activity.js";
8
5
  import { isGeminiWebAvailable, queryWithCookies } from "./gemini-web.js";
9
6
  import { queryGeminiApiWithVideo, getApiKey, API_BASE } from "./gemini-api.js";
10
7
  import { extractHeadingTitle, type ExtractedContent, type ExtractOptions, type FrameResult } from "./extract.js";
11
8
  import { readExecError, trimErrorText, mapFfmpegError } from "./utils.js";
12
9
  import { findReadableConfigPath } from "./config-paths.ts";
10
+ import { runBunSubprocess } from "./subprocess.ts";
13
11
 
14
12
  const CONFIG_PATH = findReadableConfigPath();
15
13
  const UPLOAD_BASE = "https://generativelanguage.googleapis.com/upload/v1beta";
@@ -173,7 +171,7 @@ export async function extractVideo(
173
171
  ?? await tryVideoGeminiWeb(info, effectivePrompt, effectiveModel, signal);
174
172
 
175
173
  if (result) {
176
- const thumbnail = await extractVideoFrame(info.absolutePath);
174
+ const thumbnail = await extractVideoFrame(info.absolutePath, 1, signal);
177
175
  if (!("error" in thumbnail)) {
178
176
  result.thumbnail = thumbnail;
179
177
  }
@@ -197,28 +195,25 @@ function mapFfprobeError(err: unknown): string {
197
195
  return snippet ? `ffprobe failed: ${snippet}` : "ffprobe failed";
198
196
  }
199
197
 
200
- export async function extractVideoFrame(filePath: string, seconds: number = 1): Promise<FrameResult> {
198
+ export async function extractVideoFrame(filePath: string, seconds: number = 1, signal?: AbortSignal): Promise<FrameResult> {
201
199
  try {
202
- const buffer = execFileSync("ffmpeg", [
200
+ const { stdout } = await runBunSubprocess("ffmpeg", [
203
201
  "-ss", String(seconds), "-i", filePath,
204
202
  "-frames:v", "1", "-f", "image2pipe", "-vcodec", "mjpeg", "pipe:1",
205
- ], { maxBuffer: 5 * 1024 * 1024, timeout: 10000, stdio: ["pipe", "pipe", "pipe"] });
206
- if (buffer.length === 0) return { error: "ffmpeg failed: empty output" };
207
- return { data: buffer.toString("base64"), mimeType: "image/jpeg" };
203
+ ], { timeoutMs: 10_000, maxStdoutBytes: 5 * 1024 * 1024, signal });
204
+ if (stdout.length === 0) return { error: "ffmpeg failed: empty output" };
205
+ return { data: stdout.toString("base64"), mimeType: "image/jpeg" };
208
206
  } catch (err) {
209
207
  return { error: mapFfmpegError(err) };
210
208
  }
211
209
  }
212
210
 
213
- export async function getLocalVideoDuration(filePath: string): Promise<number | { error: string }> {
211
+ export async function getLocalVideoDuration(filePath: string, signal?: AbortSignal): Promise<number | { error: string }> {
214
212
  try {
215
- const output = execFileSync("ffprobe", [
216
- "-v", "quiet",
217
- "-show_entries", "format=duration",
218
- "-of", "csv=p=0",
219
- filePath,
220
- ], { timeout: 10000, encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
221
- const duration = Number.parseFloat(output);
213
+ const { stdout } = await runBunSubprocess("ffprobe", [
214
+ "-v", "quiet", "-show_entries", "format=duration", "-of", "csv=p=0", filePath,
215
+ ], { timeoutMs: 10_000, maxStdoutBytes: 64 * 1024, signal });
216
+ const duration = Number.parseFloat(stdout.toString("utf8").trim());
222
217
  if (!Number.isFinite(duration)) return { error: "ffprobe failed: invalid duration output" };
223
218
  return duration;
224
219
  } catch (err) {