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
@@ -0,0 +1,123 @@
1
+ // The explore tool: one read-only explorer loop per query (explorer.mjs), all
2
+ // in parallel, merged into one bounded answer within the same tool call.
3
+ import { resolveMaintenanceRoute } from '../agent/orchestrator/agent-runtime/maintenance-route.mjs';
4
+ import { loadConfig } from '../agent/orchestrator/config.mjs';
5
+ import { getProvider, initProviders } from '../agent/orchestrator/providers/registry.mjs';
6
+ import { EXPLORE_MAX_QUERIES } from './tool-defs.mjs';
7
+ import { runExplorer } from './explorer.mjs';
8
+
9
+ // Hidden ids are reserved from user agents, so this one keeps the `-agent`
10
+ // suffix: a plain `explorer` would hide a user's own Explorer agent.
11
+ export const EXPLORER_AGENT = 'explore-agent';
12
+ export const EXPLORE_TIMEOUT_MS = 120_000;
13
+ export const EXPLORE_OUTPUT_CAP = 24_000;
14
+ const TRUNCATED = '\n[explore: answer truncated]';
15
+
16
+ function result(text, isError = false) {
17
+ return { content: [{ type: 'text', text }], ...(isError ? { isError: true } : {}) };
18
+ }
19
+
20
+ export function normalizeExploreQueries(raw) {
21
+ const list = Array.isArray(raw) ? raw : [raw];
22
+ return list.map((q) => (typeof q === 'string' ? q.trim() : '')).filter(Boolean);
23
+ }
24
+
25
+ function capped(text, budget) {
26
+ return text.length <= budget ? text : text.slice(0, Math.max(0, budget - TRUNCATED.length)) + TRUNCATED;
27
+ }
28
+
29
+ // Headings and error lines are labels, not answers: the truncation marker
30
+ // would tell the caller that evidence was lost when none was.
31
+ function shortened(text, max) {
32
+ return text.length <= max ? text : `${text.slice(0, max - 1)}…`;
33
+ }
34
+
35
+ /**
36
+ * @param {{ query: string|string[] }} args
37
+ * @param {{ cwd?: string, signal?: AbortSignal, callerSessionId?: string }} ctx
38
+ * @param {object} [deps] injectable for tests
39
+ */
40
+ export async function runExplore(args = {}, ctx = {}, deps = {}) {
41
+ const {
42
+ load = () => loadConfig({ secrets: false }),
43
+ initialize = initProviders,
44
+ providerFor = getProvider,
45
+ timeoutMs = EXPLORE_TIMEOUT_MS,
46
+ } = deps;
47
+ const queries = normalizeExploreQueries(args.query);
48
+ if (!queries.length) return result('[explore error] query is required', true);
49
+ if (queries.length > EXPLORE_MAX_QUERIES) {
50
+ return result(`[explore error] at most ${EXPLORE_MAX_QUERIES} queries per call`, true);
51
+ }
52
+ const config = load();
53
+ const route = resolveMaintenanceRoute({ agent: EXPLORER_AGENT, config, includeDefault: false });
54
+ if (!route || typeof route !== 'object') {
55
+ return result('[explore error] Explore has no model; pick one under Workflows → Built-in agents → Explore', true);
56
+ }
57
+
58
+ // One controller per call: caller cancellation and the deadline both abort
59
+ // every explorer, and the call waits for each loop to settle.
60
+ const controller = new AbortController();
61
+ const parent = ctx.signal;
62
+ const onParentAbort = () => controller.abort(parent.reason);
63
+ if (parent?.aborted) return result('[explore error] cancelled', true);
64
+ parent?.addEventListener('abort', onParentAbort, { once: true });
65
+ let timedOut = false;
66
+ const timer = setTimeout(() => {
67
+ timedOut = true;
68
+ const reason = new Error(`explore timed out after ${Math.round(timeoutMs / 1000)}s`);
69
+ // Lets an explorer return the answer text it already wrote.
70
+ reason.salvagePartial = true;
71
+ controller.abort(reason);
72
+ }, timeoutMs);
73
+
74
+ try {
75
+ await initialize(config.providers || {}, { signal: controller.signal });
76
+ const provider = providerFor(route.provider);
77
+ if (!provider || typeof provider.send !== 'function') {
78
+ return result(`[explore error] provider "${route.provider}" is not ready`, true);
79
+ }
80
+ const settled = await Promise.all(
81
+ queries.map((query) =>
82
+ runExplorer({
83
+ query,
84
+ route,
85
+ provider,
86
+ cwd: ctx.cwd || null,
87
+ signal: controller.signal,
88
+ ownerSessionId: ctx.callerSessionId || null,
89
+ }).then(
90
+ (text) => {
91
+ const answer = String(text || '').trim();
92
+ return { ok: Boolean(answer), text: answer, late: timedOut };
93
+ },
94
+ (error) => ({ ok: false, error, late: timedOut })
95
+ )
96
+ )
97
+ );
98
+ if (parent?.aborted) return result('[explore error] cancelled', true);
99
+ const budget = Math.floor(EXPLORE_OUTPUT_CAP / queries.length);
100
+ const bodies = settled.map((entry) => {
101
+ if (entry.ok) return capped(entry.late ? `${entry.text}\n[explore: partial, timed out]` : entry.text, budget);
102
+ if (entry.late) return `[explore error] timed out after ${Math.round(timeoutMs / 1000)}s with no answer`;
103
+ if (entry.error) return `[explore error] ${shortened(String(entry.error?.message || entry.error), 500)}`;
104
+ return '[explore error] explorer returned no answer';
105
+ });
106
+ const text =
107
+ queries.length === 1
108
+ ? bodies[0]
109
+ : bodies
110
+ .map((body, i) => `## Q${i + 1}: ${shortened(queries[i].replace(/\s+/g, ' '), 100)}\n${body}`)
111
+ .join('\n\n');
112
+ return result(
113
+ text,
114
+ settled.every((entry) => !entry.ok)
115
+ );
116
+ } catch (error) {
117
+ if (parent?.aborted) return result('[explore error] cancelled', true);
118
+ return result(`[explore error] ${error?.message || error}`, true);
119
+ } finally {
120
+ clearTimeout(timer);
121
+ parent?.removeEventListener('abort', onParentAbort);
122
+ }
123
+ }
@@ -4,13 +4,14 @@ import { setTimeout as delay } from 'node:timers/promises';
4
4
  import { redactedLog, spawnServerState } from './server-process/child-state.mjs';
5
5
  import { awaitServerReady } from './server-process/readiness.mjs';
6
6
  import { createSerialChain } from './serial-chain.mjs';
7
+ import { listenOnFetchSafePort } from '../shared/fetch-safe-listen.mjs';
7
8
 
8
9
  async function freeLoopbackPort() {
9
10
  return new Promise((resolve, reject) => {
10
11
  const probe = createServer();
11
12
  probe.unref();
12
13
  probe.once('error', reject);
13
- probe.listen(0, '127.0.0.1', () => {
14
+ listenOnFetchSafePort(probe, '127.0.0.1', () => {
14
15
  const port = probe.address().port;
15
16
  probe.close((error) => (error ? reject(error) : resolve(port)));
16
17
  });
@@ -120,7 +120,10 @@ async function generateViaVeo({ model, prompt, options, references = [], signal,
120
120
  // Veo reports no usage; it bills per generated second. The response does
121
121
  // not echo the length, so the requested one (default 8s) is the billed one.
122
122
  // A failed download still leaves the generated seconds billed.
123
- const usage = { seconds: parameters.durationSeconds || VEO_DEFAULT_SECONDS, resolution: parameters.resolution || '720p' };
123
+ const usage = {
124
+ seconds: parameters.durationSeconds || VEO_DEFAULT_SECONDS,
125
+ resolution: parameters.resolution || '720p',
126
+ };
124
127
  // The download is part of the generation budget: unbounded, it held an
125
128
  // active job slot (and the upstream connection) open indefinitely after
126
129
  // the poll loop finished.
@@ -120,7 +120,8 @@ export async function generateVideo({ lane, model, prompt, options = {}, referen
120
120
  // let the catalog's per-second rate price it otherwise.
121
121
  const seconds = Number(data?.video?.duration) || duration;
122
122
  const usage = { ...xaiUsage(data?.usage), seconds, resolution };
123
- if (!url) throw withReportedUsage(mediaError('xAI video finished without a URL', 'MEDIA_EMPTY_RESULT', 502), usage);
123
+ if (!url)
124
+ throw withReportedUsage(mediaError('xAI video finished without a URL', 'MEDIA_EMPTY_RESULT', 502), usage);
124
125
  const bytes = await downloadPublicMedia(url, { signal, label: 'xAI video' }).catch((error) => {
125
126
  throw withReportedUsage(error, usage);
126
127
  });
@@ -71,6 +71,7 @@ import {
71
71
  } from './lib/trace-store.mjs';
72
72
  import { writeJsonAtomicSync } from '../shared/atomic-file.mjs';
73
73
  import { safeIpcSend } from '../shared/safe-ipc-send.mjs';
74
+ import { adoptSystemProxy } from '../shared/llm/system-proxy.mjs';
74
75
  import { resolvePluginData, mixdogHome } from '../shared/plugin-paths.mjs';
75
76
  import { scheduledCycle1Signature } from './lib/cycle-signatures.mjs';
76
77
  import { createTranscriptIngest } from './lib/transcript-ingest.mjs';
@@ -96,6 +97,9 @@ import {
96
97
  } from './lib/memory-config-flags.mjs';
97
98
  const IS_MEMORY_ENTRY = !!process.argv[1] && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
98
99
  if (IS_MEMORY_ENTRY) {
100
+ // Runtime and model downloads follow the system proxy the launching daemon
101
+ // handed over (removed from this env so child processes never see it).
102
+ adoptSystemProxy();
99
103
  // Node's own warning printer stays off in this runtime, but a listener leak
100
104
  // is still logged, with the stack that names its source.
101
105
  process.removeAllListeners('warning');
@@ -12,6 +12,7 @@ import { writeProfilePoint } from './model-profile.mjs';
12
12
  import { createCompactVectorCache } from './compact-vector-cache.mjs';
13
13
  import { EMBED_KEEP_WARM_MS } from './embedding-idle-lease.mjs';
14
14
  import { workerExecArgv } from '../../shared/worker-exec-argv.mjs';
15
+ import { systemProxyHandoffEnv } from '../../shared/llm/system-proxy.mjs';
15
16
  import {
16
17
  getConfiguredEmbeddingModelId,
17
18
  getDefaultEmbeddingDtype,
@@ -69,7 +70,9 @@ function ensureWorker() {
69
70
  _lastRestartMs = now;
70
71
  const execArgv = embeddingWorkerExecArgv();
71
72
  const created = new Worker(WORKER_PATH, {
72
- env: { ...process.env },
73
+ // The model download runs in this worker: it gets the system proxy
74
+ // decision explicitly (and removes it from its own env on start).
75
+ env: { ...process.env, ...systemProxyHandoffEnv() },
73
76
  execArgv,
74
77
  workerData: { dtype: _configuredDtype },
75
78
  });
@@ -8,6 +8,7 @@ import os from 'node:os';
8
8
  import { execFile } from 'node:child_process';
9
9
  import { promisify } from 'node:util';
10
10
  import { resolvePluginData } from '../../shared/plugin-paths.mjs';
11
+ import { adoptSystemProxy } from '../../shared/llm/system-proxy.mjs';
11
12
  import { compressEmbeddingModelCache } from './embedding-model-cache-compression.mjs';
12
13
  import { createIdleLease } from './embedding-idle-lease.mjs';
13
14
  import { ensureModelFile, ensureModelGraph } from './embedding-model-files.mjs';
@@ -24,6 +25,9 @@ import {
24
25
  prepareEmbeddingInput,
25
26
  } from './embedding-model-config.mjs';
26
27
 
28
+ // The model download goes through the system proxy the parent handed over.
29
+ adoptSystemProxy();
30
+
27
31
  const MODEL_ID = getConfiguredEmbeddingModelId();
28
32
 
29
33
  // Reroute ALL worker-thread stdio through parentPort. Without stdout:true/
@@ -300,7 +304,11 @@ async function loadTokenizer() {
300
304
  async function createExtractor(device) {
301
305
  const ort = loadOrt();
302
306
  const encode = await loadTokenizer();
303
- const graphPath = await ensureModelGraph(MODEL_CACHE_DIR, MODEL_ID, getEmbeddingModelGraphFile(MODEL_ID, configuredDtype));
307
+ const graphPath = await ensureModelGraph(
308
+ MODEL_CACHE_DIR,
309
+ MODEL_ID,
310
+ getEmbeddingModelGraphFile(MODEL_ID, configuredDtype)
311
+ );
304
312
  const session = await ort.InferenceSession.create(graphPath, {
305
313
  executionProviders: [device],
306
314
  intraOpNumThreads: INTRA_OP_THREADS,
@@ -397,8 +405,7 @@ async function loadExtractor() {
397
405
  } catch (e) {
398
406
  // Unprivileged processes cannot raise priority back (EACCES/EPERM);
399
407
  // on Linux that is expected, not a stuck state worth warning about.
400
- const expectedOnLinux =
401
- process.platform === 'linux' && /EACCES|EPERM/.test(`${e?.code} ${e?.message}`);
408
+ const expectedOnLinux = process.platform === 'linux' && /EACCES|EPERM/.test(`${e?.code} ${e?.message}`);
402
409
  if (!expectedOnLinux) {
403
410
  __mixdogMemoryLog(
404
411
  `[embed-worker] WARN: process priority stuck below normal (restore failed: ${e?.message || e})\n`
@@ -6,13 +6,7 @@
6
6
  import { runFullBackfill } from '../memory-ops-policy.mjs';
7
7
  import { throwIfAborted } from '../memory-cycle-shared.mjs';
8
8
 
9
- export function createBackfillAction({
10
- getDb,
11
- dataDir,
12
- awaitCycle1Run,
13
- ingestTranscriptFile,
14
- cwdFromTranscriptPath,
15
- }) {
9
+ export function createBackfillAction({ getDb, dataDir, awaitCycle1Run, ingestTranscriptFile, cwdFromTranscriptPath }) {
16
10
  // Whole-action backfill mutex (transport-agnostic). memory-cycle1's
17
11
  // _runCycle1InFlight only protects cycle1; ingest workers
18
12
  // (memory-ops-policy.mjs) can still overlap if a second backfill
@@ -315,12 +315,7 @@ function createCycle1PacketGenerator({ callLlm, request, signal, inputTokenBudge
315
315
 
316
316
  export async function generateCycle1Chunks(
317
317
  rows,
318
- {
319
- callLlm,
320
- request = {},
321
- inputTokenBudget = CYCLE1_INPUT_TOKEN_BUDGET,
322
- signal = request.signal,
323
- } = {}
318
+ { callLlm, request = {}, inputTokenBudget = CYCLE1_INPUT_TOKEN_BUDGET, signal = request.signal } = {}
324
319
  ) {
325
320
  const startedAt = Date.now();
326
321
  const stats = { groupingCalls: 0, verificationCalls: 0, llmMs: 0, verificationMs: 0, retries: 0, fragments: 0 };
@@ -22,12 +22,7 @@ import {
22
22
  } from '../core/office-sessions.mjs';
23
23
  import { snapshotPdf } from '../pdf/pdf-adapter.mjs';
24
24
  import { inlineOfficeAudit } from '../quality/inline-audit.mjs';
25
- import {
26
- factsGate,
27
- parseAuthoringBrief,
28
- reviewBriefPromises,
29
- reviewSourceGrounding,
30
- } from './pptx-brief.mjs';
25
+ import { factsGate, parseAuthoringBrief, reviewBriefPromises, reviewSourceGrounding } from './pptx-brief.mjs';
31
26
  import { editsReplacedByAuthor, markAuthoredFromHtml } from './html-source-drift.mjs';
32
27
  import { hasSlideSections, htmlBriefScript, runPptxHtmlAuthoring } from './pptx-html-runner.mjs';
33
28
  import {
@@ -236,34 +236,36 @@ export function resolveOfficeArtDirection(
236
236
  String(format || '').toLowerCase() === 'xlsx'
237
237
  ? DIRECTION_BLUEPRINTS.filter((blueprint) => blueprint.backgroundMode !== 'dark')
238
238
  : DIRECTION_BLUEPRINTS;
239
- const candidates = blueprints.map((blueprint) => {
240
- const palette = directionPalette(baseHue, blueprint);
241
- const motif = rawSubject ? `${blueprint.motif} · ${rawSubject}` : blueprint.motif;
242
- return {
243
- id: blueprint.id,
244
- label: blueprint.label,
245
- rationale: `${blueprint.label} fits ${purpose} through ${blueprint.motif}.`,
246
- motif,
247
- palette,
248
- typography: { ...blueprint.typography },
249
- style: { ...blueprint.style, pageRhythm: [...blueprint.style.pageRhythm] },
250
- creativeSystem: creativeSystemOf(blueprint),
251
- deck: {
252
- backgroundMode: blueprint.backgroundMode,
239
+ const candidates = blueprints
240
+ .map((blueprint) => {
241
+ const palette = directionPalette(baseHue, blueprint);
242
+ const motif = rawSubject ? `${blueprint.motif} · ${rawSubject}` : blueprint.motif;
243
+ return {
244
+ id: blueprint.id,
245
+ label: blueprint.label,
246
+ rationale: `${blueprint.label} fits ${purpose} through ${blueprint.motif}.`,
253
247
  motif,
254
- imageTreatment: blueprint.imageTreatment,
255
- layoutBias: [...blueprint.layoutBias],
256
- ...creativeSystemOf(blueprint),
257
- },
258
- score: directionScore(blueprint, {
259
- purpose,
260
- expressionMode,
261
- tone: String(request.tone || ''),
262
- requestedId: String(requested.id || ''),
263
- seed,
264
- }),
265
- };
266
- }).sort((left, right) => right.score - left.score || left.id.localeCompare(right.id));
248
+ palette,
249
+ typography: { ...blueprint.typography },
250
+ style: { ...blueprint.style, pageRhythm: [...blueprint.style.pageRhythm] },
251
+ creativeSystem: creativeSystemOf(blueprint),
252
+ deck: {
253
+ backgroundMode: blueprint.backgroundMode,
254
+ motif,
255
+ imageTreatment: blueprint.imageTreatment,
256
+ layoutBias: [...blueprint.layoutBias],
257
+ ...creativeSystemOf(blueprint),
258
+ },
259
+ score: directionScore(blueprint, {
260
+ purpose,
261
+ expressionMode,
262
+ tone: String(request.tone || ''),
263
+ requestedId: String(requested.id || ''),
264
+ seed,
265
+ }),
266
+ };
267
+ })
268
+ .sort((left, right) => right.score - left.score || left.id.localeCompare(right.id));
267
269
  const selected = candidates[0];
268
270
  const hasSubject = Boolean(rawSubject || requested.seed || requested.id);
269
271
  const disabled = request.artDirection === false || requested.enabled === false;
@@ -890,7 +890,12 @@ function drawChartBlock(flow, block, following) {
890
890
  });
891
891
  flow.y -= rowH;
892
892
  });
893
- page.drawLine({ start: { x: left, y: top }, end: { x: left, y: flow.y }, thickness: 0.6, color: color(flow.ink.line) });
893
+ page.drawLine({
894
+ start: { x: left, y: top },
895
+ end: { x: left, y: flow.y },
896
+ thickness: 0.6,
897
+ color: color(flow.ink.line),
898
+ });
894
899
  } else {
895
900
  const baseline = flow.y - size * 1.6 - layout.plotH;
896
901
  values.forEach((value, index) => {
@@ -12,7 +12,13 @@ import {
12
12
  xmlDecode,
13
13
  } from './portable-xml.mjs';
14
14
  import { countDocxPropertyChanges, docxRevisionTree, flattenDocxRevisions } from './docx-revisions.mjs';
15
- import { docxParagraphSpacing, docxRunFont, nextPageOffset, softBreakFacts, statedRunFont } from './portable-snapshot-shared.mjs';
15
+ import {
16
+ docxParagraphSpacing,
17
+ docxRunFont,
18
+ nextPageOffset,
19
+ softBreakFacts,
20
+ statedRunFont,
21
+ } from './portable-snapshot-shared.mjs';
16
22
 
17
23
  const REVISION_TYPES = Object.freeze({
18
24
  ins: 'insertion',
@@ -123,7 +123,12 @@ export function populatedCellPagination({ options, page, selectedSheets, sheets,
123
123
 
124
124
  export function statedRunFont(xml) {
125
125
  const direct = docxRunFont(xml);
126
- return direct.size || direct.bold || direct.name || direct.color || direct.caps !== undefined || direct.letterSpacing !== undefined
126
+ return direct.size ||
127
+ direct.bold ||
128
+ direct.name ||
129
+ direct.color ||
130
+ direct.caps !== undefined ||
131
+ direct.letterSpacing !== undefined
127
132
  ? { font: direct }
128
133
  : {};
129
134
  }
@@ -152,7 +152,13 @@ export async function reviewRenderedOfficePages(
152
152
  // The cover/title page is short by design, and a page followed by a deliberate forced break ends where the
153
153
  // author ended it.
154
154
  const endsBeforeForcedBreak = forcedBreaks?.has(metric.page + 1) === true;
155
- if (flowing && metric.page > 1 && !endsBeforeForcedBreak && metric.page < lastPage && metric.bodyEnd < PAGE_BODY_END_MIN) {
155
+ if (
156
+ flowing &&
157
+ metric.page > 1 &&
158
+ !endsBeforeForcedBreak &&
159
+ metric.page < lastPage &&
160
+ metric.bodyEnd < PAGE_BODY_END_MIN
161
+ ) {
156
162
  const empty = Math.round((1 - metric.bodyEnd) * 100);
157
163
  issues.push(
158
164
  issue(
@@ -166,7 +172,8 @@ export async function reviewRenderedOfficePages(
166
172
  continue;
167
173
  }
168
174
  // A short chapter is the author's: the page ends before a forced break, or it is the last page and opens with one.
169
- const deliberateShort = endsBeforeForcedBreak || (forcedBreaks?.has(metric.page) === true && metric.page >= lastPage);
175
+ const deliberateShort =
176
+ endsBeforeForcedBreak || (forcedBreaks?.has(metric.page) === true && metric.page >= lastPage);
170
177
  if (
171
178
  ['docx', 'pdf'].includes(normalized) &&
172
179
  metric.page > 1 &&
@@ -12,7 +12,9 @@ function paragraphSize(paragraph) {
12
12
  }
13
13
 
14
14
  const median = (values) => {
15
- const sorted = values.filter((value) => value !== '' && value !== undefined && value !== null).sort((left, right) => (left < right ? -1 : left > right ? 1 : 0));
15
+ const sorted = values
16
+ .filter((value) => value !== '' && value !== undefined && value !== null)
17
+ .sort((left, right) => (left < right ? -1 : left > right ? 1 : 0));
16
18
  return sorted.length ? sorted[Math.floor(sorted.length / 2)] : undefined;
17
19
  };
18
20
  // Automatic colour is the effective default, black.
@@ -233,7 +235,7 @@ function shortTableSplitIssues(tables, issues) {
233
235
  }
234
236
 
235
237
  // A total row is a total by its label; it reads as one only when it is set apart from the rows it sums.
236
- export const TOTAL_LABEL = /^(?:(?:grand\s+total|sub\s*total|total)\b|(?:합계|총계|소계|계)(?:\s|$))/i;
238
+ const TOTAL_LABEL = /^(?:(?:grand\s+total|sub\s*total|total)\b|(?:합계|총계|소계|계)(?:\s|$))/i;
237
239
  const FIGURE_TEXT = /^[\s+\-−₩$€¥]*[\d,.]+\s*(?:%|%p|[가-힣A-Za-z]{0,3})?\s*$/;
238
240
  const DISPLAY_SIZE = 18;
239
241
 
@@ -12,11 +12,7 @@ import {
12
12
  saturatedHueFamilies,
13
13
  } from '../design/design-discipline.mjs';
14
14
  import { authoredBackgroundLadder, isCardGridSlide, isOrnamentalStripe, slideSize } from './design-review-authored.mjs';
15
- import {
16
- reviewBriefPromises,
17
- reviewFactCoverage,
18
- reviewSourceGrounding,
19
- } from '../authoring/pptx-brief.mjs';
15
+ import { reviewBriefPromises, reviewFactCoverage, reviewSourceGrounding } from '../authoring/pptx-brief.mjs';
20
16
  import { isAdvisoryOfficeIssue } from './quality-pipeline.mjs';
21
17
  import { issue } from './assurance-issue.mjs';
22
18
  import { isPptxSpecimenSlide, isPptxStatementSlide } from './pptx-slide-roles.mjs';
@@ -1,11 +1,7 @@
1
1
  // A Word document or workbook held to its brief, as an authored deck is: every figure its words show has a fact with
2
2
  // a source, and a fact cites where a reader can open it. The brief is the deck's (`design.brief`, key: value lines);
3
3
  // the readings are the deck's own (pptx-brief.mjs), over the document's text instead of its slides.
4
- import {
5
- parseAuthoringBrief,
6
- reviewFactCoverage,
7
- reviewSourceGrounding,
8
- } from '../authoring/pptx-brief.mjs';
4
+ import { parseAuthoringBrief, reviewFactCoverage, reviewSourceGrounding } from '../authoring/pptx-brief.mjs';
9
5
  import { htmlBriefScript } from '../authoring/pptx-html-runner.mjs';
10
6
 
11
7
  /** The brief a docx/xlsx call names in design.brief (the HTML BRIEF's key: value lines), or null. */
@@ -25,9 +25,7 @@ const visibleText = (html) =>
25
25
 
26
26
  // A media query list reaches the printed page unless every query is screen-only.
27
27
  const appliesToPrint = (queries) =>
28
- queries
29
- .split(',')
30
- .some((query) => !/^\s*(?:only\s+)?screen\b/i.test(query) && !/^\s*not\s+print\b/i.test(query));
28
+ queries.split(',').some((query) => !/^\s*(?:only\s+)?screen\b/i.test(query) && !/^\s*not\s+print\b/i.test(query));
31
29
 
32
30
  // Style rules in source order, flattened out of @media blocks that do not apply in print.
33
31
  function cssRules(css, active, rules) {
@@ -38,7 +36,10 @@ function cssRules(css, active, rules) {
38
36
  let depth = 1;
39
37
  let close = open + 1;
40
38
  for (; close < css.length && depth > 0; close += 1) depth += css[close] === '{' ? 1 : css[close] === '}' ? -1 : 0;
41
- const head = css.slice(index, open).replace(/^(?:\s*@[^{;]*;)+/, '').trim();
39
+ const head = css
40
+ .slice(index, open)
41
+ .replace(/^(?:\s*@[^{;]*;)+/, '')
42
+ .trim();
42
43
  const inner = css.slice(open + 1, close - 1);
43
44
  if (/^@media\b/i.test(head)) cssRules(inner, active && appliesToPrint(head.slice(6)), rules);
44
45
  else if (active && head && !head.startsWith('@')) rules.push({ head, body: inner });
@@ -64,7 +65,8 @@ function breakDeclaration(body, rank) {
64
65
  }
65
66
 
66
67
  const beats = (a, b) => {
67
- for (let index = 0; index < a.rank.length; index += 1) if (a.rank[index] !== b.rank[index]) return a.rank[index] > b.rank[index];
68
+ for (let index = 0; index < a.rank.length; index += 1)
69
+ if (a.rank[index] !== b.rank[index]) return a.rank[index] > b.rank[index];
68
70
  return true;
69
71
  };
70
72
 
@@ -80,7 +82,8 @@ function breakSelectors(html) {
80
82
  const classes = match[3].split('.').filter(Boolean);
81
83
  const specificity = (match[2] ? 100 : 0) + classes.length * 10 + (match[1] ? 1 : 0);
82
84
  const declaration = breakDeclaration(body, [0, specificity, order]);
83
- if (declaration) selectors.push({ tag: (match[1] || '').toLowerCase(), id: match[2] || '', classes, declaration });
85
+ if (declaration)
86
+ selectors.push({ tag: (match[1] || '').toLowerCase(), id: match[2] || '', classes, declaration });
84
87
  }
85
88
  }
86
89
  }
@@ -289,7 +289,7 @@ const POLISH_GUIDANCE = Object.freeze({
289
289
  theme_background_drift:
290
290
  'Use only the ladder backgrounds (paper, paperAlt, dark, darkAlt); recolor the drifting slide.',
291
291
  theme_body_backgrounds:
292
- 'Advisory: body slides use several background colours; keep them to the concept\'s declared palette ladder, or declare the concept or palette in the brief when the colour fields are the design.',
292
+ "Advisory: body slides use several background colours; keep them to the concept's declared palette ladder, or declare the concept or palette in the brief when the colour fields are the design.",
293
293
  excessive_slide_text: "Cut the copy to the reading mode's budget (composition.md §4) or split the slide.",
294
294
  decorative_stripe: 'Remove the ornamental bar; a stripe that encodes nothing is decoration (composition.md §10).',
295
295
  // Visual critique contract (finalize).
@@ -12,9 +12,16 @@ export const DEFAULT_DISABLED_AGENT_IDS = Object.freeze([
12
12
  'writer',
13
13
  ]);
14
14
 
15
+ export const EXPLORE_AGENT_ID = 'explore';
16
+
15
17
  // The Maintainer also starts off: background upkeep spends model calls, so it
16
- // runs only once the user turns it on and picks its model.
17
- export const DEFAULT_DISABLED_AGENT_ROSTER = Object.freeze([...DEFAULT_DISABLED_AGENT_IDS, 'maintainer']);
18
+ // runs only once the user turns it on and picks its model. Explore likewise:
19
+ // its tool reaches the model only once the user picks its model.
20
+ export const DEFAULT_DISABLED_AGENT_ROSTER = Object.freeze([
21
+ ...DEFAULT_DISABLED_AGENT_IDS,
22
+ 'maintainer',
23
+ EXPLORE_AGENT_ID,
24
+ ]);
18
25
 
19
26
  /** The AGENT.md frontmatter `kind` the Workflows page writes when it creates
20
27
  * an agent: a workflow delegation role, never a contact (봇). */
@@ -149,6 +156,14 @@ export function configuredAgentRouteCandidates(config, agentId) {
149
156
  return route ? [route] : [];
150
157
  }
151
158
 
159
+ /** The explore tool runs only on Explore's own model (never Main) while it is on. */
160
+ export function exploreRouteConfigured(config) {
161
+ return (
162
+ !isAgentDisabled(config, EXPLORE_AGENT_ID) &&
163
+ configuredAgentRouteCandidates(config, EXPLORE_AGENT_ID).some(isCompleteAgentRoute)
164
+ );
165
+ }
166
+
152
167
  function canonicalizeAgentRoutes(config = {}) {
153
168
  const agents = Object.fromEntries(
154
169
  Object.entries(record(config.agents)).filter(([, route]) => isCompleteAgentRoute(route))