mixdog 1.2.5 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (493) hide show
  1. package/LICENSES/simple-icons-CC0-1.0.txt +30 -0
  2. package/NOTICE.md +19 -0
  3. package/package.json +4 -1
  4. package/scripts/check-model-recommendations.mjs +89 -0
  5. package/scripts/gate-local.mjs +7 -0
  6. package/scripts/lib/gate-scheduler.mjs +2 -2
  7. package/scripts/lib/isolated-test-env.mjs +16 -0
  8. package/scripts/lib/run-node-tests.mjs +5 -14
  9. package/scripts/provider-pingpong-live.mjs +9 -9
  10. package/src/agents/advisor/AGENT.md +4 -4
  11. package/src/agents/advisor/agent.json +1 -1
  12. package/src/agents/reviewer/AGENT.md +5 -4
  13. package/src/agents/reviewer/agent.json +1 -1
  14. package/src/defaults/shipped-history.json +17 -0
  15. package/src/defaults/skills/browser-use/SKILL.md +7 -1
  16. package/src/defaults/skills/computer-use/SKILL.md +3 -1
  17. package/src/defaults/skills/memory-management/SKILL.md +4 -1
  18. package/src/defaults/skills/setup/references/actions.md +11 -4
  19. package/src/defaults/skills/setup-guide/SKILL.md +175 -0
  20. package/src/defaults/skills/setup-guide/model-recommendations.json +333 -0
  21. package/src/defaults/skills/visualize/SKILL.md +3 -2
  22. package/src/lib/rules-builder.cjs +56 -7
  23. package/src/output-styles/common.md +22 -6
  24. package/src/output-styles/detailed.md +7 -5
  25. package/src/output-styles/minimal.md +7 -3
  26. package/src/output-styles/simple.md +2 -3
  27. package/src/rules/agent/AGENT.md +7 -1
  28. package/src/rules/agent-mode/AGENT_MODE.md +24 -0
  29. package/src/rules/agent-mode/MIXY.md +21 -0
  30. package/src/rules/agent-mode/ROUTINE.md +6 -0
  31. package/src/rules/lead/LEAD.md +9 -4
  32. package/src/rules/shared/10-tool-workflow.md +2 -1
  33. package/src/rules/shared/60-verification.md +4 -5
  34. package/src/rules/shared/70-delivery.md +3 -0
  35. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -1
  36. package/src/runtime/agent/orchestrator/agent-runtime/room-supervisor-completion.mjs +86 -0
  37. package/src/runtime/agent/orchestrator/config.mjs +6 -0
  38. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +77 -14
  39. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +182 -13
  40. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +5 -3
  41. package/src/runtime/agent/orchestrator/internal-agents.mjs +10 -0
  42. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +215 -0
  43. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +58 -64
  44. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +10 -1
  45. package/src/runtime/agent/orchestrator/mcp/client.mjs +122 -15
  46. package/src/runtime/agent/orchestrator/mcp/oauth-account.mjs +97 -0
  47. package/src/runtime/agent/orchestrator/mcp/oauth-callback.mjs +2 -3
  48. package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +49 -0
  49. package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +59 -9
  50. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +32 -7
  51. package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +45 -6
  52. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +195 -6
  53. package/src/runtime/agent/orchestrator/mcp/server-connectors.mjs +17 -0
  54. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +9 -2
  55. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  56. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +41 -19
  57. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +3 -2
  58. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-start.mjs +4 -1
  59. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +2 -0
  60. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn.mjs +3 -0
  61. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +2 -1
  62. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +3 -1
  63. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +11 -5
  64. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +4 -0
  65. package/src/runtime/agent/orchestrator/providers/catalog-deadline.mjs +163 -0
  66. package/src/runtime/agent/orchestrator/providers/catalog-failures.mjs +34 -0
  67. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
  68. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +38 -14
  69. package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +100 -26
  70. package/src/runtime/agent/orchestrator/providers/lib/send-callbacks.mjs +24 -0
  71. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +13 -0
  72. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +2 -1
  73. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +1 -0
  74. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +4 -0
  75. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +3 -1
  76. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +2 -0
  77. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +49 -4
  78. package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +0 -7
  79. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +7 -1
  80. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +1 -0
  81. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +2 -0
  82. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +1 -0
  83. package/src/runtime/agent/orchestrator/providers/openai-error-contract.mjs +17 -12
  84. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +5 -1
  85. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +11 -2
  86. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +1 -0
  87. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +45 -16
  88. package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +10 -0
  89. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +1 -0
  90. package/src/runtime/agent/orchestrator/providers/openai-ws-connect.mjs +196 -0
  91. package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +74 -9
  92. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +14 -1
  93. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +2 -0
  94. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth-login.mjs +194 -0
  95. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth-tokens.mjs +353 -0
  96. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +293 -0
  97. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +33 -100
  98. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +23 -14
  99. package/src/runtime/agent/orchestrator/providers/registry.mjs +41 -27
  100. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +98 -4
  101. package/src/runtime/agent/orchestrator/runtime-core/context-status-shape.mjs +4 -0
  102. package/src/runtime/agent/orchestrator/runtime-core/extension-scopes.mjs +6 -4
  103. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +15 -8
  104. package/src/runtime/agent/orchestrator/runtime-core/plugin-mcp.mjs +1 -0
  105. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +12 -6
  106. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +32 -5
  107. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +10 -4
  108. package/src/runtime/agent/orchestrator/runtime-core/workflow/agents.mjs +4 -1
  109. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +50 -20
  110. package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +2 -0
  111. package/src/runtime/agent/orchestrator/session/agent-home.d.mts +4 -0
  112. package/src/runtime/agent/orchestrator/session/agent-home.mjs +33 -0
  113. package/src/runtime/agent/orchestrator/session/agent-mode.mjs +62 -0
  114. package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +15 -3
  115. package/src/runtime/agent/orchestrator/session/agent-room-supervisor.d.mts +31 -0
  116. package/src/runtime/agent/orchestrator/session/agent-room-supervisor.mjs +241 -0
  117. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +162 -0
  118. package/src/runtime/agent/orchestrator/session/agent-room.mjs +641 -0
  119. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +7 -1
  120. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +74 -13
  121. package/src/runtime/agent/orchestrator/session/compact/forked-summary.mjs +102 -0
  122. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +8 -2
  123. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +16 -0
  124. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +2 -0
  125. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +6 -2
  126. package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +165 -0
  127. package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +95 -0
  128. package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +221 -0
  129. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +195 -0
  130. package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +167 -0
  131. package/src/runtime/agent/orchestrator/session/lifecycle-scan.mjs +9 -0
  132. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +3 -1
  133. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +39 -2
  134. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +10 -0
  135. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +16 -1
  136. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +82 -33
  137. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +11 -4
  138. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +5 -4
  139. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +13 -3
  140. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +7 -0
  141. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +1 -0
  142. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +6 -1
  143. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +6 -0
  144. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +2 -0
  145. package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +13 -5
  146. package/src/runtime/agent/orchestrator/session/manager/pending-lifecycle-epoch.mjs +0 -8
  147. package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +10 -7
  148. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +62 -22
  149. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +44 -16
  150. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +22 -5
  151. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +23 -1
  152. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +81 -34
  153. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +39 -4
  154. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +27 -5
  155. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +55 -8
  156. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +16 -0
  157. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +3 -2
  158. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +6 -0
  159. package/src/runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs +58 -0
  160. package/src/runtime/agent/orchestrator/session/manager.mjs +2 -2
  161. package/src/runtime/agent/orchestrator/session/mixy-name.mjs +24 -0
  162. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +32 -5
  163. package/src/runtime/agent/orchestrator/session/request-fork.mjs +47 -0
  164. package/src/runtime/agent/orchestrator/session/routine-result.d.mts +70 -0
  165. package/src/runtime/agent/orchestrator/session/routine-result.mjs +277 -0
  166. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +16 -1
  167. package/src/runtime/agent/orchestrator/session/side-question.mjs +5 -43
  168. package/src/runtime/agent/orchestrator/session/store/fs-probe.mjs +10 -0
  169. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +73 -6
  170. package/src/runtime/agent/orchestrator/session/store/load-session.mjs +40 -0
  171. package/src/runtime/agent/orchestrator/session/store/save-fault.mjs +15 -0
  172. package/src/runtime/agent/orchestrator/session/store/session-paths.mjs +12 -0
  173. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +8 -0
  174. package/src/runtime/agent/orchestrator/session/store-agent-worker-header.mjs +36 -0
  175. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +258 -43
  176. package/src/runtime/agent/orchestrator/session/store-record-strict-scan.mjs +325 -0
  177. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +84 -21
  178. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +44 -12
  179. package/src/runtime/agent/orchestrator/session/store-summary-last-message.mjs +46 -0
  180. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +46 -30
  181. package/src/runtime/agent/orchestrator/session/store-summary-visibility.mjs +0 -4
  182. package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +144 -45
  183. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +32 -13
  184. package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +364 -38
  185. package/src/runtime/agent/orchestrator/session/store.mjs +9 -2
  186. package/src/runtime/agent/orchestrator/session/task-wait-control.mjs +43 -12
  187. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +23 -6
  188. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +44 -1
  189. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +12 -6
  190. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +13 -7
  191. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/bashism-rewrite.mjs +1 -1
  192. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/benign-exit.mjs +7 -1
  193. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +40 -7
  194. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/deadline-plan.mjs +37 -34
  195. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/inline-hoist.mjs +1 -1
  196. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +0 -4
  197. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +6 -0
  198. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +29 -27
  199. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +1 -1
  200. package/src/runtime/agent/orchestrator/tools/builtin/find-files-tool.mjs +28 -11
  201. package/src/runtime/agent/orchestrator/tools/builtin/git-command-policy.mjs +12 -3
  202. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +203 -101
  203. package/src/runtime/agent/orchestrator/tools/builtin/git-repo-rw-lock.mjs +90 -41
  204. package/src/runtime/agent/orchestrator/tools/builtin/lib/list-helpers.mjs +17 -1
  205. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-delivery.mjs +199 -0
  206. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +12 -0
  207. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +165 -39
  208. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +25 -13
  209. package/src/runtime/agent/orchestrator/tools/builtin/native-search-client.mjs +113 -5
  210. package/src/runtime/agent/orchestrator/tools/builtin/read-batch.mjs +7 -6
  211. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +19 -4
  212. package/src/runtime/agent/orchestrator/tools/builtin/read-line-collector.mjs +5 -3
  213. package/src/runtime/agent/orchestrator/tools/builtin/read-single-render.mjs +25 -7
  214. package/src/runtime/agent/orchestrator/tools/builtin/read-special-files.mjs +2 -1
  215. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-render.mjs +3 -1
  216. package/src/runtime/agent/orchestrator/tools/builtin/search-glob-tool.mjs +12 -5
  217. package/src/runtime/agent/orchestrator/tools/builtin/search-grep-tool.mjs +61 -22
  218. package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +32 -8
  219. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +193 -19
  220. package/src/runtime/agent/orchestrator/tools/builtin/shell-direct-exe.mjs +57 -7
  221. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +123 -32
  222. package/src/runtime/agent/orchestrator/tools/builtin/shell-lossless-compact.mjs +26 -1
  223. package/src/runtime/agent/orchestrator/tools/builtin/shell-output.mjs +13 -28
  224. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +90 -11
  225. package/src/runtime/agent/orchestrator/tools/builtin/wait-budgets.mjs +23 -0
  226. package/src/runtime/agent/orchestrator/tools/builtin.mjs +54 -10
  227. package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +22 -28
  228. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +11 -7
  229. package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +126 -9
  230. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  231. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +15 -6
  232. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +64 -2
  233. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +10 -2
  234. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promotion-results.mjs +13 -3
  235. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +8 -0
  236. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +6 -1
  237. package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +1 -1
  238. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +104 -55
  239. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +7 -2
  240. package/src/runtime/agent/orchestrator/tools/shell-powershell.mjs +39 -23
  241. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +6 -2
  242. package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
  243. package/src/runtime/attachments/office-extract.mjs +11 -9
  244. package/src/runtime/browser-bridge/client.mjs +24 -0
  245. package/src/runtime/channels/lib/scheduler.mjs +40 -12
  246. package/src/runtime/channels/lib/schedules-db.mjs +71 -12
  247. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +36 -16
  248. package/src/runtime/channels/lib/webhook.mjs +0 -1
  249. package/src/runtime/channels/lib/webhooks-db.mjs +100 -10
  250. package/src/runtime/channels/lib/worker-main.mjs +17 -20
  251. package/src/runtime/computer-bridge/client.mjs +28 -1
  252. package/src/runtime/connectors/gmail-app-password.mjs +690 -0
  253. package/src/runtime/connectors/google-mcp.mjs +446 -0
  254. package/src/runtime/memory/lib/core-memory-access.mjs +69 -0
  255. package/src/runtime/memory/lib/core-memory-file.mjs +16 -8
  256. package/src/runtime/memory/lib/core-memory-index.mjs +15 -9
  257. package/src/runtime/memory/lib/core-memory-management.mjs +10 -4
  258. package/src/runtime/memory/lib/core-memory-store.mjs +53 -30
  259. package/src/runtime/memory/lib/core-memory-uniqueness.mjs +10 -6
  260. package/src/runtime/memory/lib/embedding-tokenizer.mjs +32 -18
  261. package/src/runtime/memory/lib/http-router/session-routes.mjs +3 -2
  262. package/src/runtime/memory/lib/memory-action-handlers/core-actions.mjs +44 -14
  263. package/src/runtime/memory/lib/memory-schema/core-and-meta.mjs +11 -0
  264. package/src/runtime/memory/lib/memory.mjs +7 -1
  265. package/src/runtime/memory/lib/query-core-recall.mjs +9 -1
  266. package/src/runtime/memory/lib/query-hybrid-search.mjs +2 -0
  267. package/src/runtime/memory/lib/runtime-fetcher.mjs +1 -1
  268. package/src/runtime/memory/lib/tool-call-handler.mjs +9 -5
  269. package/src/runtime/memory/tool-defs.mjs +5 -0
  270. package/src/runtime/office/authoring/pptx-script-normalize.mjs +11 -8
  271. package/src/runtime/office/core/tabular.mjs +1 -1
  272. package/src/runtime/office/design/library/design-template-inspect.mjs +7 -4
  273. package/src/runtime/office/portable/docx-formatting.mjs +1 -1
  274. package/src/runtime/office/portable/docx-runs.mjs +1 -1
  275. package/src/runtime/office/portable/docx-tracked-edits.mjs +2 -2
  276. package/src/runtime/office/portable/portable-docx-edits.mjs +11 -10
  277. package/src/runtime/office/portable/portable-docx-operations.mjs +21 -17
  278. package/src/runtime/office/portable/portable-docx-parts.mjs +15 -9
  279. package/src/runtime/office/portable/portable-docx-styles.mjs +4 -1
  280. package/src/runtime/office/portable/portable-docx-xml.mjs +9 -9
  281. package/src/runtime/office/portable/portable-opc.mjs +27 -13
  282. package/src/runtime/office/portable/portable-pivot.mjs +3 -3
  283. package/src/runtime/office/portable/portable-pptx-chart.mjs +3 -3
  284. package/src/runtime/office/portable/portable-pptx-charts.mjs +24 -18
  285. package/src/runtime/office/portable/portable-pptx-core.mjs +5 -5
  286. package/src/runtime/office/portable/portable-pptx-deck.mjs +8 -4
  287. package/src/runtime/office/portable/portable-pptx-package.mjs +7 -4
  288. package/src/runtime/office/portable/portable-pptx-shapes.mjs +18 -9
  289. package/src/runtime/office/portable/portable-sheet-parts.mjs +9 -3
  290. package/src/runtime/office/portable/portable-sheet-xml.mjs +5 -5
  291. package/src/runtime/office/portable/portable-xlsx-charts.mjs +4 -1
  292. package/src/runtime/office/portable/portable-xlsx-drawings.mjs +10 -6
  293. package/src/runtime/office/portable/portable-xlsx-operations.mjs +8 -5
  294. package/src/runtime/office/portable/portable-xlsx-pivot-ops.mjs +1 -1
  295. package/src/runtime/office/portable/portable-xlsx-reference-shift.mjs +11 -7
  296. package/src/runtime/office/portable/portable-xlsx-sheet-edits.mjs +6 -3
  297. package/src/runtime/office/portable/portable-xml.mjs +1 -1
  298. package/src/runtime/shared/agent-avatar-sprites.mjs +445 -0
  299. package/src/runtime/shared/agent-avatar.d.mts +64 -0
  300. package/src/runtime/shared/agent-avatar.mjs +320 -0
  301. package/src/runtime/shared/agent-route-config.d.mts +3 -0
  302. package/src/runtime/shared/agent-route-config.mjs +16 -0
  303. package/src/runtime/shared/atomic-file.mjs +36 -14
  304. package/src/runtime/shared/background-tasks.mjs +60 -20
  305. package/src/runtime/shared/child-spawn-gate.mjs +26 -16
  306. package/src/runtime/shared/config.mjs +8 -11
  307. package/src/runtime/shared/connector-accounts.mjs +15 -0
  308. package/src/runtime/shared/connector-catalog.d.mts +52 -0
  309. package/src/runtime/shared/connector-catalog.mjs +230 -0
  310. package/src/runtime/shared/connector-triggers.d.mts +3 -0
  311. package/src/runtime/shared/connector-triggers.mjs +43 -0
  312. package/src/runtime/shared/file-lock.mjs +7 -1
  313. package/src/runtime/shared/file-permissions-worker.mjs +38 -0
  314. package/src/runtime/shared/file-permissions.d.mts +19 -4
  315. package/src/runtime/shared/file-permissions.mjs +310 -4
  316. package/src/runtime/shared/git-runner-worker.mjs +6 -78
  317. package/src/runtime/shared/google-oauth-client.mjs +24 -0
  318. package/src/runtime/shared/held-request-host.d.mts +12 -0
  319. package/src/runtime/shared/held-request-host.mjs +71 -0
  320. package/src/runtime/shared/llm/http-agent.mjs +7 -3
  321. package/src/runtime/shared/llm/provider-catalog-registry.mjs +10 -0
  322. package/src/runtime/shared/llm/usage-accounting.mjs +2 -0
  323. package/src/runtime/shared/llm/usage-ledger-import.mjs +32 -3
  324. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +12 -5
  325. package/src/runtime/shared/llm/usage-ledger-worker.mjs +1 -1
  326. package/src/runtime/shared/llm/usage-ledger.mjs +20 -5
  327. package/src/runtime/shared/memory-snapshot.mjs +5 -1
  328. package/src/runtime/shared/notify-trace.mjs +8 -1
  329. package/src/runtime/shared/plain-preview.d.mts +1 -0
  330. package/src/runtime/shared/plain-preview.mjs +28 -0
  331. package/src/runtime/shared/pristine-execution-contract.json +5 -1
  332. package/src/runtime/shared/process-runner-worker.mjs +7 -0
  333. package/src/runtime/shared/process-runner.mjs +38 -0
  334. package/src/runtime/shared/provider-accounts.mjs +2 -1
  335. package/src/runtime/shared/provider-api-key.mjs +0 -1
  336. package/src/runtime/shared/read-row-numbers.mjs +1 -1
  337. package/src/runtime/shared/resource-admission.mjs +60 -18
  338. package/src/runtime/shared/routine-limits.d.mts +11 -0
  339. package/src/runtime/shared/routine-limits.mjs +21 -0
  340. package/src/runtime/shared/routine-trigger.d.mts +10 -0
  341. package/src/runtime/shared/routine-trigger.mjs +44 -0
  342. package/src/runtime/shared/run-child.mjs +84 -0
  343. package/src/runtime/shared/schedule-model-ref.mjs +9 -10
  344. package/src/runtime/shared/session-activity-signal.mjs +23 -0
  345. package/src/runtime/shared/shell-output-summary.mjs +23 -0
  346. package/src/runtime/shared/singleton-owner.mjs +126 -42
  347. package/src/runtime/shared/slow-span.mjs +4 -12
  348. package/src/runtime/shared/statusline/statusline-segments.mjs +13 -1
  349. package/src/runtime/shared/tool-output-limit.mjs +4 -2
  350. package/src/runtime/shared/tool-output-marker.mjs +58 -0
  351. package/src/runtime/shared/transcript-metadata.mjs +10 -0
  352. package/src/runtime/shared/turn-changes.mjs +0 -8
  353. package/src/runtime/shared/usage-readout-totals.mjs +56 -0
  354. package/src/runtime/shared/user-data-guard.mjs +131 -34
  355. package/src/runtime/shared/worktrees/activity-gate.mjs +33 -8
  356. package/src/runtime/shared/worktrees/git-head.mjs +20 -2
  357. package/src/runtime/shared/worktrees/lock.mjs +3 -2
  358. package/src/runtime/terminal-bridge/tool-defs.mjs +1 -1
  359. package/src/runtime/tidy/runners/biome.mjs +3 -1
  360. package/src/runtime/tidy/shadow.mjs +2 -1
  361. package/src/runtime/web-search/index.mjs +5 -7
  362. package/src/runtime/web-search/lib/formatter.mjs +42 -6
  363. package/src/runtime/web-search/tool-defs.mjs +6 -1
  364. package/src/session-runtime/agent-home-delivery.mjs +459 -0
  365. package/src/session-runtime/agent-profile-changes.mjs +21 -0
  366. package/src/session-runtime/agent-room-delivery.mjs +92 -0
  367. package/src/session-runtime/agent-task-sessions.mjs +200 -0
  368. package/src/session-runtime/boot/apis.mjs +50 -18
  369. package/src/session-runtime/boot/facade.mjs +5 -8
  370. package/src/session-runtime/boot/infrastructure.mjs +28 -17
  371. package/src/session-runtime/boot/tools.mjs +3 -0
  372. package/src/session-runtime/channel-config-api.mjs +53 -5
  373. package/src/session-runtime/cwd-plugins/core-memory-context.mjs +36 -20
  374. package/src/session-runtime/cwd-plugins/plugin-status.mjs +6 -1
  375. package/src/session-runtime/held-requests.mjs +228 -0
  376. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +121 -0
  377. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +5 -1
  378. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +31 -2
  379. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +31 -2
  380. package/src/session-runtime/internal-tool-executor.mjs +2 -0
  381. package/src/session-runtime/lifecycle/session-catalog.mjs +9 -0
  382. package/src/session-runtime/lifecycle/session-switch/context-switch.mjs +4 -3
  383. package/src/session-runtime/lifecycle/session-switch/resume.mjs +11 -4
  384. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +3 -3
  385. package/src/session-runtime/lifecycle/shared.mjs +25 -2
  386. package/src/session-runtime/lifecycle/teardown/session-close.mjs +2 -0
  387. package/src/session-runtime/lifecycle/teardown.mjs +5 -2
  388. package/src/session-runtime/lifecycle-api.mjs +3 -1
  389. package/src/session-runtime/mcp-glue/server-catalog.mjs +8 -0
  390. package/src/session-runtime/mcp-glue/server-input.mjs +3 -0
  391. package/src/session-runtime/mcp-oauth-login.mjs +112 -15
  392. package/src/session-runtime/model-route/set-route.mjs +14 -3
  393. package/src/session-runtime/owned-automation-run.mjs +229 -0
  394. package/src/session-runtime/provider-auth/login.mjs +10 -6
  395. package/src/session-runtime/provider-auth/setup.mjs +19 -2
  396. package/src/session-runtime/provider-catalog-cache.mjs +101 -25
  397. package/src/session-runtime/provider-models/catalog-load.mjs +14 -3
  398. package/src/session-runtime/provider-models/row-hydration.mjs +4 -0
  399. package/src/session-runtime/provider-models.mjs +76 -10
  400. package/src/session-runtime/provider-readiness.mjs +4 -0
  401. package/src/session-runtime/resource-api.mjs +5 -0
  402. package/src/session-runtime/resource-mcp-api.mjs +107 -13
  403. package/src/session-runtime/resource-skills-api.mjs +12 -0
  404. package/src/session-runtime/room-member-gate.mjs +48 -0
  405. package/src/session-runtime/routine-home-turn.mjs +156 -0
  406. package/src/session-runtime/routine-owner.mjs +48 -0
  407. package/src/session-runtime/schedule-session-run.mjs +30 -64
  408. package/src/session-runtime/services/agent-tool/close-flow.mjs +2 -1
  409. package/src/session-runtime/services/agent-tool/helpers.mjs +10 -0
  410. package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +10 -2
  411. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +13 -4
  412. package/src/session-runtime/services/agent-tool/notify.mjs +15 -4
  413. package/src/session-runtime/services/agent-tool/restart-notify.mjs +134 -0
  414. package/src/session-runtime/services/agent-tool/send-flow.mjs +24 -1
  415. package/src/session-runtime/services/agent-tool/spawn-flow/deferred-spawn.mjs +2 -1
  416. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +4 -3
  417. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +19 -4
  418. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +2 -0
  419. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +5 -1
  420. package/src/session-runtime/services/agent-tool/tag-registry/tag-lookup.mjs +8 -3
  421. package/src/session-runtime/services/agent-tool/tag-registry.mjs +3 -0
  422. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +4 -0
  423. package/src/session-runtime/services/agent-tool/worker-index.mjs +44 -10
  424. package/src/session-runtime/services/agent-tool.mjs +20 -0
  425. package/src/session-runtime/services/channel-admin.mjs +93 -24
  426. package/src/session-runtime/services/memory-access.mjs +37 -0
  427. package/src/session-runtime/services/provider-admin.mjs +166 -59
  428. package/src/session-runtime/services/schedule-access.mjs +91 -0
  429. package/src/session-runtime/services/usage-dashboard-model.mjs +2 -2
  430. package/src/session-runtime/services/usage-dashboard.mjs +27 -69
  431. package/src/session-runtime/session-create/session-options.mjs +34 -7
  432. package/src/session-runtime/session-hooks.mjs +16 -8
  433. package/src/session-runtime/setup-tool/executor.mjs +68 -6
  434. package/src/session-runtime/setup-tool/extended-actions.mjs +72 -14
  435. package/src/session-runtime/setup-tool/settings-contract.mjs +8 -6
  436. package/src/session-runtime/setup-tool/tool-defs.mjs +8 -0
  437. package/src/session-runtime/skills-api.mjs +16 -1
  438. package/src/session-runtime/tool-policy-refresh.mjs +238 -29
  439. package/src/session-runtime/turn/session-ops.mjs +10 -3
  440. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +11 -2
  441. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +3 -0
  442. package/src/session-runtime/usage-stats-api.mjs +6 -1
  443. package/src/session-runtime/webhook-session-run.mjs +49 -67
  444. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +239 -0
  445. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +556 -22
  446. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +11 -1
  447. package/src/session-runtime/workflow-agents-api.mjs +4 -1
  448. package/src/standalone/channel-transport/http-routes.mjs +10 -9
  449. package/src/standalone/daemon-agent-control.mjs +1 -8
  450. package/src/standalone/daemon-desktop-runtime.mjs +20 -7
  451. package/src/standalone/daemon-owner.mjs +117 -25
  452. package/src/standalone/daemon-session-control.mjs +11 -2
  453. package/src/standalone/daemon.mjs +61 -17
  454. package/src/standalone/session-call-cache.mjs +6 -0
  455. package/src/standalone/session-protocol.mjs +28 -1
  456. package/src/standalone/session-service/retention/busy.mjs +7 -2
  457. package/src/standalone/session-service/session-calls/session-turns.mjs +9 -0
  458. package/src/standalone/session-service.mjs +19 -0
  459. package/src/standalone/session-transport/routes.mjs +7 -6
  460. package/src/tui/app/model-options.mjs +39 -2
  461. package/src/tui/app/model-picker.mjs +16 -2
  462. package/src/tui/app/provider-setup-picker.mjs +1 -2
  463. package/src/tui/app/slash-commands.mjs +20 -0
  464. package/src/tui/dist/index.mjs +487 -128
  465. package/src/tui/session/context-state.mjs +6 -1
  466. package/src/tui/session/notice-surface.mjs +35 -4
  467. package/src/tui/session/notice-text.mjs +0 -1
  468. package/src/tui/session/queue-helpers.mjs +2 -1
  469. package/src/tui/session/session-api/extensions.mjs +4 -0
  470. package/src/tui/session/session-api/intake/submission.mjs +12 -13
  471. package/src/tui/session/session-api/integrations.mjs +9 -5
  472. package/src/tui/session/session-api/lifecycle/session-reset.mjs +13 -3
  473. package/src/tui/session/session-api/lifecycle.mjs +17 -1
  474. package/src/tui/session/session-api/routes.mjs +48 -3
  475. package/src/tui/session/session-flow/drain.mjs +20 -3
  476. package/src/tui/session/session-flow/queue/entry-shape.mjs +2 -1
  477. package/src/tui/session/session-flow/queue/take-entries.mjs +3 -2
  478. package/src/tui/session/session-flow/steering.mjs +104 -24
  479. package/src/tui/session/session-flow.mjs +2 -0
  480. package/src/tui/session/tool-approval.mjs +26 -5
  481. package/src/tui/session/transcript-intake.mjs +6 -2
  482. package/src/tui/session/transcript-spill.mjs +5 -1
  483. package/src/tui/session/tui-steering-persist.mjs +65 -42
  484. package/src/tui/session/turn-live-call.mjs +56 -0
  485. package/src/tui/session/turn-stream.mjs +33 -0
  486. package/src/tui/session/turn.mjs +50 -7
  487. package/src/ui/statusline.mjs +1 -6
  488. package/src/ui/streaming-markdown-heal.mjs +24 -7
  489. package/src/vendor/statusline/bin/statusline-route.mjs +0 -1
  490. package/src/vendor/statusline/src/gateway/route-meta.mjs +0 -1
  491. package/src/workflows/default/WORKFLOW.md +9 -13
  492. package/src/session-runtime/automation-agents.mjs +0 -94
  493. package/src/session-runtime/automation-workflow.mjs +0 -59
@@ -328,7 +328,14 @@ function readAll() {
328
328
  // marker yet) is a recovery case too; without a verifiable backup reads stay
329
329
  // empty and RMW writes refuse (see readAllForRmW).
330
330
  if (isUserDataRecoveryExpected(resolvePluginData())) {
331
- const restored = loadLatestMixdogConfigFromBackup(resolvePluginData());
331
+ let restored = null;
332
+ try {
333
+ restored = loadLatestMixdogConfigFromBackup(resolvePluginData());
334
+ } catch (err) {
335
+ // A transient backup read failure: this read stays empty and the next
336
+ // one retries (an RMW write refuses instead).
337
+ process.stderr.write(`[config] backup restore lookup failed: ${err.message}\n`);
338
+ }
332
339
  if (restored && isPlainObject(restored)) {
333
340
  const config = canonicalizeUnifiedConfig(restored);
334
341
  persistRestoredConfig(config);
@@ -608,7 +615,6 @@ export function updateSectionAsync(section, updater) {
608
615
  export const SECRET_ACCOUNTS = Object.freeze({
609
616
  agentApiKey: (provider) => `agent.${provider}.apiKey`,
610
617
  openaiUsageSessionKey: 'agent.openai.usageSessionKey',
611
- opencodeGoConsoleKey: 'agent.opencode-go.consoleKey',
612
618
  });
613
619
 
614
620
  // ── Secret-aware getters ─────────────────────────────────────────────────────
@@ -639,15 +645,6 @@ export function getOpenAIUsageSessionKey() {
639
645
  );
640
646
  }
641
647
 
642
- export function getOpenCodeGoConsoleKey() {
643
- return (
644
- process.env.OPENCODE_CONSOLE_API_KEY ||
645
- process.env.OPENCODE_GO_CONSOLE_API_KEY ||
646
- process.env.MIXDOG_OPENCODE_CONSOLE_API_KEY ||
647
- _readSecret(SECRET_ACCOUNTS.opencodeGoConsoleKey)
648
- );
649
- }
650
-
651
648
  /**
652
649
  * Persist a secret to the OS keychain. Throws on failure.
653
650
  * Never writes to mixdog-config.json.
@@ -0,0 +1,15 @@
1
+ // What a multi-account connector server tells the model about itself (MCP
2
+ // `instructions`): the account it acts for, and to ask which one when the
3
+ // user did not say and several are connected. The deferred-tool manifest
4
+ // (context/deferred-tools.mjs) reads the leading "Account: <address>" back.
5
+
6
+ /** The MCP instructions of a `service` server acting for `account` ('' when unknown). */
7
+ export function accountInstructions(service, account) {
8
+ if (!account) return undefined;
9
+ return `Account: ${account}. This server acts only for this ${service} account; other ${service} accounts are separate servers. If several are connected and the user did not name one, ask which account before acting.`;
10
+ }
11
+
12
+ /** The account a server's instructions name, or ''. */
13
+ export function accountOfInstructions(instructions) {
14
+ return /^Account: (\S+?)\. /.exec(String(instructions || ''))?.[1] || '';
15
+ }
@@ -0,0 +1,52 @@
1
+ export type ConnectorBackend =
2
+ | {
3
+ kind: 'oauth';
4
+ url: string;
5
+ /** A pre-registered client the runtime supplies instead of registration. */
6
+ oauthClient?: 'google';
7
+ scopes?: readonly string[];
8
+ askTools?: readonly string[];
9
+ }
10
+ | {
11
+ kind: 'apiKey';
12
+ url?: string;
13
+ header?: string;
14
+ prefix?: string;
15
+ command?: string;
16
+ args?: readonly string[];
17
+ env?: string;
18
+ keyUrl: string;
19
+ placeholder?: string;
20
+ /** Tools that ask before they run unless the agent set them. */
21
+ askTools?: readonly string[];
22
+ }
23
+ | { kind: 'builtin'; feature: string };
24
+
25
+ export interface ConnectorCatalogEntry {
26
+ id: string;
27
+ name: string;
28
+ backend: ConnectorBackend;
29
+ /** Offered only after the user enters their own Google OAuth client. */
30
+ ownKey?: boolean;
31
+ /** Curated deferred-tool manifest line (connector-triggers.mjs). */
32
+ trigger: string;
33
+ }
34
+
35
+ export const CONNECTOR_CATALOG: readonly ConnectorCatalogEntry[];
36
+ export const GOOGLE_SCOPES: Readonly<Record<'gmail' | 'calendar' | 'drive', readonly string[]>>;
37
+ export const CONNECTOR_IDS: readonly string[];
38
+ export function connectorById(id: unknown): ConnectorCatalogEntry | null;
39
+ export function connectorOfServer(cfg: unknown): string;
40
+ export function connectorToolDefault(connectorId: string, tool: string): 'auto' | 'needs_approval';
41
+ export function connectorServerInput(
42
+ entry: ConnectorCatalogEntry,
43
+ name: string,
44
+ key?: string,
45
+ options?: { extraAccount?: boolean }
46
+ ): Record<string, unknown>;
47
+ export function connectorMultiAccount(entry: ConnectorCatalogEntry | null | undefined): boolean;
48
+ export const GMAIL_APP_PASSWORD: Readonly<{ url: string; accountHeader: string; helpUrl: string }>;
49
+ export function gmailAddress(value: unknown): string;
50
+ export function gmailAppPasswordValue(value: unknown): string;
51
+ export function gmailAppPasswordAccount(cfg: unknown): string;
52
+ export function gmailAppPasswordServerInput(name: string, email: string, password: string): Record<string, unknown>;
@@ -0,0 +1,230 @@
1
+ // The built-in connector catalog: services a user connects with one click
2
+ // from Desktop (Extensions → 커넥터) or from a chat card the setup tool's
3
+ // `connect_connector` action surfaces. Each entry declares its backend
4
+ // explicitly:
5
+ // oauth — a remote MCP server that signs in with MCP OAuth;
6
+ // apiKey — an MCP server that takes one key (an HTTP header or a stdio
7
+ // environment variable);
8
+ // builtin — a Mixdog built-in feature (GitHub is the GitHub CLI of the
9
+ // Git & GitHub built-in, never a GitHub MCP);
10
+ // A connected catalog service is an ordinary user MCP server whose config
11
+ // carries `connector: <id>`. An existing custom server is never adopted into
12
+ // the catalog row.
13
+
14
+ import { connectorTrigger } from './connector-triggers.mjs';
15
+
16
+ // `oauthClient` names a pre-registered client the runtime supplies
17
+ // (mcp/oauth-client.mjs: 'google') in place of dynamic client registration;
18
+ // `scopes` are then the ones requested.
19
+ const oauth = (url, client = {}) => Object.freeze({ kind: 'oauth', url, ...client });
20
+
21
+ const GOOGLE_SCOPE = 'https://www.googleapis.com/auth';
22
+ // The Google access each built-in connector asks for: the one place to widen
23
+ // it (e.g. gmail.readonly). openid + email name the signed-in account.
24
+ export const GOOGLE_SCOPES = Object.freeze({
25
+ gmail: Object.freeze(['openid', 'email', `${GOOGLE_SCOPE}/gmail.send`]),
26
+ calendar: Object.freeze(['openid', 'email', `${GOOGLE_SCOPE}/calendar.events`]),
27
+ drive: Object.freeze(['openid', 'email', `${GOOGLE_SCOPE}/drive.file`]),
28
+ });
29
+ // Gmail / Calendar / Drive are Mixdog's built-in Google connectors
30
+ // (runtime/connectors/google-mcp.mjs), answered in-process at a reserved
31
+ // address and signed in with Mixdog's Google client. `askTools` ask before
32
+ // they run unless the agent set them.
33
+ const google = (service, scopes, askTools) =>
34
+ oauth(`https://${service}.mixdog.invalid/mcp`, { oauthClient: 'google', scopes, askTools });
35
+ // Gmail can also connect with a Google app password instead of the sign-in:
36
+ // IMAP and SMTP over TLS (runtime/connectors/gmail-app-password.mjs), answered
37
+ // in-process at its own reserved address. Its server is still the Gmail
38
+ // connector (`connector: 'gmail'`, so Gmail's askTools apply to its tools of
39
+ // the same names); the account rides in a header, the app password lives only
40
+ // in the keychain.
41
+ export const GMAIL_APP_PASSWORD = Object.freeze({
42
+ url: 'https://gmail-imap.mixdog.invalid/mcp',
43
+ accountHeader: 'X-Mixdog-Gmail-Account',
44
+ helpUrl: 'https://myaccount.google.com/apppasswords',
45
+ });
46
+ const apiKey = (spec) => Object.freeze({ kind: 'apiKey', ...spec });
47
+
48
+ export const CONNECTOR_CATALOG = Object.freeze(
49
+ [
50
+ { id: 'airtable', name: 'Airtable', backend: oauth('https://mcp.airtable.com/mcp') },
51
+ { id: 'confluence', name: 'Confluence', backend: oauth('https://mcp.atlassian.com/v1/mcp/authv2') },
52
+ { id: 'dropbox', name: 'Dropbox', backend: oauth('https://mcp.dropbox.com/mcp') },
53
+ { id: 'github', name: 'GitHub', backend: Object.freeze({ kind: 'builtin', feature: 'git' }) },
54
+ {
55
+ id: 'gmail',
56
+ name: 'Gmail',
57
+ backend: google('gmail', GOOGLE_SCOPES.gmail, ['send_email']),
58
+ },
59
+ // Calendar and Drive are offered only to a user who entered their own
60
+ // Google OAuth client (Connectors → add custom → 내 Google 키): `ownKey`.
61
+ // Existing connections keep working; Mixy and the chat cards never offer them.
62
+ {
63
+ id: 'google-calendar',
64
+ name: 'Google Calendar',
65
+ ownKey: true,
66
+ backend: google('calendar', GOOGLE_SCOPES.calendar, ['delete_event']),
67
+ },
68
+ {
69
+ id: 'google-drive',
70
+ name: 'Google Drive',
71
+ ownKey: true,
72
+ backend: google('drive', GOOGLE_SCOPES.drive, []),
73
+ },
74
+ {
75
+ id: 'hugging-face',
76
+ name: 'Hugging Face',
77
+ backend: apiKey({
78
+ url: 'https://huggingface.co/mcp',
79
+ header: 'Authorization',
80
+ prefix: 'Bearer ',
81
+ keyUrl: 'https://huggingface.co/settings/tokens',
82
+ }),
83
+ },
84
+ { id: 'jira', name: 'Jira', backend: oauth('https://mcp.atlassian.com/v1/mcp/authv2') },
85
+ { id: 'linear', name: 'Linear', backend: oauth('https://mcp.linear.app/mcp') },
86
+ { id: 'notion', name: 'Notion', backend: oauth('https://mcp.notion.com/mcp') },
87
+ {
88
+ id: 'postgres',
89
+ name: 'Postgres',
90
+ backend: apiKey({
91
+ command: 'npx',
92
+ args: ['-y', '@microsoft/postgres-mcp@0.2.0', 'run'],
93
+ env: 'POSTGRES_MCP_CONNECTION_STRING',
94
+ keyUrl: 'https://github.com/microsoft/postgres-mcp/blob/main/USAGE.md',
95
+ placeholder: 'postgresql://user:password@host:5432/db',
96
+ }),
97
+ },
98
+ { id: 'sentry', name: 'Sentry', backend: oauth('https://mcp.sentry.dev/mcp') },
99
+ {
100
+ id: 'stripe',
101
+ name: 'Stripe',
102
+ backend: apiKey({
103
+ url: 'https://mcp.stripe.com',
104
+ header: 'Authorization',
105
+ prefix: 'Bearer ',
106
+ keyUrl: 'https://dashboard.stripe.com/apikeys',
107
+ placeholder: 'rk_live_…',
108
+ }),
109
+ },
110
+ { id: 'supabase', name: 'Supabase', backend: oauth('https://mcp.supabase.com/mcp') },
111
+ { id: 'trello', name: 'Trello', backend: oauth('https://mcp.trello.com/v1') },
112
+ { id: 'vercel', name: 'Vercel', backend: oauth('https://mcp.vercel.com') },
113
+ // The ids are the deferred-tool manifest's curated keys: a server named by
114
+ // its id gets that one-line trigger (connector-triggers.mjs).
115
+ ].map((entry) => Object.freeze({ ...entry, trigger: connectorTrigger(entry.id) }))
116
+ );
117
+
118
+ /** The ids offered to everyone (the setup tool's `connect_connector`): the
119
+ * catalog minus the own-key-only Google services. */
120
+ export const CONNECTOR_IDS = Object.freeze(CONNECTOR_CATALOG.filter((entry) => !entry.ownKey).map((entry) => entry.id));
121
+
122
+ /** The catalog entry for `id`, or null. */
123
+ export function connectorById(id) {
124
+ return CONNECTOR_CATALOG.find((entry) => entry.id === id) || null;
125
+ }
126
+
127
+ const urlKey = (url) =>
128
+ String(url || '')
129
+ .trim()
130
+ .replace(/\/+$/, '')
131
+ .toLowerCase();
132
+
133
+ /** The catalog id a configured MCP server connects: its `connector` marker,
134
+ * '' for none (or a marker the catalog no longer knows). */
135
+ export function connectorOfServer(cfg) {
136
+ const marker = typeof cfg?.connector === 'string' ? cfg.connector : '';
137
+ return connectorById(marker) ? marker : '';
138
+ }
139
+
140
+ /** The permission a catalog connector's tool has when nothing set its own:
141
+ * `needs_approval` for the high-risk tools it names, else `auto`. */
142
+ export function connectorToolDefault(connectorId, tool) {
143
+ const backend = connectorById(connectorId)?.backend;
144
+ return backend?.askTools?.includes(tool) ? 'needs_approval' : 'auto';
145
+ }
146
+
147
+ const EMAIL = /^[^\s@<>(),;:"]+@[^\s@<>(),;:"]+\.[^\s@<>(),;:".]+$/;
148
+
149
+ /** A Gmail address as typed (trimmed, lowercased), or '' when it is none. */
150
+ export function gmailAddress(value) {
151
+ const address = String(value ?? '')
152
+ .trim()
153
+ .toLowerCase();
154
+ return EMAIL.test(address) ? address : '';
155
+ }
156
+
157
+ /** A Google app password as typed, its spaces removed; '' unless it then
158
+ * has the 16 characters Google issues. */
159
+ export function gmailAppPasswordValue(value) {
160
+ const password = String(value ?? '').replace(/\s+/g, '');
161
+ return password.length === 16 ? password : '';
162
+ }
163
+
164
+ /** The account of a Gmail app-password server config, '' for any other. */
165
+ export function gmailAppPasswordAccount(cfg) {
166
+ if (urlKey(cfg?.url) !== urlKey(GMAIL_APP_PASSWORD.url)) return '';
167
+ const headers = cfg?.headers && typeof cfg.headers === 'object' ? cfg.headers : {};
168
+ const header = GMAIL_APP_PASSWORD.accountHeader.toLowerCase();
169
+ const key = Object.keys(headers).find((name) => name.toLowerCase() === header);
170
+ return key ? gmailAddress(headers[key]) : '';
171
+ }
172
+
173
+ /** The MCP server input that connects Gmail under `name` as `email` with an
174
+ * app password. `appPassword` only travels to the host, which checks it
175
+ * with Gmail and keeps it in the keychain; it never reaches the config. */
176
+ export function gmailAppPasswordServerInput(name, email, password) {
177
+ const address = gmailAddress(email);
178
+ if (!address) throw new Error('GMAIL_APP_PASSWORD_ADDRESS: Enter a Gmail address.');
179
+ const appPassword = gmailAppPasswordValue(password);
180
+ if (!appPassword) throw new Error('GMAIL_APP_PASSWORD_FORMAT: An app password has 16 characters.');
181
+ return {
182
+ name,
183
+ type: 'http',
184
+ url: GMAIL_APP_PASSWORD.url,
185
+ headers: { [GMAIL_APP_PASSWORD.accountHeader]: address },
186
+ connector: 'gmail',
187
+ appPassword,
188
+ };
189
+ }
190
+
191
+ /** Whether several accounts of catalog connector `entry` can be connected at
192
+ * once: Gmail (also by app password), Calendar and Drive with the Google
193
+ * sign-in. Other remote servers keep one (their tokens and URL are shared). */
194
+ export function connectorMultiAccount(entry) {
195
+ return entry?.backend?.kind === 'oauth' && entry.backend.oauthClient === 'google';
196
+ }
197
+
198
+ /** The MCP server input that connects catalog entry `entry` under `name`
199
+ * (oauth / apiKey); `key` fills an apiKey backend; `extraAccount`
200
+ * makes it one more account of a multi-account connector. */
201
+ export function connectorServerInput(entry, name, key = '', { extraAccount = false } = {}) {
202
+ const { backend } = entry;
203
+ if (backend.kind === 'oauth') {
204
+ // Tokens are stored per exact server URL, so another account of the same
205
+ // connector needs its own URL; the in-process Google servers ignore the query.
206
+ const url =
207
+ extraAccount && connectorMultiAccount(entry) ? `${backend.url}?account=${encodeURIComponent(name)}` : backend.url;
208
+ return { name, type: 'http', url, connector: entry.id };
209
+ }
210
+ if (backend.kind !== 'apiKey') throw new Error(`${entry.name} is not an MCP connector`);
211
+ const value = String(key || '').trim();
212
+ if (!value) throw new Error(`${entry.name} needs a key`);
213
+ if (backend.url) {
214
+ return {
215
+ name,
216
+ type: 'http',
217
+ url: backend.url,
218
+ headers: { [backend.header]: `${backend.prefix || ''}${value}` },
219
+ connector: entry.id,
220
+ };
221
+ }
222
+ return {
223
+ name,
224
+ type: 'stdio',
225
+ command: backend.command,
226
+ args: [...backend.args],
227
+ env: { [backend.env]: value },
228
+ connector: entry.id,
229
+ };
230
+ }
@@ -0,0 +1,3 @@
1
+ export declare const CONNECTOR_TRIGGER_MAX_CHARS: number;
2
+ export declare const CONNECTOR_TRIGGERS: Readonly<Record<string, string>>;
3
+ export declare function connectorTrigger(serverId: string): string;
@@ -0,0 +1,43 @@
1
+ // Curated selection triggers for catalog connectors (MCP servers). A catalog
2
+ // entry carries its line as `trigger`; the deferred-tool manifest lists each
3
+ // connected server once as `- mcp__<server id>: <trigger>`, so one line must
4
+ // say what the connector is for (plus a close negative where useful), in
5
+ // English, at most CONNECTOR_TRIGGER_MAX_CHARS characters.
6
+ export const CONNECTOR_TRIGGER_MAX_CHARS = 100;
7
+
8
+ export const CONNECTOR_TRIGGERS = Object.freeze({
9
+ github: 'GitHub repos, issues, pull requests, Actions and code search; not local Git history or diffs.',
10
+ notion: 'Notion pages, databases and workspace search; create or update team docs and notes.',
11
+ linear: 'Linear issues, projects, cycles and comments; create, triage or update tickets.',
12
+ sentry: 'Sentry issues, events, stack traces and releases; triage production errors.',
13
+ gmail: 'Gmail: send email; with an app password also search, read, archive, label, star, trash.',
14
+ 'google-calendar': 'Google Calendar events on the primary calendar; list, search, create, update or delete.',
15
+ 'google-drive': 'Google Drive files Mixdog created or was given; search, read or create; not local files.',
16
+ jira: 'Jira issues, projects, sprints and comments; JQL search, create or transition tickets.',
17
+ confluence: 'Confluence spaces and pages; search, read or edit the team wiki; not Jira tickets.',
18
+ dropbox: 'Dropbox files and folders; search, read, upload or share cloud files; not local files.',
19
+ trello: 'Trello boards, lists and cards; create, move or update cards.',
20
+ airtable: 'Airtable bases, tables and records; query, create or update rows.',
21
+ stripe: 'Stripe customers, payments, invoices, subscriptions and refunds; billing data and actions.',
22
+ vercel: 'Vercel projects, deployments, domains and logs; deploy status and build errors.',
23
+ supabase: 'Supabase projects: Postgres tables and SQL, auth, storage and edge functions.',
24
+ postgres: 'PostgreSQL schemas, tables and SQL queries on a connected database; not local files.',
25
+ 'hugging-face': 'Hugging Face Hub models, datasets, Spaces and papers; not local GGUF model setup.',
26
+ });
27
+
28
+ // Server ids differ only in separators and case (google_calendar, huggingface).
29
+ const triggerKey = (id) =>
30
+ String(id || '')
31
+ .toLowerCase()
32
+ .replace(/[^a-z0-9]/g, '');
33
+ const TRIGGERS_BY_KEY = new Map(Object.entries(CONNECTOR_TRIGGERS).map(([id, line]) => [triggerKey(id), line]));
34
+
35
+ /** The curated trigger of the catalog connector `serverId`, or ''. */
36
+ export function connectorTrigger(serverId) {
37
+ // Another account of a connector is named `<id>-2`, `<id>-3`…
38
+ return (
39
+ TRIGGERS_BY_KEY.get(triggerKey(serverId)) ||
40
+ TRIGGERS_BY_KEY.get(triggerKey(String(serverId || '').replace(/[-_]\d+$/, ''))) ||
41
+ ''
42
+ );
43
+ }
@@ -24,7 +24,13 @@ import { createKeyedSerialQueue } from './keyed-serial-queue.mjs';
24
24
  import { sleep, sleepSync } from './sleep.mjs';
25
25
 
26
26
  const LOCK_WAIT_CODES = new Set(['EEXIST', 'EPERM', 'EACCES', 'EBUSY']);
27
- export const DEFAULT_BACKOFFS_MS = Object.freeze([25, 50, 100, 200, 400, 800, 1200, 1600]);
27
+ // Cross-process waits must poll (in-process waiters already queue on
28
+ // lockQueue and wake on release). Each sleep is capped at 200 ms: longer
29
+ // sleeps overshoot a release by up to their full length, and the synchronous
30
+ // paths block the event loop for each sleep. The schedule keeps the earlier
31
+ // ~4.2 s total window for rename retries (Windows AV/indexer file holds).
32
+ const RETRY_MAX_MS = 200;
33
+ export const DEFAULT_BACKOFFS_MS = Object.freeze([25, 50, 100, ...Array(20).fill(RETRY_MAX_MS)]);
28
34
  const configuredLockTimeoutMs = Number(process.env.MIXDOG_LOCK_TIMEOUT_MS);
29
35
  const DEFAULT_LOCK_TIMEOUT_MS =
30
36
  Number.isFinite(configuredLockTimeoutMs) && configuredLockTimeoutMs >= 0 ? configuredLockTimeoutMs : 2000;
@@ -0,0 +1,38 @@
1
+ // Worker side of file-permissions.mjs's sync bridge: owner-only enforcement
2
+ // for synchronous callers, through this thread's own long-lived ACL helper.
3
+ // Every request is answered on the port, then the shared counter (slot 0) is
4
+ // bumped and notified so the blocked caller wakes; slot 1 marks this thread
5
+ // gone, slot 2 marks it ready.
6
+ import { workerData } from 'node:worker_threads';
7
+ import { enforceOwnerOnlyAclWin32Async, prewarmOwnerOnlyAclWin32 } from './file-permissions.mjs';
8
+
9
+ const { port, signal } = workerData;
10
+
11
+ function wake() {
12
+ Atomics.add(signal, 0, 1);
13
+ Atomics.notify(signal, 0);
14
+ }
15
+
16
+ process.on('exit', () => {
17
+ Atomics.store(signal, 1, 1);
18
+ wake();
19
+ });
20
+
21
+ port.on('message', async (request) => {
22
+ if (request?.warm === true) {
23
+ await prewarmOwnerOnlyAclWin32({ bridge: false });
24
+ return;
25
+ }
26
+ let reply;
27
+ try {
28
+ await enforceOwnerOnlyAclWin32Async(request.path, { fresh: true });
29
+ reply = { id: request.id, ok: true };
30
+ } catch (error) {
31
+ reply = { id: request.id, ok: false, message: String(error?.message || error), code: error?.code ?? null };
32
+ }
33
+ port.postMessage(reply);
34
+ wake();
35
+ });
36
+
37
+ Atomics.store(signal, 2, 1);
38
+ wake();
@@ -1,8 +1,23 @@
1
1
  export function enforceOwnerOnlyAclWin32(targetPath: string, options?: { fresh?: boolean }): void;
2
2
 
3
- export function enforceOwnerOnlyAclWin32Async(
4
- targetPath: string,
5
- options?: { fresh?: boolean }
6
- ): Promise<void>;
3
+ /** Test hook: the live per-process ACL helper, or null. */
4
+ export function ownerOnlyAclHelperForTests(): import('node:child_process').ChildProcess | null;
5
+
6
+ /** Test/diagnostic hook: helper attachment, pending requests, starts in the restart window. */
7
+ export function ownerOnlyAclHelperStats(): {
8
+ alive: boolean;
9
+ pid: number | null;
10
+ pending: number;
11
+ recentStarts: number;
12
+ };
13
+
14
+ /** Non-fresh calls verify (and tighten) the real DACL on every call through a shared helper. */
15
+ export function enforceOwnerOnlyAclWin32Async(targetPath: string, options?: { fresh?: boolean }): Promise<void>;
7
16
 
8
17
  export function enforceOwnerOnlyDirectoryWin32Async(targetPath: string): Promise<void>;
18
+
19
+ /** Test hook: synchronous calls skip the sync bridge and use the one-shot update. */
20
+ export function disableOwnerOnlyAclSyncBridgeForTests(): void;
21
+
22
+ /** Starts this thread's ACL helper and the sync bridge off any write path. Never rejects. */
23
+ export function prewarmOwnerOnlyAclWin32(options?: { bridge?: boolean }): Promise<void>;