mixdog 1.3.5 → 1.4.0

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 (341) hide show
  1. package/NOTICE.md +2 -2
  2. package/README.md +2 -2
  3. package/package.json +2 -11
  4. package/scripts/daemon-stub.mjs +1 -1
  5. package/scripts/gate-local.mjs +4 -2
  6. package/scripts/native-release-status.mjs +2 -2
  7. package/scripts/recall-history-cases.json +1 -1
  8. package/scripts/suite-health.mjs +10 -1
  9. package/scripts/test.mjs +7 -11
  10. package/src/agents/reviewer/AGENT.md +7 -11
  11. package/src/agents/reviewer/agent.json +1 -1
  12. package/src/defaults/shipped-history.json +17 -1
  13. package/src/defaults/skills/browser-use/SKILL.md +59 -11
  14. package/src/defaults/skills/code-tidy/SKILL.md +142 -270
  15. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +4 -4
  16. package/src/defaults/skills/code-tidy/references/cleanup-report.md +31 -76
  17. package/src/defaults/skills/code-tidy/references/dead-code.md +6 -12
  18. package/src/defaults/skills/computer-use/SKILL.md +33 -9
  19. package/src/defaults/skills/setup/SKILL.md +22 -0
  20. package/src/defaults/skills/setup/references/actions.md +39 -5
  21. package/src/defaults/skills/setup/references/surfaces.md +11 -2
  22. package/src/defaults/skills/visualize/SKILL.md +2 -1
  23. package/src/lib/rules-builder.cjs +10 -8
  24. package/src/rules/agent/AGENT.md +6 -6
  25. package/src/rules/lead/LEAD.md +18 -20
  26. package/src/rules/shared/05-tool-calls.md +5 -6
  27. package/src/rules/shared/10-tool-workflow.md +2 -0
  28. package/src/rules/shared/60-verification.md +7 -5
  29. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -3
  30. package/src/runtime/agent/orchestrator/agent-runtime/title-completion.mjs +3 -1
  31. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +3 -1
  32. package/src/runtime/agent/orchestrator/config.mjs +17 -1
  33. package/src/runtime/agent/orchestrator/context/collect.mjs +3 -0
  34. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +72 -67
  35. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +54 -1
  36. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -3
  37. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +176 -72
  38. package/src/runtime/agent/orchestrator/mcp/client.mjs +19 -0
  39. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +181 -133
  40. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +42 -6
  41. package/src/runtime/agent/orchestrator/providers/anthropic-cache-warm.mjs +165 -0
  42. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  43. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -1
  44. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +14 -14
  45. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +145 -66
  46. package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +25 -3
  47. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +64 -33
  48. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +135 -87
  49. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +123 -102
  50. package/src/runtime/agent/orchestrator/providers/cache-warm-admission.mjs +90 -0
  51. package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +25 -9
  52. package/src/runtime/agent/orchestrator/providers/cursor.mjs +22 -13
  53. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +17 -3
  54. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +52 -10
  55. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +8 -1
  56. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
  57. package/src/runtime/agent/orchestrator/providers/npm-cli-version.mjs +11 -3
  58. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -1
  59. package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +10 -9
  60. package/src/runtime/agent/orchestrator/providers/openai-ws-send/send-context.mjs +22 -3
  61. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +43 -5
  62. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/handshake-failure.mjs +3 -1
  63. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/stream-failure.mjs +6 -3
  64. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +65 -1
  65. package/src/runtime/agent/orchestrator/providers/quota-reading.mjs +38 -12
  66. package/src/runtime/agent/orchestrator/providers/registry.mjs +26 -0
  67. package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +39 -7
  68. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +6 -0
  69. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +12 -7
  70. package/src/runtime/agent/orchestrator/runtime-core/compaction-config-keys.mjs +62 -0
  71. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +37 -16
  72. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +100 -23
  73. package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +2 -0
  74. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +19 -4
  75. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +125 -30
  76. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +792 -0
  77. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +133 -22
  78. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +475 -58
  79. package/src/runtime/agent/orchestrator/session/compaction-archive.mjs +42 -17
  80. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -1
  81. package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +11 -5
  82. package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +0 -2
  83. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -4
  84. package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +1 -1
  85. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +18 -22
  86. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +32 -3
  87. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +3 -1
  88. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +1 -1
  89. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +17 -3
  90. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +7 -2
  91. package/src/runtime/agent/orchestrator/session/loop/tool-exec/after-hook.mjs +2 -1
  92. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +3 -2
  93. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +16 -2
  94. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +16 -1
  95. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +10 -0
  96. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -10
  97. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +12 -3
  98. package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +12 -2
  99. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +19 -1
  100. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +133 -90
  101. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +31 -4
  102. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +30 -18
  103. package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +23 -13
  104. package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +11 -2
  105. package/src/runtime/agent/orchestrator/session/manager/provider-replay.mjs +13 -0
  106. package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +129 -0
  107. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +20 -2
  108. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +2 -0
  109. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +8 -0
  110. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +1 -1
  111. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +7 -2
  112. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +102 -15
  113. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +18 -5
  114. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +19 -8
  115. package/src/runtime/agent/orchestrator/session/prompt-cache-idle-gaps.mjs +113 -0
  116. package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +127 -0
  117. package/src/runtime/agent/orchestrator/session/routine-result.mjs +36 -9
  118. package/src/runtime/agent/orchestrator/session/sensitive-projection.mjs +100 -0
  119. package/src/runtime/agent/orchestrator/session/sensitive-values.mjs +257 -0
  120. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +20 -7
  121. package/src/runtime/agent/orchestrator/session/side-question.mjs +18 -0
  122. package/src/runtime/agent/orchestrator/session/skill-update-notice.mjs +60 -0
  123. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +6 -3
  124. package/src/runtime/agent/orchestrator/session/store/save-delta.mjs +9 -5
  125. package/src/runtime/agent/orchestrator/session/store/serialize.mjs +9 -8
  126. package/src/runtime/agent/orchestrator/session/store/session-persistence-events.mjs +29 -0
  127. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +8 -6
  128. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +12 -2
  129. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +44 -14
  130. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +84 -3
  131. package/src/runtime/agent/orchestrator/session/stored-attachment-history.mjs +32 -0
  132. package/src/runtime/agent/orchestrator/session/thinking-binding.mjs +108 -0
  133. package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +2 -2
  134. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +2 -1
  135. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +18 -1
  136. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-status.mjs +9 -7
  137. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-text.mjs +2 -2
  138. package/src/runtime/agent/orchestrator/session/turn-failure.mjs +5 -1
  139. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +5 -2
  140. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +12 -1
  141. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +240 -0
  142. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
  143. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/shell-cwd.mjs +38 -0
  144. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +25 -5
  145. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +65 -7
  146. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +7 -1
  147. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +36 -13
  148. package/src/runtime/browser-bridge/action-schema.mjs +13 -2
  149. package/src/runtime/browser-bridge/client.mjs +73 -8
  150. package/src/runtime/browser-bridge/input-fields.mjs +8 -9
  151. package/src/runtime/browser-bridge/mail-links.mjs +107 -0
  152. package/src/runtime/browser-bridge/tool-defs.mjs +1 -1
  153. package/src/runtime/channels/lib/config.mjs +6 -61
  154. package/src/runtime/channels/lib/crash-log.mjs +1 -1
  155. package/src/runtime/channels/lib/event-pipeline.mjs +4 -19
  156. package/src/runtime/channels/lib/event-queue.mjs +3 -18
  157. package/src/runtime/channels/lib/owned-runtime/automation-services.mjs +2 -2
  158. package/src/runtime/channels/lib/owned-runtime/automation-start.mjs +3 -4
  159. package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +4 -59
  160. package/src/runtime/channels/lib/owned-runtime/owned-start.mjs +33 -115
  161. package/src/runtime/channels/lib/owned-runtime/owned-stop.mjs +5 -22
  162. package/src/runtime/channels/lib/owned-runtime/state.mjs +2 -8
  163. package/src/runtime/channels/lib/owned-runtime.mjs +6 -23
  164. package/src/runtime/channels/lib/parent-bridge.mjs +2 -2
  165. package/src/runtime/channels/lib/runtime-paths.mjs +4 -43
  166. package/src/runtime/channels/lib/scheduler.mjs +33 -147
  167. package/src/runtime/channels/lib/schedules-db.mjs +34 -11
  168. package/src/runtime/channels/lib/status-snapshot.mjs +1 -1
  169. package/src/runtime/channels/lib/tool-dispatch.mjs +1 -2
  170. package/src/runtime/channels/lib/webhooks-db.mjs +5 -9
  171. package/src/runtime/channels/lib/worker-bootstrap.mjs +0 -1
  172. package/src/runtime/channels/lib/worker-ipc.mjs +0 -1
  173. package/src/runtime/channels/lib/worker-main.mjs +10 -34
  174. package/src/runtime/computer-bridge/action-schema.mjs +42 -1
  175. package/src/runtime/computer-bridge/actions.mjs +9 -1
  176. package/src/runtime/computer-bridge/client.mjs +180 -8
  177. package/src/runtime/computer-bridge/core-actions.mjs +2 -2
  178. package/src/runtime/computer-bridge/error-recovery.mjs +27 -2
  179. package/src/runtime/computer-bridge/linux-readiness.mjs +65 -23
  180. package/src/runtime/computer-bridge/pending-continuation.mjs +1 -1
  181. package/src/runtime/connectors/connector-accounts-mcp.mjs +230 -0
  182. package/src/runtime/connectors/gmail-app-password.mjs +172 -39
  183. package/src/runtime/connectors/google-mcp.mjs +10 -12
  184. package/src/runtime/memory/lib/pg/adapter.mjs +77 -70
  185. package/src/runtime/memory/lib/pg/supervisor.mjs +24 -12
  186. package/src/runtime/memory/lib/runtime-fetcher.mjs +23 -5
  187. package/src/runtime/session-search/session-search-db.mjs +73 -9
  188. package/src/runtime/session-search/session-search-ingest.mjs +110 -20
  189. package/src/runtime/shared/abort-race.mjs +89 -0
  190. package/src/runtime/shared/agent-avatar.d.mts +0 -1
  191. package/src/runtime/shared/agent-kind.mjs +4 -3
  192. package/src/runtime/shared/bounded-download.mjs +8 -3
  193. package/src/runtime/shared/config.mjs +2 -13
  194. package/src/runtime/shared/connector-accounts.mjs +20 -10
  195. package/src/runtime/shared/connector-catalog.d.mts +29 -0
  196. package/src/runtime/shared/connector-catalog.mjs +150 -0
  197. package/src/runtime/shared/connector-triggers.mjs +22 -19
  198. package/src/runtime/shared/defaults-separation.mjs +2 -14
  199. package/src/runtime/shared/delegated-approval-host.mjs +103 -11
  200. package/src/runtime/shared/err-text.mjs +24 -15
  201. package/src/runtime/shared/file-permissions.d.mts +0 -8
  202. package/src/runtime/shared/file-permissions.mjs +0 -11
  203. package/src/runtime/shared/git-direct.test-support.mjs +19 -0
  204. package/src/runtime/shared/heartbeat-interval.d.mts +4 -0
  205. package/src/runtime/shared/heartbeat-interval.mjs +19 -0
  206. package/src/runtime/shared/idle-auto-clear-gate.mjs +104 -0
  207. package/src/runtime/shared/llm/usage-rollup.mjs +1 -1
  208. package/src/runtime/shared/mixy-presence.mjs +22 -0
  209. package/src/runtime/shared/orchestration.d.mts +2 -0
  210. package/src/runtime/shared/pg-schema-db.mjs +27 -16
  211. package/src/runtime/shared/profile-config.cjs +1 -1
  212. package/src/runtime/shared/prompt-origin.d.mts +4 -0
  213. package/src/runtime/shared/prompt-origin.mjs +21 -0
  214. package/src/runtime/shared/provider-accounts.mjs +7 -1
  215. package/src/runtime/shared/provider-display-name.mjs +29 -0
  216. package/src/runtime/shared/provider-timeout-phase.mjs +2 -0
  217. package/src/runtime/shared/routine-trigger.d.mts +2 -0
  218. package/src/runtime/shared/routine-trigger.mjs +10 -0
  219. package/src/runtime/shared/sensitive-path-rules.d.mts +2 -10
  220. package/src/runtime/shared/sensitive-path-rules.mjs +19 -41
  221. package/src/runtime/shared/session-activity-signal.mjs +34 -1
  222. package/src/runtime/shared/session-sidebar-host.d.mts +1 -1
  223. package/src/runtime/shared/session-sidebar-host.mjs +7 -3
  224. package/src/runtime/shared/session-turn-prelude.mjs +18 -0
  225. package/src/runtime/shared/tool-result-summary.mjs +1 -14
  226. package/src/runtime/shared/worktrees/test-support.mjs +9 -4
  227. package/src/runtime/terminal-bridge/client.mjs +10 -1
  228. package/src/runtime/visualize-bridge/client.mjs +27 -8
  229. package/src/runtime/visualize-bridge/tool-defs.mjs +22 -8
  230. package/src/runtime/visualize-bridge/tool-meta.d.mts +5 -0
  231. package/src/runtime/visualize-bridge/tool-meta.mjs +22 -0
  232. package/src/runtime/web-search/lib/fetch-pipeline.mjs +2 -2
  233. package/src/session-runtime/agent-home-delivery.mjs +448 -185
  234. package/src/session-runtime/agent-task-sessions.mjs +329 -180
  235. package/src/session-runtime/boot/apis.mjs +9 -0
  236. package/src/session-runtime/boot/infrastructure.mjs +4 -0
  237. package/src/session-runtime/boot/providers.mjs +3 -0
  238. package/src/session-runtime/boot/tools.mjs +6 -1
  239. package/src/session-runtime/config-lifecycle.mjs +6 -0
  240. package/src/session-runtime/connector-merge-migration.mjs +305 -0
  241. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +132 -28
  242. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +2 -0
  243. package/src/session-runtime/lifecycle/inheritance.mjs +16 -3
  244. package/src/session-runtime/lifecycle/session-catalog.mjs +3 -1
  245. package/src/session-runtime/lifecycle/teardown/runtime-stops.mjs +50 -4
  246. package/src/session-runtime/lifecycle/teardown.mjs +23 -5
  247. package/src/session-runtime/mcp-glue/server-catalog.mjs +55 -3
  248. package/src/session-runtime/mcp-oauth-login.mjs +5 -3
  249. package/src/session-runtime/mixy-heartbeat.mjs +153 -33
  250. package/src/session-runtime/notification-bus.mjs +31 -117
  251. package/src/session-runtime/notification-completion-queue.mjs +54 -0
  252. package/src/session-runtime/notification-listeners.mjs +76 -0
  253. package/src/session-runtime/owned-automation-run.mjs +2 -1
  254. package/src/session-runtime/prewarm/channel-start.mjs +3 -7
  255. package/src/session-runtime/resource-mcp-api.mjs +143 -224
  256. package/src/session-runtime/resource-mcp-connector-accounts.mjs +163 -0
  257. package/src/session-runtime/resource-mcp-oauth-api.mjs +217 -0
  258. package/src/session-runtime/resource-mcp-secrets.mjs +82 -0
  259. package/src/session-runtime/resource-mcp-servers.mjs +78 -0
  260. package/src/session-runtime/resource-mcp-store.mjs +49 -0
  261. package/src/session-runtime/routine-owner.mjs +40 -9
  262. package/src/session-runtime/services/agent-tool/close-flow.mjs +3 -0
  263. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +7 -2
  264. package/src/session-runtime/services/agent-tool/tag-registry.mjs +1 -0
  265. package/src/session-runtime/services/agent-tool/worker-index/awaiting-user-sync.mjs +51 -0
  266. package/src/session-runtime/services/agent-tool/worker-index/disposal.mjs +55 -0
  267. package/src/session-runtime/services/agent-tool/worker-index/released-store.mjs +123 -0
  268. package/src/session-runtime/services/agent-tool/worker-index/restart-settlement.mjs +112 -0
  269. package/src/session-runtime/services/agent-tool/worker-index/row-reads.mjs +36 -0
  270. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -0
  271. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +17 -4
  272. package/src/session-runtime/services/agent-tool/worker-index/row-writes.mjs +58 -0
  273. package/src/session-runtime/services/agent-tool/worker-index.mjs +41 -241
  274. package/src/session-runtime/services/agent-tool/worker-rows.mjs +3 -0
  275. package/src/session-runtime/services/channel-admin.mjs +7 -13
  276. package/src/session-runtime/services/channel-session-router.mjs +4 -2
  277. package/src/session-runtime/services/seeds.mjs +0 -28
  278. package/src/session-runtime/session-compaction-sync.mjs +27 -0
  279. package/src/session-runtime/session-create/session-options.mjs +1 -0
  280. package/src/session-runtime/settings-builtin-tools-api.mjs +11 -0
  281. package/src/session-runtime/settings-compaction-api.mjs +2 -40
  282. package/src/session-runtime/settings-system-api.mjs +13 -1
  283. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +65 -0
  284. package/src/session-runtime/setup-tool/executor.mjs +145 -22
  285. package/src/session-runtime/setup-tool/extended-actions.mjs +8 -3
  286. package/src/session-runtime/setup-tool/session-route-actions.mjs +152 -0
  287. package/src/session-runtime/setup-tool/settings-contract.mjs +4 -3
  288. package/src/session-runtime/setup-tool/tool-defs.mjs +64 -5
  289. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +17 -13
  290. package/src/session-runtime/tool-policy/policy-stage.mjs +16 -2
  291. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
  292. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +4 -0
  293. package/src/standalone/channel-transport/client-registry/client-records.mjs +65 -0
  294. package/src/standalone/channel-transport/client-registry/client-registration.mjs +118 -0
  295. package/src/standalone/channel-transport/client-registry.mjs +24 -163
  296. package/src/standalone/channel-transport.mjs +1 -1
  297. package/src/standalone/daemon-channels-loader.mjs +10 -8
  298. package/src/standalone/daemon-session-control/list-page.mjs +72 -0
  299. package/src/standalone/daemon-session-control/request.mjs +51 -0
  300. package/src/standalone/daemon-session-control/room-host.mjs +57 -0
  301. package/src/standalone/daemon-session-control/route-control.mjs +48 -0
  302. package/src/standalone/daemon-session-control/send-turn.mjs +60 -0
  303. package/src/standalone/daemon-session-control/worktree-control.mjs +40 -0
  304. package/src/standalone/daemon-session-control.mjs +124 -188
  305. package/src/standalone/daemon.mjs +26 -3
  306. package/src/standalone/session-client.mjs +7 -3
  307. package/src/standalone/session-protocol.mjs +5 -0
  308. package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -0
  309. package/src/standalone/session-service/quota-resume.mjs +3 -0
  310. package/src/standalone/session-service/retention/busy.mjs +65 -1
  311. package/src/standalone/session-service/session-calls/session-action.mjs +23 -2
  312. package/src/standalone/session-service/session-calls/session-views.mjs +8 -0
  313. package/src/standalone/session-tool-output.mjs +15 -7
  314. package/src/tui/app/model-options.mjs +3 -28
  315. package/src/tui/dist/index.mjs +58 -64
  316. package/src/tui/session/agent-job-feed/model-notification.mjs +3 -0
  317. package/src/tui/session/initial-state.mjs +3 -0
  318. package/src/tui/session/notice-surface.mjs +7 -1
  319. package/src/tui/session/queue-helpers.mjs +3 -42
  320. package/src/tui/session/session-api/routes-agent-definitions.mjs +14 -2
  321. package/src/tui/session/session-api/routes-write.mjs +5 -1
  322. package/src/tui/session/session-api/routes.mjs +1 -0
  323. package/src/tui/session/session-api/settings.mjs +17 -1
  324. package/src/tui/session/session-flow/auto-clear.mjs +4 -33
  325. package/src/tui/session/session-flow/drain-closed-queue.mjs +38 -0
  326. package/src/tui/session/session-flow/drain-enqueue.mjs +86 -0
  327. package/src/tui/session/session-flow/drain-retry.mjs +35 -0
  328. package/src/tui/session/session-flow/drain.mjs +118 -149
  329. package/src/tui/session/session-flow/queue/entry-shape.mjs +5 -0
  330. package/src/tui/session/session-flow/queue/take-entries.mjs +5 -2
  331. package/src/tui/session/tool-approval-delegation.mjs +64 -0
  332. package/src/tui/session/tool-approval-request.mjs +39 -0
  333. package/src/tui/session/tool-approval-settle.mjs +62 -0
  334. package/src/tui/session/tool-approval.mjs +69 -115
  335. package/src/tui/session/tui-steering-persist.mjs +8 -1
  336. package/src/tui/session/turn-stream.mjs +19 -2
  337. package/src/tui/session/turn.mjs +1 -0
  338. package/src/vendor/statusline/bin/statusline-route.mjs +1 -219
  339. package/src/vendor/statusline/src/gateway/route-meta.mjs +35 -13
  340. package/scripts/code-graph-description-contract.mjs +0 -188
  341. 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.
@@ -41,8 +41,11 @@ GNOME with Mixdog's own shell extension, which the app sets up); prefer accessib
41
41
  - Mixdog browser pages → Browser Use (`browser`). A refused or unfinished
42
42
  page action stays on that route for recovery or user handoff; never retry
43
43
  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.
44
+ - On either route, permission denials, CAPTCHA/2FA (authenticator, SMS,
45
+ passkey), identity checks, and user stops are not fallback signals: report
46
+ or hand off, never bypass them. A "check your e-mail" step of a sign-up or
47
+ sign-in Mixdog started is not one: finish it from a connected mailbox
48
+ (browser-use skill, E-mail verification).
46
49
  - Use the screen when a UI itself is the subject: checking a desktop app's GUI
47
50
  after a change, a GUI-only bug, UI-only settings, a cross-app flow.
48
51
  - Service CLIs and deterministic file, process, or config work → `shell`/`edit`;
@@ -83,8 +86,10 @@ GNOME with Mixdog's own shell extension, which the app sets up); prefer accessib
83
86
  `input_may_have_executed:true` or unknown delivery is not a no-input refusal.
84
87
  A refusal applies to that action, not to earlier completed steps. Keep the
85
88
  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.
89
+ - Background work continues while the user works. A foreground step is refused
90
+ or interrupted (that action only, `user_input_active`) when the user acts; it
91
+ never pauses the session. Retry it after the user pauses. Explicit
92
+ Stop/Pause still halts everything; resume through the recovery flow below.
88
93
 
89
94
  ## Rules
90
95
 
@@ -114,11 +119,14 @@ GNOME with Mixdog's own shell extension, which the app sets up); prefer accessib
114
119
  - Window pixels come only from a window-owned capture, never a sampled region
115
120
  of the shared desktop. If that surface is unavailable, use semantic refs or
116
121
  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
122
+ - If the user's physical input interrupts an action, it fails alone with
123
+ `user_input_active` (input may have landed: capture fresh state, never replay,
124
+ no `wait_for_user`). Their cursor and focus stay theirs. Worker
125
+ termination and input cleanup must finish before resuming a pause. The user's
126
+ Resume on the overlay continues a pause; an unverified-recovery pause may
127
+ also resume after the host's configured quiet interval (renewed input resets
128
+ it), while explicit pauses, stops and uncertain cleanup never auto-resume.
129
+ Stop (or
122
130
  `Ctrl+Alt+Esc`) cancels the task, which then reports the stop as a failure.
123
131
  A cleanup that could not be confirmed is retried before the next input
124
132
  command; if it still fails, that command returns the reason — relay it to
@@ -222,6 +230,22 @@ refs still work.
222
230
  `type` text, optional `key` Enter → inspect the returned value. Use `verify`
223
231
  only if the result does not establish the required value or completion state.
224
232
 
233
+ **Sign in inside the user's browser window** — prefer the session or SSO the
234
+ browser already has, or Browser Use's saved sign-in. As a fallback, focus the
235
+ login field (`act` click), then `saved_login` with `savedAccount` (username or
236
+ masked label) and `field` (`username` or `password`). The host writes it only
237
+ into that field of a verified Chrome/Edge HTTPS page whose origin has
238
+ the login (separate checks, then one write: not atomic inside the browser).
239
+ The site receives it. The password is the protected value: it is kept out of
240
+ your results and that browser's pixels are withheld until this turn ends
241
+ (`ax` reads still work), but a page that redisplays it can expose it, and other
242
+ programs of the same Windows user are outside this protection. A username is
243
+ an identifier and is not hidden. Continue with keys (`act` key Enter). On a
244
+ refusal, hand the secret to the user (`ask_user` kind `secret`,
245
+ surface `computer`); one-time codes, passkeys, security keys and app approvals
246
+ are the user's step (`ask_user` kind `takeover`). Never type a password or
247
+ code with `type`/`set_value`, even one shown on screen.
248
+
225
249
  **Keyboard-driven navigation** — `act` with `key` steps such as `ctrl+s`
226
250
  and a trailing short `wait`; verify with `verify` rather than another capture.
227
251
  `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
@@ -369,16 +369,18 @@ function buildRouteRulesContent({
369
369
  // - `identity`: the coding identity sentence ("You are Mixdog, …").
370
370
  const LEAD_IDENTITY_LINE = /^- (You are Mixdog, a coding agent\.)\n/m;
371
371
  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\.)/;
372
+ const LEAD_REPORT_PASSAGE = / (On an agent report[\s\S]*?not a completed request\.)/;
373
373
  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.';
374
+ '- Just answer conversation. Quick tool use (checking memory, a lookup,\n' +
375
+ ' leaving a reaction) needs no announcement. When starting longer work\n' +
376
+ ' (research, delegation, multi-step tasks), say in one line what you are\n' +
377
+ ' doing, stay quiet between tool calls, and share the result when it\n' +
378
+ ' finishes.';
378
379
  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.';
380
+ '- Relay agent reports faithfully. Code: one fresh Reviewer per non-trivial\n' +
381
+ ' feature after its last worker, any author (Lead if none); docs/copy/style:\n' +
382
+ ' read the diff. Recheck only fixes; at request end check feature seams and\n' +
383
+ ' run affected suites once.';
382
384
 
383
385
  function buildLeadRoleContent({ PLUGIN_ROOT, includeLeadBrief = true, part = 'common' }) {
384
386
  const RULES_DIR = path.join(PLUGIN_ROOT, 'rules');
@@ -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
@@ -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,15 @@
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 goal and why,
23
+ owned paths, non-goals and done-when; a running agent gets only changes.
24
+ Outcomes only: no tools, steps or mid-flight checks; evidence by path.
25
+ Decide first; send scope changes as one replacement brief; invent no
26
+ restrictions or copies.
28
27
  <!-- 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.
28
+ - Reports arrive as `<task-notification>`: never wait, poll or guess them;
29
+ do independent work and end the turn. On an agent report, each feature
30
+ beyond docs/copy/style or one-line changes gets one fresh Reviewer, any
31
+ author (Lead reviews when none is available); recheck only fixes. Before
32
+ commit/report, check cross-feature seams and run affected suites once.
33
+ 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,8 @@
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; ask the user only when none exists.
10
12
  - Do not add work whose need depends on a pending result. Reuse content
11
13
  already delivered; changed sources and omitted ranges are new evidence.
12
14
  Trust documented guarantees; no availability checks or defensive branches —
@@ -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.
@@ -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
  });