mixdog 1.2.2 → 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 (692) hide show
  1. package/README.md +18 -0
  2. package/package.json +2 -1
  3. package/scripts/gate-local.mjs +6 -4
  4. package/scripts/lib/gate-scheduler.mjs +29 -11
  5. package/scripts/probe-provider-catalog.mjs +31 -0
  6. package/scripts/provider-pingpong-live.mjs +599 -0
  7. package/scripts/session-sweep.mjs +5 -25
  8. package/src/agents/advisor/AGENT.md +1 -1
  9. package/src/agents/advisor/agent.json +1 -1
  10. package/src/agents/maintainer/AGENT.md +1 -1
  11. package/src/agents/maintainer/agent.json +1 -1
  12. package/src/agents/reviewer/AGENT.md +2 -4
  13. package/src/agents/security/AGENT.md +1 -2
  14. package/src/agents/writer/AGENT.md +2 -3
  15. package/src/defaults/shipped-history.json +11 -1
  16. package/src/defaults/skills/image/SKILL.md +21 -23
  17. package/src/defaults/skills/setup/SKILL.md +6 -1
  18. package/src/defaults/skills/setup/references/actions.md +44 -22
  19. package/src/defaults/skills/setup/references/surfaces.md +10 -8
  20. package/src/headless-exec.mjs +15 -8
  21. package/src/lib/keychain-cjs.cjs +20 -15
  22. package/src/output-styles/common.md +11 -10
  23. package/src/rules/agent/AGENT.md +6 -4
  24. package/src/rules/lead/LEAD.md +7 -9
  25. package/src/rules/shared/45-destructive.md +4 -0
  26. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +1 -0
  27. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +28 -7
  28. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -11
  29. package/src/runtime/agent/orchestrator/agent-trace-io.mjs +92 -61
  30. package/src/runtime/agent/orchestrator/cache-mtime.mjs +10 -1
  31. package/src/runtime/agent/orchestrator/config-providers-merge.mjs +7 -0
  32. package/src/runtime/agent/orchestrator/config.mjs +5 -0
  33. package/src/runtime/agent/orchestrator/context/collect.mjs +1 -0
  34. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +26 -7
  35. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +112 -7
  36. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +101 -23
  37. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +2 -0
  38. package/src/runtime/agent/orchestrator/providers/anthropic-api-key-fetch.mjs +36 -0
  39. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +48 -20
  40. package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +3 -1
  41. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +24 -17
  42. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +9 -9
  43. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  44. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +26 -44
  45. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +31 -15
  46. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-blocks.mjs +20 -1
  47. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-delta.mjs +15 -2
  48. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-start.mjs +11 -4
  49. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/message-events.mjs +3 -0
  50. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +12 -5
  51. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-outcome.mjs +1 -0
  52. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-state.mjs +14 -0
  53. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +2 -0
  54. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +9 -0
  55. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +10 -0
  56. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +41 -12
  57. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +13 -1
  58. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +131 -9
  59. package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +29 -10
  60. package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +125 -8
  61. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +12 -62
  62. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +117 -41
  63. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  64. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +117 -72
  65. package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +78 -2
  66. package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +39 -5
  67. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
  68. package/src/runtime/agent/orchestrator/providers/cursor-native-context.mjs +48 -0
  69. package/src/runtime/agent/orchestrator/providers/cursor-wire-exec.mjs +144 -34
  70. package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +28 -4
  71. package/src/runtime/agent/orchestrator/providers/cursor-wire-request.mjs +8 -4
  72. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +42 -11
  73. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +109 -6
  74. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +17 -4
  75. package/src/runtime/agent/orchestrator/providers/cursor.mjs +22 -2
  76. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +73 -7
  77. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +75 -6
  78. package/src/runtime/agent/orchestrator/providers/custom-reasoning.mjs +34 -7
  79. package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +32 -6
  80. package/src/runtime/agent/orchestrator/providers/deepseek.mjs +67 -0
  81. package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +29 -5
  82. package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +11 -4
  83. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +36 -13
  84. package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +101 -11
  85. package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +41 -5
  86. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +1 -0
  87. package/src/runtime/agent/orchestrator/providers/gemini-rest-stream/watchdogs.mjs +16 -5
  88. package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +19 -14
  89. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +371 -41
  90. package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +1 -2
  91. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +97 -49
  92. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +81 -10
  93. package/src/runtime/agent/orchestrator/providers/gemini.mjs +35 -8
  94. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
  95. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +1 -0
  96. package/src/runtime/agent/orchestrator/providers/lib/action-input-contract.mjs +60 -0
  97. package/src/runtime/agent/orchestrator/providers/lib/anthropic-native-blocks.mjs +1 -0
  98. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +253 -42
  99. package/src/runtime/agent/orchestrator/providers/lib/anthropic-server-tool-usage.mjs +18 -0
  100. package/src/runtime/agent/orchestrator/providers/lib/anthropic-system-blocks.mjs +27 -6
  101. package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +392 -0
  102. package/src/runtime/agent/orchestrator/providers/lib/inclusive-usage.mjs +54 -0
  103. package/src/runtime/agent/orchestrator/providers/lib/origin-bound-fetch.mjs +16 -0
  104. package/src/runtime/agent/orchestrator/providers/lib/request-compression.mjs +86 -0
  105. package/src/runtime/agent/orchestrator/providers/lib/responses-terminal-fields.mjs +11 -0
  106. package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +8 -0
  107. package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +50 -22
  108. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +133 -21
  109. package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +13 -15
  110. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +7 -1
  111. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +1 -1
  112. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
  113. package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +92 -16
  114. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +13 -13
  115. package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +2 -0
  116. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +133 -62
  117. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +35 -14
  118. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +5 -2
  119. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +39 -7
  120. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/tool-call-acc.mjs +2 -9
  121. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +5 -0
  122. package/src/runtime/agent/orchestrator/providers/openai-compat-error-contract.mjs +1 -1
  123. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +84 -2
  124. package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +47 -25
  125. package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +5 -1
  126. package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +155 -0
  127. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +40 -24
  128. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +63 -25
  129. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2901 -0
  130. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +183 -0
  131. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +87 -6
  132. package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +51 -3
  133. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +7 -1
  134. package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -0
  135. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +103 -26
  136. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +23 -4
  137. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +11 -6
  138. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +17 -2
  139. package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +15 -23
  140. package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +64 -52
  141. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +23 -10
  142. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +28 -5
  143. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +10 -0
  144. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-items.mjs +18 -7
  145. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +4 -0
  146. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +5 -0
  147. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +9 -1
  148. package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +80 -0
  149. package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +3 -1
  150. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +7 -0
  151. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +7 -1
  152. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +72 -24
  153. package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +323 -0
  154. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +50 -16
  155. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +7 -19
  156. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/refusals.mjs +60 -0
  157. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +51 -36
  158. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state.mjs +30 -0
  159. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +12 -0
  160. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/terminal-frames.mjs +25 -6
  161. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +18 -9
  162. package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +181 -0
  163. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +78 -70
  164. package/src/runtime/agent/orchestrator/providers/openrouter.mjs +74 -0
  165. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +150 -10
  166. package/src/runtime/agent/orchestrator/providers/registry.mjs +13 -2
  167. package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +7 -1
  168. package/src/runtime/agent/orchestrator/providers/transport-scope.d.mts +6 -0
  169. package/src/runtime/agent/orchestrator/providers/transport-scope.mjs +28 -0
  170. package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +164 -0
  171. package/src/runtime/agent/orchestrator/providers/wire-route.mjs +522 -0
  172. package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +1131 -0
  173. package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +195 -0
  174. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +104 -0
  175. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +8 -6
  176. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +24 -0
  177. package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -0
  178. package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +30 -2
  179. package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +3 -2
  180. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -3
  181. package/src/runtime/agent/orchestrator/runtime-core/provider-request-snapshot.mjs +7 -3
  182. package/src/runtime/agent/orchestrator/runtime-core/session-title.mjs +21 -1
  183. package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +16 -3
  184. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge-contract.mjs +6 -0
  185. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +526 -0
  186. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
  187. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-schema.mjs +10 -7
  188. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +178 -71
  189. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +102 -12
  190. package/src/runtime/agent/orchestrator/runtime-core/tool-exposure.mjs +96 -0
  191. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +10 -8
  192. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +1 -2
  193. package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +24 -0
  194. package/src/runtime/agent/orchestrator/session/cache/tool-result-reuse.mjs +10 -2
  195. package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -3
  196. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +5 -11
  197. package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +6 -22
  198. package/src/runtime/agent/orchestrator/session/compact/constants.mjs +3 -2
  199. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +16 -93
  200. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +16 -2
  201. package/src/runtime/agent/orchestrator/session/compact/summary-anchor.mjs +5 -0
  202. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +148 -0
  203. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
  204. package/src/runtime/agent/orchestrator/session/context-tool-schema.mjs +17 -2
  205. package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -4
  206. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +0 -6
  207. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +0 -6
  208. package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +3 -2
  209. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +6 -1
  210. package/src/runtime/agent/orchestrator/session/historical-session-closure.mjs +10 -0
  211. package/src/runtime/agent/orchestrator/session/loop/assistant-commit.mjs +2 -5
  212. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +89 -1
  213. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +1 -1
  214. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +56 -0
  215. package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +18 -8
  216. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +1 -27
  217. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/output-limit.mjs +1 -1
  218. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +4 -10
  219. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +2 -9
  220. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +24 -10
  221. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +135 -0
  222. package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +31 -4
  223. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +76 -0
  224. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +67 -20
  225. package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +10 -10
  226. package/src/runtime/agent/orchestrator/session/loop/tool-call-resolution.mjs +95 -0
  227. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +6 -0
  228. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +30 -3
  229. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +29 -5
  230. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +15 -1
  231. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +147 -0
  232. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +7 -5
  233. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +33 -3
  234. package/src/runtime/agent/orchestrator/session/manager/ask-support.mjs +0 -4
  235. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +23 -2
  236. package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +34 -12
  237. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +54 -13
  238. package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +33 -0
  239. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +57 -25
  240. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +11 -0
  241. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +22 -0
  242. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +57 -13
  243. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +8 -0
  244. package/src/runtime/agent/orchestrator/session/manager/failed-turn-rewind.mjs +16 -0
  245. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +6 -120
  246. package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +1 -1
  247. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +231 -16
  248. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +42 -49
  249. package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +50 -0
  250. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +47 -17
  251. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +26 -4
  252. package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +82 -0
  253. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +36 -35
  254. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +29 -13
  255. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +6 -3
  256. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -1
  257. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +45 -0
  258. package/src/runtime/agent/orchestrator/session/manager.mjs +4 -10
  259. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +6 -0
  260. package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +2 -1
  261. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +17 -1
  262. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +96 -0
  263. package/src/runtime/agent/orchestrator/session/side-question.mjs +197 -0
  264. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +22 -15
  265. package/src/runtime/agent/orchestrator/session/store/lifecycle-read.mjs +1 -1
  266. package/src/runtime/agent/orchestrator/session/store/listing.mjs +2 -6
  267. package/src/runtime/agent/orchestrator/session/store/live-cache-eviction.mjs +1 -1
  268. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +23 -0
  269. package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +46 -37
  270. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +1 -1
  271. package/src/runtime/agent/orchestrator/session/store/load-session.mjs +1 -1
  272. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +44 -37
  273. package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +4 -2
  274. package/src/runtime/agent/orchestrator/session/store/session-paths.mjs +59 -0
  275. package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +1 -1
  276. package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +1 -1
  277. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +27 -21
  278. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-plan.mjs +0 -8
  279. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +6 -18
  280. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +33 -106
  281. package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +4 -2
  282. package/src/runtime/agent/orchestrator/session/store-agent-worker-pool.mjs +5 -8
  283. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +136 -196
  284. package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +34 -15
  285. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +53 -115
  286. package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +8 -0
  287. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +10 -1
  288. package/src/runtime/agent/orchestrator/session/store-summary-locations.mjs +3 -29
  289. package/src/runtime/agent/orchestrator/session/store-summary-reader-catalog-fixture.mjs +1 -1
  290. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +17 -10
  291. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +9 -20
  292. package/src/runtime/agent/orchestrator/session/store.mjs +22 -19
  293. package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +12 -12
  294. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +38 -14
  295. package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +15 -4
  296. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +1 -1
  297. package/src/runtime/agent/orchestrator/session/tool-batch/state.mjs +7 -1
  298. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +4 -0
  299. package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +79 -0
  300. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +72 -15
  301. package/src/runtime/agent/orchestrator/session/turn-failure.mjs +45 -0
  302. package/src/runtime/agent/orchestrator/stall-policy.mjs +50 -0
  303. package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +8 -2
  304. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/command-preflight.mjs +3 -3
  305. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +5 -1
  306. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/inline-hoist.mjs +6 -2
  307. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +4 -1
  308. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +218 -20
  309. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +160 -39
  310. package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +7 -5
  311. package/src/runtime/agent/orchestrator/tools/builtin/grep-formatting.mjs +14 -5
  312. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +4 -3
  313. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-output.mjs +2 -1
  314. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-path-fanout.mjs +48 -44
  315. package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +10 -3
  316. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +247 -49
  317. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +5 -4
  318. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +6 -1
  319. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +23 -1
  320. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +20 -0
  321. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +101 -2
  322. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/root-resolution.mjs +1 -1
  323. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1 -1
  324. package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
  325. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +67 -0
  326. package/src/runtime/agent/orchestrator/tools/lib/process-table-fixture.mjs +50 -0
  327. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +303 -63
  328. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +2 -0
  329. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +108 -18
  330. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +77 -11
  331. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +81 -5
  332. package/src/runtime/agent/orchestrator/tools/patch/ui-diff.mjs +73 -39
  333. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +18 -1
  334. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -4
  335. package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +88 -12
  336. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +2 -0
  337. package/src/runtime/attachments/store.d.mts +9 -0
  338. package/src/runtime/attachments/store.mjs +80 -9
  339. package/src/runtime/browser-bridge/browser-action-contract.d.mts +0 -1
  340. package/src/runtime/browser-bridge/browser-action-contract.mjs +0 -2
  341. package/src/runtime/computer-bridge/action-schema.mjs +219 -196
  342. package/src/runtime/computer-bridge/linux-readiness.d.mts +0 -2
  343. package/src/runtime/computer-bridge/linux-readiness.mjs +0 -16
  344. package/src/runtime/effort-judge/judge-client.mjs +21 -4
  345. package/src/runtime/effort-judge/judge-worker.mjs +4 -1
  346. package/src/runtime/github/tool.mjs +208 -17
  347. package/src/runtime/media/adapters/codex-image.mjs +140 -21
  348. package/src/runtime/media/catalog.mjs +4 -4
  349. package/src/runtime/media/chatgpt-usage.mjs +55 -0
  350. package/src/runtime/media/defaults.mjs +37 -0
  351. package/src/runtime/media/jobs.mjs +12 -2
  352. package/src/runtime/media/lanes.mjs +12 -0
  353. package/src/runtime/media/tool-defs.mjs +15 -4
  354. package/src/runtime/media/tool.mjs +41 -12
  355. package/src/runtime/media/upstream-error.mjs +72 -6
  356. package/src/runtime/memory/index.mjs +1 -0
  357. package/src/runtime/memory/lib/http-router/ingest-routes.mjs +22 -1
  358. package/src/runtime/memory/lib/ingest/transcript-offsets.mjs +2 -0
  359. package/src/runtime/memory/lib/ingest/transcript-rows.mjs +1 -0
  360. package/src/runtime/memory/lib/pg/adapter.mjs +98 -1
  361. package/src/runtime/memory/lib/pg/process.mjs +36 -33
  362. package/src/runtime/memory/lib/pg/run-child.mjs +49 -0
  363. package/src/runtime/memory/lib/pg/supervisor.mjs +112 -4
  364. package/src/runtime/memory/lib/runtime-fetcher.mjs +12 -13
  365. package/src/runtime/memory/lib/transcript-ingest.mjs +14 -0
  366. package/src/runtime/office/README.md +1 -1
  367. package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
  368. package/src/runtime/office/authoring/html-browser.mjs +18 -8
  369. package/src/runtime/office/authoring/html-document-author.mjs +2 -0
  370. package/src/runtime/office/authoring/pdf-html-runner.mjs +1 -1
  371. package/src/runtime/office/authoring/pptx-contact-sheet.mjs +2 -0
  372. package/src/runtime/office/authoring/pptx-html-measure.mjs +3 -1
  373. package/src/runtime/office/authoring/pptx-html-runner.mjs +2 -0
  374. package/src/runtime/office/authoring/xlsx-html-runner.mjs +3 -1
  375. package/src/runtime/office/core/office-actions-read.mjs +3 -0
  376. package/src/runtime/office/core/office-render-preview.mjs +2 -0
  377. package/src/runtime/office/core/office-session-dispatch.mjs +7 -0
  378. package/src/runtime/office/core/office-sessionless-actions.mjs +8 -0
  379. package/src/runtime/office/core/office-sessions.mjs +5 -0
  380. package/src/runtime/office/core/office-transactions.mjs +3 -0
  381. package/src/runtime/office/core/office-write-ledger.mjs +94 -0
  382. package/src/runtime/office/design/library/templates/mixdog-executive.mixdog-edit.pptx +0 -0
  383. package/src/runtime/office/index.mjs +29 -0
  384. package/src/runtime/office/pdf/pdf-analysis.mjs +0 -68
  385. package/src/runtime/office/pdf/pdf-edit-document.mjs +2 -0
  386. package/src/runtime/office/pdf/pdf-render.mjs +23 -7
  387. package/src/runtime/office/pdf/pdf-security.mjs +2 -0
  388. package/src/runtime/office/portable/portable-opc.mjs +4 -1
  389. package/src/runtime/office/quality/visual-diff.mjs +2 -0
  390. package/src/runtime/session-search/session-search-ingest.mjs +1 -1
  391. package/src/runtime/shared/agent-reap-state.mjs +13 -0
  392. package/src/runtime/shared/atomic-file.d.mts +1 -1
  393. package/src/runtime/shared/background-tasks.mjs +6 -1
  394. package/src/runtime/shared/bounded-file-read.mjs +13 -0
  395. package/src/runtime/shared/bounded-line-diff.mjs +191 -0
  396. package/src/runtime/shared/browser-launch.mjs +15 -0
  397. package/src/runtime/shared/buffered-appender.mjs +18 -0
  398. package/src/runtime/shared/config.mjs +78 -18
  399. package/src/runtime/shared/err-text.mjs +48 -4
  400. package/src/runtime/shared/file-lock.mjs +6 -5
  401. package/src/runtime/shared/file-permissions.d.mts +6 -1
  402. package/src/runtime/shared/file-permissions.mjs +54 -6
  403. package/src/runtime/shared/llm/anthropic-betas.mjs +1 -2
  404. package/src/runtime/shared/llm/anthropic-effort.mjs +6 -0
  405. package/src/runtime/shared/llm/provider-model-identities.mjs +1 -0
  406. package/src/runtime/shared/llm/usage-accounting.mjs +5 -2
  407. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +3 -0
  408. package/src/runtime/shared/loopback-listener.mjs +9 -0
  409. package/src/runtime/shared/model-route-chain.d.mts +8 -0
  410. package/src/runtime/shared/model-route-chain.mjs +48 -0
  411. package/src/runtime/shared/model-route-fallback.mjs +22 -0
  412. package/src/runtime/shared/pid-liveness.mjs +12 -0
  413. package/src/runtime/shared/provider-api-key.mjs +8 -0
  414. package/src/runtime/shared/provider-timeout-phase.mjs +17 -0
  415. package/src/runtime/shared/quiet-progress.d.mts +35 -0
  416. package/src/runtime/shared/quiet-progress.mjs +101 -0
  417. package/src/runtime/shared/quota-resume-store.mjs +32 -1
  418. package/src/runtime/shared/read-row-numbers.mjs +44 -0
  419. package/src/runtime/shared/remote-intent.mjs +2 -42
  420. package/src/runtime/shared/review-diff.mjs +52 -0
  421. package/src/runtime/shared/session-sidebar-host.d.mts +4 -0
  422. package/src/runtime/shared/session-sidebar-host.mjs +38 -0
  423. package/src/runtime/shared/slow-span.mjs +121 -0
  424. package/src/runtime/shared/statusline/statusline-segments.mjs +52 -6
  425. package/src/runtime/shared/tool-card-model/card-header.mjs +7 -1
  426. package/src/runtime/shared/tool-card-model/generic-detail.mjs +39 -5
  427. package/src/runtime/shared/tool-card-model.mjs +5 -2
  428. package/src/runtime/shared/tool-output-budget.mjs +2 -0
  429. package/src/runtime/shared/tool-output-limit.mjs +4 -0
  430. package/src/runtime/shared/tool-primitives.mjs +13 -0
  431. package/src/runtime/shared/tool-result-summary.mjs +22 -1
  432. package/src/runtime/shared/tool-status.mjs +3 -2
  433. package/src/runtime/shared/tool-surface.mjs +20 -6
  434. package/src/runtime/shared/tool-work-units.mjs +54 -11
  435. package/src/runtime/shared/transcript-metadata.mjs +49 -1
  436. package/src/runtime/shared/transcript-turn-keys.mjs +33 -0
  437. package/src/runtime/shared/transcript-writer/purge.mjs +74 -0
  438. package/src/runtime/shared/transcript-writer/transcript-file.mjs +10 -1
  439. package/src/runtime/shared/transcript-writer.mjs +24 -6
  440. package/src/runtime/shared/turn-changes.mjs +269 -100
  441. package/src/runtime/shared/turn-review-reply.mjs +8 -39
  442. package/src/runtime/shared/turn-snapshot-store.mjs +19 -108
  443. package/src/runtime/shared/turn-snapshot.mjs +865 -683
  444. package/src/runtime/shared/turn-worktree-snapshot.mjs +183 -255
  445. package/src/runtime/shared/user-data-guard.mjs +262 -49
  446. package/src/runtime/shared/worktrees/activity-gate.mjs +175 -0
  447. package/src/runtime/shared/worktrees/branch-management.mjs +179 -0
  448. package/src/runtime/shared/worktrees/carry.mjs +533 -0
  449. package/src/runtime/shared/worktrees/contract.mjs +60 -0
  450. package/src/runtime/shared/worktrees/dependencies.mjs +456 -0
  451. package/src/runtime/shared/worktrees/file-recovery.mjs +84 -0
  452. package/src/runtime/shared/worktrees/git-head.mjs +214 -0
  453. package/src/runtime/shared/worktrees/git.mjs +8 -3
  454. package/src/runtime/shared/worktrees/include.mjs +125 -7
  455. package/src/runtime/shared/worktrees/lock.mjs +1 -1
  456. package/src/runtime/shared/worktrees/maintenance.mjs +20 -2
  457. package/src/runtime/shared/worktrees/manager.mjs +525 -31
  458. package/src/runtime/shared/worktrees/merge.mjs +31 -21
  459. package/src/runtime/shared/worktrees/owner.mjs +2 -1
  460. package/src/runtime/shared/worktrees/paths.d.mts +6 -0
  461. package/src/runtime/shared/worktrees/preparation-report.mjs +79 -0
  462. package/src/runtime/shared/worktrees/setup-commands.mjs +232 -0
  463. package/src/runtime/shared/worktrees/workspace-visibility.mjs +17 -0
  464. package/src/runtime/terminal-bridge/client.mjs +57 -20
  465. package/src/runtime/terminal-bridge/tool-defs.mjs +13 -6
  466. package/src/runtime/tidy/apply.mjs +47 -2
  467. package/src/runtime/tidy/run-engines.mjs +11 -5
  468. package/src/session-runtime/agent-tool-routing.mjs +19 -13
  469. package/src/session-runtime/boot/apis.mjs +20 -6
  470. package/src/session-runtime/boot/config.mjs +2 -0
  471. package/src/session-runtime/boot/facade.mjs +4 -0
  472. package/src/session-runtime/boot/infrastructure.mjs +6 -1
  473. package/src/session-runtime/boot/session.mjs +3 -3
  474. package/src/session-runtime/boot/tools.mjs +7 -1
  475. package/src/session-runtime/conversation-import/service.mjs +1 -1
  476. package/src/session-runtime/cwd-plugins/cwd-apply.mjs +12 -5
  477. package/src/session-runtime/goal-facade-api.mjs +2 -2
  478. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +91 -0
  479. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -1
  480. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +15 -5
  481. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +137 -26
  482. package/src/session-runtime/internal-tool-executor.mjs +8 -2
  483. package/src/session-runtime/lifecycle/cold-heir.mjs +187 -0
  484. package/src/session-runtime/lifecycle/inheritance.mjs +71 -27
  485. package/src/session-runtime/lifecycle/session-catalog.mjs +25 -18
  486. package/src/session-runtime/lifecycle/session-switch/resume.mjs +6 -0
  487. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +36 -48
  488. package/src/session-runtime/lifecycle/session-switch.mjs +1 -1
  489. package/src/session-runtime/lifecycle/shared.mjs +5 -6
  490. package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -5
  491. package/src/session-runtime/lifecycle/teardown.mjs +70 -14
  492. package/src/session-runtime/lifecycle-api.mjs +1 -0
  493. package/src/session-runtime/mcp-glue/connect.mjs +17 -5
  494. package/src/session-runtime/media-api.mjs +8 -0
  495. package/src/session-runtime/model-route/route-ownership.mjs +60 -0
  496. package/src/session-runtime/model-route/route-persist.mjs +3 -2
  497. package/src/session-runtime/model-route/set-route.mjs +116 -36
  498. package/src/session-runtime/model-route/web-search-route.mjs +7 -2
  499. package/src/session-runtime/model-route-api.mjs +4 -2
  500. package/src/session-runtime/native-web-search/routes.mjs +37 -24
  501. package/src/session-runtime/native-web-search-usage.mjs +51 -0
  502. package/src/session-runtime/native-web-search.mjs +19 -9
  503. package/src/session-runtime/new-session-config.mjs +4 -2
  504. package/src/session-runtime/provider-auth/login.mjs +4 -0
  505. package/src/session-runtime/provider-auth/setup.mjs +4 -0
  506. package/src/session-runtime/provider-models/catalog-load.mjs +9 -0
  507. package/src/session-runtime/provider-models/web-search-catalog.mjs +23 -3
  508. package/src/session-runtime/provider-models.mjs +1 -0
  509. package/src/session-runtime/provider-usage.mjs +4 -0
  510. package/src/session-runtime/resource-scope-decorate.mjs +10 -3
  511. package/src/session-runtime/route-resolution.mjs +3 -1
  512. package/src/session-runtime/runtime-core.mjs +4 -0
  513. package/src/session-runtime/runtime-facade.mjs +6 -0
  514. package/src/session-runtime/runtime-review-api.mjs +8 -2
  515. package/src/session-runtime/services/agent-task-status.mjs +2 -0
  516. package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +0 -3
  517. package/src/session-runtime/services/agent-tool/close-flow.mjs +6 -7
  518. package/src/session-runtime/services/agent-tool/execute-send.mjs +2 -2
  519. package/src/session-runtime/services/agent-tool/execute-spawn.mjs +36 -3
  520. package/src/session-runtime/services/agent-tool/execute.mjs +9 -1
  521. package/src/session-runtime/services/agent-tool/helpers.mjs +30 -7
  522. package/src/session-runtime/services/agent-tool/index-write-queue.mjs +81 -20
  523. package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +7 -2
  524. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +6 -3
  525. package/src/session-runtime/services/agent-tool/lead-worker-index/forgotten-leads.mjs +29 -0
  526. package/src/session-runtime/services/agent-tool/lead-worker-index/index-file.mjs +1 -1
  527. package/src/session-runtime/services/agent-tool/lead-worker-index/lead-rows.mjs +3 -4
  528. package/src/session-runtime/services/agent-tool/lead-worker-index/reap-timers.mjs +9 -3
  529. package/src/session-runtime/services/agent-tool/lead-worker-index/row-settlement.mjs +7 -18
  530. package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +82 -13
  531. package/src/session-runtime/services/agent-tool/model-select.mjs +82 -0
  532. package/src/session-runtime/services/agent-tool/send-flow.mjs +24 -6
  533. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +3 -1
  534. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +19 -5
  535. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +5 -4
  536. package/src/session-runtime/services/agent-tool/spawn-flow.mjs +2 -1
  537. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +3 -0
  538. package/src/session-runtime/services/agent-tool/tag-registry/tag-lookup.mjs +1 -3
  539. package/src/session-runtime/services/agent-tool/tag-registry/tag-refresh.mjs +1 -3
  540. package/src/session-runtime/services/agent-tool/tag-registry.mjs +18 -10
  541. package/src/session-runtime/services/agent-tool/terminal-reaper/scan-admission.mjs +8 -41
  542. package/src/session-runtime/services/agent-tool/terminal-reaper/stale-rows.mjs +3 -3
  543. package/src/session-runtime/services/agent-tool/terminal-reaper.mjs +6 -23
  544. package/src/session-runtime/services/agent-tool/terminal-trace.mjs +0 -1
  545. package/src/session-runtime/services/agent-tool/tool-def.mjs +7 -0
  546. package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +32 -20
  547. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +5 -2
  548. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +10 -1
  549. package/src/session-runtime/services/agent-tool/worker-index.mjs +74 -15
  550. package/src/session-runtime/services/agent-tool.mjs +7 -0
  551. package/src/session-runtime/services/agent-watchdog-registry.mjs +2 -0
  552. package/src/session-runtime/services/channel-admin.mjs +19 -3
  553. package/src/session-runtime/services/memory-runtime-proxy/calls.mjs +4 -0
  554. package/src/session-runtime/services/memory-runtime-proxy.mjs +1 -0
  555. package/src/session-runtime/services/provider-admin.mjs +158 -15
  556. package/src/session-runtime/session-create/session-options.mjs +7 -5
  557. package/src/session-runtime/session-create/session-start-hook.mjs +2 -1
  558. package/src/session-runtime/session-transcript-purge.mjs +32 -0
  559. package/src/session-runtime/session-transcript.mjs +4 -5
  560. package/src/session-runtime/session-turn-api.mjs +17 -14
  561. package/src/session-runtime/settings-builtin-tools-api.mjs +18 -6
  562. package/src/session-runtime/setup-tool/executor.mjs +57 -9
  563. package/src/session-runtime/setup-tool/extended-actions.mjs +86 -6
  564. package/src/session-runtime/setup-tool/settings-contract.mjs +18 -3
  565. package/src/session-runtime/setup-tool/tool-defs.mjs +25 -4
  566. package/src/session-runtime/skills-api.mjs +3 -5
  567. package/src/session-runtime/tool-policy-refresh.mjs +83 -32
  568. package/src/session-runtime/tool-surface.mjs +5 -1
  569. package/src/session-runtime/turn/agent-ops.mjs +49 -2
  570. package/src/session-runtime/turn/compaction-gate.mjs +25 -0
  571. package/src/session-runtime/turn/session-ops.mjs +7 -5
  572. package/src/session-runtime/turn/side-question-ops.mjs +19 -0
  573. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +7 -1
  574. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +12 -3
  575. package/src/session-runtime/turn/turn-run/turn-settle.mjs +18 -2
  576. package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
  577. package/src/session-runtime/turn/turn-run.mjs +26 -45
  578. package/src/session-runtime/usage-stats-api.mjs +46 -11
  579. package/src/session-runtime/workflow-agents-api/agent-route.mjs +16 -1
  580. package/src/session-runtime/workspace/admission-gate.mjs +44 -15
  581. package/src/session-runtime/workspace/project-branches.mjs +35 -41
  582. package/src/session-runtime/workspace/transition-steps.mjs +215 -116
  583. package/src/session-runtime/workspace/transitions.mjs +428 -73
  584. package/src/standalone/channel-transport.mjs +3 -4
  585. package/src/standalone/daemon-agent-control.mjs +9 -1
  586. package/src/standalone/daemon-desktop-runtime.mjs +32 -1
  587. package/src/standalone/daemon-local-session-bridge.mjs +14 -1
  588. package/src/standalone/daemon-owner.mjs +17 -4
  589. package/src/standalone/daemon-pg-stop.mjs +49 -0
  590. package/src/standalone/daemon-session-control.mjs +88 -0
  591. package/src/standalone/daemon-stop-budget.d.mts +2 -0
  592. package/src/standalone/daemon-stop-budget.mjs +18 -0
  593. package/src/standalone/daemon-stored-session-views.mjs +25 -3
  594. package/src/standalone/daemon-telemetry.mjs +19 -0
  595. package/src/standalone/daemon.mjs +63 -1
  596. package/src/standalone/desktop-service-registry.mjs +5 -0
  597. package/src/standalone/local-session-runtime.mjs +80 -30
  598. package/src/standalone/session-client.mjs +42 -0
  599. package/src/standalone/session-protocol.mjs +14 -0
  600. package/src/standalone/session-proxy/projection.mjs +41 -4
  601. package/src/standalone/session-runtime-inline-host/boot-loaders.mjs +15 -1
  602. package/src/standalone/session-runtime-inline-host.mjs +3 -0
  603. package/src/standalone/session-service/agent-tree/agent-cancel.mjs +91 -49
  604. package/src/standalone/session-service/agent-tree/agent-child.mjs +19 -1
  605. package/src/standalone/session-service/agent-tree/agent-registry.mjs +25 -0
  606. package/src/standalone/session-service/agent-tree/agent-turns.mjs +9 -1
  607. package/src/standalone/session-service/agent-tree.mjs +28 -2
  608. package/src/standalone/session-service/entries/session-loads.mjs +16 -5
  609. package/src/standalone/session-service/entries.mjs +1 -0
  610. package/src/standalone/session-service/projection/transcript-window.mjs +39 -0
  611. package/src/standalone/session-service/quota-resume.mjs +28 -13
  612. package/src/standalone/session-service/session-calls/session-action.mjs +18 -3
  613. package/src/standalone/session-service/session-calls/session-turns.mjs +17 -6
  614. package/src/standalone/session-service/session-calls/session-views.mjs +6 -0
  615. package/src/standalone/session-service-api.mjs +6 -1
  616. package/src/standalone/session-state-patch.d.mts +2 -1
  617. package/src/standalone/session-state-patch.mjs +41 -1
  618. package/src/standalone/session-tool-output.mjs +82 -0
  619. package/src/tui/App.jsx +25 -0
  620. package/src/tui/app/app-view/floating-panel.jsx +26 -1
  621. package/src/tui/app/app-view.jsx +2 -1
  622. package/src/tui/app/btw-controller.mjs +118 -0
  623. package/src/tui/app/create-app-pickers.mjs +2 -0
  624. package/src/tui/app/provider-setup/provider-items.mjs +8 -0
  625. package/src/tui/app/provider-setup-picker.mjs +15 -3
  626. package/src/tui/app/shell-layout/row-budgets.mjs +11 -1
  627. package/src/tui/app/shell-layout/surfaces.mjs +3 -1
  628. package/src/tui/app/slash-commands.mjs +19 -3
  629. package/src/tui/app/slash-dispatch/session-commands.mjs +68 -6
  630. package/src/tui/app/use-global-key-input/approval-shortcut.mjs +12 -0
  631. package/src/tui/app/use-global-key-input.mjs +5 -12
  632. package/src/tui/app/use-prompt-handlers.mjs +11 -0
  633. package/src/tui/components/BtwPanel.jsx +53 -0
  634. package/src/tui/components/QuestionPanel.jsx +275 -0
  635. package/src/tui/components/Spinner.jsx +4 -0
  636. package/src/tui/components/SpinnerByline.jsx +21 -2
  637. package/src/tui/components/question-panel-model.mjs +156 -0
  638. package/src/tui/components/status-line/local-line.mjs +10 -2
  639. package/src/tui/dist/index.mjs +2897 -1722
  640. package/src/tui/session/active-tool-summary.mjs +1 -1
  641. package/src/tui/session/context-state.mjs +4 -5
  642. package/src/tui/session/goal-continuation/continuation-queue.mjs +2 -3
  643. package/src/tui/session/goal-continuation/deadline-delivery.mjs +4 -2
  644. package/src/tui/session/goal-continuation/session-boundary.mjs +21 -0
  645. package/src/tui/session/quota-resume.mjs +140 -61
  646. package/src/tui/session/session-api/commands.mjs +14 -10
  647. package/src/tui/session/session-api/controls.mjs +14 -2
  648. package/src/tui/session/session-api/integrations.mjs +9 -2
  649. package/src/tui/session/session-api/lifecycle/dispose.mjs +3 -9
  650. package/src/tui/session/session-api/lifecycle/resume.mjs +2 -7
  651. package/src/tui/session/session-api/lifecycle.mjs +14 -11
  652. package/src/tui/session/session-api/media.mjs +2 -0
  653. package/src/tui/session/session-api/routes.mjs +81 -57
  654. package/src/tui/session/session-api/settings.mjs +9 -3
  655. package/src/tui/session/session-api/worktree.mjs +3 -2
  656. package/src/tui/session/session-api.mjs +1 -0
  657. package/src/tui/session/session-flow/auto-clear.mjs +1 -3
  658. package/src/tui/session/session-flow/drain.mjs +6 -4
  659. package/src/tui/session/session-flow/queue/entry-shape.mjs +2 -0
  660. package/src/tui/session/session-flow/queue/take-entries.mjs +2 -1
  661. package/src/tui/session/session-flow/queue.mjs +1 -1
  662. package/src/tui/session/tool-approval.mjs +20 -8
  663. package/src/tui/session/transcript-spill.mjs +14 -7
  664. package/src/tui/session/transcript-store/streaming-tail.mjs +1 -1
  665. package/src/tui/session/tui-steering-persist.mjs +3 -5
  666. package/src/tui/session/turn-quiet.mjs +53 -0
  667. package/src/tui/session/turn-stream.mjs +179 -32
  668. package/src/tui/session/turn.mjs +50 -36
  669. package/src/tui/session/worktree-setup-notice.mjs +38 -0
  670. package/src/tui/spinner-meta.mjs +10 -0
  671. package/src/tui/spinner-verbs.mjs +3 -0
  672. package/src/ui/statusline.mjs +13 -3
  673. package/src/workflows/default/WORKFLOW.md +3 -1
  674. package/src/runtime/agent/orchestrator/providers/model-pricing-rates.mjs +0 -1
  675. package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +0 -346
  676. package/src/runtime/agent/orchestrator/session/manager/session-owner-liveness.mjs +0 -117
  677. package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +0 -246
  678. package/src/session-runtime/services/agent-tool/terminal-reaper/reap-timers.mjs +0 -142
  679. package/src/session-runtime/turn/share-ops.mjs +0 -77
  680. package/src/tui/session/cross-surface-share.mjs +0 -406
  681. package/src/tui/session/live-share/delta.mjs +0 -153
  682. package/src/tui/session/live-share/mirror.mjs +0 -106
  683. package/src/tui/session/live-share/owner.mjs +0 -254
  684. package/src/tui/session/live-share/retry.mjs +0 -54
  685. package/src/tui/session/live-share/viewer/frame-router.mjs +0 -32
  686. package/src/tui/session/live-share/viewer/pipe-client.mjs +0 -108
  687. package/src/tui/session/live-share/viewer/submit-acks.mjs +0 -65
  688. package/src/tui/session/live-share/viewer/sync-waiters.mjs +0 -53
  689. package/src/tui/session/live-share/viewer.mjs +0 -99
  690. package/src/tui/session/live-share/wire.mjs +0 -44
  691. package/src/tui/session/live-share.mjs +0 -154
  692. package/src/tui/session/shared-dir-watch.mjs +0 -69
@@ -0,0 +1,96 @@
1
+ // Versioned tool exposure. deferredProviderMode classifies the provider
2
+ // (native tool search or not); toolExposureMode records how the session's
3
+ // tools reach the model. Non-native providers use the fixed bridge: a small
4
+ // eager core plus the shared load_tool and call_tool, with every other tool
5
+ // only in the session's scoped catalog. Native sessions carry no field.
6
+ import { deferredProviderMode } from './tool-catalog-schema.mjs';
7
+ import { TOOL_SEARCH_TOOL } from './tool-defs.mjs';
8
+
9
+ export const TOOL_EXPOSURE_BRIDGE = 'bridge-v1';
10
+ export const TOOL_EXPOSURE_NATIVE = 'native';
11
+ export const TOOL_SURFACE_MIGRATION_INTENT = 'tool_surface_bridge_migration';
12
+
13
+ const BRIDGE_PROVIDER_MODES = new Set(['canonical', 'manifest']);
14
+ // call_tool, and the retired search_tools an older bridge surface carried.
15
+ const BRIDGE_ONLY_TOOL_NAMES = new Set(['search_tools', 'call_tool']);
16
+ // load_tool definitions earlier bridge surfaces carried: the describe-only
17
+ // bridge loader, and the shared loader with query/cursor inputs.
18
+ const LEGACY_BRIDGE_LOAD_TOOL_DESCRIPTIONS = new Set([
19
+ 'Describe tools by exact name: description, input schema and annotations, or the part one JSON Pointer selects. Large definitions arrive in chunks; pass nextCursor back for the rest. Describing never enables a tool.',
20
+ 'Load full schemas for missing deferred tool names/aliases; batch needed names in one call. Or find tools by keyword with query. Pass nextCursor back for the next page.',
21
+ ]);
22
+ const SHARED_LOAD_TOOL_SCHEMA = JSON.stringify(TOOL_SEARCH_TOOL.inputSchema);
23
+
24
+ /** `route`: the session's pinned wire route (session.wireRoute), when one exists. */
25
+ export function toolExposureModeForProvider(provider, route = null) {
26
+ return BRIDGE_PROVIDER_MODES.has(deferredProviderMode(provider, route)) ? TOOL_EXPOSURE_BRIDGE : TOOL_EXPOSURE_NATIVE;
27
+ }
28
+
29
+ export function isToolBridgeEnabled(session) {
30
+ return session?.toolExposureMode === TOOL_EXPOSURE_BRIDGE;
31
+ }
32
+
33
+ /**
34
+ * The exposure a session's persisted surface was built with, or null before
35
+ * it has one. Surfaces persisted before exposure versions: native providers
36
+ * were already native; fixed-surface providers carried the whole catalog.
37
+ */
38
+ export function sessionToolExposure(session) {
39
+ if (session?.toolExposureMode) return session.toolExposureMode;
40
+ if (!session?.deferredProviderMode) return null;
41
+ return session.deferredProviderMode === 'native' ? TOOL_EXPOSURE_NATIVE : 'legacy-fixed';
42
+ }
43
+
44
+ /**
45
+ * True when an existing surface was built for another exposure than
46
+ * `provider` needs, or is a bridge surface an earlier bridge revision built
47
+ * (bridgeSurfaceOutdated).
48
+ */
49
+ export function toolExposureMigrationNeeded(session, provider = session?.provider) {
50
+ const current = sessionToolExposure(session);
51
+ if (current === null) return false;
52
+ const target = toolExposureModeForProvider(provider, session?.wireRoute);
53
+ return current !== target || (target === TOOL_EXPOSURE_BRIDGE && bridgeSurfaceOutdated(session));
54
+ }
55
+
56
+ /**
57
+ * A bridge session an earlier bridge revision built: its fixed prompt holds
58
+ * other bridge guidance than the current one (the guidance-only block, or
59
+ * guidance naming search_tools or query), or its eager surface still carries
60
+ * search_tools or a load_tool other than the shared one.
61
+ */
62
+ export function bridgeSurfaceOutdated(session) {
63
+ if (!isToolBridgeEnabled(session)) return false;
64
+ const tools = Array.isArray(session.tools) ? session.tools : [];
65
+ const staleTool = tools.some(
66
+ (tool) =>
67
+ tool?.name === 'search_tools' ||
68
+ (tool?.name === TOOL_SEARCH_TOOL.name &&
69
+ (tool.description !== TOOL_SEARCH_TOOL.description ||
70
+ JSON.stringify(tool.inputSchema) !== SHARED_LOAD_TOOL_SCHEMA))
71
+ );
72
+ if (staleTool) return true;
73
+ return (Array.isArray(session.messages) ? session.messages : []).some(
74
+ (message) =>
75
+ message?.role === 'system' &&
76
+ typeof message.content === 'string' &&
77
+ message.content.includes('<tool-bridge>') &&
78
+ !message.content.includes(TOOL_BRIDGE_GUIDANCE)
79
+ );
80
+ }
81
+
82
+ /** A bridge-only definition (never part of the scoped catalog). */
83
+ export function isBridgeToolDefinition(tool) {
84
+ const name = String(tool?.name || '');
85
+ if (BRIDGE_ONLY_TOOL_NAMES.has(name)) return true;
86
+ return name === TOOL_SEARCH_TOOL.name && LEGACY_BRIDGE_LOAD_TOOL_DESCRIPTIONS.has(tool?.description);
87
+ }
88
+
89
+ // Static and byte-stable; it follows the deferred roster (the same
90
+ // <available-deferred-tools> block native sessions get), never replaces it.
91
+ // A prompt holding any other bridge guidance is migrated once.
92
+ export const TOOL_BRIDGE_GUIDANCE = [
93
+ '<tool-bridge>',
94
+ 'Deferred tools (listed above, or announced later as added) are not defined here: run one with call_tool {name, arguments}, and use load_tool first to see its parameters (a keyword instead of a name searches the deferred tools). Call directly defined tools directly.',
95
+ '</tool-bridge>',
96
+ ].join('\n');
@@ -7,6 +7,7 @@ import { normalizeEffortInput } from './effort.mjs';
7
7
  import { isLikelyRawModelId } from './config-helpers.mjs';
8
8
  import { configuredAgentRouteCandidates } from '../../../shared/agent-route-config.mjs';
9
9
  import { normalizeContextTokens } from '../../../shared/llm/default-context-window.mjs';
10
+ import { canonicalRouteProvider, normalizeRouteChain } from '../../../shared/model-route-chain.mjs';
10
11
  import { normalizeAgentId, normalizeWorkflowId } from './workflow-ids.mjs';
11
12
  import { createWorkflowPacks } from './workflow/packs.mjs';
12
13
  import { createWorkflowAgents } from './workflow/agents.mjs';
@@ -38,12 +39,6 @@ const WEB_SEARCH_PROVIDER_FAMILIES = new Map([
38
39
  ]);
39
40
  export const WEB_SEARCH_DEFAULT_PROVIDER = 'default';
40
41
  export const WEB_SEARCH_DEFAULT_MODEL = 'default';
41
- const WEB_SEARCH_PROVIDER_ALIASES = Object.freeze({
42
- 'openai-api': 'openai',
43
- 'xai-api': 'xai',
44
- 'gemini-api': 'gemini',
45
- 'anthropic-api': 'anthropic',
46
- });
47
42
 
48
43
  export function workflowPresetId(slot) {
49
44
  return `workflow-${slot}`;
@@ -121,8 +116,7 @@ export function createWorkflowHelpers({ rootDir, dataDir, readMarkdownDocument,
121
116
  }
122
117
 
123
118
  export function normalizeWebSearchProviderId(provider) {
124
- const id = clean(provider);
125
- return WEB_SEARCH_PROVIDER_ALIASES[id] || id;
119
+ return canonicalRouteProvider(provider);
126
120
  }
127
121
 
128
122
  export function isDefaultWebSearchRouteConfig(routeLike = {}) {
@@ -141,6 +135,10 @@ export function isWebSearchCapableProvider(provider) {
141
135
  }
142
136
 
143
137
  export function normalizeWebSearchRouteConfig(routeLike, fallback = {}) {
138
+ return normalizeRouteChain(routeLike, normalizeWebSearchRouteLeaf, fallback);
139
+ }
140
+
141
+ function normalizeWebSearchRouteLeaf(routeLike, fallback = {}) {
144
142
  const provider = normalizeWebSearchProviderId(routeLike?.provider || fallback.provider);
145
143
  const model = clean(routeLike?.model || fallback.model);
146
144
  if (!provider || !model) return null;
@@ -178,6 +176,10 @@ export function webSearchRouteOrDefault(...routeLikes) {
178
176
  }
179
177
 
180
178
  export function normalizeWorkflowRoute(routeLike, fallback = {}) {
179
+ return normalizeRouteChain(routeLike, normalizeWorkflowRouteLeaf, fallback);
180
+ }
181
+
182
+ function normalizeWorkflowRouteLeaf(routeLike, fallback = {}) {
181
183
  const provider = clean(routeLike?.provider) || clean(fallback.provider);
182
184
  const model = clean(routeLike?.model) || clean(fallback.model);
183
185
  if (!provider || !model) return null;
@@ -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 = 4;
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'],
@@ -59,6 +57,8 @@ const FIELDS = [
59
57
  ['importKey', 'import_key', 'loose'],
60
58
  // Source session of an inherited (forked) session (schema 4).
61
59
  ['inheritedFromSessionId', 'inherited_from_session_id', 'loose'],
60
+ // Real human turns (null for a row written before schema 5).
61
+ ['realTurnCount', 'real_turn_count', 'loose'],
62
62
  ];
63
63
 
64
64
  const COLUMN_TYPES = { text: 'TEXT', real: 'REAL', int: 'INTEGER', bool: 'INTEGER', json: 'TEXT', optjson: 'TEXT' };
@@ -193,16 +193,10 @@ export function rowFromDb(record) {
193
193
  return row;
194
194
  }
195
195
 
196
- // Overlays a listing adds at read time; never part of the comparison.
197
- const OVERLAY_KEYS = new Set(['heartbeatAt', 'agentHeartbeatAt']);
198
-
199
- /** Comparable JSON of a row's stored fields (overlays excluded). */
196
+ /** Comparable JSON of a row's stored fields. */
200
197
  function comparable(row) {
201
198
  const out = [];
202
- for (const [key] of FIELDS) {
203
- if (OVERLAY_KEYS.has(key)) continue;
204
- out.push(row[key] === undefined ? null : row[key]);
205
- }
199
+ for (const [key] of FIELDS) out.push(row[key] === undefined ? null : row[key]);
206
200
  return JSON.stringify(out);
207
201
  }
208
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 });
@@ -15,8 +15,9 @@ export {
15
15
  compactionBufferTokensForBoundary,
16
16
  };
17
17
 
18
- export const SUMMARY_PREFIX_ANCHOR =
19
- 'A previous model worked on this task and produced the compacted handoff summary below.';
18
+ import { SUMMARY_PREFIX_ANCHOR } from './summary-anchor.mjs';
19
+
20
+ export { SUMMARY_PREFIX_ANCHOR };
20
21
  export const SUMMARY_PREFIX = `${SUMMARY_PREFIX_ANCHOR} Build on the work already done and avoid duplicating it. The summary covers the session; retained requests and execution records follow it. Actual tool outcomes take precedence over plans or older claims in the summary.`;
21
22
  export const SUMMARY_OUTPUT_TOKENS = 4_096;
22
23
  // Longest a handoff summary call may run: the default, the config fallback,
@@ -1,13 +1,15 @@
1
1
  // Message classification, protected-context splitting, and summary-message
2
2
  // construction helpers.
3
- import { SUMMARY_PREFIX, SUMMARY_PREFIX_ANCHOR } from './constants.mjs';
3
+ 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
- import { isImportedMessage } from '../imported-message.mjs';
7
6
  import {
8
- isInternalRuntimeNotificationText,
9
- isModelVisibleToolCompletionWrapper,
10
- } from '../../../../shared/tool-execution-contract.mjs';
7
+ contextAckMessage,
8
+ isActualUserInstructionMessage,
9
+ isInjectedSkillBodyMessage,
10
+ isProtectedContextUserMessage,
11
+ isSummaryMessage,
12
+ } from './user-message-kind.mjs';
11
13
 
12
14
  export function compactHeader(oldHistory) {
13
15
  // Stable display ids are bookkeeping, not conversation: the header names
@@ -23,94 +25,15 @@ export function makeSummaryMessage(content) {
23
25
  return { role: 'user', content, meta: { source: 'compact-summary' } };
24
26
  }
25
27
 
26
- // A compact summary message is a synthetic role:'user' message carrying the
27
- // SUMMARY_PREFIX anchor. It is NOT a real user turn: it must be excluded from
28
- // real user-turn boundary calculations and treated as merge input, otherwise
29
- // an old summary can sit in the preserved tail as a live user message,
30
- // duplicate, or fail to merge across repeated compaction.
31
- export function isSummaryMessage(m) {
32
- return (
33
- m?.role === 'user' &&
34
- !isImportedMessage(m) &&
35
- (String(m?.meta?.source || '') === 'compact-summary' ||
36
- (typeof m.content === 'string' &&
37
- m.content.startsWith(SUMMARY_PREFIX_ANCHOR) &&
38
- /\nmessages=\d+\s+(?:sha256=|compact_type=)/.test(m.content)))
39
- );
40
- }
41
-
42
- export function isProtectedContextUserMessage(m) {
43
- if (m?.role !== 'user' || typeof m.content !== 'string' || isImportedMessage(m)) return false;
44
- let content = m.content.trim();
45
- if (!content.toLowerCase().startsWith('<system-reminder>')) return false;
46
- const closingTag = '</system-reminder>';
47
- // A runtime turn may carry several reminders (Goal, clock, tool delta).
48
- // Only text outside those envelopes is a human instruction. Keep this
49
- // compatible with stored turns that predate explicit source metadata.
50
- while (content.toLowerCase().startsWith('<system-reminder>')) {
51
- const closingIndex = content.toLowerCase().indexOf(closingTag);
52
- if (closingIndex < 0) return true;
53
- content = content.slice(closingIndex + closingTag.length).trim();
54
- }
55
- return content === '';
56
- }
57
-
58
- // An injected Skill-body user message (the general newMessages channel carries
59
- // the full SKILL.md body as a role:'user' message after the Skill tool_result).
60
- // Like isSummaryMessage / isProtectedContextUserMessage, it is detected by
61
- // content prefix (the `<skill>` envelope from buildSkillResultEnvelope) so the
62
- // check survives even if the synthetic `meta` field is dropped during a tail
63
- // rebuild. It is NOT the human's latest prompt and must be excluded from
64
- // "latest human request" selection (deriveCurrentRequest). The `meta:'skill'`
65
- // marker is also honoured.
66
- export function isInjectedSkillBodyMessage(m) {
67
- if (m?.role !== 'user' || isImportedMessage(m)) return false;
68
- if (m.meta === 'skill') return true;
69
- return typeof m.content === 'string' && m.content.trimStart().startsWith('<skill>');
70
- }
71
-
72
- const SYNTHETIC_USER_SOURCES = new Set([
73
- 'goal-continuation',
74
- 'goal-closeout',
75
- 'compact-context',
76
- 'compact-active-turn-continuation',
77
- 'compact-execution-recovery',
78
- 'max-output-recovery',
79
- 'refusal-recovery',
80
- 'stream-cut-recovery',
81
- ]);
82
- const SYNTHETIC_USER_CONTROL_RE =
83
- /^(?:\[mixdog-runtime\]|\[request interrupted(?: by user(?: for tool use)?| by process restart)?\])(?:\s|$)/i;
84
-
85
- function userMessageText(message) {
86
- if (typeof message?.content === 'string') return message.content;
87
- if (!Array.isArray(message?.content)) return '';
88
- return message.content.map((block) => (typeof block === 'string' ? block : block?.text || '')).join('');
89
- }
90
-
91
- export function isActualUserInstructionMessage(message) {
92
- if (
93
- message?.role !== 'user' ||
94
- isSummaryMessage(message) ||
95
- isProtectedContextUserMessage(message) ||
96
- isInjectedSkillBodyMessage(message)
97
- ) {
98
- return false;
99
- }
100
- const text = userMessageText(message);
101
- // Imported prose is the user's own words whatever it looks like.
102
- if (isImportedMessage(message)) return text.trim().length > 0;
103
- if (/^Reference files:\s*/i.test(text.trimStart())) return false;
104
- if (
105
- SYNTHETIC_USER_CONTROL_RE.test(text.trimStart()) ||
106
- isInternalRuntimeNotificationText(text) ||
107
- isModelVisibleToolCompletionWrapper(text) ||
108
- SYNTHETIC_USER_SOURCES.has(String(message?.meta?.source || ''))
109
- ) {
110
- return false;
111
- }
112
- return text.trim().length > 0 || (Array.isArray(message.content) && message.content.length > 0);
113
- }
28
+ // User-message classification lives in the import-light user-message-kind.mjs
29
+ // (the session store counts real turns with it); re-exported for callers.
30
+ export {
31
+ contextAckMessage,
32
+ isActualUserInstructionMessage,
33
+ isInjectedSkillBodyMessage,
34
+ isProtectedContextUserMessage,
35
+ isSummaryMessage,
36
+ };
114
37
 
115
38
  export function latestActualUserInstructionIndex(messages) {
116
39
  for (let index = (Array.isArray(messages) ? messages.length : 0) - 1; index >= 0; index -= 1) {
@@ -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] : []),
@@ -0,0 +1,5 @@
1
+ // Leaf constant: the anchor sentence every compact summary message opens with.
2
+ // Kept import-free so store-layer code can classify messages without pulling
3
+ // the context-utils graph (which cycles back into the session store).
4
+ export const SUMMARY_PREFIX_ANCHOR =
5
+ 'A previous model worked on this task and produced the compacted handoff summary below.';