mixdog 1.4.0 → 1.4.2

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 (493) hide show
  1. package/package.json +3 -2
  2. package/scripts/build-shipped-history.mjs +115 -33
  3. package/scripts/check-voice-runtime-inputs.mjs +25 -0
  4. package/scripts/gate-local.mjs +183 -63
  5. package/scripts/latest-guard.mjs +21 -9
  6. package/scripts/lib/gate-scheduler.mjs +138 -32
  7. package/scripts/lib/gate-timing-reporter.mjs +16 -0
  8. package/scripts/lib/isolated-test-env.mjs +10 -5
  9. package/scripts/lib/run-node-tests.mjs +91 -66
  10. package/scripts/lib/scoped-temp.d.mts +16 -0
  11. package/scripts/lib/scoped-temp.mjs +124 -0
  12. package/scripts/lib/stale-temp.mjs +44 -0
  13. package/scripts/lib/test-failure-records.mjs +14 -1
  14. package/scripts/lib/test-failure-summary.mjs +16 -4
  15. package/scripts/lib/test-spawn-ledger.mjs +12 -3
  16. package/scripts/post-release-check.mjs +1 -6
  17. package/scripts/pptx-kit-index.mjs +17 -5
  18. package/scripts/suite-health.mjs +115 -24
  19. package/scripts/test-data-dir.mjs +10 -7
  20. package/scripts/test.mjs +9 -14
  21. package/src/agents/advisor/AGENT.md +4 -4
  22. package/src/agents/advisor/agent.json +1 -1
  23. package/src/agents/explore/AGENT.md +22 -0
  24. package/src/agents/explore/agent.json +6 -0
  25. package/src/app.mjs +4 -0
  26. package/src/cli.mjs +7 -0
  27. package/src/defaults/agents.json +7 -0
  28. package/src/defaults/shipped-history.json +23 -2
  29. package/src/defaults/skills/browser-use/SKILL.md +10 -5
  30. package/src/defaults/skills/code-tidy/SKILL.md +71 -102
  31. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +66 -114
  32. package/src/defaults/skills/code-tidy/references/cleanup-report.md +19 -35
  33. package/src/defaults/skills/code-tidy/references/dead-code.md +3 -9
  34. package/src/defaults/skills/code-tidy/references/test-suite-slop.md +16 -27
  35. package/src/defaults/skills/computer-use/SKILL.md +16 -4
  36. package/src/defaults/skills/goal-management/SKILL.md +1 -1
  37. package/src/defaults/skills/setup/references/actions.md +12 -6
  38. package/src/defaults/skills/setup/references/surfaces.md +2 -2
  39. package/src/defaults/skills/setup-guide/SKILL.md +5 -2
  40. package/src/defaults/skills/setup-guide/model-recommendations.json +13 -0
  41. package/src/defaults/skills/skill-creator/SKILL.md +85 -190
  42. package/src/defaults/skills/skill-creator/references/design.md +70 -162
  43. package/src/defaults/skills/skill-creator/references/evaluation.md +33 -92
  44. package/src/defaults/skills/test-suite/SKILL.md +194 -0
  45. package/src/defaults/skills/test-suite/references/case-management.md +51 -0
  46. package/src/defaults/skills/test-suite/references/flaky-policy.md +39 -0
  47. package/src/defaults/skills/test-suite/references/reliability.md +49 -0
  48. package/src/defaults/skills/test-suite/references/suite-design.md +78 -0
  49. package/src/defaults/skills/test-suite/scripts/inventory.mjs +335 -0
  50. package/src/defaults/skills/visualize/SKILL.md +6 -2
  51. package/src/lib/rules-builder.cjs +35 -42
  52. package/src/output-styles/common.md +2 -2
  53. package/src/output-styles/simple.md +1 -1
  54. package/src/rules/agent/AGENT.md +5 -4
  55. package/src/rules/lead/LEAD.md +12 -7
  56. package/src/rules/shared/10-tool-workflow.md +3 -1
  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/45-destructive.md +0 -2
  60. package/src/rules/shared/50-execution.md +2 -0
  61. package/src/rules/shared/60-verification.md +10 -9
  62. package/src/rules/shared/70-delivery.md +8 -9
  63. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
  64. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -1
  65. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +156 -24
  66. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -0
  67. package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
  68. package/src/runtime/agent/orchestrator/cache-break-trace.mjs +2 -0
  69. package/src/runtime/agent/orchestrator/config.mjs +12 -7
  70. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +8 -8
  71. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +5 -26
  72. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +3 -1
  73. package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
  74. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +122 -12
  75. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +5 -3
  76. package/src/runtime/agent/orchestrator/mcp/client-config.mjs +13 -2
  77. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +152 -58
  78. package/src/runtime/agent/orchestrator/mcp/client.mjs +51 -18
  79. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +88 -54
  80. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +42 -26
  81. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +54 -8
  82. package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +1 -1
  83. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +37 -31
  84. package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +8 -2
  85. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +6 -2
  86. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -2
  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-oauth-request/initial-status.mjs +3 -1
  90. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +14 -3
  91. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +6 -0
  92. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -2
  93. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +3 -1
  94. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -2
  95. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  96. package/src/runtime/agent/orchestrator/providers/command-code-oauth-login.mjs +1 -10
  97. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
  98. package/src/runtime/agent/orchestrator/providers/cursor.mjs +3 -0
  99. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +40 -0
  100. package/src/runtime/agent/orchestrator/providers/custom-provider-keys.mjs +34 -0
  101. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +3 -0
  102. package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +14 -7
  103. package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +3 -2
  104. package/src/runtime/agent/orchestrator/providers/devin.mjs +3 -0
  105. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
  106. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -1
  107. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +248 -41
  108. package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -11
  109. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +45 -6
  110. package/src/runtime/agent/orchestrator/providers/lib/first-output-window.mjs +58 -0
  111. package/src/runtime/agent/orchestrator/providers/lib/listen-on.mjs +14 -0
  112. package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +0 -18
  113. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +138 -6
  114. package/src/runtime/agent/orchestrator/providers/mimo-oauth-login.mjs +1 -10
  115. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +1 -1
  116. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +100 -33
  117. package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +1 -1
  118. package/src/runtime/agent/orchestrator/providers/oauth-secret-fields.fixtures.mjs +45 -0
  119. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +1 -0
  120. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +9 -2
  121. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +7 -0
  122. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +14 -3
  123. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +4 -2
  124. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +1 -0
  125. package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +5 -3
  126. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +16 -3
  127. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +1 -0
  128. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +5 -2
  129. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +13 -3
  130. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +13 -2
  131. package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +81 -42
  132. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +8 -0
  133. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +160 -31
  134. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +22 -12
  135. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +7 -1
  136. package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +49 -22
  137. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +1 -1
  138. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +3 -1
  139. package/src/runtime/agent/orchestrator/providers/registry.mjs +45 -2
  140. package/src/runtime/agent/orchestrator/providers/vertex-ai-auth.mjs +622 -0
  141. package/src/runtime/agent/orchestrator/providers/vertex-ai-maas.mjs +185 -0
  142. package/src/runtime/agent/orchestrator/providers/vertex-ai-models.mjs +445 -0
  143. package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +567 -0
  144. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +41 -13
  145. package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +2 -0
  146. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -6
  147. package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +7 -3
  148. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
  149. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +6 -1
  150. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +14 -5
  151. package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
  152. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +5 -2
  153. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +30 -5
  154. package/src/runtime/agent/orchestrator/session/agent-room.mjs +171 -37
  155. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +1 -3
  156. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +102 -12
  157. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
  158. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -8
  159. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +23 -0
  160. package/src/runtime/agent/orchestrator/session/compact/observation-supersession.mjs +103 -23
  161. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +160 -36
  162. package/src/runtime/agent/orchestrator/session/context-utils.mjs +13 -1
  163. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +164 -23
  164. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +139 -19
  165. package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +38 -7
  166. package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +3 -0
  167. package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +100 -22
  168. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
  169. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -6
  170. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +33 -3
  171. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +9 -2
  172. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +1 -1
  173. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +13 -5
  174. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +14 -0
  175. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +13 -1
  176. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +23 -4
  177. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +2 -0
  178. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
  179. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +39 -21
  180. package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
  181. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +50 -28
  182. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +3 -3
  183. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +3 -1
  184. package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +2 -2
  185. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +1 -0
  186. package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +2 -1
  187. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +30 -13
  188. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +63 -6
  189. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +7 -0
  190. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
  191. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +35 -13
  192. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +24 -14
  193. package/src/runtime/agent/orchestrator/session/manager/session-scratch-environment.mjs +70 -0
  194. package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +0 -3
  195. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +10 -6
  196. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +4 -0
  197. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +3 -0
  198. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +56 -29
  199. package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
  200. package/src/runtime/agent/orchestrator/session/mixy-name.mjs +11 -5
  201. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +5 -1
  202. package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +30 -7
  203. package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +154 -0
  204. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +7 -0
  205. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +4 -0
  206. package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +15 -0
  207. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +37 -8
  208. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +252 -39
  209. package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
  210. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +164 -4
  211. package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
  212. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +61 -2
  213. package/src/runtime/agent/orchestrator/stall-policy.mjs +23 -0
  214. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
  215. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/invocation-plan.mjs +2 -2
  216. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -2
  217. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +6 -1
  218. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +46 -20
  219. package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +7 -1
  220. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +67 -31
  221. package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +25 -13
  222. package/src/runtime/agent/orchestrator/tools/builtin/lib/scoped-search-flight.mjs +9 -5
  223. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
  224. package/src/runtime/agent/orchestrator/tools/builtin/read-single-stream.mjs +7 -1
  225. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +6 -3
  226. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +1 -1
  227. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-publication.mjs +23 -12
  228. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +6 -1
  229. package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +1 -8
  230. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +20 -15
  231. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +96 -20
  232. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
  233. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/federation.mjs +3 -1
  234. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +1 -1
  235. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  236. package/src/runtime/agent/orchestrator/tools/lib/isolated-test-env.mjs +4 -3
  237. package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +99 -2
  238. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +2 -0
  239. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +103 -13
  240. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +3 -1
  241. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +49 -15
  242. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +45 -27
  243. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +34 -10
  244. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +28 -4
  245. package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
  246. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -2
  247. package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
  248. package/src/runtime/channels/lib/webhook/signature.mjs +4 -1
  249. package/src/runtime/channels/lib/whisper-port.mjs +29 -11
  250. package/src/runtime/channels/lib/whisper-server.mjs +10 -1
  251. package/src/runtime/computer-bridge/action-schema.mjs +2 -2
  252. package/src/runtime/computer-bridge/core-actions.mjs +2 -2
  253. package/src/runtime/computer-bridge/error-recovery.mjs +5 -4
  254. package/src/runtime/computer-bridge/linux-action-capabilities.mjs +24 -5
  255. package/src/runtime/computer-bridge/linux-readiness.d.mts +7 -2
  256. package/src/runtime/connectors/connector-accounts-mcp.mjs +236 -103
  257. package/src/runtime/connectors/gmail-app-password.mjs +3 -3
  258. package/src/runtime/explore/explorer.mjs +93 -0
  259. package/src/runtime/explore/tool-defs.mjs +35 -0
  260. package/src/runtime/explore/tool.mjs +123 -0
  261. package/src/runtime/local-provider/server-process.mjs +2 -1
  262. package/src/runtime/media/adapters/gemini-video.mjs +4 -1
  263. package/src/runtime/media/adapters/xai-media.mjs +2 -1
  264. package/src/runtime/memory/index.mjs +4 -0
  265. package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
  266. package/src/runtime/memory/lib/embedding-worker.mjs +10 -3
  267. package/src/runtime/memory/lib/memory-action-handlers/cycle-backfill-action.mjs +1 -7
  268. package/src/runtime/memory/lib/memory-chunk-quality.mjs +1 -6
  269. package/src/runtime/office/authoring/pdf-author-action.mjs +1 -6
  270. package/src/runtime/office/design/design-art-direction.mjs +29 -27
  271. package/src/runtime/office/pdf/pdf-writer.mjs +6 -1
  272. package/src/runtime/office/portable/portable-snapshot-docx.mjs +7 -1
  273. package/src/runtime/office/portable/portable-snapshot-shared.mjs +6 -1
  274. package/src/runtime/office/quality/assurance-rendered.mjs +9 -2
  275. package/src/runtime/office/quality/assurance-structure-docx.mjs +4 -2
  276. package/src/runtime/office/quality/design-review.mjs +1 -5
  277. package/src/runtime/office/quality/document-brief.mjs +1 -5
  278. package/src/runtime/office/quality/forced-break-pages.mjs +9 -6
  279. package/src/runtime/office/quality/quality-pipeline.mjs +1 -1
  280. package/src/runtime/shared/agent-route-config.mjs +17 -2
  281. package/src/runtime/shared/atomic-file.mjs +103 -2
  282. package/src/runtime/shared/background-tasks.mjs +15 -6
  283. package/src/runtime/shared/bot-owned-work.mjs +56 -0
  284. package/src/runtime/shared/connector-accounts.mjs +5 -5
  285. package/src/runtime/shared/connector-catalog.d.mts +11 -4
  286. package/src/runtime/shared/connector-catalog.mjs +60 -52
  287. package/src/runtime/shared/custom-provider-keys.mjs +20 -0
  288. package/src/runtime/shared/defaults-separation.mjs +1 -4
  289. package/src/runtime/shared/fetch-safe-listen.d.mts +16 -0
  290. package/src/runtime/shared/fetch-safe-listen.mjs +50 -0
  291. package/src/runtime/shared/file-has-data.mjs +26 -2
  292. package/src/runtime/shared/file-lock.mjs +13 -15
  293. package/src/runtime/shared/git-launch.d.mts +9 -0
  294. package/src/runtime/shared/git-launch.mjs +213 -0
  295. package/src/runtime/shared/git-runner-worker.mjs +2 -1
  296. package/src/runtime/shared/handoff-artifacts.d.mts +2 -1
  297. package/src/runtime/shared/handoff-artifacts.mjs +18 -8
  298. package/src/runtime/shared/idle-auto-clear-gate.mjs +29 -7
  299. package/src/runtime/shared/llm/cost.mjs +11 -2
  300. package/src/runtime/shared/llm/http-agent.mjs +313 -29
  301. package/src/runtime/shared/llm/model-catalog-projection.mjs +3 -2
  302. package/src/runtime/shared/llm/model-catalog.mjs +46 -6
  303. package/src/runtime/shared/llm/provider-catalog-registry.mjs +3 -0
  304. package/src/runtime/shared/llm/system-proxy.mjs +452 -0
  305. package/src/runtime/shared/loopback-listener.mjs +25 -2
  306. package/src/runtime/shared/model-route-chain.d.mts +7 -2
  307. package/src/runtime/shared/model-route-chain.mjs +22 -4
  308. package/src/runtime/shared/open-url.mjs +10 -0
  309. package/src/runtime/shared/provider-accounts.mjs +52 -2
  310. package/src/runtime/shared/session-activity-signal.mjs +14 -0
  311. package/src/runtime/shared/session-scratch.mjs +37 -0
  312. package/src/runtime/shared/staged-install-worker.mjs +5 -0
  313. package/src/runtime/shared/staged-update.mjs +47 -2
  314. package/src/runtime/shared/tool-card-model/agent-surface.mjs +1 -3
  315. package/src/runtime/shared/tool-card-model/card-status.mjs +15 -2
  316. package/src/runtime/shared/tool-result-summary.mjs +1 -1
  317. package/src/runtime/shared/tool-surface.mjs +113 -36
  318. package/src/runtime/shared/tool-work-units.mjs +6 -0
  319. package/src/runtime/shared/turn-snapshot-store.mjs +13 -6
  320. package/src/runtime/shared/turn-worktree-snapshot.mjs +414 -54
  321. package/src/runtime/shared/worktrees/activity-gate.mjs +215 -318
  322. package/src/runtime/shared/worktrees/activity-ledger-worker.mjs +56 -0
  323. package/src/runtime/shared/worktrees/activity-ledger.mjs +391 -0
  324. package/src/runtime/shared/worktrees/branch-management.mjs +9 -3
  325. package/src/runtime/shared/worktrees/contract.mjs +4 -1
  326. package/src/runtime/shared/worktrees/git.mjs +72 -0
  327. package/src/runtime/shared/worktrees/manager.mjs +285 -168
  328. package/src/runtime/shared/worktrees/test-support.mjs +6 -10
  329. package/src/runtime/tidy/install.mjs +95 -15
  330. package/src/runtime/tidy/languages.mjs +17 -15
  331. package/src/runtime/tidy/process.mjs +7 -4
  332. package/src/runtime/tidy/resolve.mjs +19 -16
  333. package/src/runtime/tidy/runners/biome.mjs +3 -3
  334. package/src/runtime/tidy/tool.mjs +1 -1
  335. package/src/runtime/tidy/worktree.mjs +10 -6
  336. package/src/runtime/visualize-bridge/client.mjs +6 -1
  337. package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
  338. package/src/runtime/web-search/index.mjs +1 -1
  339. package/src/session-runtime/agent-home-delivery.mjs +41 -0
  340. package/src/session-runtime/agent-task-sessions.mjs +458 -312
  341. package/src/session-runtime/agent-tool-routing.mjs +8 -41
  342. package/src/session-runtime/boot/tools.mjs +7 -1
  343. package/src/session-runtime/bot-status.mjs +107 -101
  344. package/src/session-runtime/bot-target.mjs +38 -0
  345. package/src/session-runtime/channel-config-api.mjs +6 -1
  346. package/src/session-runtime/connector-merge-migration.mjs +18 -15
  347. package/src/session-runtime/conversation-import/codex-titles.mjs +88 -0
  348. package/src/session-runtime/conversation-import/discovery.mjs +401 -36
  349. package/src/session-runtime/conversation-import/service.mjs +35 -8
  350. package/src/session-runtime/handoff-attachments.mjs +82 -31
  351. package/src/session-runtime/held-requests.mjs +3 -1
  352. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +12 -13
  353. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +1 -0
  354. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +2 -0
  355. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
  356. package/src/session-runtime/internal-tool-executor/reaction-tool.mjs +4 -1
  357. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +145 -112
  358. package/src/session-runtime/lifecycle/cold-heir.mjs +11 -6
  359. package/src/session-runtime/lifecycle/session-catalog.mjs +9 -1
  360. package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -1
  361. package/src/session-runtime/lifecycle/teardown.mjs +1 -1
  362. package/src/session-runtime/mcp-glue/server-catalog.mjs +16 -10
  363. package/src/session-runtime/mcp-glue/server-input.mjs +4 -1
  364. package/src/session-runtime/mixy-heartbeat.mjs +1 -1
  365. package/src/session-runtime/model-route/set-route.mjs +11 -2
  366. package/src/session-runtime/provider-auth/login.mjs +2 -2
  367. package/src/session-runtime/provider-catalog-cache.mjs +82 -36
  368. package/src/session-runtime/provider-models/catalog-load.mjs +23 -6
  369. package/src/session-runtime/provider-models.mjs +4 -2
  370. package/src/session-runtime/resource-mcp-api.mjs +98 -35
  371. package/src/session-runtime/resource-mcp-connector-accounts.mjs +44 -31
  372. package/src/session-runtime/resource-mcp-secrets.mjs +28 -11
  373. package/src/session-runtime/resource-mcp-servers.mjs +5 -4
  374. package/src/session-runtime/resource-recall-api.mjs +6 -1
  375. package/src/session-runtime/runtime-feature-gates.mjs +5 -1
  376. package/src/session-runtime/services/agent-tool/execute.mjs +14 -9
  377. package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +20 -4
  378. package/src/session-runtime/services/agent-tool/model-select.mjs +48 -7
  379. package/src/session-runtime/services/agent-tool/render.mjs +71 -17
  380. package/src/session-runtime/services/agent-tool/send-flow.mjs +10 -2
  381. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +8 -3
  382. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +4 -1
  383. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +6 -2
  384. package/src/session-runtime/services/agent-tool/tool-def.mjs +9 -9
  385. package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
  386. package/src/session-runtime/services/channel-worker/daemon-spawn.mjs +2 -0
  387. package/src/session-runtime/services/daemon-candidate.mjs +4 -1
  388. package/src/session-runtime/services/memory-runtime-proxy/daemon-spawn.mjs +4 -0
  389. package/src/session-runtime/services/plugin-admin.mjs +10 -6
  390. package/src/session-runtime/services/provider-admin.mjs +283 -11
  391. package/src/session-runtime/session-turn-api.mjs +2 -0
  392. package/src/session-runtime/settings-builtin-tools-api.mjs +4 -1
  393. package/src/session-runtime/settings-system-api.mjs +1 -1
  394. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +13 -3
  395. package/src/session-runtime/setup-tool/connector-widen-approval.mjs +96 -0
  396. package/src/session-runtime/setup-tool/executor.mjs +6 -2
  397. package/src/session-runtime/setup-tool/tool-defs.mjs +2 -1
  398. package/src/session-runtime/tool-policy/policy-stage.mjs +1 -0
  399. package/src/session-runtime/turn/agent-ops.mjs +23 -0
  400. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +49 -11
  401. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +5 -1
  402. package/src/session-runtime/workflow-agents-api/agent-route.mjs +25 -5
  403. package/src/session-runtime/workflow-agents-api/onboarding.mjs +3 -3
  404. package/src/session-runtime/workspace/activity-guards.mjs +176 -0
  405. package/src/session-runtime/workspace/session-view.mjs +149 -0
  406. package/src/session-runtime/workspace/side-checkouts.mjs +203 -0
  407. package/src/session-runtime/workspace/transition-runner.mjs +188 -0
  408. package/src/session-runtime/workspace/transitions.mjs +108 -1041
  409. package/src/session-runtime/workspace/workspace-merge.mjs +132 -0
  410. package/src/session-runtime/workspace/worktree-intents.mjs +242 -0
  411. package/src/session-runtime/workspace/worktree-maintenance.mjs +80 -0
  412. package/src/session-runtime/workspace/worktree-setup.mjs +85 -0
  413. package/src/session-runtime/workspace/worktree-tool.mjs +73 -56
  414. package/src/standalone/daemon-desktop-runtime.mjs +2 -0
  415. package/src/standalone/daemon-session-control.mjs +169 -138
  416. package/src/standalone/daemon.mjs +7 -0
  417. package/src/standalone/desktop-service-registry.mjs +9 -0
  418. package/src/standalone/local-session-runtime.mjs +5 -1
  419. package/src/standalone/session-client/daemon-unavailable.mjs +3 -0
  420. package/src/standalone/session-client.mjs +5 -1
  421. package/src/standalone/session-frame-stream.mjs +83 -11
  422. package/src/standalone/session-protocol.mjs +4 -0
  423. package/src/standalone/session-service/agent-tree/agent-turns.mjs +16 -12
  424. package/src/standalone/session-service/agent-tree.mjs +45 -9
  425. package/src/standalone/session-service/projection/transcript-window.mjs +700 -64
  426. package/src/standalone/session-service/session-calls/session-action.mjs +10 -3
  427. package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
  428. package/src/standalone/session-service/stored-reader.mjs +127 -40
  429. package/src/standalone/session-transport/client-registry/client-grace.mjs +12 -9
  430. package/src/tui/App.jsx +154 -164
  431. package/src/tui/app/app-view/floating-panel.jsx +10 -4
  432. package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
  433. package/src/tui/app/clipboard.mjs +21 -10
  434. package/src/tui/app/model-picker/route-selection/fast-parameters.mjs +1 -3
  435. package/src/tui/app/model-picker/route-selection.mjs +5 -6
  436. package/src/tui/app/prompt-handlers/use-prompt-history-nav.mjs +1 -1
  437. package/src/tui/app/prompt-handlers/use-prompt-interrupt.mjs +3 -0
  438. package/src/tui/app/prompt-submit/provider-prompts.mjs +3 -1
  439. package/src/tui/app/provider-setup/api-key-actions.mjs +31 -1
  440. package/src/tui/app/provider-setup/oauth-actions.mjs +58 -21
  441. package/src/tui/app/provider-setup/provider-items.mjs +8 -2
  442. package/src/tui/app/provider-setup-picker.mjs +29 -18
  443. package/src/tui/app/shell-layout/row-budgets.mjs +12 -10
  444. package/src/tui/app/slash-commands.mjs +1 -0
  445. package/src/tui/app/slash-dispatch/session-commands.mjs +46 -0
  446. package/src/tui/app/slash-dispatch.mjs +1 -1
  447. package/src/tui/app/use-btw-panel.mjs +29 -0
  448. package/src/tui/app/use-context-panel-refresh.mjs +31 -0
  449. package/src/tui/app/use-model-catalog-cache.mjs +13 -10
  450. package/src/tui/app/use-mouse-input.mjs +11 -0
  451. package/src/tui/app/use-onboarding-start.mjs +8 -3
  452. package/src/tui/app/use-panel-transition.mjs +10 -1
  453. package/src/tui/app/use-pasted-buffers.mjs +28 -20
  454. package/src/tui/app/use-prompt-draft-flow.mjs +7 -0
  455. package/src/tui/app/use-prompt-layout-rows.mjs +3 -3
  456. package/src/tui/app/use-prompt-queue-history.mjs +3 -2
  457. package/src/tui/app/use-selection-focus.mjs +11 -2
  458. package/src/tui/app/use-selection-geometry.mjs +18 -9
  459. package/src/tui/app/use-selection-paint.mjs +4 -4
  460. package/src/tui/app/use-selection-stitch.mjs +3 -3
  461. package/src/tui/app/use-slash-palette.mjs +62 -0
  462. package/src/tui/app/use-terminal-chrome.mjs +2 -2
  463. package/src/tui/app/use-transcript-activity.mjs +47 -32
  464. package/src/tui/app/use-transcript-follow.mjs +12 -4
  465. package/src/tui/app/use-transcript-scroll.mjs +46 -17
  466. package/src/tui/app/use-transcript-swap-reset.mjs +27 -0
  467. package/src/tui/app/use-transcript-window/geometry.mjs +19 -5
  468. package/src/tui/app/use-transcript-window/instance-state.mjs +4 -0
  469. package/src/tui/app/use-transcript-window/selection-shift.mjs +5 -1
  470. package/src/tui/app/use-transcript-window.mjs +21 -11
  471. package/src/tui/app/use-tui-ready.mjs +18 -0
  472. package/src/tui/app/use-welcome-prompt-hint.mjs +5 -0
  473. package/src/tui/app/use-workflow-tab-cycle.mjs +5 -3
  474. package/src/tui/components/Picker.jsx +27 -3
  475. package/src/tui/components/QuestionPanel.jsx +13 -4
  476. package/src/tui/components/SignInUrl.jsx +68 -0
  477. package/src/tui/components/TextEntryPanel.jsx +76 -46
  478. package/src/tui/components/sign-in-url-layout.mjs +24 -0
  479. package/src/tui/dist/index.mjs +1963 -1361
  480. package/src/tui/session/goal-turn-state.mjs +6 -2
  481. package/src/tui/session/session-api/controls.mjs +4 -0
  482. package/src/tui/session/session-api/extensions.mjs +8 -0
  483. package/src/tui/session/session-api/intake/abort.mjs +2 -1
  484. package/src/tui/session/session-api/intake.mjs +2 -0
  485. package/src/tui/session/session-api/integrations.mjs +2 -2
  486. package/src/tui/session/session-api/routes-agent-definitions.mjs +1 -0
  487. package/src/tui/session/session-api/settings.mjs +2 -2
  488. package/src/tui/session/session-flow/queue/take-entries.mjs +11 -0
  489. package/src/tui/session/transcript-spill/spill-writer.mjs +15 -0
  490. package/src/tui/session/transcript-spill.mjs +92 -4
  491. package/src/tui/session/transcript-store.mjs +2 -0
  492. package/src/ui/statusline-agents.mjs +1 -3
  493. package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
@@ -1,16 +1,8 @@
1
- import {
2
- linkSync,
3
- mkdirSync,
4
- readdirSync,
5
- readFileSync,
6
- renameSync,
7
- statSync,
8
- unlinkSync,
9
- writeFileSync,
10
- } from 'node:fs';
1
+ import { linkSync, mkdirSync, readFileSync, renameSync, statSync, unlinkSync, writeFileSync } from 'node:fs';
11
2
  import {
12
3
  link as linkAsync,
13
4
  mkdir as mkdirAsync,
5
+ readdir as readdirAsync,
14
6
  readFile as readFileAsync,
15
7
  stat as statAsync,
16
8
  unlink as unlinkAsync,
@@ -384,10 +376,16 @@ function lockStaleMs(opts) {
384
376
  // A staged owner record lives for one link call; a process killed between its
385
377
  // create and unlink leaves `<lock>.<pid>.<hex>.tmp` behind. Each lock path is
386
378
  // swept once per process for staged files older than this whose pid is dead.
379
+ // The sweep is cleanup only — no lock decision depends on it — so it runs
380
+ // beside the acquisition instead of in front of it: listing a crowded
381
+ // directory synchronously blocked every lock taker for seconds. A file it
382
+ // removes belongs to a dead pid and is past any link call, so it cannot race
383
+ // a live acquisition.
387
384
  const STAGED_LOCK_FILE_STALE_MS = 60_000;
388
385
  const sweptLockPaths = new Set();
389
386
 
390
- export function sweepStagedLockFiles(lockPath, now = Date.now()) {
387
+ /** Resolves with the number of staged files removed; 0 once the path was swept in this process. */
388
+ export async function sweepStagedLockFiles(lockPath, now = Date.now()) {
391
389
  if (sweptLockPaths.has(lockPath)) return 0;
392
390
  sweptLockPaths.add(lockPath);
393
391
  const dir = dirname(lockPath);
@@ -395,7 +393,7 @@ export function sweepStagedLockFiles(lockPath, now = Date.now()) {
395
393
  let removed = 0;
396
394
  let names;
397
395
  try {
398
- names = readdirSync(dir);
396
+ names = await readdirAsync(dir);
399
397
  } catch {
400
398
  return 0;
401
399
  }
@@ -405,9 +403,9 @@ export function sweepStagedLockFiles(lockPath, now = Date.now()) {
405
403
  if (!match) continue;
406
404
  const path = join(dir, name);
407
405
  try {
408
- if (now - statSync(path).mtimeMs < STAGED_LOCK_FILE_STALE_MS) continue;
406
+ if (now - (await statAsync(path)).mtimeMs < STAGED_LOCK_FILE_STALE_MS) continue;
409
407
  if (ownerIsLive({ pid: Number(match[1]), token: null })) continue;
410
- unlinkSync(path);
408
+ await unlinkAsync(path);
411
409
  removed += 1;
412
410
  } catch {
413
411
  // Another sweeper or a late unlink got there first.
@@ -421,7 +419,7 @@ function* acquireLock(lockPath, opts, mode, markHeld, timing = null) {
421
419
  const staleMs = lockStaleMs(opts);
422
420
  const deadline = Date.now() + timeoutMs;
423
421
  yield ['mkdirp', dirname(lockPath)];
424
- sweepStagedLockFiles(lockPath);
422
+ void sweepStagedLockFiles(lockPath);
425
423
  const waitStartedAt = Date.now();
426
424
  let attempt = 0;
427
425
  let lastError = null;
@@ -0,0 +1,9 @@
1
+ export function gitCommand(env?: NodeJS.ProcessEnv | null): string;
2
+ export function gitChildEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
3
+ export function gitChildEnv(env?: null): NodeJS.ProcessEnv | null;
4
+ export function forgetMissingGit(command: string, error: unknown): boolean;
5
+ export function startGit<T>(
6
+ env: NodeJS.ProcessEnv,
7
+ start: (command: string, env: NodeJS.ProcessEnv) => Promise<T>,
8
+ spawnError?: (outcome: T) => unknown
9
+ ): Promise<T>;
@@ -0,0 +1,213 @@
1
+ // The git executable product code starts, and the environment it starts with.
2
+ //
3
+ // On Windows `git` on PATH is usually Git for Windows' launcher,
4
+ // <root>\cmd\git.exe (or the identical <root>\bin\git.exe). It only prepares
5
+ // the environment and starts <root>\<msystem>\bin\git.exe as a second process,
6
+ // so every git child costs two process creations. When PATH's git is that
7
+ // launcher, children start the real binary directly with the environment the
8
+ // launcher would have built. The steps below follow git-wrapper.c
9
+ // (git-for-windows/MINGW-packages, mingw-w64-git/git-wrapper.c): main()'s
10
+ // `git.exe` branch and setup_environment(top_level_path, full_path=1) plus
11
+ // maybe_read_config(). Anything else — another platform, a scoop shim, MinGit,
12
+ // a git.exe outside such a layout, an ambiguous or incomplete install — keeps
13
+ // plain `git` and the caller's environment, exactly as before.
14
+ import { readFileSync, realpathSync, statSync } from 'node:fs';
15
+ import { basename, delimiter, dirname, isAbsolute, join } from 'node:path';
16
+
17
+ // The wrapper's compile-time MSYSTEM, lower-cased, names its binary directory.
18
+ const MSYSTEM_DIRECTORIES = ['mingw64', 'clangarm64', 'mingw32'];
19
+
20
+ function isFile(path) {
21
+ try {
22
+ return statSync(path).isFile();
23
+ } catch {
24
+ return false;
25
+ }
26
+ }
27
+
28
+ function isDirectory(path) {
29
+ try {
30
+ return statSync(path).isDirectory();
31
+ } catch {
32
+ return false;
33
+ }
34
+ }
35
+
36
+ // Windows names are case-insensitive. Of several spellings in one object
37
+ // Node passes the first in sorted order to the child, so that one is read and
38
+ // written.
39
+ function envKey(env, name) {
40
+ const upper = name.toUpperCase();
41
+ return (
42
+ Object.keys(env)
43
+ .filter((key) => key.toUpperCase() === upper)
44
+ .sort()[0] ?? name
45
+ );
46
+ }
47
+
48
+ function envValue(env, name) {
49
+ const value = env[envKey(env, name)];
50
+ return value === undefined || value === null ? undefined : String(value);
51
+ }
52
+
53
+ // The wrapper's my_path_append: one backslash between the parts.
54
+ function appendPath(list, part) {
55
+ return list.endsWith('\\') ? `${list}${part}` : `${list}\\${part}`;
56
+ }
57
+
58
+ // libuv's search for a bare `git` (no directory, no extension): each PATH
59
+ // entry in order, `git.com` before `git.exe`.
60
+ function launcherOnPath(pathValue) {
61
+ for (const raw of String(pathValue || '').split(delimiter)) {
62
+ const entry = raw.trim().replace(/^"(.*)"$/, '$1');
63
+ if (!entry) continue;
64
+ // A relative entry resolves against each child's cwd; not decidable once.
65
+ if (!isAbsolute(entry)) return null;
66
+ if (isFile(join(entry, 'git.com'))) return null;
67
+ const candidate = join(entry, 'git.exe');
68
+ if (isFile(candidate)) return candidate;
69
+ }
70
+ return null;
71
+ }
72
+
73
+ // etc\git-bash.config `MSYS=` lines, each prepended to MSYS in file order.
74
+ function readMsysConfig(root) {
75
+ let text = '';
76
+ try {
77
+ text = readFileSync(join(root, 'etc', 'git-bash.config'), 'utf8');
78
+ } catch {
79
+ return [];
80
+ }
81
+ return text
82
+ .split('\n')
83
+ .map((line) => line.replace(/\r$/, ''))
84
+ .filter((line) => line.startsWith('MSYS='))
85
+ .map((line) => line.slice(5));
86
+ }
87
+
88
+ /**
89
+ * The Git for Windows layout behind PATH's `git`, or null when there is none
90
+ * to bypass. `{ command, root, msystem, msysConfig }`.
91
+ */
92
+ export function resolveGitLaunch({ platform = process.platform, pathValue = process.env.PATH } = {}) {
93
+ if (platform !== 'win32') return null;
94
+ const found = launcherOnPath(pathValue);
95
+ if (!found) return null;
96
+ let launcher;
97
+ try {
98
+ // The wrapper locates its install from its own final path.
99
+ launcher = realpathSync.native(found);
100
+ } catch {
101
+ return null;
102
+ }
103
+ if (basename(launcher).toLowerCase() !== 'git.exe') return null;
104
+ const launcherDirectory = dirname(launcher);
105
+ if (!['cmd', 'bin'].includes(basename(launcherDirectory).toLowerCase())) return null;
106
+ const root = dirname(launcherDirectory);
107
+ // The installer and PortableGit ship git-bash.exe; MinGit and other layouts do not.
108
+ if (!isFile(join(root, 'git-bash.exe')) || !isDirectory(join(root, 'usr', 'bin'))) return null;
109
+ const installed = MSYSTEM_DIRECTORIES.filter((name) => isFile(join(root, name, 'bin', 'git.exe')));
110
+ if (installed.length !== 1) return null;
111
+ const [msystemDirectory] = installed;
112
+ return {
113
+ command: join(root, msystemDirectory, 'bin', 'git.exe'),
114
+ root,
115
+ msystem: msystemDirectory.toUpperCase(),
116
+ msysConfig: readMsysConfig(root),
117
+ };
118
+ }
119
+
120
+ function isSystemDirectory(path) {
121
+ const system = join(process.env.SystemRoot || process.env.windir || 'C:\\Windows', 'System32');
122
+ return path.toLowerCase() === system.toLowerCase();
123
+ }
124
+
125
+ /** `base` as the launcher would hand it to the real git (setup_environment). */
126
+ export function gitLaunchEnvironment(launch, base) {
127
+ const env = { ...base };
128
+ const set = (name, value) => {
129
+ env[envKey(env, name)] = value;
130
+ };
131
+ set('MSYSTEM', launch.msystem);
132
+ if (envValue(env, 'PLINK_PROTOCOL') === undefined) set('PLINK_PROTOCOL', 'ssh');
133
+ if (envValue(env, 'HOME') === undefined) {
134
+ const homePath = envValue(env, 'HOMEPATH');
135
+ const drive = `${envValue(env, 'HOMEDRIVE') ?? ''}${homePath ?? ''}`;
136
+ if (homePath !== undefined && !isSystemDirectory(drive) && isDirectory(drive)) set('HOME', drive);
137
+ else if (envValue(env, 'USERPROFILE') !== undefined) set('HOME', envValue(env, 'USERPROFILE'));
138
+ }
139
+ // <root>\<msystem>\bin;<root>\usr\bin;<HOME>\bin; ahead of the inherited PATH.
140
+ const prefix =
141
+ `${appendPath(launch.root, `${launch.msystem.toLowerCase()}\\bin`)};` +
142
+ appendPath(launch.root, 'usr\\bin;') +
143
+ appendPath(envValue(env, 'HOME') ?? '', 'bin;');
144
+ set('PATH', `${prefix}${envValue(env, 'PATH') ?? ''}`);
145
+ for (const msys of launch.msysConfig) {
146
+ const current = envValue(env, 'MSYS');
147
+ set('MSYS', current === undefined ? msys : `${msys} ${current}`);
148
+ }
149
+ return env;
150
+ }
151
+
152
+ // PATH value -> its launch (or null), resolved once per PATH: a child is
153
+ // started with the git its own environment's PATH names, as bare `git` is.
154
+ const resolved = new Map();
155
+ function gitLaunch(env) {
156
+ const pathValue = envValue(env ?? process.env, 'PATH') ?? '';
157
+ if (!resolved.has(pathValue)) resolved.set(pathValue, resolveGitLaunch({ pathValue }));
158
+ return resolved.get(pathValue);
159
+ }
160
+
161
+ /** The program to spawn for git with `env` (null: this process's environment). */
162
+ export function gitCommand(env = null) {
163
+ return gitLaunch(env)?.command ?? 'git';
164
+ }
165
+
166
+ /**
167
+ * The environment for a git child: `env` (null: this process's environment)
168
+ * with the launcher's additions when {@link gitCommand} bypasses it. Without a
169
+ * bypass `env` is returned unchanged, null included.
170
+ */
171
+ export function gitChildEnv(env = null) {
172
+ const launch = gitLaunch(env);
173
+ return launch ? gitLaunchEnvironment(launch, env ?? process.env) : env;
174
+ }
175
+
176
+ /**
177
+ * Whether a spawn of `command` failed because that resolved binary is gone (an
178
+ * uninstalled or moved Git). Its resolutions are dropped then, so the next
179
+ * {@link gitCommand} resolves PATH afresh. ENOENT alone is not enough: a
180
+ * missing cwd reports it too, with the binary still in place.
181
+ */
182
+ export function forgetMissingGit(command, error) {
183
+ if (error?.code !== 'ENOENT' || command === 'git' || isFile(command)) return false;
184
+ for (const [pathValue, launch] of resolved) if (launch?.command === command) resolved.delete(pathValue);
185
+ return true;
186
+ }
187
+
188
+ /**
189
+ * Starts git as `start(command, childEnv)` and, when that spawn failed only
190
+ * because the resolved binary is gone, once more with a fresh resolution —
191
+ * where bare `git` would have found whatever PATH holds now. `start` rejects
192
+ * with the spawn error, or settles an outcome `spawnError` reads it from.
193
+ */
194
+ export async function startGit(env, start, spawnError = () => null) {
195
+ const command = gitCommand(env);
196
+ let outcome;
197
+ try {
198
+ outcome = await start(command, gitChildEnv(env));
199
+ } catch (error) {
200
+ if (!forgetMissingGit(command, error)) throw error;
201
+ return start(gitCommand(env), gitChildEnv(env));
202
+ }
203
+ if (!forgetMissingGit(command, spawnError(outcome))) return outcome;
204
+ return start(gitCommand(env), gitChildEnv(env));
205
+ }
206
+
207
+ /** {@link startGit} for a synchronous `start` (spawnSync). */
208
+ export function startGitSync(env, start, spawnError = (result) => result?.error) {
209
+ const command = gitCommand(env);
210
+ const outcome = start(command, gitChildEnv(env));
211
+ if (!forgetMissingGit(command, spawnError(outcome))) return outcome;
212
+ return start(gitCommand(env), gitChildEnv(env));
213
+ }
@@ -2,7 +2,8 @@
2
2
  // thread, never on the host event loop (run-child.mjs). Each request resolves
3
3
  // to { code, stdout, stderr } or an error with the same codes the in-process
4
4
  // runner used (ETIMEDOUT, EMAXBUFFER, spawn errors).
5
+ import { startGit } from './git-launch.mjs';
5
6
  import { runChild } from './run-child.mjs';
6
7
  import { serveWorkerRequests } from './worker-requests.mjs';
7
8
 
8
- serveWorkerRequests((request) => runChild({ ...request, command: 'git' }));
9
+ serveWorkerRequests((request) => startGit(request.env, (command, env) => runChild({ ...request, command, env })));
@@ -8,7 +8,8 @@ export interface HandoffFile {
8
8
  id?: string;
9
9
  }
10
10
  export function normalizeHandoffFiles(files: unknown): HandoffFile[];
11
- export function artifactLines(files: unknown, omitted?: number, options?: { ids?: boolean }): string[];
11
+ export function artifactLines(files: unknown, omitted?: number): string[];
12
+ export function producedFileLines(files: unknown, omitted?: number): string[];
12
13
  export interface HandoffRecord {
13
14
  id: string;
14
15
  attachmentRef: string;
@@ -31,20 +31,30 @@ export function normalizeHandoffFiles(files) {
31
31
  }));
32
32
  }
33
33
 
34
- /** The model-facing list of `files`, empty when there are none. `ids`: the
35
- * row also records the stored files as its attachments (a task report), so
36
- * their ids can be forwarded; a plain-text handoff (an agent completion)
37
- * lists paths only — an id named in text is never trusted. */
38
- export function artifactLines(files, omitted = 0, { ids = true } = {}) {
34
+ /** An agent completion's compact list of files it produced (name and path
35
+ * only; the Lead forwards or links by path), empty when there are none. */
36
+ export function producedFileLines(files, omitted = 0) {
39
37
  const list = normalizeHandoffFiles(files);
40
38
  if (!list.length) return [];
41
- const attachable = (file) => (ids ? ` [attachment:${file.id}]` : ' (attachable: forward it by path)');
42
39
  return [
43
- `Files from this turn (forward one with attachments: [${ids ? 'id or path' : 'path'}]; link a path to show it):`,
40
+ 'Files produced:',
41
+ ...list.map((file) => `- ${oneLine(file.name)} — ${oneLine(file.path)}`),
42
+ ...(omitted > 0 ? [`- …and ${omitted} more`] : []),
43
+ ];
44
+ }
45
+
46
+ /** The model-facing list of a bot task report's `files`, empty when there are
47
+ * none; the row also records the stored files as its attachments, so their
48
+ * ids can be forwarded. */
49
+ export function artifactLines(files, omitted = 0) {
50
+ const list = normalizeHandoffFiles(files);
51
+ if (!list.length) return [];
52
+ return [
53
+ 'Files from this turn (forward one with attachments: [id or path]; link a path to show it):',
44
54
  ...list.map(
45
55
  (file) =>
46
56
  `- ${oneLine(file.name)} (${oneLine(file.mimeType)}, ${sizeLabel(file.size)}) — ${oneLine(file.path)}${
47
- file.id ? attachable(file) : ' (too large or unsupported to attach; link the path)'
57
+ file.id ? ` [attachment:${file.id}]` : ' (too large or unsupported to attach; link the path)'
48
58
  }`
49
59
  ),
50
60
  ...(omitted > 0 ? [`- …and ${omitted} more file(s)`] : []),
@@ -44,15 +44,37 @@ function hasModelVisibleConversation(session) {
44
44
  });
45
45
  }
46
46
 
47
- // When a session's prompt cache was last used by a successful cache warm (a
48
- // read with no write), registered by the warmer (cache-warm.mjs, from its
49
- // durable touch store); 0 when none.
50
- let lastCacheWarmUse = () => 0;
47
+ // A session's last successful cache-warm use (a read with no write),
48
+ // registered by the warmer (cache-warm.mjs, from its durable touch store):
49
+ // `{ at, provider, model, accountId }` — when, and the route and account whose
50
+ // cached prefix it read — or a bare epoch-ms time; null/0 when none.
51
+ let lastCacheWarmUse = () => null;
51
52
 
52
53
  /** Register the source of a session's last successful cache-warm use
53
- * (`(sessionId) => epoch ms | 0`); null restores none. */
54
+ * (`(sessionId) => { at, provider, model, accountId } | epoch ms | null`);
55
+ * null restores none. */
54
56
  export function setCacheWarmUseSource(source) {
55
- lastCacheWarmUse = typeof source === 'function' ? source : () => 0;
57
+ lastCacheWarmUse = typeof source === 'function' ? source : () => null;
58
+ }
59
+
60
+ /** When a successful cache warm last used the session's prompt cache (epoch
61
+ * ms), or 0: the warm read and refreshed the cached prefix without moving
62
+ * any of the session's own timestamps. */
63
+ export function lastCacheWarmUseAt(sessionId) {
64
+ const use = sessionId ? lastCacheWarmUse(sessionId) : null;
65
+ return timestampMs(use && typeof use === 'object' ? use.at : use);
66
+ }
67
+
68
+ /** When a successful cache warm last used the prefix a request on `provider`
69
+ * / `model` / `accountId` reads (epoch ms), or 0: a warm on another route or
70
+ * account refreshed an entry this request cannot read, and a use without a
71
+ * recorded identity matches nothing. */
72
+ export function cacheWarmUseFor(sessionId, { provider, model, accountId = '' } = {}) {
73
+ const use = sessionId ? lastCacheWarmUse(sessionId) : null;
74
+ if (!use || typeof use !== 'object' || !use.provider) return 0;
75
+ const matches =
76
+ use.provider === provider && use.model === model && String(use.accountId || '') === String(accountId || '');
77
+ return matches ? timestampMs(use.at) : 0;
56
78
  }
57
79
 
58
80
  /**
@@ -65,7 +87,7 @@ export function setCacheWarmUseSource(source) {
65
87
  export function sessionActivityTimestamp(session, fallback = 0) {
66
88
  if (!hasModelVisibleConversation(session)) return 0;
67
89
  const own = timestampMs(session?.lastUsedAt) || timestampMs(session?.updatedAt) || timestampMs(fallback);
68
- return Math.max(own, timestampMs(lastCacheWarmUse(session?.id)));
90
+ return Math.max(own, lastCacheWarmUseAt(session?.id));
69
91
  }
70
92
 
71
93
  // A zero is often an unavailable/stale meter field, not an authoritative
@@ -100,7 +100,11 @@ export function priceUsage(args) {
100
100
  // A provider-billed figure for a media request (e.g. xAI cost_in_usd_ticks)
101
101
  // is the price, with or without a catalog row.
102
102
  const media = args.media || null;
103
- if (typeof media?.reportedCostUsd === 'number' && Number.isFinite(media.reportedCostUsd) && media.reportedCostUsd >= 0)
103
+ if (
104
+ typeof media?.reportedCostUsd === 'number' &&
105
+ Number.isFinite(media.reportedCostUsd) &&
106
+ media.reportedCostUsd >= 0
107
+ )
104
108
  return {
105
109
  input,
106
110
  costUsd: Number(media.reportedCostUsd.toFixed(6)),
@@ -129,7 +133,12 @@ export function priceUsage(args) {
129
133
  // premium request needs the model's published Fast/Priority rates.
130
134
  const anthropicFast = premium && sentTier === 'fast' && supportsAnthropicFastMode(identity.pricingModel);
131
135
  const premiumPricing = sentTier === 'ultrafast' ? meta.ultrafastPricing : meta.fastPricing;
132
- const rateMeta = premium && !anthropicFast ? premiumPricing || {} : meta;
136
+ // A request the server reports as served on Flex (Vertex Flex PayGo can be
137
+ // served by Provisioned Throughput first) bills the catalog's flex columns.
138
+ const flex = args.serviceTier === 'flex';
139
+ let rateMeta = meta;
140
+ if (flex) rateMeta = meta.flexPricing || {};
141
+ else if (premium && !anthropicFast) rateMeta = premiumPricing || {};
133
142
  if (args.historicalAggregate && rateMeta.pricingTiers?.some((tier) => promptTokens > tier.aboveInputTokens)) {
134
143
  // A daily sum cannot establish which individual requests crossed a
135
144
  // context boundary. Do not price the whole day as one huge prompt.