mixdog 1.3.5 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/NOTICE.md +2 -2
  2. package/README.md +2 -2
  3. package/package.json +2 -11
  4. package/scripts/daemon-stub.mjs +1 -1
  5. package/scripts/gate-local.mjs +4 -2
  6. package/scripts/native-release-status.mjs +2 -2
  7. package/scripts/recall-history-cases.json +1 -1
  8. package/scripts/suite-health.mjs +10 -1
  9. package/scripts/test.mjs +7 -11
  10. package/src/agents/reviewer/AGENT.md +7 -11
  11. package/src/agents/reviewer/agent.json +1 -1
  12. package/src/defaults/shipped-history.json +17 -1
  13. package/src/defaults/skills/browser-use/SKILL.md +59 -11
  14. package/src/defaults/skills/code-tidy/SKILL.md +142 -270
  15. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +4 -4
  16. package/src/defaults/skills/code-tidy/references/cleanup-report.md +31 -76
  17. package/src/defaults/skills/code-tidy/references/dead-code.md +6 -12
  18. package/src/defaults/skills/computer-use/SKILL.md +33 -9
  19. package/src/defaults/skills/setup/SKILL.md +22 -0
  20. package/src/defaults/skills/setup/references/actions.md +39 -5
  21. package/src/defaults/skills/setup/references/surfaces.md +11 -2
  22. package/src/defaults/skills/visualize/SKILL.md +2 -1
  23. package/src/lib/rules-builder.cjs +10 -8
  24. package/src/rules/agent/AGENT.md +6 -6
  25. package/src/rules/lead/LEAD.md +18 -20
  26. package/src/rules/shared/05-tool-calls.md +5 -6
  27. package/src/rules/shared/10-tool-workflow.md +2 -0
  28. package/src/rules/shared/60-verification.md +7 -5
  29. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -3
  30. package/src/runtime/agent/orchestrator/agent-runtime/title-completion.mjs +3 -1
  31. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +3 -1
  32. package/src/runtime/agent/orchestrator/config.mjs +17 -1
  33. package/src/runtime/agent/orchestrator/context/collect.mjs +3 -0
  34. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +72 -67
  35. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +54 -1
  36. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -3
  37. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +176 -72
  38. package/src/runtime/agent/orchestrator/mcp/client.mjs +19 -0
  39. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +181 -133
  40. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +42 -6
  41. package/src/runtime/agent/orchestrator/providers/anthropic-cache-warm.mjs +165 -0
  42. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  43. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -1
  44. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +14 -14
  45. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +145 -66
  46. package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +25 -3
  47. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +64 -33
  48. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +135 -87
  49. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +123 -102
  50. package/src/runtime/agent/orchestrator/providers/cache-warm-admission.mjs +90 -0
  51. package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +25 -9
  52. package/src/runtime/agent/orchestrator/providers/cursor.mjs +22 -13
  53. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +17 -3
  54. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +52 -10
  55. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +8 -1
  56. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
  57. package/src/runtime/agent/orchestrator/providers/npm-cli-version.mjs +11 -3
  58. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -1
  59. package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +10 -9
  60. package/src/runtime/agent/orchestrator/providers/openai-ws-send/send-context.mjs +22 -3
  61. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +43 -5
  62. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/handshake-failure.mjs +3 -1
  63. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/stream-failure.mjs +6 -3
  64. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +65 -1
  65. package/src/runtime/agent/orchestrator/providers/quota-reading.mjs +38 -12
  66. package/src/runtime/agent/orchestrator/providers/registry.mjs +26 -0
  67. package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +39 -7
  68. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +6 -0
  69. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +12 -7
  70. package/src/runtime/agent/orchestrator/runtime-core/compaction-config-keys.mjs +62 -0
  71. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +37 -16
  72. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +100 -23
  73. package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +2 -0
  74. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +19 -4
  75. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +125 -30
  76. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +792 -0
  77. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +133 -22
  78. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +475 -58
  79. package/src/runtime/agent/orchestrator/session/compaction-archive.mjs +42 -17
  80. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -1
  81. package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +11 -5
  82. package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +0 -2
  83. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -4
  84. package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +1 -1
  85. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +18 -22
  86. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +32 -3
  87. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +3 -1
  88. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +1 -1
  89. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +17 -3
  90. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +7 -2
  91. package/src/runtime/agent/orchestrator/session/loop/tool-exec/after-hook.mjs +2 -1
  92. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +3 -2
  93. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +16 -2
  94. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +16 -1
  95. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +10 -0
  96. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -10
  97. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +12 -3
  98. package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +12 -2
  99. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +19 -1
  100. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +133 -90
  101. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +31 -4
  102. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +30 -18
  103. package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +23 -13
  104. package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +11 -2
  105. package/src/runtime/agent/orchestrator/session/manager/provider-replay.mjs +13 -0
  106. package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +129 -0
  107. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +20 -2
  108. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +2 -0
  109. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +8 -0
  110. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +1 -1
  111. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +7 -2
  112. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +102 -15
  113. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +18 -5
  114. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +19 -8
  115. package/src/runtime/agent/orchestrator/session/prompt-cache-idle-gaps.mjs +113 -0
  116. package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +127 -0
  117. package/src/runtime/agent/orchestrator/session/routine-result.mjs +36 -9
  118. package/src/runtime/agent/orchestrator/session/sensitive-projection.mjs +100 -0
  119. package/src/runtime/agent/orchestrator/session/sensitive-values.mjs +257 -0
  120. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +20 -7
  121. package/src/runtime/agent/orchestrator/session/side-question.mjs +18 -0
  122. package/src/runtime/agent/orchestrator/session/skill-update-notice.mjs +60 -0
  123. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +6 -3
  124. package/src/runtime/agent/orchestrator/session/store/save-delta.mjs +9 -5
  125. package/src/runtime/agent/orchestrator/session/store/serialize.mjs +9 -8
  126. package/src/runtime/agent/orchestrator/session/store/session-persistence-events.mjs +29 -0
  127. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +8 -6
  128. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +12 -2
  129. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +44 -14
  130. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +84 -3
  131. package/src/runtime/agent/orchestrator/session/stored-attachment-history.mjs +32 -0
  132. package/src/runtime/agent/orchestrator/session/thinking-binding.mjs +108 -0
  133. package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +2 -2
  134. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +2 -1
  135. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +18 -1
  136. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-status.mjs +9 -7
  137. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-text.mjs +2 -2
  138. package/src/runtime/agent/orchestrator/session/turn-failure.mjs +5 -1
  139. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +5 -2
  140. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +12 -1
  141. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +240 -0
  142. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
  143. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/shell-cwd.mjs +38 -0
  144. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +25 -5
  145. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +65 -7
  146. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +7 -1
  147. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +36 -13
  148. package/src/runtime/browser-bridge/action-schema.mjs +13 -2
  149. package/src/runtime/browser-bridge/client.mjs +73 -8
  150. package/src/runtime/browser-bridge/input-fields.mjs +8 -9
  151. package/src/runtime/browser-bridge/mail-links.mjs +107 -0
  152. package/src/runtime/browser-bridge/tool-defs.mjs +1 -1
  153. package/src/runtime/channels/lib/config.mjs +6 -61
  154. package/src/runtime/channels/lib/crash-log.mjs +1 -1
  155. package/src/runtime/channels/lib/event-pipeline.mjs +4 -19
  156. package/src/runtime/channels/lib/event-queue.mjs +3 -18
  157. package/src/runtime/channels/lib/owned-runtime/automation-services.mjs +2 -2
  158. package/src/runtime/channels/lib/owned-runtime/automation-start.mjs +3 -4
  159. package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +4 -59
  160. package/src/runtime/channels/lib/owned-runtime/owned-start.mjs +33 -115
  161. package/src/runtime/channels/lib/owned-runtime/owned-stop.mjs +5 -22
  162. package/src/runtime/channels/lib/owned-runtime/state.mjs +2 -8
  163. package/src/runtime/channels/lib/owned-runtime.mjs +6 -23
  164. package/src/runtime/channels/lib/parent-bridge.mjs +2 -2
  165. package/src/runtime/channels/lib/runtime-paths.mjs +4 -43
  166. package/src/runtime/channels/lib/scheduler.mjs +33 -147
  167. package/src/runtime/channels/lib/schedules-db.mjs +34 -11
  168. package/src/runtime/channels/lib/status-snapshot.mjs +1 -1
  169. package/src/runtime/channels/lib/tool-dispatch.mjs +1 -2
  170. package/src/runtime/channels/lib/webhooks-db.mjs +5 -9
  171. package/src/runtime/channels/lib/worker-bootstrap.mjs +0 -1
  172. package/src/runtime/channels/lib/worker-ipc.mjs +0 -1
  173. package/src/runtime/channels/lib/worker-main.mjs +10 -34
  174. package/src/runtime/computer-bridge/action-schema.mjs +42 -1
  175. package/src/runtime/computer-bridge/actions.mjs +9 -1
  176. package/src/runtime/computer-bridge/client.mjs +180 -8
  177. package/src/runtime/computer-bridge/core-actions.mjs +2 -2
  178. package/src/runtime/computer-bridge/error-recovery.mjs +27 -2
  179. package/src/runtime/computer-bridge/linux-readiness.mjs +65 -23
  180. package/src/runtime/computer-bridge/pending-continuation.mjs +1 -1
  181. package/src/runtime/connectors/connector-accounts-mcp.mjs +230 -0
  182. package/src/runtime/connectors/gmail-app-password.mjs +172 -39
  183. package/src/runtime/connectors/google-mcp.mjs +10 -12
  184. package/src/runtime/memory/lib/pg/adapter.mjs +77 -70
  185. package/src/runtime/memory/lib/pg/supervisor.mjs +24 -12
  186. package/src/runtime/memory/lib/runtime-fetcher.mjs +23 -5
  187. package/src/runtime/session-search/session-search-db.mjs +73 -9
  188. package/src/runtime/session-search/session-search-ingest.mjs +110 -20
  189. package/src/runtime/shared/abort-race.mjs +89 -0
  190. package/src/runtime/shared/agent-avatar.d.mts +0 -1
  191. package/src/runtime/shared/agent-kind.mjs +4 -3
  192. package/src/runtime/shared/bounded-download.mjs +8 -3
  193. package/src/runtime/shared/config.mjs +2 -13
  194. package/src/runtime/shared/connector-accounts.mjs +20 -10
  195. package/src/runtime/shared/connector-catalog.d.mts +29 -0
  196. package/src/runtime/shared/connector-catalog.mjs +150 -0
  197. package/src/runtime/shared/connector-triggers.mjs +22 -19
  198. package/src/runtime/shared/defaults-separation.mjs +2 -14
  199. package/src/runtime/shared/delegated-approval-host.mjs +103 -11
  200. package/src/runtime/shared/err-text.mjs +24 -15
  201. package/src/runtime/shared/file-permissions.d.mts +0 -8
  202. package/src/runtime/shared/file-permissions.mjs +0 -11
  203. package/src/runtime/shared/git-direct.test-support.mjs +19 -0
  204. package/src/runtime/shared/heartbeat-interval.d.mts +4 -0
  205. package/src/runtime/shared/heartbeat-interval.mjs +19 -0
  206. package/src/runtime/shared/idle-auto-clear-gate.mjs +104 -0
  207. package/src/runtime/shared/llm/usage-rollup.mjs +1 -1
  208. package/src/runtime/shared/mixy-presence.mjs +22 -0
  209. package/src/runtime/shared/orchestration.d.mts +2 -0
  210. package/src/runtime/shared/pg-schema-db.mjs +27 -16
  211. package/src/runtime/shared/profile-config.cjs +1 -1
  212. package/src/runtime/shared/prompt-origin.d.mts +4 -0
  213. package/src/runtime/shared/prompt-origin.mjs +21 -0
  214. package/src/runtime/shared/provider-accounts.mjs +7 -1
  215. package/src/runtime/shared/provider-display-name.mjs +29 -0
  216. package/src/runtime/shared/provider-timeout-phase.mjs +2 -0
  217. package/src/runtime/shared/routine-trigger.d.mts +2 -0
  218. package/src/runtime/shared/routine-trigger.mjs +10 -0
  219. package/src/runtime/shared/sensitive-path-rules.d.mts +2 -10
  220. package/src/runtime/shared/sensitive-path-rules.mjs +19 -41
  221. package/src/runtime/shared/session-activity-signal.mjs +34 -1
  222. package/src/runtime/shared/session-sidebar-host.d.mts +1 -1
  223. package/src/runtime/shared/session-sidebar-host.mjs +7 -3
  224. package/src/runtime/shared/session-turn-prelude.mjs +18 -0
  225. package/src/runtime/shared/tool-result-summary.mjs +1 -14
  226. package/src/runtime/shared/worktrees/test-support.mjs +9 -4
  227. package/src/runtime/terminal-bridge/client.mjs +10 -1
  228. package/src/runtime/visualize-bridge/client.mjs +27 -8
  229. package/src/runtime/visualize-bridge/tool-defs.mjs +22 -8
  230. package/src/runtime/visualize-bridge/tool-meta.d.mts +5 -0
  231. package/src/runtime/visualize-bridge/tool-meta.mjs +22 -0
  232. package/src/runtime/web-search/lib/fetch-pipeline.mjs +2 -2
  233. package/src/session-runtime/agent-home-delivery.mjs +448 -185
  234. package/src/session-runtime/agent-task-sessions.mjs +329 -180
  235. package/src/session-runtime/boot/apis.mjs +9 -0
  236. package/src/session-runtime/boot/infrastructure.mjs +4 -0
  237. package/src/session-runtime/boot/providers.mjs +3 -0
  238. package/src/session-runtime/boot/tools.mjs +6 -1
  239. package/src/session-runtime/config-lifecycle.mjs +6 -0
  240. package/src/session-runtime/connector-merge-migration.mjs +305 -0
  241. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +132 -28
  242. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +2 -0
  243. package/src/session-runtime/lifecycle/inheritance.mjs +16 -3
  244. package/src/session-runtime/lifecycle/session-catalog.mjs +3 -1
  245. package/src/session-runtime/lifecycle/teardown/runtime-stops.mjs +50 -4
  246. package/src/session-runtime/lifecycle/teardown.mjs +23 -5
  247. package/src/session-runtime/mcp-glue/server-catalog.mjs +55 -3
  248. package/src/session-runtime/mcp-oauth-login.mjs +5 -3
  249. package/src/session-runtime/mixy-heartbeat.mjs +153 -33
  250. package/src/session-runtime/notification-bus.mjs +31 -117
  251. package/src/session-runtime/notification-completion-queue.mjs +54 -0
  252. package/src/session-runtime/notification-listeners.mjs +76 -0
  253. package/src/session-runtime/owned-automation-run.mjs +2 -1
  254. package/src/session-runtime/prewarm/channel-start.mjs +3 -7
  255. package/src/session-runtime/resource-mcp-api.mjs +143 -224
  256. package/src/session-runtime/resource-mcp-connector-accounts.mjs +163 -0
  257. package/src/session-runtime/resource-mcp-oauth-api.mjs +217 -0
  258. package/src/session-runtime/resource-mcp-secrets.mjs +82 -0
  259. package/src/session-runtime/resource-mcp-servers.mjs +78 -0
  260. package/src/session-runtime/resource-mcp-store.mjs +49 -0
  261. package/src/session-runtime/routine-owner.mjs +40 -9
  262. package/src/session-runtime/services/agent-tool/close-flow.mjs +3 -0
  263. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +7 -2
  264. package/src/session-runtime/services/agent-tool/tag-registry.mjs +1 -0
  265. package/src/session-runtime/services/agent-tool/worker-index/awaiting-user-sync.mjs +51 -0
  266. package/src/session-runtime/services/agent-tool/worker-index/disposal.mjs +55 -0
  267. package/src/session-runtime/services/agent-tool/worker-index/released-store.mjs +123 -0
  268. package/src/session-runtime/services/agent-tool/worker-index/restart-settlement.mjs +112 -0
  269. package/src/session-runtime/services/agent-tool/worker-index/row-reads.mjs +36 -0
  270. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -0
  271. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +17 -4
  272. package/src/session-runtime/services/agent-tool/worker-index/row-writes.mjs +58 -0
  273. package/src/session-runtime/services/agent-tool/worker-index.mjs +41 -241
  274. package/src/session-runtime/services/agent-tool/worker-rows.mjs +3 -0
  275. package/src/session-runtime/services/channel-admin.mjs +7 -13
  276. package/src/session-runtime/services/channel-session-router.mjs +4 -2
  277. package/src/session-runtime/services/seeds.mjs +0 -28
  278. package/src/session-runtime/session-compaction-sync.mjs +27 -0
  279. package/src/session-runtime/session-create/session-options.mjs +1 -0
  280. package/src/session-runtime/settings-builtin-tools-api.mjs +11 -0
  281. package/src/session-runtime/settings-compaction-api.mjs +2 -40
  282. package/src/session-runtime/settings-system-api.mjs +13 -1
  283. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +65 -0
  284. package/src/session-runtime/setup-tool/executor.mjs +145 -22
  285. package/src/session-runtime/setup-tool/extended-actions.mjs +8 -3
  286. package/src/session-runtime/setup-tool/session-route-actions.mjs +152 -0
  287. package/src/session-runtime/setup-tool/settings-contract.mjs +4 -3
  288. package/src/session-runtime/setup-tool/tool-defs.mjs +64 -5
  289. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +17 -13
  290. package/src/session-runtime/tool-policy/policy-stage.mjs +16 -2
  291. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
  292. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +4 -0
  293. package/src/standalone/channel-transport/client-registry/client-records.mjs +65 -0
  294. package/src/standalone/channel-transport/client-registry/client-registration.mjs +118 -0
  295. package/src/standalone/channel-transport/client-registry.mjs +24 -163
  296. package/src/standalone/channel-transport.mjs +1 -1
  297. package/src/standalone/daemon-channels-loader.mjs +10 -8
  298. package/src/standalone/daemon-session-control/list-page.mjs +72 -0
  299. package/src/standalone/daemon-session-control/request.mjs +51 -0
  300. package/src/standalone/daemon-session-control/room-host.mjs +57 -0
  301. package/src/standalone/daemon-session-control/route-control.mjs +48 -0
  302. package/src/standalone/daemon-session-control/send-turn.mjs +60 -0
  303. package/src/standalone/daemon-session-control/worktree-control.mjs +40 -0
  304. package/src/standalone/daemon-session-control.mjs +124 -188
  305. package/src/standalone/daemon.mjs +26 -3
  306. package/src/standalone/session-client.mjs +7 -3
  307. package/src/standalone/session-protocol.mjs +5 -0
  308. package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -0
  309. package/src/standalone/session-service/quota-resume.mjs +3 -0
  310. package/src/standalone/session-service/retention/busy.mjs +65 -1
  311. package/src/standalone/session-service/session-calls/session-action.mjs +23 -2
  312. package/src/standalone/session-service/session-calls/session-views.mjs +8 -0
  313. package/src/standalone/session-tool-output.mjs +15 -7
  314. package/src/tui/app/model-options.mjs +3 -28
  315. package/src/tui/dist/index.mjs +58 -64
  316. package/src/tui/session/agent-job-feed/model-notification.mjs +3 -0
  317. package/src/tui/session/initial-state.mjs +3 -0
  318. package/src/tui/session/notice-surface.mjs +7 -1
  319. package/src/tui/session/queue-helpers.mjs +3 -42
  320. package/src/tui/session/session-api/routes-agent-definitions.mjs +14 -2
  321. package/src/tui/session/session-api/routes-write.mjs +5 -1
  322. package/src/tui/session/session-api/routes.mjs +1 -0
  323. package/src/tui/session/session-api/settings.mjs +17 -1
  324. package/src/tui/session/session-flow/auto-clear.mjs +4 -33
  325. package/src/tui/session/session-flow/drain-closed-queue.mjs +38 -0
  326. package/src/tui/session/session-flow/drain-enqueue.mjs +86 -0
  327. package/src/tui/session/session-flow/drain-retry.mjs +35 -0
  328. package/src/tui/session/session-flow/drain.mjs +118 -149
  329. package/src/tui/session/session-flow/queue/entry-shape.mjs +5 -0
  330. package/src/tui/session/session-flow/queue/take-entries.mjs +5 -2
  331. package/src/tui/session/tool-approval-delegation.mjs +64 -0
  332. package/src/tui/session/tool-approval-request.mjs +39 -0
  333. package/src/tui/session/tool-approval-settle.mjs +62 -0
  334. package/src/tui/session/tool-approval.mjs +69 -115
  335. package/src/tui/session/tui-steering-persist.mjs +8 -1
  336. package/src/tui/session/turn-stream.mjs +19 -2
  337. package/src/tui/session/turn.mjs +1 -0
  338. package/src/vendor/statusline/bin/statusline-route.mjs +1 -219
  339. package/src/vendor/statusline/src/gateway/route-meta.mjs +35 -13
  340. package/scripts/code-graph-description-contract.mjs +0 -188
  341. package/src/runtime/channels/lib/owned-runtime/ownership-refresh.mjs +0 -36
@@ -8,6 +8,13 @@ import { createMcpOAuth } from './oauth.mjs';
8
8
  import { mcpOAuthClientFor, mcpOAuthDisplayName } from './oauth-client.mjs';
9
9
  import { googleMcpService, withGoogleMcp } from '../../../connectors/google-mcp.mjs';
10
10
  import { gmailAppPasswordService, withGmailAppPasswordMcp } from '../../../connectors/gmail-app-password.mjs';
11
+ import { connectorAccountRequest, withConnectorAccountsMcp } from '../../../connectors/connector-accounts-mcp.mjs';
12
+ import {
13
+ connectorAccountsOf,
14
+ connectorLiveAccountServers,
15
+ gmailAppPasswordAccount,
16
+ } from '../../../shared/connector-catalog.mjs';
17
+ import { isMcpOAuthReauthenticationRequired } from './oauth.mjs';
11
18
  import {
12
19
  AUTO_DETECT_PORTS,
13
20
  expandEnvVars,
@@ -63,10 +70,65 @@ export function hasConfiguredMcpAuth(cfg) {
63
70
  return (
64
71
  Boolean(String(cfg.bearer_token_env_var || '').trim()) ||
65
72
  configured(cfg.headers) ||
66
- configured(cfg.env_http_headers)
73
+ configured(cfg.env_http_headers) ||
74
+ // A multi-account connector's server: each account authenticates itself.
75
+ connectorAccountsOf(cfg).length > 0
67
76
  );
68
77
  }
69
78
 
79
+ /** One account of a multi-account connector server (connector-catalog.mjs
80
+ * connectorAccountServer) as connector-accounts-mcp.mjs calls it: through
81
+ * the transport the account had as a server of its own — its app-password
82
+ * header, or its own non-interactive OAuth sign-in (refreshed as needed; a
83
+ * new sign-in goes through 계정 바꾸기, never through a tool call). */
84
+ function connectorAccountClient(serverName, accountCfg, oauthOptions) {
85
+ const base = { name: accountCfg.name, email: '', appPassword: false, close() {} };
86
+ let url;
87
+ try {
88
+ url = resolveMcpOAuthUrl(accountCfg);
89
+ if (hasConfiguredMcpAuth(accountCfg)) {
90
+ const email = gmailAppPasswordAccount(accountCfg);
91
+ const fetchImpl = gmailAppPasswordService(url) ? withGmailAppPasswordMcp() : fetch;
92
+ return {
93
+ ...base,
94
+ email,
95
+ appPassword: Boolean(email),
96
+ request: connectorAccountRequest(url, fetchImpl, resolveMcpHttpHeaders(accountCfg)),
97
+ };
98
+ }
99
+ const oauth = createMcpOAuth({
100
+ url,
101
+ serverName: mcpOAuthDisplayName(accountCfg, serverName),
102
+ oauthClient: mcpOAuthClientFor(accountCfg, url),
103
+ ...(oauthOptions?.fetchImpl ? { fetchImpl: oauthOptions.fetchImpl } : {}),
104
+ ...(googleMcpService(url) ? { fetchImpl: withGoogleMcp(oauthOptions?.fetchImpl) } : {}),
105
+ });
106
+ const send = connectorAccountRequest(url, (input, init) => oauth.fetch(input, init));
107
+ return {
108
+ ...base,
109
+ async request(message, options) {
110
+ try {
111
+ return await send(message, options);
112
+ } catch (error) {
113
+ const reason = scrubMcpConnectionMessage(error?.message || String(error), accountCfg);
114
+ const scrubbed = new Error(
115
+ isMcpOAuthReauthenticationRequired(error)
116
+ ? 'Sign-in required; sign this account in again in Connectors.'
117
+ : reason
118
+ );
119
+ if (isMcpOAuthReauthenticationRequired(error)) scrubbed.authRequired = true;
120
+ throw scrubbed;
121
+ }
122
+ },
123
+ close: () => oauth.close(),
124
+ };
125
+ } catch (error) {
126
+ // A broken account (no sign-in client, an invalid address) stays listed with why.
127
+ const failed = new Error(error?.message || String(error));
128
+ return { ...base, request: async () => Promise.reject(failed) };
129
+ }
130
+ }
131
+
70
132
  // The SDK's WebSocket transport opens its socket without a way to set request
71
133
  // headers. This subclass changes only socket creation: Node's WebSocket takes
72
134
  // `{ protocols, headers }`; the guard and event wiring match the stock start().
@@ -101,24 +163,115 @@ function createHeaderWebSocketTransport(Base, messageSchema, url, headers) {
101
163
  }
102
164
  })(url);
103
165
  }
166
+ // Unset variables a config references: a failure under `strictEnv`,
167
+ // otherwise warnings (names only), each logged.
168
+ function missingEnvWarnings(name, cfg, strictEnv, log) {
169
+ const warnings = [];
170
+ const missing = findMissingMcpEnvVars(cfg);
171
+ if (missing.length) {
172
+ const message = `missing environment variable(s): ${missing.join(', ')}`;
173
+ if (strictEnv === true) throw new Error(message);
174
+ warnings.push(message);
175
+ log(`[mcp-client] "${name}": ${message}\n`);
176
+ }
177
+ return warnings;
178
+ }
179
+
180
+ // A multi-account connector: one server, every account behind it; closing the
181
+ // transport closes every account client.
182
+ function connectorAccountsTransport({ name, cfg, Transport, url, accountServers, oauthOptions, log }) {
183
+ const accounts = accountServers.map((accountCfg) => connectorAccountClient(name, accountCfg, oauthOptions));
184
+ const transport = new Transport(new URL(url), {
185
+ fetch: withConnectorAccountsMcp({ connector: cfg.connector, accounts }),
186
+ });
187
+ const close = transport.close.bind(transport);
188
+ transport.close = async () => {
189
+ for (const account of accounts) account.close();
190
+ await close();
191
+ };
192
+ log(`[mcp-client] Connecting "${name}" with ${accounts.length} account(s)\n`);
193
+ return transport;
194
+ }
195
+
196
+ // A streamable HTTP or SSE server: its configured authentication, or else an
197
+ // OAuth sign-in the transport owns (and closes with it).
198
+ function remoteHttpTransport({ name, cfg, kind, Transport, url, oauthOptions, log }) {
199
+ const opts = requestInitFor(cfg);
200
+ // Explicit authentication remains authoritative (including custom API-key
201
+ // headers). Never forward those credentials to OAuth discovery endpoints.
202
+ let transport;
203
+ let oauth = null;
204
+ if (!hasConfiguredMcpAuth(cfg)) {
205
+ oauth = createMcpOAuth({
206
+ url,
207
+ serverName: mcpOAuthDisplayName(cfg, name),
208
+ oauthClient: mcpOAuthClientFor(cfg, url),
209
+ ...oauthOptions,
210
+ // A built-in Google connector is answered in-process.
211
+ ...(googleMcpService(url) ? { fetchImpl: withGoogleMcp(oauthOptions?.fetchImpl) } : {}),
212
+ // SSE advertises its POST endpoint on the authenticated event stream.
213
+ // No other path on the origin is allowed to receive this server's token.
214
+ isTransportEndpoint: (input) => kind === 'sse' && transport?._endpoint?.href === new URL(input).href,
215
+ });
216
+ }
217
+ // Gmail with an app password is answered in-process too (its account
218
+ // header is the configured authentication; the password is in the keychain).
219
+ const local = !oauth && gmailAppPasswordService(url) ? { ...opts, fetch: withGmailAppPasswordMcp() } : opts;
220
+ transport = new Transport(new URL(url), oauth ? { fetch: oauth.fetch } : local);
221
+ if (oauth) {
222
+ transport.oauth = oauth;
223
+ const close = transport.close.bind(transport);
224
+ transport.close = async () => {
225
+ oauth.close();
226
+ await close();
227
+ };
228
+ }
229
+ log(`[mcp-client] Connecting "${name}" via ${kind.toUpperCase()}: ${mcpUrlForLog(url)}\n`);
230
+ return transport;
231
+ }
232
+
233
+ function webSocketTransport(name, cfg, sdk, log) {
234
+ const { WebSocketClientTransport } = sdk;
235
+ const url = normalizeMcpTransportUrl(expandEnvVars(String(cfg.url ?? '')), 'ws');
236
+ const opts = requestInitFor(cfg);
237
+ log(`[mcp-client] Connecting "${name}" via WebSocket: ${mcpUrlForLog(url)}\n`);
238
+ return opts
239
+ ? createHeaderWebSocketTransport(
240
+ WebSocketClientTransport,
241
+ sdk.JSONRPCMessageSchema,
242
+ new URL(url),
243
+ opts.requestInit.headers
244
+ )
245
+ : new WebSocketClientTransport(new URL(url));
246
+ }
247
+
248
+ // A stdio child, its stderr logged and its bounded (scrubbed) tail kept.
249
+ function stdioTransport(name, cfg, StdioClientTransport, log) {
250
+ const transport = new StdioClientTransport({
251
+ command: expandEnvVars(String(cfg.command ?? '')),
252
+ args: Array.isArray(cfg.args) ? expandEnvVars(cfg.args) : cfg.args,
253
+ cwd: cfg.cwd == null ? cfg.cwd : expandEnvVars(String(cfg.cwd)),
254
+ env: resolveMcpStdioEnvironment(cfg),
255
+ stderr: cfg.stderr ?? 'pipe',
256
+ });
257
+ let tail = '';
258
+ transport.stderr?.on?.('data', (chunk) => {
259
+ const text = scrubMcpConnectionMessage(chunk, cfg);
260
+ tail = (tail + text).slice(-MCP_STDERR_TAIL_CHARS);
261
+ log(`[mcp:${name}:stderr] ${text}`);
262
+ });
263
+ return { transport, stderrTail: () => tail.trim() };
264
+ }
265
+
104
266
  /** Returns { transport, autoDetectAdvert, stderrTail, warnings } — stderrTail()
105
267
  * is the last ~4 KB of a stdio server's (scrubbed) stderr, '' for remote
106
268
  * transports. `strictEnv` (the caller passes it for plugin-declared servers)
107
269
  * makes unset variables without a default fail the server; otherwise they
108
270
  * expand to empty and are reported in `warnings` (names only). */
109
271
  export function createMcpTransport({ name, cfg, sdk, log, strictEnv, oauthOptions }) {
110
- const { StdioClientTransport, StreamableHTTPClientTransport, SSEClientTransport, WebSocketClientTransport } = sdk;
272
+ const { StdioClientTransport, StreamableHTTPClientTransport, SSEClientTransport } = sdk;
111
273
  const kind = resolveMcpTransportKind(cfg);
112
- const warnings = [];
113
- if (kind !== 'autoDetect') {
114
- const missing = findMissingMcpEnvVars(cfg);
115
- if (missing.length) {
116
- const message = `missing environment variable(s): ${missing.join(', ')}`;
117
- if (strictEnv === true) throw new Error(message);
118
- warnings.push(message);
119
- log(`[mcp-client] "${name}": ${message}\n`);
120
- }
121
- }
274
+ const warnings = kind !== 'autoDetect' ? missingEnvWarnings(name, cfg, strictEnv, log) : [];
122
275
  if (kind === 'autoDetect') {
123
276
  const { url, advert } = resolveAutoDetectUrl(name, cfg);
124
277
  log(`[mcp-client] Connecting "${name}" via autoDetect HTTP: ${url}\n`);
@@ -132,72 +285,23 @@ export function createMcpTransport({ name, cfg, sdk, log, strictEnv, oauthOption
132
285
  if (kind === 'http' || kind === 'sse') {
133
286
  const Transport = kind === 'http' ? StreamableHTTPClientTransport : SSEClientTransport;
134
287
  const url = resolveMcpOAuthUrl(cfg);
135
- const opts = requestInitFor(cfg);
136
- // Explicit authentication remains authoritative (including custom API-key
137
- // headers). Never forward those credentials to OAuth discovery endpoints.
138
- let transport;
139
- const oauth = hasConfiguredMcpAuth(cfg)
140
- ? null
141
- : createMcpOAuth({
142
- url,
143
- serverName: mcpOAuthDisplayName(cfg, name),
144
- oauthClient: mcpOAuthClientFor(cfg, url),
145
- ...oauthOptions,
146
- // A built-in Google connector is answered in-process.
147
- ...(googleMcpService(url) ? { fetchImpl: withGoogleMcp(oauthOptions?.fetchImpl) } : {}),
148
- // SSE advertises its POST endpoint on the authenticated event stream.
149
- // No other path on the origin is allowed to receive this server's token.
150
- isTransportEndpoint: (input) => kind === 'sse' && transport?._endpoint?.href === new URL(input).href,
151
- });
152
- // Gmail with an app password is answered in-process too (its account
153
- // header is the configured authentication; the password is in the keychain).
154
- const local = !oauth && gmailAppPasswordService(url) ? { ...opts, fetch: withGmailAppPasswordMcp() } : opts;
155
- transport = new Transport(new URL(url), oauth ? { fetch: oauth.fetch } : local);
156
- if (oauth) {
157
- transport.oauth = oauth;
158
- const close = transport.close.bind(transport);
159
- transport.close = async () => {
160
- oauth.close();
161
- await close();
162
- };
288
+ // A disabled account is neither connected nor routed to.
289
+ const accountServers = connectorLiveAccountServers(cfg);
290
+ if (!accountServers.length && connectorAccountsOf(cfg).length) {
291
+ throw new Error(`Every account of "${name}" is disabled`);
163
292
  }
164
- log(`[mcp-client] Connecting "${name}" via ${kind.toUpperCase()}: ${mcpUrlForLog(url)}\n`);
165
- return {
166
- transport,
167
- autoDetectAdvert: null,
168
- stderrTail: noStderrTail,
169
- warnings,
170
- };
293
+ const transport = accountServers.length
294
+ ? connectorAccountsTransport({ name, cfg, Transport, url, accountServers, oauthOptions, log })
295
+ : remoteHttpTransport({ name, cfg, kind, Transport, url, oauthOptions, log });
296
+ return { transport, autoDetectAdvert: null, stderrTail: noStderrTail, warnings };
171
297
  }
172
298
  if (kind === 'ws') {
173
- const url = normalizeMcpTransportUrl(expandEnvVars(String(cfg.url ?? '')), 'ws');
174
- const opts = requestInitFor(cfg);
175
- log(`[mcp-client] Connecting "${name}" via WebSocket: ${mcpUrlForLog(url)}\n`);
176
- const transport = opts
177
- ? createHeaderWebSocketTransport(
178
- WebSocketClientTransport,
179
- sdk.JSONRPCMessageSchema,
180
- new URL(url),
181
- opts.requestInit.headers
182
- )
183
- : new WebSocketClientTransport(new URL(url));
299
+ const transport = webSocketTransport(name, cfg, sdk, log);
184
300
  return { transport, autoDetectAdvert: null, stderrTail: noStderrTail, warnings };
185
301
  }
186
302
  if (kind === 'stdio') {
187
- const transport = new StdioClientTransport({
188
- command: expandEnvVars(String(cfg.command ?? '')),
189
- args: Array.isArray(cfg.args) ? expandEnvVars(cfg.args) : cfg.args,
190
- cwd: cfg.cwd == null ? cfg.cwd : expandEnvVars(String(cfg.cwd)),
191
- env: resolveMcpStdioEnvironment(cfg),
192
- stderr: cfg.stderr ?? 'pipe',
193
- });
194
- let tail = '';
195
- transport.stderr?.on?.('data', (chunk) => {
196
- const text = scrubMcpConnectionMessage(chunk, cfg);
197
- tail = (tail + text).slice(-MCP_STDERR_TAIL_CHARS);
198
- log(`[mcp:${name}:stderr] ${text}`);
199
- });
200
- return { transport, autoDetectAdvert: null, stderrTail: () => tail.trim(), warnings };
303
+ const { transport, stderrTail } = stdioTransport(name, cfg, StdioClientTransport, log);
304
+ return { transport, autoDetectAdvert: null, stderrTail, warnings };
201
305
  }
202
306
  throw new Error(
203
307
  `Invalid config for "${name}": need autoDetect, type (stdio/http/sse/ws), url (http), or command (stdio)`
@@ -37,6 +37,8 @@ import { listAllMcpTools, MCP_CONNECT_CANCELLED, runBoundedHandshake } from './c
37
37
  import { rememberServerConnector } from './server-connectors.mjs';
38
38
  import { mcpOAuthClientFor, mcpOAuthDisplayName } from './oauth-client.mjs';
39
39
  import { googleMcpService, withGoogleMcp } from '../../../connectors/google-mcp.mjs';
40
+ import { gmailAppPasswordService } from '../../../connectors/gmail-app-password.mjs';
41
+ import { connectorLiveAccountServers } from '../../../shared/connector-catalog.mjs';
40
42
  import {
41
43
  clearMcpOAuth,
42
44
  commitMcpOAuthSwitch,
@@ -1117,6 +1119,23 @@ export function isMcpTool(name) {
1117
1119
  export function isRegisteredMcpTool(name, scopeId = DEFAULT_MCP_SCOPE_ID) {
1118
1120
  return Boolean(resolveMcpToolTarget(scopeId, name)?.definition);
1119
1121
  }
1122
+ /** True when the prefixed name is `read_email` of a server whose every
1123
+ * endpoint Mixdog answers in-process (the Gmail app-password connector,
1124
+ * alone or behind the multi-account server): its result is a mail as the
1125
+ * mailbox holds it, never another server's text (browser-bridge/mail-links.mjs). */
1126
+ export function isBuiltinMailRead(name, scopeId = DEFAULT_MCP_SCOPE_ID) {
1127
+ const target = resolveMcpToolTarget(normalizeMcpScopeId(scopeId), name);
1128
+ if (!target || (target.definition?.mcpToolName || MCP_TOOL_NAME_RE.exec(name)?.[2]) !== 'read_email') return false;
1129
+ const accounts = connectorLiveAccountServers(target.server.cfg);
1130
+ return (accounts.length ? accounts : [target.server.cfg]).every((cfg) => {
1131
+ try {
1132
+ const url = resolveMcpOAuthUrl(cfg);
1133
+ return Boolean(gmailAppPasswordService(url) || googleMcpService(url));
1134
+ } catch {
1135
+ return false;
1136
+ }
1137
+ });
1138
+ }
1120
1139
  /**
1121
1140
  * Check whether the inputSchema for an MCP tool declares the given top-level
1122
1141
  * property. Used to decide if the orchestrator should auto-inject context