mixdog 1.4.1 → 1.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (630) hide show
  1. package/package.json +4 -3
  2. package/scripts/build-shipped-history.mjs +125 -33
  3. package/scripts/gate-local.mjs +220 -63
  4. package/scripts/graph-parity.mjs +8 -3
  5. package/scripts/lib/gate-scheduler.mjs +139 -32
  6. package/scripts/lib/gate-timing-reporter.mjs +16 -0
  7. package/scripts/lib/run-node-tests.mjs +71 -34
  8. package/scripts/lib/scoped-temp.mjs +1 -0
  9. package/scripts/lib/test-failure-records.mjs +14 -1
  10. package/scripts/lib/test-failure-summary.mjs +9 -4
  11. package/scripts/lib/test-spawn-ledger.mjs +43 -3
  12. package/scripts/post-release-check.mjs +26 -16
  13. package/scripts/pptx-kit-index.mjs +5 -6
  14. package/scripts/provider-pingpong-live.mjs +1 -1
  15. package/scripts/prune-embedding-runtime.mjs +3 -1
  16. package/scripts/release-paths.mjs +7 -1
  17. package/scripts/suite-health.mjs +110 -28
  18. package/scripts/test.mjs +9 -14
  19. package/src/agents/advisor/AGENT.md +4 -4
  20. package/src/agents/advisor/agent.json +1 -1
  21. package/src/agents/explore/AGENT.md +22 -0
  22. package/src/agents/explore/agent.json +6 -0
  23. package/src/cli.mjs +7 -0
  24. package/src/defaults/agents.json +7 -0
  25. package/src/defaults/shipped-history.json +38 -2
  26. package/src/defaults/skills/browser-use/SKILL.md +4 -1
  27. package/src/defaults/skills/code-tidy/SKILL.md +71 -102
  28. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +66 -114
  29. package/src/defaults/skills/code-tidy/references/cleanup-report.md +19 -35
  30. package/src/defaults/skills/code-tidy/references/dead-code.md +3 -9
  31. package/src/defaults/skills/code-tidy/references/test-suite-slop.md +16 -27
  32. package/src/defaults/skills/computer-use/SKILL.md +12 -2
  33. package/src/defaults/skills/setup/SKILL.md +2 -2
  34. package/src/defaults/skills/setup/references/actions.md +28 -9
  35. package/src/defaults/skills/setup/references/surfaces.md +5 -2
  36. package/src/defaults/skills/setup-guide/SKILL.md +11 -3
  37. package/src/defaults/skills/setup-guide/model-recommendations.json +13 -0
  38. package/src/defaults/skills/skill-creator/SKILL.md +85 -190
  39. package/src/defaults/skills/skill-creator/references/design.md +70 -162
  40. package/src/defaults/skills/skill-creator/references/evaluation.md +33 -92
  41. package/src/defaults/skills/test-suite/SKILL.md +194 -0
  42. package/src/defaults/skills/test-suite/references/case-management.md +51 -0
  43. package/src/defaults/skills/test-suite/references/flaky-policy.md +39 -0
  44. package/src/defaults/skills/test-suite/references/reliability.md +49 -0
  45. package/src/defaults/skills/test-suite/references/suite-design.md +78 -0
  46. package/src/defaults/skills/test-suite/scripts/inventory.mjs +335 -0
  47. package/src/defaults/skills/visualize/SKILL.md +6 -2
  48. package/src/lib/instruction-text.cjs +36 -0
  49. package/src/lib/rules-builder.cjs +40 -50
  50. package/src/orchestration/balanced.md +23 -0
  51. package/src/orchestration/focused.md +22 -0
  52. package/src/orchestration/none.md +5 -0
  53. package/src/orchestration/swarm.md +24 -0
  54. package/src/rules/agent-mode/AGENT_MODE.md +3 -1
  55. package/src/rules/agent-mode/MIXY.md +2 -2
  56. package/src/rules/lead/LEAD.md +3 -3
  57. package/src/rules/shared/20-research.md +3 -6
  58. package/src/rules/shared/40-editing.md +1 -0
  59. package/src/rules/shared/60-verification.md +10 -9
  60. package/src/rules/shared/70-delivery.md +4 -3
  61. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
  62. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +3 -3
  63. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -2
  64. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +132 -21
  65. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -9
  66. package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +2 -2
  67. package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
  68. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +67 -0
  69. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
  70. package/src/runtime/agent/orchestrator/config.mjs +12 -7
  71. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +7 -7
  72. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +9 -30
  73. package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
  74. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +124 -12
  75. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +204 -49
  76. package/src/runtime/agent/orchestrator/mcp/client-config.mjs +16 -7
  77. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +157 -57
  78. package/src/runtime/agent/orchestrator/mcp/client.mjs +54 -23
  79. package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +1 -1
  80. package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +8 -2
  81. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +83 -52
  82. package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +1 -1
  83. package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +14 -0
  84. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +43 -27
  85. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +43 -8
  86. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +30 -28
  87. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  88. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +31 -21
  89. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-stop.mjs +3 -3
  90. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +3 -1
  91. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -2
  92. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  93. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
  94. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +40 -0
  95. package/src/runtime/agent/orchestrator/providers/custom-provider-keys.mjs +34 -0
  96. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +3 -0
  97. package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +14 -7
  98. package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +3 -2
  99. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
  100. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -1
  101. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +2 -2
  102. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +48 -31
  103. package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +0 -18
  104. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +138 -6
  105. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +1 -1
  106. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +100 -33
  107. package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +1 -1
  108. package/src/runtime/agent/orchestrator/providers/oauth-secret-fields.fixtures.mjs +45 -0
  109. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +4 -6
  110. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2784 -2872
  111. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +5 -8
  112. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +26 -28
  113. package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +288 -300
  114. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +3 -1
  115. package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +1 -0
  116. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +1 -1
  117. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +3 -1
  118. package/src/runtime/agent/orchestrator/providers/registry.mjs +33 -2
  119. package/src/runtime/agent/orchestrator/providers/vertex-ai-auth.mjs +622 -0
  120. package/src/runtime/agent/orchestrator/providers/vertex-ai-maas.mjs +185 -0
  121. package/src/runtime/agent/orchestrator/providers/vertex-ai-models.mjs +445 -0
  122. package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +576 -0
  123. package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +10 -30
  124. package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +32 -0
  125. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +0 -11
  126. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +8 -0
  127. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +17 -3
  128. package/src/runtime/agent/orchestrator/runtime-core/goal-control.mjs +47 -27
  129. package/src/runtime/agent/orchestrator/runtime-core/goal-deadlines.mjs +141 -10
  130. package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +26 -63
  131. package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +28 -3
  132. package/src/runtime/agent/orchestrator/runtime-core/goal-runtime.mjs +36 -11
  133. package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +88 -56
  134. package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +4 -1
  135. package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +51 -32
  136. package/src/runtime/agent/orchestrator/runtime-core/goal-text.mjs +45 -145
  137. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +15 -98
  138. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +32 -99
  139. package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +23 -78
  140. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +69 -47
  141. package/src/runtime/agent/orchestrator/runtime-core/todo-list.mjs +367 -0
  142. package/src/runtime/agent/orchestrator/runtime-core/todo-tool-defs.mjs +47 -0
  143. package/src/runtime/agent/orchestrator/runtime-core/tool-availability.mjs +155 -0
  144. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +12 -0
  145. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +119 -35
  146. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +4 -1
  147. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +15 -6
  148. package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
  149. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +28 -22
  150. package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +30 -0
  151. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +30 -5
  152. package/src/runtime/agent/orchestrator/session/agent-room.mjs +171 -37
  153. package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +1 -1
  154. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +94 -10
  155. package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -2
  156. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +1 -1
  157. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -1
  158. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +3 -0
  159. package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +1 -1
  160. package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -12
  161. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +4 -4
  162. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +11 -6
  163. package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +6 -6
  164. package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +7 -3
  165. package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +11 -1
  166. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
  167. package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +1 -1
  168. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +37 -8
  169. package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +1 -1
  170. package/src/runtime/agent/orchestrator/session/image-strip-recovery.mjs +1 -1
  171. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +11 -1
  172. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +1 -1
  173. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +5 -3
  174. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +8 -1
  175. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/todo-check.mjs +196 -0
  176. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +116 -50
  177. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +8 -1
  178. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +1 -1
  179. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +1 -1
  180. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -1
  181. package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +5 -6
  182. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +27 -3
  183. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +18 -2
  184. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
  185. package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
  186. package/src/runtime/agent/orchestrator/session/loop/turn-report.mjs +35 -0
  187. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +1 -1
  188. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +103 -50
  189. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +9 -7
  190. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +21 -3
  191. package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +27 -11
  192. package/src/runtime/agent/orchestrator/session/manager/ask-turn-open.mjs +37 -34
  193. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +15 -0
  194. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +25 -15
  195. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +79 -24
  196. package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +3 -0
  197. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +12 -1
  198. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
  199. package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +6 -1
  200. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +9 -1
  201. package/src/runtime/agent/orchestrator/session/manager/pending-spool-path.mjs +2 -2
  202. package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +1 -1
  203. package/src/runtime/agent/orchestrator/session/manager/prompt-settings.mjs +598 -0
  204. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +20 -0
  205. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +22 -14
  206. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +2 -0
  207. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +12 -0
  208. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
  209. package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +1 -1
  210. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +56 -14
  211. package/src/runtime/agent/orchestrator/session/manager/session-lock.mjs +31 -0
  212. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +59 -20
  213. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +2 -0
  214. package/src/runtime/agent/orchestrator/session/manager/session-scratch-environment.mjs +70 -0
  215. package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +0 -3
  216. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +18 -4
  217. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +8 -9
  218. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +339 -88
  219. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +135 -11
  220. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +377 -104
  221. package/src/runtime/agent/orchestrator/session/manager/turn-durability.mjs +144 -0
  222. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +48 -30
  223. package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
  224. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +4 -0
  225. package/src/runtime/agent/orchestrator/session/manager.mjs +6 -0
  226. package/src/runtime/agent/orchestrator/session/mixy-name.mjs +12 -6
  227. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +8 -1
  228. package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +1 -1
  229. package/src/runtime/agent/orchestrator/session/save-session-worker.mjs +5 -1
  230. package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +1 -1
  231. package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +2 -2
  232. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +23 -2
  233. package/src/runtime/agent/orchestrator/session/store/sweep/sub-agent-retention.mjs +3 -3
  234. package/src/runtime/agent/orchestrator/session/store/transcript-durability.mjs +88 -0
  235. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +5 -0
  236. package/src/runtime/agent/orchestrator/session/store-summary-log.mjs +1 -1
  237. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +243 -38
  238. package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
  239. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +177 -8
  240. package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
  241. package/src/runtime/agent/orchestrator/session/store.mjs +5 -0
  242. package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +7 -1
  243. package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +9 -1
  244. package/src/runtime/agent/orchestrator/session/transcript-restore/agent-envelope.mjs +1 -1
  245. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +3 -1
  246. package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +2 -2
  247. package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -5
  248. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -1
  249. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
  250. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +21 -3
  251. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
  252. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/worktree-add-guard.mjs +77 -0
  253. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -1
  254. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +42 -28
  255. package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +30 -14
  256. package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +2 -2
  257. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
  258. package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +1 -1
  259. package/src/runtime/agent/orchestrator/tools/builtin/read-single-fast-paths.mjs +0 -1
  260. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +20 -15
  261. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +0 -10
  262. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +95 -20
  263. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
  264. package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -24
  265. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary/child-kill.mjs +4 -3
  266. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +1 -2
  267. package/src/runtime/agent/orchestrator/tools/code-graph/modes/calls.mjs +1 -1
  268. package/src/runtime/agent/orchestrator/tools/code-graph/modes/symbols.mjs +2 -2
  269. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +4 -5
  270. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +3 -4
  271. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4 -22
  272. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  273. package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +99 -2
  274. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +2 -0
  275. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +105 -15
  276. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +3 -1
  277. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +49 -15
  278. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +45 -27
  279. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +35 -11
  280. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +2 -0
  281. package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
  282. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -6
  283. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +0 -1
  284. package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
  285. package/src/runtime/attachments/attachment-reference.mjs +1 -1
  286. package/src/runtime/attachments/pdf-extract.mjs +1 -1
  287. package/src/runtime/attachments/store.d.mts +1 -0
  288. package/src/runtime/attachments/store.mjs +2 -2
  289. package/src/runtime/channels/lib/config-reload-watch.mjs +42 -0
  290. package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +29 -9
  291. package/src/runtime/channels/lib/scheduler.mjs +33 -0
  292. package/src/runtime/channels/lib/schedules-db.mjs +11 -4
  293. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +4 -1
  294. package/src/runtime/channels/lib/webhooks-db.mjs +9 -3
  295. package/src/runtime/channels/lib/whisper-port.mjs +19 -10
  296. package/src/runtime/channels/lib/whisper-server.mjs +22 -13
  297. package/src/runtime/channels/lib/worker-main.mjs +9 -31
  298. package/src/runtime/computer-bridge/linux-readiness.mjs +10 -14
  299. package/src/runtime/connectors/connector-accounts-mcp.mjs +372 -103
  300. package/src/runtime/connectors/gmail-app-password.mjs +4 -4
  301. package/src/runtime/connectors/google-mcp.mjs +1 -1
  302. package/src/runtime/effort-judge/judge-client.mjs +2 -2
  303. package/src/runtime/effort-judge/judge-input.mjs +4 -4
  304. package/src/runtime/explore/explorer.mjs +88 -0
  305. package/src/runtime/explore/tool-defs.mjs +35 -0
  306. package/src/runtime/explore/tool.mjs +123 -0
  307. package/src/runtime/local-provider/hardware.mjs +1 -1
  308. package/src/runtime/media/adapters/codex-image.mjs +3 -3
  309. package/src/runtime/media/adapters/gemini-video.mjs +1 -1
  310. package/src/runtime/media/media-usage.mjs +1 -1
  311. package/src/runtime/media/store.mjs +1 -1
  312. package/src/runtime/memory/index.mjs +15 -1
  313. package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
  314. package/src/runtime/memory/lib/embedding-reindex.mjs +27 -0
  315. package/src/runtime/memory/lib/embedding-worker.mjs +4 -0
  316. package/src/runtime/memory/lib/memory-embed.mjs +83 -14
  317. package/src/runtime/memory/lib/memory-process-lock.mjs +159 -36
  318. package/src/runtime/memory/lib/memory-text-utils.mjs +6 -1
  319. package/src/runtime/memory/lib/memory.mjs +17 -0
  320. package/src/runtime/memory/lib/pg/process.mjs +1 -1
  321. package/src/runtime/memory/lib/pg/supervisor.mjs +16 -96
  322. package/src/runtime/memory/lib/recall-hybrid/hybrid-sql.mjs +12 -3
  323. package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
  324. package/src/runtime/office/authoring/pptx-author-action.mjs +1 -1
  325. package/src/runtime/office/authoring/xlsx-html-build.mjs +1 -1
  326. package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
  327. package/src/runtime/office/capabilities.mjs +1 -1
  328. package/src/runtime/office/core/office-core.mjs +1 -1
  329. package/src/runtime/office/design/content-model.mjs +3 -3
  330. package/src/runtime/office/design/docx/design-docx/section.mjs +6 -6
  331. package/src/runtime/office/design/xlsx/design-xlsx-components.mjs +1 -1
  332. package/src/runtime/office/design/xlsx/design-xlsx.mjs +1 -1
  333. package/src/runtime/office/pdf/ocr-engine.mjs +1 -1
  334. package/src/runtime/office/pdf/pdf-writer.mjs +4 -4
  335. package/src/runtime/office/portable/portable-docx-operations.mjs +2 -2
  336. package/src/runtime/office/portable/portable-soffice.mjs +8 -6
  337. package/src/runtime/office/portable/xlsx-contract.mjs +1 -1
  338. package/src/runtime/office/quality/assurance-structure-docx.mjs +1 -1
  339. package/src/runtime/shared/agent-route-config.mjs +17 -2
  340. package/src/runtime/shared/atomic-file.d.mts +8 -0
  341. package/src/runtime/shared/atomic-file.mjs +103 -2
  342. package/src/runtime/shared/background-tasks.mjs +37 -10
  343. package/src/runtime/shared/background-wait.mjs +66 -0
  344. package/src/runtime/shared/child-guardian.mjs +17 -7
  345. package/src/runtime/shared/config.mjs +313 -16
  346. package/src/runtime/shared/connector-accounts.mjs +5 -5
  347. package/src/runtime/shared/connector-catalog.d.mts +14 -8
  348. package/src/runtime/shared/connector-catalog.mjs +70 -52
  349. package/src/runtime/shared/custom-provider-keys.mjs +20 -0
  350. package/src/runtime/shared/file-has-data.mjs +26 -2
  351. package/src/runtime/shared/file-lock.mjs +21 -18
  352. package/src/runtime/shared/git-launch.d.mts +9 -0
  353. package/src/runtime/shared/git-launch.mjs +213 -0
  354. package/src/runtime/shared/git-runner-worker.mjs +2 -1
  355. package/src/runtime/shared/git-runner.mjs +7 -2
  356. package/src/runtime/shared/idle-gc.mjs +30 -7
  357. package/src/runtime/shared/llm/cost.mjs +6 -1
  358. package/src/runtime/shared/llm/http-agent.mjs +316 -29
  359. package/src/runtime/shared/llm/model-catalog-projection.mjs +3 -2
  360. package/src/runtime/shared/llm/model-catalog.mjs +46 -6
  361. package/src/runtime/shared/llm/provider-catalog-registry.mjs +3 -0
  362. package/src/runtime/shared/llm/system-proxy.mjs +453 -0
  363. package/src/runtime/shared/llm/usage-ledger-quota.mjs +31 -12
  364. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +84 -8
  365. package/src/runtime/shared/llm/usage-ledger.mjs +3 -0
  366. package/src/runtime/shared/llm/usage-rollup.mjs +48 -0
  367. package/src/runtime/shared/maintenance-schedule.mjs +109 -0
  368. package/src/runtime/shared/process-runner.mjs +8 -4
  369. package/src/runtime/shared/provider-accounts.mjs +52 -2
  370. package/src/runtime/shared/routine-trigger.d.mts +13 -0
  371. package/src/runtime/shared/routine-trigger.mjs +34 -0
  372. package/src/runtime/shared/run-child.d.mts +2 -1
  373. package/src/runtime/shared/run-child.mjs +70 -18
  374. package/src/runtime/shared/session-scratch.mjs +14 -2
  375. package/src/runtime/shared/shipped-definitions.mjs +7 -1
  376. package/src/runtime/shared/staged-install-worker.mjs +5 -0
  377. package/src/runtime/shared/staged-update.mjs +47 -2
  378. package/src/runtime/shared/tool-card-model.golden.json +3 -12
  379. package/src/runtime/shared/tool-execution-contract.mjs +2 -0
  380. package/src/runtime/shared/tool-surface.mjs +110 -36
  381. package/src/runtime/shared/tool-work-units.mjs +35 -6
  382. package/src/runtime/shared/turn-snapshot.mjs +26 -4
  383. package/src/runtime/shared/turn-worktree-snapshot.mjs +409 -54
  384. package/src/runtime/shared/worker-requests.mjs +17 -3
  385. package/src/runtime/shared/worktrees/activity-gate.mjs +215 -318
  386. package/src/runtime/shared/worktrees/activity-ledger-worker.mjs +56 -0
  387. package/src/runtime/shared/worktrees/activity-ledger.mjs +391 -0
  388. package/src/runtime/shared/worktrees/branch-management.mjs +5 -3
  389. package/src/runtime/shared/worktrees/contract.mjs +16 -6
  390. package/src/runtime/shared/worktrees/dependencies.mjs +127 -89
  391. package/src/runtime/shared/worktrees/disk.mjs +79 -2
  392. package/src/runtime/shared/worktrees/git.mjs +97 -7
  393. package/src/runtime/shared/worktrees/include.mjs +6 -4
  394. package/src/runtime/shared/worktrees/maintenance.mjs +422 -30
  395. package/src/runtime/shared/worktrees/manager.mjs +962 -197
  396. package/src/runtime/shared/worktrees/settings.mjs +33 -7
  397. package/src/runtime/shared/worktrees/test-support.mjs +5 -1
  398. package/src/runtime/shared/worktrees/worker-snapshots.mjs +82 -0
  399. package/src/runtime/tidy/install.mjs +95 -15
  400. package/src/runtime/tidy/languages.mjs +17 -15
  401. package/src/runtime/tidy/process.mjs +9 -5
  402. package/src/runtime/tidy/resolve.mjs +19 -16
  403. package/src/runtime/tidy/runners/biome.mjs +3 -3
  404. package/src/runtime/tidy/tool.mjs +1 -1
  405. package/src/runtime/tidy/worktree.mjs +10 -6
  406. package/src/runtime/visualize-bridge/client.mjs +4 -1
  407. package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
  408. package/src/runtime/web-search/index.mjs +4 -23
  409. package/src/runtime/web-search/lib/web-tools.mjs +2 -2
  410. package/src/runtime/web-search/tool-defs.mjs +17 -26
  411. package/src/session-runtime/agent-profile-changes.mjs +55 -4
  412. package/src/session-runtime/agent-task-sessions.mjs +410 -353
  413. package/src/session-runtime/boot/apis.mjs +27 -4
  414. package/src/session-runtime/boot/begin.mjs +2 -0
  415. package/src/session-runtime/boot/config.mjs +10 -1
  416. package/src/session-runtime/boot/facade.mjs +1 -0
  417. package/src/session-runtime/boot/providers.mjs +70 -3
  418. package/src/session-runtime/boot/session.mjs +2 -0
  419. package/src/session-runtime/boot/tools.mjs +71 -25
  420. package/src/session-runtime/bot-status.mjs +103 -103
  421. package/src/session-runtime/channel-config-api.mjs +1 -0
  422. package/src/session-runtime/config-change-effects.mjs +179 -0
  423. package/src/session-runtime/config-lifecycle/config-writers.mjs +1 -0
  424. package/src/session-runtime/config-lifecycle.mjs +160 -24
  425. package/src/session-runtime/connector-merge-migration.mjs +18 -15
  426. package/src/session-runtime/conversation-import/discovery.mjs +245 -47
  427. package/src/session-runtime/conversation-import/service.mjs +12 -5
  428. package/src/session-runtime/goal-facade-api.mjs +49 -3
  429. package/src/session-runtime/handoff-attachments.mjs +1 -1
  430. package/src/session-runtime/held-requests.mjs +3 -1
  431. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +3 -0
  432. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -2
  433. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +5 -11
  434. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
  435. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +161 -120
  436. package/src/session-runtime/internal-tool-executor.mjs +12 -19
  437. package/src/session-runtime/lifecycle/cold-heir.mjs +7 -0
  438. package/src/session-runtime/lifecycle/memory-ingest.mjs +3 -3
  439. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +53 -5
  440. package/src/session-runtime/lifecycle/session-switch.mjs +13 -2
  441. package/src/session-runtime/lifecycle/teardown/session-close.mjs +10 -5
  442. package/src/session-runtime/lifecycle/teardown.mjs +1 -1
  443. package/src/session-runtime/lifecycle-api.mjs +1 -0
  444. package/src/session-runtime/mcp-glue/server-catalog.mjs +27 -10
  445. package/src/session-runtime/mcp-glue/server-connection.mjs +34 -8
  446. package/src/session-runtime/mcp-glue/server-input.mjs +4 -1
  447. package/src/session-runtime/mixy-heartbeat.mjs +1 -1
  448. package/src/session-runtime/model-route/set-route.mjs +40 -7
  449. package/src/session-runtime/native-web-search/routes.mjs +3 -3
  450. package/src/session-runtime/provider-auth/login.mjs +2 -2
  451. package/src/session-runtime/provider-auth/refresh.mjs +6 -3
  452. package/src/session-runtime/provider-auth/setup.mjs +1 -1
  453. package/src/session-runtime/provider-readiness.mjs +53 -4
  454. package/src/session-runtime/resource-api.mjs +1 -1
  455. package/src/session-runtime/resource-extension-sync.mjs +4 -8
  456. package/src/session-runtime/resource-mcp-api.mjs +98 -35
  457. package/src/session-runtime/resource-mcp-connector-accounts.mjs +49 -32
  458. package/src/session-runtime/resource-mcp-secrets.mjs +27 -10
  459. package/src/session-runtime/resource-mcp-servers.mjs +5 -4
  460. package/src/session-runtime/resource-plugins-api.mjs +4 -0
  461. package/src/session-runtime/routine-executor.mjs +152 -0
  462. package/src/session-runtime/routine-home-turn.mjs +46 -5
  463. package/src/session-runtime/runtime-facade.mjs +5 -0
  464. package/src/session-runtime/runtime-feature-gates.mjs +2 -11
  465. package/src/session-runtime/schedule-session-run.mjs +1 -0
  466. package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +6 -1
  467. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +7 -0
  468. package/src/session-runtime/services/agent-tool/send-flow.mjs +120 -8
  469. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +12 -0
  470. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +5 -0
  471. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +8 -3
  472. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +28 -7
  473. package/src/session-runtime/services/agent-tool.mjs +51 -1
  474. package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
  475. package/src/session-runtime/services/channel-admin.mjs +18 -0
  476. package/src/session-runtime/services/channel-worker/daemon-spawn.mjs +2 -0
  477. package/src/session-runtime/services/daemon-candidate.mjs +4 -1
  478. package/src/session-runtime/services/hook-bus/command-handler.mjs +7 -11
  479. package/src/session-runtime/services/memory-runtime-proxy/daemon-spawn.mjs +4 -0
  480. package/src/session-runtime/services/plugin-admin.mjs +14 -6
  481. package/src/session-runtime/services/provider-admin.mjs +281 -10
  482. package/src/session-runtime/services/seeds.mjs +7 -0
  483. package/src/session-runtime/services/usage-stats-model.mjs +32 -11
  484. package/src/session-runtime/session-create/materialize.mjs +4 -2
  485. package/src/session-runtime/session-create/session-options.mjs +2 -0
  486. package/src/session-runtime/session-turn-api.mjs +2 -0
  487. package/src/session-runtime/settings-builtin-tools-api.mjs +5 -10
  488. package/src/session-runtime/settings-system-api.mjs +1 -1
  489. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +13 -3
  490. package/src/session-runtime/setup-tool/connector-widen-approval.mjs +96 -0
  491. package/src/session-runtime/setup-tool/executor.mjs +14 -3
  492. package/src/session-runtime/setup-tool/extended-actions.mjs +2 -0
  493. package/src/session-runtime/setup-tool/settings-contract.mjs +28 -0
  494. package/src/session-runtime/setup-tool/tool-defs.mjs +28 -2
  495. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +40 -43
  496. package/src/session-runtime/tool-policy/mode-switch.mjs +1 -1
  497. package/src/session-runtime/tool-policy/policy-stage.mjs +106 -8
  498. package/src/session-runtime/tool-policy/workflow-overlay.mjs +2 -1
  499. package/src/session-runtime/tool-policy-refresh.mjs +182 -5
  500. package/src/session-runtime/tool-surface.mjs +38 -1
  501. package/src/session-runtime/turn/agent-ops.mjs +33 -2
  502. package/src/session-runtime/turn/session-ops.mjs +2 -0
  503. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +5 -0
  504. package/src/session-runtime/turn/turn-run.mjs +1 -1
  505. package/src/session-runtime/webhook-session-run.mjs +2 -0
  506. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +46 -11
  507. package/src/session-runtime/workflow-agents-api/agent-route.mjs +2 -0
  508. package/src/session-runtime/workflow-agents-api/instruction-files.mjs +165 -0
  509. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +5 -4
  510. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +2 -3
  511. package/src/session-runtime/workflow-agents-api.mjs +2 -0
  512. package/src/session-runtime/workspace/activity-guards.mjs +176 -0
  513. package/src/session-runtime/workspace/project-branches.mjs +1 -1
  514. package/src/session-runtime/workspace/session-view.mjs +149 -0
  515. package/src/session-runtime/workspace/side-checkouts.mjs +203 -0
  516. package/src/session-runtime/workspace/transition-runner.mjs +188 -0
  517. package/src/session-runtime/workspace/transitions.mjs +128 -1070
  518. package/src/session-runtime/workspace/workspace-merge.mjs +132 -0
  519. package/src/session-runtime/workspace/worktree-intents.mjs +242 -0
  520. package/src/session-runtime/workspace/worktree-maintenance.mjs +200 -0
  521. package/src/session-runtime/workspace/worktree-setup.mjs +97 -0
  522. package/src/session-runtime/workspace/worktree-tool.mjs +70 -54
  523. package/src/standalone/daemon-agent-control.mjs +25 -8
  524. package/src/standalone/daemon-desktop-runtime.mjs +8 -2
  525. package/src/standalone/daemon-lag-profiler.mjs +7 -7
  526. package/src/standalone/daemon-session-control.mjs +151 -136
  527. package/src/standalone/daemon.mjs +61 -2
  528. package/src/standalone/desktop-service-registry.mjs +9 -0
  529. package/src/standalone/local-session-runtime.mjs +21 -1
  530. package/src/standalone/session-client/daemon-unavailable.mjs +4 -1
  531. package/src/standalone/session-client.mjs +5 -1
  532. package/src/standalone/session-frame-stream.mjs +83 -11
  533. package/src/standalone/session-protocol.mjs +15 -0
  534. package/src/standalone/session-service/agent-route-follow.mjs +23 -20
  535. package/src/standalone/session-service/agent-tree/agent-turns.mjs +18 -6
  536. package/src/standalone/session-service/agent-tree.mjs +45 -9
  537. package/src/standalone/session-service/projection/transcript-window.mjs +700 -64
  538. package/src/standalone/session-service/quota-resume.mjs +9 -0
  539. package/src/standalone/session-service/session-calls/session-action.mjs +51 -1
  540. package/src/standalone/session-service/session-calls/session-turns.mjs +37 -18
  541. package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
  542. package/src/standalone/session-service/session-calls/turn-gate.mjs +34 -0
  543. package/src/standalone/session-service/session-calls.mjs +2 -1
  544. package/src/standalone/session-service/stored-reader.mjs +127 -40
  545. package/src/tui/App.jsx +162 -164
  546. package/src/tui/app/app-view/floating-panel.jsx +3 -0
  547. package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
  548. package/src/tui/app/clipboard.mjs +22 -11
  549. package/src/tui/app/create-app-pickers.mjs +2 -0
  550. package/src/tui/app/doctor.mjs +2 -2
  551. package/src/tui/app/panel-signature.mjs +1 -1
  552. package/src/tui/app/prompt-handlers/use-prompt-history-nav.mjs +1 -1
  553. package/src/tui/app/prompt-handlers/use-prompt-interrupt.mjs +3 -0
  554. package/src/tui/app/prompt-submit/provider-prompts.mjs +3 -1
  555. package/src/tui/app/provider-setup/api-key-actions.mjs +31 -1
  556. package/src/tui/app/provider-setup/oauth-actions.mjs +25 -6
  557. package/src/tui/app/provider-setup-picker.mjs +20 -13
  558. package/src/tui/app/settings-picker.mjs +53 -8
  559. package/src/tui/app/shell-layout/row-budgets.mjs +14 -12
  560. package/src/tui/app/slash-commands.mjs +2 -1
  561. package/src/tui/app/slash-dispatch/route-commands.mjs +1 -1
  562. package/src/tui/app/slash-dispatch/session-commands.mjs +47 -1
  563. package/src/tui/app/slash-dispatch.mjs +1 -1
  564. package/src/tui/app/use-btw-panel.mjs +29 -0
  565. package/src/tui/app/use-context-panel-refresh.mjs +31 -0
  566. package/src/tui/app/use-model-catalog-cache.mjs +13 -10
  567. package/src/tui/app/use-mouse-input.mjs +11 -0
  568. package/src/tui/app/use-onboarding-start.mjs +8 -3
  569. package/src/tui/app/use-panel-transition.mjs +10 -1
  570. package/src/tui/app/use-pasted-buffers.mjs +28 -20
  571. package/src/tui/app/use-prompt-draft-flow.mjs +7 -0
  572. package/src/tui/app/use-prompt-layout-rows.mjs +3 -3
  573. package/src/tui/app/use-prompt-queue-history.mjs +5 -4
  574. package/src/tui/app/use-selection-focus.mjs +11 -2
  575. package/src/tui/app/use-selection-geometry.mjs +18 -9
  576. package/src/tui/app/use-selection-paint.mjs +4 -4
  577. package/src/tui/app/use-selection-stitch.mjs +3 -3
  578. package/src/tui/app/use-slash-palette.mjs +62 -0
  579. package/src/tui/app/use-terminal-chrome.mjs +2 -2
  580. package/src/tui/app/use-transcript-activity.mjs +48 -33
  581. package/src/tui/app/use-transcript-follow.mjs +12 -4
  582. package/src/tui/app/use-transcript-scroll.mjs +46 -17
  583. package/src/tui/app/use-transcript-swap-reset.mjs +27 -0
  584. package/src/tui/app/use-transcript-window/geometry.mjs +20 -6
  585. package/src/tui/app/use-transcript-window/instance-state.mjs +4 -0
  586. package/src/tui/app/use-transcript-window/selection-shift.mjs +5 -1
  587. package/src/tui/app/use-transcript-window.mjs +21 -11
  588. package/src/tui/app/use-tui-ready.mjs +18 -0
  589. package/src/tui/app/use-welcome-prompt-hint.mjs +5 -0
  590. package/src/tui/app/use-workflow-tab-cycle.mjs +5 -3
  591. package/src/tui/components/Picker.jsx +27 -3
  592. package/src/tui/components/SignInUrl.jsx +68 -0
  593. package/src/tui/components/TextEntryPanel.jsx +76 -46
  594. package/src/tui/components/prompt-input/escape-policy.d.mts +0 -1
  595. package/src/tui/components/prompt-input/escape-policy.mjs +1 -1
  596. package/src/tui/components/question-panel-model.mjs +4 -4
  597. package/src/tui/components/sign-in-url-layout.mjs +24 -0
  598. package/src/tui/components/tool-execution/standard-card.jsx +3 -4
  599. package/src/tui/components/user-message-skills.mjs +1 -1
  600. package/src/tui/dist/index.mjs +2205 -1371
  601. package/src/tui/markdown/render-ansi.mjs +1 -1
  602. package/src/tui/session/agent-job-feed/notification-router.mjs +10 -0
  603. package/src/tui/session/agent-job-feed.mjs +2 -0
  604. package/src/tui/session/context-state.mjs +3 -0
  605. package/src/tui/session/goal-turn-state.mjs +6 -2
  606. package/src/tui/session/quota-resume.mjs +1 -1
  607. package/src/tui/session/session-api/controls.mjs +4 -0
  608. package/src/tui/session/session-api/extensions.mjs +8 -0
  609. package/src/tui/session/session-api/intake/abort.mjs +2 -1
  610. package/src/tui/session/session-api/intake.mjs +2 -0
  611. package/src/tui/session/session-api/integrations.mjs +2 -2
  612. package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
  613. package/src/tui/session/session-api/lifecycle/session-reset.mjs +7 -0
  614. package/src/tui/session/session-api/routes-agent-definitions.mjs +6 -0
  615. package/src/tui/session/session-api/settings.mjs +2 -2
  616. package/src/tui/session/session-api/worktree.mjs +13 -1
  617. package/src/tui/session/session-flow/drain.mjs +11 -14
  618. package/src/tui/session/tool-card-results/grouped-result.mjs +2 -2
  619. package/src/tui/session/transcript-spill/spill-writer.mjs +15 -0
  620. package/src/tui/session/transcript-spill.mjs +92 -4
  621. package/src/tui/session/transcript-store.mjs +2 -0
  622. package/src/tui/session/turn-quiet.mjs +1 -1
  623. package/src/tui/session/turn.mjs +3 -0
  624. package/src/tui/session/worktree-setup-notice.mjs +1 -1
  625. package/src/tui/spinner-meta.mjs +3 -3
  626. package/src/tui/spinner-verbs.mjs +2 -2
  627. package/src/defaults/skills/goal-management/SKILL.md +0 -169
  628. package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
  629. package/src/runtime/agent/orchestrator/runtime-core/goal-tasks.mjs +0 -156
  630. package/src/session-runtime/goal-tasks.mjs +0 -1
@@ -0,0 +1,88 @@
1
+ // One explorer: the agent loop driven directly with one fixed system prompt
2
+ // and the read-only filesystem tools — no session record, rules, skills,
3
+ // profile context or persistence.
4
+ import { agentLoop } from '../agent/orchestrator/session/agent-loop.mjs';
5
+ import { readOnlyFilesystemTools } from '../agent/orchestrator/session/manager/tool-resolution.mjs';
6
+ import { sharedPrefixProviderCacheOpts } from '../agent/orchestrator/agent-runtime/cache-strategy.mjs';
7
+ import { partialHandoffTextFromSession } from '../agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs';
8
+
9
+ // Tool-calling responses before the explorer must answer from what it has.
10
+ export const EXPLORER_MAX_TOOL_ROUNDS = 10;
11
+
12
+ export const EXPLORER_SYSTEM_PROMPT = [
13
+ 'You explore the working directory read-only to answer one question. You cannot edit, run commands or delegate.',
14
+ '',
15
+ 'Search:',
16
+ `- You have ${EXPLORER_MAX_TOOL_ROUNDS} tool rounds: batch independent searches in one turn (parallel calls or array arguments).`,
17
+ "- Search the question's own nouns, and match the subsystem it names, not a similarly named one.",
18
+ '- Locate first, then read only that window.',
19
+ '- A location a tool returned is final; never reconfirm it.',
20
+ '- Before answering, list the parts the question asks about; each needs its own tool-returned `path:line`.',
21
+ '- Cite implementation, not tests, docs or changelogs, unless asked.',
22
+ '- A part without a `path:line`: search again with different terms, or use `code_graph` on a found symbol (definition, callers, writers). Call it missing only after that search, and name what you searched.',
23
+ '- Stop once every part has its location.',
24
+ '',
25
+ 'Answer shape, hard limit 1,500 characters, nothing else:',
26
+ '- One short answer line.',
27
+ '- One evidence line per hop of each part (entry, callee, writer, reader), at most 10 lines: `path:line` from tool output, the exact function or symbol name there, a few words.',
28
+ '- No intro, summary, extra locations, notes about unread code or "Open:" lines.',
29
+ ].join('\n');
30
+
31
+ // One list for the process: identical schema bytes for every explorer.
32
+ const EXPLORER_TOOLS = readOnlyFilesystemTools();
33
+ export const EXPLORER_TOOL_NAMES = Object.freeze(EXPLORER_TOOLS.map((tool) => tool.name));
34
+
35
+ /**
36
+ * Answer `query` on `route` with `provider`. Resolves the answer text (on a
37
+ * salvage-flagged abort, the text written so far); rejects on failure.
38
+ */
39
+ export async function runExplorer({ query, route, provider, cwd = null, signal, ownerSessionId = null }) {
40
+ const tools = EXPLORER_TOOLS.slice();
41
+ const messages = [
42
+ { role: 'system', content: EXPLORER_SYSTEM_PROMPT },
43
+ { role: 'user', content: query },
44
+ ];
45
+ // In-memory policy only: the schema allowlist is also the execution
46
+ // allowlist (pre-dispatch-deny.mjs), and the owner ids attribute spend in
47
+ // the usage ledger. No session id, so nothing session-keyed is created.
48
+ const policy = {
49
+ provider: route.provider,
50
+ model: route.model,
51
+ cwd,
52
+ tools,
53
+ schemaAllowedTools: EXPLORER_TOOL_NAMES,
54
+ compaction: { auto: false },
55
+ ownerSessionId,
56
+ parentSessionId: ownerSessionId,
57
+ };
58
+ // Text of the request in flight, for salvage when the deadline cuts it.
59
+ let streamed = '';
60
+ try {
61
+ const response = await agentLoop(provider, messages, route.model, tools, null, cwd, {
62
+ signal,
63
+ session: policy,
64
+ ...(route.effort ? { effort: route.effort } : {}),
65
+ fast: route.fast === true,
66
+ modelParameters: route.modelParameters || {},
67
+ turnLimits: { maxToolRounds: EXPLORER_MAX_TOOL_ROUNDS },
68
+ ...sharedPrefixProviderCacheOpts(route.provider),
69
+ onProviderSendStarted: () => {
70
+ streamed = '';
71
+ },
72
+ onTextDelta: (chunk) => {
73
+ streamed += typeof chunk === 'string' ? chunk : '';
74
+ },
75
+ onTextReset: ({ chars } = {}) => {
76
+ streamed = streamed.slice(0, Math.max(0, streamed.length - (Number(chars) || 0)));
77
+ return true;
78
+ },
79
+ });
80
+ return String(response?.content || '').trim();
81
+ } catch (error) {
82
+ if (signal?.reason?.salvagePartial === true) {
83
+ const partial = [partialHandoffTextFromSession({ messages }, 2), streamed.trim()].filter(Boolean).join('\n\n');
84
+ if (partial) return partial;
85
+ }
86
+ throw error;
87
+ }
88
+ }
@@ -0,0 +1,35 @@
1
+ import { TOOL_SYNC_EXECUTION_CONTRACT } from '../shared/tool-execution-contract.mjs';
2
+
3
+ export const EXPLORE_MAX_QUERIES = 8;
4
+
5
+ export const TOOL_DEFS = [
6
+ {
7
+ name: 'explore',
8
+ title: 'Explore',
9
+ annotations: {
10
+ title: 'Explore',
11
+ readOnlyHint: true,
12
+ destructiveHint: false,
13
+ idempotentHint: true,
14
+ openWorldHint: false,
15
+ },
16
+ description:
17
+ 'Read-only code search in parallel explorers outside your context; returns one merged answer with path:line evidence. ' +
18
+ 'Use when locating needs 3+ searches, spans 2+ files or areas, or covers independent questions; a known file or one lookup: read/grep. ' +
19
+ TOOL_SYNC_EXECUTION_CONTRACT,
20
+ inputSchema: {
21
+ type: 'object',
22
+ properties: {
23
+ query: {
24
+ anyOf: [
25
+ { type: 'string', minLength: 1 },
26
+ { type: 'array', items: { type: 'string', minLength: 1 }, minItems: 1, maxItems: EXPLORE_MAX_QUERIES },
27
+ ],
28
+ description: 'One self-contained question, or an array of independent ones (one explorer each).',
29
+ },
30
+ },
31
+ required: ['query'],
32
+ additionalProperties: false,
33
+ },
34
+ },
35
+ ];
@@ -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
+ const EXPLORER_AGENT = 'explore-agent';
12
+ 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
+ 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
+ }
@@ -19,7 +19,7 @@ export function localProviderPlatformKey(platform = process.platform, arch = pro
19
19
  * RAM — exactly what llama.cpp's Metal backend reports on a 16 GB M4; larger
20
20
  * Macs may allow more, which this leaves unused. Metal reports that whole
21
21
  * working set as free, so free equals total here as it does in llama.cpp. */
22
- export function appleSiliconGpu({ name, totalBytes, wiredLimitMb }) {
22
+ function appleSiliconGpu({ name, totalBytes, wiredLimitMb }) {
23
23
  const memoryBytes = wiredLimitMb > 0 ? wiredLimitMb * 1024 ** 2 : Math.floor((totalBytes * 2) / 3);
24
24
  return { index: 0, uuid: 'MTL0', vendor: 'Apple', name, memoryBytes, freeMemoryBytes: memoryBytes };
25
25
  }
@@ -32,9 +32,9 @@ import {
32
32
 
33
33
  const REQUEST_TIMEOUT_MS = 400_000;
34
34
  const LABEL = 'ChatGPT image';
35
- export const CODEX_IMAGE_MODEL = 'gpt-image-2';
36
- export const CODEX_IMAGES_GENERATIONS_URL = new URL('images/generations', CODEX_RESPONSES_URL).href;
37
- export const CODEX_IMAGES_EDITS_URL = new URL('images/edits', CODEX_RESPONSES_URL).href;
35
+ const CODEX_IMAGE_MODEL = 'gpt-image-2';
36
+ const CODEX_IMAGES_GENERATIONS_URL = new URL('images/generations', CODEX_RESPONSES_URL).href;
37
+ const CODEX_IMAGES_EDITS_URL = new URL('images/edits', CODEX_RESPONSES_URL).href;
38
38
  const BACKGROUNDS = new Set(['transparent', 'opaque', 'auto']);
39
39
 
40
40
  const dataUrl = (ref) => `data:${ref.mime || 'image/png'};base64,${ref.base64}`;
@@ -83,7 +83,7 @@ async function generateViaVeo({ model, prompt, options, references = [], signal,
83
83
  if ([4, 6, 8].includes(duration)) parameters.durationSeconds = duration;
84
84
 
85
85
  // The budget starts at submission, not after it: a hung predictLongRunning
86
- // POST used to run without any ceiling of its own.
86
+ // POST would otherwise run without any ceiling of its own.
87
87
  const deadline = Date.now() + TOTAL_TIMEOUT_MS;
88
88
  const started = await fetch(`${BASE_URL}/models/${encodeURIComponent(model)}:predictLongRunning`, {
89
89
  method: 'POST',
@@ -91,7 +91,7 @@ export function imageApiUsage(body) {
91
91
  }
92
92
 
93
93
  /** True when the provider reported something billable for the request. */
94
- export function hasReportedUsage(usage) {
94
+ function hasReportedUsage(usage) {
95
95
  if (!usage) return false;
96
96
  // Seconds are only attached once a video generation completed (billed per second).
97
97
  return (
@@ -231,7 +231,7 @@ export function saveMediaAsset({ kind, lane, model, prompt, options = {}, mime,
231
231
  // whose bytes are all NUL.
232
232
  writeFileAtomicSync(path, bytes);
233
233
  entry.file = file;
234
- // The gallery is NOT capped (user). An entry-count trim used to unlink the
234
+ // The gallery is NOT capped (user). An entry-count trim would unlink the
235
235
  // oldest files here, which is data loss nobody asked for: a generated asset
236
236
  // leaves this store only through an explicit delete.
237
237
  mutateIndex((assets) => [entry, ...assets]);
@@ -59,7 +59,8 @@ import {
59
59
  resolveCoalesceMaxRetries,
60
60
  scheduleCoalescedCycleRetry,
61
61
  } from './lib/memory-cycle-requests.mjs';
62
- import { drainEmbeddingReindex } from './lib/embedding-reindex.mjs';
62
+ import { drainEmbeddingReindex, runRootEmbedSweep } from './lib/embedding-reindex.mjs';
63
+ import { sweepRootEmbedText } from './lib/memory-embed.mjs';
63
64
  import { refreshCoreMemoryFile } from './lib/core-memory-file.mjs';
64
65
  import { resolveProjectId, resolveProjectScope } from './lib/project-id-resolver.mjs';
65
66
  import {
@@ -71,6 +72,7 @@ import {
71
72
  } from './lib/trace-store.mjs';
72
73
  import { writeJsonAtomicSync } from '../shared/atomic-file.mjs';
73
74
  import { safeIpcSend } from '../shared/safe-ipc-send.mjs';
75
+ import { adoptSystemProxy } from '../shared/llm/system-proxy.mjs';
74
76
  import { resolvePluginData, mixdogHome } from '../shared/plugin-paths.mjs';
75
77
  import { scheduledCycle1Signature } from './lib/cycle-signatures.mjs';
76
78
  import { createTranscriptIngest } from './lib/transcript-ingest.mjs';
@@ -96,6 +98,9 @@ import {
96
98
  } from './lib/memory-config-flags.mjs';
97
99
  const IS_MEMORY_ENTRY = !!process.argv[1] && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
98
100
  if (IS_MEMORY_ENTRY) {
101
+ // Runtime and model downloads follow the system proxy the launching daemon
102
+ // handed over (removed from this env so child processes never see it).
103
+ adoptSystemProxy();
99
104
  // Node's own warning printer stays off in this runtime, but a listener leak
100
105
  // is still logged, with the stack that names its source.
101
106
  process.removeAllListeners('warning');
@@ -428,6 +433,15 @@ function _startEmbeddingReindex() {
428
433
  `ok=${summary.succeeded} failed=${summary.failed}\n`
429
434
  );
430
435
  }
436
+ return runRootEmbedSweep({
437
+ sweepStep: ({ signal }) => sweepRootEmbedText(db, { signal }),
438
+ signal: controller.signal,
439
+ });
440
+ })
441
+ .then((sweep) => {
442
+ if (sweep.replaced > 0) {
443
+ __mixdogMemoryLog(`[memory-service] root text sweep steps=${sweep.steps} replaced=${sweep.replaced}\n`);
444
+ }
431
445
  })
432
446
  .catch((error) => {
433
447
  if (!controller.signal.aborted) {
@@ -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
  });
@@ -46,3 +46,30 @@ export async function drainEmbeddingReindex({
46
46
 
47
47
  return { passes, attempted, succeeded, failed };
48
48
  }
49
+
50
+ // The root-text sweep replaces vectors that still work, so it has no urgency:
51
+ // small steps with long rests keep a ~62k-root backfill in the background of a
52
+ // working session instead of competing with it.
53
+ const ROOT_SWEEP_PAUSE_MS = 4_000;
54
+
55
+ export async function runRootEmbedSweep({
56
+ sweepStep,
57
+ signal,
58
+ pauseMs = ROOT_SWEEP_PAUSE_MS,
59
+ wait = waitForNextPass,
60
+ } = {}) {
61
+ if (typeof sweepStep !== 'function') {
62
+ throw new TypeError('runRootEmbedSweep: sweepStep required');
63
+ }
64
+ let steps = 0;
65
+ let replaced = 0;
66
+ while (true) {
67
+ throwIfAborted(signal);
68
+ const result = await sweepStep({ signal });
69
+ steps += 1;
70
+ replaced += Number(result?.replaced ?? 0);
71
+ if (result?.done) break;
72
+ await wait(pauseMs, signal);
73
+ }
74
+ return { steps, replaced };
75
+ }
@@ -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/
@@ -2,7 +2,7 @@ import { __mixdogMemoryLog } from './memory-log.mjs';
2
2
 
3
3
  import { embedTexts, getEmbeddingModelId, holdEmbeddingWarm } from './embedding-provider.mjs';
4
4
  import { onnxRuntimeSupported } from '../../shared/onnx-runtime-support.mjs';
5
- import { embeddingToSql } from './memory.mjs';
5
+ import { embeddingToSql, ROOT_EMBED_SWEEP_META_KEY } from './memory.mjs';
6
6
  import { createHash } from 'node:crypto';
7
7
  import { pruneEmbeddingCache, resolveEmbeddingCacheMaxRows } from './embedding-cache-retention.mjs';
8
8
  import { throwIfAborted, markStoreFault } from './memory-cycle-shared.mjs';
@@ -524,6 +524,18 @@ async function syncRawBatchEmbeddings(db, ids, options = {}) {
524
524
  return writtenIds;
525
525
  }
526
526
 
527
+ // A chunk root is also the chunk's first message: cycle1 promotes that raw row
528
+ // in place, and every other member keeps its own content vector. Embedding only
529
+ // element/summary left the first message's own words with no vector, so its
530
+ // details were reachable only through the lossy summary. The summary leads so a
531
+ // long message truncated at the model window still keeps it.
532
+ export function rootEmbedText(row) {
533
+ const head = [row?.element, row?.summary].filter(Boolean).join(' — ').trim();
534
+ if (!head) return '';
535
+ const content = isRawEmbeddable(row?.role, row?.content) ? row.content.trim() : '';
536
+ return content ? `${head}\n\n${content}` : head;
537
+ }
538
+
527
539
  // Batch-embed all ids in one DB round-trip for fetching, one API call per unique text,
528
540
  // then one VALUES UPDATE for all results.
529
541
  // Returns the list of ids that were actually UPDATEd with a fresh embedding.
@@ -535,9 +547,10 @@ async function syncBatchEmbeddings(db, ids, options = {}) {
535
547
  throwIfAborted(signal);
536
548
  if (!onnxRuntimeSupported()) return [];
537
549
  const rows = (
538
- await db.query(`SELECT id, element, summary FROM memory.entries WHERE id = ANY($1::bigint[]) AND is_root = 1`, [
539
- ids,
540
- ])
550
+ await db.query(
551
+ `SELECT id, element, summary, content, role FROM memory.entries WHERE id = ANY($1::bigint[]) AND is_root = 1`,
552
+ [ids]
553
+ )
541
554
  ).rows;
542
555
  throwIfAborted(signal);
543
556
  if (rows.length === 0) return [];
@@ -546,8 +559,9 @@ async function syncBatchEmbeddings(db, ids, options = {}) {
546
559
  throwIfAborted(signal);
547
560
  const expected = Number(dimsRow?.value ?? 0);
548
561
 
549
- const texts = rows.map((row) => [row.element, row.summary].filter(Boolean).join(' — ').trim());
550
- const vectors = await cachedEmbedTextBatch(db, texts.filter(Boolean), { signal });
562
+ const texts = rows.map(rootEmbedText);
563
+ const embedBatch = options.embedBatch ?? cachedEmbedTextBatch;
564
+ const vectors = await embedBatch(db, texts.filter(Boolean), { signal });
551
565
  throwIfAborted(signal);
552
566
  // Re-map: only non-empty texts were passed to cachedEmbedTextBatch
553
567
  let vecIdx = 0;
@@ -562,28 +576,29 @@ async function syncBatchEmbeddings(db, ids, options = {}) {
562
576
  __mixdogMemoryLog(`[embed] dim mismatch (id=${row.id} got=${vector.length} expected=${expected})\n`);
563
577
  continue;
564
578
  }
565
- updates.push({ id: Number(row.id), element: row.element, summary: row.summary, vector });
579
+ updates.push({ id: Number(row.id), element: row.element, summary: row.summary, content: row.content, vector });
566
580
  }
567
581
 
568
582
  if (updates.length === 0) return [];
569
583
 
570
584
  // The VALUES update is one SQL batch; do not split it with an abort checkpoint.
571
585
  const valClauses = updates.map((_u, i) => {
572
- const base = i * 4;
573
- return `($${base + 1}::bigint, $${base + 2}::halfvec, $${base + 3}::text, $${base + 4}::text)`;
586
+ const base = i * 5;
587
+ return `($${base + 1}::bigint, $${base + 2}::halfvec, $${base + 3}::text, $${base + 4}::text, $${base + 5}::text)`;
574
588
  });
575
589
  const params = [];
576
590
  for (const u of updates) {
577
- params.push(u.id, embeddingToSql(u.vector), u.element, u.summary);
591
+ params.push(u.id, embeddingToSql(u.vector), u.element, u.summary, u.content);
578
592
  }
579
593
  const res = await db.query(
580
594
  `UPDATE memory.entries AS e
581
595
  SET embedding = t.vector
582
- FROM (VALUES ${valClauses.join(',')}) AS t(id, vector, element, summary)
596
+ FROM (VALUES ${valClauses.join(',')}) AS t(id, vector, element, summary, content)
583
597
  WHERE e.id = t.id AND e.is_root = 1
584
- AND e.embedding IS NULL
598
+ AND e.embedding IS ${options.replace ? 'NOT ' : ''}NULL
585
599
  AND e.element IS NOT DISTINCT FROM t.element
586
600
  AND e.summary IS NOT DISTINCT FROM t.summary
601
+ AND e.content IS NOT DISTINCT FROM t.content
587
602
  RETURNING e.id`,
588
603
  params
589
604
  );
@@ -596,7 +611,7 @@ async function syncBatchEmbeddings(db, ids, options = {}) {
596
611
  const curRows = missedIds.length
597
612
  ? (
598
613
  await db.query(
599
- `SELECT id, embedding IS NOT NULL AS has_embedding, element, summary
614
+ `SELECT id, embedding IS NOT NULL AS has_embedding, element, summary, content
600
615
  FROM memory.entries WHERE id = ANY($1::bigint[]) AND is_root = 1`,
601
616
  [missedIds]
602
617
  )
@@ -610,7 +625,8 @@ async function syncBatchEmbeddings(db, ids, options = {}) {
610
625
  if (!cur) continue;
611
626
  const textUnchanged =
612
627
  (cur.element === u.element || (cur.element == null && u.element == null)) &&
613
- (cur.summary === u.summary || (cur.summary == null && u.summary == null));
628
+ (cur.summary === u.summary || (cur.summary == null && u.summary == null)) &&
629
+ (cur.content === u.content || (cur.content == null && u.content == null));
614
630
  if (!textUnchanged) {
615
631
  staleSkips++;
616
632
  continue;
@@ -631,6 +647,59 @@ async function syncBatchEmbeddings(db, ids, options = {}) {
631
647
  return writtenIds;
632
648
  }
633
649
 
650
+ // One paced step of the root-text sweep (startRootEmbedSweep in memory.mjs).
651
+ // Existing vectors stay searchable until replaced: the step claims the next
652
+ // roots below the stored cursor that still HAVE a vector, embeds their current
653
+ // text, replaces each vector only where the text is unchanged, and advances the
654
+ // cursor in the same transaction. The meta row lock serializes concurrent
655
+ // sweepers; any failure rolls back both vectors and cursor. Roots without a
656
+ // vector are left to the ordinary flush, which already uses the new text.
657
+ const ROOT_SWEEP_BATCH = 8;
658
+ export async function sweepRootEmbedText(db, options = {}) {
659
+ const { batchSize = ROOT_SWEEP_BATCH, signal, embedBatch } = options;
660
+ throwIfAborted(signal);
661
+ if (!onnxRuntimeSupported()) return { claimed: 0, replaced: 0, done: true };
662
+ await ensureEmbCacheTable(db);
663
+ const client = await db._pool.connect();
664
+ let committed = false;
665
+ try {
666
+ await client.query('BEGIN');
667
+ const state = await client.query(`SELECT value FROM memory.meta WHERE key = $1 FOR UPDATE`, [
668
+ ROOT_EMBED_SWEEP_META_KEY,
669
+ ]);
670
+ const value = state.rows[0]?.value;
671
+ const cursor = Number(value?.cursor);
672
+ if (!value || value.done === true || !Number.isFinite(cursor)) {
673
+ await client.query('COMMIT');
674
+ committed = true;
675
+ return { claimed: 0, replaced: 0, done: true };
676
+ }
677
+ const claim = await client.query(
678
+ `SELECT id FROM memory.entries
679
+ WHERE is_root = 1 AND id < $1 AND embedding IS NOT NULL
680
+ AND (element IS NOT NULL OR summary IS NOT NULL)
681
+ ORDER BY id DESC
682
+ LIMIT $2
683
+ FOR UPDATE`,
684
+ [cursor, batchSize]
685
+ );
686
+ const ids = claim.rows.map((r) => Number(r.id));
687
+ throwIfAborted(signal);
688
+ const written = ids.length ? await syncBatchEmbeddings(client, ids, { signal, replace: true, embedBatch }) : [];
689
+ const done = ids.length < batchSize;
690
+ await client.query(
691
+ `UPDATE memory.meta SET value = jsonb_build_object('cursor', $2::bigint, 'done', $3::boolean) WHERE key = $1`,
692
+ [ROOT_EMBED_SWEEP_META_KEY, ids.length ? Math.min(...ids) : cursor, done]
693
+ );
694
+ await client.query('COMMIT');
695
+ committed = true;
696
+ return { claimed: ids.length, replaced: written.length, done };
697
+ } finally {
698
+ if (!committed) await client.query('ROLLBACK').catch(() => {});
699
+ client.release();
700
+ }
701
+ }
702
+
634
703
  // Explicit maintenance must propagate partial failures and caller cancellation,
635
704
  // including callers sharing a flush that was started without their signal.
636
705
  export async function flushSearchEmbeddings(db, options = {}) {