mixdog 0.8.1 → 0.9.1

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 (299) hide show
  1. package/README.md +47 -23
  2. package/package.json +34 -28
  3. package/scripts/_test-folder-dialog.mjs +30 -0
  4. package/scripts/agent-parallel-smoke.mjs +388 -0
  5. package/scripts/agent-tag-reuse-smoke.mjs +183 -0
  6. package/scripts/background-task-meta-smoke.mjs +38 -0
  7. package/scripts/boot-smoke.mjs +52 -9
  8. package/scripts/build-runtime-linux.sh +348 -0
  9. package/scripts/build-runtime-macos.sh +217 -0
  10. package/scripts/build-runtime-windows.ps1 +242 -0
  11. package/scripts/compact-active-turn-test.mjs +68 -0
  12. package/scripts/compact-smoke.mjs +859 -129
  13. package/scripts/compact-trigger-migration-smoke.mjs +187 -0
  14. package/scripts/fix-brief-fn.mjs +35 -0
  15. package/scripts/fix-format-tool-surface.mjs +24 -0
  16. package/scripts/fix-tool-exec-visible.mjs +42 -0
  17. package/scripts/generate-runtime-manifest.mjs +166 -0
  18. package/scripts/hook-bus-test.mjs +330 -0
  19. package/scripts/lead-workflow-smoke.mjs +33 -39
  20. package/scripts/live-worker-smoke.mjs +43 -37
  21. package/scripts/llm-trace-summary.mjs +315 -0
  22. package/scripts/memory-meta-concurrency-test.mjs +20 -0
  23. package/scripts/output-style-smoke.mjs +56 -15
  24. package/scripts/parent-abort-link-test.mjs +44 -0
  25. package/scripts/patch-agent-brief.mjs +48 -0
  26. package/scripts/patch-app.mjs +21 -0
  27. package/scripts/patch-app2.mjs +18 -0
  28. package/scripts/patch-dist-brief.mjs +96 -0
  29. package/scripts/patch-tool-exec.mjs +70 -0
  30. package/scripts/pretool-ask-runtime-test.mjs +54 -0
  31. package/scripts/provider-toolcall-test.mjs +376 -0
  32. package/scripts/reactive-compact-persist-smoke.mjs +124 -0
  33. package/scripts/sanitize-tool-pairs-test.mjs +260 -0
  34. package/scripts/session-context-bench.mjs +205 -33
  35. package/scripts/session-ingest-smoke.mjs +177 -0
  36. package/scripts/set-effort-config-test.mjs +41 -0
  37. package/scripts/smoke-runtime-negative.ps1 +106 -0
  38. package/scripts/smoke-runtime-negative.sh +97 -0
  39. package/scripts/smoke.mjs +25 -0
  40. package/scripts/tool-result-hook-test.mjs +48 -0
  41. package/scripts/tool-smoke.mjs +1222 -90
  42. package/scripts/toolcall-args-test.mjs +150 -0
  43. package/scripts/tui-background-failure-smoke.mjs +73 -0
  44. package/scripts/usage-metrics-epoch-smoke.mjs +114 -0
  45. package/src/agents/debugger/AGENT.md +8 -0
  46. package/src/agents/explore/AGENT.md +4 -0
  47. package/src/agents/heavy-worker/AGENT.md +9 -3
  48. package/src/agents/maintainer/AGENT.md +4 -0
  49. package/src/agents/reviewer/AGENT.md +8 -0
  50. package/src/agents/scheduler-task/AGENT.md +12 -0
  51. package/src/agents/scheduler-task/agent.json +6 -0
  52. package/src/agents/webhook-handler/AGENT.md +12 -0
  53. package/src/agents/webhook-handler/agent.json +6 -0
  54. package/src/agents/worker/AGENT.md +9 -3
  55. package/src/app.mjs +77 -3
  56. package/src/defaults/hidden-roles.json +17 -12
  57. package/src/headless-role.mjs +117 -0
  58. package/src/help.mjs +30 -0
  59. package/src/hooks/lib/permission-evaluator.cjs +11 -475
  60. package/src/lib/keychain-cjs.cjs +9 -1
  61. package/src/lib/mixdog-debug.cjs +0 -29
  62. package/src/lib/plugin-paths.cjs +1 -7
  63. package/src/lib/rules-builder.cjs +242 -98
  64. package/src/lib/text-utils.cjs +1 -1
  65. package/src/mixdog-session-runtime.mjs +2211 -446
  66. package/src/output-styles/default.md +12 -28
  67. package/src/output-styles/extreme-simple.md +9 -6
  68. package/src/output-styles/simple.md +22 -9
  69. package/src/repl.mjs +108 -59
  70. package/src/rules/agent/00-common.md +15 -0
  71. package/src/rules/{bridge → agent}/20-skip-protocol.md +1 -2
  72. package/src/rules/agent/30-explorer.md +22 -0
  73. package/src/rules/{bridge → agent}/40-cycle1-agent.md +7 -0
  74. package/src/rules/{bridge → agent}/41-cycle2-agent.md +7 -0
  75. package/src/rules/{bridge → agent}/42-cycle3-agent.md +7 -0
  76. package/src/rules/lead/01-general.md +9 -5
  77. package/src/rules/lead/04-workflow.md +51 -12
  78. package/src/rules/lead/lead-tool.md +6 -0
  79. package/src/rules/shared/01-tool.md +12 -1
  80. package/src/runtime/agent/orchestrator/activity-bus.mjs +7 -18
  81. package/src/runtime/agent/orchestrator/agent-owner.mjs +11 -0
  82. package/src/runtime/agent/orchestrator/{smart-bridge/bridge-llm.mjs → agent-runtime/agent-dispatch.mjs} +138 -111
  83. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +94 -0
  84. package/src/runtime/agent/orchestrator/{smart-bridge → agent-runtime}/cache-strategy.mjs +32 -23
  85. package/src/runtime/agent/orchestrator/{smart-bridge → agent-runtime}/session-builder.mjs +33 -27
  86. package/src/runtime/agent/orchestrator/{bridge-trace.mjs → agent-trace.mjs} +132 -81
  87. package/src/runtime/agent/orchestrator/cache-mtime.mjs +0 -21
  88. package/src/runtime/agent/orchestrator/config.mjs +174 -55
  89. package/src/runtime/agent/orchestrator/context/collect.mjs +195 -487
  90. package/src/runtime/agent/orchestrator/dispatch-persist.mjs +1 -1
  91. package/src/runtime/agent/orchestrator/internal-roles.mjs +77 -29
  92. package/src/runtime/agent/orchestrator/internal-tools.mjs +5 -6
  93. package/src/runtime/agent/orchestrator/mcp/client.mjs +15 -9
  94. package/src/runtime/agent/orchestrator/providers/anthropic-betas.mjs +7 -1
  95. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +380 -268
  96. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +131 -93
  97. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +236 -4
  98. package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +49 -0
  99. package/src/runtime/agent/orchestrator/providers/gemini.mjs +58 -13
  100. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +67 -149
  101. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +132 -2
  102. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +4 -1
  103. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +45 -0
  104. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +61 -116
  105. package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +25 -0
  106. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +79 -255
  107. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +203 -71
  108. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +512 -312
  109. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +343 -518
  110. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +6 -6
  111. package/src/runtime/agent/orchestrator/providers/registry.mjs +88 -51
  112. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +289 -11
  113. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +41 -8
  114. package/src/runtime/agent/orchestrator/session/compact.mjs +1173 -267
  115. package/src/runtime/agent/orchestrator/session/context-utils.mjs +199 -36
  116. package/src/runtime/agent/orchestrator/session/loop.mjs +840 -612
  117. package/src/runtime/agent/orchestrator/session/manager.mjs +1574 -459
  118. package/src/runtime/agent/orchestrator/session/manager.reactive-persist.test.mjs +107 -0
  119. package/src/runtime/agent/orchestrator/session/store.mjs +67 -29
  120. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +2 -2
  121. package/src/runtime/agent/orchestrator/stall-policy.mjs +31 -16
  122. package/src/runtime/agent/orchestrator/tool-loop-guard.mjs +3 -219
  123. package/src/runtime/agent/orchestrator/tools/bash-session.mjs +35 -8
  124. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +19 -8
  125. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +10 -53
  126. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +60 -37
  127. package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +21 -2
  128. package/src/runtime/agent/orchestrator/tools/builtin/device-paths.mjs +1 -1
  129. package/src/runtime/agent/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -7
  130. package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +1 -3
  131. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +36 -12
  132. package/src/runtime/agent/orchestrator/tools/builtin/read-args.mjs +2 -0
  133. package/src/runtime/agent/orchestrator/tools/builtin/read-constants.mjs +2 -2
  134. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +5 -12
  135. package/src/runtime/agent/orchestrator/tools/builtin/read-image-resize.mjs +1 -1
  136. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +4 -36
  137. package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +2 -40
  138. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +148 -27
  139. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +2 -2
  140. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +43 -75
  141. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +90 -20
  142. package/src/runtime/agent/orchestrator/tools/builtin.mjs +59 -5
  143. package/src/runtime/agent/orchestrator/tools/code-graph-state.mjs +86 -0
  144. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +11 -11
  145. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4106 -4019
  146. package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +33 -4
  147. package/src/runtime/agent/orchestrator/tools/patch.mjs +90 -6
  148. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +6 -4
  149. package/src/runtime/agent/orchestrator/tools/result-compression.mjs +4 -4
  150. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +8 -1
  151. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +4 -4
  152. package/src/runtime/channels/index.mjs +149 -51
  153. package/src/runtime/channels/lib/cli-worker-host.mjs +1 -8
  154. package/src/runtime/channels/lib/config.mjs +0 -1
  155. package/src/runtime/channels/lib/drop-trace.mjs +1 -1
  156. package/src/runtime/channels/lib/executor.mjs +0 -3
  157. package/src/runtime/channels/lib/memory-client.mjs +0 -38
  158. package/src/runtime/channels/lib/output-forwarder.mjs +1 -8
  159. package/src/runtime/channels/lib/runtime-paths.mjs +0 -6
  160. package/src/runtime/channels/lib/scheduler.mjs +18 -14
  161. package/src/runtime/channels/lib/session-discovery.mjs +3 -6
  162. package/src/runtime/channels/lib/tool-format.mjs +0 -1
  163. package/src/runtime/channels/lib/transcript-discovery.mjs +4 -12
  164. package/src/runtime/channels/lib/webhook.mjs +1 -1
  165. package/src/runtime/channels/tool-defs.mjs +29 -29
  166. package/src/runtime/lib/keychain-cjs.cjs +0 -1
  167. package/src/runtime/memory/data/runtime-manifest.json +6 -7
  168. package/src/runtime/memory/index.mjs +519 -118
  169. package/src/runtime/memory/lib/agent-ipc.mjs +29 -12
  170. package/src/runtime/memory/lib/core-memory-store.mjs +2 -2
  171. package/src/runtime/memory/lib/embedding-model-config.mjs +55 -0
  172. package/src/runtime/memory/lib/embedding-provider.mjs +31 -4
  173. package/src/runtime/memory/lib/embedding-worker.mjs +19 -10
  174. package/src/runtime/memory/lib/llm-worker-host.mjs +0 -4
  175. package/src/runtime/memory/lib/memory-cycle1.mjs +28 -7
  176. package/src/runtime/memory/lib/memory-cycle2.mjs +4 -5
  177. package/src/runtime/memory/lib/memory-cycle3.mjs +2 -2
  178. package/src/runtime/memory/lib/memory-ops-policy.mjs +2 -2
  179. package/src/runtime/memory/lib/memory-session-merge.mjs +38 -0
  180. package/src/runtime/memory/lib/memory.mjs +88 -9
  181. package/src/runtime/memory/lib/model-profile.mjs +1 -1
  182. package/src/runtime/memory/lib/pg/adapter.mjs +1 -1
  183. package/src/runtime/memory/lib/pg/supervisor.mjs +12 -0
  184. package/src/runtime/memory/lib/runtime-fetcher.mjs +80 -21
  185. package/src/runtime/memory/lib/session-ingest.mjs +196 -0
  186. package/src/runtime/memory/lib/trace-store.mjs +96 -51
  187. package/src/runtime/memory/tool-defs.mjs +46 -37
  188. package/src/runtime/search/index.mjs +104 -473
  189. package/src/runtime/search/lib/config.mjs +0 -4
  190. package/src/runtime/search/lib/state.mjs +1 -15
  191. package/src/runtime/search/lib/web-tools.mjs +44 -25
  192. package/src/runtime/search/tool-defs.mjs +16 -23
  193. package/src/runtime/shared/abort-controller.mjs +1 -1
  194. package/src/runtime/shared/atomic-file.mjs +4 -3
  195. package/src/runtime/shared/background-tasks.mjs +122 -11
  196. package/src/runtime/shared/child-spawn-gate.mjs +139 -0
  197. package/src/runtime/shared/config.mjs +7 -4
  198. package/src/runtime/shared/err-text.mjs +131 -4
  199. package/src/runtime/shared/llm/cost.mjs +2 -2
  200. package/src/runtime/shared/llm/http-agent.mjs +23 -7
  201. package/src/runtime/shared/llm/index.mjs +34 -11
  202. package/src/runtime/shared/llm/usage-log.mjs +4 -4
  203. package/src/runtime/shared/markdown-frontmatter.mjs +56 -0
  204. package/src/runtime/shared/singleton-owner.mjs +104 -0
  205. package/src/runtime/shared/tool-execution-contract.mjs +199 -20
  206. package/src/runtime/shared/tool-execution-contract.test.mjs +183 -0
  207. package/src/runtime/shared/tool-surface.mjs +624 -95
  208. package/src/runtime/shared/user-data-guard.mjs +0 -2
  209. package/src/standalone/agent-task-status.mjs +203 -0
  210. package/src/standalone/agent-task-status.test.mjs +76 -0
  211. package/src/standalone/agent-tool.mjs +1913 -0
  212. package/src/standalone/channel-worker.mjs +370 -14
  213. package/src/standalone/explore-tool.mjs +165 -70
  214. package/src/standalone/folder-dialog.mjs +314 -0
  215. package/src/standalone/hook-bus.mjs +898 -22
  216. package/src/standalone/memory-runtime-proxy.mjs +320 -0
  217. package/src/standalone/projects.mjs +226 -0
  218. package/src/standalone/provider-admin.mjs +41 -24
  219. package/src/standalone/seeds.mjs +1 -78
  220. package/src/standalone/usage-dashboard.mjs +96 -8
  221. package/src/tui/App.jsx +4800 -2140
  222. package/src/tui/components/AnsiText.jsx +39 -28
  223. package/src/tui/components/ContextPanel.jsx +14 -4
  224. package/src/tui/components/Markdown.jsx +43 -77
  225. package/src/tui/components/MarkdownTable.jsx +9 -184
  226. package/src/tui/components/Message.jsx +28 -11
  227. package/src/tui/components/Picker.jsx +95 -56
  228. package/src/tui/components/PromptInput.jsx +428 -239
  229. package/src/tui/components/QueuedCommands.jsx +1 -1
  230. package/src/tui/components/SlashCommandPalette.jsx +27 -21
  231. package/src/tui/components/Spinner.jsx +67 -38
  232. package/src/tui/components/StatusLine.jsx +606 -38
  233. package/src/tui/components/TextEntryPanel.jsx +128 -9
  234. package/src/tui/components/ToolExecution.jsx +597 -362
  235. package/src/tui/components/TurnDone.jsx +3 -3
  236. package/src/tui/components/UsagePanel.jsx +3 -5
  237. package/src/tui/components/tool-output-format.mjs +499 -0
  238. package/src/tui/components/tool-output-format.test.mjs +312 -0
  239. package/src/tui/dist/index.mjs +9192 -2399
  240. package/src/tui/engine-runtime-notification.test.mjs +115 -0
  241. package/src/tui/engine-tool-result-text.test.mjs +75 -0
  242. package/src/tui/engine.mjs +1455 -279
  243. package/src/tui/figures.mjs +21 -40
  244. package/src/tui/index.jsx +75 -31
  245. package/src/tui/input-editing.mjs +25 -0
  246. package/src/tui/markdown/format-token.mjs +671 -69
  247. package/src/tui/markdown/format-token.test.mjs +312 -0
  248. package/src/tui/markdown/render-ansi.mjs +94 -0
  249. package/src/tui/markdown/render-ansi.test.mjs +108 -0
  250. package/src/tui/markdown/stream-fence.mjs +34 -0
  251. package/src/tui/markdown/stream-fence.test.mjs +26 -0
  252. package/src/tui/markdown/table-layout.mjs +250 -0
  253. package/src/tui/paste-attachments.mjs +0 -7
  254. package/src/tui/spinner-verbs.mjs +1 -2
  255. package/src/tui/statusline-ansi-bridge.mjs +172 -0
  256. package/src/tui/statusline-ansi-bridge.test.mjs +159 -0
  257. package/src/tui/theme.mjs +756 -24
  258. package/src/tui/time-format.mjs +1 -1
  259. package/src/tui/transcript-tool-failures.mjs +67 -0
  260. package/src/tui/transcript-tool-failures.test.mjs +111 -0
  261. package/src/ui/ansi.mjs +1 -2
  262. package/src/ui/markdown.mjs +85 -26
  263. package/src/ui/markdown.test.mjs +70 -0
  264. package/src/ui/model-display.mjs +121 -0
  265. package/src/ui/session-stats.mjs +44 -0
  266. package/src/ui/statusline-context-label.test.mjs +15 -0
  267. package/src/ui/statusline.mjs +386 -178
  268. package/src/ui/tool-card.mjs +2 -13
  269. package/src/vendor/statusline/bin/statusline-lib.mjs +1 -620
  270. package/src/vendor/statusline/bin/statusline-route.mjs +169 -37
  271. package/src/vendor/statusline/bin/statusline-route.test.mjs +80 -0
  272. package/src/vendor/statusline/scripts/lib/gateway-settings.mjs +3 -3
  273. package/src/vendor/statusline/src/gateway/claude-current.mjs +1 -1
  274. package/src/vendor/statusline/src/gateway/route-meta.mjs +44 -6
  275. package/src/vendor/statusline/src/gateway/session-routes.mjs +1 -1
  276. package/src/workflows/default/WORKFLOW.md +12 -5
  277. package/src/workflows/default/workflow.json +0 -1
  278. package/src/workflows/solo/WORKFLOW.md +15 -0
  279. package/src/workflows/solo/workflow.json +7 -0
  280. package/vendor/ink/build/ink.js +54 -8
  281. package/vendor/ink/build/output.js +6 -1
  282. package/src/agents/scheduler-task.md +0 -3
  283. package/src/agents/web-researcher/AGENT.md +0 -3
  284. package/src/agents/web-researcher/agent.json +0 -6
  285. package/src/agents/webhook-handler.md +0 -3
  286. package/src/hooks/lib/permission-rules.cjs +0 -170
  287. package/src/hooks/lib/settings-loader.cjs +0 -112
  288. package/src/lib/hook-pipe-path.cjs +0 -10
  289. package/src/rules/bridge/00-common.md +0 -5
  290. package/src/rules/bridge/30-explorer.md +0 -4
  291. package/src/rules/lead/00-tool-lead.md +0 -5
  292. package/src/rules/shared/00-language.md +0 -3
  293. package/src/runtime/agent/orchestrator/tools/builtin/native-edit-runner.mjs +0 -110
  294. package/src/runtime/agent/orchestrator/tools/mutation-content-cache.mjs +0 -67
  295. package/src/runtime/channels/lib/hook-pipe-server.mjs +0 -671
  296. package/src/runtime/memory/lib/bridge-trace-queries.mjs +0 -120
  297. package/src/runtime/shared/llm/pid-cleanup.mjs +0 -27
  298. package/src/standalone/bridge-tool.mjs +0 -1414
  299. package/src/tui/runtime/shared/process-shutdown.mjs +0 -1
@@ -266,7 +266,7 @@ export function addPending(dataDir, handle, tool, queries, callerSessionId, clie
266
266
  /**
267
267
  * Best-effort check: is there at least one non-expired in-flight dispatch
268
268
  * recorded for this dataDir? Used by the scheduler's idle-state probe so
269
- * background tasks stay suppressed while a bridge dispatch is still
269
+ * background tasks stay suppressed while an agent dispatch is still
270
270
  * running. Never throws.
271
271
  */
272
272
  export function hasPending(dataDir) {
@@ -1,20 +1,17 @@
1
1
  /**
2
2
  * Internal hidden roles — Mixdog-managed, user-untouchable.
3
3
  *
4
- * Unlike user-workflow.json roles (which the user defines and edits freely),
5
- * these roles are NEVER exposed to callers of the `bridge` MCP tool. They are
4
+ * Unlike public workflow agents, these hidden roles are NEVER exposed to callers of the `agent` tool. They are
6
5
  * invoked only by internal handlers (explore / recall / search) and carry
7
6
  * their own system prompt + tool-set policy.
8
7
  *
9
- * Lookup order (bridge-llm.resolvePresetName):
8
+ * Lookup order (agent-dispatch.resolvePresetName):
10
9
  * 1. explicit preset arg
11
10
  * 2. opts.preset
12
- * 3. hidden-role registry (defaults/hidden-roles.json) <- Mixdog-internal
13
- * 4. user-workflow.json[role] ← user-owned
11
+ * 3. hidden-role registry (defaults/hidden-roles.json + systemFile frontmatter)
14
12
  *
15
- * Role definitions live in defaults/hidden-roles.json. Editing that file is a
16
- * Mixdog source change; users cannot break the dispatch path by touching their
17
- * workflow JSON.
13
+ * Role definitions live in defaults/hidden-roles.json and the referenced
14
+ * systemFile markdown frontmatter. Editing those files is a Mixdog source change.
18
15
  *
19
16
  * The preset names refer to entries seeded in mixdog-config.json (agent.presets)
20
17
  * via DEFAULT_PRESETS (see config.mjs). If the user deletes the referenced preset
@@ -24,7 +21,7 @@
24
21
  *
25
22
  * Kind classification:
26
23
  * - 'retrieval' : short-lived hidden retrieval roles (explore).
27
- * - 'maintenance' : background-trigger hidden roles (memory cycle, recap, scheduler,
24
+ * - 'maintenance' : background-trigger hidden roles (memory cycle, scheduler,
28
25
  * webhook). Receive only their own self section in BP2.
29
26
  *
30
27
  * Permission classification:
@@ -32,37 +29,87 @@
32
29
  * guard with the same error string public read-only roles see.
33
30
  * - 'read-write' : full tool surface — used by hidden roles that legitimately
34
31
  * mutate state (scheduler-task launches commands,
35
- * webhook-handler persists payloads). bridge-llm honors this
32
+ * webhook-handler persists payloads). agent-dispatch honors this
36
33
  * declaratively instead of forcing every hidden role to 'read'.
37
34
  *
38
35
  * Tool schema profile:
39
- * - 'unified' : shared bridge tool schema for provider cache reuse.
40
- * - 'llm-only' : no tools exposed; pure transform/classifier roles.
36
+ * - 'none' : no tools exposed; pure transform/classifier roles.
37
+ * - 'read' : read/search/code-navigation tools only.
38
+ * - 'full' : shared agent tool schema for provider cache reuse.
41
39
  *
42
- * BP3 role-specific instruction metadata (consumed by rules-builder.cjs
43
- * buildBridgeRoleSpecificContent + collect.mjs):
40
+ * Role-specific instruction metadata (consumed by rules-builder.cjs
41
+ * buildAgentRoleSpecificContent + collect.mjs):
44
42
  * - inboundEvent : role reports results back to Lead and must carry the
45
- * skip-protocol rule (rules/bridge/20-skip-protocol.md)
46
- * in its BP2 catalog so no-op outputs opt out of the Lead
43
+ * skip-protocol rule (rules/agent/20-skip-protocol.md)
44
+ * in its BP2 role-rule block so no-op outputs opt out of the Lead
47
45
  * inject.
48
46
  * - instructionDir : DATA_DIR subdir whose *.md tree is folded into the
49
- * role's BP3 role-specific block (webhook-handler →
47
+ * role's BP4-adjacent user/task data (webhook-handler →
50
48
  * webhooks, scheduler-task → schedules).
51
49
  */
52
50
 
53
51
  import { readFileSync, statSync } from 'fs'
54
52
  import { join } from 'path'
55
53
  import { mixdogRoot } from '../../shared/plugin-paths.mjs'
54
+ import {
55
+ normalizeAgentPermissionOrNone,
56
+ parseMarkdownFrontmatter,
57
+ } from '../../shared/markdown-frontmatter.mjs'
56
58
 
57
59
  // Resolve the path to defaults/hidden-roles.json once.
60
+ const _MIXDOG_ROOT = mixdogRoot()
58
61
  const _HIDDEN_ROLES_PATH = (() => {
59
- const root = mixdogRoot()
60
- return join(root, 'defaults', 'hidden-roles.json')
62
+ return join(_MIXDOG_ROOT, 'defaults', 'hidden-roles.json')
61
63
  })()
62
64
 
63
65
  /** @type {{ mtime: number, map: object } | null} */
64
66
  let _hiddenRolesCache = null
65
67
 
68
+ function _mtimeSafe(file) {
69
+ try { return statSync(file).mtimeMs } catch { return 0 }
70
+ }
71
+
72
+ function _hiddenRolesDependencyMtime() {
73
+ let mtime = _mtimeSafe(_HIDDEN_ROLES_PATH)
74
+ try {
75
+ const raw = JSON.parse(readFileSync(_HIDDEN_ROLES_PATH, 'utf8'))
76
+ for (const entry of (raw.roles || [])) {
77
+ const systemFile = typeof entry?.systemFile === 'string' ? entry.systemFile.trim() : ''
78
+ if (!systemFile) continue
79
+ mtime = Math.max(mtime, _mtimeSafe(join(_MIXDOG_ROOT, systemFile)))
80
+ }
81
+ } catch {}
82
+ return mtime
83
+ }
84
+
85
+ function _loadHiddenRoleFrontmatter(systemFile) {
86
+ const rel = typeof systemFile === 'string' ? systemFile.trim() : ''
87
+ if (!rel) return {}
88
+ try {
89
+ return parseMarkdownFrontmatter(readFileSync(join(_MIXDOG_ROOT, rel), 'utf8'))
90
+ } catch {
91
+ return {}
92
+ }
93
+ }
94
+
95
+ function _mergeHiddenRoleFrontmatter(entry) {
96
+ const fm = _loadHiddenRoleFrontmatter(entry.systemFile)
97
+ const merged = { ...entry }
98
+ const permission = normalizeAgentPermissionOrNone(fm.permission)
99
+ if (permission) merged.permission = permission
100
+ for (const key of ['toolSchemaProfile', 'kind', 'slot', 'maintKey', 'instructionDir']) {
101
+ if (typeof fm[key] === 'string' && fm[key].trim()) merged[key] = fm[key].trim()
102
+ }
103
+ for (const key of ['inboundEvent']) {
104
+ if (typeof fm[key] === 'string' && fm[key].trim()) {
105
+ const raw = fm[key].trim().toLowerCase()
106
+ if (raw === 'true') merged[key] = true
107
+ else if (raw === 'false') merged[key] = false
108
+ }
109
+ }
110
+ return merged
111
+ }
112
+
66
113
  /**
67
114
  * Read and parse defaults/hidden-roles.json. Throws on missing/malformed.
68
115
  */
@@ -71,7 +118,7 @@ function _loadHiddenRoles() {
71
118
  const raw = JSON.parse(readFileSync(_HIDDEN_ROLES_PATH, 'utf8'))
72
119
  const map = Object.create(null)
73
120
  for (const entry of (raw.roles || [])) {
74
- if (entry && entry.name) map[entry.name] = Object.freeze({ ...entry })
121
+ if (entry && entry.name) map[entry.name] = Object.freeze(_mergeHiddenRoleFrontmatter(entry))
75
122
  }
76
123
  return Object.freeze(map)
77
124
  } catch (err) {
@@ -88,7 +135,7 @@ function _loadHiddenRoles() {
88
135
  */
89
136
  function _getHiddenRoles() {
90
137
  try {
91
- const mtime = statSync(_HIDDEN_ROLES_PATH).mtimeMs
138
+ const mtime = _hiddenRolesDependencyMtime()
92
139
  if (_hiddenRolesCache && mtime <= _hiddenRolesCache.mtime) {
93
140
  return _hiddenRolesCache.map
94
141
  }
@@ -114,10 +161,11 @@ export function getHiddenRole(name) {
114
161
  }
115
162
 
116
163
  /**
117
- * Resolve permission stamped on a bridge session. Hidden roles declared
164
+ * Resolve permission stamped on a agent session. Hidden roles declared
118
165
  * `permission: 'read'` are read-locked — caller opts cannot upgrade them.
166
+ * Other built-in permissions include `none`, `read-write`, `mcp`, and `full`.
119
167
  */
120
- export function resolveBridgeSessionPermission(role, callerPermission) {
168
+ export function resolveAgentSessionPermission(role, callerPermission) {
121
169
  const hidden = getHiddenRole(role)
122
170
  if (hidden && hidden.permission === 'read') return 'read'
123
171
  if (callerPermission != null && callerPermission !== '') return callerPermission
@@ -126,7 +174,7 @@ export function resolveBridgeSessionPermission(role, callerPermission) {
126
174
  }
127
175
 
128
176
  /**
129
- * Boolean check — useful for branching inside bridge-llm / session-manager.
177
+ * Boolean check — useful for branching inside agent-dispatch / session-manager.
130
178
  */
131
179
  export function isHiddenRole(name) {
132
180
  if (!name) return false
@@ -143,7 +191,7 @@ export function listHiddenRoleNames() {
143
191
 
144
192
  /**
145
193
  * List hidden role names matching a given kind ('retrieval' | 'maintenance').
146
- * Consumed by collect.mjs to drive BP2 cache shard classification dynamically
194
+ * Consumed by collect.mjs to drive BP2 role-shard classification dynamically
147
195
  * instead of hard-coding role-name sets.
148
196
  */
149
197
  export function listHiddenRolesByKind(kind) {
@@ -168,7 +216,7 @@ export function getRoleCatalogShareAgents(name) {
168
216
 
169
217
  /**
170
218
  * True when a hidden role reports results back to Lead and must carry the
171
- * skip-protocol rule in its BP2 catalog. Replaces the hard-coded
219
+ * skip-protocol rule in its BP2 role-rule block. Replaces the hard-coded
172
220
  * INBOUND_EVENT_ROLES set in collect.mjs.
173
221
  */
174
222
  export function isInboundEventRole(name) {
@@ -177,9 +225,9 @@ export function isInboundEventRole(name) {
177
225
  }
178
226
 
179
227
  /**
180
- * Return the DATA_DIR subdir whose *.md tree folds into a role's BP3
181
- * role-specific block, or null when the role declares none. Replaces the
182
- * webhook/scheduler ternary in rules-builder.cjs buildBridgeRoleSpecificContent.
228
+ * Return the DATA_DIR subdir whose *.md tree rides as BP4-adjacent
229
+ * user/task data, or null when the role declares none. Replaces the
230
+ * webhook/scheduler ternary in rules-builder.cjs buildAgentRoleSpecificContent.
183
231
  */
184
232
  export function getRoleInstructionDir(name) {
185
233
  const hidden = getHiddenRole(name)
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Internal tool registry — in-process tools exposed to external LLMs via bridge.
2
+ * Internal tool registry — in-process tools exposed to external LLMs via the agent runtime.
3
3
  *
4
4
  * Populated by agent/index.mjs.handleToolCall when the server injects a
5
5
  * context carrying { toolExecutor, internalTools }. The executor dispatches
@@ -9,10 +9,10 @@
9
9
  * Orchestrator modules (session/manager.mjs, session/loop.mjs) import from
10
10
  * here instead of going through mcp/client.mjs for internal tools.
11
11
  *
12
- * Permission enforcement: bridge-worker tool calls (including internal tools)
13
- * are gated by _checkWorkerPermission() in session/loop.mjs BEFORE reaching
14
- * executeTool() executeInternalTool(). No duplicate check is needed here;
15
- * the loop is the single enforcement point for all dispatch paths.
12
+ * Permission enforcement has been removed (every tool call is trusted). The
13
+ * only remaining dispatch-time gate is the architectural scoping in
14
+ * _preDispatchDeny() in session/loop.mjs (agent-worker control-plane reject +
15
+ * no-tool role guard) not a permission check. No gating is needed here.
16
16
  */
17
17
 
18
18
  let _executor = null;
@@ -23,7 +23,6 @@ let _bootReady = false;
23
23
  let _bootResolver = null;
24
24
  const _bootPromise = new Promise((r) => { _bootResolver = r; });
25
25
  export function markBootReady() { if (_bootReady) return; _bootReady = true; _bootResolver(); }
26
- export async function awaitBootReady(timeoutMs = 2000) { if (_bootReady) return; await Promise.race([_bootPromise, new Promise((r) => setTimeout(r, timeoutMs))]); }
27
26
 
28
27
  // Per-tool executor overrides. Populated by addInternalTools() for extra
29
28
  // internal tools that bypass the main dispatch (tools.json + dispatchTool).
@@ -1,6 +1,3 @@
1
- import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
- import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
3
- import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
4
1
  import { readFileSync, existsSync, mkdirSync, writeFileSync } from 'fs';
5
2
  import { join } from 'path';
6
3
  import { tmpdir } from 'os';
@@ -19,6 +16,7 @@ const AUTO_DETECT_PORTS = {
19
16
  const DEFAULT_MCP_CALL_TIMEOUT_MS = 0;
20
17
  // --- State ---
21
18
  const servers = new Map();
19
+ let mcpSdkPromise = null;
22
20
  // Memo for mcpToolHasField(name, field) — keyed by `${toolName}|${field}`.
23
21
  // The lookup (regex parse + servers Map get + tools.find + schema property
24
22
  // inspection) runs on every MCP tool invocation but its result only changes
@@ -33,6 +31,19 @@ function mcpLog(line) {
33
31
  if (process.env.MIXDOG_QUIET_MCP_LOG) return;
34
32
  process.stderr.write(line);
35
33
  }
34
+
35
+ async function loadMcpSdk() {
36
+ mcpSdkPromise ??= Promise.all([
37
+ import('@modelcontextprotocol/sdk/client/index.js'),
38
+ import('@modelcontextprotocol/sdk/client/stdio.js'),
39
+ import('@modelcontextprotocol/sdk/client/streamableHttp.js'),
40
+ ]).then(([clientMod, stdioMod, httpMod]) => ({
41
+ Client: clientMod.Client,
42
+ StdioClientTransport: stdioMod.StdioClientTransport,
43
+ StreamableHTTPClientTransport: httpMod.StreamableHTTPClientTransport,
44
+ }));
45
+ return mcpSdkPromise;
46
+ }
36
47
  // --- Public API ---
37
48
  /**
38
49
  * Connect to MCP servers defined in config.
@@ -253,7 +264,6 @@ export function mcpToolHasField(name, field) {
253
264
  /**
254
265
  * Disconnect all MCP servers.
255
266
  */
256
- export const drainMcpClients = disconnectAll;
257
267
  export async function disconnectAll() {
258
268
  for (const [name, server] of servers) {
259
269
  try {
@@ -264,12 +274,8 @@ export async function disconnectAll() {
264
274
  }
265
275
  _invalidateMcpToolFieldMemo();
266
276
  }
267
- /**
268
- * Load MCP server configs from a JSON file.
269
- * Supports both `{ mcpServers: { ... } }` and flat `{ name: { ... } }` format.
270
- */
271
-
272
277
  async function connectServer(name, cfg) {
278
+ const { Client, StdioClientTransport, StreamableHTTPClientTransport } = await loadMcpSdk();
273
279
  const client = new Client({ name: `mixdog-agent/${name}`, version: '1.0.0' });
274
280
  let transport;
275
281
  // Auto-detect: read port from a running service's port file
@@ -1,5 +1,7 @@
1
1
  export const EXTENDED_CACHE_TTL_BETA_HEADER = 'extended-cache-ttl-2025-04-11';
2
+ export const INTERLEAVED_THINKING_BETA_HEADER = 'interleaved-thinking-2025-05-14';
2
3
  export const FAST_MODE_BETA_HEADER = 'fast-mode-2026-02-01';
4
+ export const TOOL_SEARCH_BETA_HEADER = 'advanced-tool-use-2025-11-20';
3
5
 
4
6
  export function supportsAnthropicFastMode(model) {
5
7
  const id = String(model || '').toLowerCase().replace(/\./g, '-');
@@ -7,8 +9,9 @@ export function supportsAnthropicFastMode(model) {
7
9
  }
8
10
 
9
11
  export function buildAnthropicBetaHeaders({
10
- base = EXTENDED_CACHE_TTL_BETA_HEADER,
12
+ base = `${INTERLEAVED_THINKING_BETA_HEADER},${EXTENDED_CACHE_TTL_BETA_HEADER}`,
11
13
  fastMode = false,
14
+ toolSearch = false,
12
15
  } = {}) {
13
16
  const headers = String(base || '')
14
17
  .split(',')
@@ -17,5 +20,8 @@ export function buildAnthropicBetaHeaders({
17
20
  if (fastMode && !headers.includes(FAST_MODE_BETA_HEADER)) {
18
21
  headers.push(FAST_MODE_BETA_HEADER);
19
22
  }
23
+ if (toolSearch && !headers.includes(TOOL_SEARCH_BETA_HEADER)) {
24
+ headers.push(TOOL_SEARCH_BETA_HEADER);
25
+ }
20
26
  return headers.join(',');
21
27
  }