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
@@ -91,6 +91,7 @@ function createStandaloneMemoryRuntime({ entry, dataDir, cwd = process.cwd() } =
91
91
  warmupEmbedding: calls.warmupEmbedding,
92
92
  appendEntry: calls.appendEntry,
93
93
  ingestTranscript: calls.ingestTranscript,
94
+ forgetTranscripts: calls.forgetTranscripts,
94
95
  recordTraceEvents: calls.recordTraceEvents,
95
96
  moduleUrl: pathToFileURL(entry).href,
96
97
  };
@@ -1,5 +1,6 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { renameSync } from 'node:fs';
3
+ import { modelProxyClientMode, serverModelCredentialsDisabledError } from '../../runtime/shared/model-proxy-mode.mjs';
3
4
  import { sameAccountIdentity } from '../../runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs';
4
5
  import {
5
6
  AGENT_PROVIDER_ENV,
@@ -94,6 +95,7 @@ import {
94
95
  } from '../../runtime/shared/provider-accounts.mjs';
95
96
  import { currentProviderAccountId, withProviderAccount } from '../../runtime/shared/provider-auth-binding.mjs';
96
97
  import {
98
+ CUSTOM_API_KEY_ENV_RE,
97
99
  effectiveCustomModelRows,
98
100
  normalizeCustomProviderConfig as normalizeStoredCustomConfig,
99
101
  } from '../../runtime/agent/orchestrator/providers/custom-provider-config.mjs';
@@ -439,14 +441,22 @@ function customProviderRow(id, entry, checkSecrets = true) {
439
441
  const { config, error: configError } = inspectStoredCustomConfig(entry);
440
442
  const configuredEnabled = entry.enabled !== false;
441
443
  const keyless = (config?.auth ?? entry.auth) === 'none';
444
+ const apiKeyEnv = keyless ? '' : config?.apiKeyEnv || '';
445
+ const envSet = Boolean(apiKeyEnv && process.env[apiKeyEnv]);
442
446
  const stored = checkSecrets ? hasStoredSecret(SECRET_ACCOUNTS.agentApiKey(id)) : false;
443
447
  const unstoredStatus = configuredEnabled ? 'No Key' : 'Off';
444
448
  let status = stored ? 'Set' : unstoredStatus;
445
449
  let detail = stored ? 'stored in keychain' : 'custom endpoint';
450
+ if (apiKeyEnv) {
451
+ status = envSet ? 'Env' : unstoredStatus;
452
+ detail = apiKeyEnv;
453
+ }
446
454
  if (keyless) {
447
455
  status = configuredEnabled ? 'Keyless' : 'Off';
448
456
  detail = 'no API key required';
449
457
  }
458
+ let keyAuthenticated = checkSecrets ? stored : configuredEnabled;
459
+ if (apiKeyEnv) keyAuthenticated = envSet;
450
460
  const row = {
451
461
  id,
452
462
  name: entry.name,
@@ -457,17 +467,20 @@ function customProviderRow(id, entry, checkSecrets = true) {
457
467
  group: 'api',
458
468
  type: 'api-key',
459
469
  enabled: configuredEnabled,
460
- authenticated: keyless || (checkSecrets ? stored : configuredEnabled),
470
+ authenticated: keyless || keyAuthenticated,
461
471
  stored,
462
- env: false,
463
- envName: null,
472
+ env: envSet,
473
+ envName: apiKeyEnv || null,
464
474
  status,
465
475
  detail,
466
476
  };
477
+ if (apiKeyEnv) row.apiKeyEnv = apiKeyEnv;
467
478
  row.schemaVersion = config?.schemaVersion ?? entry.schemaVersion;
468
479
  row.auth = keyless ? 'none' : 'key';
469
480
  row.discovery = structuredClone(config?.discovery ?? entry.discovery ?? { newModelsHidden: false });
470
481
  row.modelOverrides = structuredClone(config?.modelOverrides ?? entry.modelOverrides ?? {});
482
+ if (config?.wires) row.wires = [...config.wires];
483
+ if (config?.modelWires) row.modelWires = { ...config.modelWires };
471
484
  // A stored config that does not normalize cannot run (the registry skips
472
485
  // it): say so explicitly instead of listing it as connected.
473
486
  // Every readiness flag consumers read says "not ready" (`stored` stays the
@@ -490,6 +503,7 @@ function customProviderRows(providers, checkSecrets) {
490
503
  }
491
504
 
492
505
  export async function providerSetup(config = {}, options = {}) {
506
+ if (modelProxyClientMode()) return modelProxyProviderSetup(options);
493
507
  const providers = config.providers || {};
494
508
  const checkSecrets = options?.checkSecrets !== false;
495
509
  const keychain = checkSecrets ? keychainIssueFor(true) : null;
@@ -504,6 +518,59 @@ export async function providerSetup(config = {}, options = {}) {
504
518
  };
505
519
  }
506
520
 
521
+ // The desktop's hidden custom models, in the override shape pickers already read.
522
+ function hiddenModelOverrides(entry) {
523
+ const ids = Array.isArray(entry?.hiddenModels) ? entry.hiddenModels : [];
524
+ return Object.fromEntries(ids.filter((id) => typeof id === 'string').map((id) => [id, { hidden: true }]));
525
+ }
526
+
527
+ // SSH servers have no model credentials. Project only the PC's advertised
528
+ // availability; account identities and credential management stay on the PC.
529
+ async function modelProxyProviderSetup(options) {
530
+ const { loadModelProxyProviderConfig } = await import(
531
+ '../../runtime/agent/orchestrator/providers/model-proxy-provider.mjs'
532
+ );
533
+ let providers;
534
+ try {
535
+ providers = await loadModelProxyProviderConfig({ force: options.force === true, waitMs: 1_000 });
536
+ } catch (error) {
537
+ if (error?.code !== 'MODEL_PROXY_UNAVAILABLE') throw error;
538
+ return { managedByClient: true, unavailable: true, api: [], oauth: [], local: [] };
539
+ }
540
+ const project = (definitions, group, type) =>
541
+ definitions
542
+ .filter(({ id }) => Object.hasOwn(providers, id))
543
+ .map(({ id, name }) => {
544
+ const enabled = providers[id]?.enabled === true;
545
+ const authState = providers[id]?.authState;
546
+ // Older desktops advertise only enabled; new desktops distinguish a
547
+ // missing credential from a transiently unreadable, preserved adapter.
548
+ const authenticated = authState == null ? enabled : authState === 'present';
549
+ const usable = enabled && authState !== 'absent';
550
+ let status = usable ? 'Connected' : 'Not connected';
551
+ if (enabled && authState === 'unreadable') status = 'Checking…';
552
+ // Signed in but switched off on the desktop.
553
+ else if (!enabled && authState === 'present') status = 'Off';
554
+ return {
555
+ id, name, group, type, enabled,
556
+ authenticated,
557
+ usable,
558
+ ...(group === 'local' ? { detected: enabled } : {}),
559
+ ...(type === 'custom' ? { custom: true, modelOverrides: hiddenModelOverrides(providers[id]) } : {}),
560
+ status,
561
+ };
562
+ });
563
+ const custom = Object.entries(providers)
564
+ .filter(([id, entry]) => isCustomProviderId(id) && entry?.type === 'custom')
565
+ .map(([id]) => ({ id, name: id }));
566
+ return {
567
+ managedByClient: true,
568
+ api: [...project(API_PROVIDERS, 'api', 'api-key'), ...project(custom, 'api', 'custom')],
569
+ oauth: project(OAUTH_PROVIDERS, 'oauth', 'oauth'),
570
+ local: project([{ id: 'mixdog-local', name: 'Local Provider' }], 'local', 'local'),
571
+ };
572
+ }
573
+
507
574
  function apiProviderStatusRow(p, config) {
508
575
  const configured = config.providers?.[p.id] || {};
509
576
  const envName = AGENT_PROVIDER_ENV[p.id] || p.env;
@@ -547,8 +614,8 @@ export function providerStatus(config = {}) {
547
614
  enabled: row.enabled,
548
615
  authenticated: row.authenticated,
549
616
  stored: row.stored,
550
- env: false,
551
- envName: null,
617
+ env: row.env,
618
+ envName: row.envName,
552
619
  label: row.name,
553
620
  })),
554
621
  ...availableOAuthProviders().map((p) => oauthProviderStatusRow(p, config)),
@@ -572,7 +639,12 @@ export function renderProviderStatus(config = {}) {
572
639
  .join('\n');
573
640
  }
574
641
 
642
+ function requireLocalProviderManagement() {
643
+ if (modelProxyClientMode()) throw serverModelCredentialsDisabledError('Provider account management');
644
+ }
645
+
575
646
  export async function authenticateProvider(provider, secret) {
647
+ requireLocalProviderManagement();
576
648
  const id = String(provider || '').trim();
577
649
  if (!id) throw new Error('provider id is required');
578
650
 
@@ -593,6 +665,7 @@ export async function authenticateProvider(provider, secret) {
593
665
  }
594
666
 
595
667
  export async function loginOAuthProvider(cfgMod, provider) {
668
+ requireLocalProviderManagement();
596
669
  const id = String(provider || '').trim();
597
670
  const oauth = availableOAuthProvider(id);
598
671
  if (!oauth) throw new Error(`unknown OAuth provider "${id}"`);
@@ -679,6 +752,7 @@ async function settleOAuthLogin(
679
752
  }
680
753
 
681
754
  export async function beginOAuthProviderLogin(cfgMod, provider, options = {}) {
755
+ requireLocalProviderManagement();
682
756
  const id = String(provider || '').trim();
683
757
  const oauth = availableOAuthProvider(id);
684
758
  if (!oauth) throw new Error(`unknown OAuth provider "${id}"`);
@@ -751,6 +825,10 @@ export async function beginOAuthProviderLogin(cfgMod, provider, options = {}) {
751
825
  }
752
826
 
753
827
  export function listProviderAccounts(provider) {
828
+ if (!OAUTH_BY_ID.has(provider)) throw new TypeError('Unknown OAuth provider.');
829
+ // Client mode: accounts live on the desktop, so this server's roster is
830
+ // empty whatever this server's own provider availability says.
831
+ if (modelProxyClientMode()) return { provider, auto: true, useCredits: false, selectedId: null, accounts: [] };
754
832
  const oauth = availableOAuthProvider(provider);
755
833
  if (!oauth) throw new TypeError('Unknown OAuth provider.');
756
834
  const pool = readProviderAccountPool(provider);
@@ -795,6 +873,7 @@ function defaultAccountRows(provider, oauth) {
795
873
  // Store the implicit signed-in `default` account in the roster, so a change or
796
874
  // a usage measurement has a row to land on. Returns the current roster view.
797
875
  export async function materializeProviderAccounts(provider) {
876
+ requireLocalProviderManagement();
798
877
  const current = listProviderAccounts(provider);
799
878
  if (readProviderAccountPool(provider).accounts.length || !current.accounts.length) return current;
800
879
  await registerProviderAccount(provider, 'default', { label: 'Account 1' });
@@ -802,6 +881,7 @@ export async function materializeProviderAccounts(provider) {
802
881
  }
803
882
 
804
883
  export async function updateProviderAccounts(provider, change) {
884
+ requireLocalProviderManagement();
805
885
  await materializeProviderAccounts(provider);
806
886
  await changeProviderAccounts(provider, change);
807
887
  // Picking an account by hand is a decision to use it NOW, so the refusal
@@ -813,6 +893,7 @@ export async function updateProviderAccounts(provider, change) {
813
893
  }
814
894
 
815
895
  export async function saveProviderApiKey(cfgMod, provider, secret) {
896
+ requireLocalProviderManagement();
816
897
  const id = String(provider || '').trim();
817
898
  if (!API_PROVIDER_IDS.has(id)) throw new Error(`unknown API-key provider "${id}"`);
818
899
  const value = String(secret || '').trim();
@@ -867,6 +948,20 @@ function validateCustomTransportFields(input) {
867
948
  throw new TypeError('custom provider id is invalid');
868
949
  if (input.apiKey !== undefined && (typeof input.apiKey !== 'string' || input.apiKey.length > CUSTOM_API_KEY_MAX))
869
950
  throw new TypeError('custom provider apiKey is invalid');
951
+ if (input.apiKeyEnv !== undefined && input.apiKeyEnv !== null) {
952
+ if (typeof input.apiKeyEnv !== 'string' || !CUSTOM_API_KEY_ENV_RE.test(input.apiKeyEnv))
953
+ throw new TypeError('custom provider apiKeyEnv is invalid');
954
+ if (input.auth === 'none') throw new TypeError('custom provider apiKeyEnv requires key auth');
955
+ if (typeof input.apiKey === 'string' && input.apiKey !== '')
956
+ throw new TypeError('custom provider apiKey and apiKeyEnv are mutually exclusive');
957
+ }
958
+ }
959
+
960
+ /** Whether the named environment variable is set to a non-empty value. */
961
+ export function checkCustomProviderKeyEnv(name) {
962
+ if (typeof name !== 'string' || !CUSTOM_API_KEY_ENV_RE.test(name))
963
+ throw new TypeError('environment variable name is invalid');
964
+ return { found: Boolean(process.env[name]) };
870
965
  }
871
966
 
872
967
  function inputObject(input) {
@@ -886,9 +981,16 @@ function withStoredSettings(input, entry) {
886
981
  }
887
982
  const out = { ...input };
888
983
  if (out.auth === undefined) out.auth = stored.auth;
984
+ if (out.apiKeyEnv === undefined && stored.apiKeyEnv) out.apiKeyEnv = stored.apiKeyEnv;
889
985
  if (out.schemaVersion === stored.schemaVersion) {
890
986
  if (out.discovery === undefined) out.discovery = stored.discovery;
891
987
  if (out.modelOverrides === undefined) out.modelOverrides = stored.modelOverrides;
988
+ // Served wires and per-model wires have no setup field yet: an edit on
989
+ // the same protocol keeps them (another protocol serves other wires).
990
+ if ((out.protocol ?? stored.protocol) === stored.protocol) {
991
+ if (out.wires === undefined && stored.wires) out.wires = stored.wires;
992
+ if (out.modelWires === undefined && stored.modelWires) out.modelWires = stored.modelWires;
993
+ }
892
994
  }
893
995
  return out;
894
996
  }
@@ -904,20 +1006,24 @@ async function resolveCustomInput(cfgMod, rawInput, options) {
904
1006
  const config = normalizeCustomProviderConfig(input, options);
905
1007
  const typed = typeof input.apiKey === 'string' ? input.apiKey.trim() : '';
906
1008
  const keyless = config.auth === 'none';
1009
+ const envName = keyless ? '' : config.apiKeyEnv || '';
907
1010
  let apiKey = '';
908
- if (!keyless) apiKey = typed || (id ? getAgentApiKey(id) || '' : '');
909
- return { id, config, typed: keyless ? '' : typed, apiKey, keyless };
1011
+ if (envName) apiKey = process.env[envName] || '';
1012
+ else if (!keyless) apiKey = typed || (id ? getAgentApiKey(id) || '' : '');
1013
+ return { id, config, typed: keyless || envName ? '' : typed, apiKey, keyless, envName };
910
1014
  }
911
1015
 
912
1016
  export async function saveCustomProvider(cfgMod, rawInput) {
1017
+ requireLocalProviderManagement();
913
1018
  const {
914
1019
  id: existingId,
915
1020
  config,
916
1021
  typed,
917
1022
  apiKey,
918
1023
  keyless,
1024
+ envName,
919
1025
  } = await resolveCustomInput(cfgMod, rawInput, { requireModels: false });
920
- if (!keyless && !apiKey) throw new Error('API key is required');
1026
+ if (!keyless && !envName && !apiKey) throw new Error('API key is required');
921
1027
  const id = existingId || `custom-${randomUUID()}`;
922
1028
  const entry = { ...config, type: 'custom', enabled: config.enabled !== false };
923
1029
  const account = SECRET_ACCOUNTS.agentApiKey(id);
@@ -963,6 +1069,7 @@ function plainPatch(value, allowed, label) {
963
1069
  // removes the whole override; reasoning is merged key by key with the same
964
1070
  // tri-state rules. Semantic validation is the runtime normalizer's.
965
1071
  export async function updateCustomProviderModel(cfgMod, rawId, rawModelId, patch) {
1072
+ requireLocalProviderManagement();
966
1073
  const id = String(rawId || '').trim();
967
1074
  const modelId = typeof rawModelId === 'string' ? rawModelId.trim() : '';
968
1075
  if (!modelId) throw new TypeError('model id is required');
@@ -1021,17 +1128,43 @@ export async function updateCustomProviderModel(cfgMod, rawId, rawModelId, patch
1021
1128
  return customProviderRow(id, saved);
1022
1129
  }
1023
1130
 
1131
+ // Drops every stored model setting and route that names the provider.
1132
+ function withoutProviderReferences(config, id) {
1133
+ const next = { ...config };
1134
+ const names = (route) => route?.provider === id;
1135
+ if (next.modelSettings) {
1136
+ next.modelSettings = Object.fromEntries(
1137
+ Object.entries(next.modelSettings).filter(([key]) => !key.startsWith(`${id}/`))
1138
+ );
1139
+ }
1140
+ if (next.agents) {
1141
+ next.agents = Object.fromEntries(Object.entries(next.agents).filter(([, route]) => !names(route)));
1142
+ }
1143
+ if (names(next.webSearchRoute)) delete next.webSearchRoute;
1144
+ if (Array.isArray(next.presets)) {
1145
+ const dropped = new Set(next.presets.filter(names).map((preset) => preset.id));
1146
+ next.presets = next.presets.filter((preset) => !names(preset));
1147
+ if (dropped.has(next.default)) delete next.default;
1148
+ }
1149
+ return next;
1150
+ }
1151
+
1024
1152
  export async function removeCustomProvider(cfgMod, rawId) {
1153
+ requireLocalProviderManagement();
1025
1154
  const id = String(rawId || '').trim();
1026
1155
  existingCustomEntry(cfgMod, id);
1156
+ // Secret first: a real keychain failure (locked, permission) leaves the
1157
+ // provider registered so the removal can be retried. A missing secret
1158
+ // (keyless provider) is not an error.
1159
+ await deleteSecretAsync(SECRET_ACCOUNTS.agentApiKey(id));
1027
1160
  const current = cfgMod.loadConfig();
1028
1161
  const { [id]: _removed, ...providers } = current.providers || {};
1029
- cfgMod.saveConfig({ ...current, providers }, { baseConfig: current });
1030
- await deleteSecretAsync(SECRET_ACCOUNTS.agentApiKey(id));
1162
+ cfgMod.saveConfig(withoutProviderReferences({ ...current, providers }, id), { baseConfig: current });
1031
1163
  return { provider: id, type: 'custom', removed: true };
1032
1164
  }
1033
1165
 
1034
1166
  export async function testCustomProvider(cfgMod, rawInput) {
1167
+ requireLocalProviderManagement();
1035
1168
  const { id, config, apiKey } = await resolveCustomInput(cfgMod, rawInput, { requireModels: false });
1036
1169
  try {
1037
1170
  // The first visible manual model needs no discovery; otherwise the first
@@ -1057,11 +1190,18 @@ export async function testCustomProvider(cfgMod, rawInput) {
1057
1190
  );
1058
1191
  return { ok: true };
1059
1192
  } catch (error) {
1060
- throw sanitizeCustomError(error, [apiKey]);
1193
+ throw sanitizeCustomError(error, customSecrets(apiKey, config));
1061
1194
  }
1062
1195
  }
1063
1196
 
1197
+ // Every key the operation may have sent: env mode re-reads the variable on an
1198
+ // auth retry, so its current value is redacted alongside the initial key.
1199
+ function customSecrets(apiKey, config) {
1200
+ return [apiKey, config.apiKeyEnv ? process.env[config.apiKeyEnv] : ''];
1201
+ }
1202
+
1064
1203
  export async function discoverCustomProviderModels(cfgMod, rawInput) {
1204
+ requireLocalProviderManagement();
1065
1205
  const { id, config, apiKey } = await resolveCustomInput(cfgMod, rawInput, { requireModels: false });
1066
1206
  try {
1067
1207
  const { createCustomProvider } = await loadCustomProviderModule();
@@ -1070,23 +1210,24 @@ export async function discoverCustomProviderModels(cfgMod, rawInput) {
1070
1210
  const models = publicCustomModelRows(listed);
1071
1211
  // A failed discovery that still left manual rows reports its error too.
1072
1212
  const failure = provider.customDiscoveryError;
1073
- return failure ? { models, error: discoveryErrorView(failure, apiKey) } : { models };
1213
+ return failure ? { models, error: discoveryErrorView(failure, customSecrets(apiKey, config)) } : { models };
1074
1214
  } catch (error) {
1075
- return { models: [], error: discoveryErrorView(error, apiKey) };
1215
+ return { models: [], error: discoveryErrorView(error, customSecrets(apiKey, config)) };
1076
1216
  }
1077
1217
  }
1078
1218
 
1079
- function discoveryErrorView(error, apiKey) {
1219
+ function discoveryErrorView(error, secrets) {
1080
1220
  const status = Number.isInteger(error?.status) ? error.status : undefined;
1081
1221
  const authKind = status === 401 || status === 403 ? 'authentication' : 'request';
1082
1222
  return {
1083
1223
  kind: status === 404 || status === 405 ? 'unavailable' : authKind,
1084
1224
  ...(status === undefined ? {} : { status }),
1085
- message: sanitizeCustomError(error, [apiKey]).message,
1225
+ message: sanitizeCustomError(error, secrets).message,
1086
1226
  };
1087
1227
  }
1088
1228
 
1089
1229
  export async function saveOpenAIUsageSessionKey(cfgMod, secret) {
1230
+ requireLocalProviderManagement();
1090
1231
  const value = String(secret || '').trim();
1091
1232
  if (!value) throw new Error('OpenAI usage session key is required for credit lookup');
1092
1233
  await saveSecretAsync(SECRET_ACCOUNTS.openaiUsageSessionKey, value);
@@ -1095,6 +1236,7 @@ export async function saveOpenAIUsageSessionKey(cfgMod, secret) {
1095
1236
  }
1096
1237
 
1097
1238
  export async function saveOpenCodeGoUsageAuth(cfgMod, { apiKey } = {}) {
1239
+ requireLocalProviderManagement();
1098
1240
  const secret = String(apiKey || '').trim();
1099
1241
  if (!secret) throw new Error('OpenCode console API key is required for usage lookup');
1100
1242
  // Subscription meters are read with a console service-account key holding the
@@ -1111,6 +1253,7 @@ export async function saveOpenCodeGoUsageAuth(cfgMod, { apiKey } = {}) {
1111
1253
  }
1112
1254
 
1113
1255
  export async function forgetProviderAuth(cfgModOrProvider, maybeProvider, requestedAccountId) {
1256
+ requireLocalProviderManagement();
1114
1257
  const cfgMod = maybeProvider === undefined ? null : cfgModOrProvider;
1115
1258
  const id = String(maybeProvider === undefined ? cfgModOrProvider : maybeProvider || '').trim();
1116
1259
  const oauth = availableOAuthProvider(id);
@@ -16,6 +16,7 @@ function agentOwnedSessionFields(sessionProfile) {
16
16
  visibility: 'agent-only',
17
17
  agentTag: sessionProfile?.agentTag || null,
18
18
  taskType: sessionProfile?.taskType || null,
19
+ ...(sessionProfile?.routeFallbacks !== undefined ? { routeFallbacks: sessionProfile.routeFallbacks } : {}),
19
20
  permission: sessionProfile?.permission || undefined,
20
21
  permissionMode: sessionProfile?.permissionMode || undefined,
21
22
  schemaAllowedTools: Array.isArray(sessionProfile?.schemaAllowedTools)
@@ -38,6 +39,10 @@ export function sessionOptions(deps, coreMemoryContext) {
38
39
  const agentOwned = sessionProfile?.owner === 'agent' || sessionProfile?.visibility === 'agent-only';
39
40
  // Agent-owned sessions keep the Active Workflow block only.
40
41
  const workflowContext = agentOwned ? packContext : leadWorkflowContext;
42
+ const callerDisallowedTools = [
43
+ ...(agentOwned ? [] : LEAD_DISALLOWED_TOOLS),
44
+ ...(!agentOwned && rt.disallowDelegation ? ['agent'] : []),
45
+ ];
41
46
  const sessionOpts = {
42
47
  ...(rt.reservedSessionId ? { id: rt.reservedSessionId } : {}),
43
48
  provider: rt.route.provider,
@@ -59,11 +64,8 @@ export function sessionOptions(deps, coreMemoryContext) {
59
64
  ...(rt.approvalMode ? { approvalMode: rt.approvalMode } : {}),
60
65
  clientHostPid: sessionProfile?.clientHostPid || process.pid,
61
66
  mcpScopeId: rt.mcpScopeId,
62
- disallowedTools: [
63
- ...(agentOwned ? [] : LEAD_DISALLOWED_TOOLS),
64
- ...(!agentOwned && rt.disallowDelegation ? ['agent'] : []),
65
- ...featureDisallowedTools(),
66
- ],
67
+ callerDisallowedTools,
68
+ disallowedTools: [...callerDisallowedTools, ...featureDisallowedTools()],
67
69
  cwd: rt.currentCwd,
68
70
  ...(rt.desktopSession && typeof rt.desktopSession === 'object' ? { desktopSession: rt.desktopSession } : {}),
69
71
  coreMemoryContext,
@@ -1,6 +1,7 @@
1
1
  // session-create/session-start-hook.mjs — the SessionStart project hook:
2
2
  // best-effort dispatch whose additionalContext lands before the first turn.
3
3
  import { runAbortable, throwIfAborted } from '../../runtime/shared/abort-race.mjs';
4
+ import { contextAckMessage } from '../../runtime/agent/orchestrator/session/compact/user-message-kind.mjs';
4
5
 
5
6
  function sessionStartSource(reason) {
6
7
  const reasonText = String(reason || '');
@@ -29,7 +30,7 @@ export async function dispatchSessionStart(deps, reason, signal) {
29
30
  role: 'user',
30
31
  content: `<system-reminder>\n# SessionStart Hook Context\n${startContext.trim()}\n</system-reminder>`,
31
32
  });
32
- rt.session.messages.push({ role: 'assistant', content: '.' });
33
+ rt.session.messages.push(contextAckMessage());
33
34
  rt.session.updatedAt = Date.now();
34
35
  }
35
36
  } catch {
@@ -0,0 +1,32 @@
1
+ // A hard-deleted session takes its conversation transcript
2
+ // (`<home>/projects/<slug>/<id>.jsonl`) and the memory ingest read positions
3
+ // keyed by that file with it. Registered once per process as a store purge hook:
4
+ // the file removal is synchronous under the delete's commit lock, the offset
5
+ // removal is a best-effort request to the memory service.
6
+ import { registerSessionPurgeHook } from '../runtime/agent/orchestrator/session/store.mjs';
7
+ import { mixdogHome } from '../runtime/shared/plugin-paths.mjs';
8
+ import { purgeSessionTranscripts } from '../runtime/shared/transcript-writer/purge.mjs';
9
+
10
+ const logError = (message) => {
11
+ try {
12
+ process.stderr.write(`mixdog: transcript-purge: ${message}\n`);
13
+ } catch {
14
+ /* logging is best effort */
15
+ }
16
+ };
17
+
18
+ /** @param {{ forgetOffsets?: (transcriptPaths: string[]) => Promise<unknown> }} options */
19
+ export function registerTranscriptPurgeHook({ forgetOffsets } = {}) {
20
+ return registerSessionPurgeHook((sessionId, context) => {
21
+ const transcriptPaths = purgeSessionTranscripts({
22
+ mixdogHome: mixdogHome(),
23
+ sessionId,
24
+ cwds: context?.cwds,
25
+ onError: (target, error) => logError(`could not remove ${target}: ${error?.message || error}`),
26
+ });
27
+ if (!transcriptPaths.length || typeof forgetOffsets !== 'function') return;
28
+ Promise.resolve()
29
+ .then(() => forgetOffsets(transcriptPaths))
30
+ .catch((error) => logError(`could not drop ingest offsets of ${sessionId}: ${error?.message || error}`));
31
+ });
32
+ }
@@ -1,4 +1,4 @@
1
- // Session transcript writer: every user-facing main session owns a
1
+ // Session transcript writer: every session owns a
2
2
  // conversation JSONL that the always-on memory watcher tails. The mutable
3
3
  // runtime-core locals it needs are injected as accessors.
4
4
  import { createTranscriptWriter } from '../runtime/shared/transcript-writer.mjs';
@@ -20,12 +20,10 @@ export function createSessionTranscript({ getSession, getCwd }) {
20
20
  ensureSessionTranscriptWriter,
21
21
  };
22
22
 
23
- // Every user-facing main session owns a conversation JSONL. The always-on
24
- // memory watcher tails this same file. Agent-owned sessions stay out of the
25
- // user's recall pool and generate a session-local handoff when compacting.
23
+ // Agent conversations use the same writer but remain outside memory ingestion.
26
24
  function ensureSessionTranscriptWriter() {
27
25
  const session = getSession();
28
- if (!session?.id || isAgentOwner(session)) return false;
26
+ if (!session?.id) return false;
29
27
  const cwd = getCwd();
30
28
  const key = `${session.id}\u0000${cwd}`;
31
29
  if (writerKey !== key) {
@@ -35,6 +33,7 @@ export function createSessionTranscript({ getSession, getCwd }) {
35
33
  sessionId: session.id,
36
34
  cwd,
37
35
  pid: process.pid,
36
+ memoryEligible: !isAgentOwner(session),
38
37
  });
39
38
  writerKey = key;
40
39
  } catch (error) {
@@ -1,40 +1,43 @@
1
1
  /**
2
2
  * src/session-runtime/session-turn-api.mjs - turn execution (ask) plus the
3
- * between-turn session, sharing, and agent/tool-surface commands. Stateless
3
+ * between-turn session and agent/tool-surface commands. Stateless
4
4
  * helpers are imported by the groups; the runtime injects live
5
5
  * getters/setters for the mutable session/mode/turn-counter/transcript-writer
6
6
  * locals plus the closure callbacks.
7
7
  */
8
8
  import { createTurnRunner } from './turn/turn-run.mjs';
9
9
  import { createSessionOps } from './turn/session-ops.mjs';
10
- import { createShareOps } from './turn/share-ops.mjs';
10
+ import { createCompactionGate } from './turn/compaction-gate.mjs';
11
11
  import { createAgentOps } from './turn/agent-ops.mjs';
12
+ import { createSideQuestionOps } from './turn/side-question-ops.mjs';
12
13
 
13
14
  export function createSessionTurnApi(deps) {
14
- const runner = createTurnRunner(deps);
15
+ // A model-scheduled compaction runs chained after its turn; the next turn
16
+ // and any manual compact/clear/rewind wait on it so nothing races it.
17
+ const gate = createCompactionGate({ getSessionId: () => deps.getSession()?.id, compact: () => session.compact() });
18
+ const afterCompaction = gate.after;
19
+ const runner = createTurnRunner({ ...deps, runPendingCompact: gate.run });
15
20
  const session = createSessionOps(deps);
16
- const share = createShareOps(deps);
17
21
  const agent = createAgentOps(deps);
22
+ const side = createSideQuestionOps(deps);
18
23
  return {
19
- enqueueRemoteAttachedPrompt: runner.enqueueRemoteAttachedPrompt,
24
+ askSide: side.askSide,
25
+ cancelSide: side.cancelSide,
20
26
  getTurnLiveness: runner.getTurnLiveness,
21
- ask: runner.ask,
22
- clear: session.clear,
23
- rewindMessages: session.rewindMessages,
24
- compact: session.compact,
27
+ ask: afterCompaction(runner.ask),
28
+ clear: afterCompaction(session.clear),
29
+ rewindMessages: afterCompaction(session.rewindMessages),
30
+ compact: afterCompaction(session.compact),
25
31
  setToolMode: session.setToolMode,
26
32
  agentStatus: session.agentStatus,
27
33
  interruptTaskWait: session.interruptTaskWait,
28
34
  readModelMessages: session.readModelMessages,
29
35
  onAgentStatusChange: session.onAgentStatusChange,
30
- takeRemoteInjections: share.takeRemoteInjections,
31
- pendingSpoolPath: share.pendingSpoolPath,
32
- publishSessionPresence: share.publishSessionPresence,
33
- clearSessionPresence: share.clearSessionPresence,
34
- sessionOwnerGone: share.sessionOwnerGone,
35
36
  agentControl: agent.agentControl,
36
37
  taskControl: agent.taskControl,
37
38
  stopShellJob: agent.stopShellJob,
39
+ releaseShellJob: agent.releaseShellJob,
40
+ listShellJobs: agent.listShellJobs,
38
41
  onNotification: agent.onNotification,
39
42
  toolsStatus: agent.toolsStatus,
40
43
  selectTools: agent.selectTools,
@@ -9,10 +9,7 @@ import {
9
9
  } from '../runtime/agent/orchestrator/runtime-core/builtin-features.mjs';
10
10
  import { featureEnvOverride, moduleEnabled } from '../runtime/agent/orchestrator/runtime-core/config-helpers.mjs';
11
11
  import { LOCAL_PROVIDER_ID } from '../runtime/local-provider/managed-runtime.mjs';
12
- import {
13
- INSTRUCTION_FILES_MODES,
14
- normalizeInstructionFilesMode,
15
- } from '../runtime/shared/instruction-files-mode.mjs';
12
+ import { INSTRUCTION_FILES_MODES, normalizeInstructionFilesMode } from '../runtime/shared/instruction-files-mode.mjs';
16
13
  import { getEmbeddingInfo } from '../runtime/memory/lib/embedding-provider.mjs';
17
14
  import { onnxRuntimeSupported } from '../runtime/shared/onnx-runtime-support.mjs';
18
15
  import {
@@ -24,7 +21,7 @@ import {
24
21
  shutdownEffortJudge,
25
22
  } from '../runtime/effort-judge/judge-client.mjs';
26
23
 
27
- const TOGGLEABLE_BUILTINS = ['git', 'office', 'tidy', 'localProvider', 'autoEffort', 'visualize'];
24
+ const TOGGLEABLE_BUILTINS = ['git', 'office', 'tidy', 'localProvider', 'autoEffort', 'visualize', 'media'];
28
25
 
29
26
  function setLocalProviderEnabledInConfig(configLike, enabled) {
30
27
  const next = { ...(configLike || {}) };
@@ -79,6 +76,15 @@ export function createBuiltinToolSettings(
79
76
  invalidateContextStatusCache();
80
77
  return this.getRecapSettings();
81
78
  },
79
+ // Whether the model may title the session (session tool, action=rename).
80
+ // Absent config means on; only the opt-out is stored.
81
+ getSessionTitleSettings() {
82
+ return { aiSessionTitles: getConfig()?.aiSessionTitles !== false };
83
+ },
84
+ setAiSessionTitles(enabled) {
85
+ saveConfigAndAdopt({ ...getConfig(), aiSessionTitles: enabled !== false });
86
+ return this.getSessionTitleSettings();
87
+ },
82
88
  getToolModuleSettings() {
83
89
  const config = getConfig();
84
90
  const localProvider = getLocalProviderStatus?.() || {};
@@ -104,6 +110,12 @@ export function createBuiltinToolSettings(
104
110
  enabled: featureEnvOverride('MIXDOG_FEATURE_VISUALIZE') ?? moduleEnabled(config, 'visualize', true),
105
111
  installed: true,
106
112
  },
113
+ // Image and video generation ships with the runtime and is on unless
114
+ // switched off; the image/video skills follow it (`requires: media`).
115
+ media: {
116
+ enabled: featureEnvOverride('MIXDOG_FEATURE_MEDIA') ?? moduleEnabled(config, 'media', true),
117
+ installed: true,
118
+ },
107
119
  localProvider: {
108
120
  ...localProvider,
109
121
  ...localSettings.status(),
@@ -159,7 +171,7 @@ export function createBuiltinToolSettings(
159
171
  },
160
172
  async setBuiltinToolEnabled(name, enabled) {
161
173
  if (!TOGGLEABLE_BUILTINS.includes(name)) {
162
- throw new TypeError('Built-in tool must be git, office, tidy, localProvider, autoEffort, or visualize.');
174
+ throw new TypeError('Built-in tool must be git, office, tidy, localProvider, autoEffort, visualize, or media.');
163
175
  }
164
176
  if (name === 'autoEffort' && enabled !== false && !onnxRuntimeSupported()) {
165
177
  throw new Error(EFFORT_JUDGE_UNSUPPORTED);