mixdog 1.3.5 → 1.4.1

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 (515) hide show
  1. package/NOTICE.md +2 -2
  2. package/README.md +2 -2
  3. package/package.json +2 -11
  4. package/scripts/check-voice-runtime-inputs.mjs +25 -0
  5. package/scripts/daemon-stub.mjs +1 -1
  6. package/scripts/gate-local.mjs +16 -5
  7. package/scripts/latest-guard.mjs +21 -9
  8. package/scripts/lib/isolated-test-env.mjs +10 -5
  9. package/scripts/lib/run-node-tests.mjs +37 -37
  10. package/scripts/lib/scoped-temp.d.mts +16 -0
  11. package/scripts/lib/scoped-temp.mjs +123 -0
  12. package/scripts/lib/stale-temp.mjs +44 -0
  13. package/scripts/native-release-status.mjs +2 -2
  14. package/scripts/post-release-check.mjs +1 -6
  15. package/scripts/pptx-kit-index.mjs +17 -4
  16. package/scripts/recall-history-cases.json +1 -1
  17. package/scripts/suite-health.mjs +20 -2
  18. package/scripts/test-data-dir.mjs +10 -7
  19. package/scripts/test.mjs +7 -11
  20. package/src/agents/reviewer/AGENT.md +7 -11
  21. package/src/agents/reviewer/agent.json +1 -1
  22. package/src/app.mjs +4 -0
  23. package/src/defaults/shipped-history.json +22 -1
  24. package/src/defaults/skills/browser-use/SKILL.md +62 -12
  25. package/src/defaults/skills/code-tidy/SKILL.md +142 -270
  26. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +4 -4
  27. package/src/defaults/skills/code-tidy/references/cleanup-report.md +31 -76
  28. package/src/defaults/skills/code-tidy/references/dead-code.md +6 -12
  29. package/src/defaults/skills/computer-use/SKILL.md +35 -9
  30. package/src/defaults/skills/setup/SKILL.md +22 -0
  31. package/src/defaults/skills/setup/references/actions.md +39 -5
  32. package/src/defaults/skills/setup/references/surfaces.md +11 -2
  33. package/src/defaults/skills/visualize/SKILL.md +2 -1
  34. package/src/lib/rules-builder.cjs +39 -20
  35. package/src/output-styles/common.md +2 -2
  36. package/src/output-styles/simple.md +1 -1
  37. package/src/rules/agent/AGENT.md +11 -10
  38. package/src/rules/lead/LEAD.md +23 -20
  39. package/src/rules/shared/05-tool-calls.md +5 -6
  40. package/src/rules/shared/10-tool-workflow.md +4 -0
  41. package/src/rules/shared/45-destructive.md +0 -2
  42. package/src/rules/shared/50-execution.md +2 -0
  43. package/src/rules/shared/60-verification.md +7 -5
  44. package/src/rules/shared/70-delivery.md +7 -9
  45. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +29 -6
  46. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -3
  47. package/src/runtime/agent/orchestrator/agent-runtime/title-completion.mjs +3 -1
  48. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +3 -1
  49. package/src/runtime/agent/orchestrator/cache-break-trace.mjs +2 -0
  50. package/src/runtime/agent/orchestrator/config.mjs +17 -1
  51. package/src/runtime/agent/orchestrator/context/collect.mjs +3 -0
  52. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +73 -68
  53. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +57 -2
  54. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -3
  55. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +176 -72
  56. package/src/runtime/agent/orchestrator/mcp/client.mjs +19 -0
  57. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +5 -2
  58. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +192 -133
  59. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +42 -6
  60. package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +1 -1
  61. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +7 -3
  62. package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +8 -2
  63. package/src/runtime/agent/orchestrator/providers/anthropic-cache-warm.mjs +165 -0
  64. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +6 -2
  65. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -2
  66. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  67. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -1
  68. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +14 -14
  69. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/initial-status.mjs +3 -1
  70. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +159 -69
  71. package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +25 -3
  72. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +70 -33
  73. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -2
  74. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +135 -87
  75. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +123 -102
  76. package/src/runtime/agent/orchestrator/providers/cache-warm-admission.mjs +90 -0
  77. package/src/runtime/agent/orchestrator/providers/command-code-oauth-login.mjs +1 -10
  78. package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +25 -9
  79. package/src/runtime/agent/orchestrator/providers/cursor.mjs +25 -13
  80. package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +1 -1
  81. package/src/runtime/agent/orchestrator/providers/devin.mjs +3 -0
  82. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +210 -20
  83. package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -11
  84. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +45 -6
  85. package/src/runtime/agent/orchestrator/providers/lib/first-output-window.mjs +58 -0
  86. package/src/runtime/agent/orchestrator/providers/lib/listen-on.mjs +14 -0
  87. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +17 -3
  88. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +52 -10
  89. package/src/runtime/agent/orchestrator/providers/mimo-oauth-login.mjs +1 -10
  90. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +8 -1
  91. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
  92. package/src/runtime/agent/orchestrator/providers/npm-cli-version.mjs +11 -3
  93. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -1
  94. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +1 -0
  95. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +9 -2
  96. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +7 -0
  97. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +14 -3
  98. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +4 -2
  99. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +1 -0
  100. package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +5 -3
  101. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +16 -3
  102. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +1 -0
  103. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +5 -2
  104. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +13 -3
  105. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +13 -2
  106. package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +81 -42
  107. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +8 -0
  108. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +136 -5
  109. package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +10 -9
  110. package/src/runtime/agent/orchestrator/providers/openai-ws-send/send-context.mjs +22 -3
  111. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +43 -5
  112. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/handshake-failure.mjs +3 -1
  113. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/stream-failure.mjs +6 -3
  114. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +20 -12
  115. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +7 -1
  116. package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +48 -22
  117. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +65 -1
  118. package/src/runtime/agent/orchestrator/providers/quota-reading.mjs +38 -12
  119. package/src/runtime/agent/orchestrator/providers/registry.mjs +38 -0
  120. package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +39 -7
  121. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +6 -0
  122. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +49 -16
  123. package/src/runtime/agent/orchestrator/runtime-core/compaction-config-keys.mjs +62 -0
  124. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +37 -16
  125. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +100 -23
  126. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +7 -6
  127. package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +9 -3
  128. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +19 -4
  129. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +125 -30
  130. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +3 -1
  131. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +5 -2
  132. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +1 -3
  133. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +798 -0
  134. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
  135. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -8
  136. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +23 -0
  137. package/src/runtime/agent/orchestrator/session/compact/observation-supersession.mjs +103 -23
  138. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +280 -45
  139. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +475 -58
  140. package/src/runtime/agent/orchestrator/session/compaction-archive.mjs +42 -17
  141. package/src/runtime/agent/orchestrator/session/context-utils.mjs +13 -1
  142. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +163 -22
  143. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +132 -17
  144. package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +38 -7
  145. package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +3 -0
  146. package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +90 -22
  147. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -1
  148. package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +11 -5
  149. package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +0 -2
  150. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -4
  151. package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +1 -1
  152. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +51 -25
  153. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +37 -3
  154. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +3 -1
  155. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +1 -1
  156. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +1 -1
  157. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +13 -5
  158. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +31 -3
  159. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +20 -3
  160. package/src/runtime/agent/orchestrator/session/loop/tool-exec/after-hook.mjs +2 -1
  161. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +5 -4
  162. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +16 -2
  163. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +16 -1
  164. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +49 -21
  165. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -10
  166. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +12 -3
  167. package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +12 -2
  168. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +19 -1
  169. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +133 -90
  170. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +3 -3
  171. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +3 -1
  172. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +31 -4
  173. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +30 -18
  174. package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +24 -14
  175. package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +11 -2
  176. package/src/runtime/agent/orchestrator/session/manager/provider-replay.mjs +13 -0
  177. package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +130 -0
  178. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +27 -9
  179. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +81 -8
  180. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +2 -0
  181. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +27 -8
  182. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +12 -5
  183. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +1 -1
  184. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +9 -4
  185. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +4 -0
  186. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +102 -15
  187. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +21 -5
  188. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +9 -0
  189. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +24 -9
  190. package/src/runtime/agent/orchestrator/session/prompt-cache-idle-gaps.mjs +113 -0
  191. package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +150 -0
  192. package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +154 -0
  193. package/src/runtime/agent/orchestrator/session/routine-result.mjs +36 -9
  194. package/src/runtime/agent/orchestrator/session/sensitive-projection.mjs +100 -0
  195. package/src/runtime/agent/orchestrator/session/sensitive-values.mjs +257 -0
  196. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +20 -7
  197. package/src/runtime/agent/orchestrator/session/side-question.mjs +18 -0
  198. package/src/runtime/agent/orchestrator/session/skill-update-notice.mjs +60 -0
  199. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +6 -3
  200. package/src/runtime/agent/orchestrator/session/store/save-delta.mjs +9 -5
  201. package/src/runtime/agent/orchestrator/session/store/serialize.mjs +9 -8
  202. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +7 -0
  203. package/src/runtime/agent/orchestrator/session/store/session-persistence-events.mjs +29 -0
  204. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +8 -6
  205. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +16 -2
  206. package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +15 -0
  207. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +81 -22
  208. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +92 -3
  209. package/src/runtime/agent/orchestrator/session/stored-attachment-history.mjs +32 -0
  210. package/src/runtime/agent/orchestrator/session/thinking-binding.mjs +108 -0
  211. package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +2 -2
  212. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +2 -1
  213. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +79 -3
  214. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-status.mjs +9 -7
  215. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-text.mjs +2 -2
  216. package/src/runtime/agent/orchestrator/session/turn-failure.mjs +5 -1
  217. package/src/runtime/agent/orchestrator/stall-policy.mjs +23 -0
  218. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +5 -2
  219. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +12 -1
  220. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/invocation-plan.mjs +2 -2
  221. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +240 -0
  222. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
  223. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/shell-cwd.mjs +38 -0
  224. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -2
  225. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +31 -6
  226. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +110 -26
  227. package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +7 -1
  228. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +31 -5
  229. package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +22 -8
  230. package/src/runtime/agent/orchestrator/tools/builtin/lib/scoped-search-flight.mjs +9 -5
  231. package/src/runtime/agent/orchestrator/tools/builtin/read-single-stream.mjs +7 -1
  232. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +6 -3
  233. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +1 -1
  234. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-publication.mjs +23 -12
  235. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +6 -1
  236. package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +1 -8
  237. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +7 -1
  238. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/federation.mjs +3 -1
  239. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +1 -1
  240. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  241. package/src/runtime/agent/orchestrator/tools/lib/isolated-test-env.mjs +4 -3
  242. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +26 -4
  243. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +36 -13
  244. package/src/runtime/browser-bridge/action-schema.mjs +13 -2
  245. package/src/runtime/browser-bridge/client.mjs +73 -8
  246. package/src/runtime/browser-bridge/input-fields.mjs +8 -9
  247. package/src/runtime/browser-bridge/mail-links.mjs +107 -0
  248. package/src/runtime/browser-bridge/tool-defs.mjs +1 -1
  249. package/src/runtime/channels/lib/config.mjs +6 -61
  250. package/src/runtime/channels/lib/crash-log.mjs +1 -1
  251. package/src/runtime/channels/lib/event-pipeline.mjs +4 -19
  252. package/src/runtime/channels/lib/event-queue.mjs +3 -18
  253. package/src/runtime/channels/lib/owned-runtime/automation-services.mjs +2 -2
  254. package/src/runtime/channels/lib/owned-runtime/automation-start.mjs +3 -4
  255. package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +4 -59
  256. package/src/runtime/channels/lib/owned-runtime/owned-start.mjs +33 -115
  257. package/src/runtime/channels/lib/owned-runtime/owned-stop.mjs +5 -22
  258. package/src/runtime/channels/lib/owned-runtime/state.mjs +2 -8
  259. package/src/runtime/channels/lib/owned-runtime.mjs +6 -23
  260. package/src/runtime/channels/lib/parent-bridge.mjs +2 -2
  261. package/src/runtime/channels/lib/runtime-paths.mjs +4 -43
  262. package/src/runtime/channels/lib/scheduler.mjs +33 -147
  263. package/src/runtime/channels/lib/schedules-db.mjs +34 -11
  264. package/src/runtime/channels/lib/status-snapshot.mjs +1 -1
  265. package/src/runtime/channels/lib/tool-dispatch.mjs +1 -2
  266. package/src/runtime/channels/lib/webhook/signature.mjs +4 -1
  267. package/src/runtime/channels/lib/webhooks-db.mjs +5 -9
  268. package/src/runtime/channels/lib/whisper-port.mjs +10 -1
  269. package/src/runtime/channels/lib/worker-bootstrap.mjs +0 -1
  270. package/src/runtime/channels/lib/worker-ipc.mjs +0 -1
  271. package/src/runtime/channels/lib/worker-main.mjs +10 -34
  272. package/src/runtime/computer-bridge/action-schema.mjs +42 -1
  273. package/src/runtime/computer-bridge/actions.mjs +9 -1
  274. package/src/runtime/computer-bridge/client.mjs +180 -8
  275. package/src/runtime/computer-bridge/core-actions.mjs +2 -2
  276. package/src/runtime/computer-bridge/error-recovery.mjs +28 -2
  277. package/src/runtime/computer-bridge/linux-action-capabilities.mjs +24 -5
  278. package/src/runtime/computer-bridge/linux-readiness.d.mts +7 -2
  279. package/src/runtime/computer-bridge/linux-readiness.mjs +65 -23
  280. package/src/runtime/computer-bridge/pending-continuation.mjs +1 -1
  281. package/src/runtime/connectors/connector-accounts-mcp.mjs +230 -0
  282. package/src/runtime/connectors/gmail-app-password.mjs +172 -39
  283. package/src/runtime/connectors/google-mcp.mjs +10 -12
  284. package/src/runtime/local-provider/server-process.mjs +2 -1
  285. package/src/runtime/media/adapters/gemini-video.mjs +4 -1
  286. package/src/runtime/media/adapters/xai-media.mjs +2 -1
  287. package/src/runtime/memory/lib/embedding-worker.mjs +6 -3
  288. package/src/runtime/memory/lib/memory-action-handlers/cycle-backfill-action.mjs +1 -7
  289. package/src/runtime/memory/lib/memory-chunk-quality.mjs +1 -6
  290. package/src/runtime/memory/lib/pg/adapter.mjs +77 -70
  291. package/src/runtime/memory/lib/pg/supervisor.mjs +24 -12
  292. package/src/runtime/memory/lib/runtime-fetcher.mjs +23 -5
  293. package/src/runtime/office/authoring/pdf-author-action.mjs +1 -6
  294. package/src/runtime/office/design/design-art-direction.mjs +29 -27
  295. package/src/runtime/office/pdf/pdf-writer.mjs +6 -1
  296. package/src/runtime/office/portable/portable-snapshot-docx.mjs +7 -1
  297. package/src/runtime/office/portable/portable-snapshot-shared.mjs +6 -1
  298. package/src/runtime/office/quality/assurance-rendered.mjs +9 -2
  299. package/src/runtime/office/quality/assurance-structure-docx.mjs +3 -1
  300. package/src/runtime/office/quality/design-review.mjs +1 -5
  301. package/src/runtime/office/quality/document-brief.mjs +1 -5
  302. package/src/runtime/office/quality/forced-break-pages.mjs +9 -6
  303. package/src/runtime/office/quality/quality-pipeline.mjs +1 -1
  304. package/src/runtime/session-search/session-search-db.mjs +73 -9
  305. package/src/runtime/session-search/session-search-ingest.mjs +110 -20
  306. package/src/runtime/shared/abort-race.mjs +89 -0
  307. package/src/runtime/shared/agent-avatar.d.mts +0 -1
  308. package/src/runtime/shared/agent-kind.mjs +4 -3
  309. package/src/runtime/shared/bot-owned-work.mjs +56 -0
  310. package/src/runtime/shared/bounded-download.mjs +8 -3
  311. package/src/runtime/shared/config.mjs +2 -13
  312. package/src/runtime/shared/connector-accounts.mjs +20 -10
  313. package/src/runtime/shared/connector-catalog.d.mts +29 -0
  314. package/src/runtime/shared/connector-catalog.mjs +150 -0
  315. package/src/runtime/shared/connector-triggers.mjs +22 -19
  316. package/src/runtime/shared/defaults-separation.mjs +2 -17
  317. package/src/runtime/shared/delegated-approval-host.mjs +103 -11
  318. package/src/runtime/shared/err-text.mjs +24 -15
  319. package/src/runtime/shared/fetch-safe-listen.d.mts +16 -0
  320. package/src/runtime/shared/fetch-safe-listen.mjs +50 -0
  321. package/src/runtime/shared/file-permissions.d.mts +0 -8
  322. package/src/runtime/shared/file-permissions.mjs +0 -11
  323. package/src/runtime/shared/git-direct.test-support.mjs +19 -0
  324. package/src/runtime/shared/handoff-artifacts.d.mts +2 -1
  325. package/src/runtime/shared/handoff-artifacts.mjs +18 -8
  326. package/src/runtime/shared/heartbeat-interval.d.mts +4 -0
  327. package/src/runtime/shared/heartbeat-interval.mjs +19 -0
  328. package/src/runtime/shared/idle-auto-clear-gate.mjs +126 -0
  329. package/src/runtime/shared/llm/cost.mjs +5 -1
  330. package/src/runtime/shared/llm/usage-rollup.mjs +1 -1
  331. package/src/runtime/shared/loopback-listener.mjs +25 -2
  332. package/src/runtime/shared/mixy-presence.mjs +22 -0
  333. package/src/runtime/shared/model-route-chain.d.mts +7 -2
  334. package/src/runtime/shared/model-route-chain.mjs +22 -4
  335. package/src/runtime/shared/open-url.mjs +10 -0
  336. package/src/runtime/shared/orchestration.d.mts +2 -0
  337. package/src/runtime/shared/pg-schema-db.mjs +27 -16
  338. package/src/runtime/shared/profile-config.cjs +1 -1
  339. package/src/runtime/shared/prompt-origin.d.mts +4 -0
  340. package/src/runtime/shared/prompt-origin.mjs +21 -0
  341. package/src/runtime/shared/provider-accounts.mjs +7 -1
  342. package/src/runtime/shared/provider-display-name.mjs +29 -0
  343. package/src/runtime/shared/provider-timeout-phase.mjs +2 -0
  344. package/src/runtime/shared/routine-trigger.d.mts +2 -0
  345. package/src/runtime/shared/routine-trigger.mjs +10 -0
  346. package/src/runtime/shared/sensitive-path-rules.d.mts +2 -10
  347. package/src/runtime/shared/sensitive-path-rules.mjs +19 -41
  348. package/src/runtime/shared/session-activity-signal.mjs +48 -1
  349. package/src/runtime/shared/session-scratch.mjs +37 -0
  350. package/src/runtime/shared/session-sidebar-host.d.mts +1 -1
  351. package/src/runtime/shared/session-sidebar-host.mjs +7 -3
  352. package/src/runtime/shared/session-turn-prelude.mjs +18 -0
  353. package/src/runtime/shared/tool-card-model/agent-surface.mjs +1 -3
  354. package/src/runtime/shared/tool-card-model/card-status.mjs +15 -2
  355. package/src/runtime/shared/tool-result-summary.mjs +2 -15
  356. package/src/runtime/shared/tool-surface.mjs +3 -0
  357. package/src/runtime/shared/tool-work-units.mjs +2 -0
  358. package/src/runtime/shared/turn-snapshot-store.mjs +13 -6
  359. package/src/runtime/shared/worktrees/contract.mjs +4 -1
  360. package/src/runtime/shared/worktrees/git.mjs +15 -0
  361. package/src/runtime/shared/worktrees/manager.mjs +87 -38
  362. package/src/runtime/shared/worktrees/test-support.mjs +14 -13
  363. package/src/runtime/terminal-bridge/client.mjs +10 -1
  364. package/src/runtime/visualize-bridge/client.mjs +29 -8
  365. package/src/runtime/visualize-bridge/tool-defs.mjs +22 -8
  366. package/src/runtime/visualize-bridge/tool-meta.d.mts +5 -0
  367. package/src/runtime/visualize-bridge/tool-meta.mjs +22 -0
  368. package/src/runtime/web-search/lib/fetch-pipeline.mjs +2 -2
  369. package/src/session-runtime/agent-home-delivery.mjs +489 -185
  370. package/src/session-runtime/agent-task-sessions.mjs +467 -229
  371. package/src/session-runtime/agent-tool-routing.mjs +8 -41
  372. package/src/session-runtime/boot/apis.mjs +9 -0
  373. package/src/session-runtime/boot/infrastructure.mjs +4 -0
  374. package/src/session-runtime/boot/providers.mjs +3 -0
  375. package/src/session-runtime/boot/tools.mjs +11 -2
  376. package/src/session-runtime/bot-status.mjs +12 -6
  377. package/src/session-runtime/bot-target.mjs +38 -0
  378. package/src/session-runtime/channel-config-api.mjs +6 -1
  379. package/src/session-runtime/config-lifecycle.mjs +6 -0
  380. package/src/session-runtime/connector-merge-migration.mjs +305 -0
  381. package/src/session-runtime/conversation-import/codex-titles.mjs +88 -0
  382. package/src/session-runtime/conversation-import/discovery.mjs +271 -25
  383. package/src/session-runtime/conversation-import/service.mjs +26 -5
  384. package/src/session-runtime/handoff-attachments.mjs +82 -31
  385. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +144 -41
  386. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -0
  387. package/src/session-runtime/internal-tool-executor/reaction-tool.mjs +4 -1
  388. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +8 -2
  389. package/src/session-runtime/lifecycle/cold-heir.mjs +11 -6
  390. package/src/session-runtime/lifecycle/inheritance.mjs +16 -3
  391. package/src/session-runtime/lifecycle/session-catalog.mjs +12 -2
  392. package/src/session-runtime/lifecycle/teardown/runtime-stops.mjs +50 -4
  393. package/src/session-runtime/lifecycle/teardown.mjs +23 -5
  394. package/src/session-runtime/mcp-glue/server-catalog.mjs +55 -3
  395. package/src/session-runtime/mcp-oauth-login.mjs +5 -3
  396. package/src/session-runtime/mixy-heartbeat.mjs +153 -33
  397. package/src/session-runtime/model-route/set-route.mjs +11 -2
  398. package/src/session-runtime/notification-bus.mjs +31 -117
  399. package/src/session-runtime/notification-completion-queue.mjs +54 -0
  400. package/src/session-runtime/notification-listeners.mjs +76 -0
  401. package/src/session-runtime/owned-automation-run.mjs +2 -1
  402. package/src/session-runtime/prewarm/channel-start.mjs +3 -7
  403. package/src/session-runtime/provider-catalog-cache.mjs +82 -36
  404. package/src/session-runtime/provider-models/catalog-load.mjs +23 -6
  405. package/src/session-runtime/provider-models.mjs +4 -2
  406. package/src/session-runtime/resource-mcp-api.mjs +143 -224
  407. package/src/session-runtime/resource-mcp-connector-accounts.mjs +163 -0
  408. package/src/session-runtime/resource-mcp-oauth-api.mjs +217 -0
  409. package/src/session-runtime/resource-mcp-secrets.mjs +82 -0
  410. package/src/session-runtime/resource-mcp-servers.mjs +78 -0
  411. package/src/session-runtime/resource-mcp-store.mjs +49 -0
  412. package/src/session-runtime/resource-recall-api.mjs +6 -1
  413. package/src/session-runtime/routine-owner.mjs +40 -9
  414. package/src/session-runtime/runtime-feature-gates.mjs +5 -1
  415. package/src/session-runtime/services/agent-tool/close-flow.mjs +3 -0
  416. package/src/session-runtime/services/agent-tool/execute.mjs +14 -9
  417. package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +20 -4
  418. package/src/session-runtime/services/agent-tool/model-select.mjs +48 -7
  419. package/src/session-runtime/services/agent-tool/render.mjs +71 -17
  420. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +13 -4
  421. package/src/session-runtime/services/agent-tool/tag-registry.mjs +1 -0
  422. package/src/session-runtime/services/agent-tool/tool-def.mjs +9 -9
  423. package/src/session-runtime/services/agent-tool/worker-index/awaiting-user-sync.mjs +51 -0
  424. package/src/session-runtime/services/agent-tool/worker-index/disposal.mjs +55 -0
  425. package/src/session-runtime/services/agent-tool/worker-index/released-store.mjs +123 -0
  426. package/src/session-runtime/services/agent-tool/worker-index/restart-settlement.mjs +112 -0
  427. package/src/session-runtime/services/agent-tool/worker-index/row-reads.mjs +36 -0
  428. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -0
  429. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +17 -4
  430. package/src/session-runtime/services/agent-tool/worker-index/row-writes.mjs +58 -0
  431. package/src/session-runtime/services/agent-tool/worker-index.mjs +41 -241
  432. package/src/session-runtime/services/agent-tool/worker-rows.mjs +3 -0
  433. package/src/session-runtime/services/channel-admin.mjs +7 -13
  434. package/src/session-runtime/services/channel-session-router.mjs +4 -2
  435. package/src/session-runtime/services/provider-admin.mjs +2 -1
  436. package/src/session-runtime/services/seeds.mjs +0 -28
  437. package/src/session-runtime/session-compaction-sync.mjs +27 -0
  438. package/src/session-runtime/session-create/session-options.mjs +1 -0
  439. package/src/session-runtime/settings-builtin-tools-api.mjs +11 -0
  440. package/src/session-runtime/settings-compaction-api.mjs +2 -40
  441. package/src/session-runtime/settings-system-api.mjs +13 -1
  442. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +65 -0
  443. package/src/session-runtime/setup-tool/executor.mjs +145 -22
  444. package/src/session-runtime/setup-tool/extended-actions.mjs +8 -3
  445. package/src/session-runtime/setup-tool/session-route-actions.mjs +152 -0
  446. package/src/session-runtime/setup-tool/settings-contract.mjs +4 -3
  447. package/src/session-runtime/setup-tool/tool-defs.mjs +64 -5
  448. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +17 -13
  449. package/src/session-runtime/tool-policy/policy-stage.mjs +17 -2
  450. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
  451. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +5 -1
  452. package/src/session-runtime/workflow-agents-api/agent-route.mjs +15 -4
  453. package/src/session-runtime/workflow-agents-api/onboarding.mjs +3 -3
  454. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +4 -0
  455. package/src/session-runtime/workspace/transitions.mjs +25 -0
  456. package/src/session-runtime/workspace/worktree-tool.mjs +26 -9
  457. package/src/standalone/channel-transport/client-registry/client-records.mjs +65 -0
  458. package/src/standalone/channel-transport/client-registry/client-registration.mjs +118 -0
  459. package/src/standalone/channel-transport/client-registry.mjs +24 -163
  460. package/src/standalone/channel-transport.mjs +1 -1
  461. package/src/standalone/daemon-channels-loader.mjs +10 -8
  462. package/src/standalone/daemon-session-control/list-page.mjs +72 -0
  463. package/src/standalone/daemon-session-control/request.mjs +51 -0
  464. package/src/standalone/daemon-session-control/room-host.mjs +57 -0
  465. package/src/standalone/daemon-session-control/route-control.mjs +48 -0
  466. package/src/standalone/daemon-session-control/send-turn.mjs +60 -0
  467. package/src/standalone/daemon-session-control/worktree-control.mjs +40 -0
  468. package/src/standalone/daemon-session-control.mjs +142 -190
  469. package/src/standalone/daemon.mjs +26 -3
  470. package/src/standalone/session-client.mjs +7 -3
  471. package/src/standalone/session-protocol.mjs +5 -0
  472. package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -0
  473. package/src/standalone/session-service/agent-tree/agent-turns.mjs +16 -12
  474. package/src/standalone/session-service/quota-resume.mjs +3 -0
  475. package/src/standalone/session-service/retention/busy.mjs +65 -1
  476. package/src/standalone/session-service/session-calls/session-action.mjs +30 -2
  477. package/src/standalone/session-service/session-calls/session-views.mjs +8 -0
  478. package/src/standalone/session-tool-output.mjs +15 -7
  479. package/src/standalone/session-transport/client-registry/client-grace.mjs +12 -9
  480. package/src/tui/app/app-view/floating-panel.jsx +7 -4
  481. package/src/tui/app/model-options.mjs +3 -28
  482. package/src/tui/app/model-picker/route-selection/fast-parameters.mjs +1 -3
  483. package/src/tui/app/model-picker/route-selection.mjs +5 -6
  484. package/src/tui/app/provider-setup/oauth-actions.mjs +38 -20
  485. package/src/tui/app/provider-setup/provider-items.mjs +8 -2
  486. package/src/tui/app/provider-setup-picker.mjs +9 -5
  487. package/src/tui/components/QuestionPanel.jsx +13 -4
  488. package/src/tui/dist/index.mjs +133 -92
  489. package/src/tui/session/agent-job-feed/model-notification.mjs +3 -0
  490. package/src/tui/session/initial-state.mjs +3 -0
  491. package/src/tui/session/notice-surface.mjs +7 -1
  492. package/src/tui/session/queue-helpers.mjs +3 -42
  493. package/src/tui/session/session-api/routes-agent-definitions.mjs +14 -2
  494. package/src/tui/session/session-api/routes-write.mjs +5 -1
  495. package/src/tui/session/session-api/routes.mjs +1 -0
  496. package/src/tui/session/session-api/settings.mjs +17 -1
  497. package/src/tui/session/session-flow/auto-clear.mjs +4 -33
  498. package/src/tui/session/session-flow/drain-closed-queue.mjs +38 -0
  499. package/src/tui/session/session-flow/drain-enqueue.mjs +86 -0
  500. package/src/tui/session/session-flow/drain-retry.mjs +35 -0
  501. package/src/tui/session/session-flow/drain.mjs +118 -149
  502. package/src/tui/session/session-flow/queue/entry-shape.mjs +5 -0
  503. package/src/tui/session/session-flow/queue/take-entries.mjs +16 -2
  504. package/src/tui/session/tool-approval-delegation.mjs +64 -0
  505. package/src/tui/session/tool-approval-request.mjs +39 -0
  506. package/src/tui/session/tool-approval-settle.mjs +62 -0
  507. package/src/tui/session/tool-approval.mjs +69 -115
  508. package/src/tui/session/tui-steering-persist.mjs +8 -1
  509. package/src/tui/session/turn-stream.mjs +19 -2
  510. package/src/tui/session/turn.mjs +1 -0
  511. package/src/ui/statusline-agents.mjs +1 -3
  512. package/src/vendor/statusline/bin/statusline-route.mjs +1 -219
  513. package/src/vendor/statusline/src/gateway/route-meta.mjs +35 -13
  514. package/scripts/code-graph-description-contract.mjs +0 -188
  515. package/src/runtime/channels/lib/owned-runtime/ownership-refresh.mjs +0 -36
@@ -5,11 +5,13 @@
5
5
  completion.
6
6
  - The user sees your text, and tool calls only as activity cards, never your
7
7
  thinking. Before your first tool call, briefly state what you are about to
8
- do. While working, give short updates at key moments: when you find
9
- something, change direction, or make progress without an update for a
10
- while. Otherwise bring the user only material findings, direction or scope
11
- changes, unapproved destructive actions, blockers or meaningful delays — never per-call
12
- narration or plan repeats.
8
+ do in one sentence; a quick lookup (a read, search or status check) needs
9
+ none, and one line covers a run of similar calls. While working, give a
10
+ sentence or two only at key moments: when you find something, change
11
+ direction, or make progress without an update for a while. Otherwise bring
12
+ the user only material findings, direction or scope changes, unapproved
13
+ destructive actions, blockers or meaningful delays — never a list of files
14
+ read, per-call narration or plan repeats.
13
15
  - Mid-task: a replacement supersedes, an addition folds in, a status question
14
16
  gets a brief answer while work continues.
15
17
  - Context is managed automatically: never stop or propose stopping because of
@@ -17,19 +19,20 @@
17
19
  - Be a grounded, candid, and attentive collaborator: natural and respectful,
18
20
  without flattery, forced humor, mimicry, or stereotyping.
19
21
  <!-- tools: agent -->
20
- - Briefing an agent: it starts blank and sees only the brief. Write it in
21
- English, self-contained: goal and its use; owned scope and non-goals;
22
- targets by path plus symbol or quoted line; done-when as an observable,
23
- checkable end state; any return need beyond the role. Pass only what
24
- cannot be rediscovered; large evidence by path. A fresh agent gets the
25
- whole brief, a continuing one only what changed. Never assign the same
26
- work twice. Ask an agent only for the checks covering its own change;
27
- cross-scope checks and the final verification stay with the Lead.
22
+ - Briefing an agent: one self-contained English brief with the goal and the
23
+ context it needs, owned paths, non-goals, constraints the agent does not
24
+ already receive, and done-when; a running agent gets only changes.
25
+ Done-when is the end state of the product or answer, never a list of
26
+ checks: name no tools, steps, commands or suites; the agent's own rules
27
+ choose its checks. A Reviewer gets the diff scope, the acceptance criteria
28
+ and the author's Evidence verbatim, not the whole report, so passed checks
29
+ are not rerun; a re-review carries only the fixes. Reference evidence by
30
+ path instead of retelling it. Decide first; send scope changes as one
31
+ replacement brief; invent no other restrictions or copies.
28
32
  <!-- tools: agent -->
29
- - Receiving an agent's report: it arrives as a `<task-notification>` block.
30
- Do not wait for it in-turn —
31
- finish work that does not depend on it and end the turn; never predict or
32
- fabricate the result. On an agent report, review its diff against the
33
- brief; one Reviewer per worker scope. Resolve findings, then verify the
34
- integrated cross-scope boundaries once before completion. Pending agent
35
- work is not a completed request.
33
+ - Reports arrive as `<task-notification>`: never wait, poll or guess them;
34
+ do independent work and end the turn. On an agent report, each feature
35
+ beyond docs/copy/style or one-line changes gets one fresh Reviewer, any
36
+ author (Lead reviews when none is available); recheck only fixes. Before
37
+ commit/report, check cross-feature seams and run affected suites once.
38
+ Pending agent work is not a completed request.
@@ -1,11 +1,10 @@
1
1
  # Tool Calls
2
2
 
3
- - Every independent call in the same response, never one per round. Sequence
4
- only on a real dependency.
5
- - A tool that takes an array (`read`, `grep`, `glob`, `git`, `code_graph`) gets
6
- one call with the array whenever there are several targets; separate calls of
7
- the same tool only when the targets need different options or one depends on
8
- another's result.
3
+ - Group calls already known to be needed in one response. Sequence only when
4
+ an earlier operation or result is needed to choose or safely run a later call.
5
+ - For `read`, `grep`, `glob`, `git`, and `code_graph`, combine compatible targets
6
+ in one array call; split only for dependencies, differing options or scope,
7
+ or schema limits.
9
8
  - Order on files: enumerate only when the scope is unknown → locate every
10
9
  site (known locations skip straight to the read) → one read stage over every
11
10
  located site → every edit in one response → one verification. A search after
@@ -7,6 +7,10 @@
7
7
  patch from it with no surveys or history. Stop once every requested item
8
8
  has its evidence; never widen past what was asked, and never ask
9
9
  permission for work the request already covers.
10
+ - When blocked, first look for a workaround you can carry out yourself with
11
+ the available tools.
12
+ <!-- tools: lead -->
13
+ Ask the user only when none exists.
10
14
  - Do not add work whose need depends on a pending result. Reuse content
11
15
  already delivered; changed sources and omitted ranges are new evidence.
12
16
  Trust documented guarantees; no availability checks or defensive branches —
@@ -7,8 +7,6 @@
7
7
  files you did not create: it may hold other agents' or the user's
8
8
  uncommitted work. Use a copy or managed snapshot for before/after
9
9
  comparisons.
10
- - Worktrees live only in the app-managed store; never create one through
11
- shell or in a temp folder.
12
10
  <!-- tools: git -->
13
11
  - Separate-branch work goes into a managed worktree through `git`.
14
12
  - Back up only when changes risk irreversible loss, not for routine code edits;
@@ -4,4 +4,6 @@
4
4
  data transformation, generated output, unsupported-format decoding. An open
5
5
  shell is never a routing reason.
6
6
  - Structured service operations go through the service's MCP tool or CLI.
7
+ - Open no window, dialog or elevation prompt unless showing or operating
8
+ that UI is the task.
7
9
 
@@ -3,11 +3,13 @@
3
3
  - Check required behavior, exact outputs and essential integrity, security,
4
4
  compatibility and buildability. Expected values come from sources or
5
5
  independent invariants, never from the output itself or from recall.
6
- - Verify once, at the end, before reporting: each required check once,
7
- independent checks in parallel; reuse still-valid passing results and
8
- rerun failed or invalidated checks, reading failure logs in full first;
9
- never read back your own writes. If repeated fixes leave the same failure unchanged,
10
- test the underlying assumptions before another fix.
6
+ - No builds/lint/tests/formatters mid-flight. Finish planned scope edits,
7
+ then run required checks once in parallel. On failure, read full logs,
8
+ finish fixes, rerun only failed or invalidated checks; reuse valid passes.
9
+ Never reread your writes.
10
+ - After two failed fixes, name the belief they share and test it before a third.
11
+ - Unexpected result: confirm the check sees the live artifact, not a cache or
12
+ stale copy, before blaming the system.
11
13
  - Use supplied commands unchanged except inputs, else documented defaults
12
14
  scoped to the change; no stricter flags or unrequested suites; gates belong
13
15
  to release.
@@ -1,8 +1,9 @@
1
1
  # Delivery
2
2
 
3
3
  - Unless the user explicitly requests them, do not author separate record-keeping
4
- artifacts (reports, progress logs, notes, or checklists). Report progress and
5
- results in the conversation instead.
4
+ artifacts (reports, progress logs, notes, or checklists).
5
+ <!-- tools: lead -->
6
+ Report progress and results in the conversation instead.
6
7
  - Reference files and folders in inline code by a Project-root-relative or
7
8
  absolute path, optionally `:line[:column]` (`deliverables/report.docx`,
8
9
  `src/app.ts:42`); files outside the Project always by absolute path; never a
@@ -11,14 +12,11 @@
11
12
  and give their path; never open them in the system browser or paste their
12
13
  source unless the user asks.
13
14
  <!-- tools: visualize -->
14
- - Open each finished artifact beside the chat with `visualize open` when available.
15
- This covers any deliverable a visual presents better: mockups, diagrams,
16
- plans, and comparisons or research results with tables. Present these as
17
- a visualize page and keep the chat to a short summary.
15
+ - Show every finished visual artifact with `visualize open`, loading its schema
16
+ first if deferred: images, video, HTML, documents, decks, mockups, diagrams,
17
+ plans; comparisons or research tables go in a visualize page. Keep the chat
18
+ to a short summary.
18
19
 
19
20
  <!-- tools: git -->
20
21
  - A commit request includes selecting and staging its changes; a stage-only
21
22
  request stops before commit. Do not stage changes without either request.
22
- <!-- tools: git -->
23
- - Stage selected diff changes with `git` using `action:"stage"`. Keep this
24
- internal step within the requested commit workflow, not a separate approval.
@@ -243,11 +243,13 @@ export function resolveAgentWatchdogPolicy(agent, overrides = {}) {
243
243
  // Role budget, floored so the provider recovery window always wins.
244
244
  idleStaleMs = Math.max(abort * 1000, PROVIDER_RECOVERY_FLOOR_MS);
245
245
  } else {
246
- // Part B: the primary mid-stream stall catch is now the provider-level
247
- // SEMANTIC idle abort (~120s, ping-immune). This public-agent idle is a
248
- // BACKSTOP only, so it must not exceed the stall abort (600s default) —
249
- // the old 30-min value meant a ping-only wedge that slipped past the
250
- // provider layer would still hang the owner for half an hour. Cap it at
246
+ // Part B: the provider-level idle abort is the first mid-stream catch, but
247
+ // it is transport-based for Anthropic (pings reset it; other providers
248
+ // judge semantic idle). This public-agent idle is a BACKSTOP only, so it
249
+ // must not exceed the stall abort (600s default) — the old 30-min value
250
+ // meant a ping-only wedge that slipped past the provider layer would still
251
+ // hang the owner for half an hour. Anthropic pings extend it only up to
252
+ // KEEPALIVE_MAX_IDLE_MULTIPLIER times (evaluateAgentWatchdogAbort). Cap it at
251
253
  // the stall abort while keeping 30 min as an absolute ceiling. Long tool
252
254
  // calls refresh progress through the activity heartbeat, so they never
253
255
  // trip this backstop.
@@ -270,6 +272,23 @@ export function resolveAgentWatchdogPolicy(agent, overrides = {}) {
270
272
  };
271
273
  }
272
274
 
275
+ // How far keepalives may extend liveness past the last real progress, as a
276
+ // multiple of the idle budget. Anthropic pings across legitimate generation
277
+ // gaps (adaptive thinking, a buffered tool input), but a wedged stream that
278
+ // pings forever must still die.
279
+ export const KEEPALIVE_MAX_IDLE_MULTIPLIER = 3;
280
+
281
+ // A keepalive newer than the last real progress holds the idle abort while it
282
+ // is itself fresh and the silence is within the cap. The runtime records one
283
+ // only after the request's first semantic event, so a ping before it never
284
+ // reaches here (the first-output window owns that phase).
285
+ function keepaliveHoldsIdle(snapshot, last, now, idleStaleMs) {
286
+ const keepaliveAt = snapshot.lastKeepaliveAt || 0;
287
+ return (
288
+ keepaliveAt > last && now - keepaliveAt <= idleStaleMs && now - last <= idleStaleMs * KEEPALIVE_MAX_IDLE_MULTIPLIER
289
+ );
290
+ }
291
+
273
292
  export function evaluateAgentWatchdogAbort(snapshot, now, policy) {
274
293
  if (!snapshot || !policy) return null;
275
294
  // A turn blocked on the user's tool approval (its own, or a sub-agent's that
@@ -285,7 +304,10 @@ export function evaluateAgentWatchdogAbort(snapshot, now, policy) {
285
304
  const firstSemanticMs = policy.firstSemanticMs ?? policy.firstVisibleCeilingMs ?? 0;
286
305
  // Independent fixed deadlines from request start. Transport can satisfy
287
306
  // only the transport deadline; it never switches, extends, or resets the
288
- // semantic-response deadline.
307
+ // semantic-response deadline. Both are judged per logical model request
308
+ // (runtime-liveness): the request that carries tool results gets the same
309
+ // first-output allowance as the turn's first request, while a retry of a
310
+ // request keeps that request's clock and marks.
289
311
  if (snapshot.waitingForTransport && firstTransportMs > 0 && startedAt && now - startedAt > firstTransportMs) {
290
312
  return new AgentStallAbortError(`agent first transport stale (${firstTransportMs}ms)`);
291
313
  }
@@ -298,6 +320,7 @@ export function evaluateAgentWatchdogAbort(snapshot, now, policy) {
298
320
 
299
321
  const last = snapshot.lastProgressAt || snapshot.firstActivityAt;
300
322
  if (policy.idleStaleMs > 0 && last && now - last > policy.idleStaleMs) {
323
+ if (keepaliveHoldsIdle(snapshot, last, now, policy.idleStaleMs)) return null;
301
324
  return new AgentStallAbortError(`agent task stale (${policy.idleStaleMs}ms without stream/tool progress)`);
302
325
  }
303
326
 
@@ -195,9 +195,8 @@ export function resolveCacheStrategy(agent, { autoClear, session = null } = {})
195
195
  // ttl "30m"; Lead-class sessions pin their stable prefix with one "12h"
196
196
  // breakpoint (header: break-even). Earlier models' typical retention is
197
197
  // ~30 min as well.
198
- export const OPENAI_TAIL_CACHE_TTL = '30m';
199
- export const OPENAI_LEAD_PREFIX_CACHE_TTL = '12h';
200
- const ANTHROPIC_TAIL_LIFETIME_MS = Object.freeze({ '5m': 5 * 60_000, '1h': 60 * 60_000 });
198
+ const OPENAI_LEAD_PREFIX_CACHE_TTL = '12h';
199
+ export const ANTHROPIC_TAIL_LIFETIME_MS = Object.freeze({ '5m': 5 * 60_000, '1h': 60 * 60_000 });
201
200
  const OPENAI_TAIL_LIFETIME_MS = 30 * 60_000;
202
201
 
203
202
  /** The OpenAI (API key) stable-prefix TTL for a session: '12h' for the Lead
@@ -14,7 +14,9 @@ function titleSystemPrompt(locale = '') {
14
14
  : TITLE_SYSTEM_PROMPT;
15
15
  }
16
16
 
17
- function createTitleCompletion(deps = {}) {
17
+ /** The title generator over injectable `deps` (tests); generateSessionTitle
18
+ * is it over the real config and provider registry. */
19
+ export function createTitleCompletion(deps = {}) {
18
20
  const load = deps.loadConfig || loadConfig;
19
21
  const resolveRoute = deps.resolveMaintenanceRoute || resolveMaintenanceRoute;
20
22
  const initialize = deps.initProviders || initProviders;
@@ -137,7 +137,7 @@ const TOOL_ARG_KEYS = {
137
137
  recall: ['query', 'limit', 'session_id', 'cwd'],
138
138
  search: ['query', 'limit', 'cwd'],
139
139
  code_graph: ['mode', 'file', 'files', 'symbol', 'symbols', 'body', 'language', 'limit', 'depth', 'page', 'cwd'],
140
- shell: ['command', 'timeout_ms'],
140
+ shell: ['command', 'cwd', 'timeout_ms'],
141
141
  task: ['action', 'task_id'],
142
142
  edit: ['file_path', 'replace_all'],
143
143
  edit_many: ['edits'],
@@ -631,6 +631,8 @@ function traceAgentTool({
631
631
  ...(toolBatchId ? { batch: { batch_id: toolBatchId, tool_call_id: toolCallId } } : {}),
632
632
  ...(Array.isArray(executionIntervals) ? { execution_intervals: executionIntervals } : {}),
633
633
  ...(resultTelemetry?.integrity ? { integrity: { ...resultTelemetry.integrity } } : {}),
634
+ // Shell-tool misuse the guards saw on this call (misuse-guard.mjs).
635
+ ...(Array.isArray(resultTelemetry?.shellMisuse) ? { shell_misuse: resultTelemetry.shellMisuse } : {}),
634
636
  },
635
637
  cwd: cwd || null,
636
638
  });
@@ -53,6 +53,7 @@ export function buildCacheBreakPayload(record = {}) {
53
53
  input_prefix_mismatch_actual_hash: cleanHash(record.inputPrefixMismatchActualHash),
54
54
  changed_blocks: cleanText(record.changedBlocks),
55
55
  system_markers_changed: typeof record.markersChanged === 'boolean' ? record.markersChanged : null,
56
+ lost_message_breakpoints: cleanText(record.lostMessageBreakpoints),
56
57
  };
57
58
  return Object.fromEntries(Object.entries(payload).filter(([, value]) => value !== null));
58
59
  }
@@ -81,6 +82,7 @@ function formatCacheBreakLine(record = {}) {
81
82
  ['noGuardBaseline', payload.missing_prefix_guard_baseline],
82
83
  ['changedBlocks', payload.changed_blocks],
83
84
  ['systemMarkersChanged', payload.system_markers_changed],
85
+ ['lostMessageBreakpoints', payload.lost_message_breakpoints],
84
86
  ].filter(([, value]) => value !== null && value !== undefined);
85
87
  return `[cache-break] ${fields.map(([key, value]) => (typeof value === 'string' ? `${key}=${JSON.stringify(value)}` : `${key}=${value}`)).join(' ')}`;
86
88
  }
@@ -41,6 +41,10 @@ import {
41
41
  removeRetiredAgentFields,
42
42
  } from './config-storage.mjs';
43
43
  import { oauthCredentialProbeState, isOAuthProviderAvailable } from './providers/oauth-credential-probes.mjs';
44
+ import {
45
+ DEFAULT_HEARTBEAT_INTERVAL_MINUTES,
46
+ normalizeHeartbeatIntervalMinutes,
47
+ } from '../../shared/heartbeat-interval.mjs';
44
48
  import { normalizeDeveloperConfig } from '../../shared/developer-options.mjs';
45
49
  import { normalizeWorktreeSettings } from '../../shared/worktrees/settings.mjs';
46
50
  import { normalizePluginMcpIntents } from './runtime-core/plugin-mcp.mjs';
@@ -295,8 +299,13 @@ export function loadConfig(options = {}) {
295
299
  recap: recapConfig,
296
300
  // The model may title the session (session tool, action=rename); default on.
297
301
  aiSessionTitles: raw.aiSessionTitles !== false,
298
- // Mixy's 2-hourly heartbeat check (session-runtime/mixy-heartbeat.mjs); default on.
302
+ // Mixy's heartbeat check (session-runtime/mixy-heartbeat.mjs); default on.
299
303
  heartbeat: raw.heartbeat !== false,
304
+ // Minutes between its checks, one of a fixed set (shared/heartbeat-interval.mjs);
305
+ // anything else reads as the default.
306
+ heartbeatIntervalMinutes: normalizeHeartbeatIntervalMinutes(raw.heartbeatIntervalMinutes),
307
+ // Prompt-cache warming (session/cache-warm.mjs); default on.
308
+ promptCacheWarming: raw?.promptCacheWarming !== false,
300
309
  // Bots may leave an emoji reaction on the user's message (react tool); default on.
301
310
  reactions: raw.reactions !== false,
302
311
  // Bots page layout (order, hidden groups, pins, retention) and the shared
@@ -351,6 +360,7 @@ export function loadConfig(options = {}) {
351
360
  shell: {},
352
361
  update: {},
353
362
  recap: { enabled: true },
363
+ promptCacheWarming: true,
354
364
  worktree: normalizeWorktreeSettings(null),
355
365
  developer: {},
356
366
  modules: {},
@@ -482,8 +492,14 @@ function buildAgentSaveBuilder(config) {
482
492
  else delete next.aiSessionTitles;
483
493
  if (config.heartbeat === false) next.heartbeat = false;
484
494
  else delete next.heartbeat;
495
+ // Only a non-default choice is stored.
496
+ const heartbeatMinutes = normalizeHeartbeatIntervalMinutes(config.heartbeatIntervalMinutes);
497
+ if (heartbeatMinutes !== DEFAULT_HEARTBEAT_INTERVAL_MINUTES) next.heartbeatIntervalMinutes = heartbeatMinutes;
498
+ else delete next.heartbeatIntervalMinutes;
485
499
  if (config.reactions === false) next.reactions = false;
486
500
  else delete next.reactions;
501
+ if (config.promptCacheWarming === false) next.promptCacheWarming = false;
502
+ else delete next.promptCacheWarming;
487
503
  if (Array.isArray(config.botOrder) && config.botOrder.length) next.botOrder = [...config.botOrder];
488
504
  else delete next.botOrder;
489
505
  if (config.leadAvatar && typeof config.leadAvatar === 'object') next.leadAvatar = { ...config.leadAvatar };
@@ -1,6 +1,7 @@
1
1
  export {
2
2
  applyInitialDeferredToolManifestToBp2,
3
3
  buildDeferredToolManifest,
4
+ resetBp2StableContext,
4
5
  stripDeferredToolManifestBlock,
5
6
  } from './deferred-tools.mjs';
6
7
  export {
@@ -11,11 +12,13 @@ export {
11
12
  collectPromptSkillsCached,
12
13
  collectSkills,
13
14
  collectSkillsCached,
15
+ currentSkillDelivery,
14
16
  filterSkillsExcludingDisabled,
15
17
  invalidateSkillsCache,
16
18
  isSkillDisabled,
17
19
  loadSkillResource,
18
20
  skillBodyPresentInSession,
21
+ skillLoadRefusal,
19
22
  skillMissingFeature,
20
23
  skillOutsideScope,
21
24
  skillEnabledFlags,
@@ -1,7 +1,11 @@
1
- // Deferred-pool and MCP-instruction manifests injected into BP2.
2
- import { accountOfInstructions } from '../../../shared/connector-accounts.mjs';
1
+ // Deferred-pool manifest injected into BP2. MCP server instruction bodies are
2
+ // not injected: a server's one-line entry is its when-to-use trigger (accounts
3
+ // one line per server), and its instructions arrive with its tools
4
+ // on load_tool. The <mcp-instructions> block is still recognized so older
5
+ // prompts can shed it.
3
6
  import { connectorTrigger } from '../../../shared/connector-triggers.mjs';
4
7
  import { parseMcpToolName, titleCaseMcpServer } from '../../../shared/tool-primitives.mjs';
8
+ import { SKILL_TRIGGER_LISTING_MAX } from '../../../shared/skill-document.mjs';
5
9
  import { isToolBridgeEnabled, TOOL_BRIDGE_GUIDANCE } from '../runtime-core/tool-exposure.mjs';
6
10
 
7
11
  export function compactPromptManifestText(value, max = 250) {
@@ -24,13 +28,24 @@ const MCP_INSTRUCTIONS_BLOCK_RE = /(\n\n---\n*)?<mcp-instructions>[\s\S]*?<\/mcp
24
28
  // Tool and MCP server names enter the manifests only as plain identifiers
25
29
  // (no markup can be smuggled into the prompt through a name).
26
30
  const MANIFEST_NAME_SAFE_RE = /^[A-Za-z0-9_.:-]+$/;
27
- const MCP_INSTRUCTION_MAX_CHARS = 600;
28
31
 
29
32
  function sanitizeManifestName(name) {
30
33
  const text = String(name || '').trim();
31
34
  return MANIFEST_NAME_SAFE_RE.test(text) ? text : '';
32
35
  }
33
36
 
37
+ const MCP_INSTRUCTION_MAX_CHARS = 600;
38
+
39
+ /** A server's instruction text without markup, capped at MCP_INSTRUCTION_MAX_CHARS. */
40
+ export function sanitizeMcpInstructionText(text, max = MCP_INSTRUCTION_MAX_CHARS) {
41
+ const stripped = String(text || '')
42
+ .replace(/[<>]/g, '')
43
+ .trim();
44
+ if (!stripped) return '';
45
+ const cap = Math.max(1, Number(max) || MCP_INSTRUCTION_MAX_CHARS);
46
+ return stripped.length > cap ? `${stripped.slice(0, Math.max(1, cap - 3))}...` : stripped;
47
+ }
48
+
34
49
  function skillRoutedToolNames(messages) {
35
50
  const names = new Set();
36
51
  for (const message of Array.isArray(messages) ? messages : []) {
@@ -63,7 +78,8 @@ function hasDeferredToolManifestBlock(text) {
63
78
  * wire tools). Each entry is either a bare name string or `{ name, description }`;
64
79
  * output lines are `- name: description` (description omitted when absent),
65
80
  * mirroring the available-skills manifest so the model calls deferred tools
66
- * directly. Descriptions are compacted and stripped of `<`/`>`.
81
+ * directly. Descriptions are compacted to the skill listing's trigger cap
82
+ * (skill-document.mjs SKILL_TRIGGER_LISTING_MAX) and stripped of `<`/`>`.
67
83
  * Empty pool → '' (caller omits the block).
68
84
  */
69
85
  export function buildDeferredToolManifest(entries) {
@@ -77,62 +93,19 @@ export function buildDeferredToolManifest(entries) {
77
93
  const description =
78
94
  typeof entry === 'string'
79
95
  ? ''
80
- : compactPromptManifestText(String(entry?.description || '').replace(/[<>]/g, ''), 100);
96
+ : compactPromptManifestText(String(entry?.description || '').replace(/[<>]/g, ''), SKILL_TRIGGER_LISTING_MAX);
81
97
  list.push({ name, description });
82
98
  }
83
99
  if (!list.length) return '';
84
100
  list.sort((a, b) => a.name.localeCompare(b.name));
85
101
  return [
86
102
  '<available-deferred-tools>',
87
- 'Deferred tool names and selection triggers; schemas load on demand.',
103
+ 'Deferred tools; load_tool loads their schemas.',
88
104
  ...list.map((entry) => (entry.description ? `- ${entry.name}: ${entry.description}` : `- ${entry.name}`)),
89
105
  '</available-deferred-tools>',
90
106
  ].join('\n');
91
107
  }
92
108
 
93
- function sanitizeMcpInstructionText(text, max = MCP_INSTRUCTION_MAX_CHARS) {
94
- const stripped = String(text || '')
95
- .replace(/[<>]/g, '')
96
- .trim();
97
- if (!stripped) return '';
98
- const cap = Math.max(1, Number(max) || MCP_INSTRUCTION_MAX_CHARS);
99
- return stripped.length > cap ? `${stripped.slice(0, Math.max(1, cap - 3))}...` : stripped;
100
- }
101
-
102
- /**
103
- * Per-server MCP initialize instructions for deferred-pool tools only.
104
- * Empty when no instructions or no matching deferred MCP tools → omit block.
105
- * Emits ONLY the server heading + instruction body: tool names are never
106
- * listed — <available-deferred-tools> names each server once (mcp__<server>).
107
- */
108
- function buildMcpInstructionsManifest(mcpServerInstructions, poolNames, catalog = []) {
109
- const map = mcpServerInstructions && typeof mcpServerInstructions === 'object' ? mcpServerInstructions : {};
110
- const pool = [
111
- ...new Set((Array.isArray(poolNames) ? poolNames : []).map((name) => sanitizeManifestName(name)).filter(Boolean)),
112
- ];
113
- // Tool definitions carry their server (shortened names cannot be parsed).
114
- const byName = new Map();
115
- for (const tool of Array.isArray(catalog) ? catalog : []) {
116
- const name = String(tool?.name || '').trim();
117
- if (name && !byName.has(name)) byName.set(name, tool);
118
- }
119
- const deferredServers = new Set();
120
- for (const name of pool) {
121
- const server = parseMcpToolName(byName.get(name) || name)?.server;
122
- if (server) deferredServers.add(server);
123
- }
124
- const servers = [...deferredServers]
125
- .filter((server) => sanitizeManifestName(server) && sanitizeMcpInstructionText(map[server]))
126
- .sort((a, b) => a.localeCompare(b));
127
- if (!servers.length) return '';
128
- const lines = ['<mcp-instructions>'];
129
- for (const server of servers) {
130
- lines.push(`## ${sanitizeManifestName(server)}`, sanitizeMcpInstructionText(map[server]));
131
- }
132
- lines.push('</mcp-instructions>');
133
- return lines.join('\n');
134
- }
135
-
136
109
  export function stripDeferredToolManifestBlock(text) {
137
110
  return String(text || '')
138
111
  .replace(DEFERRED_TOOLS_BLOCK_RE, '')
@@ -144,9 +117,8 @@ export function stripDeferredToolManifestBlock(text) {
144
117
  // Rebuild path: replace the FIRST previously-injected <available-deferred-tools>
145
118
  // block (with its leading `---` separator) with the fresh manifest IN PLACE, so
146
119
  // the block keeps its original position and no sibling BP2 block (skills
147
- // manifest, agent rules, …) is reordered or dropped. The fresh manifest already
148
- // carries the mcp-instructions companion, so any pre-existing standalone one is
149
- // removed first to avoid duplication.
120
+ // manifest, agent rules, …) is reordered or dropped. A legacy <mcp-instructions>
121
+ // block left by older sessions is removed first.
150
122
  function rebuildDeferredToolManifestBlock(text, manifest) {
151
123
  let out = String(text || '').replace(MCP_INSTRUCTIONS_BLOCK_RE, '');
152
124
  let replaced = false;
@@ -183,24 +155,50 @@ const firstSentence = (text) => {
183
155
  return (flat.split(/(?<=[.!?])\s/, 1)[0] || flat).replace(/[.!?]+$/, '');
184
156
  };
185
157
 
186
- // A catalog connector's curated trigger; else the server's MCP instructions;
187
- // else its tools' leading descriptions (name order); else its name. Derived
188
- // lines are compacted to at most 100 characters, ellipsis included.
158
+ // A catalog connector's curated when-to-use trigger; else the first sentence
159
+ // of the server's MCP instructions; else its tools' leading descriptions (name
160
+ // order); else its name. Never the account: that is part of the instruction
161
+ // text delivered when the server's tools are loaded. Derived lines are
162
+ // compacted to at most 98 characters, ellipsis included.
189
163
  function mcpServerTrigger(server, tools, instructions) {
190
- // A multi-account connector's server names its account (connector-accounts.mjs).
191
- const account = accountOfInstructions(instructions?.[server]);
192
164
  const curated = connectorTrigger(server);
193
- if (curated) return account ? `${curated} Account: ${account}` : curated;
194
- const instruction = String(instructions?.[server] || '').replace(/[<>]/g, '');
165
+ if (curated) return curated;
166
+ // The account sentence ("Account: <address>. …", connector-accounts.mjs) is
167
+ // not a use line; it reaches the model with the loaded server's instructions.
168
+ const instruction = String(instructions?.[server] || '')
169
+ .replace(/[<>]/g, '')
170
+ .replace(/^\s*Account: \S+?\.\s+/, '');
195
171
  const described = [...tools]
196
172
  .sort((a, b) => String(a?.name || '').localeCompare(String(b?.name || '')))
197
173
  .map((tool) => firstSentence(String(tool?.description || '').replace(/[<>]/g, '')))
198
174
  .filter(Boolean)
199
175
  .join('; ');
200
- const derived = instruction.trim() ? instruction : described;
176
+ const derived = firstSentence(instruction) || described;
201
177
  return derived ? compactPromptManifestText(derived, 98) : `${titleCaseMcpServer(server)} MCP server tools.`;
202
178
  }
203
179
 
180
+ // `mcp__<server>` as the manifest names it, or '' for an unsafe server name.
181
+ export const mcpServerManifestLabel = (server) => sanitizeManifestName(mcpServerLineName(server));
182
+
183
+ /**
184
+ * One `{ label: 'mcp__<server>', trigger }` line per server of `servers` (Map
185
+ * server → its tools). The BP2 manifest and the deferred-tool delta both
186
+ * render these; a server with an unsafe name gets none.
187
+ */
188
+ export function mcpServerLines(servers, instructions) {
189
+ const lines = [];
190
+ for (const [server, tools] of servers) {
191
+ const label = mcpServerManifestLabel(server);
192
+ if (!label) continue;
193
+ const trigger = compactPromptManifestText(
194
+ String(mcpServerTrigger(server, tools, instructions)).replace(/[<>]/g, ''),
195
+ SKILL_TRIGGER_LISTING_MAX
196
+ );
197
+ lines.push({ label, trigger });
198
+ }
199
+ return lines;
200
+ }
201
+
204
202
  function deferredManifestEntries(session, pool) {
205
203
  const byName = catalogByName(session);
206
204
  const skillRoutedNames = skillRoutedToolNames(session.messages);
@@ -221,11 +219,8 @@ function deferredManifestEntries(session, pool) {
221
219
  description: skillRoutedNames.has(key) ? '' : String(tool?.trigger || tool?.description || ''),
222
220
  });
223
221
  }
224
- for (const [server, tools] of servers) {
225
- entries.push({
226
- name: mcpServerLineName(server),
227
- description: mcpServerTrigger(server, tools, session.mcpServerInstructions),
228
- });
222
+ for (const line of mcpServerLines(servers, session.mcpServerInstructions)) {
223
+ entries.push({ name: line.label, description: line.trigger });
229
224
  }
230
225
  return entries;
231
226
  }
@@ -241,7 +236,7 @@ export function listedDeferredToolNames(session, poolNames, rendered) {
241
236
  }
242
237
 
243
238
  function composeDeferredBp2Manifest(session, pool) {
244
- // Bridge exposure gets the native roster and MCP instructions (the pool is
239
+ // Bridge exposure gets the native roster (the pool is
245
240
  // already limited to what the session's policy lets it run), followed by
246
241
  // the static bridge guidance. A tool-free bridge session gets nothing.
247
242
  const bridge = isToolBridgeEnabled(session);
@@ -249,8 +244,6 @@ function composeDeferredBp2Manifest(session, pool) {
249
244
  const parts = [];
250
245
  const deferredManifest = buildDeferredToolManifest(deferredManifestEntries(session, pool));
251
246
  if (deferredManifest) parts.push(deferredManifest);
252
- const mcpManifest = buildMcpInstructionsManifest(session.mcpServerInstructions, pool, session.deferredToolCatalog);
253
- if (mcpManifest) parts.push(mcpManifest);
254
247
  if (bridge) parts.push(TOOL_BRIDGE_GUIDANCE);
255
248
  return parts.join('\n\n');
256
249
  }
@@ -292,6 +285,18 @@ function resolveDeferredBp2Index(session) {
292
285
  return idx;
293
286
  }
294
287
 
288
+ /**
289
+ * Give BP2 `stableContext` (profile meta + skill manifest) and no deferred
290
+ * manifest. The caller re-applies that manifest
291
+ * (applyInitialDeferredToolManifestToBp2 with `rebuild`), which appends it
292
+ * after the stable part exactly as session creation laid it out.
293
+ */
294
+ export function resetBp2StableContext(session, stableContext) {
295
+ if (!Array.isArray(session?.messages)) return;
296
+ const idx = resolveDeferredBp2Index(session);
297
+ if (idx >= 0) setSystemContent(session, idx, String(stableContext || ''));
298
+ }
299
+
295
300
  function writeDeferredManifestAt(session, idx, manifest, rebuild) {
296
301
  for (let i = 0; i < session.messages.length; i++) {
297
302
  if (i === idx || session.messages[i]?.role !== 'system' || typeof session.messages[i].content !== 'string')