mixdog 1.3.1 → 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 (377) hide show
  1. package/README.md +8 -4
  2. package/package.json +2 -2
  3. package/scripts/native-release-status.mjs +238 -0
  4. package/src/defaults/shipped-history.json +5 -1
  5. package/src/defaults/skills/pptx/scripts/qc-pages.mjs +3 -2
  6. package/src/defaults/skills/setup/SKILL.md +23 -1
  7. package/src/defaults/skills/setup/references/actions.md +50 -3
  8. package/src/defaults/skills/setup/references/surfaces.md +23 -3
  9. package/src/defaults/skills/setup-guide/SKILL.md +7 -3
  10. package/src/defaults/skills/visualize/SKILL.md +9 -6
  11. package/src/defaults/skills/visualize/references/craft.md +8 -1
  12. package/src/help.mjs +1 -1
  13. package/src/lib/keychain-cjs.cjs +4 -1
  14. package/src/lib/rules-builder.cjs +14 -7
  15. package/src/rules/agent-mode/AGENT_MODE.md +8 -5
  16. package/src/rules/agent-mode/MIXY.md +6 -8
  17. package/src/rules/lead/LEAD.md +2 -2
  18. package/src/rules/shared/10-tool-workflow.md +4 -0
  19. package/src/rules/shared/20-research.md +2 -0
  20. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +5 -0
  21. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +8 -0
  22. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +6 -1
  23. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +114 -26
  24. package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +8 -0
  25. package/src/runtime/agent/orchestrator/agent-runtime/room-supervisor-completion.mjs +5 -4
  26. package/src/runtime/agent/orchestrator/agent-trace.mjs +3 -0
  27. package/src/runtime/agent/orchestrator/cache-break-trace.mjs +4 -0
  28. package/src/runtime/agent/orchestrator/config-presets.mjs +2 -0
  29. package/src/runtime/agent/orchestrator/config-storage.mjs +10 -3
  30. package/src/runtime/agent/orchestrator/config.mjs +11 -0
  31. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +9 -2
  32. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +97 -5
  33. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +6 -10
  34. package/src/runtime/agent/orchestrator/mcp/client.mjs +7 -4
  35. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +80 -31
  36. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +1 -1
  37. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  38. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +67 -38
  39. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -0
  40. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +6 -2
  41. package/src/runtime/agent/orchestrator/providers/auto-effort.mjs +27 -8
  42. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +31 -4
  43. package/src/runtime/agent/orchestrator/providers/cursor.mjs +4 -1
  44. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +11 -8
  45. package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -0
  46. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +16 -0
  47. package/src/runtime/agent/orchestrator/providers/lib/tail-reminder-split.mjs +13 -0
  48. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +16 -1
  49. package/src/runtime/agent/orchestrator/providers/mixdog-local.mjs +3 -1
  50. package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +1 -0
  51. package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +5 -5
  52. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +9 -5
  53. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +9 -1
  54. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +2 -1
  55. package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +30 -3
  56. package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +1 -1
  57. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +3 -1
  58. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +61 -8
  59. package/src/runtime/agent/orchestrator/providers/registry.mjs +9 -0
  60. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +90 -24
  61. package/src/runtime/agent/orchestrator/runtime-core/fs-utils.mjs +8 -1
  62. package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +1 -1
  63. package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +68 -22
  64. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +1 -1
  65. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +4 -6
  66. package/src/runtime/agent/orchestrator/runtime-core/route-context-state.mjs +81 -0
  67. package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +2 -1
  68. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +12 -1
  69. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +6 -5
  70. package/src/runtime/agent/orchestrator/runtime-core/workflow/agents.mjs +7 -6
  71. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +1 -1
  72. package/src/runtime/agent/orchestrator/runtime-core/workflow/packs.mjs +8 -4
  73. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +2 -0
  74. package/src/runtime/agent/orchestrator/session/agent-mode.mjs +0 -6
  75. package/src/runtime/agent/orchestrator/session/agent-room-supervisor.d.mts +1 -1
  76. package/src/runtime/agent/orchestrator/session/agent-room-supervisor.mjs +22 -4
  77. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +17 -2
  78. package/src/runtime/agent/orchestrator/session/agent-room.mjs +133 -38
  79. package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +80 -0
  80. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
  81. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +14 -11
  82. package/src/runtime/agent/orchestrator/session/compact/forked-summary.mjs +3 -0
  83. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +68 -18
  84. package/src/runtime/agent/orchestrator/session/compact/summary-mode.mjs +16 -0
  85. package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +87 -0
  86. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +2 -0
  87. package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +5 -1
  88. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +1 -1
  89. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
  90. package/src/runtime/agent/orchestrator/session/context-utils.mjs +41 -10
  91. package/src/runtime/agent/orchestrator/session/human-gate/delegation.mjs +230 -0
  92. package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +136 -32
  93. package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +20 -0
  94. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +21 -9
  95. package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +73 -0
  96. package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +55 -27
  97. package/src/runtime/agent/orchestrator/session/human-gate/unattended-port.mjs +15 -0
  98. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +4 -1
  99. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +189 -105
  100. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +6 -2
  101. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +5 -5
  102. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +3 -0
  103. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -0
  104. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +38 -5
  105. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +21 -0
  106. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +2 -1
  107. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +12 -0
  108. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +11 -5
  109. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +13 -2
  110. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +4 -0
  111. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +6 -0
  112. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +4 -0
  113. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +44 -18
  114. package/src/runtime/agent/orchestrator/session/manager/orchestration-mode-switch-notice.mjs +99 -0
  115. package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +42 -0
  116. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +3 -9
  117. package/src/runtime/agent/orchestrator/session/manager/pending-spool-file.mjs +1 -1
  118. package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +5 -3
  119. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +40 -1
  120. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +12 -0
  121. package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +20 -0
  122. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +55 -27
  123. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +3 -8
  124. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +12 -1
  125. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +6 -15
  126. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +24 -8
  127. package/src/runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs +94 -13
  128. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +42 -10
  129. package/src/runtime/agent/orchestrator/session/provider-prefix-guard.mjs +21 -3
  130. package/src/runtime/agent/orchestrator/session/routine-result.d.mts +18 -3
  131. package/src/runtime/agent/orchestrator/session/routine-result.mjs +120 -9
  132. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +5 -1
  133. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +3 -1
  134. package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +41 -7
  135. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +10 -2
  136. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +14 -2
  137. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +15 -1
  138. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +8 -3
  139. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +36 -1
  140. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +4 -1
  141. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +40 -5
  142. package/src/runtime/agent/orchestrator/session/store-summary-last-message.mjs +47 -2
  143. package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +125 -0
  144. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +4 -0
  145. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +78 -43
  146. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +35 -5
  147. package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +42 -2
  148. package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +35 -13
  149. package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +25 -5
  150. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -3
  151. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +13 -14
  152. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/transport-artifacts.mjs +9 -0
  153. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +19 -14
  154. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +7 -1
  155. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +6 -14
  156. package/src/runtime/agent/orchestrator/tools/builtin/pdf-test-fixtures.mjs +5 -3
  157. package/src/runtime/agent/orchestrator/tools/builtin/read-image.mjs +4 -2
  158. package/src/runtime/agent/orchestrator/tools/builtin/read-single-media.mjs +47 -2
  159. package/src/runtime/agent/orchestrator/tools/builtin/read-special-files.mjs +264 -87
  160. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +10 -4
  161. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +34 -21
  162. package/src/runtime/agent/orchestrator/tools/code-graph/constants.mjs +8 -4
  163. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +9 -30
  164. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +24 -12
  165. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +3 -2
  166. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +6 -2
  167. package/src/runtime/agent/orchestrator/tools/patch/delete-quarantine.mjs +2 -1
  168. package/src/runtime/agent/orchestrator/tools/patch/replay-capture.mjs +4 -2
  169. package/src/runtime/agent/orchestrator/tools/patch/rollback-state.mjs +33 -2
  170. package/src/runtime/agent/orchestrator/tools/patch-manifest.json +13 -13
  171. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +5 -3
  172. package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +3 -1
  173. package/src/runtime/attachments/attachment-reference.mjs +155 -0
  174. package/src/runtime/attachments/limits.mjs +5 -1
  175. package/src/runtime/attachments/office-extract.mjs +3 -6
  176. package/src/runtime/attachments/pdf-extract.mjs +84 -10
  177. package/src/runtime/attachments/store.mjs +49 -30
  178. package/src/runtime/browser-bridge/client.mjs +73 -20
  179. package/src/runtime/channels/lib/runtime-paths.mjs +1 -1
  180. package/src/runtime/channels/lib/scheduler.mjs +14 -7
  181. package/src/runtime/channels/lib/state-file.mjs +15 -15
  182. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +14 -13
  183. package/src/runtime/channels/lib/webhook/relay-tunnel.mjs +22 -18
  184. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +14 -36
  185. package/src/runtime/channels/lib/worker-main.mjs +3 -2
  186. package/src/runtime/effort-judge/compact-tokenizer.mjs +8 -2
  187. package/src/runtime/effort-judge/judge-client.mjs +5 -2
  188. package/src/runtime/effort-judge/model-install.mjs +16 -8
  189. package/src/runtime/local-provider/asset-installer.mjs +10 -4
  190. package/src/runtime/local-provider/catalog.mjs +5 -2
  191. package/src/runtime/local-provider/registered-models.mjs +64 -27
  192. package/src/runtime/local-provider/server.mjs +2 -3
  193. package/src/runtime/media/adapters/image-api.mjs +89 -0
  194. package/src/runtime/media/auth.mjs +64 -1
  195. package/src/runtime/media/catalog.mjs +66 -4
  196. package/src/runtime/media/jobs.mjs +4 -0
  197. package/src/runtime/media/lanes.mjs +46 -5
  198. package/src/runtime/media/media-usage.mjs +17 -0
  199. package/src/runtime/media/renditions.mjs +15 -15
  200. package/src/runtime/media/store.mjs +36 -35
  201. package/src/runtime/media/tool.mjs +8 -1
  202. package/src/runtime/memory/lib/cycle-scheduler/health-ledger.mjs +8 -2
  203. package/src/runtime/memory/lib/embedding-model-files.mjs +30 -7
  204. package/src/runtime/memory/lib/ingest/transcript-tail.mjs +16 -7
  205. package/src/runtime/memory/lib/pg/process.mjs +8 -4
  206. package/src/runtime/memory/lib/project-id-resolver.mjs +5 -1
  207. package/src/runtime/memory/lib/runtime-fetcher.mjs +6 -1
  208. package/src/runtime/office/core/journal.mjs +7 -14
  209. package/src/runtime/office/design/library/design-library-core.mjs +4 -16
  210. package/src/runtime/office/pdf/ocr-engine-worker.mjs +37 -0
  211. package/src/runtime/office/pdf/ocr-engine.mjs +146 -0
  212. package/src/runtime/office/pdf/pdf-ocr.mjs +51 -21
  213. package/src/runtime/office/pdf/pdf-render.mjs +30 -18
  214. package/src/runtime/office/portable/ooxml-validator.mjs +2 -2
  215. package/src/runtime/office/portable/portable-soffice.mjs +4 -0
  216. package/src/runtime/shared/agent-kind-migration.mjs +200 -0
  217. package/src/runtime/shared/agent-message-envelope.d.mts +6 -0
  218. package/src/runtime/shared/agent-message-envelope.mjs +44 -0
  219. package/src/runtime/shared/agent-reap-state.d.mts +4 -0
  220. package/src/runtime/shared/agent-store.mjs +24 -7
  221. package/src/runtime/shared/agent-task-starts.mjs +27 -0
  222. package/src/runtime/shared/atomic-file.d.mts +50 -0
  223. package/src/runtime/shared/atomic-file.mjs +394 -132
  224. package/src/runtime/shared/background-tasks.mjs +7 -4
  225. package/src/runtime/shared/bot-hops.mjs +30 -0
  226. package/src/runtime/shared/bot-split-migration.mjs +1 -1
  227. package/src/runtime/shared/bounded-download.mjs +4 -2
  228. package/src/runtime/shared/config.mjs +39 -9
  229. package/src/runtime/shared/defaults-separation.mjs +6 -2
  230. package/src/runtime/shared/delegated-approval-host.mjs +74 -0
  231. package/src/runtime/shared/err-text.mjs +4 -0
  232. package/src/runtime/shared/error-presentation.mjs +22 -4
  233. package/src/runtime/shared/file-has-data.mjs +28 -0
  234. package/src/runtime/shared/llm/usage-ledger-import.mjs +37 -18
  235. package/src/runtime/shared/pending-agent-work.mjs +54 -0
  236. package/src/runtime/shared/process-lifecycle.mjs +8 -12
  237. package/src/runtime/shared/projects.mjs +50 -41
  238. package/src/runtime/shared/provider-accounts.mjs +17 -12
  239. package/src/runtime/shared/routine-trigger.d.mts +6 -1
  240. package/src/runtime/shared/routine-trigger.mjs +14 -6
  241. package/src/runtime/shared/run-child.d.mts +3 -0
  242. package/src/runtime/shared/run-child.mjs +24 -3
  243. package/src/runtime/shared/session-baseline-store.mjs +8 -2
  244. package/src/runtime/shared/singleton-owner.mjs +7 -6
  245. package/src/runtime/shared/skill-tool-dependencies.mjs +4 -10
  246. package/src/runtime/shared/staged-update.mjs +4 -2
  247. package/src/runtime/shared/statusline/statusline-segments.mjs +4 -15
  248. package/src/runtime/shared/tool-execution-contract.mjs +6 -0
  249. package/src/runtime/shared/transcript-metadata.mjs +28 -3
  250. package/src/runtime/shared/transcript-writer/session-record.mjs +7 -6
  251. package/src/runtime/shared/turn-snapshot-store.mjs +5 -4
  252. package/src/runtime/shared/turn-snapshot.mjs +44 -2
  253. package/src/runtime/shared/user-cwd.mjs +9 -4
  254. package/src/runtime/shared/user-data-guard.mjs +41 -42
  255. package/src/runtime/shared/utf8-cut.mjs +10 -0
  256. package/src/runtime/shared/worktrees/activity-gate.mjs +269 -61
  257. package/src/runtime/shared/worktrees/registry.mjs +26 -26
  258. package/src/runtime/tidy/core-install.mjs +26 -4
  259. package/src/runtime/tidy/install.mjs +91 -23
  260. package/src/runtime/web-search/lib/config.mjs +4 -16
  261. package/src/session-runtime/agent-home-delivery.mjs +555 -199
  262. package/src/session-runtime/agent-room-delivery.mjs +143 -36
  263. package/src/session-runtime/agent-task-sessions.mjs +667 -165
  264. package/src/session-runtime/agent-tool-routing.mjs +1 -0
  265. package/src/session-runtime/boot/apis.mjs +45 -24
  266. package/src/session-runtime/boot/config.mjs +1 -0
  267. package/src/session-runtime/boot/facade.mjs +11 -1
  268. package/src/session-runtime/boot/infrastructure.mjs +14 -2
  269. package/src/session-runtime/boot/providers.mjs +2 -2
  270. package/src/session-runtime/boot/shared.mjs +12 -6
  271. package/src/session-runtime/boot/tools.mjs +2 -2
  272. package/src/session-runtime/bot-status.mjs +432 -0
  273. package/src/session-runtime/config-lifecycle/lead-route-sync.mjs +29 -0
  274. package/src/session-runtime/config-lifecycle.mjs +60 -55
  275. package/src/session-runtime/cwd-plugins/core-memory-context.mjs +2 -4
  276. package/src/session-runtime/held-requests.mjs +36 -33
  277. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +10 -1
  278. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +2 -2
  279. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +19 -4
  280. package/src/session-runtime/lifecycle/session-catalog.mjs +12 -2
  281. package/src/session-runtime/lifecycle/teardown.mjs +11 -3
  282. package/src/session-runtime/mcp-glue/connect.mjs +100 -186
  283. package/src/session-runtime/mcp-glue/initial-connect-gate.mjs +57 -0
  284. package/src/session-runtime/mcp-glue/server-connection.mjs +71 -0
  285. package/src/session-runtime/media-api.mjs +5 -2
  286. package/src/session-runtime/model-route/route-tuning.mjs +4 -1
  287. package/src/session-runtime/model-route/set-route.mjs +61 -1
  288. package/src/session-runtime/owned-automation-run.mjs +8 -1
  289. package/src/session-runtime/room-member-gate.mjs +16 -3
  290. package/src/session-runtime/route-resolution.mjs +16 -8
  291. package/src/session-runtime/route-state.mjs +1 -59
  292. package/src/session-runtime/routine-home-turn.mjs +5 -3
  293. package/src/session-runtime/runtime-bootstrap.mjs +5 -3
  294. package/src/session-runtime/runtime-paths.mjs +11 -5
  295. package/src/session-runtime/runtime-tunables.mjs +6 -0
  296. package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +11 -2
  297. package/src/session-runtime/services/agent-tool/close-flow.mjs +4 -2
  298. package/src/session-runtime/services/agent-tool/execute-send.mjs +1 -0
  299. package/src/session-runtime/services/agent-tool/execute-spawn.mjs +1 -0
  300. package/src/session-runtime/services/agent-tool/restart-notify.mjs +10 -0
  301. package/src/session-runtime/services/agent-tool/send-flow.mjs +25 -21
  302. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +4 -0
  303. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +6 -3
  304. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +8 -5
  305. package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +22 -2
  306. package/src/session-runtime/services/agent-tool/worker-index.mjs +4 -6
  307. package/src/session-runtime/services/agent-tool.mjs +6 -0
  308. package/src/session-runtime/services/daemon-crash-capture/daemon-exit-record.mjs +1 -1
  309. package/src/session-runtime/services/daemon-crash-capture/retention.mjs +4 -3
  310. package/src/session-runtime/services/hook-bus/config-loader.mjs +14 -5
  311. package/src/session-runtime/services/hook-bus/rule-file.mjs +49 -11
  312. package/src/session-runtime/services/plugin-admin.mjs +26 -26
  313. package/src/session-runtime/services/provider-admin.mjs +14 -4
  314. package/src/session-runtime/services/schedule-access.mjs +33 -4
  315. package/src/session-runtime/services/seeds.mjs +4 -3
  316. package/src/session-runtime/services/usage-dashboard.mjs +1 -1
  317. package/src/session-runtime/services/usage-stats-model.mjs +2 -1
  318. package/src/session-runtime/session-create/materialize.mjs +2 -3
  319. package/src/session-runtime/session-create/session-options.mjs +15 -2
  320. package/src/session-runtime/settings-builtin-tools-api.mjs +63 -1
  321. package/src/session-runtime/settings-compaction-api.mjs +86 -39
  322. package/src/session-runtime/setup-tool/executor.mjs +8 -2
  323. package/src/session-runtime/setup-tool/settings-contract.mjs +31 -1
  324. package/src/session-runtime/setup-tool/tool-defs.mjs +20 -3
  325. package/src/session-runtime/skills-api.mjs +12 -5
  326. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +265 -0
  327. package/src/session-runtime/tool-policy/mode-switch.mjs +54 -0
  328. package/src/session-runtime/tool-policy/pending-switches.mjs +59 -0
  329. package/src/session-runtime/tool-policy/policy-stage.mjs +165 -0
  330. package/src/session-runtime/tool-policy/session-switches.mjs +169 -0
  331. package/src/session-runtime/tool-policy/surface-helpers.mjs +114 -0
  332. package/src/session-runtime/tool-policy/workflow-overlay.mjs +145 -0
  333. package/src/session-runtime/tool-policy-refresh.mjs +47 -369
  334. package/src/session-runtime/tool-surface.mjs +5 -3
  335. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +95 -88
  336. package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
  337. package/src/session-runtime/turn/turn-run.mjs +2 -1
  338. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +54 -7
  339. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +519 -333
  340. package/src/session-runtime/workflow-agents-api/agent-route.mjs +46 -46
  341. package/src/session-runtime/workflow-agents-api/shared.mjs +5 -1
  342. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +14 -1
  343. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +6 -3
  344. package/src/session-runtime/workspace/workspace-state.mjs +7 -6
  345. package/src/standalone/daemon-agent-control.mjs +4 -1
  346. package/src/standalone/daemon-session-control.mjs +51 -10
  347. package/src/standalone/daemon.mjs +28 -10
  348. package/src/standalone/local-session-runtime.mjs +22 -14
  349. package/src/standalone/session-client.mjs +7 -2
  350. package/src/standalone/session-protocol.mjs +7 -0
  351. package/src/standalone/session-service.mjs +11 -0
  352. package/src/standalone/session-state-projection.mjs +19 -9
  353. package/src/standalone/session-tool-output.mjs +35 -9
  354. package/src/tui/app/maintenance-pickers/auto-clear-picker.mjs +19 -13
  355. package/src/tui/app/settings-picker/settings-rows.mjs +2 -2
  356. package/src/tui/app/slash-commands.mjs +1 -1
  357. package/src/tui/app/usage-context-panels/context-model.mjs +8 -2
  358. package/src/tui/dist/index.mjs +529 -333
  359. package/src/tui/prompt-history-store.mjs +16 -21
  360. package/src/tui/session/context-state.mjs +4 -0
  361. package/src/tui/session/session-api/intake/abort.mjs +19 -1
  362. package/src/tui/session/session-api/media.mjs +2 -1
  363. package/src/tui/session/session-api/routes-agent-definitions.mjs +75 -0
  364. package/src/tui/session/session-api/routes-write.mjs +203 -0
  365. package/src/tui/session/session-api/routes.mjs +23 -247
  366. package/src/tui/session/session-api/settings.mjs +14 -1
  367. package/src/tui/session/session-flow/drain.mjs +28 -3
  368. package/src/tui/session/session-flow/failed-turn-rewind.mjs +4 -2
  369. package/src/tui/session/session-flow/queue/take-entries.mjs +8 -0
  370. package/src/tui/session/session-flow/steering.mjs +8 -3
  371. package/src/tui/session/tool-approval.mjs +185 -20
  372. package/src/tui/session/transcript-intake.mjs +2 -0
  373. package/src/tui/session/turn.mjs +23 -14
  374. package/src/tui/transcript-tool-failures.mjs +8 -2
  375. package/src/vendor/statusline/src/gateway/route-meta.mjs +7 -8
  376. package/src/vendor/statusline/src/gateway/session-routes.mjs +6 -7
  377. package/src/rules/agent-mode/ROUTINE.md +0 -6
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.1",
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
+ }
@@ -313,6 +313,7 @@
313
313
  "48247c1645fd94aad7711082d4512c49",
314
314
  "4f94016363acccd788a724a2d414744e",
315
315
  "56e474f78faafae39aebe921ccff112d",
316
+ "60a1e22fd0c32aa283c64a2cc05b7889",
316
317
  "6358ad25dd07a2f92ad65c249a4f360b",
317
318
  "7fb12aeb07b79ae113c0deb0a90c6da7",
318
319
  "804afd71ebc3f68614a4dc419af4b98e",
@@ -354,6 +355,7 @@
354
355
  "50bdf35d06913236855080fdea6b50dc",
355
356
  "5b4586a44104b26ae7dd45da101079bf",
356
357
  "6101786127a1e68778eafcd2bf2c9ce0",
358
+ "64a85678fbe08d4653ab78c55ee22c7c",
357
359
  "6711dbc9d84023b8eabfa928b8d33d18",
358
360
  "6f9e9338f560fa9acd839a67b5e2d1cc",
359
361
  "70c54f802c77b630863b9e17a16d8224",
@@ -377,7 +379,8 @@
377
379
  ],
378
380
  "setup-guide": [
379
381
  "633e15b84dbe22f2b578b67cc35853d4",
380
- "920d5b29ccfe6c88f623cf0892b29285"
382
+ "920d5b29ccfe6c88f623cf0892b29285",
383
+ "ec88a82ab5e511c0afb1738162150648"
381
384
  ],
382
385
  "skill-creator": [
383
386
  "020817866da73a69544ba35086bdcd5f",
@@ -399,6 +402,7 @@
399
402
  ],
400
403
  "visualize": [
401
404
  "8320fedd9dd745a332621c325a8bf355",
405
+ "9c9fba19647b67d75a600137e38c02b8",
402
406
  "aa3531bfc4fd6ec3820493d0c190cc75",
403
407
  "f65924f0691284ad31000469a9855b62"
404
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` |
@@ -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,13 +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).
115
118
  - A created agent is a bot (`definition.kind: "bot"`) or a workflow agent
116
119
  (`"agent"`); omitted, the representative bot's chat creates a bot and any other chat a
117
120
  workflow agent. The kind is fixed after creation.
118
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.
119
133
 
120
134
  ## Providers and authentication
121
135
 
@@ -126,6 +140,8 @@ key's source.
126
140
  authentication in the visible UI.
127
141
  - Custom providers are registered, tested, and removed in the Providers UI;
128
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.
129
145
  - Local Provider is installed and enabled as a Built-in. Its endpoint is
130
146
  Mixdog-managed and is never configured by the user.
131
147
  Use the `local-provider` skill for hardware checks, model selection, downloads,
@@ -155,6 +171,18 @@ key's source.
155
171
  duration; `provider: "default"` sets the fallback for providers without a
156
172
  built-in window. A reset and a duration are mutually exclusive; provider
157
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.
158
186
  - Compaction supports `enabled` and a `compaction` object with either
159
187
  `mainBufferTokens` or `mainBufferPercent`. Changing representation replaces the previous budget.
160
188
  - If no supported action exposes a requested Memory interval, report it as
@@ -207,6 +235,8 @@ markers are read with `status desktop`.
207
235
  - `add_hook_rule` with modify/rewrite needs exactly one of `patch` or `args`.
208
236
  - `delete_hook_rule` is destructive and requires explicit approval for the
209
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.
210
240
  - `status media` shows the remembered lane/model per kind. `set_media_default`
211
241
  accepts only a signed-in lane that offers the kind (and the model, when
212
242
  given) in the live media catalog; the media tool's `list` reads that catalog.
@@ -256,6 +286,15 @@ markers are read with `status desktop`.
256
286
  - Desktop-only operations require the owning conversation visible in the local
257
287
  Desktop app. Never claim a persisted change from merely delivering a request.
258
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.
259
298
  - A Project removal unregisters it only.
260
299
  - Inspect schedules/webhooks before editing. `overwrite:true` updates an
261
300
  existing named entry and preserves omitted fields; a new schedule needs
@@ -264,6 +303,14 @@ markers are read with `status desktop`.
264
303
  Omitted attachments and existing webhook secrets are preserved. A saved
265
304
  secret is never shown again: tell the user to open the Webhooks panel, edit
266
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.
267
314
  - Enabling or creating automation may start its background worker. This is a
268
315
  persisted automation change, not permission to run an unrelated task now.
269
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
 
@@ -126,10 +126,14 @@ done. Take the first open step, explain it in a sentence or two, ask, then act.
126
126
  different model family at key decision points, not on every task. Say in
127
127
  one line that more agents can be turned on later on the Workflows page.
128
128
  Right after the models are picked, explain Auto reasoning: it adjusts
129
- reasoning depth per message, so hard work may come out slightly lower in
130
- quality but cost is much lower. Ask whether to turn it on
129
+ reasoning depth per message around a medium baseline, so hard work may
130
+ come out slightly lower in quality but cost is much lower. The Lead runs
131
+ the main coding work, where stability matters most, so also recommend
132
+ fixing the Lead's effort at High or above in the model picker (choosing an
133
+ effort there turns Auto off for that model). Ask whether to turn Auto on
131
134
  (`install_builtin` `autoEffort`). If declined, say in one line that it can
132
- be turned on later from the model picker.
135
+ be turned on later by choosing Auto at the top of the model picker's
136
+ reasoning effort list.
133
137
  4. remote: done when a device is paired (`status connection`) or `remote` is
134
138
  visited. Pairing is user-operated: `open connection`.
135
139
  5. extensions: done when `extensions` is visited. Explain plugins and skills;
@@ -56,13 +56,16 @@ testing a page belong to `browser`.
56
56
  missing assets, blocked network requests: the page must be self-contained)
57
57
  in the file, then `check` again until it reports none; a
58
58
  "Page problems" section on any `open`, `annotate`, or `capture` result counts
59
- the same. Then run `visualize inspect` on the tab: once at the panel's
60
- width and, when the design is responsive, again with `viewport`
61
- `{width: 375, height: 812}`; fix every finding it lists (overflow, clipped
59
+ the same. Then run `visualize inspect` on the tab twice, for every page
60
+ (fixed-size app frames included, not only responsive designs): once with
61
+ no `viewport` (the side panel's width) and once with `viewport`
62
+ `{width: 375, height: 812}`. Fix every finding it lists (overflow, clipped
62
63
  text, tiny or overlapping targets, low contrast, missing alt or labels) in
63
- the file before reporting. Then `capture` the tab (or read it through
64
- `browser`) and check it against `references/craft.md` §5; fix what fails
65
- before the user sees the report.
64
+ the file before reporting. Two findings are not defects and may stay: text
65
+ caught mid fade-in, and targets shrunk only because a fixed frame is scaled
66
+ down to fit (craft.md §6); name each one left and why in the report. Then
67
+ `capture` the tab (or read it through `browser`) and check it against
68
+ `references/craft.md` §5; fix what fails before the user sees the report.
66
69
  6. **Report** in chat: path, the states shown, what to confirm, and the open
67
70
  questions. Then stop — implementation waits for approval.
68
71
  7. **Iterate in place.** Feedback edits the same file; the tab reloads and the
@@ -78,7 +78,14 @@ not shown while it lists any.
78
78
  - Readable contrast for text and controls; hit targets ≥ 44px on touch frames.
79
79
  - Motion only when it shows what changed; respect `prefers-reduced-motion`.
80
80
  - Fits the panel width without horizontal scroll; frames wider than the panel
81
- scale down rather than clip.
81
+ scale down rather than clip. A fixed-size frame that reproduces an app
82
+ surface (a window, an overlay, a stage of set pixel size) sits in a wrapper
83
+ that scales it as a whole: the wrapper is `width: 100%; overflow: hidden`,
84
+ the frame gets `transform: scale(min(1, wrapperWidth / frameWidth))` from
85
+ `transform-origin: 0 0`, the wrapper's height is set to the scaled height,
86
+ and a `ResizeObserver` on the page re-runs this when the panel resizes.
87
+ Never give such a frame `max-width` alone: its contents keep their pixel
88
+ positions and spill out.
82
89
  - Self-contained: no CDN, web font, API or other network request. The panel
83
90
  blocks outside network unless the user allows it (a blocked request is a
84
91
  `blocked-network` page problem), so inline or bundle every asset in the
package/src/help.mjs CHANGED
@@ -31,7 +31,7 @@ const HELP_LINES = [
31
31
  ' /clear start a fresh chat (alias: /new)',
32
32
  ' /project [path] switch working directory (project)',
33
33
  ' /compact compact older conversation context',
34
- ' /autoclear [on|off|duration] reduce cache-miss cost after long idle gaps',
34
+ ' /autoclear [on|off|duration|unlimited] reduce cache-miss cost after long idle gaps',
35
35
  ' /resume [id] resume a saved chat',
36
36
  ' /context show current context surface',
37
37
  ' /usage [refresh] show total provider quota / balance',
@@ -221,7 +221,10 @@ function dpApiFile(account) {
221
221
  function writeOwnerOnlyAtomicSync(file, text) {
222
222
  const dir = path.dirname(file);
223
223
  fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
224
- const temporary = path.join(dir, `.${path.basename(file)}.${process.pid}.${randomBytes(6).toString('hex')}.tmp`);
224
+ const temporary = path.join(
225
+ dir,
226
+ `${path.basename(file)}.mixdog-tmp-${process.pid}-${randomBytes(4).toString('hex')}`
227
+ );
225
228
  let descriptor = null;
226
229
  try {
227
230
  descriptor = fs.openSync(temporary, 'wx', 0o600);