mixdog 1.2.2 → 1.2.4

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 (692) hide show
  1. package/README.md +18 -0
  2. package/package.json +2 -1
  3. package/scripts/gate-local.mjs +6 -4
  4. package/scripts/lib/gate-scheduler.mjs +29 -11
  5. package/scripts/probe-provider-catalog.mjs +31 -0
  6. package/scripts/provider-pingpong-live.mjs +599 -0
  7. package/scripts/session-sweep.mjs +5 -25
  8. package/src/agents/advisor/AGENT.md +1 -1
  9. package/src/agents/advisor/agent.json +1 -1
  10. package/src/agents/maintainer/AGENT.md +1 -1
  11. package/src/agents/maintainer/agent.json +1 -1
  12. package/src/agents/reviewer/AGENT.md +2 -4
  13. package/src/agents/security/AGENT.md +1 -2
  14. package/src/agents/writer/AGENT.md +2 -3
  15. package/src/defaults/shipped-history.json +11 -1
  16. package/src/defaults/skills/image/SKILL.md +21 -23
  17. package/src/defaults/skills/setup/SKILL.md +6 -1
  18. package/src/defaults/skills/setup/references/actions.md +44 -22
  19. package/src/defaults/skills/setup/references/surfaces.md +10 -8
  20. package/src/headless-exec.mjs +15 -8
  21. package/src/lib/keychain-cjs.cjs +20 -15
  22. package/src/output-styles/common.md +11 -10
  23. package/src/rules/agent/AGENT.md +6 -4
  24. package/src/rules/lead/LEAD.md +7 -9
  25. package/src/rules/shared/45-destructive.md +4 -0
  26. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +1 -0
  27. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +28 -7
  28. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -11
  29. package/src/runtime/agent/orchestrator/agent-trace-io.mjs +92 -61
  30. package/src/runtime/agent/orchestrator/cache-mtime.mjs +10 -1
  31. package/src/runtime/agent/orchestrator/config-providers-merge.mjs +7 -0
  32. package/src/runtime/agent/orchestrator/config.mjs +5 -0
  33. package/src/runtime/agent/orchestrator/context/collect.mjs +1 -0
  34. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +26 -7
  35. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +112 -7
  36. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +101 -23
  37. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +2 -0
  38. package/src/runtime/agent/orchestrator/providers/anthropic-api-key-fetch.mjs +36 -0
  39. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +48 -20
  40. package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +3 -1
  41. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +24 -17
  42. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +9 -9
  43. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  44. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +26 -44
  45. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +31 -15
  46. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-blocks.mjs +20 -1
  47. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-delta.mjs +15 -2
  48. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-start.mjs +11 -4
  49. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/message-events.mjs +3 -0
  50. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +12 -5
  51. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-outcome.mjs +1 -0
  52. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-state.mjs +14 -0
  53. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +2 -0
  54. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +9 -0
  55. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +10 -0
  56. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +41 -12
  57. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +13 -1
  58. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +131 -9
  59. package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +29 -10
  60. package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +125 -8
  61. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +12 -62
  62. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +117 -41
  63. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  64. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +117 -72
  65. package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +78 -2
  66. package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +39 -5
  67. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
  68. package/src/runtime/agent/orchestrator/providers/cursor-native-context.mjs +48 -0
  69. package/src/runtime/agent/orchestrator/providers/cursor-wire-exec.mjs +144 -34
  70. package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +28 -4
  71. package/src/runtime/agent/orchestrator/providers/cursor-wire-request.mjs +8 -4
  72. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +42 -11
  73. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +109 -6
  74. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +17 -4
  75. package/src/runtime/agent/orchestrator/providers/cursor.mjs +22 -2
  76. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +73 -7
  77. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +75 -6
  78. package/src/runtime/agent/orchestrator/providers/custom-reasoning.mjs +34 -7
  79. package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +32 -6
  80. package/src/runtime/agent/orchestrator/providers/deepseek.mjs +67 -0
  81. package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +29 -5
  82. package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +11 -4
  83. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +36 -13
  84. package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +101 -11
  85. package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +41 -5
  86. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +1 -0
  87. package/src/runtime/agent/orchestrator/providers/gemini-rest-stream/watchdogs.mjs +16 -5
  88. package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +19 -14
  89. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +371 -41
  90. package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +1 -2
  91. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +97 -49
  92. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +81 -10
  93. package/src/runtime/agent/orchestrator/providers/gemini.mjs +35 -8
  94. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
  95. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +1 -0
  96. package/src/runtime/agent/orchestrator/providers/lib/action-input-contract.mjs +60 -0
  97. package/src/runtime/agent/orchestrator/providers/lib/anthropic-native-blocks.mjs +1 -0
  98. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +253 -42
  99. package/src/runtime/agent/orchestrator/providers/lib/anthropic-server-tool-usage.mjs +18 -0
  100. package/src/runtime/agent/orchestrator/providers/lib/anthropic-system-blocks.mjs +27 -6
  101. package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +392 -0
  102. package/src/runtime/agent/orchestrator/providers/lib/inclusive-usage.mjs +54 -0
  103. package/src/runtime/agent/orchestrator/providers/lib/origin-bound-fetch.mjs +16 -0
  104. package/src/runtime/agent/orchestrator/providers/lib/request-compression.mjs +86 -0
  105. package/src/runtime/agent/orchestrator/providers/lib/responses-terminal-fields.mjs +11 -0
  106. package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +8 -0
  107. package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +50 -22
  108. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +133 -21
  109. package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +13 -15
  110. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +7 -1
  111. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +1 -1
  112. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
  113. package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +92 -16
  114. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +13 -13
  115. package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +2 -0
  116. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +133 -62
  117. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +35 -14
  118. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +5 -2
  119. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +39 -7
  120. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/tool-call-acc.mjs +2 -9
  121. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +5 -0
  122. package/src/runtime/agent/orchestrator/providers/openai-compat-error-contract.mjs +1 -1
  123. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +84 -2
  124. package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +47 -25
  125. package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +5 -1
  126. package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +155 -0
  127. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +40 -24
  128. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +63 -25
  129. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2901 -0
  130. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +183 -0
  131. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +87 -6
  132. package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +51 -3
  133. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +7 -1
  134. package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -0
  135. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +103 -26
  136. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +23 -4
  137. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +11 -6
  138. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +17 -2
  139. package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +15 -23
  140. package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +64 -52
  141. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +23 -10
  142. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +28 -5
  143. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +10 -0
  144. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-items.mjs +18 -7
  145. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +4 -0
  146. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +5 -0
  147. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +9 -1
  148. package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +80 -0
  149. package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +3 -1
  150. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +7 -0
  151. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +7 -1
  152. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +72 -24
  153. package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +323 -0
  154. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +50 -16
  155. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +7 -19
  156. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/refusals.mjs +60 -0
  157. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +51 -36
  158. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state.mjs +30 -0
  159. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +12 -0
  160. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/terminal-frames.mjs +25 -6
  161. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +18 -9
  162. package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +181 -0
  163. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +78 -70
  164. package/src/runtime/agent/orchestrator/providers/openrouter.mjs +74 -0
  165. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +150 -10
  166. package/src/runtime/agent/orchestrator/providers/registry.mjs +13 -2
  167. package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +7 -1
  168. package/src/runtime/agent/orchestrator/providers/transport-scope.d.mts +6 -0
  169. package/src/runtime/agent/orchestrator/providers/transport-scope.mjs +28 -0
  170. package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +164 -0
  171. package/src/runtime/agent/orchestrator/providers/wire-route.mjs +522 -0
  172. package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +1131 -0
  173. package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +195 -0
  174. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +104 -0
  175. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +8 -6
  176. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +24 -0
  177. package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -0
  178. package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +30 -2
  179. package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +3 -2
  180. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -3
  181. package/src/runtime/agent/orchestrator/runtime-core/provider-request-snapshot.mjs +7 -3
  182. package/src/runtime/agent/orchestrator/runtime-core/session-title.mjs +21 -1
  183. package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +16 -3
  184. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge-contract.mjs +6 -0
  185. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +526 -0
  186. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
  187. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-schema.mjs +10 -7
  188. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +178 -71
  189. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +102 -12
  190. package/src/runtime/agent/orchestrator/runtime-core/tool-exposure.mjs +96 -0
  191. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +10 -8
  192. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +1 -2
  193. package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +24 -0
  194. package/src/runtime/agent/orchestrator/session/cache/tool-result-reuse.mjs +10 -2
  195. package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -3
  196. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +5 -11
  197. package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +6 -22
  198. package/src/runtime/agent/orchestrator/session/compact/constants.mjs +3 -2
  199. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +16 -93
  200. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +16 -2
  201. package/src/runtime/agent/orchestrator/session/compact/summary-anchor.mjs +5 -0
  202. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +148 -0
  203. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
  204. package/src/runtime/agent/orchestrator/session/context-tool-schema.mjs +17 -2
  205. package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -4
  206. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +0 -6
  207. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +0 -6
  208. package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +3 -2
  209. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +6 -1
  210. package/src/runtime/agent/orchestrator/session/historical-session-closure.mjs +10 -0
  211. package/src/runtime/agent/orchestrator/session/loop/assistant-commit.mjs +2 -5
  212. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +89 -1
  213. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +1 -1
  214. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +56 -0
  215. package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +18 -8
  216. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +1 -27
  217. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/output-limit.mjs +1 -1
  218. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +4 -10
  219. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +2 -9
  220. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +24 -10
  221. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +135 -0
  222. package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +31 -4
  223. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +76 -0
  224. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +67 -20
  225. package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +10 -10
  226. package/src/runtime/agent/orchestrator/session/loop/tool-call-resolution.mjs +95 -0
  227. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +6 -0
  228. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +30 -3
  229. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +29 -5
  230. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +15 -1
  231. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +147 -0
  232. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +7 -5
  233. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +33 -3
  234. package/src/runtime/agent/orchestrator/session/manager/ask-support.mjs +0 -4
  235. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +23 -2
  236. package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +34 -12
  237. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +54 -13
  238. package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +33 -0
  239. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +57 -25
  240. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +11 -0
  241. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +22 -0
  242. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +57 -13
  243. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +8 -0
  244. package/src/runtime/agent/orchestrator/session/manager/failed-turn-rewind.mjs +16 -0
  245. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +6 -120
  246. package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +1 -1
  247. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +231 -16
  248. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +42 -49
  249. package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +50 -0
  250. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +47 -17
  251. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +26 -4
  252. package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +82 -0
  253. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +36 -35
  254. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +29 -13
  255. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +6 -3
  256. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -1
  257. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +45 -0
  258. package/src/runtime/agent/orchestrator/session/manager.mjs +4 -10
  259. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +6 -0
  260. package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +2 -1
  261. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +17 -1
  262. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +96 -0
  263. package/src/runtime/agent/orchestrator/session/side-question.mjs +197 -0
  264. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +22 -15
  265. package/src/runtime/agent/orchestrator/session/store/lifecycle-read.mjs +1 -1
  266. package/src/runtime/agent/orchestrator/session/store/listing.mjs +2 -6
  267. package/src/runtime/agent/orchestrator/session/store/live-cache-eviction.mjs +1 -1
  268. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +23 -0
  269. package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +46 -37
  270. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +1 -1
  271. package/src/runtime/agent/orchestrator/session/store/load-session.mjs +1 -1
  272. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +44 -37
  273. package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +4 -2
  274. package/src/runtime/agent/orchestrator/session/store/session-paths.mjs +59 -0
  275. package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +1 -1
  276. package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +1 -1
  277. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +27 -21
  278. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-plan.mjs +0 -8
  279. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +6 -18
  280. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +33 -106
  281. package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +4 -2
  282. package/src/runtime/agent/orchestrator/session/store-agent-worker-pool.mjs +5 -8
  283. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +136 -196
  284. package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +34 -15
  285. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +53 -115
  286. package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +8 -0
  287. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +10 -1
  288. package/src/runtime/agent/orchestrator/session/store-summary-locations.mjs +3 -29
  289. package/src/runtime/agent/orchestrator/session/store-summary-reader-catalog-fixture.mjs +1 -1
  290. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +17 -10
  291. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +9 -20
  292. package/src/runtime/agent/orchestrator/session/store.mjs +22 -19
  293. package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +12 -12
  294. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +38 -14
  295. package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +15 -4
  296. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +1 -1
  297. package/src/runtime/agent/orchestrator/session/tool-batch/state.mjs +7 -1
  298. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +4 -0
  299. package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +79 -0
  300. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +72 -15
  301. package/src/runtime/agent/orchestrator/session/turn-failure.mjs +45 -0
  302. package/src/runtime/agent/orchestrator/stall-policy.mjs +50 -0
  303. package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +8 -2
  304. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/command-preflight.mjs +3 -3
  305. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +5 -1
  306. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/inline-hoist.mjs +6 -2
  307. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +4 -1
  308. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +218 -20
  309. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +160 -39
  310. package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +7 -5
  311. package/src/runtime/agent/orchestrator/tools/builtin/grep-formatting.mjs +14 -5
  312. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +4 -3
  313. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-output.mjs +2 -1
  314. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-path-fanout.mjs +48 -44
  315. package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +10 -3
  316. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +247 -49
  317. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +5 -4
  318. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +6 -1
  319. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +23 -1
  320. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +20 -0
  321. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +101 -2
  322. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/root-resolution.mjs +1 -1
  323. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1 -1
  324. package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
  325. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +67 -0
  326. package/src/runtime/agent/orchestrator/tools/lib/process-table-fixture.mjs +50 -0
  327. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +303 -63
  328. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +2 -0
  329. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +108 -18
  330. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +77 -11
  331. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +81 -5
  332. package/src/runtime/agent/orchestrator/tools/patch/ui-diff.mjs +73 -39
  333. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +18 -1
  334. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -4
  335. package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +88 -12
  336. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +2 -0
  337. package/src/runtime/attachments/store.d.mts +9 -0
  338. package/src/runtime/attachments/store.mjs +80 -9
  339. package/src/runtime/browser-bridge/browser-action-contract.d.mts +0 -1
  340. package/src/runtime/browser-bridge/browser-action-contract.mjs +0 -2
  341. package/src/runtime/computer-bridge/action-schema.mjs +219 -196
  342. package/src/runtime/computer-bridge/linux-readiness.d.mts +0 -2
  343. package/src/runtime/computer-bridge/linux-readiness.mjs +0 -16
  344. package/src/runtime/effort-judge/judge-client.mjs +21 -4
  345. package/src/runtime/effort-judge/judge-worker.mjs +4 -1
  346. package/src/runtime/github/tool.mjs +208 -17
  347. package/src/runtime/media/adapters/codex-image.mjs +140 -21
  348. package/src/runtime/media/catalog.mjs +4 -4
  349. package/src/runtime/media/chatgpt-usage.mjs +55 -0
  350. package/src/runtime/media/defaults.mjs +37 -0
  351. package/src/runtime/media/jobs.mjs +12 -2
  352. package/src/runtime/media/lanes.mjs +12 -0
  353. package/src/runtime/media/tool-defs.mjs +15 -4
  354. package/src/runtime/media/tool.mjs +41 -12
  355. package/src/runtime/media/upstream-error.mjs +72 -6
  356. package/src/runtime/memory/index.mjs +1 -0
  357. package/src/runtime/memory/lib/http-router/ingest-routes.mjs +22 -1
  358. package/src/runtime/memory/lib/ingest/transcript-offsets.mjs +2 -0
  359. package/src/runtime/memory/lib/ingest/transcript-rows.mjs +1 -0
  360. package/src/runtime/memory/lib/pg/adapter.mjs +98 -1
  361. package/src/runtime/memory/lib/pg/process.mjs +36 -33
  362. package/src/runtime/memory/lib/pg/run-child.mjs +49 -0
  363. package/src/runtime/memory/lib/pg/supervisor.mjs +112 -4
  364. package/src/runtime/memory/lib/runtime-fetcher.mjs +12 -13
  365. package/src/runtime/memory/lib/transcript-ingest.mjs +14 -0
  366. package/src/runtime/office/README.md +1 -1
  367. package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
  368. package/src/runtime/office/authoring/html-browser.mjs +18 -8
  369. package/src/runtime/office/authoring/html-document-author.mjs +2 -0
  370. package/src/runtime/office/authoring/pdf-html-runner.mjs +1 -1
  371. package/src/runtime/office/authoring/pptx-contact-sheet.mjs +2 -0
  372. package/src/runtime/office/authoring/pptx-html-measure.mjs +3 -1
  373. package/src/runtime/office/authoring/pptx-html-runner.mjs +2 -0
  374. package/src/runtime/office/authoring/xlsx-html-runner.mjs +3 -1
  375. package/src/runtime/office/core/office-actions-read.mjs +3 -0
  376. package/src/runtime/office/core/office-render-preview.mjs +2 -0
  377. package/src/runtime/office/core/office-session-dispatch.mjs +7 -0
  378. package/src/runtime/office/core/office-sessionless-actions.mjs +8 -0
  379. package/src/runtime/office/core/office-sessions.mjs +5 -0
  380. package/src/runtime/office/core/office-transactions.mjs +3 -0
  381. package/src/runtime/office/core/office-write-ledger.mjs +94 -0
  382. package/src/runtime/office/design/library/templates/mixdog-executive.mixdog-edit.pptx +0 -0
  383. package/src/runtime/office/index.mjs +29 -0
  384. package/src/runtime/office/pdf/pdf-analysis.mjs +0 -68
  385. package/src/runtime/office/pdf/pdf-edit-document.mjs +2 -0
  386. package/src/runtime/office/pdf/pdf-render.mjs +23 -7
  387. package/src/runtime/office/pdf/pdf-security.mjs +2 -0
  388. package/src/runtime/office/portable/portable-opc.mjs +4 -1
  389. package/src/runtime/office/quality/visual-diff.mjs +2 -0
  390. package/src/runtime/session-search/session-search-ingest.mjs +1 -1
  391. package/src/runtime/shared/agent-reap-state.mjs +13 -0
  392. package/src/runtime/shared/atomic-file.d.mts +1 -1
  393. package/src/runtime/shared/background-tasks.mjs +6 -1
  394. package/src/runtime/shared/bounded-file-read.mjs +13 -0
  395. package/src/runtime/shared/bounded-line-diff.mjs +191 -0
  396. package/src/runtime/shared/browser-launch.mjs +15 -0
  397. package/src/runtime/shared/buffered-appender.mjs +18 -0
  398. package/src/runtime/shared/config.mjs +78 -18
  399. package/src/runtime/shared/err-text.mjs +48 -4
  400. package/src/runtime/shared/file-lock.mjs +6 -5
  401. package/src/runtime/shared/file-permissions.d.mts +6 -1
  402. package/src/runtime/shared/file-permissions.mjs +54 -6
  403. package/src/runtime/shared/llm/anthropic-betas.mjs +1 -2
  404. package/src/runtime/shared/llm/anthropic-effort.mjs +6 -0
  405. package/src/runtime/shared/llm/provider-model-identities.mjs +1 -0
  406. package/src/runtime/shared/llm/usage-accounting.mjs +5 -2
  407. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +3 -0
  408. package/src/runtime/shared/loopback-listener.mjs +9 -0
  409. package/src/runtime/shared/model-route-chain.d.mts +8 -0
  410. package/src/runtime/shared/model-route-chain.mjs +48 -0
  411. package/src/runtime/shared/model-route-fallback.mjs +22 -0
  412. package/src/runtime/shared/pid-liveness.mjs +12 -0
  413. package/src/runtime/shared/provider-api-key.mjs +8 -0
  414. package/src/runtime/shared/provider-timeout-phase.mjs +17 -0
  415. package/src/runtime/shared/quiet-progress.d.mts +35 -0
  416. package/src/runtime/shared/quiet-progress.mjs +101 -0
  417. package/src/runtime/shared/quota-resume-store.mjs +32 -1
  418. package/src/runtime/shared/read-row-numbers.mjs +44 -0
  419. package/src/runtime/shared/remote-intent.mjs +2 -42
  420. package/src/runtime/shared/review-diff.mjs +52 -0
  421. package/src/runtime/shared/session-sidebar-host.d.mts +4 -0
  422. package/src/runtime/shared/session-sidebar-host.mjs +38 -0
  423. package/src/runtime/shared/slow-span.mjs +121 -0
  424. package/src/runtime/shared/statusline/statusline-segments.mjs +52 -6
  425. package/src/runtime/shared/tool-card-model/card-header.mjs +7 -1
  426. package/src/runtime/shared/tool-card-model/generic-detail.mjs +39 -5
  427. package/src/runtime/shared/tool-card-model.mjs +5 -2
  428. package/src/runtime/shared/tool-output-budget.mjs +2 -0
  429. package/src/runtime/shared/tool-output-limit.mjs +4 -0
  430. package/src/runtime/shared/tool-primitives.mjs +13 -0
  431. package/src/runtime/shared/tool-result-summary.mjs +22 -1
  432. package/src/runtime/shared/tool-status.mjs +3 -2
  433. package/src/runtime/shared/tool-surface.mjs +20 -6
  434. package/src/runtime/shared/tool-work-units.mjs +54 -11
  435. package/src/runtime/shared/transcript-metadata.mjs +49 -1
  436. package/src/runtime/shared/transcript-turn-keys.mjs +33 -0
  437. package/src/runtime/shared/transcript-writer/purge.mjs +74 -0
  438. package/src/runtime/shared/transcript-writer/transcript-file.mjs +10 -1
  439. package/src/runtime/shared/transcript-writer.mjs +24 -6
  440. package/src/runtime/shared/turn-changes.mjs +269 -100
  441. package/src/runtime/shared/turn-review-reply.mjs +8 -39
  442. package/src/runtime/shared/turn-snapshot-store.mjs +19 -108
  443. package/src/runtime/shared/turn-snapshot.mjs +865 -683
  444. package/src/runtime/shared/turn-worktree-snapshot.mjs +183 -255
  445. package/src/runtime/shared/user-data-guard.mjs +262 -49
  446. package/src/runtime/shared/worktrees/activity-gate.mjs +175 -0
  447. package/src/runtime/shared/worktrees/branch-management.mjs +179 -0
  448. package/src/runtime/shared/worktrees/carry.mjs +533 -0
  449. package/src/runtime/shared/worktrees/contract.mjs +60 -0
  450. package/src/runtime/shared/worktrees/dependencies.mjs +456 -0
  451. package/src/runtime/shared/worktrees/file-recovery.mjs +84 -0
  452. package/src/runtime/shared/worktrees/git-head.mjs +214 -0
  453. package/src/runtime/shared/worktrees/git.mjs +8 -3
  454. package/src/runtime/shared/worktrees/include.mjs +125 -7
  455. package/src/runtime/shared/worktrees/lock.mjs +1 -1
  456. package/src/runtime/shared/worktrees/maintenance.mjs +20 -2
  457. package/src/runtime/shared/worktrees/manager.mjs +525 -31
  458. package/src/runtime/shared/worktrees/merge.mjs +31 -21
  459. package/src/runtime/shared/worktrees/owner.mjs +2 -1
  460. package/src/runtime/shared/worktrees/paths.d.mts +6 -0
  461. package/src/runtime/shared/worktrees/preparation-report.mjs +79 -0
  462. package/src/runtime/shared/worktrees/setup-commands.mjs +232 -0
  463. package/src/runtime/shared/worktrees/workspace-visibility.mjs +17 -0
  464. package/src/runtime/terminal-bridge/client.mjs +57 -20
  465. package/src/runtime/terminal-bridge/tool-defs.mjs +13 -6
  466. package/src/runtime/tidy/apply.mjs +47 -2
  467. package/src/runtime/tidy/run-engines.mjs +11 -5
  468. package/src/session-runtime/agent-tool-routing.mjs +19 -13
  469. package/src/session-runtime/boot/apis.mjs +20 -6
  470. package/src/session-runtime/boot/config.mjs +2 -0
  471. package/src/session-runtime/boot/facade.mjs +4 -0
  472. package/src/session-runtime/boot/infrastructure.mjs +6 -1
  473. package/src/session-runtime/boot/session.mjs +3 -3
  474. package/src/session-runtime/boot/tools.mjs +7 -1
  475. package/src/session-runtime/conversation-import/service.mjs +1 -1
  476. package/src/session-runtime/cwd-plugins/cwd-apply.mjs +12 -5
  477. package/src/session-runtime/goal-facade-api.mjs +2 -2
  478. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +91 -0
  479. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -1
  480. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +15 -5
  481. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +137 -26
  482. package/src/session-runtime/internal-tool-executor.mjs +8 -2
  483. package/src/session-runtime/lifecycle/cold-heir.mjs +187 -0
  484. package/src/session-runtime/lifecycle/inheritance.mjs +71 -27
  485. package/src/session-runtime/lifecycle/session-catalog.mjs +25 -18
  486. package/src/session-runtime/lifecycle/session-switch/resume.mjs +6 -0
  487. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +36 -48
  488. package/src/session-runtime/lifecycle/session-switch.mjs +1 -1
  489. package/src/session-runtime/lifecycle/shared.mjs +5 -6
  490. package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -5
  491. package/src/session-runtime/lifecycle/teardown.mjs +70 -14
  492. package/src/session-runtime/lifecycle-api.mjs +1 -0
  493. package/src/session-runtime/mcp-glue/connect.mjs +17 -5
  494. package/src/session-runtime/media-api.mjs +8 -0
  495. package/src/session-runtime/model-route/route-ownership.mjs +60 -0
  496. package/src/session-runtime/model-route/route-persist.mjs +3 -2
  497. package/src/session-runtime/model-route/set-route.mjs +116 -36
  498. package/src/session-runtime/model-route/web-search-route.mjs +7 -2
  499. package/src/session-runtime/model-route-api.mjs +4 -2
  500. package/src/session-runtime/native-web-search/routes.mjs +37 -24
  501. package/src/session-runtime/native-web-search-usage.mjs +51 -0
  502. package/src/session-runtime/native-web-search.mjs +19 -9
  503. package/src/session-runtime/new-session-config.mjs +4 -2
  504. package/src/session-runtime/provider-auth/login.mjs +4 -0
  505. package/src/session-runtime/provider-auth/setup.mjs +4 -0
  506. package/src/session-runtime/provider-models/catalog-load.mjs +9 -0
  507. package/src/session-runtime/provider-models/web-search-catalog.mjs +23 -3
  508. package/src/session-runtime/provider-models.mjs +1 -0
  509. package/src/session-runtime/provider-usage.mjs +4 -0
  510. package/src/session-runtime/resource-scope-decorate.mjs +10 -3
  511. package/src/session-runtime/route-resolution.mjs +3 -1
  512. package/src/session-runtime/runtime-core.mjs +4 -0
  513. package/src/session-runtime/runtime-facade.mjs +6 -0
  514. package/src/session-runtime/runtime-review-api.mjs +8 -2
  515. package/src/session-runtime/services/agent-task-status.mjs +2 -0
  516. package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +0 -3
  517. package/src/session-runtime/services/agent-tool/close-flow.mjs +6 -7
  518. package/src/session-runtime/services/agent-tool/execute-send.mjs +2 -2
  519. package/src/session-runtime/services/agent-tool/execute-spawn.mjs +36 -3
  520. package/src/session-runtime/services/agent-tool/execute.mjs +9 -1
  521. package/src/session-runtime/services/agent-tool/helpers.mjs +30 -7
  522. package/src/session-runtime/services/agent-tool/index-write-queue.mjs +81 -20
  523. package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +7 -2
  524. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +6 -3
  525. package/src/session-runtime/services/agent-tool/lead-worker-index/forgotten-leads.mjs +29 -0
  526. package/src/session-runtime/services/agent-tool/lead-worker-index/index-file.mjs +1 -1
  527. package/src/session-runtime/services/agent-tool/lead-worker-index/lead-rows.mjs +3 -4
  528. package/src/session-runtime/services/agent-tool/lead-worker-index/reap-timers.mjs +9 -3
  529. package/src/session-runtime/services/agent-tool/lead-worker-index/row-settlement.mjs +7 -18
  530. package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +82 -13
  531. package/src/session-runtime/services/agent-tool/model-select.mjs +82 -0
  532. package/src/session-runtime/services/agent-tool/send-flow.mjs +24 -6
  533. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +3 -1
  534. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +19 -5
  535. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +5 -4
  536. package/src/session-runtime/services/agent-tool/spawn-flow.mjs +2 -1
  537. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +3 -0
  538. package/src/session-runtime/services/agent-tool/tag-registry/tag-lookup.mjs +1 -3
  539. package/src/session-runtime/services/agent-tool/tag-registry/tag-refresh.mjs +1 -3
  540. package/src/session-runtime/services/agent-tool/tag-registry.mjs +18 -10
  541. package/src/session-runtime/services/agent-tool/terminal-reaper/scan-admission.mjs +8 -41
  542. package/src/session-runtime/services/agent-tool/terminal-reaper/stale-rows.mjs +3 -3
  543. package/src/session-runtime/services/agent-tool/terminal-reaper.mjs +6 -23
  544. package/src/session-runtime/services/agent-tool/terminal-trace.mjs +0 -1
  545. package/src/session-runtime/services/agent-tool/tool-def.mjs +7 -0
  546. package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +32 -20
  547. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +5 -2
  548. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +10 -1
  549. package/src/session-runtime/services/agent-tool/worker-index.mjs +74 -15
  550. package/src/session-runtime/services/agent-tool.mjs +7 -0
  551. package/src/session-runtime/services/agent-watchdog-registry.mjs +2 -0
  552. package/src/session-runtime/services/channel-admin.mjs +19 -3
  553. package/src/session-runtime/services/memory-runtime-proxy/calls.mjs +4 -0
  554. package/src/session-runtime/services/memory-runtime-proxy.mjs +1 -0
  555. package/src/session-runtime/services/provider-admin.mjs +158 -15
  556. package/src/session-runtime/session-create/session-options.mjs +7 -5
  557. package/src/session-runtime/session-create/session-start-hook.mjs +2 -1
  558. package/src/session-runtime/session-transcript-purge.mjs +32 -0
  559. package/src/session-runtime/session-transcript.mjs +4 -5
  560. package/src/session-runtime/session-turn-api.mjs +17 -14
  561. package/src/session-runtime/settings-builtin-tools-api.mjs +18 -6
  562. package/src/session-runtime/setup-tool/executor.mjs +57 -9
  563. package/src/session-runtime/setup-tool/extended-actions.mjs +86 -6
  564. package/src/session-runtime/setup-tool/settings-contract.mjs +18 -3
  565. package/src/session-runtime/setup-tool/tool-defs.mjs +25 -4
  566. package/src/session-runtime/skills-api.mjs +3 -5
  567. package/src/session-runtime/tool-policy-refresh.mjs +83 -32
  568. package/src/session-runtime/tool-surface.mjs +5 -1
  569. package/src/session-runtime/turn/agent-ops.mjs +49 -2
  570. package/src/session-runtime/turn/compaction-gate.mjs +25 -0
  571. package/src/session-runtime/turn/session-ops.mjs +7 -5
  572. package/src/session-runtime/turn/side-question-ops.mjs +19 -0
  573. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +7 -1
  574. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +12 -3
  575. package/src/session-runtime/turn/turn-run/turn-settle.mjs +18 -2
  576. package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
  577. package/src/session-runtime/turn/turn-run.mjs +26 -45
  578. package/src/session-runtime/usage-stats-api.mjs +46 -11
  579. package/src/session-runtime/workflow-agents-api/agent-route.mjs +16 -1
  580. package/src/session-runtime/workspace/admission-gate.mjs +44 -15
  581. package/src/session-runtime/workspace/project-branches.mjs +35 -41
  582. package/src/session-runtime/workspace/transition-steps.mjs +215 -116
  583. package/src/session-runtime/workspace/transitions.mjs +428 -73
  584. package/src/standalone/channel-transport.mjs +3 -4
  585. package/src/standalone/daemon-agent-control.mjs +9 -1
  586. package/src/standalone/daemon-desktop-runtime.mjs +32 -1
  587. package/src/standalone/daemon-local-session-bridge.mjs +14 -1
  588. package/src/standalone/daemon-owner.mjs +17 -4
  589. package/src/standalone/daemon-pg-stop.mjs +49 -0
  590. package/src/standalone/daemon-session-control.mjs +88 -0
  591. package/src/standalone/daemon-stop-budget.d.mts +2 -0
  592. package/src/standalone/daemon-stop-budget.mjs +18 -0
  593. package/src/standalone/daemon-stored-session-views.mjs +25 -3
  594. package/src/standalone/daemon-telemetry.mjs +19 -0
  595. package/src/standalone/daemon.mjs +63 -1
  596. package/src/standalone/desktop-service-registry.mjs +5 -0
  597. package/src/standalone/local-session-runtime.mjs +80 -30
  598. package/src/standalone/session-client.mjs +42 -0
  599. package/src/standalone/session-protocol.mjs +14 -0
  600. package/src/standalone/session-proxy/projection.mjs +41 -4
  601. package/src/standalone/session-runtime-inline-host/boot-loaders.mjs +15 -1
  602. package/src/standalone/session-runtime-inline-host.mjs +3 -0
  603. package/src/standalone/session-service/agent-tree/agent-cancel.mjs +91 -49
  604. package/src/standalone/session-service/agent-tree/agent-child.mjs +19 -1
  605. package/src/standalone/session-service/agent-tree/agent-registry.mjs +25 -0
  606. package/src/standalone/session-service/agent-tree/agent-turns.mjs +9 -1
  607. package/src/standalone/session-service/agent-tree.mjs +28 -2
  608. package/src/standalone/session-service/entries/session-loads.mjs +16 -5
  609. package/src/standalone/session-service/entries.mjs +1 -0
  610. package/src/standalone/session-service/projection/transcript-window.mjs +39 -0
  611. package/src/standalone/session-service/quota-resume.mjs +28 -13
  612. package/src/standalone/session-service/session-calls/session-action.mjs +18 -3
  613. package/src/standalone/session-service/session-calls/session-turns.mjs +17 -6
  614. package/src/standalone/session-service/session-calls/session-views.mjs +6 -0
  615. package/src/standalone/session-service-api.mjs +6 -1
  616. package/src/standalone/session-state-patch.d.mts +2 -1
  617. package/src/standalone/session-state-patch.mjs +41 -1
  618. package/src/standalone/session-tool-output.mjs +82 -0
  619. package/src/tui/App.jsx +25 -0
  620. package/src/tui/app/app-view/floating-panel.jsx +26 -1
  621. package/src/tui/app/app-view.jsx +2 -1
  622. package/src/tui/app/btw-controller.mjs +118 -0
  623. package/src/tui/app/create-app-pickers.mjs +2 -0
  624. package/src/tui/app/provider-setup/provider-items.mjs +8 -0
  625. package/src/tui/app/provider-setup-picker.mjs +15 -3
  626. package/src/tui/app/shell-layout/row-budgets.mjs +11 -1
  627. package/src/tui/app/shell-layout/surfaces.mjs +3 -1
  628. package/src/tui/app/slash-commands.mjs +19 -3
  629. package/src/tui/app/slash-dispatch/session-commands.mjs +68 -6
  630. package/src/tui/app/use-global-key-input/approval-shortcut.mjs +12 -0
  631. package/src/tui/app/use-global-key-input.mjs +5 -12
  632. package/src/tui/app/use-prompt-handlers.mjs +11 -0
  633. package/src/tui/components/BtwPanel.jsx +53 -0
  634. package/src/tui/components/QuestionPanel.jsx +275 -0
  635. package/src/tui/components/Spinner.jsx +4 -0
  636. package/src/tui/components/SpinnerByline.jsx +21 -2
  637. package/src/tui/components/question-panel-model.mjs +156 -0
  638. package/src/tui/components/status-line/local-line.mjs +10 -2
  639. package/src/tui/dist/index.mjs +2897 -1722
  640. package/src/tui/session/active-tool-summary.mjs +1 -1
  641. package/src/tui/session/context-state.mjs +4 -5
  642. package/src/tui/session/goal-continuation/continuation-queue.mjs +2 -3
  643. package/src/tui/session/goal-continuation/deadline-delivery.mjs +4 -2
  644. package/src/tui/session/goal-continuation/session-boundary.mjs +21 -0
  645. package/src/tui/session/quota-resume.mjs +140 -61
  646. package/src/tui/session/session-api/commands.mjs +14 -10
  647. package/src/tui/session/session-api/controls.mjs +14 -2
  648. package/src/tui/session/session-api/integrations.mjs +9 -2
  649. package/src/tui/session/session-api/lifecycle/dispose.mjs +3 -9
  650. package/src/tui/session/session-api/lifecycle/resume.mjs +2 -7
  651. package/src/tui/session/session-api/lifecycle.mjs +14 -11
  652. package/src/tui/session/session-api/media.mjs +2 -0
  653. package/src/tui/session/session-api/routes.mjs +81 -57
  654. package/src/tui/session/session-api/settings.mjs +9 -3
  655. package/src/tui/session/session-api/worktree.mjs +3 -2
  656. package/src/tui/session/session-api.mjs +1 -0
  657. package/src/tui/session/session-flow/auto-clear.mjs +1 -3
  658. package/src/tui/session/session-flow/drain.mjs +6 -4
  659. package/src/tui/session/session-flow/queue/entry-shape.mjs +2 -0
  660. package/src/tui/session/session-flow/queue/take-entries.mjs +2 -1
  661. package/src/tui/session/session-flow/queue.mjs +1 -1
  662. package/src/tui/session/tool-approval.mjs +20 -8
  663. package/src/tui/session/transcript-spill.mjs +14 -7
  664. package/src/tui/session/transcript-store/streaming-tail.mjs +1 -1
  665. package/src/tui/session/tui-steering-persist.mjs +3 -5
  666. package/src/tui/session/turn-quiet.mjs +53 -0
  667. package/src/tui/session/turn-stream.mjs +179 -32
  668. package/src/tui/session/turn.mjs +50 -36
  669. package/src/tui/session/worktree-setup-notice.mjs +38 -0
  670. package/src/tui/spinner-meta.mjs +10 -0
  671. package/src/tui/spinner-verbs.mjs +3 -0
  672. package/src/ui/statusline.mjs +13 -3
  673. package/src/workflows/default/WORKFLOW.md +3 -1
  674. package/src/runtime/agent/orchestrator/providers/model-pricing-rates.mjs +0 -1
  675. package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +0 -346
  676. package/src/runtime/agent/orchestrator/session/manager/session-owner-liveness.mjs +0 -117
  677. package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +0 -246
  678. package/src/session-runtime/services/agent-tool/terminal-reaper/reap-timers.mjs +0 -142
  679. package/src/session-runtime/turn/share-ops.mjs +0 -77
  680. package/src/tui/session/cross-surface-share.mjs +0 -406
  681. package/src/tui/session/live-share/delta.mjs +0 -153
  682. package/src/tui/session/live-share/mirror.mjs +0 -106
  683. package/src/tui/session/live-share/owner.mjs +0 -254
  684. package/src/tui/session/live-share/retry.mjs +0 -54
  685. package/src/tui/session/live-share/viewer/frame-router.mjs +0 -32
  686. package/src/tui/session/live-share/viewer/pipe-client.mjs +0 -108
  687. package/src/tui/session/live-share/viewer/submit-acks.mjs +0 -65
  688. package/src/tui/session/live-share/viewer/sync-waiters.mjs +0 -53
  689. package/src/tui/session/live-share/viewer.mjs +0 -99
  690. package/src/tui/session/live-share/wire.mjs +0 -44
  691. package/src/tui/session/live-share.mjs +0 -154
  692. package/src/tui/session/shared-dir-watch.mjs +0 -69
@@ -92,10 +92,12 @@ function routeInput(source) {
92
92
  if (clean(source.model)) next.model = clean(source.model);
93
93
  if (clean(source.effort)) next.effort = clean(source.effort);
94
94
  if (typeof source.fast === 'boolean') next.fast = source.fast;
95
+ if (typeof source.autoEffort === 'boolean') next.autoEffort = source.autoEffort;
95
96
  if (Object.hasOwn(source, 'modelParameters')) next.modelParameters = { ...source.modelParameters };
96
97
  if (Object.hasOwn(source, 'contextPercent')) next.contextPercent = source.contextPercent;
97
98
  if (Object.hasOwn(source, 'contextTokens')) next.contextTokens = source.contextTokens;
98
99
  if (Object.hasOwn(source, 'disabled')) next.disabled = source.disabled;
100
+ if (Object.hasOwn(source, 'fallbacks')) next.fallbacks = source.fallbacks.map(routeInput);
99
101
  return next;
100
102
  }
101
103
 
@@ -118,6 +120,7 @@ function publicProviderRows(setup) {
118
120
  ...extra,
119
121
  });
120
122
  return {
123
+ ...(setup?.managedByClient === true ? { managedByClient: true, unavailable: setup.unavailable === true } : {}),
121
124
  pendingSecrets: setup?.pendingSecrets === true,
122
125
  api: (setup?.api || []).map((row) =>
123
126
  pick(row, {
@@ -141,6 +144,37 @@ function publicProviderRows(setup) {
141
144
  };
142
145
  }
143
146
 
147
+ /** Minimal provider rows for the model: only providers with a credential (or
148
+ * one needing re-authentication), counts instead of account rosters. Without
149
+ * `accountCount` (desktop-owned accounts) no counts are reported. */
150
+ function configuredProviderRows(rows, accountCount) {
151
+ const providers = [];
152
+ let notConfigured = 0;
153
+ for (const [kind, list] of [
154
+ ['api', rows.api],
155
+ ['oauth', rows.oauth],
156
+ ['local', rows.local],
157
+ ]) {
158
+ for (const row of list) {
159
+ if (!row.authenticated && !row.reauthRequired) {
160
+ notConfigured += 1;
161
+ continue;
162
+ }
163
+ let accounts = {};
164
+ if (kind === 'oauth' && accountCount) accounts = { accounts: row.authenticated ? accountCount(row.id) : 0 };
165
+ providers.push({
166
+ id: row.id,
167
+ kind,
168
+ authenticated: row.authenticated,
169
+ status: row.status,
170
+ ...(row.reauthRequired ? { reauthRequired: true } : {}),
171
+ ...accounts,
172
+ });
173
+ }
174
+ }
175
+ return { ...(rows.pendingSecrets ? { pendingSecrets: true } : {}), providers, notConfigured };
176
+ }
177
+
144
178
  /** OAuth account roster without usage meters or provider-side identities. */
145
179
  function publicAccounts(pool) {
146
180
  return {
@@ -300,8 +334,14 @@ const SETUP_STATUS_READERS = {
300
334
  'local-provider': (rt) => rt.getToolModuleSettings().localProvider,
301
335
  features: (rt, { getConfig }) => featureStatus(rt, getConfig),
302
336
  shell: (rt) => rt.getSystemShell?.() || {},
303
- providers: async (rt) => {
337
+ providers: async (rt, { detail }) => {
304
338
  const rows = publicProviderRows(await rt.getProviderSetup?.({}));
339
+ // Client mode: the desktop owns accounts, so the server roster is never read.
340
+ if (rows.managedByClient) {
341
+ if (detail) return rows;
342
+ return { managedByClient: true, unavailable: rows.unavailable, ...configuredProviderRows(rows) };
343
+ }
344
+ if (!detail) return configuredProviderRows(rows, (id) => rt.getProviderAccounts(id).accounts.length);
305
345
  rows.oauth = rows.oauth.map((row) =>
306
346
  row.authenticated ? { ...row, accounts: publicAccounts(rt.getProviderAccounts(row.id)) } : row
307
347
  );
@@ -339,7 +379,10 @@ function validateSetupInput(args) {
339
379
  if (action !== 'set_agent_route' && Object.hasOwn(args.route, 'disabled')) {
340
380
  throw new Error('route.disabled is only accepted by set_agent_route');
341
381
  }
342
- for (const field of ['contextPercent', 'contextTokens']) {
382
+ if (Object.hasOwn(args.route, 'fallbacks') && !['set_agent_route', 'set_web_search_route'].includes(action)) {
383
+ throw new Error('route.fallbacks is only accepted by set_agent_route and set_web_search_route');
384
+ }
385
+ for (const field of ['contextPercent', 'contextTokens', 'autoEffort']) {
343
386
  if (action !== 'set_route' && action !== 'set_agent_route' && Object.hasOwn(args.route, field)) {
344
387
  throw new Error(`route.${field} is only accepted by set_route and set_agent_route`);
345
388
  }
@@ -401,12 +444,12 @@ const SETUP_ACTION_HANDLERS = {
401
444
  status: async (_rt, args, { readStatus, requestDesktop }) => {
402
445
  const domain = clean(args.domain) || 'summary';
403
446
  requireEnum(domain, SETUP_STATUS_DOMAINS, 'domain');
404
- return { domain, ...(await readStatus(domain, requestDesktop)) };
447
+ return { domain, ...(await readStatus(domain, requestDesktop, args.detail === true)) };
405
448
  },
406
449
  open: (_rt, args, { openSurface }) => openSurface(args.target),
407
450
  set_route: async (rt, args) => {
408
451
  const route = routeInput(args.route);
409
- const next = await rt.setRoute(route);
452
+ const next = await rt.setRoute(route, { keepMainModel: false });
410
453
  return { route: next, appliesTo: 'next session (a conversation keeps its frozen route)' };
411
454
  },
412
455
  set_agent_route: async (rt, args) => {
@@ -524,6 +567,7 @@ const SETUP_ACTION_HANDLERS = {
524
567
  forget_provider_auth: async (rt, args) => {
525
568
  const name = requireText(args.name, 'name');
526
569
  const setup = await rt.getProviderSetup({});
570
+ if (setup?.managedByClient) throw new Error('Manage provider accounts in the local desktop window.');
527
571
  if (!(setup?.oauth || []).some((row) => row.id === name)) {
528
572
  if (Object.hasOwn(args, 'accountId')) throw new Error('accountId applies only to OAuth providers');
529
573
  return rt.forgetProviderAuth(name);
@@ -536,8 +580,12 @@ const SETUP_ACTION_HANDLERS = {
536
580
  const accountId = Object.hasOwn(args, 'accountId') ? requireText(args.accountId, 'accountId') : accounts[0].id;
537
581
  return { ...(await rt.forgetProviderAuth(name, accountId)), accountId };
538
582
  },
539
- set_provider_account: async (rt, args) =>
540
- publicAccounts(await rt.updateProviderAccounts(requireText(args.name, 'name'), args.providerAccount)),
583
+ set_provider_account: async (rt, args) => {
584
+ if ((await rt.getProviderSetup?.({}))?.managedByClient) {
585
+ throw new Error('Manage provider accounts in the local desktop window.');
586
+ }
587
+ return publicAccounts(await rt.updateProviderAccounts(requireText(args.name, 'name'), args.providerAccount));
588
+ },
541
589
  add_mcp_server: async (rt, args) => {
542
590
  const server = mcpServerInput(args);
543
591
  requireText(server.name, 'server.name');
@@ -631,11 +679,11 @@ export function createSetupToolExecutor({ getApi, getConfig, notifySessionUi, ge
631
679
  return facade;
632
680
  };
633
681
 
634
- async function readStatus(domain, requestDesktop) {
682
+ async function readStatus(domain, requestDesktop, detail) {
635
683
  const rt = api();
636
684
  if (SETUP_DESKTOP_DOMAINS.includes(domain)) return requestDesktop({ action: 'status', domain });
637
685
  if (!Object.hasOwn(SETUP_STATUS_READERS, domain)) throw new Error(`setup: unknown status domain "${domain}"`);
638
- return SETUP_STATUS_READERS[domain](rt, { domain, getConfig: () => getConfig?.() || {} });
686
+ return SETUP_STATUS_READERS[domain](rt, { domain, detail, getConfig: () => getConfig?.() || {} });
639
687
  }
640
688
 
641
689
  function openSurface(target) {
@@ -669,7 +717,7 @@ export function createSetupToolExecutor({ getApi, getConfig, notifySessionUi, ge
669
717
  dispose: desktop.dispose,
670
718
  async execute(args = {}, options = {}) {
671
719
  const result = await execute(args, options);
672
- if (READ_ONLY_SETUP_ACTIONS.has(args.action)) return JSON.stringify(result ?? {}, null, 2);
720
+ if (READ_ONLY_SETUP_ACTIONS.has(args.action)) return JSON.stringify(result ?? {});
673
721
  await flushSettings?.();
674
722
  // Attached surfaces re-read what changed instead of waiting for their
675
723
  // next open or cache expiry.
@@ -1,11 +1,81 @@
1
1
  import { SETUP_EXTENDED_PROPERTIES, SETUP_DESKTOP_ACTIONS } from './settings-contract.mjs';
2
2
  import { MEDIA_KINDS } from '../../runtime/media/tool-defs.mjs';
3
+ import { OPENAI_COMPAT_PRESETS } from '../../runtime/agent/orchestrator/providers/openai-compat-presets.mjs';
3
4
 
4
5
  const own = (value, key) => Object.hasOwn(value || {}, key);
5
6
  const pick = (value, keys) => Object.fromEntries(keys.filter((key) => own(value, key)).map((key) => [key, value[key]]));
6
7
  const entryKeys = Object.keys(SETUP_EXTENDED_PROPERTIES.entry.properties);
7
8
  const definitionKeys = Object.keys(SETUP_EXTENDED_PROPERTIES.definition.properties);
8
9
 
10
+ const MODEL_PAGE_DEFAULT = 25;
11
+
12
+ function providerIndex(rows) {
13
+ const counts = new Map();
14
+ for (const row of rows) counts.set(row.provider, (counts.get(row.provider) || 0) + 1);
15
+ return [...counts].map(([provider, count]) => {
16
+ const defaultModel = OPENAI_COMPAT_PRESETS[provider]?.defaultModel;
17
+ return { provider, count, ...(defaultModel ? { defaultModel } : {}) };
18
+ });
19
+ }
20
+
21
+ function compactModelRow(row) {
22
+ const context = row.contextWindow || null;
23
+ const maxContext = Number(row.maxContextWindow) || 0;
24
+ return {
25
+ id: row.id,
26
+ display: row.display || row.id,
27
+ context,
28
+ ...(maxContext > (context || 0) ? { maxContext } : {}),
29
+ efforts: (row.effortOptions || []).map((option) => option.value),
30
+ ...(row.fastCapable === true ? { fast: true } : {}),
31
+ ...(row.supportsVision === true ? { vision: true } : {}),
32
+ };
33
+ }
34
+
35
+ const isPresent = (value) =>
36
+ value != null && value !== '' && value !== false && !(typeof value === 'object' && !Object.keys(value).length);
37
+
38
+ /** Everything set_route can use for one model; empty and false fields omitted. */
39
+ function modelDetail(row) {
40
+ const detail = {
41
+ provider: row.provider,
42
+ id: row.id,
43
+ display: row.display || row.id,
44
+ context: row.contextWindow,
45
+ maxContext: Number(row.maxContextWindow) > row.contextWindow ? row.maxContextWindow : null,
46
+ outputTokens: row.outputTokens,
47
+ vision: row.supportsVision,
48
+ webSearch: row.supportsWebSearch,
49
+ reasoning: row.supportsReasoning,
50
+ effortOptions: (row.effortOptions || []).map(({ value, label }) => ({ value, label })),
51
+ defaultEffort: row.defaultEffort,
52
+ fastCapable: row.fastCapable,
53
+ fastEfforts: row.fastEfforts,
54
+ defaultFast: row.defaultFast,
55
+ serviceTiers: row.serviceTiers,
56
+ defaultServiceTier: row.defaultServiceTier,
57
+ additionalSpeedTiers: row.additionalSpeedTiers,
58
+ modelParameterOptions: row.modelParameterOptions,
59
+ parameterVariants: row.parameterVariants,
60
+ defaultModelParameters: row.defaultModelParameters,
61
+ supportsMaxMode: row.supportsMaxMode,
62
+ };
63
+ return Object.fromEntries(Object.entries(detail).filter(([, value]) => isPresent(value)));
64
+ }
65
+
66
+ function findModel(rows, id, provider) {
67
+ const matches = rows.filter((row) => row.id === id && (!provider || row.provider === provider));
68
+ if (!matches.length) {
69
+ throw new Error(
70
+ `model "${id}" not found${provider ? ` for provider "${provider}"` : ''}; list_models with catalog.provider returns its model ids`
71
+ );
72
+ }
73
+ const providers = [...new Set(matches.map((row) => row.provider))];
74
+ if (providers.length > 1)
75
+ throw new Error(`model "${id}" is offered by ${providers.join(', ')}; pass catalog.provider`);
76
+ return matches[0];
77
+ }
78
+
9
79
  export function publicAutomation(row) {
10
80
  const result = {
11
81
  ...pick(row, entryKeys),
@@ -136,12 +206,22 @@ async function saveDefinition(rt, args) {
136
206
  export const EXTENDED_SETUP_HANDLERS = Object.freeze({
137
207
  set_local_context: (rt, args) => rt.setLocalProviderContext(args.modelId, args.localContextWindow),
138
208
  async list_models(rt, args) {
139
- const options = args.catalog || {};
140
- const refresh = options.refresh === true;
141
- const models = options.webSearch
142
- ? await rt.listWebSearchModels({ refresh })
143
- : await rt.listProviderModels({ refresh });
144
- return { models: options.provider ? models.filter((model) => model.provider === options.provider) : models };
209
+ const { provider, model, page = 1, limit = MODEL_PAGE_DEFAULT, webSearch, refresh } = args.catalog || {};
210
+ const rows = webSearch
211
+ ? await rt.listWebSearchModels({ refresh: refresh === true })
212
+ : await rt.listProviderModels({ refresh: refresh === true });
213
+ if (model) return { model: modelDetail(findModel(rows, model, provider)) };
214
+ if (!provider) return { providers: providerIndex(rows) };
215
+ const own = rows.filter((row) => row.provider === provider);
216
+ const pages = Math.max(1, Math.ceil(own.length / limit));
217
+ return {
218
+ provider,
219
+ total: own.length,
220
+ page,
221
+ pages,
222
+ ...(page < pages ? { nextPage: page + 1 } : {}),
223
+ models: own.slice((page - 1) * limit, page * limit).map(compactModelRow),
224
+ };
145
225
  },
146
226
  set_orchestration_mode: (rt, args) => rt.setOrchestrationMode(args.mode),
147
227
  get_mcp_server: async (rt, args) => publicMcpConfig(await rt.getMcpServerConfig(args.name)),
@@ -114,9 +114,24 @@ export const SETUP_MCP_SCHEMA = object({
114
114
 
115
115
  export const SETUP_EXTENDED_PROPERTIES = Object.freeze({
116
116
  catalog: object({
117
- provider: text,
118
- webSearch: boolean,
119
- refresh: boolean,
117
+ provider: {
118
+ ...text,
119
+ description: "list_models: omit for the provider index; set for that provider's compact model rows.",
120
+ },
121
+ model: {
122
+ ...text,
123
+ description:
124
+ 'list_models: one model id; returns its full options (efforts, fast, service tiers, modelParameterOptions, parameterVariants) for set_route. Add provider when several offer the id.',
125
+ },
126
+ page: { type: 'integer', minimum: 1, description: 'list_models with provider: 1-based page; default 1.' },
127
+ limit: {
128
+ type: 'integer',
129
+ minimum: 1,
130
+ maximum: 100,
131
+ description: 'list_models with provider: rows per page; default 25.',
132
+ },
133
+ webSearch: { ...boolean, description: 'list_models: native-search capable models only.' },
134
+ refresh: { ...boolean, description: 'list_models: refresh the catalog first.' },
120
135
  }),
121
136
  localContextWindow: {
122
137
  type: ['integer', 'null'],
@@ -68,7 +68,7 @@ export const SETUP_OPEN_TARGETS = Object.freeze([
68
68
  // Runtime dispatch contract. A trailing ? denotes an optional field. Keep
69
69
  // this out of the wire schema: field descriptions already name their actions.
70
70
  export const SETUP_ACTION_FIELDS = Object.freeze({
71
- status: 'domain?',
71
+ status: 'domain? detail?',
72
72
  open: 'target',
73
73
  set_route: 'route',
74
74
  set_agent_route: 'agent route',
@@ -136,6 +136,10 @@ const ROUTE_SCHEMA = {
136
136
  model: { type: 'string' },
137
137
  effort: { type: 'string' },
138
138
  fast: { type: 'boolean' },
139
+ autoEffort: {
140
+ type: 'boolean',
141
+ description: 'Main and agent routes only: Auto reasoning for this route; omitted = preserved.',
142
+ },
139
143
  modelParameters: { type: 'object', additionalProperties: { type: 'string' } },
140
144
  // A typed enum is unrepresentable on Gemini; the bounds project everywhere
141
145
  // and the executor rejects values that are not a multiple of 10.
@@ -152,12 +156,23 @@ const ROUTE_SCHEMA = {
152
156
  },
153
157
  };
154
158
 
159
+ ROUTE_SCHEMA.properties.fallbacks = {
160
+ type: 'array',
161
+ description: 'Agent and Web Search routes only: ordered fallback models; [] clears the list.',
162
+ items: {
163
+ type: 'object',
164
+ additionalProperties: false,
165
+ required: ['provider', 'model'],
166
+ properties: Object.fromEntries(Object.entries(ROUTE_SCHEMA.properties).filter(([key]) => key !== 'disabled')),
167
+ },
168
+ };
169
+
155
170
  export const SETUP_TOOL_DEFS = Object.freeze([
156
171
  {
157
172
  name: 'setup',
158
173
  title: 'Setup',
159
174
  description:
160
- "Read or change this Mixdog installation's settings through the runtime. Load the setup skill first (local-provider for managed local-model installation). status reads one domain; open navigates the attached app to a settings surface. Secrets (API keys, OAuth) are never accepted. Changes apply to new sessions unless the result says otherwise.",
175
+ "Read or change this Mixdog installation's settings through the runtime. Load the setup skill first (local-provider for managed local-model installation). status reads one domain; open navigates the attached app to a settings surface; list_models returns a provider index, then one provider's paged compact rows, then one model's full options (catalog.model). Results are compact JSON. Secrets (API keys, OAuth) are never accepted. Changes apply to new sessions unless the result says otherwise.",
161
176
  annotations: {
162
177
  title: 'Setup',
163
178
  readOnlyHint: false,
@@ -177,6 +192,11 @@ export const SETUP_TOOL_DEFS = Object.freeze([
177
192
  enum: [...SETUP_STATUS_DOMAINS],
178
193
  description: 'status: which domain to read; default summary.',
179
194
  },
195
+ detail: {
196
+ type: 'boolean',
197
+ description:
198
+ 'status providers: full rows for every provider (key URLs, expiry, account ids) instead of configured providers only.',
199
+ },
180
200
  target: {
181
201
  type: 'string',
182
202
  enum: [...SETUP_OPEN_TARGETS],
@@ -236,7 +256,7 @@ export const SETUP_TOOL_DEFS = Object.freeze([
236
256
  accountId: {
237
257
  type: 'string',
238
258
  description:
239
- 'forget_provider_auth: OAuth account id from status providers; required when the provider has several accounts.',
259
+ 'forget_provider_auth: OAuth account id from status providers with detail:true; required when the provider has several accounts.',
240
260
  },
241
261
  providerAccount: {
242
262
  type: 'object',
@@ -263,7 +283,8 @@ export const SETUP_TOOL_DEFS = Object.freeze([
263
283
  properties: { id: { type: 'string' }, label: { type: 'string', maxLength: 80 } },
264
284
  },
265
285
  },
266
- description: 'set_provider_account: OAuth account change; account ids from status providers.',
286
+ description:
287
+ 'set_provider_account: OAuth account change; account ids from status providers with detail:true.',
267
288
  },
268
289
  modelId: {
269
290
  type: 'string',
@@ -46,18 +46,16 @@ export function createSkillsApi({ contextMod, getCwd, getTools = () => [] }) {
46
46
  }
47
47
  return { kind: 'user' };
48
48
  };
49
+ const enabledFlags = contextMod.skillEnabledFlags(skills);
49
50
  return {
50
51
  cwd,
51
52
  count: skills.length,
52
53
  tools: getTools().map(({ name }) => ({ name })),
53
- skills: skills.map((skill) => {
54
+ skills: skills.map((skill, index) => {
54
55
  const source = sourceForSkill(skill);
55
56
  return {
56
57
  name: skill.name,
57
- enabled: !(
58
- contextMod.isSkillDisabled?.(skill.name, null, skills) ||
59
- contextMod.skillMissingFeature?.(skill.name, null, skills)
60
- ),
58
+ enabled: enabledFlags[index],
61
59
  description: skill.description || '',
62
60
  whenToUse: skill.whenToUse || '',
63
61
  filePath: skill.filePath || null,
@@ -4,17 +4,23 @@
4
4
  // updated policy.
5
5
  import { sessionHasConversationMessages } from '../runtime/agent/orchestrator/runtime-core/session-text.mjs';
6
6
  import { toSessionWorkflowMeta } from '../runtime/agent/orchestrator/runtime-core/workflow.mjs';
7
- import { applyDeferredToolSurface, filterDisallowedTools } from '../runtime/agent/orchestrator/runtime-core/tool-catalog.mjs';
7
+ import {
8
+ applyDeferredToolSurface,
9
+ filterDisallowedTools,
10
+ } from '../runtime/agent/orchestrator/runtime-core/tool-catalog.mjs';
8
11
  import { deferredSurfaceModeForLead } from '../runtime/agent/orchestrator/runtime-core/effort.mjs';
9
12
  import {
10
13
  applyInitialDeferredToolManifestToBp2,
11
14
  composeSystemPrompt,
12
15
  } from '../runtime/agent/orchestrator/context/collect.mjs';
16
+ import { _buildBaseRules } from '../runtime/agent/orchestrator/session/manager/rules-cache.mjs';
17
+ import { sessionRolePromptFields } from '../runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs';
13
18
  import {
14
- _buildBaseRules,
15
- _buildLeadRules,
16
- _buildLeadLanguageContext,
17
- } from '../runtime/agent/orchestrator/session/manager/rules-cache.mjs';
19
+ delegationDisabled,
20
+ honoredSchemaAllowlist,
21
+ } from '../runtime/agent/orchestrator/session/manager/session-tool-surface.mjs';
22
+ import { finalizeSessionToolList } from '../runtime/agent/orchestrator/session/manager/tool-resolution.mjs';
23
+ import { isAgentOwner } from '../runtime/agent/orchestrator/agent-owner.mjs';
18
24
  import { unusedModelEditToolName } from '../runtime/shared/edit-tool-dialect.mjs';
19
25
 
20
26
  function toolNames(list) {
@@ -69,6 +75,7 @@ export function createToolPolicyRefresh({
69
75
  getMode,
70
76
  getConfig,
71
77
  getDataDir,
78
+ getActiveTurnCount,
72
79
  modelStandaloneTools,
73
80
  featureDisallowedTools,
74
81
  loadCoreMemoryContext,
@@ -78,13 +85,23 @@ export function createToolPolicyRefresh({
78
85
  }) {
79
86
  // Denied tools leave every surface, then the deferred surface is rebuilt
80
87
  // for the lead's current mode.
81
- function applyToolDenials(session, denied) {
88
+ function applyToolDenials(session, denied, schemaAllowedTools, ownerIsAgent) {
82
89
  session.disallowedTools = denied;
83
90
  session.tools = filterDisallowedTools(session.tools, denied);
84
91
  if (Array.isArray(session.deferredToolCatalog)) {
85
92
  session.deferredToolCatalog = filterDisallowedTools(session.deferredToolCatalog, denied);
86
93
  }
87
- applyDeferredToolSurface(session, deferredSurfaceModeForLead(getMode()), modelStandaloneTools(), {
94
+ const catalogTools = finalizeSessionToolList(modelStandaloneTools(), {
95
+ schemaAllowedTools,
96
+ disallowedTools: denied,
97
+ ownerIsAgent,
98
+ });
99
+ session.tools = finalizeSessionToolList(session.tools, {
100
+ schemaAllowedTools,
101
+ disallowedTools: denied,
102
+ ownerIsAgent,
103
+ });
104
+ applyDeferredToolSurface(session, deferredSurfaceModeForLead(getMode()), catalogTools, {
88
105
  provider: getRoute()?.provider,
89
106
  });
90
107
  const catalog = Array.isArray(session.deferredToolCatalog) ? session.deferredToolCatalog : [];
@@ -101,16 +118,40 @@ export function createToolPolicyRefresh({
101
118
  }
102
119
  }
103
120
 
121
+ // A turn is executing from the moment it opens until it settles, even when
122
+ // its transcript holds only notifications (which are not conversation
123
+ // content). Its tool surface is frozen for that whole span.
124
+ function turnInFlight(session) {
125
+ return (getActiveTurnCount?.() || 0) > 0 || Array.isArray(session.liveTurnMessages);
126
+ }
127
+
128
+ // Admission: the session is still the current one, no turn is executing and
129
+ // no conversation has started. Checked before staging and again right
130
+ // before the staged change is applied.
131
+ function admitsRefresh(session) {
132
+ return (
133
+ getSession?.() === session &&
134
+ !turnInFlight(session) &&
135
+ !sessionHasConversationMessages(session) &&
136
+ !sessionHasConversationMessages({ messages: session.liveTurnMessages })
137
+ );
138
+ }
139
+
104
140
  async function refreshEmptySessionToolPolicy() {
105
141
  invalidatePreSessionToolSurface?.();
106
142
  const session = getSession?.();
107
143
  if (!session?.id) return { appliedToCurrentSession: true };
108
- if (
109
- sessionHasConversationMessages(session) ||
110
- sessionHasConversationMessages({ messages: session.liveTurnMessages })
111
- ) {
112
- return { appliedToCurrentSession: false };
113
- }
144
+ if (!admitsRefresh(session)) return { appliedToCurrentSession: false };
145
+ // Older records contain only compiled prompt text; rebuilding would guess
146
+ // away custom instructions. Keep that immutable material for every owner.
147
+ const identity = session.promptIdentity;
148
+ if (!identity) return { appliedToCurrentSession: false, reason: 'missing-prompt-identity' };
149
+ const ownerIsAgent = isAgentOwner(session);
150
+ const schemaAllowedTools = honoredSchemaAllowlist(session.schemaAllowedTools, {
151
+ ownerIsAgent,
152
+ agent: identity.agent,
153
+ });
154
+ const toolFreeRole = ownerIsAgent && schemaAllowedTools?.length === 0;
114
155
 
115
156
  const {
116
157
  summary: workflow,
@@ -118,34 +159,44 @@ export function createToolPolicyRefresh({
118
159
  packContext,
119
160
  orchestrationMode,
120
161
  } = activeWorkflowContext(getConfig(), getDataDir());
121
- const workflowContext = session.owner === 'agent' ? packContext : leadWorkflowContext;
122
- const denied = [...featureDisallowedTools(), ...(workflow?.delegatesAgents === false ? ['agent'] : [])]
162
+ const workflowContext = ownerIsAgent ? packContext : leadWorkflowContext;
163
+ const denied = [
164
+ ...session.callerDisallowedTools,
165
+ ...featureDisallowedTools(),
166
+ ...(workflow?.delegatesAgents === false ? ['agent'] : []),
167
+ ]
123
168
  .map((name) => String(name || ''))
124
169
  .filter(Boolean);
125
- session.workflow = toSessionWorkflowMeta(workflow);
126
- session.orchestrationMode = orchestrationMode;
127
- applyToolDenials(session, denied);
128
170
 
129
- const allowsAgents = workflow?.delegatesAgents !== false;
130
- const baseRules = _buildBaseRules({
131
- omitTools: [...denied, unusedModelEditToolName(getRoute()?.model)],
132
- allowTools: session.schemaAllowedTools,
133
- provider: getRoute()?.provider,
134
- model: getRoute()?.model,
135
- });
136
- const roleRules = _buildLeadRules({ includeLeadBrief: allowsAgents });
171
+ // Stage: everything below is computed without touching the session, so a
172
+ // turn that starts during the async rebuild cannot lose tools to it.
173
+ const baseRules =
174
+ identity.skipAgentRules || toolFreeRole
175
+ ? ''
176
+ : _buildBaseRules({
177
+ omitTools: [...denied, unusedModelEditToolName(getRoute()?.model)],
178
+ allowTools: schemaAllowedTools,
179
+ provider: getRoute()?.provider,
180
+ model: getRoute()?.model,
181
+ });
137
182
  const coreMemoryContext = await leadCoreMemoryContext();
138
183
  const { sessionMarkerCore } = composeSystemPrompt({
139
- roleRules,
140
- skipRoleCatalog: true,
184
+ ...sessionRolePromptFields(identity, {
185
+ ownerIsAgent,
186
+ toolFreeRole,
187
+ delegationFree: delegationDisabled(session, ownerIsAgent),
188
+ }),
189
+ provider: getRoute()?.provider,
141
190
  workflowContext,
142
191
  coreMemoryContext,
143
192
  // The rebuilt core keeps (or newly applies) the instruction-files setting.
144
- instructionFilesContext: loadInstructionFilesContext?.(session) || null,
145
- // BP3 rebuild must keep the trailing language block, or a workflow
146
- // switch would silently drop the response-language directive.
147
- languageContext: _buildLeadLanguageContext(),
193
+ instructionFilesContext: toolFreeRole ? null : loadInstructionFilesContext?.(session) || null,
148
194
  });
195
+ // Apply: re-check admission after the await, then mutate synchronously.
196
+ if (!admitsRefresh(session)) return { appliedToCurrentSession: false };
197
+ session.workflow = toSessionWorkflowMeta(workflow);
198
+ session.orchestrationMode = orchestrationMode;
199
+ applyToolDenials(session, denied, schemaAllowedTools, ownerIsAgent);
149
200
  rewriteSystemHeading(session, '# Tool Use', baseRules);
150
201
  rewriteBp3Core(session, sessionMarkerCore);
151
202
  session.updatedAt = Date.now();
@@ -6,6 +6,7 @@ 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
10
  import { LEAD_DISALLOWED_TOOLS } from '../runtime/agent/orchestrator/runtime-core/tool-defs.mjs';
10
11
  import { deferredSurfaceModeForLead, toolSpecForMode } from '../runtime/agent/orchestrator/runtime-core/effort.mjs';
11
12
  import { loadSkillToolDependencies } from '../runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs';
@@ -52,8 +53,11 @@ export function createToolSurface({
52
53
  const workflowTools = hideAgentTool
53
54
  ? profileTools.filter((tool) => !agentToolNames.has(String(tool?.name || '')))
54
55
  : profileTools;
56
+ const visibleTools = agentOwned
57
+ ? workflowTools.filter((tool) => !AGENT_WORKER_DENIED_TOOLS.has(String(tool?.name || '').toLowerCase()))
58
+ : workflowTools;
55
59
  const denied = new Set(getFeatureDisallowedTools().map((name) => String(name || '')));
56
- return denied.size ? workflowTools.filter((tool) => !denied.has(String(tool?.name || ''))) : workflowTools;
60
+ return denied.size ? visibleTools.filter((tool) => !denied.has(String(tool?.name || ''))) : visibleTools;
57
61
  }
58
62
 
59
63
  function disallowedTools() {
@@ -3,7 +3,12 @@
3
3
  * runtime notifications, and the deferred tool surface (status + selection).
4
4
  */
5
5
  import { clean } from '../../runtime/agent/orchestrator/runtime-core/session-text.mjs';
6
- import { toolRow, toolSearchMatches, sortedNamesByMeasuredUsage, selectDeferredTools } from '../../runtime/agent/orchestrator/runtime-core/tool-catalog.mjs';
6
+ import {
7
+ toolRow,
8
+ toolSearchMatches,
9
+ sortedNamesByMeasuredUsage,
10
+ selectDeferredTools,
11
+ } from '../../runtime/agent/orchestrator/runtime-core/tool-catalog.mjs';
7
12
 
8
13
  function splitToolStatusCounts(rows) {
9
14
  const list = Array.isArray(rows) ? rows : [];
@@ -67,6 +72,39 @@ export function createAgentOps(deps) {
67
72
  });
68
73
  }
69
74
 
75
+ // Explicit user force-release ("Release anyway") of a shell job whose
76
+ // termination is unconfirmed: drops its workspace hold. The surface has
77
+ // already asked the user to confirm. The caller session's own holds, and
78
+ // holds of a closed session whose workspace this session's folder sees.
79
+ async function releaseShellJob(taskId) {
80
+ const session = getSession();
81
+ const { forceReleaseTerminationHold } = await import(
82
+ '../../runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs'
83
+ );
84
+ return forceReleaseTerminationHold(taskId, {
85
+ callerSessionId: session?.id || null,
86
+ callerCwd: getCurrentCwd?.() || null,
87
+ });
88
+ }
89
+
90
+ // This session's live shell jobs (the readout rows), each carrying
91
+ // `terminationUnconfirmed` when it is held without confirmed termination,
92
+ // plus held shells a closed session left in a workspace this session sees.
93
+ async function listShellJobs() {
94
+ const session = getSession();
95
+ const { shellJobsStatusFresh, shellJobVisibleFrom } = await import(
96
+ '../../runtime/shared/statusline/statusline-segments.mjs'
97
+ );
98
+ const status = await shellJobsStatusFresh({ clientHostPid: session?.clientHostPid || process.pid });
99
+ const own = session?.id ? status?.sessions?.[session.id]?.jobs : status?.jobs;
100
+ const jobs = Array.isArray(own) ? [...own] : [];
101
+ const cwd = getCurrentCwd?.() || null;
102
+ for (const job of status?.orphaned || []) {
103
+ if (shellJobVisibleFrom(job, cwd) && !jobs.some((row) => row.taskId === job.taskId)) jobs.push(job);
104
+ }
105
+ return { jobs };
106
+ }
107
+
70
108
  function onNotification(listener) {
71
109
  if (typeof listener !== 'function') return () => {};
72
110
  const sessionId = getSession()?.id || getReservedSessionId?.() || '';
@@ -105,5 +143,14 @@ export function createAgentOps(deps) {
105
143
  return { ...result, status: toolsStatus() };
106
144
  }
107
145
 
108
- return { agentControl, taskControl, stopShellJob, onNotification, toolsStatus, selectTools };
146
+ return {
147
+ agentControl,
148
+ taskControl,
149
+ stopShellJob,
150
+ releaseShellJob,
151
+ listShellJobs,
152
+ onNotification,
153
+ toolsStatus,
154
+ selectTools,
155
+ };
109
156
  }