mixdog 1.4.1 → 1.4.3

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 (630) hide show
  1. package/package.json +4 -3
  2. package/scripts/build-shipped-history.mjs +125 -33
  3. package/scripts/gate-local.mjs +220 -63
  4. package/scripts/graph-parity.mjs +8 -3
  5. package/scripts/lib/gate-scheduler.mjs +139 -32
  6. package/scripts/lib/gate-timing-reporter.mjs +16 -0
  7. package/scripts/lib/run-node-tests.mjs +71 -34
  8. package/scripts/lib/scoped-temp.mjs +1 -0
  9. package/scripts/lib/test-failure-records.mjs +14 -1
  10. package/scripts/lib/test-failure-summary.mjs +9 -4
  11. package/scripts/lib/test-spawn-ledger.mjs +43 -3
  12. package/scripts/post-release-check.mjs +26 -16
  13. package/scripts/pptx-kit-index.mjs +5 -6
  14. package/scripts/provider-pingpong-live.mjs +1 -1
  15. package/scripts/prune-embedding-runtime.mjs +3 -1
  16. package/scripts/release-paths.mjs +7 -1
  17. package/scripts/suite-health.mjs +110 -28
  18. package/scripts/test.mjs +9 -14
  19. package/src/agents/advisor/AGENT.md +4 -4
  20. package/src/agents/advisor/agent.json +1 -1
  21. package/src/agents/explore/AGENT.md +22 -0
  22. package/src/agents/explore/agent.json +6 -0
  23. package/src/cli.mjs +7 -0
  24. package/src/defaults/agents.json +7 -0
  25. package/src/defaults/shipped-history.json +38 -2
  26. package/src/defaults/skills/browser-use/SKILL.md +4 -1
  27. package/src/defaults/skills/code-tidy/SKILL.md +71 -102
  28. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +66 -114
  29. package/src/defaults/skills/code-tidy/references/cleanup-report.md +19 -35
  30. package/src/defaults/skills/code-tidy/references/dead-code.md +3 -9
  31. package/src/defaults/skills/code-tidy/references/test-suite-slop.md +16 -27
  32. package/src/defaults/skills/computer-use/SKILL.md +12 -2
  33. package/src/defaults/skills/setup/SKILL.md +2 -2
  34. package/src/defaults/skills/setup/references/actions.md +28 -9
  35. package/src/defaults/skills/setup/references/surfaces.md +5 -2
  36. package/src/defaults/skills/setup-guide/SKILL.md +11 -3
  37. package/src/defaults/skills/setup-guide/model-recommendations.json +13 -0
  38. package/src/defaults/skills/skill-creator/SKILL.md +85 -190
  39. package/src/defaults/skills/skill-creator/references/design.md +70 -162
  40. package/src/defaults/skills/skill-creator/references/evaluation.md +33 -92
  41. package/src/defaults/skills/test-suite/SKILL.md +194 -0
  42. package/src/defaults/skills/test-suite/references/case-management.md +51 -0
  43. package/src/defaults/skills/test-suite/references/flaky-policy.md +39 -0
  44. package/src/defaults/skills/test-suite/references/reliability.md +49 -0
  45. package/src/defaults/skills/test-suite/references/suite-design.md +78 -0
  46. package/src/defaults/skills/test-suite/scripts/inventory.mjs +335 -0
  47. package/src/defaults/skills/visualize/SKILL.md +6 -2
  48. package/src/lib/instruction-text.cjs +36 -0
  49. package/src/lib/rules-builder.cjs +40 -50
  50. package/src/orchestration/balanced.md +23 -0
  51. package/src/orchestration/focused.md +22 -0
  52. package/src/orchestration/none.md +5 -0
  53. package/src/orchestration/swarm.md +24 -0
  54. package/src/rules/agent-mode/AGENT_MODE.md +3 -1
  55. package/src/rules/agent-mode/MIXY.md +2 -2
  56. package/src/rules/lead/LEAD.md +3 -3
  57. package/src/rules/shared/20-research.md +3 -6
  58. package/src/rules/shared/40-editing.md +1 -0
  59. package/src/rules/shared/60-verification.md +10 -9
  60. package/src/rules/shared/70-delivery.md +4 -3
  61. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
  62. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +3 -3
  63. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -2
  64. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +132 -21
  65. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -9
  66. package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +2 -2
  67. package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
  68. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +67 -0
  69. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
  70. package/src/runtime/agent/orchestrator/config.mjs +12 -7
  71. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +7 -7
  72. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +9 -30
  73. package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
  74. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +124 -12
  75. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +204 -49
  76. package/src/runtime/agent/orchestrator/mcp/client-config.mjs +16 -7
  77. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +157 -57
  78. package/src/runtime/agent/orchestrator/mcp/client.mjs +54 -23
  79. package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +1 -1
  80. package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +8 -2
  81. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +83 -52
  82. package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +1 -1
  83. package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +14 -0
  84. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +43 -27
  85. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +43 -8
  86. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +30 -28
  87. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  88. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +31 -21
  89. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-stop.mjs +3 -3
  90. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +3 -1
  91. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -2
  92. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  93. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
  94. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +40 -0
  95. package/src/runtime/agent/orchestrator/providers/custom-provider-keys.mjs +34 -0
  96. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +3 -0
  97. package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +14 -7
  98. package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +3 -2
  99. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
  100. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -1
  101. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +2 -2
  102. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +48 -31
  103. package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +0 -18
  104. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +138 -6
  105. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +1 -1
  106. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +100 -33
  107. package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +1 -1
  108. package/src/runtime/agent/orchestrator/providers/oauth-secret-fields.fixtures.mjs +45 -0
  109. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +4 -6
  110. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2784 -2872
  111. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +5 -8
  112. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +26 -28
  113. package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +288 -300
  114. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +3 -1
  115. package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +1 -0
  116. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +1 -1
  117. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +3 -1
  118. package/src/runtime/agent/orchestrator/providers/registry.mjs +33 -2
  119. package/src/runtime/agent/orchestrator/providers/vertex-ai-auth.mjs +622 -0
  120. package/src/runtime/agent/orchestrator/providers/vertex-ai-maas.mjs +185 -0
  121. package/src/runtime/agent/orchestrator/providers/vertex-ai-models.mjs +445 -0
  122. package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +576 -0
  123. package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +10 -30
  124. package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +32 -0
  125. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +0 -11
  126. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +8 -0
  127. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +17 -3
  128. package/src/runtime/agent/orchestrator/runtime-core/goal-control.mjs +47 -27
  129. package/src/runtime/agent/orchestrator/runtime-core/goal-deadlines.mjs +141 -10
  130. package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +26 -63
  131. package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +28 -3
  132. package/src/runtime/agent/orchestrator/runtime-core/goal-runtime.mjs +36 -11
  133. package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +88 -56
  134. package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +4 -1
  135. package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +51 -32
  136. package/src/runtime/agent/orchestrator/runtime-core/goal-text.mjs +45 -145
  137. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +15 -98
  138. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +32 -99
  139. package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +23 -78
  140. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +69 -47
  141. package/src/runtime/agent/orchestrator/runtime-core/todo-list.mjs +367 -0
  142. package/src/runtime/agent/orchestrator/runtime-core/todo-tool-defs.mjs +47 -0
  143. package/src/runtime/agent/orchestrator/runtime-core/tool-availability.mjs +155 -0
  144. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +12 -0
  145. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +119 -35
  146. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +4 -1
  147. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +15 -6
  148. package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
  149. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +28 -22
  150. package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +30 -0
  151. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +30 -5
  152. package/src/runtime/agent/orchestrator/session/agent-room.mjs +171 -37
  153. package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +1 -1
  154. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +94 -10
  155. package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -2
  156. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +1 -1
  157. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -1
  158. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +3 -0
  159. package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +1 -1
  160. package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -12
  161. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +4 -4
  162. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +11 -6
  163. package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +6 -6
  164. package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +7 -3
  165. package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +11 -1
  166. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
  167. package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +1 -1
  168. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +37 -8
  169. package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +1 -1
  170. package/src/runtime/agent/orchestrator/session/image-strip-recovery.mjs +1 -1
  171. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +11 -1
  172. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +1 -1
  173. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +5 -3
  174. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +8 -1
  175. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/todo-check.mjs +196 -0
  176. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +116 -50
  177. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +8 -1
  178. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +1 -1
  179. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +1 -1
  180. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -1
  181. package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +5 -6
  182. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +27 -3
  183. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +18 -2
  184. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
  185. package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
  186. package/src/runtime/agent/orchestrator/session/loop/turn-report.mjs +35 -0
  187. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +1 -1
  188. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +103 -50
  189. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +9 -7
  190. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +21 -3
  191. package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +27 -11
  192. package/src/runtime/agent/orchestrator/session/manager/ask-turn-open.mjs +37 -34
  193. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +15 -0
  194. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +25 -15
  195. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +79 -24
  196. package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +3 -0
  197. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +12 -1
  198. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
  199. package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +6 -1
  200. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +9 -1
  201. package/src/runtime/agent/orchestrator/session/manager/pending-spool-path.mjs +2 -2
  202. package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +1 -1
  203. package/src/runtime/agent/orchestrator/session/manager/prompt-settings.mjs +598 -0
  204. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +20 -0
  205. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +22 -14
  206. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +2 -0
  207. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +12 -0
  208. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
  209. package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +1 -1
  210. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +56 -14
  211. package/src/runtime/agent/orchestrator/session/manager/session-lock.mjs +31 -0
  212. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +59 -20
  213. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +2 -0
  214. package/src/runtime/agent/orchestrator/session/manager/session-scratch-environment.mjs +70 -0
  215. package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +0 -3
  216. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +18 -4
  217. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +8 -9
  218. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +339 -88
  219. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +135 -11
  220. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +377 -104
  221. package/src/runtime/agent/orchestrator/session/manager/turn-durability.mjs +144 -0
  222. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +48 -30
  223. package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
  224. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +4 -0
  225. package/src/runtime/agent/orchestrator/session/manager.mjs +6 -0
  226. package/src/runtime/agent/orchestrator/session/mixy-name.mjs +12 -6
  227. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +8 -1
  228. package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +1 -1
  229. package/src/runtime/agent/orchestrator/session/save-session-worker.mjs +5 -1
  230. package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +1 -1
  231. package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +2 -2
  232. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +23 -2
  233. package/src/runtime/agent/orchestrator/session/store/sweep/sub-agent-retention.mjs +3 -3
  234. package/src/runtime/agent/orchestrator/session/store/transcript-durability.mjs +88 -0
  235. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +5 -0
  236. package/src/runtime/agent/orchestrator/session/store-summary-log.mjs +1 -1
  237. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +243 -38
  238. package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
  239. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +177 -8
  240. package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
  241. package/src/runtime/agent/orchestrator/session/store.mjs +5 -0
  242. package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +7 -1
  243. package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +9 -1
  244. package/src/runtime/agent/orchestrator/session/transcript-restore/agent-envelope.mjs +1 -1
  245. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +3 -1
  246. package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +2 -2
  247. package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -5
  248. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -1
  249. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
  250. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +21 -3
  251. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
  252. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/worktree-add-guard.mjs +77 -0
  253. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -1
  254. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +42 -28
  255. package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +30 -14
  256. package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +2 -2
  257. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
  258. package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +1 -1
  259. package/src/runtime/agent/orchestrator/tools/builtin/read-single-fast-paths.mjs +0 -1
  260. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +20 -15
  261. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +0 -10
  262. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +95 -20
  263. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
  264. package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -24
  265. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary/child-kill.mjs +4 -3
  266. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +1 -2
  267. package/src/runtime/agent/orchestrator/tools/code-graph/modes/calls.mjs +1 -1
  268. package/src/runtime/agent/orchestrator/tools/code-graph/modes/symbols.mjs +2 -2
  269. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +4 -5
  270. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +3 -4
  271. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4 -22
  272. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  273. package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +99 -2
  274. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +2 -0
  275. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +105 -15
  276. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +3 -1
  277. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +49 -15
  278. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +45 -27
  279. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +35 -11
  280. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +2 -0
  281. package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
  282. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -6
  283. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +0 -1
  284. package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
  285. package/src/runtime/attachments/attachment-reference.mjs +1 -1
  286. package/src/runtime/attachments/pdf-extract.mjs +1 -1
  287. package/src/runtime/attachments/store.d.mts +1 -0
  288. package/src/runtime/attachments/store.mjs +2 -2
  289. package/src/runtime/channels/lib/config-reload-watch.mjs +42 -0
  290. package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +29 -9
  291. package/src/runtime/channels/lib/scheduler.mjs +33 -0
  292. package/src/runtime/channels/lib/schedules-db.mjs +11 -4
  293. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +4 -1
  294. package/src/runtime/channels/lib/webhooks-db.mjs +9 -3
  295. package/src/runtime/channels/lib/whisper-port.mjs +19 -10
  296. package/src/runtime/channels/lib/whisper-server.mjs +22 -13
  297. package/src/runtime/channels/lib/worker-main.mjs +9 -31
  298. package/src/runtime/computer-bridge/linux-readiness.mjs +10 -14
  299. package/src/runtime/connectors/connector-accounts-mcp.mjs +372 -103
  300. package/src/runtime/connectors/gmail-app-password.mjs +4 -4
  301. package/src/runtime/connectors/google-mcp.mjs +1 -1
  302. package/src/runtime/effort-judge/judge-client.mjs +2 -2
  303. package/src/runtime/effort-judge/judge-input.mjs +4 -4
  304. package/src/runtime/explore/explorer.mjs +88 -0
  305. package/src/runtime/explore/tool-defs.mjs +35 -0
  306. package/src/runtime/explore/tool.mjs +123 -0
  307. package/src/runtime/local-provider/hardware.mjs +1 -1
  308. package/src/runtime/media/adapters/codex-image.mjs +3 -3
  309. package/src/runtime/media/adapters/gemini-video.mjs +1 -1
  310. package/src/runtime/media/media-usage.mjs +1 -1
  311. package/src/runtime/media/store.mjs +1 -1
  312. package/src/runtime/memory/index.mjs +15 -1
  313. package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
  314. package/src/runtime/memory/lib/embedding-reindex.mjs +27 -0
  315. package/src/runtime/memory/lib/embedding-worker.mjs +4 -0
  316. package/src/runtime/memory/lib/memory-embed.mjs +83 -14
  317. package/src/runtime/memory/lib/memory-process-lock.mjs +159 -36
  318. package/src/runtime/memory/lib/memory-text-utils.mjs +6 -1
  319. package/src/runtime/memory/lib/memory.mjs +17 -0
  320. package/src/runtime/memory/lib/pg/process.mjs +1 -1
  321. package/src/runtime/memory/lib/pg/supervisor.mjs +16 -96
  322. package/src/runtime/memory/lib/recall-hybrid/hybrid-sql.mjs +12 -3
  323. package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
  324. package/src/runtime/office/authoring/pptx-author-action.mjs +1 -1
  325. package/src/runtime/office/authoring/xlsx-html-build.mjs +1 -1
  326. package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
  327. package/src/runtime/office/capabilities.mjs +1 -1
  328. package/src/runtime/office/core/office-core.mjs +1 -1
  329. package/src/runtime/office/design/content-model.mjs +3 -3
  330. package/src/runtime/office/design/docx/design-docx/section.mjs +6 -6
  331. package/src/runtime/office/design/xlsx/design-xlsx-components.mjs +1 -1
  332. package/src/runtime/office/design/xlsx/design-xlsx.mjs +1 -1
  333. package/src/runtime/office/pdf/ocr-engine.mjs +1 -1
  334. package/src/runtime/office/pdf/pdf-writer.mjs +4 -4
  335. package/src/runtime/office/portable/portable-docx-operations.mjs +2 -2
  336. package/src/runtime/office/portable/portable-soffice.mjs +8 -6
  337. package/src/runtime/office/portable/xlsx-contract.mjs +1 -1
  338. package/src/runtime/office/quality/assurance-structure-docx.mjs +1 -1
  339. package/src/runtime/shared/agent-route-config.mjs +17 -2
  340. package/src/runtime/shared/atomic-file.d.mts +8 -0
  341. package/src/runtime/shared/atomic-file.mjs +103 -2
  342. package/src/runtime/shared/background-tasks.mjs +37 -10
  343. package/src/runtime/shared/background-wait.mjs +66 -0
  344. package/src/runtime/shared/child-guardian.mjs +17 -7
  345. package/src/runtime/shared/config.mjs +313 -16
  346. package/src/runtime/shared/connector-accounts.mjs +5 -5
  347. package/src/runtime/shared/connector-catalog.d.mts +14 -8
  348. package/src/runtime/shared/connector-catalog.mjs +70 -52
  349. package/src/runtime/shared/custom-provider-keys.mjs +20 -0
  350. package/src/runtime/shared/file-has-data.mjs +26 -2
  351. package/src/runtime/shared/file-lock.mjs +21 -18
  352. package/src/runtime/shared/git-launch.d.mts +9 -0
  353. package/src/runtime/shared/git-launch.mjs +213 -0
  354. package/src/runtime/shared/git-runner-worker.mjs +2 -1
  355. package/src/runtime/shared/git-runner.mjs +7 -2
  356. package/src/runtime/shared/idle-gc.mjs +30 -7
  357. package/src/runtime/shared/llm/cost.mjs +6 -1
  358. package/src/runtime/shared/llm/http-agent.mjs +316 -29
  359. package/src/runtime/shared/llm/model-catalog-projection.mjs +3 -2
  360. package/src/runtime/shared/llm/model-catalog.mjs +46 -6
  361. package/src/runtime/shared/llm/provider-catalog-registry.mjs +3 -0
  362. package/src/runtime/shared/llm/system-proxy.mjs +453 -0
  363. package/src/runtime/shared/llm/usage-ledger-quota.mjs +31 -12
  364. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +84 -8
  365. package/src/runtime/shared/llm/usage-ledger.mjs +3 -0
  366. package/src/runtime/shared/llm/usage-rollup.mjs +48 -0
  367. package/src/runtime/shared/maintenance-schedule.mjs +109 -0
  368. package/src/runtime/shared/process-runner.mjs +8 -4
  369. package/src/runtime/shared/provider-accounts.mjs +52 -2
  370. package/src/runtime/shared/routine-trigger.d.mts +13 -0
  371. package/src/runtime/shared/routine-trigger.mjs +34 -0
  372. package/src/runtime/shared/run-child.d.mts +2 -1
  373. package/src/runtime/shared/run-child.mjs +70 -18
  374. package/src/runtime/shared/session-scratch.mjs +14 -2
  375. package/src/runtime/shared/shipped-definitions.mjs +7 -1
  376. package/src/runtime/shared/staged-install-worker.mjs +5 -0
  377. package/src/runtime/shared/staged-update.mjs +47 -2
  378. package/src/runtime/shared/tool-card-model.golden.json +3 -12
  379. package/src/runtime/shared/tool-execution-contract.mjs +2 -0
  380. package/src/runtime/shared/tool-surface.mjs +110 -36
  381. package/src/runtime/shared/tool-work-units.mjs +35 -6
  382. package/src/runtime/shared/turn-snapshot.mjs +26 -4
  383. package/src/runtime/shared/turn-worktree-snapshot.mjs +409 -54
  384. package/src/runtime/shared/worker-requests.mjs +17 -3
  385. package/src/runtime/shared/worktrees/activity-gate.mjs +215 -318
  386. package/src/runtime/shared/worktrees/activity-ledger-worker.mjs +56 -0
  387. package/src/runtime/shared/worktrees/activity-ledger.mjs +391 -0
  388. package/src/runtime/shared/worktrees/branch-management.mjs +5 -3
  389. package/src/runtime/shared/worktrees/contract.mjs +16 -6
  390. package/src/runtime/shared/worktrees/dependencies.mjs +127 -89
  391. package/src/runtime/shared/worktrees/disk.mjs +79 -2
  392. package/src/runtime/shared/worktrees/git.mjs +97 -7
  393. package/src/runtime/shared/worktrees/include.mjs +6 -4
  394. package/src/runtime/shared/worktrees/maintenance.mjs +422 -30
  395. package/src/runtime/shared/worktrees/manager.mjs +962 -197
  396. package/src/runtime/shared/worktrees/settings.mjs +33 -7
  397. package/src/runtime/shared/worktrees/test-support.mjs +5 -1
  398. package/src/runtime/shared/worktrees/worker-snapshots.mjs +82 -0
  399. package/src/runtime/tidy/install.mjs +95 -15
  400. package/src/runtime/tidy/languages.mjs +17 -15
  401. package/src/runtime/tidy/process.mjs +9 -5
  402. package/src/runtime/tidy/resolve.mjs +19 -16
  403. package/src/runtime/tidy/runners/biome.mjs +3 -3
  404. package/src/runtime/tidy/tool.mjs +1 -1
  405. package/src/runtime/tidy/worktree.mjs +10 -6
  406. package/src/runtime/visualize-bridge/client.mjs +4 -1
  407. package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
  408. package/src/runtime/web-search/index.mjs +4 -23
  409. package/src/runtime/web-search/lib/web-tools.mjs +2 -2
  410. package/src/runtime/web-search/tool-defs.mjs +17 -26
  411. package/src/session-runtime/agent-profile-changes.mjs +55 -4
  412. package/src/session-runtime/agent-task-sessions.mjs +410 -353
  413. package/src/session-runtime/boot/apis.mjs +27 -4
  414. package/src/session-runtime/boot/begin.mjs +2 -0
  415. package/src/session-runtime/boot/config.mjs +10 -1
  416. package/src/session-runtime/boot/facade.mjs +1 -0
  417. package/src/session-runtime/boot/providers.mjs +70 -3
  418. package/src/session-runtime/boot/session.mjs +2 -0
  419. package/src/session-runtime/boot/tools.mjs +71 -25
  420. package/src/session-runtime/bot-status.mjs +103 -103
  421. package/src/session-runtime/channel-config-api.mjs +1 -0
  422. package/src/session-runtime/config-change-effects.mjs +179 -0
  423. package/src/session-runtime/config-lifecycle/config-writers.mjs +1 -0
  424. package/src/session-runtime/config-lifecycle.mjs +160 -24
  425. package/src/session-runtime/connector-merge-migration.mjs +18 -15
  426. package/src/session-runtime/conversation-import/discovery.mjs +245 -47
  427. package/src/session-runtime/conversation-import/service.mjs +12 -5
  428. package/src/session-runtime/goal-facade-api.mjs +49 -3
  429. package/src/session-runtime/handoff-attachments.mjs +1 -1
  430. package/src/session-runtime/held-requests.mjs +3 -1
  431. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +3 -0
  432. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -2
  433. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +5 -11
  434. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
  435. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +161 -120
  436. package/src/session-runtime/internal-tool-executor.mjs +12 -19
  437. package/src/session-runtime/lifecycle/cold-heir.mjs +7 -0
  438. package/src/session-runtime/lifecycle/memory-ingest.mjs +3 -3
  439. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +53 -5
  440. package/src/session-runtime/lifecycle/session-switch.mjs +13 -2
  441. package/src/session-runtime/lifecycle/teardown/session-close.mjs +10 -5
  442. package/src/session-runtime/lifecycle/teardown.mjs +1 -1
  443. package/src/session-runtime/lifecycle-api.mjs +1 -0
  444. package/src/session-runtime/mcp-glue/server-catalog.mjs +27 -10
  445. package/src/session-runtime/mcp-glue/server-connection.mjs +34 -8
  446. package/src/session-runtime/mcp-glue/server-input.mjs +4 -1
  447. package/src/session-runtime/mixy-heartbeat.mjs +1 -1
  448. package/src/session-runtime/model-route/set-route.mjs +40 -7
  449. package/src/session-runtime/native-web-search/routes.mjs +3 -3
  450. package/src/session-runtime/provider-auth/login.mjs +2 -2
  451. package/src/session-runtime/provider-auth/refresh.mjs +6 -3
  452. package/src/session-runtime/provider-auth/setup.mjs +1 -1
  453. package/src/session-runtime/provider-readiness.mjs +53 -4
  454. package/src/session-runtime/resource-api.mjs +1 -1
  455. package/src/session-runtime/resource-extension-sync.mjs +4 -8
  456. package/src/session-runtime/resource-mcp-api.mjs +98 -35
  457. package/src/session-runtime/resource-mcp-connector-accounts.mjs +49 -32
  458. package/src/session-runtime/resource-mcp-secrets.mjs +27 -10
  459. package/src/session-runtime/resource-mcp-servers.mjs +5 -4
  460. package/src/session-runtime/resource-plugins-api.mjs +4 -0
  461. package/src/session-runtime/routine-executor.mjs +152 -0
  462. package/src/session-runtime/routine-home-turn.mjs +46 -5
  463. package/src/session-runtime/runtime-facade.mjs +5 -0
  464. package/src/session-runtime/runtime-feature-gates.mjs +2 -11
  465. package/src/session-runtime/schedule-session-run.mjs +1 -0
  466. package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +6 -1
  467. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +7 -0
  468. package/src/session-runtime/services/agent-tool/send-flow.mjs +120 -8
  469. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +12 -0
  470. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +5 -0
  471. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +8 -3
  472. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +28 -7
  473. package/src/session-runtime/services/agent-tool.mjs +51 -1
  474. package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
  475. package/src/session-runtime/services/channel-admin.mjs +18 -0
  476. package/src/session-runtime/services/channel-worker/daemon-spawn.mjs +2 -0
  477. package/src/session-runtime/services/daemon-candidate.mjs +4 -1
  478. package/src/session-runtime/services/hook-bus/command-handler.mjs +7 -11
  479. package/src/session-runtime/services/memory-runtime-proxy/daemon-spawn.mjs +4 -0
  480. package/src/session-runtime/services/plugin-admin.mjs +14 -6
  481. package/src/session-runtime/services/provider-admin.mjs +281 -10
  482. package/src/session-runtime/services/seeds.mjs +7 -0
  483. package/src/session-runtime/services/usage-stats-model.mjs +32 -11
  484. package/src/session-runtime/session-create/materialize.mjs +4 -2
  485. package/src/session-runtime/session-create/session-options.mjs +2 -0
  486. package/src/session-runtime/session-turn-api.mjs +2 -0
  487. package/src/session-runtime/settings-builtin-tools-api.mjs +5 -10
  488. package/src/session-runtime/settings-system-api.mjs +1 -1
  489. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +13 -3
  490. package/src/session-runtime/setup-tool/connector-widen-approval.mjs +96 -0
  491. package/src/session-runtime/setup-tool/executor.mjs +14 -3
  492. package/src/session-runtime/setup-tool/extended-actions.mjs +2 -0
  493. package/src/session-runtime/setup-tool/settings-contract.mjs +28 -0
  494. package/src/session-runtime/setup-tool/tool-defs.mjs +28 -2
  495. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +40 -43
  496. package/src/session-runtime/tool-policy/mode-switch.mjs +1 -1
  497. package/src/session-runtime/tool-policy/policy-stage.mjs +106 -8
  498. package/src/session-runtime/tool-policy/workflow-overlay.mjs +2 -1
  499. package/src/session-runtime/tool-policy-refresh.mjs +182 -5
  500. package/src/session-runtime/tool-surface.mjs +38 -1
  501. package/src/session-runtime/turn/agent-ops.mjs +33 -2
  502. package/src/session-runtime/turn/session-ops.mjs +2 -0
  503. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +5 -0
  504. package/src/session-runtime/turn/turn-run.mjs +1 -1
  505. package/src/session-runtime/webhook-session-run.mjs +2 -0
  506. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +46 -11
  507. package/src/session-runtime/workflow-agents-api/agent-route.mjs +2 -0
  508. package/src/session-runtime/workflow-agents-api/instruction-files.mjs +165 -0
  509. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +5 -4
  510. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +2 -3
  511. package/src/session-runtime/workflow-agents-api.mjs +2 -0
  512. package/src/session-runtime/workspace/activity-guards.mjs +176 -0
  513. package/src/session-runtime/workspace/project-branches.mjs +1 -1
  514. package/src/session-runtime/workspace/session-view.mjs +149 -0
  515. package/src/session-runtime/workspace/side-checkouts.mjs +203 -0
  516. package/src/session-runtime/workspace/transition-runner.mjs +188 -0
  517. package/src/session-runtime/workspace/transitions.mjs +128 -1070
  518. package/src/session-runtime/workspace/workspace-merge.mjs +132 -0
  519. package/src/session-runtime/workspace/worktree-intents.mjs +242 -0
  520. package/src/session-runtime/workspace/worktree-maintenance.mjs +200 -0
  521. package/src/session-runtime/workspace/worktree-setup.mjs +97 -0
  522. package/src/session-runtime/workspace/worktree-tool.mjs +70 -54
  523. package/src/standalone/daemon-agent-control.mjs +25 -8
  524. package/src/standalone/daemon-desktop-runtime.mjs +8 -2
  525. package/src/standalone/daemon-lag-profiler.mjs +7 -7
  526. package/src/standalone/daemon-session-control.mjs +151 -136
  527. package/src/standalone/daemon.mjs +61 -2
  528. package/src/standalone/desktop-service-registry.mjs +9 -0
  529. package/src/standalone/local-session-runtime.mjs +21 -1
  530. package/src/standalone/session-client/daemon-unavailable.mjs +4 -1
  531. package/src/standalone/session-client.mjs +5 -1
  532. package/src/standalone/session-frame-stream.mjs +83 -11
  533. package/src/standalone/session-protocol.mjs +15 -0
  534. package/src/standalone/session-service/agent-route-follow.mjs +23 -20
  535. package/src/standalone/session-service/agent-tree/agent-turns.mjs +18 -6
  536. package/src/standalone/session-service/agent-tree.mjs +45 -9
  537. package/src/standalone/session-service/projection/transcript-window.mjs +700 -64
  538. package/src/standalone/session-service/quota-resume.mjs +9 -0
  539. package/src/standalone/session-service/session-calls/session-action.mjs +51 -1
  540. package/src/standalone/session-service/session-calls/session-turns.mjs +37 -18
  541. package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
  542. package/src/standalone/session-service/session-calls/turn-gate.mjs +34 -0
  543. package/src/standalone/session-service/session-calls.mjs +2 -1
  544. package/src/standalone/session-service/stored-reader.mjs +127 -40
  545. package/src/tui/App.jsx +162 -164
  546. package/src/tui/app/app-view/floating-panel.jsx +3 -0
  547. package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
  548. package/src/tui/app/clipboard.mjs +22 -11
  549. package/src/tui/app/create-app-pickers.mjs +2 -0
  550. package/src/tui/app/doctor.mjs +2 -2
  551. package/src/tui/app/panel-signature.mjs +1 -1
  552. package/src/tui/app/prompt-handlers/use-prompt-history-nav.mjs +1 -1
  553. package/src/tui/app/prompt-handlers/use-prompt-interrupt.mjs +3 -0
  554. package/src/tui/app/prompt-submit/provider-prompts.mjs +3 -1
  555. package/src/tui/app/provider-setup/api-key-actions.mjs +31 -1
  556. package/src/tui/app/provider-setup/oauth-actions.mjs +25 -6
  557. package/src/tui/app/provider-setup-picker.mjs +20 -13
  558. package/src/tui/app/settings-picker.mjs +53 -8
  559. package/src/tui/app/shell-layout/row-budgets.mjs +14 -12
  560. package/src/tui/app/slash-commands.mjs +2 -1
  561. package/src/tui/app/slash-dispatch/route-commands.mjs +1 -1
  562. package/src/tui/app/slash-dispatch/session-commands.mjs +47 -1
  563. package/src/tui/app/slash-dispatch.mjs +1 -1
  564. package/src/tui/app/use-btw-panel.mjs +29 -0
  565. package/src/tui/app/use-context-panel-refresh.mjs +31 -0
  566. package/src/tui/app/use-model-catalog-cache.mjs +13 -10
  567. package/src/tui/app/use-mouse-input.mjs +11 -0
  568. package/src/tui/app/use-onboarding-start.mjs +8 -3
  569. package/src/tui/app/use-panel-transition.mjs +10 -1
  570. package/src/tui/app/use-pasted-buffers.mjs +28 -20
  571. package/src/tui/app/use-prompt-draft-flow.mjs +7 -0
  572. package/src/tui/app/use-prompt-layout-rows.mjs +3 -3
  573. package/src/tui/app/use-prompt-queue-history.mjs +5 -4
  574. package/src/tui/app/use-selection-focus.mjs +11 -2
  575. package/src/tui/app/use-selection-geometry.mjs +18 -9
  576. package/src/tui/app/use-selection-paint.mjs +4 -4
  577. package/src/tui/app/use-selection-stitch.mjs +3 -3
  578. package/src/tui/app/use-slash-palette.mjs +62 -0
  579. package/src/tui/app/use-terminal-chrome.mjs +2 -2
  580. package/src/tui/app/use-transcript-activity.mjs +48 -33
  581. package/src/tui/app/use-transcript-follow.mjs +12 -4
  582. package/src/tui/app/use-transcript-scroll.mjs +46 -17
  583. package/src/tui/app/use-transcript-swap-reset.mjs +27 -0
  584. package/src/tui/app/use-transcript-window/geometry.mjs +20 -6
  585. package/src/tui/app/use-transcript-window/instance-state.mjs +4 -0
  586. package/src/tui/app/use-transcript-window/selection-shift.mjs +5 -1
  587. package/src/tui/app/use-transcript-window.mjs +21 -11
  588. package/src/tui/app/use-tui-ready.mjs +18 -0
  589. package/src/tui/app/use-welcome-prompt-hint.mjs +5 -0
  590. package/src/tui/app/use-workflow-tab-cycle.mjs +5 -3
  591. package/src/tui/components/Picker.jsx +27 -3
  592. package/src/tui/components/SignInUrl.jsx +68 -0
  593. package/src/tui/components/TextEntryPanel.jsx +76 -46
  594. package/src/tui/components/prompt-input/escape-policy.d.mts +0 -1
  595. package/src/tui/components/prompt-input/escape-policy.mjs +1 -1
  596. package/src/tui/components/question-panel-model.mjs +4 -4
  597. package/src/tui/components/sign-in-url-layout.mjs +24 -0
  598. package/src/tui/components/tool-execution/standard-card.jsx +3 -4
  599. package/src/tui/components/user-message-skills.mjs +1 -1
  600. package/src/tui/dist/index.mjs +2205 -1371
  601. package/src/tui/markdown/render-ansi.mjs +1 -1
  602. package/src/tui/session/agent-job-feed/notification-router.mjs +10 -0
  603. package/src/tui/session/agent-job-feed.mjs +2 -0
  604. package/src/tui/session/context-state.mjs +3 -0
  605. package/src/tui/session/goal-turn-state.mjs +6 -2
  606. package/src/tui/session/quota-resume.mjs +1 -1
  607. package/src/tui/session/session-api/controls.mjs +4 -0
  608. package/src/tui/session/session-api/extensions.mjs +8 -0
  609. package/src/tui/session/session-api/intake/abort.mjs +2 -1
  610. package/src/tui/session/session-api/intake.mjs +2 -0
  611. package/src/tui/session/session-api/integrations.mjs +2 -2
  612. package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
  613. package/src/tui/session/session-api/lifecycle/session-reset.mjs +7 -0
  614. package/src/tui/session/session-api/routes-agent-definitions.mjs +6 -0
  615. package/src/tui/session/session-api/settings.mjs +2 -2
  616. package/src/tui/session/session-api/worktree.mjs +13 -1
  617. package/src/tui/session/session-flow/drain.mjs +11 -14
  618. package/src/tui/session/tool-card-results/grouped-result.mjs +2 -2
  619. package/src/tui/session/transcript-spill/spill-writer.mjs +15 -0
  620. package/src/tui/session/transcript-spill.mjs +92 -4
  621. package/src/tui/session/transcript-store.mjs +2 -0
  622. package/src/tui/session/turn-quiet.mjs +1 -1
  623. package/src/tui/session/turn.mjs +3 -0
  624. package/src/tui/session/worktree-setup-notice.mjs +1 -1
  625. package/src/tui/spinner-meta.mjs +3 -3
  626. package/src/tui/spinner-verbs.mjs +2 -2
  627. package/src/defaults/skills/goal-management/SKILL.md +0 -169
  628. package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
  629. package/src/runtime/agent/orchestrator/runtime-core/goal-tasks.mjs +0 -156
  630. package/src/session-runtime/goal-tasks.mjs +0 -1
@@ -17,9 +17,19 @@ import {
17
17
  } from '../../runtime/agent/orchestrator/context/collect.mjs';
18
18
  import {
19
19
  _buildBaseRules,
20
+ _buildLeadLanguage,
21
+ _buildLeadLanguageContext,
20
22
  _buildLeadMetaContext,
21
23
  } from '../../runtime/agent/orchestrator/session/manager/rules-cache.mjs';
22
- import { sessionRolePromptFields } from '../../runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs';
24
+ import {
25
+ notePromptSettingsPresented,
26
+ promptConfigSlice,
27
+ } from '../../runtime/agent/orchestrator/session/manager/prompt-settings.mjs';
28
+ import { normalizeInstructionFilesMode } from '../../runtime/shared/instruction-files-mode.mjs';
29
+ import {
30
+ buildWorkspacePromptContext,
31
+ sessionRolePromptFields,
32
+ } from '../../runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs';
23
33
  import {
24
34
  delegationDisabled,
25
35
  honoredSchemaAllowlist,
@@ -32,14 +42,19 @@ import { AGENT_MODE, sessionModeOf } from '../../runtime/agent/orchestrator/sess
32
42
  import { unusedModelEditToolName } from '../../runtime/shared/edit-tool-dialect.mjs';
33
43
  import {
34
44
  presentedAgentCatalogSlice,
45
+ refreshSessionBp3Environment,
46
+ replaceLanguageBlock,
47
+ replaceWorkspaceCoreSlices,
48
+ replaceWorkspaceEnvironment,
35
49
  withPresentedWorkspaceSlices,
36
50
  } from '../../runtime/agent/orchestrator/session/manager/prompt-utils.mjs';
37
- import { leadPartsFor, rewriteSystemHeading, toolNames } from './surface-helpers.mjs';
51
+ import { leadPartsFor, rewriteConversationBp3Core, rewriteSystemHeading, toolNames } from './surface-helpers.mjs';
38
52
 
39
53
  export function createPolicyStage({
40
54
  getRoute,
41
55
  getMode,
42
56
  getDataDir,
57
+ getConfig,
43
58
  modelStandaloneTools,
44
59
  featureDisallowedTools,
45
60
  loadCoreMemoryContext,
@@ -96,17 +111,58 @@ export function createPolicyStage({
96
111
  }
97
112
  }
98
113
 
114
+ // The prompt-shaping settings sections `session` renders from `config` (the
115
+ // runtime's in-memory config) and `coreMemoryContext`, as session creation
116
+ // composes them (session-prompt-composition.mjs composeSessionSystem).
117
+ // `language` is the response language block closing the environment.
118
+ function promptSettingsSections(session, identity, config, coreMemoryContext) {
119
+ const ownerIsAgent = isAgentOwner(session);
120
+ const schemaAllowedTools = honoredSchemaAllowlist(session.schemaAllowedTools, {
121
+ ownerIsAgent,
122
+ agent: identity.agent,
123
+ });
124
+ const toolFreeRole = ownerIsAgent && schemaAllowedTools?.length === 0;
125
+ const agentMode = sessionModeOf(session) === AGENT_MODE;
126
+ const lead = !identity.skipAgentRules && !toolFreeRole && !ownerIsAgent;
127
+ const slice = promptConfigSlice(config);
128
+ const skip = identity.profileSkip || {};
129
+ const skills = schemaAllowedTools?.length === 0 ? [] : collectPromptSkillsCached(session.cwd, config);
130
+ const { packContext, summary, leadPromptParts, orchestrationMode } = activeWorkflowContext(config, getDataDir());
131
+ // A coding Lead's mode text, as session creation records it.
132
+ const codingLead = !ownerIsAgent && !agentMode;
133
+ return {
134
+ meta: lead ? _buildLeadMetaContext({ includeOutputStyle: !agentMode, config: slice }) : '',
135
+ // The workflow pack and the skill listing BP2 carries.
136
+ workflow: String(packContext || ''),
137
+ workflowName: summary?.name || summary?.id || null,
138
+ orchestration: codingLead ? String(leadPartsFor(session, leadPromptParts).orchestrationContext || '') : '',
139
+ orchestrationMode: codingLead ? orchestrationMode || '' : '',
140
+ skills: buildSkillManifest(skills),
141
+ instructionFilesMode: normalizeInstructionFilesMode(slice?.instructionFiles),
142
+ language: lead ? _buildLeadLanguageContext({ includeOutputStyle: !agentMode, config: slice }) : '',
143
+ instructionFiles:
144
+ toolFreeRole || agentMode || skip.claudemd ? '' : String(loadInstructionFilesContext?.(session) || ''),
145
+ coreMemory: skip.memory ? '' : String(coreMemoryContext || ''),
146
+ // Not a section: the language per-request rules match (tail-reminder-rules.mjs).
147
+ responseLanguage: lead ? _buildLeadLanguage({ config: slice }) || null : null,
148
+ };
149
+ }
150
+
99
151
  // The policy `config` gives `session`, computed without touching the
100
152
  // session, so a turn that starts during the async rebuild cannot lose tools
101
153
  // to it. `conversation`: the rebuilt BP3 core keeps the instruction files
102
154
  // and core memory the prompt presents now (withPresentedWorkspaceSlices).
103
- async function stagePolicy(session, identity, config, { conversation = false } = {}) {
155
+ // `settings`: the prompt settings sections as they stand (a fold or an
156
+ // empty rebuild presents them); `coreMemoryContext` a snapshot already read.
157
+ async function stagePolicy(session, identity, config, { conversation = false, coreMemoryContext: memory } = {}) {
104
158
  const ownerIsAgent = isAgentOwner(session);
105
159
  const schemaAllowedTools = honoredSchemaAllowlist(session.schemaAllowedTools, {
106
160
  ownerIsAgent,
107
161
  agent: identity.agent,
108
162
  });
109
163
  const toolFreeRole = ownerIsAgent && schemaAllowedTools?.length === 0;
164
+ const freshMemory = memory ?? (await leadCoreMemoryContext());
165
+ const settings = promptSettingsSections(session, identity, config, freshMemory);
110
166
 
111
167
  const {
112
168
  summary: workflow,
@@ -139,12 +195,11 @@ export function createPolicyStage({
139
195
  provider: getRoute()?.provider,
140
196
  model: getRoute()?.model,
141
197
  });
142
- const coreMemoryContext = conversation ? '' : await leadCoreMemoryContext();
198
+ const coreMemoryContext = conversation ? '' : freshMemory;
143
199
  // BP2's stable part as session creation composes it
144
200
  // (session-prompt-composition.mjs): the Lead meta context and the skill
145
201
  // manifest of the skills in scope now.
146
202
  const skipRules = identity.skipAgentRules || toolFreeRole;
147
- const skills = schemaAllowedTools?.length === 0 ? [] : collectPromptSkillsCached(session.cwd);
148
203
  const { sessionMarkerCore, stableSystemContext } = composeSystemPrompt({
149
204
  ...sessionRolePromptFields(identity, {
150
205
  ownerIsAgent,
@@ -160,8 +215,8 @@ export function createPolicyStage({
160
215
  // setting; agent mode carries none.
161
216
  instructionFilesContext:
162
217
  conversation || toolFreeRole || agentMode ? null : loadInstructionFilesContext?.(session) || null,
163
- metaContext: skipRules || ownerIsAgent ? undefined : _buildLeadMetaContext({ includeOutputStyle: !agentMode }),
164
- skillManifest: buildSkillManifest(skills),
218
+ metaContext: settings.meta || undefined,
219
+ skillManifest: settings.skills,
165
220
  });
166
221
  return {
167
222
  workflow,
@@ -174,9 +229,44 @@ export function createPolicyStage({
174
229
  core: conversation ? withPresentedWorkspaceSlices(session, sessionMarkerCore) : sessionMarkerCore,
175
230
  // Without BP1 the BP2 block cannot be located: null leaves it as it is.
176
231
  stableContext: skipRules ? null : stableSystemContext,
232
+ settings,
177
233
  };
178
234
  }
179
235
 
236
+ /**
237
+ * Make the prompt present `staged.settings` (an empty session's rebuild, a
238
+ * fold): the BP3 core's instruction files and core memory and the language
239
+ * block closing the environment; the caller has written BP2 and the core.
240
+ * A staged workspace re-root keeps the slices it will replace itself.
241
+ */
242
+ function presentPromptSettings(session, staged) {
243
+ const { settings } = staged;
244
+ if (!session.workspaceReroot) {
245
+ rewriteConversationBp3Core(
246
+ session,
247
+ replaceWorkspaceCoreSlices(staged.core, {
248
+ coreMemoryContext: settings.coreMemory,
249
+ instructionFilesContext: settings.instructionFiles,
250
+ })
251
+ );
252
+ }
253
+ if (typeof session.bp3EnvironmentContext === 'string') {
254
+ session.bp3EnvironmentContext = replaceLanguageBlock(session.bp3EnvironmentContext, settings.language);
255
+ refreshSessionBp3Environment(session, session.cwd);
256
+ }
257
+ notePromptSettingsPresented(session, settings);
258
+ }
259
+
260
+ /** An empty session's rebuild: the shell, git and listing facts as they stand. */
261
+ function refreshEnvironmentFacts(session) {
262
+ if (typeof session.bp3EnvironmentContext !== 'string' || !session.cwd || session.workspaceReroot) return;
263
+ const { environmentContext } = buildWorkspacePromptContext(session, session.cwd, {
264
+ instructionFilesMode: promptConfigSlice(getConfig?.())?.instructionFiles,
265
+ });
266
+ session.bp3EnvironmentContext = replaceWorkspaceEnvironment(session.bp3EnvironmentContext, environmentContext);
267
+ refreshSessionBp3Environment(session, session.cwd);
268
+ }
269
+
180
270
  // Apply a staged policy synchronously; the BP3 core is the caller's. The
181
271
  // prompt then carries the session's workflow and tools as they stand.
182
272
  function applyPolicy(session, staged) {
@@ -184,6 +274,7 @@ export function createPolicyStage({
184
274
  delete session.orchestrationModeOverlay;
185
275
  delete session.workflowOpenedTools;
186
276
  delete session.promptFoldPending;
277
+ delete session.compactionFoldPending;
187
278
  session.workflow = toSessionWorkflowMeta(staged.workflow);
188
279
  session.orchestrationMode = staged.orchestrationMode;
189
280
  session.sessionMode = staged.sessionMode;
@@ -197,5 +288,12 @@ export function createPolicyStage({
197
288
  session.updatedAt = Date.now();
198
289
  }
199
290
 
200
- return { liveDeniedTools, stagePolicy, applyPolicy };
291
+ return {
292
+ liveDeniedTools,
293
+ stagePolicy,
294
+ applyPolicy,
295
+ promptSettingsSections,
296
+ presentPromptSettings,
297
+ refreshEnvironmentFacts,
298
+ };
201
299
  }
@@ -78,7 +78,8 @@ export function createWorkflowOverlay({ liveDeniedTools, modelStandaloneTools })
78
78
  if (!loadableTools.length) return;
79
79
  const opened = session.workflowOpenedTools || [];
80
80
  session.workflowOpenedTools = [...new Set([...opened, ...loadableTools])];
81
- if (fresh.length) session.deferredToolCatalog = [...(session.deferredToolCatalog || []), ...fresh];
81
+ // The late pool, never the boot catalog a native request keeps byte-stable.
82
+ if (fresh.length) session.deferredLateToolCatalog = [...(session.deferredLateToolCatalog || []), ...fresh];
82
83
  session.disallowedTools = (session.disallowedTools || []).filter((name) => !loadableTools.includes(String(name)));
83
84
  const byName = new Map(schemaTools(session).map((tool) => [toolName(tool), tool]));
84
85
  // Announced on every switch that opens them: a pending removal (a switch
@@ -1,7 +1,7 @@
1
- // Refresh the empty Lead session's model-facing tool surface and BP1/BP3
2
- // layers after workflow or search/memory settings change. Conversation
3
- // sessions keep their frozen schema; the next new session picks up the
4
- // updated policy. The exceptions are a workflow or orchestration mode switch
1
+ // Bring a session to the settings as they stand at each turn start
2
+ // (reconcileTurnSettings): an empty session's tool surface and BP1/BP3 are
3
+ // rebuilt; a conversation keeps its prefix and takes moved tool gates live.
4
+ // Setters only save config. The exceptions are a workflow or orchestration mode switch
5
5
  // made in the session itself (switchSessionWorkflow,
6
6
  // switchSessionOrchestrationMode), which that conversation takes as an overlay.
7
7
  import { sessionHasConversationMessages } from '../runtime/agent/orchestrator/runtime-core/session-text.mjs';
@@ -9,6 +9,17 @@ import { createAgentProfileFold } from './tool-policy/agent-profile-fold.mjs';
9
9
  import { createPolicyStage } from './tool-policy/policy-stage.mjs';
10
10
  import { createSessionSwitches } from './tool-policy/session-switches.mjs';
11
11
  import { rewriteBp3Core } from './tool-policy/surface-helpers.mjs';
12
+ import {
13
+ stageConnectorAvailability,
14
+ stageToolAvailability,
15
+ } from '../runtime/agent/orchestrator/runtime-core/tool-availability.mjs';
16
+ import { resetBp2StableContext } from '../runtime/agent/orchestrator/context/collect.mjs';
17
+ import {
18
+ promptSettingsRecord,
19
+ stagePromptSettingsNotice,
20
+ } from '../runtime/agent/orchestrator/session/manager/prompt-settings.mjs';
21
+ import { isAgentOwner } from '../runtime/agent/orchestrator/agent-owner.mjs';
22
+ import { configForSession, currentMode } from './tool-policy/surface-helpers.mjs';
12
23
 
13
24
  export function createToolPolicyRefresh({
14
25
  getSession,
@@ -24,11 +35,21 @@ export function createToolPolicyRefresh({
24
35
  activeWorkflowContext,
25
36
  invalidatePreSessionToolSurface,
26
37
  persistSession,
38
+ toolDefinitionsFor = () => [],
39
+ getSurfaceGeneration,
27
40
  }) {
28
- const { liveDeniedTools, stagePolicy, applyPolicy } = createPolicyStage({
41
+ const {
42
+ liveDeniedTools,
43
+ stagePolicy,
44
+ applyPolicy,
45
+ promptSettingsSections,
46
+ presentPromptSettings,
47
+ refreshEnvironmentFacts,
48
+ } = createPolicyStage({
29
49
  getRoute,
30
50
  getMode,
31
51
  getDataDir,
52
+ getConfig,
32
53
  modelStandaloneTools,
33
54
  featureDisallowedTools,
34
55
  loadCoreMemoryContext,
@@ -55,6 +76,153 @@ export function createToolPolicyRefresh({
55
76
  );
56
77
  }
57
78
 
79
+ // What the gates a surface is built from read: the config object (replaced,
80
+ // never mutated, on every adopt and every reload of a change made
81
+ // elsewhere), the surface generation (skills/plugins invalidate it) and the
82
+ // live gate list (which carries bridge presence).
83
+ const configGenerations = new WeakMap();
84
+ let configCount = 0;
85
+ function availabilityKey() {
86
+ const config = getConfig?.() || {};
87
+ let generation = configGenerations.get(config);
88
+ if (generation === undefined) {
89
+ generation = ++configCount;
90
+ configGenerations.set(config, generation);
91
+ }
92
+ return `${generation}|${getSurfaceGeneration?.() || 0}|${featureDisallowedTools().join(',')}`;
93
+ }
94
+ // Session → the key it was last brought to (process-local, so a session
95
+ // first seen here, e.g. resumed, is checked once).
96
+ const appliedKeys = new WeakMap();
97
+
98
+ const conversationEmpty = (session) =>
99
+ !sessionHasConversationMessages(session) && !sessionHasConversationMessages({ messages: session.liveTurnMessages });
100
+
101
+ // The revision of the prompt settings `session` would be built from now.
102
+ function settingsRevision(session, coreMemory) {
103
+ const identity = session.promptIdentity;
104
+ if (!identity) return undefined;
105
+ const config = configForSession(getConfig(), session.workflow?.id, currentMode(session));
106
+ return promptSettingsRecord(promptSettingsSections(session, identity, config, coreMemory)).revision;
107
+ }
108
+
109
+ /** A session just built from the current settings (`coreMemory`: the
110
+ * snapshot its prompt was composed with). */
111
+ function noteToolAvailability(session, coreMemory = '') {
112
+ if (session) {
113
+ appliedKeys.set(session, {
114
+ gates: availabilityKey(),
115
+ settings: settingsRevision(session, String(coreMemory || '')),
116
+ });
117
+ }
118
+ }
119
+
120
+ /** Whether a settings change reaches the current session's whole prompt
121
+ * (no session yet, or one without a conversation, rebuilt at its turn). */
122
+ function settingsReachCurrentSession() {
123
+ const session = getSession?.();
124
+ return !session?.id || (Boolean(session.promptIdentity) && conversationEmpty(session));
125
+ }
126
+
127
+ async function readCoreMemory() {
128
+ try {
129
+ return String((await loadCoreMemoryContext?.()) || '');
130
+ } catch {
131
+ return '';
132
+ }
133
+ }
134
+
135
+ async function reconcileSession(session) {
136
+ // Connector switches are read from their (stat-cached) files every turn.
137
+ const connectors = stageConnectorAvailability(session);
138
+ const coreMemory = await readCoreMemory();
139
+ const gates = availabilityKey();
140
+ const identity = session.promptIdentity;
141
+ // The prompt settings as they stand, file-based ones included (core
142
+ // memory, instruction files, output-style files, the workflow pack, the
143
+ // skill listing): their revision is part of the key.
144
+ const sections = identity
145
+ ? promptSettingsSections(
146
+ session,
147
+ identity,
148
+ configForSession(getConfig(), session.workflow?.id, currentMode(session)),
149
+ coreMemory
150
+ )
151
+ : null;
152
+ const settings = sections ? promptSettingsRecord(sections).revision : undefined;
153
+ const applied = appliedKeys.get(session);
154
+ if (applied?.gates === gates && applied.settings === settings && !session.promptSettingsRecheck) {
155
+ return connectors ? { rebuilt: false, ...connectors } : null;
156
+ }
157
+ let rebuilt = false;
158
+ let settingsChanged = [];
159
+ if (identity && conversationEmpty(session)) {
160
+ // Nothing was sent: the whole prompt is rebuilt in place.
161
+ const staged = await stagePolicy(session, identity, getConfig(), { coreMemoryContext: coreMemory });
162
+ if (getSession?.() === session && conversationEmpty(session)) {
163
+ if (typeof staged.stableContext === 'string') resetBp2StableContext(session, staged.stableContext);
164
+ applyPolicy(session, staged);
165
+ rewriteBp3Core(session, staged.core);
166
+ presentPromptSettings(session, staged);
167
+ refreshEnvironmentFacts(session);
168
+ // The first-turn MCP fold may rebuild it in place too (an empty
169
+ // session reopened from disk was never marked).
170
+ session.deferredInitialRefreshPending = true;
171
+ rebuilt = true;
172
+ }
173
+ } else if (identity) {
174
+ // A conversation keeps its prefix: told once, folded at the next cold point.
175
+ settingsChanged = stagePromptSettingsNotice(session, sections);
176
+ // A delegated worker is never folded: after a compaction it is told
177
+ // again instead (rearmPromptSettingsNotice).
178
+ if (settingsChanged.length && !isAgentOwner(session)) session.promptFoldPending = true;
179
+ }
180
+ const staged = stageToolAvailability(session, featureDisallowedTools(), toolDefinitionsFor);
181
+ appliedKeys.set(session, { gates, settings: rebuilt ? session.promptSettings?.revision : settings });
182
+ const tools = staged || connectors;
183
+ const merged =
184
+ staged && connectors
185
+ ? { added: [...staged.added, ...connectors.added], removed: [...staged.removed, ...connectors.removed] }
186
+ : tools;
187
+ return rebuilt || tools || settingsChanged.length
188
+ ? { rebuilt, ...(merged || {}), ...(settingsChanged.length ? { settingsChanged } : {}) }
189
+ : null;
190
+ }
191
+
192
+ // One reconcile per session at a time: a turn start and a surface read of
193
+ // the same empty session share it.
194
+ const inflight = new WeakMap();
195
+
196
+ /** Turn start, any session kind: an empty session is rebuilt from current
197
+ * settings; a conversation keeps its prefix, takes moved tool gates live
198
+ * (stageToolAvailability) and prompt settings as a one-time notice. */
199
+ function reconcileTurnSettings() {
200
+ const session = getSession?.();
201
+ if (!session?.id) return Promise.resolve(null);
202
+ let running = inflight.get(session);
203
+ if (!running) {
204
+ running = reconcileSession(session).finally(() => inflight.delete(session));
205
+ inflight.set(session, running);
206
+ }
207
+ return running;
208
+ }
209
+
210
+ /** A read of an empty session's surface or status: the same reconcile, so
211
+ * what is shown is what its first turn will send. A conversation (or a
212
+ * running turn) is left to its turn start. */
213
+ function reconcileEmptySession() {
214
+ const session = getSession?.();
215
+ if (!session?.id || turnInFlight(session) || !conversationEmpty(session)) return Promise.resolve(null);
216
+ return reconcileTurnSettings();
217
+ }
218
+
219
+ /** Sync: whether an empty session's surface lags the settings gates. */
220
+ function emptySessionStale() {
221
+ const session = getSession?.();
222
+ if (!session?.id || turnInFlight(session) || !conversationEmpty(session)) return false;
223
+ return appliedKeys.get(session)?.gates !== availabilityKey();
224
+ }
225
+
58
226
  async function refreshEmptySessionToolPolicy() {
59
227
  invalidatePreSessionToolSurface?.();
60
228
  const session = getSession?.();
@@ -67,8 +235,11 @@ export function createToolPolicyRefresh({
67
235
  const staged = await stagePolicy(session, identity, getConfig());
68
236
  // Apply: re-check admission after the await, then mutate synchronously.
69
237
  if (!admitsRefresh(session)) return { appliedToCurrentSession: false };
238
+ if (typeof staged.stableContext === 'string') resetBp2StableContext(session, staged.stableContext);
70
239
  applyPolicy(session, staged);
71
240
  rewriteBp3Core(session, staged.core);
241
+ presentPromptSettings(session, staged);
242
+ refreshEnvironmentFacts(session);
72
243
  return { appliedToCurrentSession: true };
73
244
  }
74
245
 
@@ -91,10 +262,16 @@ export function createToolPolicyRefresh({
91
262
  liveDeniedTools,
92
263
  stagePolicy,
93
264
  applyPolicy,
265
+ presentPromptSettings,
94
266
  turnInFlight,
95
267
  });
96
268
 
97
269
  return {
270
+ reconcileTurnSettings,
271
+ reconcileEmptySession,
272
+ emptySessionStale,
273
+ noteToolAvailability,
274
+ settingsReachCurrentSession,
98
275
  refreshEmptySessionToolPolicy,
99
276
  switchSessionWorkflow: switches.switchSessionWorkflow,
100
277
  switchSessionOrchestrationMode: switches.switchSessionOrchestrationMode,
@@ -6,7 +6,10 @@ import {
6
6
  filterDisallowedTools,
7
7
  selectDeferredTools,
8
8
  } from '../runtime/agent/orchestrator/runtime-core/tool-catalog.mjs';
9
- import { AGENT_WORKER_DENIED_TOOLS } from '../runtime/agent/orchestrator/session/manager/tool-resolution.mjs';
9
+ import {
10
+ AGENT_WORKER_DENIED_TOOLS,
11
+ finalizeSessionToolList,
12
+ } from '../runtime/agent/orchestrator/session/manager/tool-resolution.mjs';
10
13
  import { LEAD_DISALLOWED_TOOLS } from '../runtime/agent/orchestrator/runtime-core/tool-defs.mjs';
11
14
  import { deferredSurfaceModeForLead, toolSpecForMode } from '../runtime/agent/orchestrator/runtime-core/effort.mjs';
12
15
  import { loadSkillToolDependencies } from '../runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs';
@@ -39,6 +42,11 @@ export function createToolSurface({
39
42
  getFeatureDisallowedTools = () => [],
40
43
  }) {
41
44
  let preSessionSurface = null;
45
+ // The inputs the cached preview was built from (setters no longer
46
+ // invalidate it; a config adopt or reload replaces the config object).
47
+ let preSessionInputs = '';
48
+ let preSessionConfig = null;
49
+ let surfaceGeneration = 0;
42
50
 
43
51
  // A coding Lead keeps `agent` whichever agents exist (the agents reach it as
44
52
  // a listing reminder); Solo still offers it (deferred) for explicit user
@@ -122,16 +130,45 @@ export function createToolSurface({
122
130
  return selectDeferredTools(session, names, surfaceMode);
123
131
  }
124
132
 
133
+ /** Definitions the current session's kind may hold — built-ins included —
134
+ * for tools a settings gate opened mid-conversation. */
135
+ function toolDefinitionsFor(names) {
136
+ const wanted = new Set((names || []).map(String));
137
+ const session = getSession();
138
+ const ownerIsAgent = isAgentOwner(session);
139
+ const previewTools =
140
+ typeof mgr.previewSessionTools === 'function'
141
+ ? mgr.previewSessionTools(toolSpecForMode(mode), [], {
142
+ mcpScopeId: getMcpScopeId(),
143
+ modelName: getRoute().model,
144
+ cwd: getCurrentCwd?.() || null,
145
+ })
146
+ : [];
147
+ const byName = new Map();
148
+ for (const tool of [...modelStandaloneTools(), ...filterModelToolsForProfile(previewTools, getToolProfile())]) {
149
+ const name = String(tool?.name || '');
150
+ if (wanted.has(name) && !byName.has(name)) byName.set(name, tool);
151
+ }
152
+ return finalizeSessionToolList([...byName.values()], { ownerIsAgent });
153
+ }
154
+
125
155
  return {
126
156
  modelStandaloneTools,
127
157
  activateTools,
158
+ toolDefinitionsFor,
159
+ surfaceGeneration: () => surfaceGeneration,
128
160
  invalidatePreSessionToolSurface() {
129
161
  preSessionSurface = null;
162
+ surfaceGeneration += 1;
130
163
  },
131
164
  /** The live session once it exists; the preview surface until then. */
132
165
  activeToolSurface() {
133
166
  const session = getSession();
134
167
  if (session) return session;
168
+ const inputs = getFeatureDisallowedTools().join(',');
169
+ if (preSessionConfig !== getConfig() || preSessionInputs !== inputs) preSessionSurface = null;
170
+ preSessionConfig = getConfig();
171
+ preSessionInputs = inputs;
135
172
  preSessionSurface ??= buildPreSessionSurface();
136
173
  return preSessionSurface;
137
174
  },
@@ -31,6 +31,7 @@ export function createAgentOps(deps) {
31
31
  subscribeRuntimeNotification,
32
32
  agentTool,
33
33
  activeToolSurface,
34
+ reconcileEmptySession,
34
35
  notificationListeners,
35
36
  getReservedSessionId,
36
37
  } = deps;
@@ -72,6 +73,27 @@ export function createAgentOps(deps) {
72
73
  });
73
74
  }
74
75
 
76
+ // `/stop`: the background shells this session would stop, then stopping all
77
+ // of them through the same per-task cancel.
78
+ async function listStoppableShellJobs() {
79
+ const session = getSession();
80
+ const { listStoppableShellJobs: list } = await import(
81
+ '../../runtime/agent/orchestrator/tools/builtin/task-tool.mjs'
82
+ );
83
+ return {
84
+ jobs: list({ callerSessionId: session?.id || null, clientHostPid: session?.clientHostPid || process.pid }),
85
+ };
86
+ }
87
+
88
+ async function stopShellJobs() {
89
+ const session = getSession();
90
+ const { stopBackgroundShellJobs } = await import('../../runtime/agent/orchestrator/tools/builtin/task-tool.mjs');
91
+ return stopBackgroundShellJobs({
92
+ callerSessionId: session?.id || null,
93
+ clientHostPid: session?.clientHostPid || process.pid,
94
+ });
95
+ }
96
+
75
97
  // Explicit user force-release ("Release anyway") of a shell job whose
76
98
  // termination is unconfirmed: drops its workspace hold. The surface has
77
99
  // already asked the user to confirm. The caller session's own holds, and
@@ -115,7 +137,14 @@ export function createAgentOps(deps) {
115
137
  return () => notificationListeners.delete(listener);
116
138
  }
117
139
 
118
- function toolsStatus(query = '') {
140
+ // An empty session has nothing cached: it is brought to the settings first
141
+ // (the turn-start reconcile), so the list is what its first turn sends.
142
+ async function toolsStatus(query = '') {
143
+ await reconcileEmptySession?.();
144
+ return toolsStatusNow(query);
145
+ }
146
+
147
+ function toolsStatusNow(query = '') {
119
148
  const surface = activeToolSurface();
120
149
  let catalog = [];
121
150
  if (Array.isArray(surface?.deferredToolCatalog)) catalog = surface.deferredToolCatalog;
@@ -140,13 +169,15 @@ export function createAgentOps(deps) {
140
169
  function selectTools(names) {
141
170
  const list = Array.isArray(names) ? names : String(names || '').split(/[,\s]+/);
142
171
  const result = selectDeferredTools(activeToolSurface(), list, getMode());
143
- return { ...result, status: toolsStatus() };
172
+ return { ...result, status: toolsStatusNow() };
144
173
  }
145
174
 
146
175
  return {
147
176
  agentControl,
148
177
  taskControl,
149
178
  stopShellJob,
179
+ listStoppableShellJobs,
180
+ stopShellJobs,
150
181
  releaseShellJob,
151
182
  listShellJobs,
152
183
  onNotification,
@@ -6,6 +6,7 @@ import { normalizeToolMode } from '../../runtime/agent/orchestrator/runtime-core
6
6
  import { interruptTaskWaitForSession } from '../../runtime/agent/orchestrator/session/task-wait-control.mjs';
7
7
  import { markPendingGoalReminder } from '../../runtime/agent/orchestrator/runtime-core/goal-reminder.mjs';
8
8
  import { rearmLateDeferredTools } from '../../runtime/agent/orchestrator/runtime-core/tool-catalog.mjs';
9
+ import { rearmPromptSettingsNotice } from '../../runtime/agent/orchestrator/session/manager/prompt-settings.mjs';
9
10
 
10
11
  export function createSessionOps(deps) {
11
12
  const {
@@ -101,6 +102,7 @@ export function createSessionOps(deps) {
101
102
  // The same compaction strips late MCP tool announcements from older turns.
102
103
  try {
103
104
  rearmLateDeferredTools(getSession());
105
+ rearmPromptSettingsNotice(getSession());
104
106
  } catch {
105
107
  /* best-effort: a tool reminder must never break manual compact */
106
108
  }
@@ -90,6 +90,7 @@ export function createTurnPreparation({
90
90
  applyPendingRoute,
91
91
  applyPendingAgentProfile,
92
92
  applyPendingSessionSwitches,
93
+ reconcileTurnSettings,
93
94
  }) {
94
95
  async function admitWorkspace(turn, prompt, options) {
95
96
  // Turn admission: waits while this session's workspace transitions or
@@ -149,6 +150,10 @@ export function createTurnPreparation({
149
150
  // An orchestration mode or workflow chosen while the previous turn ran
150
151
  // applies from this one (before a cold-cache fold can take it in).
151
152
  const sessionSwitches = applyPendingSessionSwitches?.();
153
+ // Settings saved since this session last ran (here or in any other
154
+ // runtime): an empty session is rebuilt, a conversation takes moved tool
155
+ // gates live — before a cold-cache fold below can take them in.
156
+ await reconcileTurnSettings?.();
152
157
  // An agent profile saved while the previous turn ran applies from this one.
153
158
  await applyPendingAgentProfile?.();
154
159
  options.onRouteApplied?.(getSession());
@@ -85,7 +85,7 @@ export function createTurnRunner(deps) {
85
85
  // The agents enabled now (coding Leads), asked for each user turn
86
86
  // the ask prepares, for its agent list reminder
87
87
  // (manager/agent-listing-notice.mjs).
88
- { ...callbacks, agentsNow: currentAgents }
88
+ { ...callbacks, agentsNow: currentAgents, agentConfig: getConfig }
89
89
  );
90
90
  } finally {
91
91
  releaseWebSearchUsage?.();
@@ -43,6 +43,7 @@ function runWebhookTurn({
43
43
  name,
44
44
  prompt,
45
45
  ownerAgentId = null,
46
+ executorAgentId = null,
46
47
  cwd = null,
47
48
  attachments = null,
48
49
  event = '',
@@ -55,6 +56,7 @@ function runWebhookTurn({
55
56
  kind: 'webhook',
56
57
  name: endpoint,
57
58
  ownerAgentId,
59
+ executorAgentId: executorAgentId || null,
58
60
  prompt,
59
61
  skillSelection: String(skillSelection ?? ''),
60
62
  attachments,