mixdog 1.3.0 → 1.3.2

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 (423) hide show
  1. package/NOTICE.md +52 -9
  2. package/README.md +8 -4
  3. package/package.json +2 -2
  4. package/scripts/native-release-status.mjs +238 -0
  5. package/src/defaults/shipped-history.json +8 -1
  6. package/src/defaults/skills/pptx/scripts/qc-pages.mjs +3 -2
  7. package/src/defaults/skills/setup/SKILL.md +23 -1
  8. package/src/defaults/skills/setup/references/actions.md +54 -4
  9. package/src/defaults/skills/setup/references/surfaces.md +23 -3
  10. package/src/defaults/skills/setup-guide/SKILL.md +17 -10
  11. package/src/defaults/skills/visualize/SKILL.md +9 -6
  12. package/src/defaults/skills/visualize/references/craft.md +8 -1
  13. package/src/help.mjs +1 -1
  14. package/src/lib/keychain-cjs.cjs +4 -1
  15. package/src/lib/rules-builder.cjs +14 -7
  16. package/src/output-styles/common.md +13 -8
  17. package/src/rules/agent-mode/AGENT_MODE.md +9 -6
  18. package/src/rules/agent-mode/MIXY.md +11 -6
  19. package/src/rules/lead/LEAD.md +2 -2
  20. package/src/rules/shared/10-tool-workflow.md +4 -0
  21. package/src/rules/shared/20-research.md +2 -0
  22. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +5 -0
  23. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +8 -0
  24. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +6 -1
  25. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +114 -26
  26. package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +8 -0
  27. package/src/runtime/agent/orchestrator/agent-runtime/room-supervisor-completion.mjs +5 -4
  28. package/src/runtime/agent/orchestrator/agent-trace.mjs +3 -0
  29. package/src/runtime/agent/orchestrator/cache-break-trace.mjs +4 -0
  30. package/src/runtime/agent/orchestrator/config-presets.mjs +2 -0
  31. package/src/runtime/agent/orchestrator/config-storage.mjs +10 -3
  32. package/src/runtime/agent/orchestrator/config.mjs +11 -0
  33. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +81 -16
  34. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +97 -4
  35. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +6 -10
  36. package/src/runtime/agent/orchestrator/mcp/client.mjs +7 -4
  37. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +80 -31
  38. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +1 -1
  39. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  40. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +67 -38
  41. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -0
  42. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +7 -2
  43. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +6 -2
  44. package/src/runtime/agent/orchestrator/providers/auto-effort.mjs +34 -16
  45. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +31 -4
  46. package/src/runtime/agent/orchestrator/providers/cursor.mjs +4 -1
  47. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +11 -8
  48. package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -0
  49. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +19 -1
  50. package/src/runtime/agent/orchestrator/providers/lib/tail-reminder-split.mjs +13 -0
  51. package/src/runtime/agent/orchestrator/providers/lib/tool-call-wire-ids.mjs +65 -0
  52. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +16 -1
  53. package/src/runtime/agent/orchestrator/providers/mixdog-local.mjs +3 -1
  54. package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +1 -0
  55. package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +5 -5
  56. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +9 -5
  57. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +9 -1
  58. package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +8 -2
  59. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +10 -2
  60. package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +30 -3
  61. package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +1 -1
  62. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +3 -1
  63. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +3 -1
  64. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +61 -8
  65. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +14 -2
  66. package/src/runtime/agent/orchestrator/providers/registry.mjs +9 -0
  67. package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +17 -0
  68. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +90 -24
  69. package/src/runtime/agent/orchestrator/runtime-core/fs-utils.mjs +8 -1
  70. package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +1 -1
  71. package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +68 -22
  72. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +1 -1
  73. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +5 -5
  74. package/src/runtime/agent/orchestrator/runtime-core/route-context-state.mjs +81 -0
  75. package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +2 -1
  76. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +12 -1
  77. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +17 -6
  78. package/src/runtime/agent/orchestrator/runtime-core/workflow/agents.mjs +41 -10
  79. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +6 -4
  80. package/src/runtime/agent/orchestrator/runtime-core/workflow/packs.mjs +8 -4
  81. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +2 -0
  82. package/src/runtime/agent/orchestrator/session/agent-mode.mjs +0 -6
  83. package/src/runtime/agent/orchestrator/session/agent-room-supervisor.d.mts +1 -1
  84. package/src/runtime/agent/orchestrator/session/agent-room-supervisor.mjs +22 -4
  85. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +21 -2
  86. package/src/runtime/agent/orchestrator/session/agent-room.mjs +149 -45
  87. package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +80 -0
  88. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
  89. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +14 -11
  90. package/src/runtime/agent/orchestrator/session/compact/forked-summary.mjs +3 -0
  91. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +68 -18
  92. package/src/runtime/agent/orchestrator/session/compact/summary-mode.mjs +16 -0
  93. package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +87 -0
  94. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +2 -0
  95. package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +5 -1
  96. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +1 -1
  97. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
  98. package/src/runtime/agent/orchestrator/session/context-utils.mjs +41 -10
  99. package/src/runtime/agent/orchestrator/session/human-gate/delegation.mjs +230 -0
  100. package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +156 -25
  101. package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +20 -0
  102. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +21 -9
  103. package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +73 -0
  104. package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +55 -27
  105. package/src/runtime/agent/orchestrator/session/human-gate/unattended-port.mjs +15 -0
  106. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +4 -1
  107. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +189 -105
  108. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +9 -0
  109. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +6 -2
  110. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +111 -9
  111. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +11 -14
  112. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -0
  113. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +38 -5
  114. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +21 -0
  115. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +2 -1
  116. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +12 -0
  117. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +11 -5
  118. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +46 -4
  119. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +13 -2
  120. package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +18 -8
  121. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +4 -0
  122. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +6 -0
  123. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +4 -0
  124. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +44 -18
  125. package/src/runtime/agent/orchestrator/session/manager/orchestration-mode-switch-notice.mjs +99 -0
  126. package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +42 -0
  127. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +3 -9
  128. package/src/runtime/agent/orchestrator/session/manager/pending-spool-file.mjs +1 -1
  129. package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +5 -3
  130. package/src/runtime/agent/orchestrator/session/manager/provider-replay.mjs +50 -0
  131. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +40 -1
  132. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +12 -0
  133. package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +20 -0
  134. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +62 -47
  135. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +6 -8
  136. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +12 -1
  137. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +6 -15
  138. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +7 -1
  139. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +24 -8
  140. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +1 -1
  141. package/src/runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs +94 -13
  142. package/src/runtime/agent/orchestrator/session/mixy-name.mjs +5 -2
  143. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +42 -10
  144. package/src/runtime/agent/orchestrator/session/provider-prefix-guard.mjs +21 -3
  145. package/src/runtime/agent/orchestrator/session/routine-result.d.mts +35 -4
  146. package/src/runtime/agent/orchestrator/session/routine-result.mjs +179 -16
  147. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +5 -1
  148. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +3 -1
  149. package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +41 -7
  150. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +10 -2
  151. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +14 -2
  152. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +15 -1
  153. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +8 -3
  154. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +36 -1
  155. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +4 -1
  156. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +40 -5
  157. package/src/runtime/agent/orchestrator/session/store-summary-last-message.mjs +47 -2
  158. package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +125 -0
  159. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +4 -0
  160. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +78 -43
  161. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +49 -14
  162. package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +134 -17
  163. package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +35 -13
  164. package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +25 -5
  165. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -3
  166. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +13 -14
  167. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/transport-artifacts.mjs +9 -0
  168. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +19 -14
  169. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +7 -1
  170. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +6 -14
  171. package/src/runtime/agent/orchestrator/tools/builtin/pdf-test-fixtures.mjs +5 -3
  172. package/src/runtime/agent/orchestrator/tools/builtin/read-image.mjs +4 -2
  173. package/src/runtime/agent/orchestrator/tools/builtin/read-single-media.mjs +47 -2
  174. package/src/runtime/agent/orchestrator/tools/builtin/read-special-files.mjs +264 -87
  175. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +10 -4
  176. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +34 -21
  177. package/src/runtime/agent/orchestrator/tools/code-graph/constants.mjs +8 -4
  178. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +9 -30
  179. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +24 -12
  180. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +3 -2
  181. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +6 -2
  182. package/src/runtime/agent/orchestrator/tools/patch/delete-quarantine.mjs +2 -1
  183. package/src/runtime/agent/orchestrator/tools/patch/replay-capture.mjs +4 -2
  184. package/src/runtime/agent/orchestrator/tools/patch/rollback-state.mjs +33 -2
  185. package/src/runtime/agent/orchestrator/tools/patch-manifest.json +13 -13
  186. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +5 -3
  187. package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +3 -1
  188. package/src/runtime/attachments/attachment-reference.mjs +155 -0
  189. package/src/runtime/attachments/limits.mjs +5 -1
  190. package/src/runtime/attachments/office-extract.mjs +3 -6
  191. package/src/runtime/attachments/pdf-extract.mjs +84 -10
  192. package/src/runtime/attachments/store.mjs +55 -30
  193. package/src/runtime/browser-bridge/client.mjs +73 -20
  194. package/src/runtime/channels/lib/runtime-paths.mjs +1 -1
  195. package/src/runtime/channels/lib/scheduler.mjs +14 -7
  196. package/src/runtime/channels/lib/state-file.mjs +15 -15
  197. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +14 -13
  198. package/src/runtime/channels/lib/webhook/relay-tunnel.mjs +22 -18
  199. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +14 -36
  200. package/src/runtime/channels/lib/worker-main.mjs +3 -2
  201. package/src/runtime/effort-judge/compact-tokenizer.mjs +8 -2
  202. package/src/runtime/effort-judge/judge-client.mjs +6 -3
  203. package/src/runtime/effort-judge/model-install.mjs +16 -8
  204. package/src/runtime/effort-judge/model-manifest.json +7 -7
  205. package/src/runtime/local-provider/asset-installer.mjs +10 -4
  206. package/src/runtime/local-provider/catalog.mjs +5 -2
  207. package/src/runtime/local-provider/registered-models.mjs +64 -27
  208. package/src/runtime/local-provider/server.mjs +2 -3
  209. package/src/runtime/media/adapters/image-api.mjs +89 -0
  210. package/src/runtime/media/auth.mjs +64 -1
  211. package/src/runtime/media/catalog.mjs +66 -4
  212. package/src/runtime/media/jobs.mjs +4 -0
  213. package/src/runtime/media/lanes.mjs +46 -5
  214. package/src/runtime/media/media-usage.mjs +17 -0
  215. package/src/runtime/media/renditions.mjs +15 -15
  216. package/src/runtime/media/store.mjs +36 -35
  217. package/src/runtime/media/tool.mjs +8 -1
  218. package/src/runtime/memory/lib/cycle-scheduler/health-ledger.mjs +8 -2
  219. package/src/runtime/memory/lib/embedding-model-files.mjs +30 -7
  220. package/src/runtime/memory/lib/ingest/transcript-tail.mjs +16 -7
  221. package/src/runtime/memory/lib/pg/process.mjs +8 -4
  222. package/src/runtime/memory/lib/project-id-resolver.mjs +5 -1
  223. package/src/runtime/memory/lib/runtime-fetcher.mjs +6 -1
  224. package/src/runtime/office/core/journal.mjs +7 -14
  225. package/src/runtime/office/design/library/design-library-core.mjs +4 -16
  226. package/src/runtime/office/pdf/ocr-engine-worker.mjs +37 -0
  227. package/src/runtime/office/pdf/ocr-engine.mjs +146 -0
  228. package/src/runtime/office/pdf/pdf-ocr.mjs +51 -21
  229. package/src/runtime/office/pdf/pdf-render.mjs +30 -18
  230. package/src/runtime/office/portable/ooxml-validator.mjs +2 -2
  231. package/src/runtime/office/portable/portable-soffice.mjs +4 -0
  232. package/src/runtime/shared/agent-kind-migration.mjs +200 -0
  233. package/src/runtime/shared/agent-kind.mjs +152 -0
  234. package/src/runtime/shared/agent-message-envelope.d.mts +6 -0
  235. package/src/runtime/shared/agent-message-envelope.mjs +44 -0
  236. package/src/runtime/shared/agent-reap-state.d.mts +4 -0
  237. package/src/runtime/shared/agent-route-config.d.mts +1 -0
  238. package/src/runtime/shared/agent-route-config.mjs +22 -8
  239. package/src/runtime/shared/agent-store.mjs +149 -0
  240. package/src/runtime/shared/agent-task-starts.mjs +27 -0
  241. package/src/runtime/shared/atomic-file.d.mts +50 -0
  242. package/src/runtime/shared/atomic-file.mjs +394 -132
  243. package/src/runtime/shared/background-tasks.mjs +7 -4
  244. package/src/runtime/shared/bot-hops.mjs +30 -0
  245. package/src/runtime/shared/bot-split-migration.mjs +457 -0
  246. package/src/runtime/shared/bounded-download.mjs +4 -2
  247. package/src/runtime/shared/config-patch.mjs +20 -1
  248. package/src/runtime/shared/config.mjs +39 -9
  249. package/src/runtime/shared/connector-catalog.d.mts +1 -2
  250. package/src/runtime/shared/connector-catalog.mjs +2 -4
  251. package/src/runtime/shared/connector-triggers.mjs +2 -0
  252. package/src/runtime/shared/defaults-separation.mjs +6 -2
  253. package/src/runtime/shared/delegated-approval-host.mjs +74 -0
  254. package/src/runtime/shared/err-text.mjs +7 -1
  255. package/src/runtime/shared/error-presentation.mjs +113 -10
  256. package/src/runtime/shared/file-has-data.mjs +28 -0
  257. package/src/runtime/shared/handoff-artifacts.d.mts +20 -0
  258. package/src/runtime/shared/handoff-artifacts.mjs +61 -0
  259. package/src/runtime/shared/llm/provider-model-identities.mjs +6 -1
  260. package/src/runtime/shared/llm/usage-accounting.mjs +7 -1
  261. package/src/runtime/shared/llm/usage-ledger-import.mjs +37 -18
  262. package/src/runtime/shared/model-route-fallback.mjs +79 -7
  263. package/src/runtime/shared/pending-agent-work.mjs +54 -0
  264. package/src/runtime/shared/plain-preview.mjs +22 -17
  265. package/src/runtime/shared/process-lifecycle.mjs +8 -12
  266. package/src/runtime/shared/projects.mjs +50 -41
  267. package/src/runtime/shared/provider-accounts.mjs +17 -12
  268. package/src/runtime/shared/routine-trigger.d.mts +6 -1
  269. package/src/runtime/shared/routine-trigger.mjs +14 -6
  270. package/src/runtime/shared/run-child.d.mts +3 -0
  271. package/src/runtime/shared/run-child.mjs +24 -3
  272. package/src/runtime/shared/sensitive-path-rules.d.mts +15 -0
  273. package/src/runtime/shared/sensitive-path-rules.mjs +256 -0
  274. package/src/runtime/shared/session-baseline-store.mjs +8 -2
  275. package/src/runtime/shared/singleton-owner.mjs +7 -6
  276. package/src/runtime/shared/skill-tool-dependencies.mjs +4 -10
  277. package/src/runtime/shared/staged-update.mjs +4 -2
  278. package/src/runtime/shared/statusline/statusline-segments.mjs +4 -15
  279. package/src/runtime/shared/tool-execution-contract.mjs +6 -0
  280. package/src/runtime/shared/transcript-metadata.mjs +28 -3
  281. package/src/runtime/shared/transcript-writer/session-record.mjs +7 -6
  282. package/src/runtime/shared/turn-snapshot-store.mjs +5 -4
  283. package/src/runtime/shared/turn-snapshot.mjs +44 -2
  284. package/src/runtime/shared/usage-readout-totals.mjs +15 -13
  285. package/src/runtime/shared/user-cwd.mjs +9 -4
  286. package/src/runtime/shared/user-data-guard.mjs +46 -44
  287. package/src/runtime/shared/utf8-cut.mjs +10 -0
  288. package/src/runtime/shared/worktrees/activity-gate.mjs +269 -61
  289. package/src/runtime/shared/worktrees/registry.mjs +26 -26
  290. package/src/runtime/tidy/core-install.mjs +26 -4
  291. package/src/runtime/tidy/install.mjs +91 -23
  292. package/src/runtime/web-search/lib/config.mjs +4 -16
  293. package/src/session-runtime/agent-home-delivery.mjs +859 -136
  294. package/src/session-runtime/agent-room-delivery.mjs +167 -19
  295. package/src/session-runtime/agent-task-sessions.mjs +831 -69
  296. package/src/session-runtime/agent-tool-routing.mjs +1 -0
  297. package/src/session-runtime/boot/apis.mjs +58 -24
  298. package/src/session-runtime/boot/config.mjs +1 -0
  299. package/src/session-runtime/boot/facade.mjs +11 -1
  300. package/src/session-runtime/boot/infrastructure.mjs +14 -2
  301. package/src/session-runtime/boot/providers.mjs +16 -6
  302. package/src/session-runtime/boot/shared.mjs +12 -6
  303. package/src/session-runtime/boot/tools.mjs +2 -2
  304. package/src/session-runtime/bot-status.mjs +432 -0
  305. package/src/session-runtime/config-lifecycle/lead-route-sync.mjs +29 -0
  306. package/src/session-runtime/config-lifecycle.mjs +78 -32
  307. package/src/session-runtime/cwd-plugins/core-memory-context.mjs +2 -4
  308. package/src/session-runtime/handoff-attachments.mjs +593 -0
  309. package/src/session-runtime/held-requests.mjs +36 -33
  310. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +10 -1
  311. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +2 -2
  312. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +45 -6
  313. package/src/session-runtime/lifecycle/session-catalog.mjs +12 -2
  314. package/src/session-runtime/lifecycle/teardown.mjs +11 -3
  315. package/src/session-runtime/mcp-glue/connect.mjs +100 -186
  316. package/src/session-runtime/mcp-glue/initial-connect-gate.mjs +57 -0
  317. package/src/session-runtime/mcp-glue/server-connection.mjs +71 -0
  318. package/src/session-runtime/media-api.mjs +5 -2
  319. package/src/session-runtime/model-route/route-persist.mjs +2 -2
  320. package/src/session-runtime/model-route/route-tuning.mjs +11 -2
  321. package/src/session-runtime/model-route/set-route.mjs +82 -2
  322. package/src/session-runtime/native-web-search.mjs +2 -2
  323. package/src/session-runtime/new-session-config.mjs +6 -1
  324. package/src/session-runtime/owned-automation-run.mjs +8 -1
  325. package/src/session-runtime/room-member-gate.mjs +16 -3
  326. package/src/session-runtime/route-resolution.mjs +21 -19
  327. package/src/session-runtime/route-state.mjs +1 -59
  328. package/src/session-runtime/routine-home-turn.mjs +5 -3
  329. package/src/session-runtime/runtime-bootstrap.mjs +5 -3
  330. package/src/session-runtime/runtime-paths.mjs +11 -5
  331. package/src/session-runtime/runtime-tunables.mjs +6 -0
  332. package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +11 -2
  333. package/src/session-runtime/services/agent-tool/close-flow.mjs +4 -2
  334. package/src/session-runtime/services/agent-tool/execute-send.mjs +1 -0
  335. package/src/session-runtime/services/agent-tool/execute-spawn.mjs +1 -0
  336. package/src/session-runtime/services/agent-tool/helpers.mjs +24 -5
  337. package/src/session-runtime/services/agent-tool/restart-notify.mjs +10 -0
  338. package/src/session-runtime/services/agent-tool/send-flow.mjs +36 -24
  339. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +4 -0
  340. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +6 -3
  341. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +12 -6
  342. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +5 -8
  343. package/src/session-runtime/services/agent-tool/tool-def.mjs +7 -0
  344. package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +22 -2
  345. package/src/session-runtime/services/agent-tool/worker-index.mjs +4 -6
  346. package/src/session-runtime/services/agent-tool.mjs +6 -0
  347. package/src/session-runtime/services/daemon-crash-capture/daemon-exit-record.mjs +1 -1
  348. package/src/session-runtime/services/daemon-crash-capture/retention.mjs +4 -3
  349. package/src/session-runtime/services/hook-bus/config-loader.mjs +14 -5
  350. package/src/session-runtime/services/hook-bus/rule-file.mjs +49 -11
  351. package/src/session-runtime/services/plugin-admin.mjs +26 -26
  352. package/src/session-runtime/services/provider-admin.mjs +14 -4
  353. package/src/session-runtime/services/schedule-access.mjs +33 -4
  354. package/src/session-runtime/services/seeds.mjs +4 -3
  355. package/src/session-runtime/services/usage-dashboard.mjs +1 -1
  356. package/src/session-runtime/services/usage-stats-model.mjs +2 -1
  357. package/src/session-runtime/session-create/materialize.mjs +2 -3
  358. package/src/session-runtime/session-create/session-options.mjs +15 -2
  359. package/src/session-runtime/settings-builtin-tools-api.mjs +63 -1
  360. package/src/session-runtime/settings-compaction-api.mjs +86 -39
  361. package/src/session-runtime/setup-tool/executor.mjs +20 -3
  362. package/src/session-runtime/setup-tool/extended-actions.mjs +19 -7
  363. package/src/session-runtime/setup-tool/settings-contract.mjs +37 -1
  364. package/src/session-runtime/setup-tool/tool-defs.mjs +20 -3
  365. package/src/session-runtime/skills-api.mjs +12 -5
  366. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +265 -0
  367. package/src/session-runtime/tool-policy/mode-switch.mjs +54 -0
  368. package/src/session-runtime/tool-policy/pending-switches.mjs +59 -0
  369. package/src/session-runtime/tool-policy/policy-stage.mjs +165 -0
  370. package/src/session-runtime/tool-policy/session-switches.mjs +169 -0
  371. package/src/session-runtime/tool-policy/surface-helpers.mjs +114 -0
  372. package/src/session-runtime/tool-policy/workflow-overlay.mjs +145 -0
  373. package/src/session-runtime/tool-policy-refresh.mjs +47 -358
  374. package/src/session-runtime/tool-surface.mjs +5 -3
  375. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +99 -81
  376. package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
  377. package/src/session-runtime/turn/turn-run.mjs +2 -1
  378. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +54 -7
  379. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +578 -301
  380. package/src/session-runtime/workflow-agents-api/agent-route.mjs +113 -53
  381. package/src/session-runtime/workflow-agents-api/onboarding.mjs +11 -4
  382. package/src/session-runtime/workflow-agents-api/shared.mjs +5 -1
  383. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +14 -1
  384. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +6 -3
  385. package/src/session-runtime/workspace/workspace-state.mjs +7 -6
  386. package/src/standalone/daemon-agent-control.mjs +4 -1
  387. package/src/standalone/daemon-session-control.mjs +60 -11
  388. package/src/standalone/daemon.mjs +34 -4
  389. package/src/standalone/local-session-runtime.mjs +22 -14
  390. package/src/standalone/session-client.mjs +7 -2
  391. package/src/standalone/session-protocol.mjs +7 -0
  392. package/src/standalone/session-service/agent-tree/agent-turns.mjs +46 -3
  393. package/src/standalone/session-service/agent-tree.mjs +4 -3
  394. package/src/standalone/session-service/session-calls/session-turns.mjs +19 -0
  395. package/src/standalone/session-service.mjs +11 -0
  396. package/src/standalone/session-state-projection.mjs +19 -9
  397. package/src/standalone/session-tool-output.mjs +35 -9
  398. package/src/tui/app/maintenance-pickers/auto-clear-picker.mjs +19 -13
  399. package/src/tui/app/settings-picker/settings-rows.mjs +2 -2
  400. package/src/tui/app/slash-commands.mjs +1 -1
  401. package/src/tui/app/usage-context-panels/context-model.mjs +8 -2
  402. package/src/tui/dist/index.mjs +599 -342
  403. package/src/tui/prompt-history-store.mjs +16 -21
  404. package/src/tui/session/context-state.mjs +4 -0
  405. package/src/tui/session/notice-surface.mjs +3 -4
  406. package/src/tui/session/session-api/intake/abort.mjs +19 -1
  407. package/src/tui/session/session-api/media.mjs +2 -1
  408. package/src/tui/session/session-api/routes-agent-definitions.mjs +75 -0
  409. package/src/tui/session/session-api/routes-write.mjs +203 -0
  410. package/src/tui/session/session-api/routes.mjs +23 -236
  411. package/src/tui/session/session-api/settings.mjs +14 -1
  412. package/src/tui/session/session-flow/drain.mjs +28 -3
  413. package/src/tui/session/session-flow/failed-turn-rewind.mjs +4 -2
  414. package/src/tui/session/session-flow/queue/take-entries.mjs +8 -0
  415. package/src/tui/session/session-flow/steering.mjs +8 -3
  416. package/src/tui/session/tool-approval.mjs +185 -20
  417. package/src/tui/session/transcript-intake.mjs +4 -0
  418. package/src/tui/session/turn-live-call.mjs +11 -3
  419. package/src/tui/session/turn.mjs +36 -17
  420. package/src/tui/transcript-tool-failures.mjs +8 -2
  421. package/src/vendor/statusline/src/gateway/route-meta.mjs +7 -8
  422. package/src/vendor/statusline/src/gateway/session-routes.mjs +6 -7
  423. package/src/rules/agent-mode/ROUTINE.md +0 -6
package/NOTICE.md CHANGED
@@ -125,15 +125,58 @@ downloads it from this repository's `effort-judge-v*` GitHub releases, as
125
125
  listed in `src/runtime/effort-judge/model-manifest.json`.
126
126
 
127
127
  Statement of changes (Apache-2.0 section 4(b)): only the text encoder is kept,
128
- reduced to 12 of its layers; a four-level classification head is added and the
129
- model is fine-tuned to rate the reasoning effort a request needs; the weights
130
- are exported to ONNX and quantized to 4 bits. Full license text:
131
- `LICENSES/Apache-2.0.txt`.
132
-
133
- Its training data includes requests from SWE-chat
134
- (<https://huggingface.co/datasets/cfahlgren1/SWE-chat>), made available under
135
- the Open Data Commons Attribution License 1.0, and from DataClaw exports that
136
- their authors published on the Hugging Face Hub under the MIT License.
128
+ reduced to 18 of its layers; a four-level classification head is added and the
129
+ model is fine-tuned to rate the reasoning effort a request or an agent step
130
+ needs; the weights are exported to ONNX and quantized to 4 bits. Full license
131
+ text: `LICENSES/Apache-2.0.txt`.
132
+
133
+ Its training data includes requests and agent steps from SWE-chat
134
+ (<https://huggingface.co/datasets/SALT-NLP/SWE-chat>, Open Data Commons
135
+ Attribution License 1.0); OpenAssistant oasst2
136
+ (<https://huggingface.co/datasets/OpenAssistant/oasst2>, Apache License 2.0);
137
+ DataClaw exports that their authors published on the Hugging Face Hub under the
138
+ MIT License (<https://huggingface.co/datasets/di-zhang-fdu/ShareDataClaw>);
139
+ DevGPT by Tao Xiao, Christoph Treude, Hideaki Hata and Kenichi Matsumoto
140
+ (<https://doi.org/10.5281/zenodo.16392320>, CC BY 4.0); issue texts from the
141
+ SWE-bench training split (<https://github.com/SWE-bench/SWE-bench>, MIT
142
+ License); and agent steps from NVIDIA's SWE-Hero OpenHands trajectories
143
+ (<https://huggingface.co/datasets/nvidia/SWE-Hero-openhands-trajectories>,
144
+ CC BY 4.0).
145
+
146
+ Contains information from WildChat-4.8M
147
+ (<https://huggingface.co/datasets/allenai/WildChat-4.8M>) which is made
148
+ available under the ODC Attribution License
149
+ (<https://opendatacommons.org/licenses/by/1-0/>).
150
+
151
+ Since `effort-judge-v7` it also includes questions from Stack Exchange sites
152
+ (via <https://huggingface.co/datasets/HuggingFaceTB/stackexchange_2025_md>;
153
+ each post is licensed CC BY-SA 2.5, 3.0 or 4.0 by its author, and its URL and
154
+ author are kept with the training item); GitHub issues and pull requests of
155
+ permissively licensed repositories (via
156
+ <https://huggingface.co/datasets/common-pile/github_archive>, with each item's
157
+ repository, URL, license and authors kept); issues and pull requests from
158
+ Nebius SWE-rebench-V2 (<https://huggingface.co/datasets/nebius/SWE-rebench-V2>,
159
+ <https://huggingface.co/datasets/nebius/SWE-rebench-V2-PRs>, CC BY 4.0,
160
+ permissively licensed repositories only); and agent steps from Nebius
161
+ SWE-agent trajectories
162
+ (<https://huggingface.co/datasets/nebius/SWE-agent-trajectories>, CC BY 4.0),
163
+ Nebius SWE-rebench OpenHands trajectories
164
+ (<https://huggingface.co/datasets/nebius/SWE-rebench-openhands-trajectories>,
165
+ CC BY 4.0), Kwai-Klear SWE-smith mini-swe-agent-plus trajectories
166
+ (<https://huggingface.co/datasets/Kwai-Klear/SWE-smith-mini_swe_agent_plus-trajectories-66k>,
167
+ MIT License), SWE-Factory DeepSWE-Agent Kimi-K2 trajectories
168
+ (<https://huggingface.co/datasets/SWE-Factory/DeepSWE-Agent-Kimi-K2-Trajectories-2.8K>,
169
+ MIT License), SWE-Gym OpenHands SFT trajectories
170
+ (<https://huggingface.co/datasets/SWE-Gym/OpenHands-SFT-Trajectories>, MIT
171
+ License), SWE-ZERO-12M trajectories
172
+ (<https://huggingface.co/datasets/AlienKevin/SWE-ZERO-12M-trajectories>, Apache
173
+ License 2.0), SWE-Lego real and synthetic data
174
+ (<https://huggingface.co/datasets/Lego-X/SWE-Lego-Real-Data>,
175
+ <https://huggingface.co/datasets/Lego-X/SWE-Lego-Synthetic-Data>, Apache
176
+ License 2.0) and TIGER-Lab SWE-Next SFT trajectories
177
+ (<https://huggingface.co/datasets/TIGER-Lab/SWE-Next-SFT-Trajectories>, MIT
178
+ License). Each `effort-judge-v*` release lists its files, hashes and
179
+ attributions.
137
180
 
138
181
  ## CC0-1.0
139
182
 
package/README.md CHANGED
@@ -44,9 +44,13 @@ https://github.com/user-attachments/assets/af515dc9-b0fb-4b6a-aaa1-1d82db792ed0
44
44
  - Use the **Claude, ChatGPT, Grok, or Muse Code** subscription you already have, API
45
45
  keys, or local models on your own GPU.
46
46
  - Mix models by role and scale from **Solo to Swarm** — a strong model leads
47
- while cheaper ones search, edit, and review in parallel.
47
+ while cheaper ones search, edit, and review in parallel. Switch the workflow
48
+ or mode mid-conversation, and set fallback models for usage limits.
49
+ - **Bots and rooms** — your own bots with their own models, tools, and
50
+ permissions, group rooms where they talk together, and a representative bot
51
+ that sits above the composer on your desktop.
48
52
  - A full workspace: editor, terminals, Git and GitHub, code graph, and
49
- language servers.
53
+ language servers, with themes and photo skins.
50
54
  - Keeps working on its own with **Goals, schedules, and webhooks** — and
51
55
  continues from your phone, end-to-end encrypted.
52
56
  - Goes beyond code with **browser and desktop control**, Office and PDF
@@ -71,8 +75,8 @@ Then sign in with a ChatGPT, Claude, Grok, or Muse Code account, or paste an API
71
75
  five-step tutorial walks you through the rest.
72
76
 
73
77
  > [!NOTE]
74
- > The Windows installer is not code-signed yet. If SmartScreen appears,
75
- > choose **More info → Run anyway**. The Mac app is signed and notarized.
78
+ > The Windows installer and app are code-signed, and the Mac app is signed and
79
+ > notarized. If SmartScreen still appears, choose **More info → Run anyway**.
76
80
 
77
81
  Or run it in the terminal (Node.js 22.19+ or 24+):
78
82
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mixdog",
3
- "version": "1.3.0",
3
+ "version": "1.3.2",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Open-source coding agent that matches Codex on Terminal-Bench 2.1 with 63% fewer tokens.",
@@ -98,7 +98,7 @@
98
98
  "test:office:live:all": "node scripts/run-office-live-tests.mjs all",
99
99
  "test:office:render": "node scripts/test-direct.mjs src/runtime/office/pptx-skill-kit.slow.test.mjs",
100
100
  "office:icons": "node scripts/office/build-pptx-icons.mjs",
101
- "test:media": "node scripts/test-direct.mjs src/runtime/media/catalog.test.mjs src/runtime/media/lanes.test.mjs src/runtime/media/tool.test.mjs src/runtime/media/defaults.test.mjs src/runtime/media/store.test.mjs src/runtime/media/renditions.test.mjs src/runtime/media/adapters/codex-image.test.mjs src/runtime/media/adapters/gemini-image.test.mjs",
101
+ "test:media": "node scripts/test-direct.mjs src/runtime/media/catalog.test.mjs src/runtime/media/lanes.test.mjs src/runtime/media/tool.test.mjs src/runtime/media/defaults.test.mjs src/runtime/media/store.test.mjs src/runtime/media/renditions.test.mjs src/runtime/media/adapters/codex-image.test.mjs src/runtime/media/adapters/gemini-image.test.mjs src/runtime/media/adapters/image-api.test.mjs src/tui/session/session-api/media-lanes.test.mjs",
102
102
  "failures": "node scripts/tool-failures.mjs",
103
103
  "trace:llm": "node scripts/llm-trace-summary.mjs",
104
104
  "bench:office": "node src/runtime/office/bench/benchmark.mjs",
@@ -0,0 +1,238 @@
1
+ #!/usr/bin/env node
2
+ // Native tools (patch, graph, spawn) ship as their own immutable GitHub
3
+ // releases (`<kind>-v<version>`); the app pins one through
4
+ // src/runtime/agent/orchestrator/tools/<kind>-manifest.json and downloads that
5
+ // release's assets. A fix committed under native/<tool>/ therefore reaches
6
+ // users only when a new `<kind>-v*` release is published AND the manifest pin
7
+ // moves. This script answers, for every tool, "does the source differ from the
8
+ // release the app pins?" and is the single definition used by:
9
+ // - deploy.yml plan (refuses native=skip while a tool is unreleased)
10
+ // - release.yml validate (fails a release that would ship an unreleased tool)
11
+ // - the dev scripts (warn / rebuild a stale local target/release binary)
12
+ //
13
+ // node scripts/native-release-status.mjs table
14
+ // node scripts/native-release-status.mjs --json
15
+ // node scripts/native-release-status.mjs --check exit 1 when a tool is unreleased
16
+ // node scripts/native-release-status.mjs --warn-dev warnings for a dev build, exit 0
17
+ //
18
+ // native/mixdog-computer, native/mixdog-browser-import and native/gnome-extension
19
+ // have no release/manifest: the desktop package builds them from source, keyed
20
+ // on a hash of that source (desktop-package.yml), so they cannot go stale.
21
+ import { spawn, spawnSync } from 'node:child_process';
22
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
23
+ import { dirname, join } from 'node:path';
24
+ import { fileURLToPath, pathToFileURL } from 'node:url';
25
+
26
+ const TOOLS_DIR = 'src/runtime/agent/orchestrator/tools';
27
+
28
+ export const NATIVE_RELEASE_TOOLS = Object.freeze(
29
+ ['patch', 'graph', 'spawn'].map((kind) =>
30
+ Object.freeze({
31
+ kind,
32
+ dir: `native/mixdog-${kind}`,
33
+ manifestPath: `${TOOLS_DIR}/${kind}-manifest.json`,
34
+ tagPrefix: `${kind}-v`,
35
+ binaryName: `mixdog-${kind}${process.platform === 'win32' ? '.exe' : ''}`,
36
+ })
37
+ )
38
+ );
39
+
40
+ const DEFAULT_ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
41
+
42
+ function git(root, args) {
43
+ const result = spawnSync('git', args, { cwd: root, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 });
44
+ if (result.error) throw result.error;
45
+ return result;
46
+ }
47
+
48
+ /** Newest mtime (ms) of the files that decide a cargo build of `toolDir`. */
49
+ export function newestSourceMtime(toolDir) {
50
+ let newest = 0;
51
+ const consider = (path) => {
52
+ try {
53
+ const stat = statSync(path);
54
+ if (stat.isFile() && stat.mtimeMs > newest) newest = stat.mtimeMs;
55
+ } catch {
56
+ /* absent */
57
+ }
58
+ };
59
+ for (const file of ['Cargo.toml', 'Cargo.lock', 'build.rs']) consider(join(toolDir, file));
60
+ const src = join(toolDir, 'src');
61
+ if (existsSync(src)) for (const entry of readdirSync(src, { recursive: true })) consider(join(src, entry));
62
+ return newest;
63
+ }
64
+
65
+ /** The local `cargo build --release` binary the dev resolvers prefer over the
66
+ * pinned download, and whether the sources are newer than it. */
67
+ export function localBinaryState(tool, root = DEFAULT_ROOT) {
68
+ const path = join(root, tool.dir, 'target', 'release', tool.binaryName);
69
+ if (!existsSync(path)) return { path, exists: false, stale: false };
70
+ const builtMs = statSync(path).mtimeMs;
71
+ return { path, exists: true, builtMs, stale: newestSourceMtime(join(root, tool.dir)) > builtMs };
72
+ }
73
+
74
+ /** Release status of one tool at HEAD plus the working tree of `root`. */
75
+ export function nativeToolStatus(tool, root = DEFAULT_ROOT) {
76
+ const manifest = JSON.parse(readFileSync(join(root, tool.manifestPath), 'utf8'));
77
+ const version = String(manifest.version);
78
+ const tag = `${tool.tagPrefix}${version}`;
79
+ const tagCommit = git(root, ['rev-parse', '--verify', '--quiet', `refs/tags/${tag}^{commit}`]);
80
+ const tagMissing = tagCommit.status !== 0;
81
+ let changedFiles = [];
82
+ let commits = [];
83
+ let tagDate = '';
84
+ if (!tagMissing) {
85
+ const diff = git(root, ['diff', '--name-only', tag, 'HEAD', '--', tool.dir]);
86
+ if (diff.status !== 0) throw new Error(`git diff failed for ${tag}: ${diff.stderr}`);
87
+ changedFiles = diff.stdout.split('\n').filter(Boolean);
88
+ commits = git(root, ['log', '--format=%h %cs %s', `${tag}..HEAD`, '--', tool.dir])
89
+ .stdout.split('\n')
90
+ .filter(Boolean);
91
+ tagDate = git(root, ['log', '-1', '--format=%cs', tag]).stdout.trim();
92
+ }
93
+ const dirtyFiles = git(root, ['status', '--porcelain', '--', tool.dir]).stdout.split('\n').filter(Boolean);
94
+ const unreleased = tagMissing || changedFiles.length > 0 || dirtyFiles.length > 0;
95
+ return {
96
+ kind: tool.kind,
97
+ version,
98
+ tag,
99
+ tagMissing,
100
+ tagCommit: tagMissing ? '' : tagCommit.stdout.trim().slice(0, 9),
101
+ tagDate,
102
+ changedFiles,
103
+ commits,
104
+ dirtyFiles,
105
+ unreleased,
106
+ local: localBinaryState(tool, root),
107
+ };
108
+ }
109
+
110
+ export function nativeReleaseStatuses(root = DEFAULT_ROOT, tools = NATIVE_RELEASE_TOOLS) {
111
+ return tools.map((tool) => nativeToolStatus(tool, root));
112
+ }
113
+
114
+ /** Operator-facing explanation for every unreleased tool, or []. */
115
+ export function unreleasedProblems(statuses) {
116
+ return statuses
117
+ .filter((status) => status.unreleased)
118
+ .map((status) => {
119
+ if (status.tagMissing) {
120
+ return `${status.kind}: the pinned release tag ${status.tag} does not exist, so the source it ships cannot be compared.`;
121
+ }
122
+ const what = [
123
+ status.changedFiles.length &&
124
+ `${status.changedFiles.length} file(s) changed since ${status.tag} (${status.changedFiles.slice(0, 3).join(', ')}${status.changedFiles.length > 3 ? ', ...' : ''})`,
125
+ status.dirtyFiles.length && `${status.dirtyFiles.length} uncommitted file(s)`,
126
+ ]
127
+ .filter(Boolean)
128
+ .join(' and ');
129
+ return (
130
+ `${status.kind}: ${what}, but users still get ${status.tag}. ` +
131
+ `Publish a new ${status.kind}-v release and bump ${TOOLS_DIR}/${status.kind}-manifest.json: ` +
132
+ `run Deploy with native=auto (or force); it bumps native/mixdog-${status.kind}/Cargo.toml, tags and syncs the manifest.`
133
+ );
134
+ });
135
+ }
136
+
137
+ /** Warnings for a local dev build, which ships the pinned download rather than the working tree. */
138
+ export function devWarnings(statuses) {
139
+ const warnings = [];
140
+ for (const status of statuses) {
141
+ if (status.unreleased && !status.tagMissing) {
142
+ warnings.push(
143
+ `native ${status.kind}: source differs from the pinned ${status.tag} ` +
144
+ `(${status.changedFiles.length} committed, ${status.dirtyFiles.length} uncommitted file(s)). ` +
145
+ `A packaged dev build downloads the released binary, so these changes are NOT in it until a ${status.kind}-v release is published.`
146
+ );
147
+ }
148
+ if (status.local.stale) {
149
+ warnings.push(
150
+ `native ${status.kind}: ${status.local.path} is older than its sources and is preferred by source checkouts. ` +
151
+ `Rebuild: cargo build --release --manifest-path native/mixdog-${status.kind}/Cargo.toml`
152
+ );
153
+ }
154
+ }
155
+ return warnings;
156
+ }
157
+
158
+ function cargoBuild(root, tool) {
159
+ return new Promise((resolve) => {
160
+ const child = spawn(
161
+ 'cargo',
162
+ ['build', '--locked', '--release', '--manifest-path', join(root, tool.dir, 'Cargo.toml')],
163
+ { stdio: 'inherit' }
164
+ );
165
+ child.once('error', () => resolve(null));
166
+ child.once('exit', resolve);
167
+ });
168
+ }
169
+
170
+ /** Dev launch hook: rebuild every existing-but-stale local release binary.
171
+ * A tool with no local binary resolves to the pinned download instead, so it
172
+ * is left alone. Never throws: a failed build only warns. */
173
+ export async function refreshStaleLocalBinaries({
174
+ root = DEFAULT_ROOT,
175
+ tools = NATIVE_RELEASE_TOOLS,
176
+ build = cargoBuild,
177
+ log = console.log,
178
+ } = {}) {
179
+ const results = [];
180
+ for (const tool of tools) {
181
+ if (!localBinaryState(tool, root).stale) continue;
182
+ log(`native ${tool.kind}: local target/release binary is older than its sources; rebuilding.`);
183
+ const code = await build(root, tool);
184
+ const stale = code !== 0 || localBinaryState(tool, root).stale;
185
+ if (stale)
186
+ log(`native ${tool.kind}: rebuild failed (cargo missing or build error); the stale binary stays in use.`);
187
+ results.push({ kind: tool.kind, rebuilt: !stale });
188
+ }
189
+ return results;
190
+ }
191
+
192
+ function localBinState(local) {
193
+ if (!local.exists) return 'none';
194
+ return local.stale ? 'STALE' : 'fresh';
195
+ }
196
+
197
+ function formatTable(statuses) {
198
+ const rows = [['tool', 'pinned tag', 'tag commit', 'tag date', 'committed', 'uncommitted', 'local bin', 'state']];
199
+ for (const status of statuses) {
200
+ rows.push([
201
+ status.kind,
202
+ status.tag,
203
+ status.tagCommit || '(missing)',
204
+ status.tagDate || '-',
205
+ String(status.changedFiles.length),
206
+ String(status.dirtyFiles.length),
207
+ localBinState(status.local),
208
+ status.unreleased ? 'UNRELEASED' : 'released',
209
+ ]);
210
+ }
211
+ const widths = rows[0].map((_, column) => Math.max(...rows.map((row) => row[column].length)));
212
+ return rows.map((row) => row.map((cell, column) => cell.padEnd(widths[column])).join(' ')).join('\n');
213
+ }
214
+
215
+ async function main(argv) {
216
+ const statuses = nativeReleaseStatuses();
217
+ if (argv.includes('--json')) {
218
+ console.log(JSON.stringify(statuses, null, 2));
219
+ return 0;
220
+ }
221
+ if (argv.includes('--warn-dev')) {
222
+ // stdout on purpose: PowerShell callers treat native stderr as an error.
223
+ for (const warning of devWarnings(statuses)) console.log(`WARNING: ${warning}`);
224
+ return 0;
225
+ }
226
+ console.log(formatTable(statuses));
227
+ const problems = unreleasedProblems(statuses);
228
+ for (const problem of problems) console.log(`\n${problem}`);
229
+ if (argv.includes('--check') && problems.length) {
230
+ console.error('\nNative release check failed: native sources differ from the releases the app pins.');
231
+ return 1;
232
+ }
233
+ return 0;
234
+ }
235
+
236
+ if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
237
+ process.exitCode = await main(process.argv.slice(2));
238
+ }
@@ -116,6 +116,7 @@
116
116
  "8d343d0a406fd5817b7fd98a3ac47010",
117
117
  "a1b73ce404125d3ce0a5762e4a1e1555",
118
118
  "a28fb01bb21ceebbde1bc6c4a02d3db6",
119
+ "c7fdabb946eed7283db656493d95749b",
119
120
  "d40c23517c4803afdac3fc056bb65cda",
120
121
  "db1af5417849abc2f6bb1d1d2b63939f"
121
122
  ],
@@ -312,6 +313,7 @@
312
313
  "48247c1645fd94aad7711082d4512c49",
313
314
  "4f94016363acccd788a724a2d414744e",
314
315
  "56e474f78faafae39aebe921ccff112d",
316
+ "60a1e22fd0c32aa283c64a2cc05b7889",
315
317
  "6358ad25dd07a2f92ad65c249a4f360b",
316
318
  "7fb12aeb07b79ae113c0deb0a90c6da7",
317
319
  "804afd71ebc3f68614a4dc419af4b98e",
@@ -344,6 +346,7 @@
344
346
  "0d6926aaca2890da9347f15a826546e3",
345
347
  "0f14ba0a3d8b3896b717dc144bbe49a4",
346
348
  "15d86146cfbd58d85adf0c25cf1d683f",
349
+ "18dc665b96ee0ba5a1645180e173b1af",
347
350
  "1c317db86e1ff80a5c4102e09e36f5fb",
348
351
  "242f11864abdef90fa0cc9cb4599a579",
349
352
  "29a347c4d3a2f773fa92c627260301ba",
@@ -352,6 +355,7 @@
352
355
  "50bdf35d06913236855080fdea6b50dc",
353
356
  "5b4586a44104b26ae7dd45da101079bf",
354
357
  "6101786127a1e68778eafcd2bf2c9ce0",
358
+ "64a85678fbe08d4653ab78c55ee22c7c",
355
359
  "6711dbc9d84023b8eabfa928b8d33d18",
356
360
  "6f9e9338f560fa9acd839a67b5e2d1cc",
357
361
  "70c54f802c77b630863b9e17a16d8224",
@@ -374,7 +378,9 @@
374
378
  "ff18ac1a9f5961925aec27ffb870bae0"
375
379
  ],
376
380
  "setup-guide": [
377
- "633e15b84dbe22f2b578b67cc35853d4"
381
+ "633e15b84dbe22f2b578b67cc35853d4",
382
+ "920d5b29ccfe6c88f623cf0892b29285",
383
+ "ec88a82ab5e511c0afb1738162150648"
378
384
  ],
379
385
  "skill-creator": [
380
386
  "020817866da73a69544ba35086bdcd5f",
@@ -396,6 +402,7 @@
396
402
  ],
397
403
  "visualize": [
398
404
  "8320fedd9dd745a332621c325a8bf355",
405
+ "9c9fba19647b67d75a600137e38c02b8",
399
406
  "aa3531bfc4fd6ec3820493d0c190cc75",
400
407
  "f65924f0691284ad31000469a9855b62"
401
408
  ],
@@ -28,7 +28,8 @@ const number = (value) => (Number.isFinite(value) ? Number(value.toFixed(2)) : n
28
28
  // pointed at a per-page working copy beside the deck.
29
29
  export function workingCopyPath(deck, page) {
30
30
  const extension = extname(deck);
31
- return join(dirname(deck), `.${basename(deck, extension)}.qc-page-${page}${extension}`);
31
+ // Not dot-prefixed: Windows cloud-sync drives refuse to create such names.
32
+ return join(dirname(deck), `${basename(deck, extension)}.qc-page-${page}${extension}`);
32
33
  }
33
34
 
34
35
  async function fileExists(path) {
@@ -202,7 +203,7 @@ async function defaultMeasure() {
202
203
  // missing renderer leaves the page to the geometry read.
203
204
  async function renderPage(office, deck, page) {
204
205
  const cwd = dirname(deck);
205
- const scratch = join(dirname(deck), `.${basename(deck, extname(deck))}.qc-render${extname(deck)}`);
206
+ const scratch = join(dirname(deck), `${basename(deck, extname(deck))}.qc-render${extname(deck)}`);
206
207
  const opened = await office(
207
208
  { action: 'open', path: deck, mode: 'portable', output: scratch, snapshotAfter: false },
208
209
  cwd
@@ -74,10 +74,32 @@ that a call returned without transport error.
74
74
  Computer Use actions require this conversation open in the local Desktop
75
75
  window; voice runs on the runtime and needs no Desktop.
76
76
  - Hook rules are before-tool policy, separate from MCP and plugins. Deleting a
77
- rule is destructive; disabling preserves it.
77
+ rule is destructive; disabling preserves it. A rule change reaches open
78
+ sessions and their sub-agents on the next tool call.
79
+ - Auto-clear is per provider and can be `unlimited` (`never`). Built-in
80
+ windows: Codex/ChatGPT login unlimited, OpenAI API 30 min, Anthropic 1h.
81
+ Unlimited stops idle clearing only: compaction still runs at the context
82
+ limit, and finished sub-agent sessions are still released, never kept
83
+ forever: after the provider's own window (OpenAI API 30 min, Anthropic 1h,
84
+ DeepSeek 24h), or 1h for Codex/ChatGPT logins; an unlimited override does
85
+ not stop that.
78
86
  - Desktop appearance changes affect the Desktop host, not a paired phone.
87
+ Fonts, imported color themes and skin transparency are saved per device.
79
88
  Display language is independent of profile response language. A required
80
89
  reload is reported, never performed automatically.
90
+ - A routine or webhook run has no user and no approval prompts: it may change
91
+ only its own bot's automations and route, and payment and permanent-delete
92
+ connectors are refused (trash moves are allowed). Bot permission "block"
93
+ still applies. In an attended bot conversation (home or direct chat, group
94
+ room, or a sub-agent/task session working for one) a payment or permanent
95
+ delete connector call always asks first: allow once or deny, never "항상
96
+ 허용", whatever was stored before. Coding sessions are not asked.
97
+ - Prompt-affecting changes land without rewriting the cached prompt: a
98
+ workflow switch arrives as a reminder on the next turn; a bot's
99
+ instruction, persona or name applies on 적용 (one cache break); connector
100
+ and built-in feature changes take effect at once (tool availability and
101
+ call-time refusal), and only the prompt text about them waits for the cache
102
+ to expire.
81
103
  - Read definitions before editing them; use skill-creator when authoring a
82
104
  skill. Setup persists the supported definition fields. Workflow and agent
83
105
  ids are stable identities, distinct from their display names.
@@ -28,12 +28,13 @@ Read this when choosing a `setup` mutation.
28
28
  | Active workflow pack | `set_workflow` |
29
29
  | Output style | `set_output_style` |
30
30
  | User title, language, or experience level | `set_profile` |
31
- | Idle session clearing | `set_autoclear` |
31
+ | Idle session clearing, per provider, including `unlimited` | `set_autoclear` |
32
32
  | Automatic context compaction | `set_compaction` |
33
33
  | Memory capability | `set_memory_enabled` |
34
34
  | Background memory cycles | `set_recap_enabled` |
35
35
  | Web Search tool exposure | `set_web_search_enabled` |
36
36
  | Which user instruction files (AGENTS.md / CLAUDE.md) new sessions load: all, agents, claude, or off | `set_instruction_files` |
37
+ | The reasoning effort Auto works around: low, medium (default), or high | `set_auto_effort_base` |
37
38
  | Git, Office, Code Tidy, Local Provider, Auto Effort, Browser, Computer, voice, or Visualize enabled state | `set_builtin_enabled` |
38
39
  | Git, Memory, Office, Code Tidy, Local Provider, Auto Effort, Browser, Computer, or voice preparation | `install_builtin` |
39
40
  | Managed local model installation | `install_local_model` |
@@ -52,7 +53,7 @@ Read this when choosing a `setup` mutation.
52
53
  | Remove stored provider authentication (one OAuth account at a time) | `forget_provider_auth` |
53
54
  | Select, rename, or reorder OAuth accounts, set the switching policy, or allow paid credits | `set_provider_account` |
54
55
  | Developer options such as risk-gated OAuth providers | `set_developer_option` |
55
- | Connect a catalog service (Slack, Notion, GitHub, …) for the user: shows a one-click connect card | `connect_connector` |
56
+ | Connect a catalog service (Notion, Linear, Gmail, …; not GitHub, which is the GitHub CLI) for the user: shows a one-click connect card | `connect_connector` |
56
57
  | Add an MCP server | `add_mcp_server` |
57
58
  | Edit or rename an MCP server | `save_mcp_server` |
58
59
  | Remove an MCP server | `remove_mcp_server` |
@@ -78,7 +79,7 @@ Read this when choosing a `setup` mutation.
78
79
  | Run a schedule once now, or re-run a webhook on its latest received payload; the result posts into the owning agent's thread | `run_automation` |
79
80
  | Webhook listener enabled state, port, or domain | `set_webhook_config` |
80
81
  | Desktop keep-awake, run in background after window close, turn-completion notifications, notification volume (Windows), usage pin, usage rail short + long bars, or Computer observe-only state | `set_desktop_settings` |
81
- | Desktop theme, display language, side panels, markdown default view, link previews, or tool activity expansion | `set_appearance` |
82
+ | Desktop theme, imported color theme, UI/code font, skin transparency (outer or main panels), display language, side panels, markdown default view, link previews, or tool activity expansion | `set_appearance` |
82
83
  | Add a before-tool hook rule | `add_hook_rule` |
83
84
  | Enable or disable a hook rule by its `status hooks` index | `set_hook_rule_enabled` |
84
85
  | Delete a hook rule by its `status hooks` index | `delete_hook_rule` |
@@ -109,10 +110,26 @@ workflow` before changing the corresponding domain.
109
110
  - Definition actions use `definitionKind` (workflow, agent, skill).
110
111
  Workflow/agent ids cannot be renamed through
111
112
  a save; change their display name instead. User skills may be renamed with
112
- `originalName` and `name`. Skill deletion is not exposed; disable it instead.
113
+ `originalName` and `name`. A user skill's trigger line (`when_to_use`) is
114
+ `definition.whenToUse` on create and save. Skill deletion is not exposed;
115
+ disable it instead.
113
116
  Built-in and plugin skills accept only `toolDependencies` edits (`null`
114
117
  restores their declared dependencies).
118
+ - A created agent is a bot (`definition.kind: "bot"`) or a workflow agent
119
+ (`"agent"`); omitted, the representative bot's chat creates a bot and any other chat a
120
+ workflow agent. The kind is fixed after creation.
115
121
  - Changing orchestration does not rewrite workflow instructions or agents.
122
+ - `set_route` is the Lead default for new sessions. A model chosen in New Task
123
+ changes that default only when the user actually picks one there.
124
+ `route.fallbacks` (ordered models on other providers; `[]` clears) works the
125
+ same on `set_route` (Lead), `set_agent_route` (agents and bots, Mixy included).
126
+ - A workflow switch reaches a running conversation as a reminder on its next
127
+ turn (the cached prompt is not swapped). A bot definition's instruction,
128
+ persona or name applies when the user presses 적용, with one cache break.
129
+ Connector and built-in feature changes reach a bot's open chat at once for
130
+ availability: opened tools join the deferred catalog, removed ones are
131
+ refused at call time, and the next turn's notice names both. Only the prompt
132
+ text describing them waits until the cache next expires.
116
133
 
117
134
  ## Providers and authentication
118
135
 
@@ -123,6 +140,8 @@ key's source.
123
140
  authentication in the visible UI.
124
141
  - Custom providers are registered, tested, and removed in the Providers UI;
125
142
  `status providers` with `detail: true` lists them as API rows with `custom: true`.
143
+ Their model list (Nano-GPT included) loads there with up to a 60 s wait; the
144
+ user can skip it and type model ids by hand.
126
145
  - Local Provider is installed and enabled as a Built-in. Its endpoint is
127
146
  Mixdog-managed and is never configured by the user.
128
147
  Use the `local-provider` skill for hardware checks, model selection, downloads,
@@ -152,6 +171,18 @@ key's source.
152
171
  duration; `provider: "default"` sets the fallback for providers without a
153
172
  built-in window. A reset and a duration are mutually exclusive; provider
154
173
  reset requires a provider.
174
+ - `duration: "unlimited"` (or `"never"`) stops idle clearing for a provider;
175
+ without `provider` it applies to the current route's provider. `status
176
+ autoclear` reports `unlimited`, `label` and per-provider `providerDefaults`
177
+ (`builtInUnlimited` marks a built-in unlimited window); a provider reset
178
+ restores its built-in window. Built-ins follow each provider's cache: Codex/
179
+ ChatGPT login unlimited, OpenAI API 30 min, Anthropic and Gemini 1h. The
180
+ OpenAI API caches a Lead-class session's stable prefix for 12h and its
181
+ moving tail for 30 min (Lead, bot chats, bot task sessions, routine and
182
+ webhook runs), so the 30 min window clears only a cold tail. Finished
183
+ sub-agent sessions are always released on a finite timer (the provider's
184
+ window, e.g. DeepSeek 24h; 1h for Codex/ChatGPT logins); unlimited does not
185
+ disable it.
155
186
  - Compaction supports `enabled` and a `compaction` object with either
156
187
  `mainBufferTokens` or `mainBufferPercent`. Changing representation replaces the previous budget.
157
188
  - If no supported action exposes a requested Memory interval, report it as
@@ -204,6 +235,8 @@ markers are read with `status desktop`.
204
235
  - `add_hook_rule` with modify/rewrite needs exactly one of `patch` or `args`.
205
236
  - `delete_hook_rule` is destructive and requires explicit approval for the
206
237
  named rule; disabling with `set_hook_rule_enabled` preserves it.
238
+ - Hook rule changes apply to open sessions and their sub-agents on the next
239
+ tool call; no new session or restart is needed.
207
240
  - `status media` shows the remembered lane/model per kind. `set_media_default`
208
241
  accepts only a signed-in lane that offers the kind (and the model, when
209
242
  given) in the live media catalog; the media tool's `list` reads that catalog.
@@ -253,6 +286,15 @@ markers are read with `status desktop`.
253
286
  - Desktop-only operations require the owning conversation visible in the local
254
287
  Desktop app. Never claim a persisted change from merely delivering a request.
255
288
  - A display-language change returns `requiresReload`.
289
+ - `set_appearance` also takes `uiFont` / `codeFont` (a family name, `""` =
290
+ built-in; text it lacks falls back to the built-in fonts), skin transparency
291
+ (0–100, defaults outer 20 / main 40; higher shows more of the skin picture):
292
+ `skinOuterTransparency` (window frame, titlebar, rail, sidebar, side dock),
293
+ `skinMainTransparency` (conversation area and its cards), or `skinTransparency`
294
+ to set both; and `colorTheme`
295
+ (an imported theme id from `status appearance` `colorThemes`, or `"builtin"`).
296
+ All are stored on that Desktop device only. Importing a theme file and
297
+ choosing a skin or custom picture stay in the UI.
256
298
  - A Project removal unregisters it only.
257
299
  - Inspect schedules/webhooks before editing. `overwrite:true` updates an
258
300
  existing named entry and preserves omitted fields; a new schedule needs
@@ -261,6 +303,14 @@ markers are read with `status desktop`.
261
303
  Omitted attachments and existing webhook secrets are preserved. A saved
262
304
  secret is never shown again: tell the user to open the Webhooks panel, edit
263
305
  the webhook, press Regenerate secret, copy the new value, and save.
306
+ - A routine run (schedule or webhook) is a turn in the owning bot's chat with
307
+ nobody to approve: it never prompts, refuses payment and permanent-delete
308
+ connectors (trash moves are allowed), and still honors bot permission
309
+ "block". It can change only its own bot's automations and route. A webhook
310
+ answers "accepted" at once and a delivery that arrives while its run is
311
+ active is skipped. In an attended bot conversation (chat, room, or work a
312
+ bot started) the same payment and permanent-delete connectors ask first,
313
+ allow once or deny only; a coding session is not asked.
264
314
  - Enabling or creating automation may start its background worker. This is a
265
315
  persisted automation change, not permission to run an unrelated task now.
266
316
 
@@ -33,14 +33,26 @@ An attached Desktop or TUI may navigate and return `opened:true`.
33
33
 
34
34
  ## Desktop map
35
35
 
36
- - Settings → General: profile, Web Search exposure, display language, theme,
36
+ - Settings → General: profile, Web Search exposure, display language,
37
37
  side panels, and notifications.
38
38
  - Settings → Context: auto-compact and auto-clear.
39
39
  - Settings → Output style: output style selection, plus the desktop-only
40
40
  "Expand tool activity" choice (collapsed / commands and edits / everything),
41
41
  saved per device; Ctrl+O toggles everything open for the current window.
42
+ - Settings → Theme (one page): System / Dark / Light or a skin picture
43
+ (plate, accent, transparency), imported JSON color themes (about 26 color
44
+ roles), installed fonts, font sizes and chat text size. Saved on this device
45
+ only. First-run setup has a Theme step with the same System / Dark /
46
+ Light / skin choice.
47
+ - Settings → Bots (desktop only): the representative bot overlay, a small
48
+ window with the representative bot that opens a quick message to it. On
49
+ by default; options to pin it above the message box (default on), keep it
50
+ above other windows (default off: it follows the app window's layer),
51
+ collapse its bubble and reset its position. The overlay's right-click
52
+ menu has the same options. Saved on this PC.
42
53
  - Settings → Providers: API-key, OAuth, custom provider registration, local
43
- providers, and usage sign-in.
54
+ providers, and usage sign-in. A custom provider's model list waits up to
55
+ 60 s, can be skipped, and then takes model ids typed by hand.
44
56
  - Extensions → Plugin → Git & GitHub: Git/GitHub CLI installation and connection.
45
57
  - Settings → Connection: web-app pairing and linked devices.
46
58
  - Settings → System: update, keep-awake, run in background after the window
@@ -78,7 +90,15 @@ The setup tool does not mutate:
78
90
  `/mcp login` and `/mcp logout`; remote windows paste the redirect address);
79
91
  - notification permission and subscription on the receiving device;
80
92
  - web-app pairing credentials and OS permission dialogs;
81
- - TUI-local theme palettes (use `/theme`; Desktop themes are separate).
93
+ - TUI-local theme palettes (use `/theme`; Desktop themes are separate);
94
+ - importing or exporting a JSON color theme file, choosing a skin or custom
95
+ skin picture, and the Lead's pixel face (stored on the host as `leadAvatar`,
96
+ edited from the Desktop or a paired client, and shared by all of them; every
97
+ Lead-class row and agent wears it, and the agent edit dialog has no avatar);
98
+ - approval grants ("항상 허용" is per feature and per bot, never for payment,
99
+ permanent delete, Lead, workflow, Mixy link, group rooms or schedules) and
100
+ browser action confirmations (`MIXDOG_BROWSER_CONFIRM_ACTIONS`,
101
+ `MIXDOG_BROWSER_CONFIRM_SUBMIT`; see the browser-use skill).
82
102
 
83
103
  Use `open` where a target exists, then let the user act.
84
104