mixdog 1.1.2 → 1.2.1

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 (424) hide show
  1. package/README.md +8 -5
  2. package/package.json +2 -1
  3. package/scripts/lib/run-node-tests.mjs +9 -0
  4. package/scripts/prune-desktop-runtime.mjs +3 -0
  5. package/scripts/test-direct.mjs +4 -2
  6. package/src/defaults/shipped-history.json +10 -0
  7. package/src/defaults/skills/pptx/SKILL.md +6 -6
  8. package/src/defaults/skills/pptx/references/review.md +6 -4
  9. package/src/defaults/skills/pptx/scripts/source-extract.mjs +1 -1
  10. package/src/defaults/skills/setup/references/actions.md +18 -5
  11. package/src/defaults/skills/visualize/SKILL.md +160 -0
  12. package/src/defaults/skills/visualize/references/craft.md +88 -0
  13. package/src/headless-command.mjs +56 -3
  14. package/src/headless-exec.mjs +17 -1
  15. package/src/help.mjs +2 -0
  16. package/src/rules/shared/60-verification.md +3 -1
  17. package/src/rules/shared/70-delivery.md +4 -2
  18. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +1 -0
  19. package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +1 -0
  20. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +2 -0
  21. package/src/runtime/agent/orchestrator/cache-mtime.mjs +26 -5
  22. package/src/runtime/agent/orchestrator/config-presets.mjs +2 -0
  23. package/src/runtime/agent/orchestrator/config-providers-merge.mjs +17 -11
  24. package/src/runtime/agent/orchestrator/config-storage.mjs +1 -0
  25. package/src/runtime/agent/orchestrator/config.mjs +19 -5
  26. package/src/runtime/agent/orchestrator/context/collect.mjs +2 -1
  27. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +11 -5
  28. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +74 -21
  29. package/src/runtime/agent/orchestrator/mcp/client-config.mjs +133 -15
  30. package/src/runtime/agent/orchestrator/mcp/client-handshake.mjs +55 -8
  31. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +86 -8
  32. package/src/runtime/agent/orchestrator/mcp/client.mjs +474 -164
  33. package/src/runtime/agent/orchestrator/mcp/lazy-output-validator.mjs +25 -0
  34. package/src/runtime/agent/orchestrator/mcp/plugin-placeholders.mjs +54 -0
  35. package/src/runtime/agent/orchestrator/mcp/reconnect-singleflight.mjs +4 -0
  36. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +108 -17
  37. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  38. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +3 -0
  39. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +15 -1
  40. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +32 -12
  41. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -0
  42. package/src/runtime/agent/orchestrator/providers/auto-effort.mjs +9 -0
  43. package/src/runtime/agent/orchestrator/providers/command-code-oauth-login.mjs +337 -0
  44. package/src/runtime/agent/orchestrator/providers/command-code-oauth-tokens.mjs +159 -0
  45. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +444 -0
  46. package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +2 -0
  47. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
  48. package/src/runtime/agent/orchestrator/providers/cursor-wire-normalization.mjs +2 -1
  49. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +7 -4
  50. package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +21 -6
  51. package/src/runtime/agent/orchestrator/providers/effort-rejection.mjs +244 -0
  52. package/src/runtime/agent/orchestrator/providers/gemini.mjs +41 -28
  53. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
  54. package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +3 -0
  55. package/src/runtime/agent/orchestrator/providers/lib/gemini-model-catalog.mjs +7 -1
  56. package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +8 -40
  57. package/src/runtime/agent/orchestrator/providers/mimo-oauth-tokens.mjs +2 -0
  58. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +51 -12
  59. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +37 -2
  60. package/src/runtime/agent/orchestrator/providers/model-proxy-bridge.mjs +1080 -0
  61. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +82 -0
  62. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +556 -0
  63. package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +251 -0
  64. package/src/runtime/agent/orchestrator/providers/muse-code-oauth-tokens.mjs +2 -0
  65. package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +69 -102
  66. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +15 -0
  67. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +6 -5
  68. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +1 -1
  69. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +6 -2
  70. package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +11 -0
  71. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +2 -1
  72. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +15 -4
  73. package/src/runtime/agent/orchestrator/providers/openai-oauth-catalog-store.mjs +1 -1
  74. package/src/runtime/agent/orchestrator/providers/openai-oauth-catalog.mjs +5 -2
  75. package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +3 -0
  76. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +4 -4
  77. package/src/runtime/agent/orchestrator/providers/registry.mjs +47 -7
  78. package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +10 -0
  79. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +36 -3
  80. package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -11
  81. package/src/runtime/agent/orchestrator/runtime-core/extension-scopes.mjs +15 -55
  82. package/src/runtime/agent/orchestrator/runtime-core/goal-control.mjs +15 -2
  83. package/src/runtime/agent/orchestrator/runtime-core/model-capabilities.mjs +16 -1
  84. package/src/runtime/agent/orchestrator/runtime-core/plugin-mcp.mjs +278 -84
  85. package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +4 -1
  86. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-schema.mjs +21 -0
  87. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +54 -3
  88. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +10 -3
  89. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +10 -0
  90. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +9 -5
  91. package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +18 -8
  92. package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +284 -0
  93. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +268 -0
  94. package/src/runtime/agent/orchestrator/session/catalog-db/sqlite-gate.mjs +27 -0
  95. package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +628 -0
  96. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +10 -3
  97. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +24 -13
  98. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +13 -5
  99. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +362 -0
  100. package/src/runtime/agent/orchestrator/session/compaction-archive.mjs +253 -0
  101. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +184 -0
  102. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +136 -0
  103. package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +128 -0
  104. package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +127 -0
  105. package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +101 -0
  106. package/src/runtime/agent/orchestrator/session/explicit-skills.mjs +83 -5
  107. package/src/runtime/agent/orchestrator/session/imported-message.mjs +11 -0
  108. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +2 -1
  109. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +1 -1
  110. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/continuation.mjs +1 -1
  111. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/diagnostic.mjs +1 -7
  112. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/refusal.mjs +1 -1
  113. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +3 -2
  114. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +5 -3
  115. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +7 -4
  116. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +21 -10
  117. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -0
  118. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +3 -0
  119. package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +12 -3
  120. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +15 -3
  121. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +22 -12
  122. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +9 -2
  123. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +9 -3
  124. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +5 -2
  125. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +37 -16
  126. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +4 -0
  127. package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +17 -4
  128. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +90 -0
  129. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +22 -12
  130. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +32 -3
  131. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +27 -0
  132. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +16 -1
  133. package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +1 -0
  134. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +2 -0
  135. package/src/runtime/agent/orchestrator/session/manager.mjs +0 -1
  136. package/src/runtime/agent/orchestrator/session/message-ids.mjs +123 -0
  137. package/src/runtime/agent/orchestrator/session/message-ids.test-support.mjs +29 -0
  138. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +33 -22
  139. package/src/runtime/agent/orchestrator/session/store/listing.mjs +6 -2
  140. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +3 -0
  141. package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +6 -0
  142. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +10 -3
  143. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +11 -0
  144. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +817 -0
  145. package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +36 -0
  146. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +23 -12
  147. package/src/runtime/agent/orchestrator/session/store-summary-reader-catalog-fixture.mjs +158 -0
  148. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +202 -374
  149. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +20 -3
  150. package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +3 -1
  151. package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +1 -1
  152. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +48 -9
  153. package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +161 -0
  154. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/invocation-plan.mjs +17 -1
  155. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -0
  156. package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +52 -2
  157. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +32 -22
  158. package/src/runtime/agent/orchestrator/tools/builtin/git-repo-rw-lock.mjs +10 -3
  159. package/src/runtime/agent/orchestrator/tools/builtin/lib/list-helpers.mjs +2 -2
  160. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +6 -6
  161. package/src/runtime/agent/orchestrator/tools/builtin/read-cache-policy.mjs +8 -0
  162. package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +203 -33
  163. package/src/runtime/agent/orchestrator/tools/builtin/read-single-fast-paths.mjs +32 -35
  164. package/src/runtime/agent/orchestrator/tools/builtin/read-single-guards.mjs +8 -4
  165. package/src/runtime/agent/orchestrator/tools/builtin/read-single-render.mjs +11 -12
  166. package/src/runtime/agent/orchestrator/tools/builtin/read-single-stream.mjs +9 -6
  167. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +83 -68
  168. package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +8 -3
  169. package/src/runtime/agent/orchestrator/tools/builtin/read-source-windows.mjs +20 -3
  170. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +16 -7
  171. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +2 -1
  172. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-publication.mjs +137 -0
  173. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +11 -10
  174. package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +21 -11
  175. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +12 -1
  176. package/src/runtime/agent/orchestrator/tools/builtin/search-glob-tool.mjs +13 -10
  177. package/src/runtime/agent/orchestrator/tools/builtin/search-grep-tool.mjs +1 -1
  178. package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +17 -12
  179. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +56 -13
  180. package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +58 -0
  181. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/root-resolution.mjs +2 -2
  182. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +1 -1
  183. package/src/runtime/agent/orchestrator/tools/code-graph/trusted-roots.mjs +25 -1
  184. package/src/runtime/agent/orchestrator/tools/patch/apply-patch/codex-batch.mjs +4 -4
  185. package/src/runtime/agent/orchestrator/tools/patch/apply-patch/route.mjs +2 -2
  186. package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +1 -1
  187. package/src/runtime/agent/orchestrator/tools/patch/read-redirects.mjs +34 -30
  188. package/src/runtime/agent/orchestrator/tools/patch/sequence/units.mjs +7 -7
  189. package/src/runtime/agent/orchestrator/tools/patch/sequence.mjs +1 -1
  190. package/src/runtime/agent/orchestrator/tools/patch/ui-diff.mjs +78 -5
  191. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +2 -0
  192. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +4 -0
  193. package/src/runtime/attachments/store.d.mts +3 -0
  194. package/src/runtime/attachments/store.mjs +38 -0
  195. package/src/runtime/channels/lib/owned-runtime/owned-start.mjs +1 -1
  196. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +16 -4
  197. package/src/runtime/channels/lib/worker-main.mjs +17 -14
  198. package/src/runtime/computer-bridge/linux-readiness.mjs +0 -2
  199. package/src/runtime/effort-judge/judge-client.mjs +56 -18
  200. package/src/runtime/memory/lib/memory.mjs +1 -1
  201. package/src/runtime/memory/lib/session-ingest.mjs +2 -2
  202. package/src/runtime/shared/atomic-file.mjs +33 -6
  203. package/src/runtime/shared/best-effort-stderr.mjs +8 -0
  204. package/src/runtime/shared/code-graph-state.mjs +12 -0
  205. package/src/runtime/shared/defaults-separation.mjs +2 -0
  206. package/src/runtime/shared/extension-scopes.mjs +5 -3
  207. package/src/runtime/shared/file-lock.mjs +37 -11
  208. package/src/runtime/shared/git-runner-worker.mjs +3 -2
  209. package/src/runtime/shared/git-runner.mjs +4 -3
  210. package/src/runtime/shared/llm/anthropic-effort.mjs +14 -0
  211. package/src/runtime/shared/llm/default-context-window.mjs +6 -0
  212. package/src/runtime/shared/llm/model-catalog-projection.mjs +5 -4
  213. package/src/runtime/shared/llm/model-catalog.mjs +240 -130
  214. package/src/runtime/shared/llm/provider-catalog-cache.mjs +36 -28
  215. package/src/runtime/shared/llm/provider-catalog-registry.mjs +162 -0
  216. package/src/runtime/shared/llm/provider-seed-rosters.mjs +130 -0
  217. package/src/runtime/shared/model-proxy-mode.d.mts +3 -0
  218. package/src/runtime/shared/model-proxy-mode.mjs +19 -0
  219. package/src/runtime/shared/plugin-manifest.mjs +18 -9
  220. package/src/runtime/shared/pristine-execution-contract.json +9 -2
  221. package/src/runtime/shared/pristine-execution.mjs +28 -4
  222. package/src/runtime/shared/provider-accounts.mjs +125 -21
  223. package/src/runtime/shared/provider-api-key.mjs +33 -1
  224. package/src/runtime/shared/schedule-model-ref.mjs +11 -2
  225. package/src/runtime/shared/session-usage-totals.mjs +19 -0
  226. package/src/runtime/shared/sharp-electron-linux.mjs +25 -0
  227. package/src/runtime/shared/shell-display.mjs +9 -3
  228. package/src/runtime/shared/singleton-owner.mjs +36 -6
  229. package/src/runtime/shared/skill-mentions.d.mts +10 -0
  230. package/src/runtime/shared/skill-mentions.mjs +133 -0
  231. package/src/runtime/shared/skill-script-runtime.mjs +264 -0
  232. package/src/runtime/shared/statusline/statusline-segments.mjs +68 -14
  233. package/src/runtime/shared/tool-primitives.mjs +35 -2
  234. package/src/runtime/shared/tool-surface.mjs +7 -0
  235. package/src/runtime/shared/tool-work-units.mjs +14 -0
  236. package/src/runtime/shared/transcript-metadata.mjs +17 -1
  237. package/src/runtime/shared/turn-changes.mjs +791 -0
  238. package/src/runtime/shared/turn-snapshot-store.mjs +346 -12
  239. package/src/runtime/shared/turn-snapshot.mjs +690 -81
  240. package/src/runtime/shared/turn-worktree-snapshot.mjs +185 -15
  241. package/src/runtime/shared/worker-requests.mjs +15 -2
  242. package/src/runtime/shared/worktrees/cache-cleanups.mjs +52 -0
  243. package/src/runtime/shared/worktrees/contract.mjs +551 -0
  244. package/src/runtime/shared/worktrees/disk.mjs +57 -0
  245. package/src/runtime/shared/worktrees/git.mjs +247 -0
  246. package/src/runtime/shared/worktrees/include.mjs +480 -0
  247. package/src/runtime/shared/worktrees/lock.mjs +46 -0
  248. package/src/runtime/shared/worktrees/maintenance.mjs +96 -0
  249. package/src/runtime/shared/worktrees/manager.mjs +1215 -0
  250. package/src/runtime/shared/worktrees/merge.mjs +182 -0
  251. package/src/runtime/shared/worktrees/owner.mjs +46 -0
  252. package/src/runtime/shared/worktrees/paths.mjs +62 -0
  253. package/src/runtime/shared/worktrees/registry.mjs +110 -0
  254. package/src/runtime/shared/worktrees/settings.mjs +84 -0
  255. package/src/runtime/shared/worktrees/slug.mjs +62 -0
  256. package/src/runtime/shared/worktrees/test-support.mjs +96 -0
  257. package/src/runtime/visualize-bridge/client.mjs +181 -0
  258. package/src/runtime/visualize-bridge/tool-defs.mjs +97 -0
  259. package/src/session-runtime/automation-agents.mjs +8 -2
  260. package/src/session-runtime/boot/apis.mjs +90 -0
  261. package/src/session-runtime/boot/config.mjs +7 -2
  262. package/src/session-runtime/boot/facade.mjs +21 -0
  263. package/src/session-runtime/boot/infrastructure.mjs +30 -18
  264. package/src/session-runtime/boot/session.mjs +1 -0
  265. package/src/session-runtime/boot/tools.mjs +4 -0
  266. package/src/session-runtime/config-lifecycle.mjs +10 -1
  267. package/src/session-runtime/conversation-import/discovery.mjs +698 -0
  268. package/src/session-runtime/conversation-import/service.mjs +369 -0
  269. package/src/session-runtime/cwd-plugins/cwd-apply.mjs +21 -6
  270. package/src/session-runtime/cwd-plugins/plugin-status.mjs +47 -42
  271. package/src/session-runtime/global-extensions.mjs +2 -2
  272. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +27 -2
  273. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +32 -1
  274. package/src/session-runtime/internal-tool-executor.mjs +9 -1
  275. package/src/session-runtime/lifecycle/session-catalog.mjs +8 -1
  276. package/src/session-runtime/lifecycle/session-switch/context-switch.mjs +5 -0
  277. package/src/session-runtime/lifecycle/session-switch/resume.mjs +21 -3
  278. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +16 -0
  279. package/src/session-runtime/mcp-glue/connect.mjs +68 -16
  280. package/src/session-runtime/mcp-glue/plugin-servers.mjs +499 -0
  281. package/src/session-runtime/mcp-glue/server-catalog.mjs +122 -33
  282. package/src/session-runtime/mcp-glue/server-input.mjs +29 -0
  283. package/src/session-runtime/mcp-glue.mjs +22 -2
  284. package/src/session-runtime/model-route/route-persist.mjs +3 -0
  285. package/src/session-runtime/model-route/set-route.mjs +15 -2
  286. package/src/session-runtime/new-session-config.mjs +3 -2
  287. package/src/session-runtime/notification-bus.mjs +18 -3
  288. package/src/session-runtime/provider-auth/accounts.mjs +33 -15
  289. package/src/session-runtime/provider-models/row-hydration.mjs +2 -0
  290. package/src/session-runtime/provider-models/web-search-catalog.mjs +5 -1
  291. package/src/session-runtime/provider-readiness.mjs +16 -10
  292. package/src/session-runtime/resource-extension-sync.mjs +45 -7
  293. package/src/session-runtime/resource-mcp-api.mjs +121 -84
  294. package/src/session-runtime/resource-plugins-api.mjs +29 -41
  295. package/src/session-runtime/resource-scope-decorate.mjs +6 -8
  296. package/src/session-runtime/resource-skills-api.mjs +23 -2
  297. package/src/session-runtime/route-resolution.mjs +10 -1
  298. package/src/session-runtime/route-state.mjs +16 -2
  299. package/src/session-runtime/runtime-core.mjs +5 -0
  300. package/src/session-runtime/runtime-facade.mjs +8 -0
  301. package/src/session-runtime/runtime-review-api.mjs +9 -0
  302. package/src/session-runtime/schedule-session-run.mjs +1 -1
  303. package/src/session-runtime/services/agent-tool/helpers.mjs +5 -0
  304. package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +3 -0
  305. package/src/session-runtime/services/agent-tool/job-views/job-lookup.mjs +1 -0
  306. package/src/session-runtime/services/agent-tool/job-views/spawn-meta.mjs +1 -0
  307. package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +15 -0
  308. package/src/session-runtime/services/agent-tool/send-flow.mjs +1 -0
  309. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +10 -2
  310. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +19 -7
  311. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +3 -0
  312. package/src/session-runtime/services/agent-tool/tag-registry.mjs +2 -1
  313. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +5 -0
  314. package/src/session-runtime/services/agent-tool/worker-rows.mjs +1 -0
  315. package/src/session-runtime/services/agent-tool.mjs +1 -0
  316. package/src/session-runtime/services/channel-session-router.mjs +4 -1
  317. package/src/session-runtime/services/daemon-candidate.mjs +3 -2
  318. package/src/session-runtime/services/daemon-crash-capture/spawn-capture.mjs +55 -0
  319. package/src/session-runtime/services/hook-bus/command-handler.mjs +4 -1
  320. package/src/session-runtime/services/hook-bus/handlers.mjs +7 -3
  321. package/src/session-runtime/services/provider-admin.mjs +64 -18
  322. package/src/session-runtime/services/usage-dashboard-model.mjs +3 -0
  323. package/src/session-runtime/session-create/session-options.mjs +10 -1
  324. package/src/session-runtime/session-turn-api.mjs +1 -0
  325. package/src/session-runtime/settings-api.mjs +4 -2
  326. package/src/session-runtime/settings-builtin-tools-api.mjs +9 -2
  327. package/src/session-runtime/settings-worktree-api.mjs +17 -0
  328. package/src/session-runtime/setup-tool/executor.mjs +23 -5
  329. package/src/session-runtime/setup-tool/extended-actions.mjs +1 -0
  330. package/src/session-runtime/setup-tool/settings-contract.mjs +4 -1
  331. package/src/session-runtime/setup-tool/tool-defs.mjs +38 -4
  332. package/src/session-runtime/skills-api.mjs +7 -3
  333. package/src/session-runtime/turn/agent-ops.mjs +12 -1
  334. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +14 -3
  335. package/src/session-runtime/turn/turn-run/snapshot-tracker.mjs +20 -15
  336. package/src/session-runtime/turn/turn-run/turn-open.mjs +4 -5
  337. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +29 -1
  338. package/src/session-runtime/turn/turn-run/turn-settle.mjs +6 -1
  339. package/src/session-runtime/turn/turn-run.mjs +6 -7
  340. package/src/session-runtime/webhook-session-run.mjs +16 -4
  341. package/src/session-runtime/workflow-agents-api/agent-route.mjs +15 -3
  342. package/src/session-runtime/workspace/admission-gate.mjs +197 -0
  343. package/src/session-runtime/workspace/project-branches.mjs +136 -0
  344. package/src/session-runtime/workspace/transition-steps.mjs +364 -0
  345. package/src/session-runtime/workspace/transitions.mjs +651 -0
  346. package/src/session-runtime/workspace/workspace-state.mjs +112 -0
  347. package/src/skill-script-entry.mjs +36 -0
  348. package/src/standalone/channel-transport/http-routes.mjs +17 -0
  349. package/src/standalone/channel-transport.mjs +13 -1
  350. package/src/standalone/daemon-desktop-runtime.mjs +1 -0
  351. package/src/standalone/daemon-owner.mjs +372 -0
  352. package/src/standalone/daemon-stored-session-views.mjs +15 -4
  353. package/src/standalone/daemon.mjs +179 -8
  354. package/src/standalone/desktop-service-registry.mjs +20 -0
  355. package/src/standalone/local-session-runtime.mjs +11 -0
  356. package/src/standalone/session-client/attachment-calls.mjs +3 -1
  357. package/src/standalone/session-client/daemon-unavailable.mjs +62 -0
  358. package/src/standalone/session-client/lease-heartbeat.mjs +47 -0
  359. package/src/standalone/session-client.mjs +104 -13
  360. package/src/standalone/session-protocol.mjs +21 -0
  361. package/src/standalone/session-proxy.mjs +3 -0
  362. package/src/standalone/session-service/agent-tree/agent-child.mjs +4 -0
  363. package/src/standalone/session-service/agent-tree/agent-rehydrate.mjs +1 -0
  364. package/src/standalone/session-service/entries/lifecycle.mjs +6 -0
  365. package/src/standalone/session-service/projection/revisions.mjs +2 -0
  366. package/src/standalone/session-service/projection/transcript-window.mjs +149 -19
  367. package/src/standalone/session-service/projection/workspace.mjs +14 -0
  368. package/src/standalone/session-service/session-calls/session-action.mjs +17 -4
  369. package/src/standalone/session-transport/call-route.mjs +13 -0
  370. package/src/standalone/session-transport/client-registry/client-grace.mjs +45 -3
  371. package/src/standalone/session-transport/client-registry/registration-replays.mjs +1 -0
  372. package/src/standalone/session-transport/client-registry.mjs +20 -3
  373. package/src/standalone/session-transport/routes.mjs +79 -2
  374. package/src/standalone/session-transport/stack.mjs +2 -0
  375. package/src/standalone/session-transport.mjs +24 -1
  376. package/src/tui/App.jsx +9 -1
  377. package/src/tui/app/app-view/floating-panel.jsx +9 -1
  378. package/src/tui/app/app-view.jsx +6 -0
  379. package/src/tui/app/extension-pickers/plugins-pickers.mjs +35 -16
  380. package/src/tui/app/message-selector.mjs +2 -1
  381. package/src/tui/app/model-options.mjs +37 -5
  382. package/src/tui/app/model-picker/provider-models-list.mjs +2 -2
  383. package/src/tui/app/model-picker.mjs +4 -2
  384. package/src/tui/app/skill-mention-palette.mjs +88 -0
  385. package/src/tui/app/slash-palette.mjs +23 -7
  386. package/src/tui/app/transcript-row-estimate.mjs +11 -3
  387. package/src/tui/app/use-prompt-draft-flow.mjs +7 -2
  388. package/src/tui/app/use-prompt-state.mjs +5 -0
  389. package/src/tui/components/Message.jsx +22 -1
  390. package/src/tui/components/PromptInput.jsx +21 -3
  391. package/src/tui/components/SlashCommandPalette.jsx +12 -3
  392. package/src/tui/components/TranscriptItem.jsx +9 -1
  393. package/src/tui/components/prompt-input/key-handler.mjs +21 -8
  394. package/src/tui/components/user-message-skills.mjs +38 -0
  395. package/src/tui/dist/index.mjs +839 -207
  396. package/src/tui/index.jsx +10 -2
  397. package/src/tui/session/compaction-view.mjs +147 -0
  398. package/src/tui/session/context-state.mjs +6 -0
  399. package/src/tui/session/initial-state.mjs +3 -0
  400. package/src/tui/session/queue-helpers.mjs +7 -2
  401. package/src/tui/session/quota-resume.mjs +2 -1
  402. package/src/tui/session/session-api/commands.mjs +10 -2
  403. package/src/tui/session/session-api/controls.mjs +4 -0
  404. package/src/tui/session/session-api/extensions.mjs +4 -2
  405. package/src/tui/session/session-api/intake/rewind.mjs +2 -1
  406. package/src/tui/session/session-api/integrations.mjs +17 -0
  407. package/src/tui/session/session-api/lifecycle/dispose.mjs +6 -1
  408. package/src/tui/session/session-api/lifecycle/inheritance.mjs +2 -0
  409. package/src/tui/session/session-api/lifecycle/resume.mjs +3 -0
  410. package/src/tui/session/session-api/routes.mjs +10 -1
  411. package/src/tui/session/session-api/settings.mjs +9 -0
  412. package/src/tui/session/session-api/worktree.mjs +60 -0
  413. package/src/tui/session/session-api.mjs +2 -0
  414. package/src/tui/session/session-flow/auto-clear.mjs +31 -12
  415. package/src/tui/session/session-flow/drain.mjs +27 -3
  416. package/src/tui/session/session-flow/session-reset.mjs +4 -3
  417. package/src/tui/session/session-flow.mjs +2 -0
  418. package/src/tui/session/transcript-intake.mjs +14 -5
  419. package/src/tui/session/tui-steering-persist.mjs +25 -9
  420. package/src/tui/session/turn-stream.mjs +32 -4
  421. package/src/tui/session/turn-tool-cards.mjs +10 -2
  422. package/src/tui/session/turn.mjs +56 -10
  423. package/src/runtime/effort-judge/previous-human-request.mjs +0 -162
  424. package/src/runtime/effort-judge/verified-context-input.mjs +0 -10
@@ -0,0 +1,162 @@
1
+ // Where each mixdog provider's model metadata comes from. One table read by
2
+ // both lookup paths (async list enrichment and the sync lookup), so every
3
+ // provider resolves effort ladders, limits, capabilities and pricing in the
4
+ // same precedence order (see lookupModelMetadata in model-catalog.mjs).
5
+ //
6
+ // Fields:
7
+ // modelsDev models.dev provider id holding this provider's rows.
8
+ // sameEndpoint true when that models.dev entry describes the endpoint this
9
+ // provider actually calls; its effort ladders, limits and
10
+ // capabilities then apply. Otherwise it is only the same
11
+ // vendor (another endpoint/account plan): it prices the model
12
+ // and is a first guess for capabilities and the effort ladder
13
+ // the provider's own sources leave undeclared — never limits.
14
+ // relay sells other vendors' models; the serving vendor (read off
15
+ // the model id) is likewise a first guess for capabilities
16
+ // and the effort ladder, and prices a model with no own rates.
17
+ // rosterFiles live-roster cache files the provider's listModels persists.
18
+ // rosterLimitsAuthoritative
19
+ // live-roster limits beat catalog limits (the roster reflects
20
+ // the account/backend window); otherwise they only fill gaps.
21
+ // rosterLadderFinal
22
+ // a roster row's effort ladder is complete, empty included:
23
+ // no guessed ladder is added to a model the roster lists.
24
+ // seedRow offline seed row for a model id, applied after fetched data.
25
+ import { mimoSeedRow, museSeedRow } from './provider-seed-rosters.mjs';
26
+
27
+ function mimoSeedMetadata(model) {
28
+ const seed = mimoSeedRow(model);
29
+ return seed
30
+ ? {
31
+ contextWindow: seed.contextWindow,
32
+ outputTokens: seed.outputTokens,
33
+ supportsReasoning: seed.reasoning === true,
34
+ supportsVision: seed.vision === true,
35
+ }
36
+ : null;
37
+ }
38
+
39
+ const PROVIDER_CATALOGS = Object.freeze({
40
+ // api.openai.com — the endpoint models.dev `openai` describes.
41
+ openai: { modelsDev: 'openai', sameEndpoint: true },
42
+ // chatgpt.com/backend-api/codex: subscription backend, not the public API.
43
+ 'openai-oauth': {
44
+ modelsDev: 'openai',
45
+ sameEndpoint: false,
46
+ rosterFiles: ['openai-oauth-models.json'],
47
+ rosterLimitsAuthoritative: true,
48
+ },
49
+ // api.anthropic.com with a subscription token: account-scoped windows and
50
+ // effort surface differ from the public API SKU.
51
+ 'anthropic-oauth': {
52
+ modelsDev: 'anthropic',
53
+ sameEndpoint: false,
54
+ rosterFiles: ['anthropic-oauth-models.json'],
55
+ rosterLimitsAuthoritative: true,
56
+ },
57
+ // api.anthropic.com with an API key. Shares the OAuth roster file.
58
+ anthropic: { modelsDev: 'anthropic', sameEndpoint: true, rosterFiles: ['anthropic-oauth-models.json'] },
59
+ // generativelanguage.googleapis.com — the endpoint models.dev `google` describes.
60
+ gemini: { modelsDev: 'google', sameEndpoint: true, rosterFiles: ['gemini-models.json'] },
61
+ // cli-chat-proxy.grok.com, not api.x.ai.
62
+ 'grok-oauth': {
63
+ modelsDev: 'xai',
64
+ sameEndpoint: false,
65
+ rosterFiles: ['grok-oauth-models.json'],
66
+ rosterLimitsAuthoritative: true,
67
+ },
68
+ // api.meta.ai/v1 — the endpoint models.dev `meta` describes.
69
+ 'muse-code-oauth': {
70
+ modelsDev: 'meta',
71
+ sameEndpoint: true,
72
+ rosterFiles: ['muse-code-oauth-models.json'],
73
+ rosterLimitsAuthoritative: true,
74
+ seedRow: museSeedRow,
75
+ },
76
+ // token-plan-*.xiaomimimo.com subscription gateway, not the public API.
77
+ 'mimo-oauth': {
78
+ modelsDev: 'xiaomi',
79
+ sameEndpoint: false,
80
+ rosterFiles: ['mimo-oauth-models.json'],
81
+ rosterLimitsAuthoritative: true,
82
+ seedRow: mimoSeedMetadata,
83
+ },
84
+ // Relays: their own models.dev id (when published) is their own endpoint.
85
+ // Effort tiers live in the wire id; a row without levels has no effort
86
+ // surface (resolveAntigravityWireModel drops the effort).
87
+ 'antigravity-oauth': { relay: true, rosterFiles: ['antigravity-oauth-models.json'], rosterLadderFinal: true },
88
+ // api.commandcode.ai/provider/v1 relays other vendors' models.
89
+ 'command-code-oauth': {
90
+ relay: true,
91
+ rosterFiles: ['command-code-oauth-models.json'],
92
+ rosterLimitsAuthoritative: true,
93
+ },
94
+ 'cursor-oauth': { relay: true },
95
+ 'cursor-api': { relay: true },
96
+ 'opencode-go': { relay: true },
97
+ });
98
+
99
+ // Confirmed upstream catalog gaps, keyed provider → model. Each entry patches
100
+ // the mapped models.dev row; a live roster that declares the field still wins.
101
+ const VERIFIED_CORRECTIONS = Object.freeze({
102
+ 'muse-code-oauth': Object.freeze({
103
+ // models.dev `meta` stops this ladder at xhigh; the Muse OAuth endpoint
104
+ // accepts reasoning.effort "max" for the contributor tier as for 1.3.
105
+ 'muse-spark-1.3-contributor': Object.freeze({
106
+ reasoningOptions: Object.freeze([
107
+ Object.freeze({ type: 'effort', values: Object.freeze(['minimal', 'low', 'medium', 'high', 'xhigh', 'max']) }),
108
+ ]),
109
+ }),
110
+ }),
111
+ });
112
+
113
+ const key = (provider) =>
114
+ String(provider || '')
115
+ .trim()
116
+ .toLowerCase();
117
+
118
+ /** Registry entry with defaults; an unlisted provider is its own models.dev id and endpoint. */
119
+ export function providerCatalogEntry(provider) {
120
+ const p = key(provider);
121
+ if (!p) return null;
122
+ const entry = PROVIDER_CATALOGS[p] || {};
123
+ return {
124
+ provider: p,
125
+ modelsDev: entry.modelsDev || p,
126
+ sameEndpoint: entry.sameEndpoint !== false,
127
+ relay: entry.relay === true,
128
+ rosterFiles: entry.rosterFiles || [],
129
+ rosterLimitsAuthoritative: entry.rosterLimitsAuthoritative === true,
130
+ rosterLadderFinal: entry.rosterLadderFinal === true,
131
+ seedRow: entry.seedRow || null,
132
+ };
133
+ }
134
+
135
+ export function modelsDevProviderId(provider) {
136
+ return providerCatalogEntry(provider)?.modelsDev || null;
137
+ }
138
+
139
+ export function providerRosterFiles(provider) {
140
+ return providerCatalogEntry(provider)?.rosterFiles || [];
141
+ }
142
+
143
+ /** Providers owning a live-roster file; a provider reading another's file is skipped. */
144
+ export function rosterProviders() {
145
+ const seen = new Set();
146
+ const out = [];
147
+ for (const [provider, entry] of Object.entries(PROVIDER_CATALOGS)) {
148
+ const files = entry.rosterFiles || [];
149
+ if (!files.length || files.every((file) => seen.has(file))) continue;
150
+ for (const file of files) seen.add(file);
151
+ out.push(provider);
152
+ }
153
+ return out;
154
+ }
155
+
156
+ export function providerSeedRow(provider, model) {
157
+ return providerCatalogEntry(provider)?.seedRow?.(String(model || '')) || null;
158
+ }
159
+
160
+ export function providerMetadataCorrection(provider, model) {
161
+ return VERIFIED_CORRECTIONS[key(provider)]?.[String(model || '')] || null;
162
+ }
@@ -0,0 +1,130 @@
1
+ // Offline seed rosters for providers whose discovery endpoint lists bare ids.
2
+ // A seed is the cold-start fallback only: the metadata lookup applies it to
3
+ // fields nothing fetched (live roster, models.dev) supplied, and provider
4
+ // rows never let it override discovered data. Pure data, no provider imports,
5
+ // so the shared sync lookup and the provider transports read one copy.
6
+
7
+ // ── Muse Code (Meta Muse Spark) ─────────────────────────────────────────────
8
+ export const MUSE_DEFAULT_EFFORT_LEVELS = Object.freeze(['minimal', 'low', 'medium', 'high', 'xhigh']);
9
+ const MUSE_SIX_LEVELS = Object.freeze([...MUSE_DEFAULT_EFFORT_LEVELS, 'max']);
10
+ const MUSE_SPARK_CONTEXT = 1_048_576;
11
+ export const MUSE_SPARK_MAX_OUTPUT = 131_072;
12
+ const STANDARD_COST = { inputCostPerM: 1.25, outputCostPerM: 4.25, cacheReadCostPerM: 0.15, cacheWriteCostPerM: 0 };
13
+ const CONTRIBUTOR_COST = { inputCostPerM: 0.1, outputCostPerM: 0.2, cacheReadCostPerM: 0.002, cacheWriteCostPerM: 0 };
14
+
15
+ // Only the 1.3 revisions accept `max`.
16
+ const MUSE_SEEDS = Object.freeze({
17
+ 'muse-spark-1.1': { name: 'Muse Spark 1.1', levels: MUSE_DEFAULT_EFFORT_LEVELS, cost: STANDARD_COST },
18
+ 'muse-spark-1.2': { name: 'Muse Spark 1.2', levels: MUSE_DEFAULT_EFFORT_LEVELS, cost: STANDARD_COST },
19
+ 'muse-spark-1.2-contributor': {
20
+ name: 'Muse Spark 1.2 (C)',
21
+ levels: MUSE_DEFAULT_EFFORT_LEVELS,
22
+ cost: CONTRIBUTOR_COST,
23
+ },
24
+ 'muse-spark-1.3': { name: 'Muse Spark 1.3', levels: MUSE_SIX_LEVELS, cost: STANDARD_COST },
25
+ 'muse-spark-1.3-contributor': { name: 'Muse Spark 1.3 (C)', levels: MUSE_SIX_LEVELS, cost: CONTRIBUTOR_COST },
26
+ });
27
+ export const MUSE_SEED_IDS = Object.freeze(Object.keys(MUSE_SEEDS));
28
+
29
+ function museEffortRow(id, name, levels, cost) {
30
+ return {
31
+ id,
32
+ name,
33
+ provider: 'muse-code-oauth',
34
+ family: 'muse-spark',
35
+ contextWindow: MUSE_SPARK_CONTEXT,
36
+ outputTokens: MUSE_SPARK_MAX_OUTPUT,
37
+ supportsReasoning: true,
38
+ supportsVision: true,
39
+ supportsFunctionCalling: true,
40
+ reasoningLevels: [...levels],
41
+ reasoningOptions: [{ type: 'effort', values: [...levels] }],
42
+ ...cost,
43
+ };
44
+ }
45
+
46
+ // Revisioned Spark ids the seed does not list inherit the newest seeded
47
+ // revision of their tier (limits, vision, pricing) but take the five-level
48
+ // ladder: only reviewed seeds advertise `max`.
49
+ const SPARK_ID_RE = /^muse-spark-(\d+)\.(\d+)(?:\.(\d+))?(-contributor)?$/i;
50
+
51
+ function revisionOf(id) {
52
+ const m = SPARK_ID_RE.exec(id);
53
+ return m ? [Number(m[1]), Number(m[2]), Number(m[3] || 0)] : null;
54
+ }
55
+
56
+ function compareRevision(a, b) {
57
+ for (let i = 0; i < 3; i += 1) if (a[i] !== b[i]) return a[i] - b[i];
58
+ return 0;
59
+ }
60
+
61
+ function museLineageRow(id) {
62
+ const match = SPARK_ID_RE.exec(id);
63
+ if (!match) return null;
64
+ const contributor = Boolean(match[4]);
65
+ let template = null;
66
+ let templateRevision = null;
67
+ for (const seedId of MUSE_SEED_IDS) {
68
+ if (SPARK_ID_RE.exec(seedId)[4] ? !contributor : contributor) continue;
69
+ const candidate = revisionOf(seedId);
70
+ if (!templateRevision || compareRevision(candidate, templateRevision) > 0) {
71
+ template = seedId;
72
+ templateRevision = candidate;
73
+ }
74
+ }
75
+ if (!template) return null;
76
+ const revision =
77
+ match[3] && Number(match[3]) !== 0 ? `${match[1]}.${match[2]}.${match[3]}` : `${match[1]}.${match[2]}`;
78
+ return museEffortRow(
79
+ id,
80
+ `Muse Spark ${revision}${contributor ? ' (C)' : ''}`,
81
+ MUSE_DEFAULT_EFFORT_LEVELS,
82
+ MUSE_SEEDS[template].cost
83
+ );
84
+ }
85
+
86
+ /** Seed row for a seeded id, else the lineage row of a revisioned Spark id, else null. */
87
+ export function museSeedRow(id) {
88
+ const key = String(id || '');
89
+ const seed = MUSE_SEEDS[key];
90
+ if (seed) return museEffortRow(key, seed.name, seed.levels, seed.cost);
91
+ return museLineageRow(key);
92
+ }
93
+
94
+ // ── Xiaomi MiMo ─────────────────────────────────────────────────────────────
95
+ const MIMO_SEED_CONTEXT = 1_048_576;
96
+ const MIMO_SEED_OUTPUT = 131_072;
97
+ export const MIMO_SEED_MODELS = Object.freeze(
98
+ [
99
+ ['mimo-v2.6-pro', 'MiMo-V2.6-Pro', MIMO_SEED_CONTEXT],
100
+ ['mimo-v2.6-flash', 'MiMo-V2.6-Flash', MIMO_SEED_CONTEXT],
101
+ ['mimo-v2.6-pro-ultraspeed', 'MiMo-V2.6-Pro-Ultraspeed', MIMO_SEED_CONTEXT],
102
+ ['mimo-v2.5-pro', 'MiMo-V2.5-Pro', MIMO_SEED_CONTEXT],
103
+ ['mimo-v2.5', 'MiMo-V2.5', MIMO_SEED_CONTEXT],
104
+ ['mimo-v2-pro', 'MiMo-V2-Pro', MIMO_SEED_CONTEXT],
105
+ ['mimo-v2-omni', 'MiMo-V2-Omni', 262_144],
106
+ ].map(([id, display_name, context_window]) =>
107
+ Object.freeze({ id, display_name, context_window, max_output_tokens: MIMO_SEED_OUTPUT })
108
+ )
109
+ );
110
+
111
+ /** Exact seed id, else the longest seed whose id is a lineage prefix of the
112
+ * model (dated or suffixed variants of a seeded model). */
113
+ export function mimoSeedRow(model) {
114
+ const id = String(model || '').toLowerCase();
115
+ let seed = MIMO_SEED_MODELS.find((item) => item.id === id) || null;
116
+ if (!seed) {
117
+ for (const item of MIMO_SEED_MODELS) {
118
+ if (id.startsWith(`${item.id}-`) && (!seed || item.id.length > seed.id.length)) seed = item;
119
+ }
120
+ }
121
+ if (!seed) return null;
122
+ return {
123
+ id: String(model),
124
+ contextWindow: seed.context_window,
125
+ outputTokens: seed.max_output_tokens,
126
+ reasoning: true,
127
+ vision: true,
128
+ inputModalities: ['text', 'image'],
129
+ };
130
+ }
@@ -0,0 +1,3 @@
1
+ export const MODEL_PROXY_ENV: 'MIXDOG_MODEL_PROXY';
2
+ export function modelProxyClientMode(env?: Record<string, string | undefined>): boolean;
3
+ export function serverModelCredentialsDisabledError(what?: string): Error & { code: string };
@@ -0,0 +1,19 @@
1
+ // Remote (SSH) mode switch. With MIXDOG_MODEL_PROXY=client the daemon runs on
2
+ // a server that must never hold model credentials: every model call is
3
+ // executed by the connected desktop client on the user's PC and streamed back
4
+ // (providers/model-proxy-channel.mjs). Read per call so a test or host can
5
+ // flip the environment without reloading modules.
6
+ export const MODEL_PROXY_ENV = 'MIXDOG_MODEL_PROXY';
7
+
8
+ export function modelProxyClientMode(env = process.env) {
9
+ return env?.[MODEL_PROXY_ENV] === 'client';
10
+ }
11
+
12
+ /** The refusal every server-side credential refresh raises in this mode. */
13
+ export function serverModelCredentialsDisabledError(what = 'model credentials') {
14
+ const error = new Error(
15
+ `${what} are not available on this server: ${MODEL_PROXY_ENV}=client runs every model call on the client PC.`
16
+ );
17
+ error.code = 'MODEL_CREDENTIALS_DISABLED';
18
+ return error;
19
+ }
@@ -7,10 +7,19 @@
7
7
  import { isAbsolute, join, relative, resolve } from 'node:path';
8
8
  import { readJsonSafe } from './json-file.mjs';
9
9
 
10
- /** `.codex-plugin/plugin.json` wins over a root-level `plugin.json`; a plugin
11
- * without either is an empty manifest, never an error. */
10
+ /** Manifest files in precedence order: `.codex-plugin/plugin.json`, a
11
+ * root-level `plugin.json`, then Claude Code's `.claude-plugin/plugin.json`. */
12
+ export const PLUGIN_MANIFEST_FILES = ['.codex-plugin/plugin.json', 'plugin.json', '.claude-plugin/plugin.json'];
13
+
14
+ /** First readable manifest in `PLUGIN_MANIFEST_FILES` order; a plugin without
15
+ * any is an empty manifest, never an error. A Claude Code manifest's `skills`
16
+ * is a plugin-relative path (e.g. `./.claude/skills/`). */
12
17
  export function pluginManifest(root) {
13
- return readJsonSafe(join(root, '.codex-plugin', 'plugin.json')) || readJsonSafe(join(root, 'plugin.json')) || {};
18
+ for (const rel of PLUGIN_MANIFEST_FILES) {
19
+ const manifest = readJsonSafe(join(root, ...rel.split('/')));
20
+ if (manifest) return manifest;
21
+ }
22
+ return {};
14
23
  }
15
24
 
16
25
  /** Resolve a manifest-relative path, refusing absolute paths and anything
@@ -21,22 +30,22 @@ export function resolveContainedPluginPath(root, rel) {
21
30
  const base = resolve(root);
22
31
  const abs = resolve(base, trimmed);
23
32
  const relToBase = relative(base, abs);
24
- if (relToBase.startsWith('..') || isAbsolute(relToBase)) return null;
33
+ if (relToBase.split(/[\\/]/)[0] === '..' || isAbsolute(relToBase)) return null;
25
34
  return abs;
26
35
  }
27
36
 
28
- /** Skill roots a plugin contributes: the conventional `<root>/skills/` plus an
29
- * optional manifest `skills` path. Deduplicated, absolute, root-contained. */
37
+ /** Skill roots a plugin contributes: the conventional `<root>/skills/` plus the
38
+ * manifest `skills` field, a path or a list of paths. Deduplicated, absolute,
39
+ * root-contained. */
30
40
  export function pluginSkillsRoots(root) {
31
41
  const manifest = pluginManifest(root);
32
42
  const roots = new Set();
33
43
  const add = (rel) => {
44
+ if (typeof rel !== 'string' || !rel.trim()) return;
34
45
  const abs = resolveContainedPluginPath(root, rel);
35
46
  if (abs) roots.add(abs);
36
47
  };
37
48
  add('./skills/');
38
- if (typeof manifest.skills === 'string' && manifest.skills.trim()) {
39
- add(manifest.skills.trim());
40
- }
49
+ for (const rel of Array.isArray(manifest.skills) ? manifest.skills : [manifest.skills]) add(rel);
41
50
  return [...roots];
42
51
  }
@@ -66,11 +66,18 @@
66
66
  },
67
67
  "muse-code-oauth": {
68
68
  "credentialFile": "muse-code-oauth.json",
69
- "credentialPathEnv": "MUSE_CODE_OAUTH_CREDENTIALS_PATH"
69
+ "credentialPathEnv": "MUSE_CODE_OAUTH_CREDENTIALS_PATH",
70
+ "modelCatalogFile": "muse-code-oauth-models.json"
71
+ },
72
+ "command-code-oauth": {
73
+ "credentialFile": "command-code-oauth.json",
74
+ "credentialPathEnv": "COMMAND_CODE_OAUTH_CREDENTIALS_PATH",
75
+ "modelCatalogFile": "command-code-oauth-models.json"
70
76
  },
71
77
  "mimo-oauth": {
72
78
  "credentialFile": "mimo-oauth.json",
73
- "credentialPathEnv": "MIMO_OAUTH_CREDENTIALS_PATH"
79
+ "credentialPathEnv": "MIMO_OAUTH_CREDENTIALS_PATH",
80
+ "modelCatalogFile": "mimo-oauth-models.json"
74
81
  },
75
82
  "cursor-oauth": {
76
83
  "credentialFile": "cursor-oauth.json",
@@ -8,6 +8,12 @@ import { ACCOUNT_PROVIDERS, providerAccountPath, readProviderAccountPool } from
8
8
  import { AGENT_PROVIDER_ENV_ALIASES, getAgentApiKey } from './provider-api-key.mjs';
9
9
  import { platformEntryKey } from './native-asset.mjs';
10
10
  import { clean } from './clean.mjs';
11
+ import { MODEL_PROXY_ENV, modelProxyClientMode } from './model-proxy-mode.mjs';
12
+ import { installModelProxyChannel } from '../agent/orchestrator/providers/model-proxy-channel.mjs';
13
+ import {
14
+ ModelProxyBridgeChannel,
15
+ readModelProxyBridgeDiscovery,
16
+ } from '../agent/orchestrator/providers/model-proxy-bridge.mjs';
11
17
 
12
18
  const contractPath = fileURLToPath(new URL('./pristine-execution-contract.json', import.meta.url));
13
19
 
@@ -205,6 +211,12 @@ export function createPristineExecutionBoundary({
205
211
 
206
212
  const contract = PRISTINE_EXECUTION_CONTRACT;
207
213
  const hostEnv = { ...env };
214
+ // Remote (SSH) mode: this server holds no model credentials, so the child
215
+ // runtime's model calls go through the daemon's model proxy bridge. Its
216
+ // endpoint is read from the HOST runtime root, before it is retargeted
217
+ // below; a missing or stale one fails closed (never a local credential).
218
+ const proxyMode = modelProxyClientMode(hostEnv);
219
+ const bridgeEndpoint = proxyMode ? readModelProxyBridgeDiscovery(hostEnv.MIXDOG_RUNTIME_ROOT) : null;
208
220
  const originalEnv = new Map();
209
221
  const touchedKeys = new Set();
210
222
  const rememberEnv = (name) => {
@@ -227,6 +239,8 @@ export function createPristineExecutionBoundary({
227
239
  mkdirSync(runtimeRoot, { recursive: true, mode: 0o700 });
228
240
  let cleaned = false;
229
241
  let restoreAuthBindings = () => {};
242
+ let bridgeChannel = null;
243
+ let restoreModelProxyChannel = () => {};
230
244
  // rmSync backs off linearly (retryDelay × attempt), so 50 retries at 100ms
231
245
  // is a ≈128s budget per attempt. Callers whose result is already complete
232
246
  // (headless exec) pass a smaller budget and leave stragglers to the sweep.
@@ -238,6 +252,8 @@ export function createPristineExecutionBoundary({
238
252
  else env[name] = value;
239
253
  }
240
254
  restoreAuthBindings();
255
+ restoreModelProxyChannel();
256
+ bridgeChannel?.dispose('the headless run finished');
241
257
  const removal = { recursive: true, force: true, maxRetries: rootRemovalRetries, retryDelay: 100 };
242
258
  // Windows releases file handles (pg.log, sockets) a beat after the owning
243
259
  // process exits; rmSync retries absorb that EBUSY/EPERM window.
@@ -280,7 +296,7 @@ export function createPristineExecutionBoundary({
280
296
  const oauth = contract.oauthProviders[selectedProvider];
281
297
  const apiKeyEnv = contract.apiKeyProviders[selectedProvider];
282
298
  let selectedApiKey = null;
283
- if (apiKeyEnv) {
299
+ if (apiKeyEnv && !proxyMode) {
284
300
  // Resolve before scrubbing so the selected provider may use its standard,
285
301
  // MIXDOG_AGENT_*, alias, or one provider-scoped keychain account. No
286
302
  // general config loader or all-provider credential scan is involved.
@@ -311,7 +327,15 @@ export function createPristineExecutionBoundary({
311
327
 
312
328
  let authMode = 'provider-managed';
313
329
  let catalogCount = 0;
314
- if (oauth) {
330
+ if (proxyMode) {
331
+ // No API key, OAuth account or credential binding: the PC behind the
332
+ // daemon runs every call. The runtime root stays the pristine one, for
333
+ // the services this run owns; only model calls reach the daemon.
334
+ setEnv(MODEL_PROXY_ENV, 'client');
335
+ bridgeChannel = new ModelProxyBridgeChannel(bridgeEndpoint);
336
+ restoreModelProxyChannel = installModelProxyChannel(bridgeChannel);
337
+ authMode = 'model-proxy-bridge';
338
+ } else if (oauth) {
315
339
  // Sign-in writes the selected account of the host's provider-accounts
316
340
  // pool; the single legacy file remains for hosts that predate the pool.
317
341
  // An explicit credential path still overrides both. Read the pool from
@@ -340,8 +364,8 @@ export function createPristineExecutionBoundary({
340
364
  [selectedProvider]: sourceCredential,
341
365
  });
342
366
  authMode = 'in-process-host-oauth-binding';
343
- const sourceCatalog = join(sourceDataDir, oauth.modelCatalogFile);
344
- if (oauth.modelCatalogFile && existsSync(sourceCatalog)) {
367
+ const sourceCatalog = oauth.modelCatalogFile && join(sourceDataDir, oauth.modelCatalogFile);
368
+ if (sourceCatalog && existsSync(sourceCatalog)) {
345
369
  copyFileSync(sourceCatalog, join(dataDir, oauth.modelCatalogFile));
346
370
  catalogCount = 1;
347
371
  }