mixdog 1.4.1 → 1.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (630) hide show
  1. package/package.json +4 -3
  2. package/scripts/build-shipped-history.mjs +125 -33
  3. package/scripts/gate-local.mjs +220 -63
  4. package/scripts/graph-parity.mjs +8 -3
  5. package/scripts/lib/gate-scheduler.mjs +139 -32
  6. package/scripts/lib/gate-timing-reporter.mjs +16 -0
  7. package/scripts/lib/run-node-tests.mjs +71 -34
  8. package/scripts/lib/scoped-temp.mjs +1 -0
  9. package/scripts/lib/test-failure-records.mjs +14 -1
  10. package/scripts/lib/test-failure-summary.mjs +9 -4
  11. package/scripts/lib/test-spawn-ledger.mjs +43 -3
  12. package/scripts/post-release-check.mjs +26 -16
  13. package/scripts/pptx-kit-index.mjs +5 -6
  14. package/scripts/provider-pingpong-live.mjs +1 -1
  15. package/scripts/prune-embedding-runtime.mjs +3 -1
  16. package/scripts/release-paths.mjs +7 -1
  17. package/scripts/suite-health.mjs +110 -28
  18. package/scripts/test.mjs +9 -14
  19. package/src/agents/advisor/AGENT.md +4 -4
  20. package/src/agents/advisor/agent.json +1 -1
  21. package/src/agents/explore/AGENT.md +22 -0
  22. package/src/agents/explore/agent.json +6 -0
  23. package/src/cli.mjs +7 -0
  24. package/src/defaults/agents.json +7 -0
  25. package/src/defaults/shipped-history.json +38 -2
  26. package/src/defaults/skills/browser-use/SKILL.md +4 -1
  27. package/src/defaults/skills/code-tidy/SKILL.md +71 -102
  28. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +66 -114
  29. package/src/defaults/skills/code-tidy/references/cleanup-report.md +19 -35
  30. package/src/defaults/skills/code-tidy/references/dead-code.md +3 -9
  31. package/src/defaults/skills/code-tidy/references/test-suite-slop.md +16 -27
  32. package/src/defaults/skills/computer-use/SKILL.md +12 -2
  33. package/src/defaults/skills/setup/SKILL.md +2 -2
  34. package/src/defaults/skills/setup/references/actions.md +28 -9
  35. package/src/defaults/skills/setup/references/surfaces.md +5 -2
  36. package/src/defaults/skills/setup-guide/SKILL.md +11 -3
  37. package/src/defaults/skills/setup-guide/model-recommendations.json +13 -0
  38. package/src/defaults/skills/skill-creator/SKILL.md +85 -190
  39. package/src/defaults/skills/skill-creator/references/design.md +70 -162
  40. package/src/defaults/skills/skill-creator/references/evaluation.md +33 -92
  41. package/src/defaults/skills/test-suite/SKILL.md +194 -0
  42. package/src/defaults/skills/test-suite/references/case-management.md +51 -0
  43. package/src/defaults/skills/test-suite/references/flaky-policy.md +39 -0
  44. package/src/defaults/skills/test-suite/references/reliability.md +49 -0
  45. package/src/defaults/skills/test-suite/references/suite-design.md +78 -0
  46. package/src/defaults/skills/test-suite/scripts/inventory.mjs +335 -0
  47. package/src/defaults/skills/visualize/SKILL.md +6 -2
  48. package/src/lib/instruction-text.cjs +36 -0
  49. package/src/lib/rules-builder.cjs +40 -50
  50. package/src/orchestration/balanced.md +23 -0
  51. package/src/orchestration/focused.md +22 -0
  52. package/src/orchestration/none.md +5 -0
  53. package/src/orchestration/swarm.md +24 -0
  54. package/src/rules/agent-mode/AGENT_MODE.md +3 -1
  55. package/src/rules/agent-mode/MIXY.md +2 -2
  56. package/src/rules/lead/LEAD.md +3 -3
  57. package/src/rules/shared/20-research.md +3 -6
  58. package/src/rules/shared/40-editing.md +1 -0
  59. package/src/rules/shared/60-verification.md +10 -9
  60. package/src/rules/shared/70-delivery.md +4 -3
  61. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
  62. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +3 -3
  63. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -2
  64. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +132 -21
  65. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -9
  66. package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +2 -2
  67. package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
  68. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +67 -0
  69. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
  70. package/src/runtime/agent/orchestrator/config.mjs +12 -7
  71. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +7 -7
  72. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +9 -30
  73. package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
  74. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +124 -12
  75. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +204 -49
  76. package/src/runtime/agent/orchestrator/mcp/client-config.mjs +16 -7
  77. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +157 -57
  78. package/src/runtime/agent/orchestrator/mcp/client.mjs +54 -23
  79. package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +1 -1
  80. package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +8 -2
  81. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +83 -52
  82. package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +1 -1
  83. package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +14 -0
  84. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +43 -27
  85. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +43 -8
  86. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +30 -28
  87. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  88. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +31 -21
  89. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-stop.mjs +3 -3
  90. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +3 -1
  91. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -2
  92. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  93. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
  94. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +40 -0
  95. package/src/runtime/agent/orchestrator/providers/custom-provider-keys.mjs +34 -0
  96. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +3 -0
  97. package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +14 -7
  98. package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +3 -2
  99. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
  100. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -1
  101. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +2 -2
  102. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +48 -31
  103. package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +0 -18
  104. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +138 -6
  105. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +1 -1
  106. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +100 -33
  107. package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +1 -1
  108. package/src/runtime/agent/orchestrator/providers/oauth-secret-fields.fixtures.mjs +45 -0
  109. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +4 -6
  110. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2784 -2872
  111. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +5 -8
  112. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +26 -28
  113. package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +288 -300
  114. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +3 -1
  115. package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +1 -0
  116. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +1 -1
  117. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +3 -1
  118. package/src/runtime/agent/orchestrator/providers/registry.mjs +33 -2
  119. package/src/runtime/agent/orchestrator/providers/vertex-ai-auth.mjs +622 -0
  120. package/src/runtime/agent/orchestrator/providers/vertex-ai-maas.mjs +185 -0
  121. package/src/runtime/agent/orchestrator/providers/vertex-ai-models.mjs +445 -0
  122. package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +576 -0
  123. package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +10 -30
  124. package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +32 -0
  125. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +0 -11
  126. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +8 -0
  127. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +17 -3
  128. package/src/runtime/agent/orchestrator/runtime-core/goal-control.mjs +47 -27
  129. package/src/runtime/agent/orchestrator/runtime-core/goal-deadlines.mjs +141 -10
  130. package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +26 -63
  131. package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +28 -3
  132. package/src/runtime/agent/orchestrator/runtime-core/goal-runtime.mjs +36 -11
  133. package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +88 -56
  134. package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +4 -1
  135. package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +51 -32
  136. package/src/runtime/agent/orchestrator/runtime-core/goal-text.mjs +45 -145
  137. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +15 -98
  138. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +32 -99
  139. package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +23 -78
  140. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +69 -47
  141. package/src/runtime/agent/orchestrator/runtime-core/todo-list.mjs +367 -0
  142. package/src/runtime/agent/orchestrator/runtime-core/todo-tool-defs.mjs +47 -0
  143. package/src/runtime/agent/orchestrator/runtime-core/tool-availability.mjs +155 -0
  144. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +12 -0
  145. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +119 -35
  146. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +4 -1
  147. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +15 -6
  148. package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
  149. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +28 -22
  150. package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +30 -0
  151. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +30 -5
  152. package/src/runtime/agent/orchestrator/session/agent-room.mjs +171 -37
  153. package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +1 -1
  154. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +94 -10
  155. package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -2
  156. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +1 -1
  157. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -1
  158. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +3 -0
  159. package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +1 -1
  160. package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -12
  161. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +4 -4
  162. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +11 -6
  163. package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +6 -6
  164. package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +7 -3
  165. package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +11 -1
  166. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
  167. package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +1 -1
  168. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +37 -8
  169. package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +1 -1
  170. package/src/runtime/agent/orchestrator/session/image-strip-recovery.mjs +1 -1
  171. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +11 -1
  172. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +1 -1
  173. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +5 -3
  174. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +8 -1
  175. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/todo-check.mjs +196 -0
  176. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +116 -50
  177. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +8 -1
  178. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +1 -1
  179. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +1 -1
  180. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -1
  181. package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +5 -6
  182. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +27 -3
  183. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +18 -2
  184. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
  185. package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
  186. package/src/runtime/agent/orchestrator/session/loop/turn-report.mjs +35 -0
  187. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +1 -1
  188. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +103 -50
  189. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +9 -7
  190. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +21 -3
  191. package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +27 -11
  192. package/src/runtime/agent/orchestrator/session/manager/ask-turn-open.mjs +37 -34
  193. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +15 -0
  194. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +25 -15
  195. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +79 -24
  196. package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +3 -0
  197. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +12 -1
  198. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
  199. package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +6 -1
  200. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +9 -1
  201. package/src/runtime/agent/orchestrator/session/manager/pending-spool-path.mjs +2 -2
  202. package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +1 -1
  203. package/src/runtime/agent/orchestrator/session/manager/prompt-settings.mjs +598 -0
  204. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +20 -0
  205. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +22 -14
  206. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +2 -0
  207. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +12 -0
  208. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
  209. package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +1 -1
  210. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +56 -14
  211. package/src/runtime/agent/orchestrator/session/manager/session-lock.mjs +31 -0
  212. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +59 -20
  213. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +2 -0
  214. package/src/runtime/agent/orchestrator/session/manager/session-scratch-environment.mjs +70 -0
  215. package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +0 -3
  216. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +18 -4
  217. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +8 -9
  218. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +339 -88
  219. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +135 -11
  220. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +377 -104
  221. package/src/runtime/agent/orchestrator/session/manager/turn-durability.mjs +144 -0
  222. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +48 -30
  223. package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
  224. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +4 -0
  225. package/src/runtime/agent/orchestrator/session/manager.mjs +6 -0
  226. package/src/runtime/agent/orchestrator/session/mixy-name.mjs +12 -6
  227. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +8 -1
  228. package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +1 -1
  229. package/src/runtime/agent/orchestrator/session/save-session-worker.mjs +5 -1
  230. package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +1 -1
  231. package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +2 -2
  232. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +23 -2
  233. package/src/runtime/agent/orchestrator/session/store/sweep/sub-agent-retention.mjs +3 -3
  234. package/src/runtime/agent/orchestrator/session/store/transcript-durability.mjs +88 -0
  235. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +5 -0
  236. package/src/runtime/agent/orchestrator/session/store-summary-log.mjs +1 -1
  237. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +243 -38
  238. package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
  239. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +177 -8
  240. package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
  241. package/src/runtime/agent/orchestrator/session/store.mjs +5 -0
  242. package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +7 -1
  243. package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +9 -1
  244. package/src/runtime/agent/orchestrator/session/transcript-restore/agent-envelope.mjs +1 -1
  245. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +3 -1
  246. package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +2 -2
  247. package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -5
  248. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -1
  249. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
  250. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +21 -3
  251. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
  252. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/worktree-add-guard.mjs +77 -0
  253. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -1
  254. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +42 -28
  255. package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +30 -14
  256. package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +2 -2
  257. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
  258. package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +1 -1
  259. package/src/runtime/agent/orchestrator/tools/builtin/read-single-fast-paths.mjs +0 -1
  260. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +20 -15
  261. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +0 -10
  262. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +95 -20
  263. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
  264. package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -24
  265. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary/child-kill.mjs +4 -3
  266. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +1 -2
  267. package/src/runtime/agent/orchestrator/tools/code-graph/modes/calls.mjs +1 -1
  268. package/src/runtime/agent/orchestrator/tools/code-graph/modes/symbols.mjs +2 -2
  269. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +4 -5
  270. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +3 -4
  271. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4 -22
  272. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  273. package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +99 -2
  274. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +2 -0
  275. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +105 -15
  276. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +3 -1
  277. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +49 -15
  278. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +45 -27
  279. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +35 -11
  280. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +2 -0
  281. package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
  282. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -6
  283. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +0 -1
  284. package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
  285. package/src/runtime/attachments/attachment-reference.mjs +1 -1
  286. package/src/runtime/attachments/pdf-extract.mjs +1 -1
  287. package/src/runtime/attachments/store.d.mts +1 -0
  288. package/src/runtime/attachments/store.mjs +2 -2
  289. package/src/runtime/channels/lib/config-reload-watch.mjs +42 -0
  290. package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +29 -9
  291. package/src/runtime/channels/lib/scheduler.mjs +33 -0
  292. package/src/runtime/channels/lib/schedules-db.mjs +11 -4
  293. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +4 -1
  294. package/src/runtime/channels/lib/webhooks-db.mjs +9 -3
  295. package/src/runtime/channels/lib/whisper-port.mjs +19 -10
  296. package/src/runtime/channels/lib/whisper-server.mjs +22 -13
  297. package/src/runtime/channels/lib/worker-main.mjs +9 -31
  298. package/src/runtime/computer-bridge/linux-readiness.mjs +10 -14
  299. package/src/runtime/connectors/connector-accounts-mcp.mjs +372 -103
  300. package/src/runtime/connectors/gmail-app-password.mjs +4 -4
  301. package/src/runtime/connectors/google-mcp.mjs +1 -1
  302. package/src/runtime/effort-judge/judge-client.mjs +2 -2
  303. package/src/runtime/effort-judge/judge-input.mjs +4 -4
  304. package/src/runtime/explore/explorer.mjs +88 -0
  305. package/src/runtime/explore/tool-defs.mjs +35 -0
  306. package/src/runtime/explore/tool.mjs +123 -0
  307. package/src/runtime/local-provider/hardware.mjs +1 -1
  308. package/src/runtime/media/adapters/codex-image.mjs +3 -3
  309. package/src/runtime/media/adapters/gemini-video.mjs +1 -1
  310. package/src/runtime/media/media-usage.mjs +1 -1
  311. package/src/runtime/media/store.mjs +1 -1
  312. package/src/runtime/memory/index.mjs +15 -1
  313. package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
  314. package/src/runtime/memory/lib/embedding-reindex.mjs +27 -0
  315. package/src/runtime/memory/lib/embedding-worker.mjs +4 -0
  316. package/src/runtime/memory/lib/memory-embed.mjs +83 -14
  317. package/src/runtime/memory/lib/memory-process-lock.mjs +159 -36
  318. package/src/runtime/memory/lib/memory-text-utils.mjs +6 -1
  319. package/src/runtime/memory/lib/memory.mjs +17 -0
  320. package/src/runtime/memory/lib/pg/process.mjs +1 -1
  321. package/src/runtime/memory/lib/pg/supervisor.mjs +16 -96
  322. package/src/runtime/memory/lib/recall-hybrid/hybrid-sql.mjs +12 -3
  323. package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
  324. package/src/runtime/office/authoring/pptx-author-action.mjs +1 -1
  325. package/src/runtime/office/authoring/xlsx-html-build.mjs +1 -1
  326. package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
  327. package/src/runtime/office/capabilities.mjs +1 -1
  328. package/src/runtime/office/core/office-core.mjs +1 -1
  329. package/src/runtime/office/design/content-model.mjs +3 -3
  330. package/src/runtime/office/design/docx/design-docx/section.mjs +6 -6
  331. package/src/runtime/office/design/xlsx/design-xlsx-components.mjs +1 -1
  332. package/src/runtime/office/design/xlsx/design-xlsx.mjs +1 -1
  333. package/src/runtime/office/pdf/ocr-engine.mjs +1 -1
  334. package/src/runtime/office/pdf/pdf-writer.mjs +4 -4
  335. package/src/runtime/office/portable/portable-docx-operations.mjs +2 -2
  336. package/src/runtime/office/portable/portable-soffice.mjs +8 -6
  337. package/src/runtime/office/portable/xlsx-contract.mjs +1 -1
  338. package/src/runtime/office/quality/assurance-structure-docx.mjs +1 -1
  339. package/src/runtime/shared/agent-route-config.mjs +17 -2
  340. package/src/runtime/shared/atomic-file.d.mts +8 -0
  341. package/src/runtime/shared/atomic-file.mjs +103 -2
  342. package/src/runtime/shared/background-tasks.mjs +37 -10
  343. package/src/runtime/shared/background-wait.mjs +66 -0
  344. package/src/runtime/shared/child-guardian.mjs +17 -7
  345. package/src/runtime/shared/config.mjs +313 -16
  346. package/src/runtime/shared/connector-accounts.mjs +5 -5
  347. package/src/runtime/shared/connector-catalog.d.mts +14 -8
  348. package/src/runtime/shared/connector-catalog.mjs +70 -52
  349. package/src/runtime/shared/custom-provider-keys.mjs +20 -0
  350. package/src/runtime/shared/file-has-data.mjs +26 -2
  351. package/src/runtime/shared/file-lock.mjs +21 -18
  352. package/src/runtime/shared/git-launch.d.mts +9 -0
  353. package/src/runtime/shared/git-launch.mjs +213 -0
  354. package/src/runtime/shared/git-runner-worker.mjs +2 -1
  355. package/src/runtime/shared/git-runner.mjs +7 -2
  356. package/src/runtime/shared/idle-gc.mjs +30 -7
  357. package/src/runtime/shared/llm/cost.mjs +6 -1
  358. package/src/runtime/shared/llm/http-agent.mjs +316 -29
  359. package/src/runtime/shared/llm/model-catalog-projection.mjs +3 -2
  360. package/src/runtime/shared/llm/model-catalog.mjs +46 -6
  361. package/src/runtime/shared/llm/provider-catalog-registry.mjs +3 -0
  362. package/src/runtime/shared/llm/system-proxy.mjs +453 -0
  363. package/src/runtime/shared/llm/usage-ledger-quota.mjs +31 -12
  364. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +84 -8
  365. package/src/runtime/shared/llm/usage-ledger.mjs +3 -0
  366. package/src/runtime/shared/llm/usage-rollup.mjs +48 -0
  367. package/src/runtime/shared/maintenance-schedule.mjs +109 -0
  368. package/src/runtime/shared/process-runner.mjs +8 -4
  369. package/src/runtime/shared/provider-accounts.mjs +52 -2
  370. package/src/runtime/shared/routine-trigger.d.mts +13 -0
  371. package/src/runtime/shared/routine-trigger.mjs +34 -0
  372. package/src/runtime/shared/run-child.d.mts +2 -1
  373. package/src/runtime/shared/run-child.mjs +70 -18
  374. package/src/runtime/shared/session-scratch.mjs +14 -2
  375. package/src/runtime/shared/shipped-definitions.mjs +7 -1
  376. package/src/runtime/shared/staged-install-worker.mjs +5 -0
  377. package/src/runtime/shared/staged-update.mjs +47 -2
  378. package/src/runtime/shared/tool-card-model.golden.json +3 -12
  379. package/src/runtime/shared/tool-execution-contract.mjs +2 -0
  380. package/src/runtime/shared/tool-surface.mjs +110 -36
  381. package/src/runtime/shared/tool-work-units.mjs +35 -6
  382. package/src/runtime/shared/turn-snapshot.mjs +26 -4
  383. package/src/runtime/shared/turn-worktree-snapshot.mjs +409 -54
  384. package/src/runtime/shared/worker-requests.mjs +17 -3
  385. package/src/runtime/shared/worktrees/activity-gate.mjs +215 -318
  386. package/src/runtime/shared/worktrees/activity-ledger-worker.mjs +56 -0
  387. package/src/runtime/shared/worktrees/activity-ledger.mjs +391 -0
  388. package/src/runtime/shared/worktrees/branch-management.mjs +5 -3
  389. package/src/runtime/shared/worktrees/contract.mjs +16 -6
  390. package/src/runtime/shared/worktrees/dependencies.mjs +127 -89
  391. package/src/runtime/shared/worktrees/disk.mjs +79 -2
  392. package/src/runtime/shared/worktrees/git.mjs +97 -7
  393. package/src/runtime/shared/worktrees/include.mjs +6 -4
  394. package/src/runtime/shared/worktrees/maintenance.mjs +422 -30
  395. package/src/runtime/shared/worktrees/manager.mjs +962 -197
  396. package/src/runtime/shared/worktrees/settings.mjs +33 -7
  397. package/src/runtime/shared/worktrees/test-support.mjs +5 -1
  398. package/src/runtime/shared/worktrees/worker-snapshots.mjs +82 -0
  399. package/src/runtime/tidy/install.mjs +95 -15
  400. package/src/runtime/tidy/languages.mjs +17 -15
  401. package/src/runtime/tidy/process.mjs +9 -5
  402. package/src/runtime/tidy/resolve.mjs +19 -16
  403. package/src/runtime/tidy/runners/biome.mjs +3 -3
  404. package/src/runtime/tidy/tool.mjs +1 -1
  405. package/src/runtime/tidy/worktree.mjs +10 -6
  406. package/src/runtime/visualize-bridge/client.mjs +4 -1
  407. package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
  408. package/src/runtime/web-search/index.mjs +4 -23
  409. package/src/runtime/web-search/lib/web-tools.mjs +2 -2
  410. package/src/runtime/web-search/tool-defs.mjs +17 -26
  411. package/src/session-runtime/agent-profile-changes.mjs +55 -4
  412. package/src/session-runtime/agent-task-sessions.mjs +410 -353
  413. package/src/session-runtime/boot/apis.mjs +27 -4
  414. package/src/session-runtime/boot/begin.mjs +2 -0
  415. package/src/session-runtime/boot/config.mjs +10 -1
  416. package/src/session-runtime/boot/facade.mjs +1 -0
  417. package/src/session-runtime/boot/providers.mjs +70 -3
  418. package/src/session-runtime/boot/session.mjs +2 -0
  419. package/src/session-runtime/boot/tools.mjs +71 -25
  420. package/src/session-runtime/bot-status.mjs +103 -103
  421. package/src/session-runtime/channel-config-api.mjs +1 -0
  422. package/src/session-runtime/config-change-effects.mjs +179 -0
  423. package/src/session-runtime/config-lifecycle/config-writers.mjs +1 -0
  424. package/src/session-runtime/config-lifecycle.mjs +160 -24
  425. package/src/session-runtime/connector-merge-migration.mjs +18 -15
  426. package/src/session-runtime/conversation-import/discovery.mjs +245 -47
  427. package/src/session-runtime/conversation-import/service.mjs +12 -5
  428. package/src/session-runtime/goal-facade-api.mjs +49 -3
  429. package/src/session-runtime/handoff-attachments.mjs +1 -1
  430. package/src/session-runtime/held-requests.mjs +3 -1
  431. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +3 -0
  432. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -2
  433. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +5 -11
  434. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
  435. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +161 -120
  436. package/src/session-runtime/internal-tool-executor.mjs +12 -19
  437. package/src/session-runtime/lifecycle/cold-heir.mjs +7 -0
  438. package/src/session-runtime/lifecycle/memory-ingest.mjs +3 -3
  439. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +53 -5
  440. package/src/session-runtime/lifecycle/session-switch.mjs +13 -2
  441. package/src/session-runtime/lifecycle/teardown/session-close.mjs +10 -5
  442. package/src/session-runtime/lifecycle/teardown.mjs +1 -1
  443. package/src/session-runtime/lifecycle-api.mjs +1 -0
  444. package/src/session-runtime/mcp-glue/server-catalog.mjs +27 -10
  445. package/src/session-runtime/mcp-glue/server-connection.mjs +34 -8
  446. package/src/session-runtime/mcp-glue/server-input.mjs +4 -1
  447. package/src/session-runtime/mixy-heartbeat.mjs +1 -1
  448. package/src/session-runtime/model-route/set-route.mjs +40 -7
  449. package/src/session-runtime/native-web-search/routes.mjs +3 -3
  450. package/src/session-runtime/provider-auth/login.mjs +2 -2
  451. package/src/session-runtime/provider-auth/refresh.mjs +6 -3
  452. package/src/session-runtime/provider-auth/setup.mjs +1 -1
  453. package/src/session-runtime/provider-readiness.mjs +53 -4
  454. package/src/session-runtime/resource-api.mjs +1 -1
  455. package/src/session-runtime/resource-extension-sync.mjs +4 -8
  456. package/src/session-runtime/resource-mcp-api.mjs +98 -35
  457. package/src/session-runtime/resource-mcp-connector-accounts.mjs +49 -32
  458. package/src/session-runtime/resource-mcp-secrets.mjs +27 -10
  459. package/src/session-runtime/resource-mcp-servers.mjs +5 -4
  460. package/src/session-runtime/resource-plugins-api.mjs +4 -0
  461. package/src/session-runtime/routine-executor.mjs +152 -0
  462. package/src/session-runtime/routine-home-turn.mjs +46 -5
  463. package/src/session-runtime/runtime-facade.mjs +5 -0
  464. package/src/session-runtime/runtime-feature-gates.mjs +2 -11
  465. package/src/session-runtime/schedule-session-run.mjs +1 -0
  466. package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +6 -1
  467. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +7 -0
  468. package/src/session-runtime/services/agent-tool/send-flow.mjs +120 -8
  469. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +12 -0
  470. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +5 -0
  471. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +8 -3
  472. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +28 -7
  473. package/src/session-runtime/services/agent-tool.mjs +51 -1
  474. package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
  475. package/src/session-runtime/services/channel-admin.mjs +18 -0
  476. package/src/session-runtime/services/channel-worker/daemon-spawn.mjs +2 -0
  477. package/src/session-runtime/services/daemon-candidate.mjs +4 -1
  478. package/src/session-runtime/services/hook-bus/command-handler.mjs +7 -11
  479. package/src/session-runtime/services/memory-runtime-proxy/daemon-spawn.mjs +4 -0
  480. package/src/session-runtime/services/plugin-admin.mjs +14 -6
  481. package/src/session-runtime/services/provider-admin.mjs +281 -10
  482. package/src/session-runtime/services/seeds.mjs +7 -0
  483. package/src/session-runtime/services/usage-stats-model.mjs +32 -11
  484. package/src/session-runtime/session-create/materialize.mjs +4 -2
  485. package/src/session-runtime/session-create/session-options.mjs +2 -0
  486. package/src/session-runtime/session-turn-api.mjs +2 -0
  487. package/src/session-runtime/settings-builtin-tools-api.mjs +5 -10
  488. package/src/session-runtime/settings-system-api.mjs +1 -1
  489. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +13 -3
  490. package/src/session-runtime/setup-tool/connector-widen-approval.mjs +96 -0
  491. package/src/session-runtime/setup-tool/executor.mjs +14 -3
  492. package/src/session-runtime/setup-tool/extended-actions.mjs +2 -0
  493. package/src/session-runtime/setup-tool/settings-contract.mjs +28 -0
  494. package/src/session-runtime/setup-tool/tool-defs.mjs +28 -2
  495. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +40 -43
  496. package/src/session-runtime/tool-policy/mode-switch.mjs +1 -1
  497. package/src/session-runtime/tool-policy/policy-stage.mjs +106 -8
  498. package/src/session-runtime/tool-policy/workflow-overlay.mjs +2 -1
  499. package/src/session-runtime/tool-policy-refresh.mjs +182 -5
  500. package/src/session-runtime/tool-surface.mjs +38 -1
  501. package/src/session-runtime/turn/agent-ops.mjs +33 -2
  502. package/src/session-runtime/turn/session-ops.mjs +2 -0
  503. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +5 -0
  504. package/src/session-runtime/turn/turn-run.mjs +1 -1
  505. package/src/session-runtime/webhook-session-run.mjs +2 -0
  506. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +46 -11
  507. package/src/session-runtime/workflow-agents-api/agent-route.mjs +2 -0
  508. package/src/session-runtime/workflow-agents-api/instruction-files.mjs +165 -0
  509. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +5 -4
  510. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +2 -3
  511. package/src/session-runtime/workflow-agents-api.mjs +2 -0
  512. package/src/session-runtime/workspace/activity-guards.mjs +176 -0
  513. package/src/session-runtime/workspace/project-branches.mjs +1 -1
  514. package/src/session-runtime/workspace/session-view.mjs +149 -0
  515. package/src/session-runtime/workspace/side-checkouts.mjs +203 -0
  516. package/src/session-runtime/workspace/transition-runner.mjs +188 -0
  517. package/src/session-runtime/workspace/transitions.mjs +128 -1070
  518. package/src/session-runtime/workspace/workspace-merge.mjs +132 -0
  519. package/src/session-runtime/workspace/worktree-intents.mjs +242 -0
  520. package/src/session-runtime/workspace/worktree-maintenance.mjs +200 -0
  521. package/src/session-runtime/workspace/worktree-setup.mjs +97 -0
  522. package/src/session-runtime/workspace/worktree-tool.mjs +70 -54
  523. package/src/standalone/daemon-agent-control.mjs +25 -8
  524. package/src/standalone/daemon-desktop-runtime.mjs +8 -2
  525. package/src/standalone/daemon-lag-profiler.mjs +7 -7
  526. package/src/standalone/daemon-session-control.mjs +151 -136
  527. package/src/standalone/daemon.mjs +61 -2
  528. package/src/standalone/desktop-service-registry.mjs +9 -0
  529. package/src/standalone/local-session-runtime.mjs +21 -1
  530. package/src/standalone/session-client/daemon-unavailable.mjs +4 -1
  531. package/src/standalone/session-client.mjs +5 -1
  532. package/src/standalone/session-frame-stream.mjs +83 -11
  533. package/src/standalone/session-protocol.mjs +15 -0
  534. package/src/standalone/session-service/agent-route-follow.mjs +23 -20
  535. package/src/standalone/session-service/agent-tree/agent-turns.mjs +18 -6
  536. package/src/standalone/session-service/agent-tree.mjs +45 -9
  537. package/src/standalone/session-service/projection/transcript-window.mjs +700 -64
  538. package/src/standalone/session-service/quota-resume.mjs +9 -0
  539. package/src/standalone/session-service/session-calls/session-action.mjs +51 -1
  540. package/src/standalone/session-service/session-calls/session-turns.mjs +37 -18
  541. package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
  542. package/src/standalone/session-service/session-calls/turn-gate.mjs +34 -0
  543. package/src/standalone/session-service/session-calls.mjs +2 -1
  544. package/src/standalone/session-service/stored-reader.mjs +127 -40
  545. package/src/tui/App.jsx +162 -164
  546. package/src/tui/app/app-view/floating-panel.jsx +3 -0
  547. package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
  548. package/src/tui/app/clipboard.mjs +22 -11
  549. package/src/tui/app/create-app-pickers.mjs +2 -0
  550. package/src/tui/app/doctor.mjs +2 -2
  551. package/src/tui/app/panel-signature.mjs +1 -1
  552. package/src/tui/app/prompt-handlers/use-prompt-history-nav.mjs +1 -1
  553. package/src/tui/app/prompt-handlers/use-prompt-interrupt.mjs +3 -0
  554. package/src/tui/app/prompt-submit/provider-prompts.mjs +3 -1
  555. package/src/tui/app/provider-setup/api-key-actions.mjs +31 -1
  556. package/src/tui/app/provider-setup/oauth-actions.mjs +25 -6
  557. package/src/tui/app/provider-setup-picker.mjs +20 -13
  558. package/src/tui/app/settings-picker.mjs +53 -8
  559. package/src/tui/app/shell-layout/row-budgets.mjs +14 -12
  560. package/src/tui/app/slash-commands.mjs +2 -1
  561. package/src/tui/app/slash-dispatch/route-commands.mjs +1 -1
  562. package/src/tui/app/slash-dispatch/session-commands.mjs +47 -1
  563. package/src/tui/app/slash-dispatch.mjs +1 -1
  564. package/src/tui/app/use-btw-panel.mjs +29 -0
  565. package/src/tui/app/use-context-panel-refresh.mjs +31 -0
  566. package/src/tui/app/use-model-catalog-cache.mjs +13 -10
  567. package/src/tui/app/use-mouse-input.mjs +11 -0
  568. package/src/tui/app/use-onboarding-start.mjs +8 -3
  569. package/src/tui/app/use-panel-transition.mjs +10 -1
  570. package/src/tui/app/use-pasted-buffers.mjs +28 -20
  571. package/src/tui/app/use-prompt-draft-flow.mjs +7 -0
  572. package/src/tui/app/use-prompt-layout-rows.mjs +3 -3
  573. package/src/tui/app/use-prompt-queue-history.mjs +5 -4
  574. package/src/tui/app/use-selection-focus.mjs +11 -2
  575. package/src/tui/app/use-selection-geometry.mjs +18 -9
  576. package/src/tui/app/use-selection-paint.mjs +4 -4
  577. package/src/tui/app/use-selection-stitch.mjs +3 -3
  578. package/src/tui/app/use-slash-palette.mjs +62 -0
  579. package/src/tui/app/use-terminal-chrome.mjs +2 -2
  580. package/src/tui/app/use-transcript-activity.mjs +48 -33
  581. package/src/tui/app/use-transcript-follow.mjs +12 -4
  582. package/src/tui/app/use-transcript-scroll.mjs +46 -17
  583. package/src/tui/app/use-transcript-swap-reset.mjs +27 -0
  584. package/src/tui/app/use-transcript-window/geometry.mjs +20 -6
  585. package/src/tui/app/use-transcript-window/instance-state.mjs +4 -0
  586. package/src/tui/app/use-transcript-window/selection-shift.mjs +5 -1
  587. package/src/tui/app/use-transcript-window.mjs +21 -11
  588. package/src/tui/app/use-tui-ready.mjs +18 -0
  589. package/src/tui/app/use-welcome-prompt-hint.mjs +5 -0
  590. package/src/tui/app/use-workflow-tab-cycle.mjs +5 -3
  591. package/src/tui/components/Picker.jsx +27 -3
  592. package/src/tui/components/SignInUrl.jsx +68 -0
  593. package/src/tui/components/TextEntryPanel.jsx +76 -46
  594. package/src/tui/components/prompt-input/escape-policy.d.mts +0 -1
  595. package/src/tui/components/prompt-input/escape-policy.mjs +1 -1
  596. package/src/tui/components/question-panel-model.mjs +4 -4
  597. package/src/tui/components/sign-in-url-layout.mjs +24 -0
  598. package/src/tui/components/tool-execution/standard-card.jsx +3 -4
  599. package/src/tui/components/user-message-skills.mjs +1 -1
  600. package/src/tui/dist/index.mjs +2205 -1371
  601. package/src/tui/markdown/render-ansi.mjs +1 -1
  602. package/src/tui/session/agent-job-feed/notification-router.mjs +10 -0
  603. package/src/tui/session/agent-job-feed.mjs +2 -0
  604. package/src/tui/session/context-state.mjs +3 -0
  605. package/src/tui/session/goal-turn-state.mjs +6 -2
  606. package/src/tui/session/quota-resume.mjs +1 -1
  607. package/src/tui/session/session-api/controls.mjs +4 -0
  608. package/src/tui/session/session-api/extensions.mjs +8 -0
  609. package/src/tui/session/session-api/intake/abort.mjs +2 -1
  610. package/src/tui/session/session-api/intake.mjs +2 -0
  611. package/src/tui/session/session-api/integrations.mjs +2 -2
  612. package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
  613. package/src/tui/session/session-api/lifecycle/session-reset.mjs +7 -0
  614. package/src/tui/session/session-api/routes-agent-definitions.mjs +6 -0
  615. package/src/tui/session/session-api/settings.mjs +2 -2
  616. package/src/tui/session/session-api/worktree.mjs +13 -1
  617. package/src/tui/session/session-flow/drain.mjs +11 -14
  618. package/src/tui/session/tool-card-results/grouped-result.mjs +2 -2
  619. package/src/tui/session/transcript-spill/spill-writer.mjs +15 -0
  620. package/src/tui/session/transcript-spill.mjs +92 -4
  621. package/src/tui/session/transcript-store.mjs +2 -0
  622. package/src/tui/session/turn-quiet.mjs +1 -1
  623. package/src/tui/session/turn.mjs +3 -0
  624. package/src/tui/session/worktree-setup-notice.mjs +1 -1
  625. package/src/tui/spinner-meta.mjs +3 -3
  626. package/src/tui/spinner-verbs.mjs +2 -2
  627. package/src/defaults/skills/goal-management/SKILL.md +0 -169
  628. package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
  629. package/src/runtime/agent/orchestrator/runtime-core/goal-tasks.mjs +0 -156
  630. package/src/session-runtime/goal-tasks.mjs +0 -1
@@ -0,0 +1,453 @@
1
+ /**
2
+ * The OS proxy for Mixdog's own network stack, which Node does not make follow
3
+ * it by itself, decided per origin.
4
+ *
5
+ * While a desktop app is attached (attachSystemProxyResolver, from the desktop
6
+ * service this daemon hosts), each origin is routed by Chromium's answer for
7
+ * it — PAC, WPAD, OS exceptions and DIRECT alike — asked once per origin,
8
+ * cached, and bounded: a lookup that fails or is slow goes DIRECT. Without one
9
+ * the fallback decision applies: the OS static proxy (the one Clash or Windows
10
+ * Settings writes) with its exact bypass rules, or DIRECT.
11
+ *
12
+ * A proxy that came from the OS is Mixdog's private state, never environment:
13
+ * no HTTPS_PROXY / HTTP_PROXY / NO_PROXY / NODE_USE_ENV_PROXY is written, so the
14
+ * shells, tools and CLIs Mixdog spawns do not inherit it. It is applied to the
15
+ * global fetch dispatcher (http-agent.mjs adoptPrivateProxy), and the fallback
16
+ * decision reaches Mixdog's own daemon and workers through one explicit
17
+ * handoff variable that the receiver reads and removes at startup. Proxy
18
+ * variables the user set keep their usual behaviour and win outright.
19
+ *
20
+ * Windows discovery reads the registry once at startup. The proxy is used only
21
+ * when the registry answer is exactly representable: a PAC script
22
+ * (AutoConfigURL), SOCKS-only entries and exceptions that have no exact rule
23
+ * leave routing untouched. "Automatically detect settings" (WPAD) is on by
24
+ * default in Windows and is not consulted: an enabled static proxy is used.
25
+ * Any read failure means no system proxy.
26
+ */
27
+
28
+ import { execFileSync } from 'node:child_process';
29
+ import { isIP } from 'node:net';
30
+ import { join } from 'node:path';
31
+ import { adoptPrivateProxy, isLocalHost, normalizeHost } from './http-agent.mjs';
32
+
33
+ const INTERNET_SETTINGS_KEY = 'HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings';
34
+ const USER_PROXY_VARS = [
35
+ 'HTTPS_PROXY',
36
+ 'https_proxy',
37
+ 'HTTP_PROXY',
38
+ 'http_proxy',
39
+ 'ALL_PROXY',
40
+ 'all_proxy',
41
+ 'NODE_USE_ENV_PROXY',
42
+ ];
43
+ /**
44
+ * The handoff to a Mixdog process this one starts: JSON `{ proxy, bypass }`,
45
+ * `proxy` null for "decided: direct". Consumed (and removed from the env) by
46
+ * adoptSystemProxy, so nothing downstream of that process ever sees it.
47
+ */
48
+ export const HANDOFF_VAR = 'MIXDOG_SYSTEM_PROXY_HANDOFF';
49
+ /** Must match SYSTEM_PROXY_REQUEST_EVENT in apps/desktop/src/main/system-proxy.ts. */
50
+ export const SYSTEM_PROXY_REQUEST_EVENT = 'system-proxy-request';
51
+ const RESOLVE_TIMEOUT_MS = 3_000;
52
+ const ROUTE_TTL_MS = 5 * 60_000;
53
+ // A failed lookup is asked again sooner, but not on every request of a burst.
54
+ const FAILED_ROUTE_TTL_MS = 30_000;
55
+ const DIRECT = Object.freeze({ proxy: null });
56
+
57
+ /** The fallback decision this process holds, or null when it made none. */
58
+ let active = null;
59
+ /** Installs this process's router; null when the user's variables or MIXDOG_SYSTEM_PROXY=0 decide. */
60
+ let installRouting = null;
61
+ let routingInstalled = false;
62
+ let log = (line) => process.stderr.write(`${line}\n`);
63
+ /** Attached resolvers, newest last; the newest answers. */
64
+ const resolvers = [];
65
+ /** origin → { route, expiresAt } */
66
+ const routes = new Map();
67
+ /** origin → the in-flight lookup */
68
+ const lookups = new Map();
69
+ let socksReported = false;
70
+ let failureReported = false;
71
+
72
+ /** The rows of `reg query <key>` output as a name → data map; null when the query failed. */
73
+ function queryRegistryKey(key) {
74
+ try {
75
+ const exe = join(process.env.SystemRoot || 'C:\\Windows', 'System32', 'reg.exe');
76
+ const out = execFileSync(exe, ['query', key], {
77
+ encoding: 'utf8',
78
+ stdio: ['ignore', 'pipe', 'ignore'],
79
+ timeout: 2000,
80
+ maxBuffer: 256 * 1024,
81
+ windowsHide: true,
82
+ });
83
+ const values = new Map();
84
+ for (const row of out.split(/\r?\n/)) {
85
+ // " Name REG_TYPE data" (data is absent for an empty string)
86
+ const match = row.match(/^ {4}(\S.*?) {4}(REG_[A-Z_]+)(?: {4}(.*))?$/);
87
+ if (match) values.set(match[1].toLowerCase(), (match[3] ?? '').trim());
88
+ }
89
+ return values;
90
+ } catch {
91
+ return null;
92
+ }
93
+ }
94
+
95
+ /**
96
+ * Raw registry values: `{ proxyEnable, proxyServer, proxyOverride, autoConfigUrl }`
97
+ * (strings as `reg query` prints them, null when absent), or null when the
98
+ * Internet Settings key cannot be read.
99
+ */
100
+ function readWindowsProxyRegistry() {
101
+ const settings = queryRegistryKey(INTERNET_SETTINGS_KEY);
102
+ if (!settings) return null;
103
+ return {
104
+ proxyEnable: settings.get('proxyenable') ?? null,
105
+ proxyServer: settings.get('proxyserver') ?? null,
106
+ proxyOverride: settings.get('proxyoverride') ?? null,
107
+ autoConfigUrl: settings.get('autoconfigurl') ?? null,
108
+ };
109
+ }
110
+
111
+ const PROXY_ADDRESS = /^(https?:\/\/)?((?:[a-z0-9_-]+\.)*[a-z0-9_-]+|\[[0-9a-f:]+\]):(\d{1,5})$/i;
112
+
113
+ function proxyUrl(address) {
114
+ const match = PROXY_ADDRESS.exec(address.trim());
115
+ if (!match || Number(match[3]) > 65535) return null;
116
+ return `${(match[1] ?? 'http://').toLowerCase()}${match[2]}:${match[3]}`;
117
+ }
118
+
119
+ /**
120
+ * `ProxyServer` is a bare `host:port` (every scheme) or `scheme=host:port;...`.
121
+ * Returns `{ https, http }` proxy URLs, or `{ reason }`. HTTPS is required:
122
+ * Mixdog's traffic is https, and an http-only entry does not say how it goes.
123
+ */
124
+ export function parseProxyServer(value) {
125
+ const text = String(value ?? '').trim();
126
+ if (!text) return { reason: 'no proxy server' };
127
+ if (!text.includes('=')) {
128
+ const url = proxyUrl(text);
129
+ return url ? { https: url, http: url } : { reason: 'unsupported proxy server' };
130
+ }
131
+ const entries = new Map();
132
+ for (const part of text.split(';')) {
133
+ if (!part.trim()) continue;
134
+ const eq = part.indexOf('=');
135
+ if (eq <= 0) return { reason: 'unsupported proxy server' };
136
+ entries.set(part.slice(0, eq).trim().toLowerCase(), part.slice(eq + 1).trim());
137
+ }
138
+ const https = entries.has('https') ? proxyUrl(entries.get('https')) : null;
139
+ const http = entries.has('http') ? proxyUrl(entries.get('http')) : null;
140
+ if (entries.has('https') && !https) return { reason: 'unsupported proxy server' };
141
+ if (entries.has('http') && !http) return { reason: 'unsupported proxy server' };
142
+ if (!https) return { reason: 'no HTTPS proxy (HTTP-only, SOCKS-only or other entries)' };
143
+ return { https, ...(http && { http }) };
144
+ }
145
+
146
+ function ipv4Wildcard(entry) {
147
+ const match = /^(\d{1,3}(?:\.\d{1,3}){0,2})\.\*$/.exec(entry);
148
+ if (!match) return null;
149
+ const octets = match[1].split('.').map(Number);
150
+ if (octets.some((octet) => octet > 255)) return null;
151
+ const pad = (fill) => [...octets, ...Array(4 - octets.length).fill(fill)].join('.');
152
+ return { start: pad(0), end: pad(255) };
153
+ }
154
+
155
+ /** The form a URL hostname takes for an IP literal (IPv6 compressed, no brackets). */
156
+ function canonicalIp(address, family) {
157
+ return new URL(`http://${family === 6 ? `[${address}]` : address}`).hostname.replace(/^\[(.*)\]$/, '$1');
158
+ }
159
+
160
+ /**
161
+ * `ProxyOverride` as bypass rules `{ hosts, suffixes }` (exact hosts and IP
162
+ * literals; `*.domain` as the bare domain, subdomains only), or null when any
163
+ * entry has no exact rule. `<local>` (dotless names) and IPv4 wildcards inside
164
+ * the loopback / private ranges need no rule: the dispatcher already connects
165
+ * to every local host directly (isLocalHost).
166
+ */
167
+ export function translateProxyOverride(value) {
168
+ const hosts = [];
169
+ const suffixes = [];
170
+ for (const raw of String(value ?? '').split(';')) {
171
+ const entry = raw.trim().toLowerCase();
172
+ if (!entry || entry === '<local>') continue;
173
+ const bare = entry.replace(/^\[(.*)\]$/, '$1');
174
+ const family = isIP(bare);
175
+ if (family) {
176
+ hosts.push(canonicalIp(bare, family));
177
+ continue;
178
+ }
179
+ const range = ipv4Wildcard(entry);
180
+ if (range) {
181
+ if (isLocalHost(range.start) && isLocalHost(range.end)) continue;
182
+ return null;
183
+ }
184
+ const wildcard = /^\*\.((?:[a-z0-9_-]+\.)*[a-z0-9_-]+)$/.exec(entry);
185
+ if (wildcard) suffixes.push(wildcard[1]);
186
+ else if (/^(?:[a-z0-9_-]+\.)*[a-z0-9_-]+$/.test(entry) && !/^[\d.]+$/.test(entry)) hosts.push(entry);
187
+ else return null;
188
+ }
189
+ return { hosts, suffixes };
190
+ }
191
+
192
+ /**
193
+ * The decision for registry `values`: `{ proxy, bypass }`, or `{ reason }` when
194
+ * the system proxy must not be used. `silent` marks reasons that are the
195
+ * user's plain "no proxy" rather than a proxy we declined.
196
+ */
197
+ export function systemProxyFromRegistry(values) {
198
+ if (!values) return { reason: 'registry unreadable', silent: true };
199
+ if (!/^(0x)?0*1$/i.test((values.proxyEnable ?? '').trim()) || !values.proxyServer) {
200
+ return { reason: 'disabled', silent: true };
201
+ }
202
+ if (values.autoConfigUrl) return { reason: 'a PAC script is configured' };
203
+ const server = parseProxyServer(values.proxyServer);
204
+ if (server.reason) return { reason: server.reason };
205
+ const bypass = translateProxyOverride(values.proxyOverride);
206
+ if (!bypass) return { reason: 'proxy exceptions cannot be translated exactly' };
207
+ return { proxy: { https: server.https, ...(server.http && { http: server.http }) }, bypass };
208
+ }
209
+
210
+ /**
211
+ * `value` when it is an http(s) proxy URL the dispatcher can be built from:
212
+ * parsable, with a host, and credentials that decode (the dispatcher decodes
213
+ * them and throws on a malformed escape). null otherwise.
214
+ */
215
+ function usableProxyUrl(value) {
216
+ try {
217
+ const { protocol, hostname, username, password } = new URL(value);
218
+ decodeURIComponent(username);
219
+ decodeURIComponent(password);
220
+ return (protocol === 'http:' || protocol === 'https:') && hostname ? value : null;
221
+ } catch {
222
+ return null;
223
+ }
224
+ }
225
+
226
+ function stringList(value) {
227
+ return Array.isArray(value) ? value.filter((item) => typeof item === 'string') : [];
228
+ }
229
+
230
+ /**
231
+ * A handoff value as a decision `{ proxy, bypass }`; null when there is none;
232
+ * `{ invalid: true }` when it is malformed (any proxy URL that does not fully
233
+ * validate included).
234
+ */
235
+ function parseHandoff(text) {
236
+ if (text === undefined) return null;
237
+ try {
238
+ const { proxy, bypass } = JSON.parse(text);
239
+ if (proxy === null) return { proxy: null };
240
+ const https = usableProxyUrl(proxy?.https);
241
+ const http = proxy.http === undefined ? null : usableProxyUrl(proxy.http);
242
+ if (!https || (proxy.http !== undefined && !http)) return { invalid: true };
243
+ return {
244
+ proxy: { https, ...(http && { http }) },
245
+ bypass: { hosts: stringList(bypass?.hosts), suffixes: stringList(bypass?.suffixes) },
246
+ };
247
+ } catch {
248
+ return { invalid: true };
249
+ }
250
+ }
251
+
252
+ function discover(reader, log) {
253
+ let found;
254
+ try {
255
+ found = systemProxyFromRegistry(reader());
256
+ } catch {
257
+ return { proxy: null };
258
+ }
259
+ if (!found.proxy) {
260
+ if (!found.silent) log(`[mixdog] system proxy not used: ${found.reason}`);
261
+ return { proxy: null };
262
+ }
263
+ return found;
264
+ }
265
+
266
+ /**
267
+ * Chromium's proxy answer for one URL, such as
268
+ * `PROXY 127.0.0.1:7890; SOCKS5 127.0.0.1:7891; DIRECT`, read in fallback
269
+ * order: the first HTTP(S) proxy wins and DIRECT ends the list. `{ proxy }`
270
+ * with a proxy URL or null; `socks` when only SOCKS entries were skipped
271
+ * (fetch here cannot use them, so that origin goes direct).
272
+ */
273
+ export function routeFromChromium(answer) {
274
+ let socks = false;
275
+ for (const entry of String(answer ?? '').split(';')) {
276
+ const [scheme = '', hostPort = ''] = entry.trim().split(/\s+/);
277
+ const kind = scheme.toUpperCase();
278
+ if (kind === 'DIRECT') break;
279
+ if (kind.startsWith('SOCKS')) {
280
+ socks = true;
281
+ continue;
282
+ }
283
+ const url =
284
+ (kind === 'PROXY' || kind === 'HTTPS') && proxyUrl(`${kind === 'HTTPS' ? 'https' : 'http'}://${hostPort}`);
285
+ if (url) return { proxy: url, socks: false };
286
+ }
287
+ return { proxy: null, socks };
288
+ }
289
+
290
+ /** The fallback decision's route for `origin`: its proxy for the scheme unless the host is excepted. */
291
+ function fallbackRoute(origin) {
292
+ const proxy = active?.proxy;
293
+ if (!proxy) return DIRECT;
294
+ const { protocol, hostname } = new URL(origin);
295
+ const host = normalizeHost(hostname);
296
+ const { hosts, suffixes } = active.bypass;
297
+ if (hosts.includes(host) || suffixes.some((suffix) => host.endsWith(`.${suffix}`))) return DIRECT;
298
+ return { proxy: (protocol === 'https:' ? proxy.https : proxy.http) ?? null };
299
+ }
300
+
301
+ function resetRoutes() {
302
+ routes.clear();
303
+ lookups.clear();
304
+ }
305
+
306
+ /** Logs never quote the answer, a URL or an error: any of them may carry credentials. */
307
+ function reportLookup(found) {
308
+ if (!found && !failureReported) {
309
+ failureReported = true;
310
+ log('[mixdog] system proxy lookup failed or timed out; connecting directly');
311
+ } else if (found?.socks && !found.proxy && !socksReported) {
312
+ socksReported = true;
313
+ log('[mixdog] system proxy is SOCKS only for a host; connecting to it directly');
314
+ }
315
+ }
316
+
317
+ function lookup(origin, entry) {
318
+ let timer;
319
+ const pending = Promise.race([
320
+ Promise.resolve()
321
+ .then(() => entry.resolve(origin))
322
+ .then(routeFromChromium),
323
+ new Promise((resolve) => {
324
+ timer = setTimeout(() => resolve(null), RESOLVE_TIMEOUT_MS);
325
+ timer.unref?.();
326
+ }),
327
+ ])
328
+ .catch(() => null)
329
+ .then((found) => {
330
+ clearTimeout(timer);
331
+ const route = found ? { proxy: found.proxy } : DIRECT;
332
+ // Not ours any more when the resolver changed meanwhile: not cached.
333
+ if (lookups.get(origin) === pending) {
334
+ lookups.delete(origin);
335
+ routes.set(origin, { route, expiresAt: Date.now() + (found ? ROUTE_TTL_MS : FAILED_ROUTE_TTL_MS) });
336
+ }
337
+ reportLookup(found);
338
+ return route;
339
+ });
340
+ lookups.set(origin, pending);
341
+ return pending;
342
+ }
343
+
344
+ /**
345
+ * The route for `origin` (`scheme://host[:port]`): `{ proxy }`, a proxy URL or
346
+ * null for DIRECT. From the attached resolver's cached answer, or a promise
347
+ * while it is asked (one lookup per origin at a time); from the fallback
348
+ * decision when none is attached.
349
+ */
350
+ export function systemProxyRoute(origin) {
351
+ const entry = resolvers.at(-1);
352
+ if (!entry) return fallbackRoute(origin);
353
+ const cached = routes.get(origin);
354
+ if (cached && cached.expiresAt > Date.now()) return cached.route;
355
+ return lookups.get(origin) ?? lookup(origin, entry);
356
+ }
357
+
358
+ function ensureRouting() {
359
+ if (routingInstalled) return true;
360
+ try {
361
+ installRouting();
362
+ } catch {
363
+ // The dispatcher is built before anything is installed, so nothing is half-applied.
364
+ log('[mixdog] system proxy not used: could not be applied');
365
+ active = { proxy: null };
366
+ installRouting = null;
367
+ return false;
368
+ }
369
+ routingInstalled = true;
370
+ return true;
371
+ }
372
+
373
+ /**
374
+ * Settle this process's fallback system-proxy decision and route its own fetch
375
+ * by it. A handoff from the launching Mixdog process (always removed from
376
+ * `env`) is the decision; without one, Windows reads the registry. Nothing
377
+ * happens, nothing is handed on and no resolver is ever used when the user set
378
+ * a proxy variable or MIXDOG_SYSTEM_PROXY=0 (which also disables discovery).
379
+ * Returns true when a proxy was applied.
380
+ */
381
+ export function adoptSystemProxy(
382
+ env = process.env,
383
+ {
384
+ platform = process.platform,
385
+ reader = readWindowsProxyRegistry,
386
+ log: logLine = (line) => process.stderr.write(`${line}\n`),
387
+ apply = adoptPrivateProxy,
388
+ } = {}
389
+ ) {
390
+ const handoff = parseHandoff(env[HANDOFF_VAR]);
391
+ delete env[HANDOFF_VAR];
392
+ active = null;
393
+ installRouting = null;
394
+ routingInstalled = false;
395
+ log = logLine;
396
+ resolvers.length = 0;
397
+ resetRoutes();
398
+ if (env.MIXDOG_SYSTEM_PROXY === '0' || USER_PROXY_VARS.some((name) => env[name] !== undefined)) return false;
399
+ installRouting = () => apply(systemProxyRoute);
400
+ if (handoff?.invalid) {
401
+ log('[mixdog] system proxy not used: invalid handoff');
402
+ active = { proxy: null };
403
+ return false;
404
+ }
405
+ active = handoff ?? (platform === 'win32' ? discover(reader, log) : null);
406
+ if (!active?.proxy) return false;
407
+ return ensureRouting();
408
+ }
409
+
410
+ /**
411
+ * Route this process by `resolve(origin)` — a promise of Chromium's proxy
412
+ * answer for that origin — until the returned detach is called. The newest
413
+ * attached resolver answers; every attach and detach drops the cached routes.
414
+ * A no-op when this process routes nothing (the user's variables or
415
+ * MIXDOG_SYSTEM_PROXY=0 decide).
416
+ */
417
+ export function attachSystemProxyResolver(resolve) {
418
+ if (!installRouting || !ensureRouting()) return () => {};
419
+ const entry = { resolve };
420
+ resolvers.push(entry);
421
+ failureReported = false;
422
+ resetRoutes();
423
+ return () => {
424
+ const index = resolvers.indexOf(entry);
425
+ if (index < 0) return;
426
+ resolvers.splice(index, 1);
427
+ resetRoutes();
428
+ };
429
+ }
430
+
431
+ /**
432
+ * npm's own proxy settings for the one Mixdog-owned npm spawn (the self-update
433
+ * install): the route of the registry npm uses (`registry()`, asked only when
434
+ * this process routes at all); empty for DIRECT or without a decision. Meant
435
+ * for that spawn's env only, never for the process env.
436
+ */
437
+ export async function systemProxyNpmEnv(registry) {
438
+ if (!installRouting) return {};
439
+ const { origin, hostname } = new URL(await registry());
440
+ if (isLocalHost(hostname)) return {};
441
+ const { proxy } = await systemProxyRoute(origin);
442
+ if (!proxy) return {};
443
+ return {
444
+ npm_config_proxy: proxy,
445
+ npm_config_https_proxy: proxy,
446
+ npm_config_noproxy: 'localhost,127.0.0.1,::1,.local',
447
+ };
448
+ }
449
+
450
+ /** The handoff for a Mixdog process this one starts; empty when no decision was made. */
451
+ export function systemProxyHandoffEnv() {
452
+ return active ? { [HANDOFF_VAR]: JSON.stringify(active) } : {};
453
+ }
@@ -13,7 +13,7 @@
13
13
  * is an estimate: providers do not publish what a request costs the meter.
14
14
  */
15
15
  import { normalizeUsageMeasurement } from './usage-measurement.mjs';
16
- import { usageRollupDayKey } from './usage-rollup.mjs';
16
+ import { FAST_KEY, fastRouteSql, sortFastBesideModel, usageRollupDayKey } from './usage-rollup.mjs';
17
17
  import { estimateOutsideQuota, estimateQuotaValue, outsideSpans } from './quota-value-estimate.mjs';
18
18
 
19
19
  export const QUOTA_SCHEMA = `
@@ -397,7 +397,8 @@ function readQuotaEvents(db, { provider, account, label = '', fromMs, toMs }) {
397
397
  const rows = db
398
398
  .prepare(`
399
399
  WITH routes AS (
400
- SELECT id,json_extract(signature,'$[1]') AS model,json_extract(signature,'$[7]') AS rank
400
+ SELECT id,json_extract(signature,'$[1]') AS model,json_extract(signature,'$[7]') AS rank,
401
+ ${fastRouteSql('signature')} AS fast
401
402
  FROM usage_routes
402
403
  WHERE json_extract(signature,'$[0]')=? AND COALESCE(json_extract(signature,'$[8]'),'') IN (?,?)
403
404
  )
@@ -405,10 +406,11 @@ function readQuotaEvents(db, { provider, account, label = '', fromMs, toMs }) {
405
406
  SUM(e.input) AS input,SUM(e.output) AS output,SUM(e.cache_read) AS cacheRead,
406
407
  SUM(e.cache_write) AS cacheWrite,SUM(e.cost_usd) AS costUsd,COUNT(e.cost_usd) AS priced,
407
408
  SUM(CASE WHEN e.duration_ms>0 AND e.output>0 THEN e.output ELSE 0 END) AS speedOutput,
408
- SUM(CASE WHEN e.duration_ms>0 AND e.output>0 THEN e.duration_ms ELSE 0 END) AS speedMs
409
+ SUM(CASE WHEN e.duration_ms>0 AND e.output>0 THEN e.duration_ms ELSE 0 END) AS speedMs,
410
+ r.fast
409
411
  FROM usage_events e JOIN routes r ON r.id=e.route
410
412
  WHERE e.ts>=? AND e.ts<=?
411
- GROUP BY e.ts,e.day,r.model,r.rank
413
+ GROUP BY e.ts,e.day,r.model,r.rank,r.fast
412
414
  ORDER BY e.ts`)
413
415
  .all(provider, account, unlabeled, fromMs, toMs);
414
416
  const best = new Map();
@@ -433,7 +435,8 @@ function readQuotaEvents(db, { provider, account, label = '', fromMs, toMs }) {
433
435
  });
434
436
  const event = {
435
437
  ts: row.ts,
436
- model: row.model,
438
+ // A model's Fast calls are keyed apart from its normal ones.
439
+ model: row.fast ? row.model + FAST_KEY : row.model,
437
440
  turns: row.turns,
438
441
  input: usage.input || 0,
439
442
  output: usage.output || 0,
@@ -686,7 +689,6 @@ function addUsage(target, event, share) {
686
689
  }
687
690
 
688
691
  const tokensOf = (usage) => usage.input + usage.output + usage.cacheRead + usage.cacheWrite;
689
- const byConsumption = (a, b) => b.consumed - a.consumed || b.tokens - a.tokens;
690
692
 
691
693
  /** Route-shaped totals, so the token table's cells render them unchanged. */
692
694
  function exportUsage(usage) {
@@ -708,6 +710,16 @@ function exportUsage(usage) {
708
710
  };
709
711
  }
710
712
 
713
+ /** What a Fast key stands for: `modelId` is the model itself, never the internal key. */
714
+ const modelIdentity = (key) => (key.endsWith(FAST_KEY) ? { fast: true, modelId: key.slice(0, -FAST_KEY.length) } : {});
715
+
716
+ /** A model row: its key is unique per mode. */
717
+ function exportModel(key, usage) {
718
+ return { model: key, ...modelIdentity(key), ...exportUsage(usage) };
719
+ }
720
+
721
+ const modelOfRow = (row) => row.modelId ?? row.model;
722
+
711
723
  function windowPeriod(listed, anchor) {
712
724
  if (!listed.length) return null;
713
725
  let index = listed.findIndex((instance) => instance.key === anchor);
@@ -750,7 +762,7 @@ function forecastFor(instance, points) {
750
762
  /** Each model's running share of its window, sampled at slot ends; the slot
751
763
  * running now is sampled at now, as far as it has run. */
752
764
  function modelSeries(slots, instances, keys, now) {
753
- const series = keys.map((key) => ({ key, points: [] }));
765
+ const series = keys.map((key) => ({ key, ...modelIdentity(key), points: [] }));
754
766
  const running = new Map();
755
767
  let owner;
756
768
  for (const slot of slots) {
@@ -933,7 +945,11 @@ export function readQuotaHistory(
933
945
  ? null
934
946
  : slots.reduce((sum, slot) => sum + slot.outsideCostUsd, 0);
935
947
 
936
- const exportedModels = [...models].map(([model, usage]) => ({ model, ...exportUsage(usage) })).sort(byConsumption);
948
+ const exportedModels = sortFastBesideModel(
949
+ [...models].map(([key, usage]) => exportModel(key, usage)),
950
+ modelOfRow,
951
+ ['consumed', 'tokens']
952
+ );
937
953
  const seriesKeys = exportedModels
938
954
  .filter((model) => model.consumed > 0)
939
955
  .slice(0, SERIES_LIMIT)
@@ -995,14 +1011,17 @@ export function readQuotaHistory(
995
1011
  : slot.outsideCostUsd,
996
1012
  slot.usage.costKnownTurns < slot.usage.turns
997
1013
  ),
998
- models: [...slot.models]
999
- .map(([model, usage]) => ({
1014
+ models: sortFastBesideModel(
1015
+ [...slot.models].map(([model, usage]) => ({
1000
1016
  model,
1017
+ ...modelIdentity(model),
1001
1018
  consumed: round(usage.consumed),
1002
1019
  tokens: tokensOf(usage),
1003
1020
  costUsd: round(usage.costUsd, 6),
1004
- }))
1005
- .sort(byConsumption),
1021
+ })),
1022
+ modelOfRow,
1023
+ ['consumed', 'tokens']
1024
+ ),
1006
1025
  })),
1007
1026
  modelSeries: modelSeries(slots, shown, seriesKeys, now),
1008
1027
  // A period over several windows marks where each of them peaked.