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
@@ -1,88 +1,43 @@
1
- # Cleanup inventory and report
1
+ # Candidate list and report
2
2
 
3
- Read this before registering the first candidate, and again when closing the
4
- last round. It owns candidate registration, statuses, completion criteria, and
5
- the final report template. Findings and their risk tiers come from the
6
- agent-level analysis; this file owns how they are recorded and reported.
3
+ Findings and risk tiers come from `agent-cleanup.md`; this file owns how they
4
+ are recorded and reported. Keep the list in the conversation, not a file.
7
5
 
8
- ## Candidate inventory
6
+ ## Candidates
9
7
 
10
- The candidate inventory grows as rounds reveal findings. Register candidates
11
- using stable candidate IDs:
8
+ One line per candidate, with a stable ID (`C-01`):
12
9
 
13
10
  ```text
14
- [ID] path · symbol → problem → cost (what it duplicates, wastes, or makes harder) → planned action | tier: SAFE/CAREFUL/RISKY | confidence: high/medium/low | status: completed/kept/unfinished | verification: <test/check>
11
+ [ID] path · symbol → problem → cost → action | tier: SAFE/CAREFUL/RISKY | confidence: high/medium/low | status: completed/kept/unfinished
15
12
  ```
16
13
 
17
- - **Stable IDs & Grouping**: Assign stable IDs (e.g. `C-01`, `C-02` or `MOD-01`).
18
- When multiple locations share an identical root cause (e.g. an unused helper
19
- referenced across three call sites, or repeated boilerplate), group them under
20
- one ID without losing each member's path and symbol. Counts track
21
- candidate IDs, not raw diagnostics or individual member locations.
22
- - **Origin tracking**: When code moves during extraction or splitting, retain
23
- the origin candidate ID and record the new target location under that ID.
24
- - **Candidate classification**: Register only a lens finding with a
25
- path-plus-symbol location, a cost, and an action. Line numbers appear only
26
- when copied from engine diagnostics or grep output. Mechanical threshold hits (files > 1,000 lines,
27
- functions > 50 lines, nesting > 3) are investigation signals only; without a
28
- finding, do not register them or write a Keep justification.
29
- - **Cost, Confidence & Nits**: A finding that cannot name its cost is a nit:
30
- do not register it. An unresolved registered finding remains `unfinished`;
31
- uncertainty is not evidence for keeping it. Confidence is `low` when
32
- current code, callers, contracts, and tests do not explain why the code exists.
33
- Consult history only to resolve a specific remaining question. Medium/low
34
- confidence candidates stay unfinished until that question is resolved; apply
35
- approval does not authorize guessing that they are safe to delete.
36
- - **Statuses & Reconciliation Invariants**:
37
- - `completed`: verified done, with evidence of what and how changed.
38
- - `kept`: preserved with concrete evidence (documented keep rule or external contract).
39
- - `unfinished`: work remaining, with substatuses: `pending`, `in_progress`, `blocked`, `deferred`, or `unverified`.
40
- - Formula for registered candidates: `Total Candidate IDs = Completed + Kept + Unfinished Remaining`. Counts must reconcile exactly.
14
+ - Register only a lens finding with a path+symbol location, a cost, and an
15
+ action. A finding that cannot name its cost is a nit: drop it. Threshold
16
+ hits (long files or functions, deep nesting) are signals, not candidates.
17
+ - Findings sharing a root cause group under one ID, each member keeping its
18
+ path and symbol. Code moved by an extraction keeps its origin ID.
19
+ - Confidence is `low` when callers, contracts, and tests do not explain why
20
+ the code exists; medium/low candidates stay unfinished until that question
21
+ is resolved. Approval to apply does not authorize guessing.
22
+ - `completed` carries evidence of what changed; `kept` carries a concrete
23
+ reason (keep rule or external contract); `unfinished` carries the blocker
24
+ (pending, blocked, deferred, unverified).
41
25
 
42
- Report round outcome separately from overall cleanup status. Overall cleanup
43
- is complete only when all partitions and applicable stages are verified and
44
- every registered candidate is completed or evidenced as kept. A completed round
45
- with remaining partitions or candidates is **round complete, overall partial**,
46
- with the remaining paths, IDs, and next work.
47
- Skipped, failed, or unverified checks never count as passed.
26
+ Overall cleanup is complete only when every partition is done, the final
27
+ check has passed, and every candidate is completed or kept with evidence.
28
+ Otherwise report "overall partial" with the remaining paths and IDs.
48
29
 
49
- ## Final report template
50
-
51
- This is the shape of the closing reply after the last round; earlier rounds
52
- close as the skill body's section 7 describes, while the inventory accumulates
53
- in the form above.
30
+ ## Final report
54
31
 
55
32
  ```text
56
- Scope: <user-selected paths | explicit whole project> · Mode: report|apply
57
- Round: Round <N> <completed|partial> · Overall: <complete|partial>
58
- Inventory: Total <N> · Completed <X> · Kept <Y> · Unfinished <Z> (X + Y + Z = N)
59
- Stages: baseline / engines / structural / ladder + lenses / tiered changes / final verification
60
- <stage>: completed <evidence> | not applicable <reason> | unfinished <blocker>
61
- Baseline: tests <green|N pre-existing failures excluded> · typecheck <ok|…>
62
- Deterministic: engines used/missing · files changed · diagnostics remaining · structural matches applied/skipped
63
-
64
- Completed (what changed and how)
65
- [ID] path/file.ts · symbol
66
- ✓ [Quality/SAFE] removed comment narrating the change in `renderRow` → deleted redundant comment
67
- ✓ [Reuse/CAREFUL] replaced manual join with `joinPath` from src/shared/path.mjs → consolidated helper
68
-
69
- Kept / Not Applicable (evidenced)
70
- [ID] path/file.ts · symbol
71
- - [Keep/Contract] public export `parseConfig` kept → external contract
72
- - [Keep/Rule] redundant-looking guard in `fetchUser` kept → validates untrusted network input
73
-
74
- Unfinished (remaining candidates)
75
- [ID] path/file.ts · symbol
76
- ☐ [Structure/CAREFUL] split `handleRequest` responsibility · Status: pending|in_progress|blocked|deferred|unverified
77
- Remaining: extract auth sub-handler · Reason: waiting for auth test fixture · Next: Round <N+1>
78
-
79
- Noticed but not applied (report-only or out of scope)
80
- [ID] ⚠ [Altitude/RISKY] special case for caller X in `run` (src/core/run.mjs) — separate correction · coverage: none · Status: deferred
81
- [ID] ⚠ [Quality] two equal rewrites of `parseInput`; principles could not decide · Status: blocked
82
-
83
- Bugs found (not fixed here): <correctness issues surfaced while cleaning>
84
- Verification: tests <passed/failed/skipped/baseline-excluded counts> · typecheck <result> · lint <remaining diagnostics>
85
- Blocked or unavailable verification (required; write "none"): <check> — <engine unresolved through tidy | runner broken | lane conflict> → <paths left unverified>
86
- Needs your decision: <one consolidated list — RISKY findings, bugs found, unresolved intent, unfinished candidates>
87
- Next round: <scope and IDs planned for next round, or none if overall complete>
33
+ Scope: <paths | whole project> · Mode: report|apply · Overall: complete|partial
34
+ Deterministic: engines used/missing · files changed · diagnostics remaining · structural applied/skipped
35
+ Completed: [ID] path · symbol — [Lens/TIER] what changed
36
+ Kept: [ID] path · symbol — reason
37
+ Unfinished: [ID] path · symbol — remaining work · status · next
38
+ Noticed, not applied (RISKY or out of scope): [ID] path · symbol — why · test coverage
39
+ Bugs found (not fixed here): <issues>
40
+ Verification: tests <result> · typecheck <result> · tidy check <remaining diagnostics> · pre-existing failures <list|none>
41
+ Blocked or unverified: <check> — <reason> → <paths> (write "none" if none)
42
+ Needs your decision: <RISKY findings, bugs, unresolved intent, unfinished candidates>
88
43
  ```
@@ -19,9 +19,7 @@ never route one through `tidy` (they are not tidy engines):
19
19
  | `deadcode` (Go, `golang.org/x/tools`) / `cargo machete` | unreachable functions / unused crates | only when on PATH |
20
20
  | `code_graph mode:symbols` per selected file | private helpers with no callers (`callers`) | universal, no install |
21
21
 
22
- Keep optional unused-code diagnostics separate from the build baseline.
23
- Do not add stricter compiler flags for a routine cleanup check; an explicitly
24
- requested additional diagnostic does not redefine the project's build criteria.
22
+ Do not add stricter compiler flags for a routine cleanup.
25
23
 
26
24
  An import the project cannot resolve, or one whose package is absent from the
27
25
  manifest, is not dead code but a phantom dependency: report it under "Bugs
@@ -48,7 +46,7 @@ found" and never settle it by installing the package.
48
46
  module for registration or initialization. Preserve required initialization
49
47
  rather than deleting it with the binding.
50
48
  5. Record the symbol, kind, classified usage and contract evidence, side-effect
51
- result, and proposed action in the shared candidate inventory.
49
+ result, and proposed action in the candidate list.
52
50
 
53
51
  ## Never dead
54
52
 
@@ -81,9 +79,7 @@ evidence. Apply this procedure before classifying an old path as dead:
81
79
  4. For a verified obsolete path, inventory its callers, flags/config, tests,
82
80
  docs, files, and dependencies. Remove only approved members in the order
83
81
  below; request scope expansion before editing related files outside it.
84
- 5. Verify the current path and remaining supported compatibility cases with
85
- documented checks. Record the retirement evidence and any remaining items.
86
- A still-required path is kept with its contract; an unknown obligation
82
+ 5. Record the retirement evidence and any remaining items. A still-required path is kept with its contract; an unknown obligation
87
83
  leaves the candidate blocked, not assumed obsolete.
88
84
 
89
85
  ## Remove in order
@@ -98,11 +94,9 @@ evidence. Apply this procedure before classifying an old path as dead:
98
94
  project's own package manager.
99
95
 
100
96
  Group edits by file so one batch never touches a file another batch edits.
101
- Verification and failure rollback follow the skill body (section 4 step 3 and
102
- the test-failure pitfall); never patch forward past a failure.
97
+ Verification and rollback follow the skill body (section 5).
103
98
 
104
99
  ## Report
105
100
 
106
- Use the shared candidate inventory and closing report, not a second dead-code
107
- ledger. Include the symbol/kind, usage and side-effect evidence, any legacy
108
- obligations, and verification result for each completed, kept, or unfinished ID.
101
+ Use the shared candidate list and closing report, with usage and side-effect
102
+ evidence per ID.
@@ -8,6 +8,8 @@ dependencies:
8
8
  tools:
9
9
  - type: tool
10
10
  value: computer
11
+ - type: tool
12
+ value: handoff_user
11
13
  ---
12
14
 
13
15
  # Computer Use
@@ -41,8 +43,11 @@ GNOME with Mixdog's own shell extension, which the app sets up); prefer accessib
41
43
  - Mixdog browser pages → Browser Use (`browser`). A refused or unfinished
42
44
  page action stays on that route for recovery or user handoff; never retry
43
45
  it through `computer` or move it to another browser.
44
- - On either route, permission denials, CAPTCHA/2FA, identity checks, and user
45
- stops are not fallback signals: report or hand off, never bypass them.
46
+ - On either route, permission denials, CAPTCHA/2FA (authenticator, SMS,
47
+ passkey), identity checks, and user stops are not fallback signals: report
48
+ or hand off, never bypass them. A "check your e-mail" step of a sign-up or
49
+ sign-in Mixdog started is not one: finish it from a connected mailbox
50
+ (browser-use skill, E-mail verification).
46
51
  - Use the screen when a UI itself is the subject: checking a desktop app's GUI
47
52
  after a change, a GUI-only bug, UI-only settings, a cross-app flow.
48
53
  - Service CLIs and deterministic file, process, or config work → `shell`/`edit`;
@@ -83,8 +88,10 @@ GNOME with Mixdog's own shell extension, which the app sets up); prefer accessib
83
88
  `input_may_have_executed:true` or unknown delivery is not a no-input refusal.
84
89
  A refusal applies to that action, not to earlier completed steps. Keep the
85
90
  selected app/browser session when choosing another supported delivery route.
86
- - User intervention means pending work, not permission to work around the pause
87
- through background input. Resume only through the recovery flow below.
91
+ - Background work continues while the user works. A foreground step is refused
92
+ or interrupted (that action only, `user_input_active`) when the user acts; it
93
+ never pauses the session. Retry it after the user pauses. Explicit
94
+ Stop/Pause still halts everything; resume through the recovery flow below.
88
95
 
89
96
  ## Rules
90
97
 
@@ -114,11 +121,14 @@ GNOME with Mixdog's own shell extension, which the app sets up); prefer accessib
114
121
  - Window pixels come only from a window-owned capture, never a sampled region
115
122
  of the shared desktop. If that surface is unavailable, use semantic refs or
116
123
  report `pixel_unavailable`; do not substitute a screen grab.
117
- - If the user intervenes, preserve their cursor and focus. Worker termination
118
- and input cleanup must finish before resuming. The user's Resume on the
119
- overlay continues a pause; an ordinary physical-input pause may also resume
120
- after the host's configured quiet interval (renewed input resets it), while
121
- explicit pauses, stops and uncertain cleanup never auto-resume. Stop (or
124
+ - If the user's physical input interrupts an action, it fails alone with
125
+ `user_input_active` (input may have landed: capture fresh state, never replay,
126
+ no `wait_for_user`). Their cursor and focus stay theirs. Worker
127
+ termination and input cleanup must finish before resuming a pause. The user's
128
+ Resume on the overlay continues a pause; an unverified-recovery pause may
129
+ also resume after the host's configured quiet interval (renewed input resets
130
+ it), while explicit pauses, stops and uncertain cleanup never auto-resume.
131
+ Stop (or
122
132
  `Ctrl+Alt+Esc`) cancels the task, which then reports the stop as a failure.
123
133
  A cleanup that could not be confirmed is retried before the next input
124
134
  command; if it still fails, that command returns the reason — relay it to
@@ -222,6 +232,22 @@ refs still work.
222
232
  `type` text, optional `key` Enter → inspect the returned value. Use `verify`
223
233
  only if the result does not establish the required value or completion state.
224
234
 
235
+ **Sign in inside the user's browser window** — prefer the session or SSO the
236
+ browser already has, or Browser Use's saved sign-in. As a fallback, focus the
237
+ login field (`act` click), then `saved_login` with `savedAccount` (username or
238
+ masked label) and `field` (`username` or `password`). The host writes it only
239
+ into that field of a verified Chrome/Edge HTTPS page whose origin has
240
+ the login (separate checks, then one write: not atomic inside the browser).
241
+ The site receives it. The password is the protected value: it is kept out of
242
+ your results and that browser's pixels are withheld until this turn ends
243
+ (`ax` reads still work), but a page that redisplays it can expose it, and other
244
+ programs of the same Windows user are outside this protection. A username is
245
+ an identifier and is not hidden. Continue with keys (`act` key Enter). On a
246
+ refusal, hand the secret to the user (`handoff_user` kind `secret`,
247
+ surface `computer`); one-time codes, passkeys, security keys and app approvals
248
+ are the user's step (`handoff_user` kind `takeover`). Never type a password or
249
+ code with `type`/`set_value`, even one shown on screen.
250
+
225
251
  **Keyboard-driven navigation** — `act` with `key` steps such as `ctrl+s`
226
252
  and a trailing short `wait`; verify with `verify` rather than another capture.
227
253
  `alt+f4` is blocked in every delivery mode. To close a window, obtain the
@@ -63,6 +63,28 @@ that a call returned without transport error.
63
63
  - Read `references/surfaces.md` only when the user asks where a setting lives,
64
64
  a secret must be entered, or no setup mutation exists.
65
65
 
66
+ ## What applies now vs. later
67
+
68
+ - Now: built-in, connector, permission, hook-rule, cache-warming and
69
+ automation changes (each at its next use), and a fallback chain: running
70
+ sessions on that route read it at their next hop.
71
+ - Next turn: an agent/bot route for its open chats, `reset_route_fallback`, a
72
+ workflow switch. A running turn finishes on its current model.
73
+ - New sessions: the Main model (`set_route` model), instruction files, most
74
+ other settings. An established conversation keeps its model.
75
+ - Session actions (`reset_route_fallback`, quota resume, `continue_in_model`)
76
+ answer `scope: "session"`, not a saved setting.
77
+
78
+ ## Stopping something already running
79
+
80
+ Setup changes settings; it does not stop work. Use the tool that owns it:
81
+ `session` `cancel` (another session's turn, a routine run in a bot's chat, a
82
+ group room's exchange; a Browser/Computer takeover ends with its turn),
83
+ `agent` `cancel`/`close` (sub-agents), `task` (background shell jobs), `goal`
84
+ `pause` (an active Goal, at the user's request). Setup only prevents more: `set_automation_enabled false`
85
+ (future routine runs), `fallbacks: []` (further hops), `cancel_quota_resume`,
86
+ `set_builtin_enabled` browser/computer off.
87
+
66
88
  ## High-signal distinctions
67
89
 
68
90
  - Main model, agent models, and Web Search model are separate routes. Omitted
@@ -52,7 +52,8 @@ Read this when choosing a `setup` mutation.
52
52
  | Permanently delete confirmed, unchanged, unused model files | `delete_local_model` |
53
53
  | TUI system shell | `set_system_shell` |
54
54
  | Automatic updates | `set_auto_update` |
55
- | Mixy's heartbeat: a check every 30 minutes that wakes her only when something needs attention (on by default; `status features` reports `heartbeat.enabled`) | `set_heartbeat_enabled` |
55
+ | Mixy's heartbeat: a regular check that wakes her only when something needs attention and only after the user had no operation for 30 minutes (no sent turn, no keyboard/mouse/wheel input in the desktop app's windows) (on by default; `status features` reports `heartbeat.enabled` and `heartbeat.intervalMinutes`) | `set_heartbeat_enabled` |
56
+ | How often the heartbeat checks: `minutes` 30, 60 (default), 120 or 240; applies from the next tick, counted from the last check | `set_heartbeat_interval` |
56
57
  | Bots' emoji reactions on the user's messages (on by default; `status features` reports `reactions.enabled`) | `set_reactions_enabled` |
57
58
  | Worktree defaults: new tasks on the current branch or a new worktree, branch prefix, large-repository warning size, automatic cleanup | `set_worktree_settings` |
58
59
  | Remove stored provider authentication (one OAuth account at a time, or an API-key provider's key) | `forget_provider_auth` |
@@ -94,6 +95,17 @@ Read this when choosing a `setup` mutation.
94
95
  | Unregister a Project without deleting its files | `remove_project` |
95
96
  | Revoke one linked device by its client id from `status connection`; re-pairing restores access | `revoke_linked_device` |
96
97
  | Managed local model context allocation; null restores automatic | `set_local_context` |
98
+ | Return a session that fell back (this one by default, `sessionId`, or every chat of a bot with `agent`) to its primary route and chain | `reset_route_fallback` |
99
+ | Switch a session whose last turn stopped on a usage limit onto another model (`sessionId`, `route`) | `continue_in_model` |
100
+ | Resend a usage-limit-stopped turn of a session at its reset time, or drop that pending resume | `schedule_quota_resume`, `cancel_quota_resume` |
101
+ | Prompt-cache warming on/off (`status compaction` `promptCacheWarming`) | `set_cache_warming_enabled` |
102
+ | Read an agent's action permissions, connector switches and always-allowed tools | `read_agent_settings` |
103
+ | Read a Project's connector switches | `read_project_connectors` |
104
+ | An agent's action permission (block/ask per action kind) | `set_agent_permission` |
105
+ | Switch a connector off for an agent / a Project (switching it back on is done in the desktop app) | `set_agent_connector`, `set_project_connector` |
106
+ | One connector tool of an agent to needs_approval or disabled | `set_agent_connector_tool` |
107
+ | Bring back an archived bot or agent (`definitionKind: "agent"`) | `restore_definition` |
108
+ | Bot display order (Bots page, Sessions bot section; `status agents` `botOrder`) | `set_bot_order` |
97
109
 
98
110
  ## Routes and workflow
99
111
 
@@ -131,10 +143,22 @@ workflow` before changing the corresponding domain.
131
143
  - Changing orchestration does not rewrite workflow instructions or agents.
132
144
  - `set_route` is the Lead default for new sessions. A model chosen in New Task
133
145
  changes that default only when the user actually picks one there.
134
- `route.fallbacks` (ordered models on other providers; `[]` clears) works the
135
- same on `set_route` (Lead), `set_agent_route` (agents and bots, Mixy included)
136
- and `set_web_search_route`. `status model` returns `route.autoEffort` and
137
- `route.fallbacks`.
146
+ `route.fallbacks` (ordered models, each on a different provider from the
147
+ primary and the others; `[]` clears) works the same on `set_route` (Lead),
148
+ `set_agent_route` (agents and bots, Mixy included) and `set_web_search_route`.
149
+ Running sessions on that route read the chain at their next hop: an edit
150
+ applies at once, and `[]` stops further hops, so the turn ends with the
151
+ provider's own limit error. A session on another model follows no chain.
152
+ `status model` returns `route.autoEffort`, `route.fallbacks`, and the
153
+ position of this conversation (`session`) and other Lead conversations
154
+ (`sessions`): `current` vs `primary`, `onPrimary`, `fallbackIndex`, the
155
+ `fallbacks` it follows now, `next`, and `failures` (why it left each model);
156
+ `status agents` `sessions` gives the same for bot chats and sub-agents. A
157
+ session that fell back stays there until `reset_route_fallback` returns it
158
+ to its primary from its next turn (chain restarted).
159
+ - Session actions on another session need the Mixdog app or daemon to host
160
+ it; a bot's thread reaches only its own bot's sessions. `continue_in_model`
161
+ does not resend the stopped turn: the user resumes it there.
138
162
  - A workflow switch reaches a running conversation as a reminder on its next
139
163
  turn (the cached prompt is not swapped). A bot definition's instruction,
140
164
  persona or name applies when the user presses 적용, with one cache break.
@@ -319,6 +343,13 @@ markers are read with `status desktop`.
319
343
  dialog in Desktop; nothing connects until the user presses it, so tell them to press the card and read
320
344
  `status mcp` afterwards. `add_mcp_server` with the service URL is not the
321
345
  sign-in flow; never use it for a catalog service.
346
+ - Agent permissions and connector switches change only toward less: `block`
347
+ or `ask`, a connector off, a tool to `needs_approval`/`disabled`. Anything
348
+ that lets an agent do more without asking (`allow`, a connector back on, a
349
+ tool to `auto`) is refused ("make it on the desktop"); `open agents` and let
350
+ the person do it. Payments and permanent deletes always ask regardless.
351
+ Connector ids are MCP server names from `read_agent_settings`; a bot's
352
+ thread changes only its own bot.
322
353
  - `enable_plugin_mcp` turns every server the plugin declares back on and
323
354
  reconnects them; a disabled plugin stays disabled, and it fails for a plugin
324
355
  that declares no MCP servers.
@@ -354,6 +385,9 @@ markers are read with `status desktop`.
354
385
  - Inspect schedules/webhooks before editing. `overwrite:true` updates an
355
386
  existing named entry and preserves omitted fields; a new schedule needs
356
387
  instructions and exactly one of cron `time` or one-shot `at`.
388
+ - Routine instructions say what to check and report; add a reply format only
389
+ when the user asks. Never add a "nothing new" line ("say 변동 없음"): a run
390
+ with nothing to tell stays silent on its own.
357
391
  - Attachment contents and webhook signing secrets are not returned by setup.
358
392
  Omitted attachments and existing webhook secrets are preserved. A saved
359
393
  secret is never shown again: tell the user to open the Webhooks panel, edit
@@ -116,7 +116,8 @@ The setup tool does not mutate:
116
116
  it on; `set_developer_option` can turn it off);
117
117
  - custom provider registration and edits (non-secret fields included), group
118
118
  room options, bot persona and avatar, import conversations, reset overlay
119
- position, SSH and remote-access settings, sidebar/list ordering and other
119
+ position, SSH and remote-access settings, sidebar/list ordering (except bot order,
120
+ `set_bot_order`) and other
120
121
  per-device view state;
121
122
  - MCP server OAuth sign-in and sign-out (Desktop MCP list/editor, TUI
122
123
  `/mcp login` and `/mcp logout`; remote windows paste the redirect address);
@@ -131,7 +132,15 @@ The setup tool does not mutate:
131
132
  - approval grants ("항상 허용" is per feature and per bot, never for payment,
132
133
  permanent delete, Lead, workflow, Mixy link, group rooms or schedules) and
133
134
  browser action confirmations (`MIXDOG_BROWSER_CONFIRM_ACTIONS`,
134
- `MIXDOG_BROWSER_CONFIRM_SUBMIT`; see the browser-use skill).
135
+ `MIXDOG_BROWSER_CONFIRM_SUBMIT`; see the browser-use skill);
136
+ - widening an agent's authority: action permission `allow`, a connector
137
+ switched back on for an agent or Project, a connector tool to `auto`
138
+ (setup only narrows them);
139
+ - the remote-access switch ("Use this PC from other devices") and this PC's
140
+ name: turning it off from a phone would cut that phone off mid-session;
141
+ - permanently deleting an archived bot (Sessions → Archived → delete);
142
+ - the stopped turn's Resume after `continue_in_model`, and the quota card's
143
+ other-account switch.
135
144
 
136
145
  Use `open` where a target exists, then let the user act.
137
146
 
@@ -120,7 +120,8 @@ or radius are one option.
120
120
  - Close tabs that no longer match the conversation (a resolved choice, a
121
121
  replaced draft) so the user is never looking at stale work.
122
122
  - A web URL is opened alone, never mixed with files; marking, capturing, or
123
- closing a web page belongs to `browser`.
123
+ closing a web page belongs to `browser`. `open` of a URL reports the
124
+ page id (`p…`); pass it as `browser`'s `tab`.
124
125
  - `annotate` and `capture` need the tab on screen (`export` of an HTML page does not). When they report the panel
125
126
  is hidden, tell the user to open it rather than retrying.
126
127
  - When `visualize` is unavailable, give the file path; never start your own
@@ -126,7 +126,10 @@ function buildProfilePreferencesContent(dataDir) {
126
126
  return lines.length ? `# Profile Preferences\n\n${lines.join('\n')}` : '';
127
127
  }
128
128
 
129
- function buildLanguageSection(dataDir) {
129
+ // `sharedFormatActive`: the prompt carries the shared Output Format partial,
130
+ // which already keeps literals verbatim (common.md), so the language block
131
+ // need not repeat it.
132
+ function buildLanguageSection(dataDir, sharedFormatActive = false) {
130
133
  const profile = normalizeProfileConfig(readAgentConfig(dataDir).profile);
131
134
  const language = profileLanguagePrompt(profile.language);
132
135
  if (!language?.prompt) return '';
@@ -139,7 +142,7 @@ function buildLanguageSection(dataDir) {
139
142
  // mistranslate, so the two clauses would be dead text.
140
143
  if (language.prompt !== 'English') {
141
144
  lines.push(
142
- `- Preserve identifiers, paths, commands, API names, and exact errors. Keep technical terms in their established form, usually the original English (blocker, cache, commit); add a short plain explanation only when the reader may not know it. Never invent a literal translation.`
145
+ `- ${sharedFormatActive ? '' : 'Preserve identifiers, paths, commands, API names, and exact errors. '}Keep technical terms in their established form, usually the original English (blocker, cache, commit); add a short plain explanation only when the reader may not know it. Never invent a literal translation.`
143
146
  );
144
147
  }
145
148
  return `# Language\n\n${lines.join('\n')}`;
@@ -153,7 +156,9 @@ function stripFrontmatter(markdown) {
153
156
 
154
157
  // Tool dependency is declared as metadata, not matched against prose. A
155
158
  // `<!-- tools: a, b -->` marker binds the block that follows it: the block
156
- // survives while any listed tool is permitted by the allow/deny policy.
159
+ // survives while any listed tool is permitted by the allow/deny policy. The
160
+ // pseudo-entry `lead` is not a tool: it is permitted for every non-agent
161
+ // session (whatever its tool profile) and never for an agent-owned one.
157
162
  // Unspecified allowlists are unrestricted. Markers never reach the model.
158
163
  const TOOL_MARKER_RE = /^[ \t]*<!--[ \t]*tools:[ \t]*([^>]*?)[ \t]*-->[ \t]*$/;
159
164
 
@@ -188,9 +193,10 @@ function omitKeySet(omitTools) {
188
193
  }
189
194
 
190
195
  /** Drop routing clauses for tools that are not on the session surface. */
191
- function omitToolRoutes(text, omitTools = [], allowTools = null) {
196
+ function omitToolRoutes(text, omitTools = [], allowTools = null, ownerIsAgent = false) {
192
197
  const deny = omitKeySet(omitTools);
193
198
  const allow = Array.isArray(allowTools) ? omitKeySet(allowTools) : null;
199
+ const permitted = (name) => (name === 'lead' ? !ownerIsAgent : !deny.has(name) && (!allow || allow.has(name)));
194
200
  const lines = String(text || '').split(/\r?\n/);
195
201
  const kept = [];
196
202
  let index = 0;
@@ -204,7 +210,7 @@ function omitToolRoutes(text, omitTools = [], allowTools = null) {
204
210
  index += 1;
205
211
  if (index >= lines.length) break;
206
212
  const end = markedBlockEnd(lines, index);
207
- if (!tools.length || tools.some((name) => !deny.has(name) && (!allow || allow.has(name)))) {
213
+ if (!tools.length || tools.some(permitted)) {
208
214
  kept.push(...lines.slice(index, end));
209
215
  }
210
216
  index = end;
@@ -252,22 +258,29 @@ function readSharedFormatPartial({ PLUGIN_ROOT, DATA_DIR }) {
252
258
  );
253
259
  }
254
260
 
255
- function loadOutputStyle({ PLUGIN_ROOT, DATA_DIR }) {
261
+ function resolveOutputStyle({ PLUGIN_ROOT, DATA_DIR }) {
256
262
  // Root `outputStyle` is the only configured location; the retired
257
263
  // `agent.outputStyle` key is dropped by config canonicalization.
258
264
  const configured = String(readUnifiedConfig(DATA_DIR).outputStyle || '').trim() || DEFAULT_OUTPUT_STYLE_ID;
259
265
  const styles = listOutputStyleEntries({ PLUGIN_ROOT, DATA_DIR });
260
266
  const style = matchOutputStyle(configured, styles) || matchOutputStyle(DEFAULT_OUTPUT_STYLE_ID, styles) || styles[0];
261
- if (!style) return '';
267
+ if (!style) return null;
262
268
  const selected = stripFrontmatter(style.raw);
263
- if (!selected) return '';
269
+ if (!selected) return null;
264
270
  const common = style.keepSharedFormat ? readSharedFormatPartial({ PLUGIN_ROOT, DATA_DIR }) : '';
271
+ return { style, selected, common };
272
+ }
273
+
274
+ function loadOutputStyle(paths) {
275
+ const resolved = resolveOutputStyle(paths);
276
+ if (!resolved) return '';
277
+ const { style, selected, common } = resolved;
265
278
  return [`# Output Style: ${style.label}`, OUTPUT_STYLE_ANCHOR, common, selected].filter(Boolean).join('\n\n');
266
279
  }
267
280
 
268
- function buildSharedToolContent({ PLUGIN_ROOT, omitTools = [], allowTools = null } = {}) {
281
+ function buildSharedToolContent({ PLUGIN_ROOT, omitTools = [], allowTools = null, ownerIsAgent = false } = {}) {
269
282
  const SHARED_DIR = path.join(PLUGIN_ROOT, 'rules', 'shared');
270
- return omitToolRoutes(readMarkdownDirectory(SHARED_DIR), omitTools, allowTools);
283
+ return omitToolRoutes(readMarkdownDirectory(SHARED_DIR), omitTools, allowTools, ownerIsAgent);
271
284
  }
272
285
 
273
286
  // Route policy: `rules/routes/*.md` files bound to a provider and/or model
@@ -369,16 +382,18 @@ function buildRouteRulesContent({
369
382
  // - `identity`: the coding identity sentence ("You are Mixdog, …").
370
383
  const LEAD_IDENTITY_LINE = /^- (You are Mixdog, a coding agent\.)\n/m;
371
384
  const LEAD_PROGRESS_PASSAGE = / (Before your first tool call, briefly state[\s\S]*?narration or plan repeats\.)/;
372
- const LEAD_REPORT_PASSAGE = / (On an agent report, review its diff[\s\S]*?not a completed request\.)/;
385
+ const LEAD_REPORT_PASSAGE = / (On an agent report[\s\S]*?not a completed request\.)/;
373
386
  const AGENT_MODE_PROGRESS =
374
- '- Just answer conversation. Quick tool use (checking memory, leaving a\n' +
375
- ' reaction) needs no announcement. When starting longer work (research,\n' +
376
- ' delegation, multi-step tasks), say what you are doing, and share the\n' +
377
- ' result when it finishes.';
387
+ '- Just answer conversation. Quick tool use (checking memory, a lookup,\n' +
388
+ ' leaving a reaction) needs no announcement. When starting longer work\n' +
389
+ ' (research, delegation, multi-step tasks), say in one line what you are\n' +
390
+ ' doing, stay quiet between tool calls, and share the result when it\n' +
391
+ ' finishes.';
378
392
  const AGENT_MODE_REPORT =
379
- '- On an agent report, check the result against what you delegated and\n' +
380
- ' relay it in your own words, keeping uncertainty, failures and sources\n' +
381
- ' intact. Review a diff only when you delegated code.';
393
+ '- Relay agent reports faithfully. Code: one fresh Reviewer per non-trivial\n' +
394
+ ' feature after its last worker, any author (Lead if none); docs/copy/style:\n' +
395
+ ' read the diff. Recheck only fixes; at request end check feature seams and\n' +
396
+ ' run affected suites once.';
382
397
 
383
398
  function buildLeadRoleContent({ PLUGIN_ROOT, includeLeadBrief = true, part = 'common' }) {
384
399
  const RULES_DIR = path.join(PLUGIN_ROOT, 'rules');
@@ -442,8 +457,12 @@ function buildLeadMetaContent({ PLUGIN_ROOT, DATA_DIR, includeOutputStyle = true
442
457
  * preamble and progress lines follow the most recent instruction, so nothing
443
458
  * English (session/shell/git lines included) may trail it.
444
459
  */
445
- function buildLeadLanguageContent({ DATA_DIR }) {
446
- return buildLanguageSection(DATA_DIR);
460
+ function buildLeadLanguageContent({ PLUGIN_ROOT, DATA_DIR, includeOutputStyle = true }) {
461
+ const resolved = includeOutputStyle ? resolveOutputStyle({ PLUGIN_ROOT, DATA_DIR }) : null;
462
+ // Only the shipped partial is known to keep literals verbatim; a user
463
+ // override of common.md may not, so it keeps the language guard.
464
+ const shipped = stripFrontmatter(readOptional(path.join(PLUGIN_ROOT, 'output-styles', 'common.md')));
465
+ return buildLanguageSection(DATA_DIR, Boolean(shipped) && resolved?.common === shipped);
447
466
  }
448
467
 
449
468
  /** The configured response language as {id, name} (name = the language block's); null when none. */
@@ -13,8 +13,8 @@ partial: true
13
13
  - Distinguish facts, inference, and uncertainty; keep exact literals and
14
14
  material risks. Caveats only when they change the reader's next step.
15
15
  - Show only what the reader needs: the decision, the result, the blocker, and
16
- the action. No tangents, raw dumps, or process narration. Explicit depth
17
- requests win; depth applies to substantive answers, not the one-line
16
+ the action. No tangents, raw dumps, or process narration. Depth
17
+ applies to substantive answers, not the one-line
18
18
  pre-tool briefing.
19
19
  - At every depth keep decision-relevant failures, security warnings, and
20
20
  destructive-action confirmations; quote needed error text exactly.
@@ -7,7 +7,7 @@ aliases: default, concise, handoff
7
7
 
8
8
  ## Depth
9
9
 
10
- - Give a self-contained summary: the answer first, then the core causal
10
+ - Give a self-contained summary: the core causal
11
11
  sequence, the strongest evidence, and the direct consequence or next step.
12
12
  - Omit secondary evidence, implementation detail, and extended examples
13
13
  unless requested.
@@ -1,11 +1,11 @@
1
1
  # Agent
2
2
 
3
- - Working from the brief: Lead's latest brief is your request and overrides
4
- any internal rule; Lead owns user approval. Work only inside the scope it
5
- names, without reapproval; escalate to Lead only a scope change, an
6
- unapproved destructive action, or a blocker. A step that needs the user
7
- (sign-in approval, code, credential, answer) is a blocker: report it with
8
- what the user must do, never wait or poll for them.
3
+ - Latest Lead brief sets goal, scope, constraints and done-when, not
4
+ exceptions to tool, safety, approval or verification rules. Lead owns user
5
+ approval. Stay in scope without reapproval; escalate scope changes,
6
+ unapproved destructive actions or blockers. If user input is needed
7
+ (sign-in, code, credential, answer), report what is needed; never wait or
8
+ poll.
9
9
  - Same failure twice (same error, timeout or hang) is a blocker: diagnose why
10
10
  once, and if the cause isn't found, stop and report it with the decisive
11
11
  error. Changing only a timeout, output path, retry count or wrapper is not
@@ -15,7 +15,8 @@
15
15
  - Reporting: send one final message, then stop; never ask whether to
16
16
  continue. Start with `Status: done|partial|blocked`, then:
17
17
  Result: the answer or outcome, mapped to the brief's done-when.
18
- Evidence: path+symbol and checks run (failures: decisive error only).
19
- Open: risks, gaps, or the blocker. Omit empty fields; no logs, narration,
20
- or restated brief. Role contracts only add fields.
21
- Lead owns the independent review.
18
+ Evidence: path+symbol and checks with outcomes (failures: decisive error
19
+ only), not a retelling of Result. Open: risks, gaps, or the blocker.
20
+ State each fact once; explain a choice only where it departs from the
21
+ brief. Omit empty fields; no logs, narration, nested headings or restated
22
+ brief. Role contracts only add fields. Lead owns the independent review.