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
@@ -5,6 +5,8 @@
5
5
  // facade's hookCommonPayload / currentCwd accessor + the session itself. All
6
6
  // properties are non-enumerable/configurable/writable so the loop/manager can
7
7
  // read them by name without changing session enumeration.
8
+ import { roomMemberOfSession } from '../runtime/agent/orchestrator/session/agent-room.mjs';
9
+ import { roomMemberToolDecision } from './room-member-gate.mjs';
8
10
 
9
11
  export function attachSessionHooks(session, { hooks, hookCommonPayload, getCwd }) {
10
12
  const identity = (input) => ({
@@ -26,20 +28,26 @@ export function attachSessionHooks(session, { hooks, hookCommonPayload, getCwd }
26
28
  // rejection cannot escape the tool loop or the compaction flow.
27
29
  const dispatcher = (event, payload) => (input) => hooks.dispatch(event, hookCommonPayload(payload(input)));
28
30
 
29
- // PreToolUse bridge.
30
- define('beforeToolHook', (input, options = {}) =>
31
- hooks.beforeTool(
31
+ // PreToolUse bridge. A group-room member's mutating calls always ask the
32
+ // user (room-member-gate.mjs), whatever the hooks decided short of a deny.
33
+ define('beforeToolHook', async (input, options = {}) => {
34
+ const name = input?.name || input?.tool_name;
35
+ const args = input?.args || input?.tool_input;
36
+ const cwd = input?.cwd || getCwd();
37
+ const decision = await hooks.beforeTool(
32
38
  hookCommonPayload({
33
39
  ...input,
34
40
  session_id: input?.sessionId || input?.session_id || session?.id,
35
- tool_name: input?.name || input?.tool_name,
36
- tool_input: input?.args || input?.tool_input,
41
+ tool_name: name,
42
+ tool_input: args,
37
43
  tool_use_id: input?.toolCallId || input?.tool_use_id,
38
- cwd: input?.cwd || getCwd(),
44
+ cwd,
39
45
  }),
40
46
  options
41
- )
42
- );
47
+ );
48
+ if (!roomMemberOfSession(session?.id)) return decision;
49
+ return roomMemberToolDecision({ name, args, cwd }, decision);
50
+ });
43
51
  // PostToolUse: bridge runtime tool completions to the standard hook bus.
44
52
  define('afterToolHook', dispatcher('PostToolUse', toolPayload));
45
53
  // PostToolUseFailure: dispatched by loop.mjs only when a tool execution
@@ -9,6 +9,12 @@ import { INSTRUCTION_FILES_MODES } from '../../runtime/shared/instruction-files-
9
9
  import { MEDIA_KINDS } from '../../runtime/media/tool-defs.mjs';
10
10
  import { SETUP_DESKTOP_DOMAINS, SETUP_HANDOFFS } from './settings-contract.mjs';
11
11
  import { executeExtendedSetupAction, publicAutomation, publicHookRule, validateMcpInput } from './extended-actions.mjs';
12
+ import {
13
+ assertAgentEditorAccess,
14
+ assertInteractiveCaller,
15
+ assertOwnAgentSettings,
16
+ scheduleCallerScope,
17
+ } from '../services/schedule-access.mjs';
12
18
  import { SETUP_DESKTOP_UNCLAIMED, createSetupUiRequests } from './ui-requests.mjs';
13
19
  import {
14
20
  SETUP_ACTIONS,
@@ -20,8 +26,11 @@ import {
20
26
  } from './tool-defs.mjs';
21
27
  import { schemaValueError } from '../../runtime/shared/schema-value-error.mjs';
22
28
  import { clean } from '../../runtime/agent/orchestrator/runtime-core/session-text.mjs';
29
+ import { CONNECTOR_IDS, connectorById } from '../../runtime/shared/connector-catalog.mjs';
23
30
  import profileConfig from '../../runtime/shared/profile-config.cjs';
24
31
 
32
+ const AGENT_DEFINITION_ACTIONS = new Set(['create_definition', 'save_definition', 'delete_definition']);
33
+
25
34
  const PROFILE_VALUE_IDS = Object.freeze({
26
35
  language: profileConfig.PROFILE_LANGUAGES.map((entry) => entry.id),
27
36
  experienceLevel: ['', ...profileConfig.PROFILE_EXPERIENCE_LEVELS.map((entry) => entry.id)],
@@ -35,6 +44,7 @@ const ACTION_APPLIES_TO = {
35
44
  save_automation: 'the automation worker; scheduled runs follow the saved timing',
36
45
  delete_automation: 'future automation runs',
37
46
  set_automation_enabled: 'future automation runs',
47
+ run_automation: "one run now; its result posts into the owning agent's thread",
38
48
  set_webhook_config: 'the webhook worker after configuration reload',
39
49
  add_hook_rule: 'subsequent tool calls; no restart required',
40
50
  set_hook_rule_enabled: 'subsequent tool calls; no restart required',
@@ -55,9 +65,10 @@ const OPEN_TARGET_HINTS = Object.freeze({
55
65
  autoclear: 'Desktop: Settings → Context · TUI: /autoclear',
56
66
  memory:
57
67
  'Desktop: Extensions → Plugin → Built-in (Memory); core memories under Projects → project → Memories · TUI: /memory',
58
- mcp: 'Desktop: Extensions → Skill tab → MCP · TUI: /mcp',
59
- skills: 'Desktop: Extensions → Skill tab → Skills · TUI: /skills',
60
- plugins: 'Desktop: Extensions → Plugin tab → Plugins · TUI: /plugins',
68
+ mcp: 'Desktop: Extensions → Connectors tab · TUI: /mcp',
69
+ skills: 'Desktop: Skills (activity rail) · TUI: /skills',
70
+ plugins:
71
+ 'Desktop: Extensions → Extensions tab (plugins that bring MCP servers: Connectors tab → Custom connectors) · TUI: /plugins',
61
72
  update: 'Desktop: Settings → System → Update · TUI: /update',
62
73
  usage: 'Desktop: /usage in the composer · TUI: /usage',
63
74
  doctor: 'Desktop: Settings → System → Doctor, or /doctor in the composer · TUI: /doctor',
@@ -133,6 +144,7 @@ function publicProviderRows(setup) {
133
144
  pick(row, {
134
145
  reauthRequired: row.reauthRequired === true,
135
146
  expiresAt: row.expiresAt || null,
147
+ plan: row.plan || null,
136
148
  })
137
149
  ),
138
150
  local: (setup?.local || []).map((row) =>
@@ -167,6 +179,7 @@ function configuredProviderRows(rows, accountCount) {
167
179
  kind,
168
180
  authenticated: row.authenticated,
169
181
  status: row.status,
182
+ ...(kind === 'oauth' ? { plan: row.plan || null } : {}),
170
183
  ...(row.reauthRequired ? { reauthRequired: true } : {}),
171
184
  ...accounts,
172
185
  });
@@ -627,6 +640,25 @@ const SETUP_ACTION_HANDLERS = {
627
640
  remove_plugin: async (rt, args) => ({
628
641
  plugin: (await rt.removePlugin(requireText(args.name, 'name')))?.plugin || null,
629
642
  }),
643
+ // The chat path of the one-click connect: the attached Desktop renders this
644
+ // call as a connect card (agent-chat connector card) that runs the same flow
645
+ // as Extensions → 커넥터. Nothing is connected here.
646
+ connect_connector: async (rt, args) => {
647
+ const entry = connectorById(requireText(args.connector, 'connector'));
648
+ if (!entry || entry.ownKey) throw new Error(`connector must be one of ${CONNECTOR_IDS.join(', ')}`);
649
+ const server = (rt.mcpStatus?.()?.servers || []).find((row) => row.connector === entry.id) || null;
650
+ const connected = entry.backend.kind === 'builtin' ? null : server?.connected === true;
651
+ return {
652
+ connector: entry.id,
653
+ name: entry.name,
654
+ backend: entry.backend.kind,
655
+ ...(server ? { server: server.name } : {}),
656
+ connected,
657
+ note: connected
658
+ ? `${entry.name} is already connected.`
659
+ : `A connect card for ${entry.name} is shown in this conversation; the user presses it (Desktop: Extensions → 커넥터). Check status mcp afterwards.`,
660
+ };
661
+ },
630
662
  enable_plugin_mcp: async (rt, args) => {
631
663
  const name = requireText(args.name, 'name');
632
664
  const plugin = ((await rt.pluginsStatus())?.plugins || []).find((row) => row.name === name || row.id === name);
@@ -645,6 +677,7 @@ const READ_ONLY_SETUP_ACTIONS = new Set([
645
677
  'open',
646
678
  'list_models',
647
679
  'get_mcp_server',
680
+ 'connect_connector',
648
681
  'read_definition',
649
682
  'search_local_models',
650
683
  'inspect_hf_model',
@@ -656,6 +689,7 @@ const BACKGROUND_SETUP_ACTIONS = new Set([
656
689
  'maintain_local_model',
657
690
  'cancel_local_installation',
658
691
  'reconnect_mcp',
692
+ 'run_automation',
659
693
  ]);
660
694
 
661
695
  function setupMutationReceipt(action, result) {
@@ -671,7 +705,16 @@ function setupMutationReceipt(action, result) {
671
705
  );
672
706
  }
673
707
 
674
- export function createSetupToolExecutor({ getApi, getConfig, notifySessionUi, getSessionId, flushSettings }) {
708
+ /** `getCallerSession(id)` returns the calling session's record (null when it
709
+ * cannot be resolved): automation actions authorize by its provenance. */
710
+ export function createSetupToolExecutor({
711
+ getApi,
712
+ getConfig,
713
+ notifySessionUi,
714
+ getSessionId,
715
+ getCallerSession,
716
+ flushSettings,
717
+ }) {
675
718
  const desktop = createSetupUiRequests({ notifySessionUi, getSessionId });
676
719
  const api = () => {
677
720
  const facade = getApi?.();
@@ -701,12 +744,31 @@ export function createSetupToolExecutor({ getApi, getConfig, notifySessionUi, ge
701
744
  };
702
745
  }
703
746
 
704
- async function execute(args, { signal }) {
747
+ async function execute(args, { signal, callerSessionId }) {
705
748
  signal?.throwIfAborted();
706
749
  const requestDesktop = (request) => desktop.request(request, { signal });
707
750
  const action = validateSetupInput(args);
751
+ // The session that made this call, not just the runtime's own Lead.
752
+ const sessionId = clean(callerSessionId) || clean(getSessionId?.());
753
+ const caller = (sessionId && getCallerSession?.(sessionId)) || null;
754
+ // A headless run (schedule, webhook, delegated agent) only reads settings:
755
+ // it never creates agents, definitions or automations, nor changes any
756
+ // other setting. Hosts without session provenance (no getCallerSession)
757
+ // skip this gate; automation actions still refuse an unknown caller.
758
+ if (getCallerSession && !READ_ONLY_SETUP_ACTIONS.has(action)) {
759
+ const scope = scheduleCallerScope(caller);
760
+ assertInteractiveCaller(scope, action);
761
+ // Agent definitions (contacts) change only from Mixy; another agent's
762
+ // home changes only its own agent settings.
763
+ if (AGENT_DEFINITION_ACTIONS.has(action) && args.definitionKind === 'agent') {
764
+ assertAgentEditorAccess(scope, caller, action);
765
+ }
766
+ if (action === 'set_agent_route') assertOwnAgentSettings(scope, args.agent, action);
767
+ }
708
768
  const rt = action === 'status' || action === 'open' ? null : api();
709
- if (!Object.hasOwn(SETUP_ACTION_HANDLERS, action)) return executeExtendedSetupAction(rt, args, requestDesktop);
769
+ if (!Object.hasOwn(SETUP_ACTION_HANDLERS, action)) {
770
+ return executeExtendedSetupAction(rt, args, requestDesktop, { sessionId, caller });
771
+ }
710
772
  return SETUP_ACTION_HANDLERS[action](rt, args, { requestDesktop, readStatus, openSurface });
711
773
  }
712
774
 
@@ -1,6 +1,8 @@
1
1
  import { SETUP_EXTENDED_PROPERTIES, SETUP_DESKTOP_ACTIONS } from './settings-contract.mjs';
2
2
  import { MEDIA_KINDS } from '../../runtime/media/tool-defs.mjs';
3
3
  import { OPENAI_COMPAT_PRESETS } from '../../runtime/agent/orchestrator/providers/openai-compat-presets.mjs';
4
+ import { agentIdOfHomeSession } from '../../runtime/agent/orchestrator/session/agent-home.mjs';
5
+ import { assertAutomationAccess, scheduleCallerScope } from '../services/schedule-access.mjs';
4
6
 
5
7
  const own = (value, key) => Object.hasOwn(value || {}, key);
6
8
  const pick = (value, keys) => Object.fromEntries(keys.filter((key) => own(value, key)).map((key) => [key, value[key]]));
@@ -203,6 +205,26 @@ async function saveDefinition(rt, args) {
203
205
  return creating ? rt.addSkill(next) : rt.saveSkill({ ...next, originalName: current.originalName });
204
206
  }
205
207
 
208
+ async function automationRow(rt, kind, name) {
209
+ const status = await rt.getChannelSetup();
210
+ return status[kind === 'schedule' ? 'schedules' : 'webhooks'].find((row) => row.name === name) || null;
211
+ }
212
+
213
+ /** Authorize one automation action for the calling session (`context.caller`,
214
+ * its session record; null when it could not be resolved) — schedule-access.mjs. */
215
+ async function authorizeAutomation(rt, context, { kind, action, current, owner = '' }) {
216
+ const scope = scheduleCallerScope(context.caller);
217
+ const transfer = String(owner ?? '').trim();
218
+ const agents = transfer && scope.kind === 'human' ? await rt.listAgents() : [];
219
+ assertAutomationAccess(scope, {
220
+ kind,
221
+ action,
222
+ current,
223
+ owner: transfer,
224
+ agentIds: (Array.isArray(agents) ? agents : []).map((agent) => agent?.id).filter(Boolean),
225
+ });
226
+ }
227
+
206
228
  export const EXTENDED_SETUP_HANDLERS = Object.freeze({
207
229
  set_local_context: (rt, args) => rt.setLocalProviderContext(args.modelId, args.localContextWindow),
208
230
  async list_models(rt, args) {
@@ -238,22 +260,29 @@ export const EXTENDED_SETUP_HANDLERS = Object.freeze({
238
260
  return {
239
261
  ...result,
240
262
  recovery:
241
- 'User-authored definition files are deleted. A built-in override may revert to its built-in definition.',
263
+ args.definitionKind === 'workflow'
264
+ ? 'User-authored definition files are deleted. A built-in override may revert to its built-in definition.'
265
+ : 'A custom agent or bot is archived with its chat and its routines are switched off; the user can restore it from Sessions → Archived, or delete it there for good. A built-in override reverts to its built-in definition.',
242
266
  };
243
267
  },
244
- async save_automation(rt, args) {
268
+ async save_automation(rt, args, context = {}) {
245
269
  const kind = args.automationKind;
246
270
  const input = args.entry;
247
271
  if (kind === 'webhook' && ['time', 'at', 'timezone', 'days'].some((key) => own(input, key))) {
248
- throw new Error('Schedule timing fields are not accepted for webhooks');
272
+ throw new Error('Schedule fields (timing) are not accepted for webhooks');
249
273
  }
250
274
  if (kind === 'schedule' && own(input, 'parser')) throw new Error('parser is a webhook-only field');
251
275
  let previous = {};
252
276
  if (input.overwrite) {
253
- const status = await rt.getChannelSetup();
254
- previous = status[kind === 'schedule' ? 'schedules' : 'webhooks'].find((row) => row.name === input.name);
277
+ previous = await automationRow(rt, kind, input.name);
255
278
  if (!previous) throw new Error(`${kind} "${input.name}" does not exist`);
256
279
  }
280
+ await authorizeAutomation(rt, context, {
281
+ kind,
282
+ action: input.overwrite ? 'edit' : 'create',
283
+ current: input.overwrite ? previous : null,
284
+ owner: input.owner,
285
+ });
257
286
  const next = { ...pick(previous, entryKeys), ...input };
258
287
  if (kind === 'schedule') {
259
288
  if (previous.whenAt && !own(input, 'time') && !own(input, 'at')) {
@@ -263,6 +292,11 @@ export const EXTENDED_SETUP_HANDLERS = Object.freeze({
263
292
  if (own(input, 'time') && !own(input, 'at')) delete next.at;
264
293
  if (own(input, 'at') && !own(input, 'time')) delete next.time;
265
294
  }
295
+ // An automation created from an agent's home thread belongs to that agent.
296
+ if (!input.overwrite && !own(input, 'owner')) {
297
+ const homeAgent = agentIdOfHomeSession(context.sessionId);
298
+ if (homeAgent) next.owner = homeAgent;
299
+ }
266
300
  const result = kind === 'schedule' ? await rt.saveSchedule(next) : await rt.saveWebhook(next);
267
301
  return {
268
302
  ...publicAutomation(result),
@@ -275,18 +309,42 @@ export const EXTENDED_SETUP_HANDLERS = Object.freeze({
275
309
  : {}),
276
310
  };
277
311
  },
278
- async delete_automation(rt, args) {
279
- const status = await rt.getChannelSetup();
280
- const rows = status[args.automationKind === 'schedule' ? 'schedules' : 'webhooks'];
281
- if (!rows.some((row) => row.name === args.name)) throw new Error('Automation entry not found');
312
+ async delete_automation(rt, args, context = {}) {
313
+ const current = await automationRow(rt, args.automationKind, args.name);
314
+ if (!current) throw new Error('Automation entry not found');
315
+ await authorizeAutomation(rt, context, { kind: args.automationKind, action: 'delete', current });
282
316
  const result =
283
317
  args.automationKind === 'schedule' ? await rt.deleteSchedule(args.name) : await rt.deleteWebhook(args.name);
284
318
  return { ...result, recovery: 'The automation record is deleted; recreating it requires its definition.' };
285
319
  },
286
- set_automation_enabled: (rt, args) =>
287
- args.automationKind === 'schedule'
320
+ async set_automation_enabled(rt, args, context = {}) {
321
+ const current = await automationRow(rt, args.automationKind, args.name);
322
+ if (!current) throw new Error('Automation entry not found');
323
+ const action = args.enabled === false ? 'pause' : 'resume';
324
+ await authorizeAutomation(rt, context, { kind: args.automationKind, action, current });
325
+ return args.automationKind === 'schedule'
288
326
  ? rt.setScheduleEnabled(args.name, args.enabled)
289
- : rt.setWebhookEnabled(args.name, args.enabled),
327
+ : rt.setWebhookEnabled(args.name, args.enabled);
328
+ },
329
+ // Starts the run and returns at once: the run is its own session, and its
330
+ // result posts into the owning agent's thread when it ends. A webhook
331
+ // re-runs on its latest received payload.
332
+ async run_automation(rt, args, context = {}) {
333
+ const kind = args.automationKind;
334
+ const current = await automationRow(rt, kind, args.name);
335
+ if (!current) throw new Error('Automation entry not found');
336
+ await authorizeAutomation(rt, context, { kind, action: 'run', current });
337
+ if (kind === 'webhook' && current.hasLastPayload !== true) {
338
+ throw new Error(`webhook "${args.name}" has not received a payload yet`);
339
+ }
340
+ const run = kind === 'webhook' ? rt.runWebhookNow(args.name) : rt.runScheduleNow(args.name);
341
+ void Promise.resolve(run).catch(() => {});
342
+ return {
343
+ name: args.name,
344
+ started: true,
345
+ note: "The run is its own session; its result posts into the owning agent's thread when it finishes.",
346
+ };
347
+ },
290
348
  async set_developer_option(rt, args) {
291
349
  const option = rt
292
350
  .getDeveloperSettings()
@@ -360,9 +418,9 @@ function hookRuleAt(rt, index) {
360
418
  return publicHookRule(rule);
361
419
  }
362
420
 
363
- export async function executeExtendedSetupAction(rt, args, requestDesktop) {
421
+ export async function executeExtendedSetupAction(rt, args, requestDesktop, context = {}) {
364
422
  if (SETUP_DESKTOP_ACTIONS.includes(args.action)) return requestDesktop(args);
365
423
  const handler = EXTENDED_SETUP_HANDLERS[args.action];
366
424
  if (!handler) throw new Error(`setup: unhandled action "${args.action}"`);
367
- return handler(rt, args);
425
+ return handler(rt, args, context);
368
426
  }
@@ -26,6 +26,7 @@ export const SETUP_EXTENDED_ACTION_FIELDS = Object.freeze({
26
26
  save_automation: 'automationKind entry',
27
27
  delete_automation: 'automationKind name',
28
28
  set_automation_enabled: 'automationKind name enabled',
29
+ run_automation: 'automationKind name',
29
30
  set_webhook_config: 'webhook',
30
31
  set_desktop_settings: 'desktop',
31
32
  set_appearance: 'appearance',
@@ -51,6 +52,7 @@ export const SETUP_ACTIVITY_RAIL_PIN_IDS = Object.freeze([
51
52
  'workflows',
52
53
  'projects',
53
54
  'extensions',
55
+ 'skills',
54
56
  'source-control',
55
57
  'search',
56
58
  'webhooks',
@@ -172,13 +174,7 @@ export const SETUP_EXTENDED_PROPERTIES = Object.freeze({
172
174
  timezone: text,
173
175
  days: { ...text, description: 'Schedule day selector, e.g. weekdays or mon,wed,fri.' },
174
176
  parser: { type: 'string', enum: ['github', 'generic', 'stripe', 'sentry'] },
175
- model: {
176
- ...text,
177
- description:
178
- 'Required for new schedules; no default-model fallback. Use provider/model[@effort][+fast][+noauto][?parameter=value] (+noauto: Auto reasoning off; absent = on) or an existing preset name. On overwrite, omission preserves the saved model, which must be non-empty.',
179
- },
180
177
  cwd: text,
181
- workflow: text,
182
178
  attachments: {
183
179
  type: 'array',
184
180
  maxItems: 8,
@@ -197,6 +193,11 @@ export const SETUP_EXTENDED_PROPERTIES = Object.freeze({
197
193
  ),
198
194
  },
199
195
  enabled: boolean,
196
+ owner: {
197
+ ...text,
198
+ description:
199
+ "The bot id that owns the schedule or webhook; each run is a turn in that bot's chat, where it replies with the result. The bot must exist (no representative bot yet = refused). New entries default to the bot of the calling thread (the representative bot = lead); on overwrite, omission keeps the owner.",
200
+ },
200
201
  overwrite: { ...boolean, description: 'Explicitly update an existing entry; omitted fields are preserved.' },
201
202
  },
202
203
  ['name']
@@ -213,6 +214,7 @@ export const SETUP_EXTENDED_PROPERTIES = Object.freeze({
213
214
  usagePinned: boolean,
214
215
  usageRailShortLong: boolean,
215
216
  computerObserveOnly: boolean,
217
+ browserAutoSignIn: boolean,
216
218
  notificationVolume: {
217
219
  type: 'integer',
218
220
  minimum: 0,
@@ -7,6 +7,7 @@ import {
7
7
  import { MEDIA_KINDS } from '../../runtime/media/tool-defs.mjs';
8
8
  import { INSTRUCTION_FILES_MODES } from '../../runtime/shared/instruction-files-mode.mjs';
9
9
  import { WORKTREE_NEW_TASK_DEFAULTS } from '../../runtime/shared/worktrees/settings.mjs';
10
+ import { CONNECTOR_IDS } from '../../runtime/shared/connector-catalog.mjs';
10
11
 
11
12
  /** Built-in `setup` tool: the model's handle on a Mixdog user's persisted
12
13
  * configuration. The description is a contract only; how to use each action
@@ -110,6 +111,7 @@ export const SETUP_ACTION_FIELDS = Object.freeze({
110
111
  set_plugin_enabled: 'name enabled',
111
112
  remove_plugin: 'name',
112
113
  enable_plugin_mcp: 'name',
114
+ connect_connector: 'connector',
113
115
  set_worktree_settings: 'worktree',
114
116
  ...SETUP_EXTENDED_ACTION_FIELDS,
115
117
  });
@@ -345,6 +347,12 @@ export const SETUP_TOOL_DEFS = Object.freeze([
345
347
  description: 'set_disabled_skills: full list of disabled skill names.',
346
348
  },
347
349
  source: { type: 'string', description: 'add_plugin: Git URL, owner/repo, or local path.' },
350
+ connector: {
351
+ type: 'string',
352
+ enum: [...CONNECTOR_IDS],
353
+ description:
354
+ 'connect_connector: catalog service to connect. Shows the user a connect card in this conversation (one-click sign-in or a key sheet in Desktop); it never connects by itself.',
355
+ },
348
356
  kind: {
349
357
  type: 'string',
350
358
  enum: ['skills', 'mcp', 'plugins', ...MEDIA_KINDS],
@@ -1,7 +1,7 @@
1
1
  // Skill surface (status listing, resource load, tool envelope, global skill
2
2
  // creation/editing). The runtime facade only wires the mutable cwd and the
3
3
  // context module into it.
4
- import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
4
+ import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
5
5
  import { basename, dirname, isAbsolute, join, relative, resolve } from 'node:path';
6
6
  import { resolvePluginData } from '../runtime/shared/plugin-paths.mjs';
7
7
  import {
@@ -193,6 +193,20 @@ export function createSkillsApi({ contextMod, getCwd, getTools = () => [] }) {
193
193
  return { originalName, name, filePath };
194
194
  }
195
195
 
196
+ function removeGlobalSkill(input = {}) {
197
+ const name = validateSkillName(input.name);
198
+ const resource = contextMod.loadSkillResource?.(name, getCwd());
199
+ if (!resource?.filePath) throw new Error(`skill not found: ${name}`);
200
+ const dir = dirname(resolve(resource.filePath));
201
+ const rel = relative(globalSkillsRoot(), dir);
202
+ if (!rel || rel.startsWith('..') || isAbsolute(rel) || basename(dir) !== name) {
203
+ throw new Error(`only your own skills can be removed: ${name}`);
204
+ }
205
+ rmSync(dir, { recursive: true, force: true });
206
+ invalidateSkills();
207
+ return { name };
208
+ }
209
+
196
210
  function invalidateSkills() {
197
211
  contextMod.invalidateSkillsCache?.(getCwd());
198
212
  }
@@ -203,6 +217,7 @@ export function createSkillsApi({ contextMod, getCwd, getTools = () => [] }) {
203
217
  skillToolContent,
204
218
  addGlobalSkill,
205
219
  saveSkillDocument,
220
+ removeGlobalSkill,
206
221
  invalidateSkills,
207
222
  };
208
223
  }