mixdog 1.2.3 → 1.2.4

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 (465) hide show
  1. package/package.json +1 -1
  2. package/scripts/gate-local.mjs +6 -4
  3. package/scripts/lib/gate-scheduler.mjs +29 -11
  4. package/scripts/probe-provider-catalog.mjs +31 -0
  5. package/scripts/provider-pingpong-live.mjs +128 -38
  6. package/scripts/session-sweep.mjs +5 -25
  7. package/src/agents/maintainer/AGENT.md +1 -1
  8. package/src/agents/maintainer/agent.json +1 -1
  9. package/src/agents/reviewer/AGENT.md +2 -4
  10. package/src/agents/security/AGENT.md +1 -2
  11. package/src/agents/writer/AGENT.md +2 -3
  12. package/src/defaults/shipped-history.json +6 -1
  13. package/src/defaults/skills/image/SKILL.md +21 -23
  14. package/src/lib/keychain-cjs.cjs +13 -11
  15. package/src/rules/agent/AGENT.md +7 -5
  16. package/src/rules/lead/LEAD.md +7 -9
  17. package/src/rules/shared/45-destructive.md +4 -0
  18. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +1 -0
  19. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +28 -7
  20. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -11
  21. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +101 -23
  22. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +2 -0
  23. package/src/runtime/agent/orchestrator/providers/anthropic-api-key-fetch.mjs +36 -0
  24. package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +1 -1
  25. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -3
  26. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  27. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +26 -44
  28. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2 -5
  29. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +4 -0
  30. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +41 -12
  31. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +13 -1
  32. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +81 -10
  33. package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +109 -5
  34. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +2 -1
  35. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +107 -37
  36. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +4 -1
  37. package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +3 -1
  38. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
  39. package/src/runtime/agent/orchestrator/providers/cursor-native-context.mjs +48 -0
  40. package/src/runtime/agent/orchestrator/providers/cursor-wire-exec.mjs +144 -34
  41. package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +28 -4
  42. package/src/runtime/agent/orchestrator/providers/cursor-wire-request.mjs +8 -4
  43. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +41 -11
  44. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +67 -5
  45. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +14 -4
  46. package/src/runtime/agent/orchestrator/providers/cursor.mjs +14 -1
  47. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +9 -6
  48. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +7 -2
  49. package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +26 -4
  50. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +12 -6
  51. package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +14 -6
  52. package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +4 -4
  53. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +1 -0
  54. package/src/runtime/agent/orchestrator/providers/gemini-rest-stream/watchdogs.mjs +16 -5
  55. package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +6 -1
  56. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +22 -10
  57. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -2
  58. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +33 -7
  59. package/src/runtime/agent/orchestrator/providers/gemini.mjs +11 -2
  60. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
  61. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +9 -2
  62. package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +9 -5
  63. package/src/runtime/agent/orchestrator/providers/lib/request-compression.mjs +86 -0
  64. package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +4 -2
  65. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +16 -5
  66. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +7 -1
  67. package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +60 -16
  68. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +11 -13
  69. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +30 -19
  70. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +3 -1
  71. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +5 -0
  72. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +42 -5
  73. package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +13 -9
  74. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +1 -3
  75. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +18 -7
  76. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +36 -3
  77. package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +51 -3
  78. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +11 -1
  79. package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +64 -52
  80. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +3 -1
  81. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +2 -1
  82. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +7 -1
  83. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +1 -4
  84. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +0 -1
  85. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +7 -6
  86. package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +13 -2
  87. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +4 -1
  88. package/src/runtime/agent/orchestrator/providers/openrouter.mjs +1 -2
  89. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +5 -4
  90. package/src/runtime/agent/orchestrator/providers/registry.mjs +9 -1
  91. package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +2 -1
  92. package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +11 -4
  93. package/src/runtime/agent/orchestrator/providers/wire-route.mjs +14 -4
  94. package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +15 -3
  95. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +6 -2
  96. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +8 -6
  97. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +4 -1
  98. package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +30 -2
  99. package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +3 -2
  100. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -3
  101. package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +3 -1
  102. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge-contract.mjs +6 -0
  103. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +10 -10
  104. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +3 -1
  105. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +46 -8
  106. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +10 -8
  107. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +1 -2
  108. package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +24 -0
  109. package/src/runtime/agent/orchestrator/session/cache/tool-result-reuse.mjs +10 -2
  110. package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -3
  111. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +3 -11
  112. package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +6 -22
  113. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +2 -0
  114. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +16 -2
  115. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +28 -0
  116. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
  117. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +0 -6
  118. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +0 -6
  119. package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +1 -1
  120. package/src/runtime/agent/orchestrator/session/historical-session-closure.mjs +10 -0
  121. package/src/runtime/agent/orchestrator/session/loop/assistant-commit.mjs +2 -5
  122. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +2 -4
  123. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +3 -3
  124. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +0 -27
  125. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/output-limit.mjs +1 -1
  126. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +4 -10
  127. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +2 -9
  128. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +4 -1
  129. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +4 -1
  130. package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +1 -4
  131. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +76 -0
  132. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +5 -1
  133. package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +8 -9
  134. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +6 -0
  135. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +15 -2
  136. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +1 -4
  137. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +3 -4
  138. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +33 -3
  139. package/src/runtime/agent/orchestrator/session/manager/ask-support.mjs +0 -4
  140. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +21 -1
  141. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +38 -13
  142. package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +33 -0
  143. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +5 -0
  144. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +19 -1
  145. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +57 -13
  146. package/src/runtime/agent/orchestrator/session/manager/failed-turn-rewind.mjs +16 -0
  147. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +6 -120
  148. package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +1 -1
  149. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +29 -8
  150. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +42 -49
  151. package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +50 -0
  152. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +32 -14
  153. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +1 -1
  154. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +17 -33
  155. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +29 -13
  156. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +3 -3
  157. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +45 -0
  158. package/src/runtime/agent/orchestrator/session/manager.mjs +2 -9
  159. package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +2 -1
  160. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +5 -2
  161. package/src/runtime/agent/orchestrator/session/side-question.mjs +12 -7
  162. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +5 -12
  163. package/src/runtime/agent/orchestrator/session/store/lifecycle-read.mjs +1 -1
  164. package/src/runtime/agent/orchestrator/session/store/listing.mjs +2 -6
  165. package/src/runtime/agent/orchestrator/session/store/live-cache-eviction.mjs +1 -1
  166. package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +46 -37
  167. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +1 -1
  168. package/src/runtime/agent/orchestrator/session/store/load-session.mjs +1 -1
  169. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +5 -11
  170. package/src/runtime/agent/orchestrator/session/store/session-paths.mjs +59 -0
  171. package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +1 -1
  172. package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +1 -1
  173. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +27 -32
  174. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-plan.mjs +0 -8
  175. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +6 -18
  176. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +33 -106
  177. package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +1 -1
  178. package/src/runtime/agent/orchestrator/session/store-agent-worker-pool.mjs +5 -8
  179. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +136 -196
  180. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +50 -116
  181. package/src/runtime/agent/orchestrator/session/store-summary-locations.mjs +3 -29
  182. package/src/runtime/agent/orchestrator/session/store-summary-reader-catalog-fixture.mjs +1 -1
  183. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +7 -8
  184. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +9 -20
  185. package/src/runtime/agent/orchestrator/session/store.mjs +3 -16
  186. package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +11 -12
  187. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +37 -13
  188. package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +15 -4
  189. package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +4 -2
  190. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +72 -15
  191. package/src/runtime/agent/orchestrator/session/turn-failure.mjs +45 -0
  192. package/src/runtime/agent/orchestrator/stall-policy.mjs +50 -0
  193. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +5 -1
  194. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/inline-hoist.mjs +6 -2
  195. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +204 -10
  196. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +160 -39
  197. package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +7 -5
  198. package/src/runtime/agent/orchestrator/tools/builtin/grep-formatting.mjs +14 -5
  199. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +4 -3
  200. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-output.mjs +2 -1
  201. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-path-fanout.mjs +48 -44
  202. package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +10 -3
  203. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +200 -17
  204. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +5 -4
  205. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +6 -1
  206. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +20 -0
  207. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +101 -2
  208. package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
  209. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +67 -0
  210. package/src/runtime/agent/orchestrator/tools/lib/process-table-fixture.mjs +50 -0
  211. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +303 -63
  212. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +2 -0
  213. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +108 -18
  214. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +77 -11
  215. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +81 -5
  216. package/src/runtime/attachments/store.d.mts +9 -0
  217. package/src/runtime/attachments/store.mjs +80 -9
  218. package/src/runtime/browser-bridge/browser-action-contract.d.mts +0 -1
  219. package/src/runtime/browser-bridge/browser-action-contract.mjs +0 -2
  220. package/src/runtime/computer-bridge/action-schema.mjs +178 -178
  221. package/src/runtime/computer-bridge/linux-readiness.d.mts +0 -2
  222. package/src/runtime/computer-bridge/linux-readiness.mjs +0 -16
  223. package/src/runtime/effort-judge/judge-client.mjs +21 -4
  224. package/src/runtime/effort-judge/judge-worker.mjs +4 -1
  225. package/src/runtime/github/tool.mjs +118 -17
  226. package/src/runtime/media/adapters/codex-image.mjs +140 -21
  227. package/src/runtime/media/catalog.mjs +4 -4
  228. package/src/runtime/media/chatgpt-usage.mjs +55 -0
  229. package/src/runtime/media/defaults.mjs +37 -0
  230. package/src/runtime/media/jobs.mjs +12 -2
  231. package/src/runtime/media/lanes.mjs +12 -0
  232. package/src/runtime/media/tool-defs.mjs +15 -4
  233. package/src/runtime/media/tool.mjs +41 -12
  234. package/src/runtime/media/upstream-error.mjs +72 -6
  235. package/src/runtime/memory/lib/ingest/transcript-rows.mjs +1 -0
  236. package/src/runtime/memory/lib/pg/process.mjs +5 -7
  237. package/src/runtime/memory/lib/pg/supervisor.mjs +4 -1
  238. package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
  239. package/src/runtime/office/authoring/html-browser.mjs +18 -8
  240. package/src/runtime/office/authoring/pdf-html-runner.mjs +1 -1
  241. package/src/runtime/office/authoring/pptx-html-measure.mjs +1 -1
  242. package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
  243. package/src/runtime/office/core/office-write-ledger.mjs +1 -5
  244. package/src/runtime/office/index.mjs +2 -3
  245. package/src/runtime/office/pdf/pdf-analysis.mjs +0 -68
  246. package/src/runtime/session-search/session-search-ingest.mjs +1 -1
  247. package/src/runtime/shared/agent-reap-state.mjs +13 -0
  248. package/src/runtime/shared/atomic-file.d.mts +1 -1
  249. package/src/runtime/shared/background-tasks.mjs +6 -1
  250. package/src/runtime/shared/bounded-line-diff.mjs +11 -2
  251. package/src/runtime/shared/browser-launch.mjs +15 -0
  252. package/src/runtime/shared/err-text.mjs +42 -4
  253. package/src/runtime/shared/file-lock.mjs +6 -5
  254. package/src/runtime/shared/llm/anthropic-betas.mjs +1 -2
  255. package/src/runtime/shared/llm/provider-model-identities.mjs +1 -0
  256. package/src/runtime/shared/model-route-chain.d.mts +8 -0
  257. package/src/runtime/shared/model-route-chain.mjs +48 -0
  258. package/src/runtime/shared/model-route-fallback.mjs +22 -0
  259. package/src/runtime/shared/pid-liveness.mjs +12 -0
  260. package/src/runtime/shared/provider-api-key.mjs +6 -0
  261. package/src/runtime/shared/provider-timeout-phase.mjs +17 -0
  262. package/src/runtime/shared/quiet-progress.d.mts +35 -0
  263. package/src/runtime/shared/quiet-progress.mjs +101 -0
  264. package/src/runtime/shared/quota-resume-store.mjs +32 -1
  265. package/src/runtime/shared/read-row-numbers.mjs +44 -0
  266. package/src/runtime/shared/remote-intent.mjs +2 -42
  267. package/src/runtime/shared/slow-span.mjs +8 -1
  268. package/src/runtime/shared/statusline/statusline-segments.mjs +24 -2
  269. package/src/runtime/shared/tool-card-model/card-header.mjs +2 -1
  270. package/src/runtime/shared/tool-output-budget.mjs +2 -0
  271. package/src/runtime/shared/tool-result-summary.mjs +16 -2
  272. package/src/runtime/shared/tool-status.mjs +3 -2
  273. package/src/runtime/shared/tool-surface.mjs +2 -3
  274. package/src/runtime/shared/tool-work-units.mjs +22 -15
  275. package/src/runtime/shared/transcript-metadata.mjs +49 -1
  276. package/src/runtime/shared/transcript-turn-keys.mjs +33 -0
  277. package/src/runtime/shared/transcript-writer/transcript-file.mjs +10 -1
  278. package/src/runtime/shared/transcript-writer.mjs +14 -4
  279. package/src/runtime/shared/turn-changes.mjs +2 -1
  280. package/src/runtime/shared/turn-snapshot.mjs +11 -3
  281. package/src/runtime/shared/worktrees/activity-gate.mjs +175 -0
  282. package/src/runtime/shared/worktrees/branch-management.mjs +179 -0
  283. package/src/runtime/shared/worktrees/carry.mjs +6 -4
  284. package/src/runtime/shared/worktrees/contract.mjs +27 -1
  285. package/src/runtime/shared/worktrees/dependencies.mjs +456 -0
  286. package/src/runtime/shared/worktrees/file-recovery.mjs +29 -13
  287. package/src/runtime/shared/worktrees/git-head.mjs +22 -13
  288. package/src/runtime/shared/worktrees/include.mjs +125 -7
  289. package/src/runtime/shared/worktrees/lock.mjs +1 -1
  290. package/src/runtime/shared/worktrees/maintenance.mjs +20 -2
  291. package/src/runtime/shared/worktrees/manager.mjs +378 -32
  292. package/src/runtime/shared/worktrees/owner.mjs +2 -1
  293. package/src/runtime/shared/worktrees/preparation-report.mjs +79 -0
  294. package/src/runtime/shared/worktrees/setup-commands.mjs +232 -0
  295. package/src/runtime/shared/worktrees/workspace-visibility.mjs +17 -0
  296. package/src/runtime/terminal-bridge/client.mjs +14 -10
  297. package/src/session-runtime/boot/apis.mjs +7 -1
  298. package/src/session-runtime/boot/config.mjs +2 -0
  299. package/src/session-runtime/boot/facade.mjs +3 -0
  300. package/src/session-runtime/boot/session.mjs +3 -2
  301. package/src/session-runtime/boot/tools.mjs +3 -0
  302. package/src/session-runtime/conversation-import/service.mjs +1 -1
  303. package/src/session-runtime/goal-facade-api.mjs +2 -2
  304. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +44 -18
  305. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +4 -1
  306. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +22 -8
  307. package/src/session-runtime/internal-tool-executor.mjs +2 -0
  308. package/src/session-runtime/lifecycle/cold-heir.mjs +0 -1
  309. package/src/session-runtime/lifecycle/session-catalog.mjs +14 -16
  310. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +18 -53
  311. package/src/session-runtime/lifecycle/session-switch.mjs +1 -1
  312. package/src/session-runtime/lifecycle/shared.mjs +5 -6
  313. package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -5
  314. package/src/session-runtime/lifecycle/teardown.mjs +7 -16
  315. package/src/session-runtime/media-api.mjs +8 -0
  316. package/src/session-runtime/model-route/route-ownership.mjs +60 -0
  317. package/src/session-runtime/model-route/route-persist.mjs +3 -2
  318. package/src/session-runtime/model-route/set-route.mjs +114 -34
  319. package/src/session-runtime/model-route/web-search-route.mjs +7 -2
  320. package/src/session-runtime/model-route-api.mjs +4 -2
  321. package/src/session-runtime/native-web-search/routes.mjs +37 -24
  322. package/src/session-runtime/native-web-search.mjs +9 -8
  323. package/src/session-runtime/provider-auth/setup.mjs +4 -0
  324. package/src/session-runtime/provider-models/catalog-load.mjs +9 -0
  325. package/src/session-runtime/provider-models/web-search-catalog.mjs +23 -3
  326. package/src/session-runtime/provider-models.mjs +1 -0
  327. package/src/session-runtime/provider-usage.mjs +4 -0
  328. package/src/session-runtime/route-resolution.mjs +3 -1
  329. package/src/session-runtime/runtime-core.mjs +4 -0
  330. package/src/session-runtime/runtime-facade.mjs +6 -0
  331. package/src/session-runtime/services/agent-task-status.mjs +2 -0
  332. package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +0 -3
  333. package/src/session-runtime/services/agent-tool/close-flow.mjs +6 -7
  334. package/src/session-runtime/services/agent-tool/execute-send.mjs +2 -2
  335. package/src/session-runtime/services/agent-tool/execute-spawn.mjs +36 -3
  336. package/src/session-runtime/services/agent-tool/execute.mjs +9 -1
  337. package/src/session-runtime/services/agent-tool/helpers.mjs +30 -7
  338. package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +7 -2
  339. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +6 -3
  340. package/src/session-runtime/services/agent-tool/lead-worker-index/lead-rows.mjs +3 -4
  341. package/src/session-runtime/services/agent-tool/lead-worker-index/reap-timers.mjs +9 -3
  342. package/src/session-runtime/services/agent-tool/lead-worker-index/row-settlement.mjs +7 -18
  343. package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +9 -6
  344. package/src/session-runtime/services/agent-tool/model-select.mjs +82 -0
  345. package/src/session-runtime/services/agent-tool/send-flow.mjs +24 -6
  346. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +3 -1
  347. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +19 -5
  348. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +5 -4
  349. package/src/session-runtime/services/agent-tool/spawn-flow.mjs +2 -1
  350. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +3 -0
  351. package/src/session-runtime/services/agent-tool/tag-registry/tag-lookup.mjs +1 -3
  352. package/src/session-runtime/services/agent-tool/tag-registry/tag-refresh.mjs +1 -3
  353. package/src/session-runtime/services/agent-tool/tag-registry.mjs +3 -9
  354. package/src/session-runtime/services/agent-tool/terminal-reaper/scan-admission.mjs +8 -41
  355. package/src/session-runtime/services/agent-tool/terminal-reaper/stale-rows.mjs +3 -3
  356. package/src/session-runtime/services/agent-tool/terminal-reaper.mjs +6 -23
  357. package/src/session-runtime/services/agent-tool/terminal-trace.mjs +0 -1
  358. package/src/session-runtime/services/agent-tool/tool-def.mjs +7 -0
  359. package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +32 -20
  360. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +5 -2
  361. package/src/session-runtime/services/agent-tool/worker-index.mjs +28 -8
  362. package/src/session-runtime/services/agent-tool.mjs +4 -0
  363. package/src/session-runtime/services/agent-watchdog-registry.mjs +2 -0
  364. package/src/session-runtime/services/provider-admin.mjs +77 -0
  365. package/src/session-runtime/session-create/session-options.mjs +7 -5
  366. package/src/session-runtime/session-create/session-start-hook.mjs +2 -1
  367. package/src/session-runtime/session-transcript.mjs +4 -5
  368. package/src/session-runtime/session-turn-api.mjs +3 -9
  369. package/src/session-runtime/settings-builtin-tools-api.mjs +9 -6
  370. package/src/session-runtime/setup-tool/executor.mjs +23 -5
  371. package/src/session-runtime/setup-tool/extended-actions.mjs +6 -6
  372. package/src/session-runtime/setup-tool/settings-contract.mjs +7 -2
  373. package/src/session-runtime/setup-tool/tool-defs.mjs +13 -1
  374. package/src/session-runtime/tool-policy-refresh.mjs +83 -32
  375. package/src/session-runtime/turn/agent-ops.mjs +49 -2
  376. package/src/session-runtime/turn/side-question-ops.mjs +1 -4
  377. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +2 -0
  378. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +4 -0
  379. package/src/session-runtime/turn/turn-run/turn-settle.mjs +8 -2
  380. package/src/session-runtime/turn/turn-run.mjs +1 -36
  381. package/src/session-runtime/usage-stats-api.mjs +4 -1
  382. package/src/session-runtime/workflow-agents-api/agent-route.mjs +16 -1
  383. package/src/session-runtime/workspace/admission-gate.mjs +44 -15
  384. package/src/session-runtime/workspace/project-branches.mjs +28 -36
  385. package/src/session-runtime/workspace/transition-steps.mjs +96 -95
  386. package/src/session-runtime/workspace/transitions.mjs +248 -68
  387. package/src/standalone/channel-transport.mjs +3 -4
  388. package/src/standalone/daemon-desktop-runtime.mjs +32 -1
  389. package/src/standalone/daemon-pg-stop.mjs +1 -3
  390. package/src/standalone/daemon-session-control.mjs +88 -0
  391. package/src/standalone/daemon-stored-session-views.mjs +23 -3
  392. package/src/standalone/daemon.mjs +2 -0
  393. package/src/standalone/local-session-runtime.mjs +11 -12
  394. package/src/standalone/session-protocol.mjs +7 -0
  395. package/src/standalone/session-runtime-inline-host.mjs +2 -0
  396. package/src/standalone/session-service/agent-tree/agent-cancel.mjs +91 -49
  397. package/src/standalone/session-service/agent-tree/agent-child.mjs +19 -1
  398. package/src/standalone/session-service/agent-tree/agent-registry.mjs +25 -0
  399. package/src/standalone/session-service/agent-tree/agent-turns.mjs +9 -1
  400. package/src/standalone/session-service/agent-tree.mjs +28 -2
  401. package/src/standalone/session-service/entries/session-loads.mjs +16 -5
  402. package/src/standalone/session-service/entries.mjs +1 -0
  403. package/src/standalone/session-service/projection/transcript-window.mjs +39 -0
  404. package/src/standalone/session-service/quota-resume.mjs +28 -13
  405. package/src/standalone/session-service/session-calls/session-turns.mjs +17 -6
  406. package/src/standalone/session-service/session-calls/session-views.mjs +6 -0
  407. package/src/standalone/session-tool-output.mjs +82 -0
  408. package/src/tui/app/app-view.jsx +2 -1
  409. package/src/tui/app/provider-setup/provider-items.mjs +8 -0
  410. package/src/tui/app/provider-setup-picker.mjs +15 -3
  411. package/src/tui/app/slash-commands.mjs +6 -0
  412. package/src/tui/app/slash-dispatch/session-commands.mjs +49 -0
  413. package/src/tui/components/Spinner.jsx +4 -0
  414. package/src/tui/components/SpinnerByline.jsx +21 -2
  415. package/src/tui/components/status-line/local-line.mjs +10 -2
  416. package/src/tui/dist/index.mjs +478 -251
  417. package/src/tui/session/active-tool-summary.mjs +1 -1
  418. package/src/tui/session/context-state.mjs +0 -3
  419. package/src/tui/session/goal-continuation/continuation-queue.mjs +2 -3
  420. package/src/tui/session/goal-continuation/deadline-delivery.mjs +4 -2
  421. package/src/tui/session/goal-continuation/session-boundary.mjs +21 -0
  422. package/src/tui/session/quota-resume.mjs +140 -61
  423. package/src/tui/session/session-api/commands.mjs +4 -10
  424. package/src/tui/session/session-api/controls.mjs +12 -0
  425. package/src/tui/session/session-api/lifecycle/dispose.mjs +2 -9
  426. package/src/tui/session/session-api/lifecycle/resume.mjs +2 -7
  427. package/src/tui/session/session-api/lifecycle.mjs +13 -11
  428. package/src/tui/session/session-api/media.mjs +2 -0
  429. package/src/tui/session/session-api/routes.mjs +81 -57
  430. package/src/tui/session/session-api/settings.mjs +3 -3
  431. package/src/tui/session/session-api/worktree.mjs +3 -2
  432. package/src/tui/session/session-flow/auto-clear.mjs +1 -3
  433. package/src/tui/session/session-flow/drain.mjs +6 -4
  434. package/src/tui/session/session-flow/queue/entry-shape.mjs +2 -0
  435. package/src/tui/session/session-flow/queue/take-entries.mjs +2 -1
  436. package/src/tui/session/session-flow/queue.mjs +1 -1
  437. package/src/tui/session/tool-approval.mjs +17 -8
  438. package/src/tui/session/transcript-store/streaming-tail.mjs +1 -1
  439. package/src/tui/session/tui-steering-persist.mjs +3 -5
  440. package/src/tui/session/turn-quiet.mjs +53 -0
  441. package/src/tui/session/turn-stream.mjs +5 -1
  442. package/src/tui/session/turn.mjs +38 -31
  443. package/src/tui/session/worktree-setup-notice.mjs +38 -0
  444. package/src/tui/spinner-meta.mjs +10 -0
  445. package/src/tui/spinner-verbs.mjs +3 -0
  446. package/src/ui/statusline.mjs +13 -3
  447. package/src/runtime/agent/orchestrator/providers/model-pricing-rates.mjs +0 -1
  448. package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +0 -346
  449. package/src/runtime/agent/orchestrator/session/manager/session-owner-liveness.mjs +0 -117
  450. package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +0 -302
  451. package/src/session-runtime/services/agent-tool/terminal-reaper/reap-timers.mjs +0 -142
  452. package/src/session-runtime/turn/share-ops.mjs +0 -77
  453. package/src/tui/session/cross-surface-share.mjs +0 -406
  454. package/src/tui/session/live-share/delta.mjs +0 -153
  455. package/src/tui/session/live-share/mirror.mjs +0 -106
  456. package/src/tui/session/live-share/owner.mjs +0 -254
  457. package/src/tui/session/live-share/retry.mjs +0 -54
  458. package/src/tui/session/live-share/viewer/frame-router.mjs +0 -32
  459. package/src/tui/session/live-share/viewer/pipe-client.mjs +0 -108
  460. package/src/tui/session/live-share/viewer/submit-acks.mjs +0 -65
  461. package/src/tui/session/live-share/viewer/sync-waiters.mjs +0 -53
  462. package/src/tui/session/live-share/viewer.mjs +0 -99
  463. package/src/tui/session/live-share/wire.mjs +0 -44
  464. package/src/tui/session/live-share.mjs +0 -154
  465. package/src/tui/session/shared-dir-watch.mjs +0 -69
@@ -9,7 +9,7 @@ import {
9
9
  } from './loop/tool-helpers.mjs';
10
10
  import { repairTranscriptBeforeProviderSend } from './loop/transcript-repair.mjs';
11
11
  import { resetAccountProbePacing } from '../providers/account-pool.mjs';
12
- import { createLoopState, finishLoop, shouldSuppressAgentMidTurnText } from './loop/loop-state.mjs';
12
+ import { createLoopState, finishLoop } from './loop/loop-state.mjs';
13
13
  import { applyRetryAction, beginIteration, sendProviderRequest, settleSendResult } from './loop/send-phase.mjs';
14
14
  import { runToolPhase } from './loop/tool-phase.mjs';
15
15
 
@@ -25,7 +25,6 @@ export {
25
25
  resolvePreToolAskApproval,
26
26
  approvalGranted,
27
27
  approvalReason,
28
- shouldSuppressAgentMidTurnText,
29
28
  };
30
29
 
31
30
  /**
@@ -0,0 +1,24 @@
1
+ // The Agents pool's quiet-time inputs: each row whose turn is in flight in
2
+ // this process carries its last counted progress stamp, its runtime stage
3
+ // (and running tool), and its agent's stall-watchdog warn point. Display
4
+ // only — nothing here reads or changes the watchdog's abort policy.
5
+ import { displayProgressStage, lastProgressAt } from '../../../shared/quiet-progress.mjs';
6
+ import { resolveAgentStallThresholds } from '../stall-policy.mjs';
7
+
8
+ /** `rows` with progress fields on every row `runtimeEntry(sessionId)` reports
9
+ * in flight; other rows pass through untouched. */
10
+ export function withTurnProgress(rows, runtimeEntry, isTurnInFlight) {
11
+ return rows.map((row) => {
12
+ const entry = runtimeEntry(row?.sessionId);
13
+ if (!isTurnInFlight(entry)) return row;
14
+ const stage = typeof entry.stage === 'string' ? entry.stage : null;
15
+ return {
16
+ ...row,
17
+ progressAt: lastProgressAt(entry) || null,
18
+ // `model_thinking` while the sent request waits for its headers.
19
+ progressStage: displayProgressStage(entry),
20
+ progressTool: stage === 'tool_running' ? entry.lastToolCall || null : null,
21
+ stallWarnMs: resolveAgentStallThresholds(row.agent).warn * 1000,
22
+ };
23
+ });
24
+ }
@@ -1,13 +1,21 @@
1
1
  // One freshness authority for eager admission, cross-turn references and
2
2
  // serial cache hits. A readOnlyHint alone never proves a result reusable.
3
3
  import { tryReadCached } from './read-cache.mjs';
4
+ import { isCursorNativeCallId } from '../../providers/cursor-native-context.mjs';
4
5
  import { tryScopedToolCached } from './scoped-cache.mjs';
5
- import { _isReadTool, _isScopedCacheableTool, _stripMcpPrefix } from '../loop/tool-classify.mjs';
6
+ import { _isReadTool, _isScopedCacheableTool, _stripMcpPrefix, requiresReadBody } from '../loop/tool-classify.mjs';
6
7
 
7
- export function lookupToolResultReuse({ sessionId, call, cwd, touch = true }) {
8
+ export function lookupToolResultReuse({ sessionId, call, cwd, touch = true, sessionRef = null }) {
9
+ if (isCursorNativeCallId(call.id)) return null;
8
10
  if (!sessionId) return null;
9
11
  if (_isReadTool(call.name)) {
10
12
  const entry = tryReadCached({ sessionId, args: call.arguments, cwd });
13
+ if (
14
+ requiresReadBody(call.name, sessionRef) &&
15
+ typeof entry?.content === 'string' &&
16
+ /^(?:\[file unchanged:|\[cross-turn-dedup\]|\[intra-turn-dedup\])/.test(entry.content)
17
+ )
18
+ return null;
11
19
  return entry === null ? null : { kind: 'read', entry };
12
20
  }
13
21
  if (_isScopedCacheableTool(call.name)) {
@@ -3,8 +3,8 @@
3
3
  * the ordinary session catalog.
4
4
  *
5
5
  * Everything runs on one worker thread (./worker.mjs): the catalog engine's
6
- * change detection (summary index, sessions directory, per-file stamps, `.hb`
7
- * liveness, background verification) feeds `<dataDir>/session-catalog.sqlite`
6
+ * change detection (summary index, sessions directory, per-file stamps,
7
+ * background verification) feeds `<dataDir>/session-catalog.sqlite`
8
8
  * and an ordinary listing is one request that answers from it. This thread
9
9
  * does no filesystem work for it and never loads node:sqlite.
10
10
  *
@@ -24,7 +24,6 @@ import { dataDir as currentDataDir } from '../store-summary-locations.mjs';
24
24
  export const SESSION_CATALOG_DB_FILE = 'session-catalog.sqlite';
25
25
  /** Config: `{ "sessionStore": { "sqliteCatalog": false } }` forces the JSON
26
26
  * path (an off-switch); absent or true uses the DB whenever it can. */
27
- export const SESSION_STORE_CONFIG_SECTION = 'sessionStore';
28
27
  export const SESSION_STORE_CONFIG_DEFAULTS = Object.freeze({ sqliteCatalog: true });
29
28
  /** Stable prefix of every daemon.log line of the catalog DB. */
30
29
  export const SESSION_CATALOG_LOG_PREFIX = '[session-catalog-db]';
@@ -11,7 +11,7 @@ import { createHash } from 'node:crypto';
11
11
 
12
12
  /** Bumped whenever the table layout or a codec changes: the DB is then
13
13
  * dropped and backfilled again from the JSON catalog. */
14
- export const SCHEMA_VERSION = 5;
14
+ export const SCHEMA_VERSION = 6;
15
15
  /** PRAGMA application_id ('MXSC'): a file without it is not this catalog. */
16
16
  export const APPLICATION_ID = 0x4d585343;
17
17
 
@@ -27,8 +27,6 @@ const FIELDS = [
27
27
  ['lastUsedAt', 'last_used_at', 'real'],
28
28
  ['createdAt', 'created_at', 'real'],
29
29
  ['lastHeartbeatAt', 'last_heartbeat_at', 'real'],
30
- // Always 0 in a stored row: liveness is overlaid from `.hb` sidecars at read.
31
- ['heartbeatAt', 'heartbeat_at', 'real'],
32
30
  ['closed', 'closed', 'bool'],
33
31
  ['status', 'status', 'text'],
34
32
  ['owner', 'owner', 'loose'],
@@ -195,16 +193,10 @@ export function rowFromDb(record) {
195
193
  return row;
196
194
  }
197
195
 
198
- // Overlays a listing adds at read time; never part of the comparison.
199
- const OVERLAY_KEYS = new Set(['heartbeatAt', 'agentHeartbeatAt']);
200
-
201
- /** Comparable JSON of a row's stored fields (overlays excluded). */
196
+ /** Comparable JSON of a row's stored fields. */
202
197
  function comparable(row) {
203
198
  const out = [];
204
- for (const [key] of FIELDS) {
205
- if (OVERLAY_KEYS.has(key)) continue;
206
- out.push(row[key] === undefined ? null : row[key]);
207
- }
199
+ for (const [key] of FIELDS) out.push(row[key] === undefined ? null : row[key]);
208
200
  return JSON.stringify(out);
209
201
  }
210
202
 
@@ -2,8 +2,8 @@
2
2
  //
3
3
  // It owns `<dataDir>/session-catalog.sqlite` and runs the ordinary catalog
4
4
  // engine (store-summary-catalog.mjs): the summary index stamps and delta-log
5
- // apply, the sessions-directory name diff, per-file stamps, `.hb` liveness and
6
- // the background verification. An ordinary listing is one `list` request: the
5
+ // apply, the sessions-directory name diff, per-file stamps and the background
6
+ // verification. An ordinary listing is one `list` request: the
7
7
  // engine's cheap stamp check runs first (so changes by any writer appear as
8
8
  // soon as they do on the JSON path), its changes are written to the DB, and
9
9
  // the answer comes from the DB. When one of the daemon's own writes changed a
@@ -20,8 +20,7 @@ import { existsSync, mkdirSync, readFileSync, renameSync, statSync } from 'node:
20
20
  import { dirname, join } from 'node:path';
21
21
  import { performance } from 'node:perf_hooks';
22
22
  import { postWorkerEvent, serveWorkerRequests } from '../../../../shared/worker-requests.mjs';
23
- import { agentHeartbeatsByOwner, createOrdinaryCatalog, isLeadVisibleRow } from '../store-summary-catalog.mjs';
24
- import { positiveNumber } from '../store-summary-fields.mjs';
23
+ import { createOrdinaryCatalog, isLeadVisibleRow } from '../store-summary-catalog.mjs';
25
24
  import { SQLITE_REQUIREMENT, sqliteVersionSupported } from './sqlite-gate.mjs';
26
25
  import {
27
26
  APPLICATION_ID,
@@ -514,30 +513,15 @@ function switchedOff(s) {
514
513
  return s.switchOff.value;
515
514
  }
516
515
 
517
- /** Rows from the DB with the liveness of the current scan overlaid. */
516
+ /** Rows from the DB. */
518
517
  function answer(s, page) {
519
- const heartbeatMtimes = s.engine.current()?.heartbeatMtimes ?? new Map();
520
- const live = [];
521
- for (const [id, heartbeatAt] of heartbeatMtimes) {
522
- const entry = resolve(s, id);
523
- if (entry) live.push({ ...entry.row, heartbeatAt });
524
- }
525
- const agentHeartbeatByOwner = agentHeartbeatsByOwner(live);
526
- const overlay = (row) => {
527
- const agentHeartbeatAt = agentHeartbeatByOwner.get(row.id) || 0;
528
- return {
529
- ...row,
530
- heartbeatAt: positiveNumber(heartbeatMtimes.get(row.id), 0),
531
- ...(agentHeartbeatAt > 0 ? { agentHeartbeatAt } : {}),
532
- };
533
- };
534
518
  const { statements } = s;
535
- if (!page) return { rows: statements.listAll.all().map((record) => overlay(rowFromDb(record))), more: false };
519
+ if (!page) return { rows: statements.listAll.all().map(rowFromDb), more: false };
536
520
  const { limit, after } = page;
537
521
  const records = after
538
522
  ? statements.listAfter.all(after.activity, after.activity, after.id, limit + 1)
539
523
  : statements.listFirst.all(limit + 1);
540
- return { rows: records.slice(0, limit).map((record) => overlay(rowFromDb(record))), more: records.length > limit };
524
+ return { rows: records.slice(0, limit).map(rowFromDb), more: records.length > limit };
541
525
  }
542
526
 
543
527
  const unavailable = (reason, final = false) => ({ status: 'unavailable', reason, final });
@@ -4,6 +4,7 @@ import { SUMMARY_PREFIX } from './constants.mjs';
4
4
  import { sha16, roleCounts } from './text-utils.mjs';
5
5
  import { carryMessageId, withoutMessageIdsReplacer } from '../message-ids.mjs';
6
6
  import {
7
+ contextAckMessage,
7
8
  isActualUserInstructionMessage,
8
9
  isInjectedSkillBodyMessage,
9
10
  isProtectedContextUserMessage,
@@ -27,6 +28,7 @@ export function makeSummaryMessage(content) {
27
28
  // User-message classification lives in the import-light user-message-kind.mjs
28
29
  // (the session store counts real turns with it); re-exported for callers.
29
30
  export {
31
+ contextAckMessage,
30
32
  isActualUserInstructionMessage,
31
33
  isInjectedSkillBodyMessage,
32
34
  isProtectedContextUserMessage,
@@ -10,6 +10,8 @@ import {
10
10
  textByteLength,
11
11
  } from './text-utils.mjs';
12
12
  import {
13
+ contextAckMessage,
14
+ isProtectedContextAckMessage,
13
15
  isSummaryMessage,
14
16
  latestActualUserInstructionIndex,
15
17
  latestActualUserInstructionMessage,
@@ -20,7 +22,7 @@ import { buildExecutionTail } from './execution-tail.mjs';
20
22
  import { latestSkillBodies } from '../../context/skill-state.mjs';
21
23
  import { effectiveBudget } from './budget.mjs';
22
24
  import { stripRuntimeUserContext, withRuntimeUserContext } from '../runtime-user-context.mjs';
23
- import { carryMessageId } from '../message-ids.mjs';
25
+ import { carryMessageId, messageIdOf } from '../message-ids.mjs';
24
26
  import { normalizeIngestRole, shouldExcludeIngestMessage } from '../../../../memory/lib/session-ingest.mjs';
25
27
  import { codexWireSendOpts } from '../manager/session-id.mjs';
26
28
  import { rebaseCompactedEffortConfiguration } from '../../providers/effort-configuration.mjs';
@@ -48,9 +50,11 @@ function splitFreshSource(messages) {
48
50
  const sanitized = redactToolCallSecretsInMessages(reconcileDedupStubs(sanitizeToolPairs(messages)));
49
51
  const { protectedPrefix, conversation } = splitProtectedContext(sanitized);
50
52
  let previousSummaryMessage = null;
53
+ let previousAck = null;
51
54
  for (let index = conversation.length - 1; index >= 0; index -= 1) {
52
55
  if (isSummaryMessage(conversation[index])) {
53
56
  previousSummaryMessage = conversation[index];
57
+ if (isProtectedContextAckMessage(conversation[index + 1])) previousAck = conversation[index + 1];
54
58
  break;
55
59
  }
56
60
  }
@@ -59,6 +63,7 @@ function splitFreshSource(messages) {
59
63
  protectedPrefix,
60
64
  previousSummary: previousSummaryMessage?.content || null,
61
65
  previousSummaryMessage,
66
+ previousAck,
62
67
  // Budgeting, AI input and rule-only retention use this same projection.
63
68
  // Keep current-turn reminders; remove only proven runtime additions from
64
69
  // older requests. Unmarked legacy text remains part of the summary budget.
@@ -505,6 +510,15 @@ function freshSkillBudget(targetBudget, budget, committed) {
505
510
  return Math.max(0, Math.min(25_000, Math.floor(targetBudget * 0.2), budget - estimateMessagesTokens(committed)));
506
511
  }
507
512
 
513
+ // Every pass rebuilds the ack; it keeps the previous ack's id so the archive
514
+ // does not count an unchanged ack as dropped, unless the tail still holds it.
515
+ function stableAckMessage(previousAck, volatileTail) {
516
+ const ack = contextAckMessage();
517
+ const id = messageIdOf(previousAck);
518
+ if (!id || volatileTail.some((message) => messageIdOf(message) === id)) return ack;
519
+ return carryMessageId(ack, previousAck);
520
+ }
521
+
508
522
  // The pieces every fresh context carries: the protected prefix, the handoff
509
523
  // summary (or the previous one when no handoff was produced), the stable
510
524
  // acknowledgement between them and the volatile tail. `mandatory` is what
@@ -518,7 +532,7 @@ function freshContextLayout(source, budgetTokens, opts) {
518
532
  ? fitFreshContextSummaryMessage(source.live, handoffText, Number.MAX_SAFE_INTEGER)
519
533
  : source.previousSummaryMessage;
520
534
  const tail = freshContextTail(source, budgetTokens, !replaceConversation, opts);
521
- const stableAck = tail.latestUser && summaryMessage ? { role: 'assistant', content: '.' } : null;
535
+ const stableAck = tail.latestUser && summaryMessage ? stableAckMessage(source.previousAck, tail.volatileTail) : null;
522
536
  const stableHead = [
523
537
  ...source.protectedPrefix,
524
538
  ...(summaryMessage ? [summaryMessage] : []),
@@ -55,6 +55,34 @@ export function isInjectedSkillBodyMessage(m) {
55
55
  return typeof m.content === 'string' && m.content.trimStart().startsWith('<skill>');
56
56
  }
57
57
 
58
+ const CONTEXT_ACK_SOURCE = 'context-ack';
59
+
60
+ /** The assistant `.` that closes an injected context turn (compact summary,
61
+ * reminder, reference files) so the next prompt stays its own message. It is
62
+ * model context only and never displayed. */
63
+ export function contextAckMessage() {
64
+ return { role: 'assistant', content: '.', meta: { source: CONTEXT_ACK_SOURCE } };
65
+ }
66
+
67
+ /** Whether `message` is a context ack: marked, or (stored before the marker
68
+ * existed) a bare `.` right after injected context (`previous`). */
69
+ export function isContextAckMessage(message, previous = null) {
70
+ if (
71
+ message?.role !== 'assistant' ||
72
+ typeof message.content !== 'string' ||
73
+ message.content.trim() !== '.' ||
74
+ Array.isArray(message.toolCalls)
75
+ ) {
76
+ return false;
77
+ }
78
+ if (message.meta?.source === CONTEXT_ACK_SOURCE) return true;
79
+ return (
80
+ isSummaryMessage(previous) ||
81
+ isProtectedContextUserMessage(previous) ||
82
+ (previous?.role === 'user' && /^Reference files:\s*/i.test(userMessageText(previous).trimStart()))
83
+ );
84
+ }
85
+
58
86
  const SYNTHETIC_USER_SOURCES = new Set([
59
87
  'goal-continuation',
60
88
  'goal-closeout',
@@ -25,7 +25,7 @@ import { renameWithRetrySync } from '../../../shared/atomic-file.mjs';
25
25
  import { writeStderrBestEffort } from '../../../shared/best-effort-stderr.mjs';
26
26
 
27
27
  import { sanitizeContentForStoredHistory } from '../providers/media-normalization.mjs';
28
- import { getStoreDir } from './store/paths-heartbeat.mjs';
28
+ import { getStoreDir } from './store/session-paths.mjs';
29
29
  import { forgetSessionSaveBaseline } from './store/save-worker.mjs';
30
30
  import { messageIdOf, stampMessageIds } from './message-ids.mjs';
31
31
  import { restoreTranscriptItems } from './transcript-restore/restore.mjs';
@@ -176,9 +176,3 @@ export function createClaudeReducer() {
176
176
  },
177
177
  };
178
178
  }
179
-
180
- export function convertClaudeRecords(records) {
181
- const reducer = createClaudeReducer();
182
- for (const record of records) reducer.push(record);
183
- return reducer.result();
184
- }
@@ -113,12 +113,6 @@ export function createCodexReducer() {
113
113
  };
114
114
  }
115
115
 
116
- export function convertCodexRecords(records) {
117
- const reducer = createCodexReducer();
118
- for (const record of records) reducer.push(record);
119
- return reducer.result();
120
- }
121
-
122
116
  /** id/cwd of a `session_meta` first line cut off by a bounded prefix read. */
123
117
  export function codexMetaFromTruncatedLine(line) {
124
118
  const text = String(line || '');
@@ -76,7 +76,7 @@ export function createEagerAdmission({ tools, cwd, sessionId, sessionRef, repeat
76
76
  // The same cache policy authorizes both serial cache hits and short
77
77
  // cross-turn references. Recheck there: an entry can expire or be
78
78
  // invalidated between streaming admission and serial consumption.
79
- if (lookupToolResultReuse({ sessionId, call, cwd, touch: false }) !== null) return null;
79
+ if (lookupToolResultReuse({ sessionId, call, cwd, touch: false, sessionRef }) !== null) return null;
80
80
  return { sig, dedupEligible };
81
81
  }
82
82
 
@@ -0,0 +1,10 @@
1
+ // Named sessions no longer receive automatic tombstones. Ownerless legacy
2
+ // records still follow idle retention, so their closures are not historical.
3
+ export function isHistoricalAutomaticClosure(session) {
4
+ return (
5
+ typeof session?.owner === 'string' &&
6
+ session.owner.length > 0 &&
7
+ (session?.closed === true || session?.status === 'closed') &&
8
+ (session.closedReason === 'idle-sweep' || session.closedReason === 'terminal-reap')
9
+ );
10
+ }
@@ -100,15 +100,12 @@ export function buildIntermediateAssistantMessage(resp, opts) {
100
100
  // recovery, and interruption; deferBodies keeps mutation bodies verbatim for
101
101
  // the rest of the session (collapsing them later rewrote an already-cached
102
102
  // prefix and re-billed the request uncached).
103
- export function buildToolCallAssistantMessage(response, { calls, suppressMidTurnText, opts }) {
103
+ export function buildToolCallAssistantMessage(response, { calls, opts }) {
104
104
  return attachAssistantTranscriptMetadata(
105
105
  {
106
106
  role: 'assistant',
107
107
  createdAt: Date.now(),
108
- // Sub-agent tool-call turns carry only mid-turn preamble in
109
- // response.content (the real result rides the later final-answer
110
- // turn). Blank it so it never accumulates as input tokens.
111
- content: suppressMidTurnText ? '' : response.content || '',
108
+ content: response.content || '',
112
109
  toolCalls: compactToolCallsForHistory(calls, { deferBodies: true }),
113
110
  ...assistantEchoFields(assistantEchoPayloads(response, { keepAssistantBlocks: true })),
114
111
  },
@@ -612,9 +612,7 @@ export function fixedRequestOverhead(policy, messages, tools, sessionRef = null)
612
612
  const calibration = policyTokenCalibration(policy);
613
613
  const toProviderScale = (raw) => Math.ceil(Math.max(0, raw) * calibration);
614
614
  const toolTokens = toProviderScale(policyRequestReserveTokens(policy));
615
- const systemTokens = toProviderScale(
616
- estimateMessagesTokens(splitProtectedContext(messages || []).protectedPrefix)
617
- );
615
+ const systemTokens = toProviderScale(estimateMessagesTokens(splitProtectedContext(messages || []).protectedPrefix));
618
616
  const configuredReserve = Math.max(0, Number(policy.configuredReserveTokens) || 0);
619
617
  const fixed = toolTokens + systemTokens;
620
618
  // A provider reading of this very prefix with these very tools measured
@@ -676,7 +674,7 @@ export function fixedRequestOverheadInputs(policy, messages) {
676
674
  function measuredFixedRequestTokens(sessionRef, messages, policy) {
677
675
  if (!sessionRef || !Array.isArray(messages)) return null;
678
676
  const aligned = providerBaselineCoverage(sessionRef, messages);
679
- if (!aligned || !aligned.toolSignature || aligned.toolSignature !== policy?.toolSchemaSignature) return null;
677
+ if (!aligned?.toolSignature || aligned.toolSignature !== policy?.toolSchemaSignature) return null;
680
678
  return aligned.tokens;
681
679
  }
682
680
 
@@ -62,11 +62,11 @@ export class ToolSurfaceExceedsContextError extends Error {
62
62
  const headline = reserve
63
63
  ? 'The configured compaction headroom leaves no room for conversation history'
64
64
  : 'Tool definitions and system context leave no room for conversation history';
65
+ const fewerReservedHint =
66
+ overhead.configuredReserveTokens > 0 ? ', or configure fewer reserved tokens (compaction.reservedTokens)' : '';
65
67
  const remedy = reserve
66
68
  ? 'Lower the configured headroom (compaction.reservedTokens or MIXDOG_AGENT_COMPACT_RESERVED_TOKENS), or use a model with a larger context window.'
67
- : `Use a model with a larger context window, or send a smaller eager tool surface (disable MCP servers or custom tools this session does not need)${
68
- overhead.configuredReserveTokens > 0 ? ', or configure fewer reserved tokens (compaction.reservedTokens)' : ''
69
- }.`;
69
+ : `Use a model with a larger context window, or send a smaller eager tool surface (disable MCP servers or custom tools this session does not need)${fewerReservedHint}.`;
70
70
  const largest = overhead.largestTools.map((tool) => `${tool.name} (${tokens(tool.tokens)})`).join(', ');
71
71
  super(
72
72
  [
@@ -3,7 +3,6 @@
3
3
  * request-loop bookkeeping, plus the
4
4
  * helpers every phase shares (abort check, steering drain, no-tool resolver).
5
5
  */
6
- import { isAgentOwner } from '../../agent-owner.mjs';
7
6
  import { SessionClosedError } from '../manager/session-errors.mjs';
8
7
  import { resolveLiveToolCwd } from './tool-exec.mjs';
9
8
  import { createSteeringDrain } from './steering.mjs';
@@ -20,19 +19,6 @@ export const REPEAT_FAIL_LIMIT = 3;
20
19
  // (drop-oldest / insertion order).
21
20
  export const CROSS_TURN_CAP = 500;
22
21
 
23
- // Agent mid-turn text is suppressed unless THIS send explicitly requested a
24
- // live projection. The request is a send-opt (`liveProjection`) — never a
25
- // durable session field — so a transient Agent pane cannot leak into later
26
- // silent dispatches or stored session JSON. The standalone surface still
27
- // flips `interactiveSessionSurface` on the in-memory session; honor that
28
- // in-process hint without treating it as something dispatch should persist.
29
- export function shouldSuppressAgentMidTurnText(sessionRef, opts = {}) {
30
- if (!isAgentOwner(sessionRef)) return false;
31
- if (opts?.liveProjection === true) return false;
32
- if (sessionRef?.interactiveSessionSurface === true) return false;
33
- return true;
34
- }
35
-
36
22
  export function createLoopState({ provider, messages, model, tools, cwd, sendOpts }) {
37
23
  const opts = sendOpts || {};
38
24
  const sessionId = opts.sessionId || null;
@@ -44,17 +30,6 @@ export function createLoopState({ provider, messages, model, tools, cwd, sendOpt
44
30
  if (sessionRef && Object.hasOwn(sessionRef, '_providerToolSurfaceSnapshot')) {
45
31
  delete sessionRef._providerToolSurfaceSnapshot;
46
32
  }
47
- // Sub-agent (worker/heavy-worker/reviewer/…) sessions drop mid-turn
48
- // assistant preamble text outright. Only the final <final-answer> reply is
49
- // consumed by Lead, so any "Now let me…" prose that precedes a tool call is
50
- // pure noise — for live surfacing AND for the agent's own history (where it
51
- // re-enters context as input tokens on every later turn):
52
- // - streaming : opts.onTextDelta suppressed (token-by-token preamble)
53
- // - buffered : opts.onAssistantText skipped (response.content)
54
- // - history : tool-call turn content blanked before messages.push
55
- // Reasoning/thinking deltas, tool calls, and the final answer are kept.
56
- const suppressMidTurnText = shouldSuppressAgentMidTurnText(sessionRef, opts);
57
- if (suppressMidTurnText) opts.onTextDelta = undefined;
58
33
  // Out-of-loop transcript mutations (post-turn/manual compaction in
59
34
  // manager/compaction-runner.mjs) run where no send opts exist; they park a
60
35
  // one-shot intent on the session so the FIRST send of the next turn tags
@@ -74,7 +49,6 @@ export function createLoopState({ provider, messages, model, tools, cwd, sendOpt
74
49
  sessionRef,
75
50
  sessionAgent: opts.session?.agent,
76
51
  forcedFirstTool: opts.forcedFirstTool ?? null,
77
- suppressMidTurnText,
78
52
  // sessionRef.cwd is the live SSOT. The legacy positional cwd is only the
79
53
  // turn-start snapshot and becomes stale after an in-turn cwd tool call.
80
54
  cwd: resolveLiveToolCwd(cwd, sessionRef),
@@ -157,7 +131,6 @@ export function createLoopState({ provider, messages, model, tools, cwd, sendOpt
157
131
  opts,
158
132
  sessionId,
159
133
  sessionAgent: state.sessionAgent,
160
- suppressMidTurnText,
161
134
  drainSteering: state.drainSteering,
162
135
  });
163
136
  return state;
@@ -20,7 +20,7 @@ function resumePrompt(response, attempt) {
20
20
  }
21
21
 
22
22
  export function resolveOutputLimit(response, { state, segments, messages }) {
23
- segments.record(response.content, { keepWhenSuppressed: true });
23
+ segments.record(response.content);
24
24
  if (state.maxOutputRecoveryCount < MAX_OUTPUT_RECOVERY_LIMIT) {
25
25
  // The partial assistant turn must be visible to the model so it can
26
26
  // resume at the exact cutoff instead of reconstructing or repeating
@@ -1,13 +1,13 @@
1
1
  // Committed-but-unsealed text segments of one user turn.
2
2
  //
3
- // Max-output recovery parts plus (Lead/TUI only) text-only continuation
3
+ // Max-output recovery parts plus text-only continuation
4
4
  // segments (provider pause_turn / terminal steering / stop hook). The terminal
5
5
  // response returns content = parts + terminal so the UI row that accumulated
6
6
  // every streamed segment is not overwritten down to only the last segment;
7
7
  // historyContent keeps persistence single-copy.
8
8
  import { buildIntermediateAssistantMessage, commitAssistantMessage } from '../assistant-commit.mjs';
9
9
 
10
- export function createTurnSegments({ messages, opts, suppressMidTurnText }) {
10
+ export function createTurnSegments({ messages, opts }) {
11
11
  const parts = [];
12
12
  return {
13
13
  parts,
@@ -18,15 +18,9 @@ export function createTurnSegments({ messages, opts, suppressMidTurnText }) {
18
18
  return true;
19
19
  },
20
20
  // Record a mid-turn segment for the caller-facing aggregate and surface it
21
- // live. A suppressed sub-agent session neither surfaces nor accumulates
22
- // text — except on the max-output ladder, whose parts must still rebuild
23
- // the complete answer the caller receives (keepWhenSuppressed).
21
+ // live for every session.
24
22
  // `committed: true` marks text that is the just-committed message's own.
25
- record(text, { keepWhenSuppressed = false, committed = false } = {}) {
26
- if (suppressMidTurnText) {
27
- if (keepWhenSuppressed) parts.push(text);
28
- return;
29
- }
23
+ record(text, { committed = false } = {}) {
30
24
  parts.push(text);
31
25
  try {
32
26
  opts.onAssistantText?.(text, { committed });
@@ -19,15 +19,8 @@ import { resolveRefusal } from './no-tool-turn/refusal.mjs';
19
19
  import { resumeContinuation } from './no-tool-turn/continuation.mjs';
20
20
  import { nudgeEmptyTurn } from './no-tool-turn/empty-nudge.mjs';
21
21
 
22
- export function createNoToolTurnResolver({
23
- messages,
24
- opts,
25
- sessionId,
26
- sessionAgent,
27
- suppressMidTurnText,
28
- drainSteering,
29
- }) {
30
- const segments = createTurnSegments({ messages, opts, suppressMidTurnText });
22
+ export function createNoToolTurnResolver({ messages, opts, sessionId, sessionAgent, drainSteering }) {
23
+ const segments = createTurnSegments({ messages, opts });
31
24
  // Per-turn recovery counters shared by the ladders.
32
25
  const state = {
33
26
  maxOutputRecoveryCount: 0,
@@ -103,7 +103,10 @@ export function preDispatchDenyForSession(sessionRef, call) {
103
103
  // its wire id with the projection error; call_tool itself never dispatches.
104
104
  if (typeof call.bridgeError === 'string') return call.bridgeError;
105
105
  if (name === BRIDGE_CALL_TOOL_NAME && isToolBridgeEnabled(sessionRef)) {
106
- return bridgeErrorText('BRIDGE_RECURSION', 'call_tool runs one tool named in its arguments and cannot be dispatched itself.');
106
+ return bridgeErrorText(
107
+ 'BRIDGE_RECURSION',
108
+ 'call_tool runs one tool named in its arguments and cannot be dispatched itself.'
109
+ );
107
110
  }
108
111
  const schemaName = String(call?.schemaName || name);
109
112
  // A tool the provider left out of this request still exists in the session;
@@ -13,7 +13,10 @@ import { actionInputUnionFor } from '../../providers/lib/action-input-contract.m
13
13
  import { isAntigravityClaude } from '../../providers/antigravity-request.mjs';
14
14
  import { isResponsesFreeformTool } from '../../providers/custom-tool-wire.mjs';
15
15
  import { ANTHROPIC_NATIVE_PROVIDERS } from '../../runtime-core/tool-catalog-schema.mjs';
16
- import { finalizeProviderRequestTools, providerNativeToolPrefixCount } from '../../runtime-core/provider-request-tools.mjs';
16
+ import {
17
+ finalizeProviderRequestTools,
18
+ providerNativeToolPrefixCount,
19
+ } from '../../runtime-core/provider-request-tools.mjs';
17
20
 
18
21
  const sessions = new WeakMap();
19
22
 
@@ -5,10 +5,7 @@
5
5
  import { repairTranscriptBeforeProviderSend } from './transcript-repair.mjs';
6
6
  import { messagesArrayChanged } from './tool-helpers.mjs';
7
7
  import { runPreSendCompactPass } from '../pre-send-compact.mjs';
8
- import {
9
- refreshDeferredMcpToolCatalog,
10
- snapshotProviderRequestTools,
11
- } from '../../runtime-core/tool-catalog.mjs';
8
+ import { refreshDeferredMcpToolCatalog, snapshotProviderRequestTools } from '../../runtime-core/tool-catalog.mjs';
12
9
  import {
13
10
  finalizeProviderRequestTools,
14
11
  providerNativeToolPrefixCount,