mixdog 0.9.3 → 0.9.5

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 (382) hide show
  1. package/README.md +112 -38
  2. package/package.json +10 -3
  3. package/scripts/bench/lead-review-tasks-r3.json +20 -0
  4. package/scripts/bench/lead-review-tasks.json +20 -0
  5. package/scripts/bench/r4-mixed-tasks.json +20 -0
  6. package/scripts/bench/r5-orchestrated-task.json +7 -0
  7. package/scripts/bench/review-tasks.json +20 -0
  8. package/scripts/bench/round-codex.json +114 -0
  9. package/scripts/bench/round-mixdog-lead-r3.json +269 -0
  10. package/scripts/bench/round-mixdog-lead.json +269 -0
  11. package/scripts/bench/round-mixdog.json +126 -0
  12. package/scripts/bench/round-r10-bigsample.json +679 -0
  13. package/scripts/bench/round-r11-codexalign.json +257 -0
  14. package/scripts/bench/round-r13-clientmeta.json +464 -0
  15. package/scripts/bench/round-r14-betafeatures.json +466 -0
  16. package/scripts/bench/round-r15-fulldefault.json +462 -0
  17. package/scripts/bench/round-r16-sessionid.json +466 -0
  18. package/scripts/bench/round-r17-wirebytes.json +456 -0
  19. package/scripts/bench/round-r18-prewarm.json +468 -0
  20. package/scripts/bench/round-r19-clean.json +472 -0
  21. package/scripts/bench/round-r20-prewarm-clean.json +475 -0
  22. package/scripts/bench/round-r21-delta-retry.json +473 -0
  23. package/scripts/bench/round-r22-full-probe.json +693 -0
  24. package/scripts/bench/round-r23-itemprobe.json +701 -0
  25. package/scripts/bench/round-r24-shapefix.json +677 -0
  26. package/scripts/bench/round-r25-serial.json +464 -0
  27. package/scripts/bench/round-r26-parallel3.json +671 -0
  28. package/scripts/bench/round-r27-parallel10.json +894 -0
  29. package/scripts/bench/round-r28-parallel10-stagger.json +882 -0
  30. package/scripts/bench/round-r29-parallel10-stagger166.json +886 -0
  31. package/scripts/bench/round-r30-instid.json +253 -0
  32. package/scripts/bench/round-r31-upgradeprobe.json +256 -0
  33. package/scripts/bench/round-r32-vs-codex-lead.json +254 -0
  34. package/scripts/bench/round-r33-vs-codex-codex.json +115 -0
  35. package/scripts/bench/round-r34-orchestrated.json +120 -0
  36. package/scripts/bench/round-r35-orchestrated-codex.json +61 -0
  37. package/scripts/bench/round-r36-orchestrated-capped.json +128 -0
  38. package/scripts/bench/round-r4-codex.json +114 -0
  39. package/scripts/bench/round-r4-mixed.json +225 -0
  40. package/scripts/bench/round-r5-gpt-lead.json +259 -0
  41. package/scripts/bench/round-r6-codex.json +114 -0
  42. package/scripts/bench/round-r6-solo.json +257 -0
  43. package/scripts/bench/round-r7-full.json +254 -0
  44. package/scripts/bench/round-r8-fulldefault.json +255 -0
  45. package/scripts/bench-run.mjs +251 -32
  46. package/scripts/freevar-smoke.mjs +95 -0
  47. package/scripts/internal-comms-bench.mjs +3 -4
  48. package/scripts/internal-comms-smoke.mjs +10 -9
  49. package/scripts/model-catalog-audit.mjs +209 -0
  50. package/scripts/model-list-sanitize-test.mjs +37 -0
  51. package/scripts/mouse-probe.mjs +45 -0
  52. package/scripts/output-style-bench.mjs +13 -6
  53. package/scripts/output-style-smoke.mjs +4 -4
  54. package/scripts/provider-toolcall-test.mjs +7 -3
  55. package/scripts/recall-bench.mjs +76 -13
  56. package/scripts/recall-quality-cases.json +12 -0
  57. package/scripts/recall-usecase-cases.json +18 -0
  58. package/scripts/session-bench.mjs +152 -6
  59. package/scripts/tool-smoke.mjs +25 -65
  60. package/scripts/tui-render-smoke.mjs +90 -0
  61. package/scripts/webhook-smoke.mjs +208 -0
  62. package/src/agents/debugger/AGENT.md +4 -1
  63. package/src/agents/heavy-worker/AGENT.md +9 -8
  64. package/src/agents/maintainer/AGENT.md +4 -0
  65. package/src/agents/reviewer/AGENT.md +2 -1
  66. package/src/agents/scheduler-task/AGENT.md +2 -3
  67. package/src/agents/webhook-handler/AGENT.md +2 -3
  68. package/src/agents/worker/AGENT.md +10 -7
  69. package/src/app.mjs +12 -1
  70. package/src/headless-role.mjs +7 -1
  71. package/src/lib/rules-builder.cjs +4 -0
  72. package/src/mixdog-session-runtime.mjs +647 -2056
  73. package/src/output-styles/default.md +30 -9
  74. package/src/output-styles/{oneline.md → extreme-minimal.md} +5 -4
  75. package/src/output-styles/minimal.md +8 -6
  76. package/src/output-styles/simple.md +21 -7
  77. package/src/rules/agent/00-common.md +6 -3
  78. package/src/rules/agent/30-explorer.md +16 -5
  79. package/src/rules/lead/01-general.md +5 -5
  80. package/src/rules/lead/lead-brief.md +15 -0
  81. package/src/rules/lead/lead-tool.md +6 -15
  82. package/src/rules/shared/01-tool.md +17 -21
  83. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +8 -3
  84. package/src/runtime/agent/orchestrator/agent-runtime/agent-loop-policy.mjs +25 -0
  85. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +100 -23
  86. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +6 -15
  87. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +362 -0
  88. package/src/runtime/agent/orchestrator/agent-trace-io.mjs +410 -0
  89. package/src/runtime/agent/orchestrator/agent-trace.mjs +16 -735
  90. package/src/runtime/agent/orchestrator/config.mjs +69 -2
  91. package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +62 -20
  92. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +209 -0
  93. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +489 -0
  94. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +81 -1281
  95. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +607 -0
  96. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +32 -3
  97. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +81 -0
  98. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +248 -0
  99. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +303 -0
  100. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +505 -0
  101. package/src/runtime/agent/orchestrator/providers/gemini.mjs +43 -1013
  102. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +17 -3
  103. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +105 -11
  104. package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +356 -0
  105. package/src/runtime/agent/orchestrator/providers/openai-codex-model.mjs +108 -0
  106. package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +58 -0
  107. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +368 -0
  108. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +760 -0
  109. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +40 -1143
  110. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +740 -0
  111. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +193 -0
  112. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +349 -2131
  113. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +143 -1002
  114. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +229 -0
  115. package/src/runtime/agent/orchestrator/providers/openai-ws-events.mjs +67 -0
  116. package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +465 -0
  117. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +1105 -0
  118. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +2 -1
  119. package/src/runtime/agent/orchestrator/providers/provider-catalog-cache.mjs +80 -0
  120. package/src/runtime/agent/orchestrator/session/compact/budget.mjs +288 -0
  121. package/src/runtime/agent/orchestrator/session/compact/constants.mjs +85 -0
  122. package/src/runtime/agent/orchestrator/session/compact/engine.mjs +749 -0
  123. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +82 -0
  124. package/src/runtime/agent/orchestrator/session/compact/summary-schema.mjs +315 -0
  125. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +643 -0
  126. package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +326 -0
  127. package/src/runtime/agent/orchestrator/session/compact.mjs +40 -2282
  128. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +14 -2
  129. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +61 -0
  130. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +1 -3
  131. package/src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs +275 -0
  132. package/src/runtime/agent/orchestrator/session/loop/steering-ladder.mjs +173 -0
  133. package/src/runtime/agent/orchestrator/session/loop/termination.mjs +58 -0
  134. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +239 -0
  135. package/src/runtime/agent/orchestrator/session/loop.mjs +278 -402
  136. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +471 -0
  137. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +7 -4
  138. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +12 -0
  139. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +406 -0
  140. package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +80 -0
  141. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +210 -0
  142. package/src/runtime/agent/orchestrator/session/manager.mjs +166 -1087
  143. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +189 -0
  144. package/src/runtime/agent/orchestrator/session/store.mjs +74 -179
  145. package/src/runtime/agent/orchestrator/stall-policy.mjs +20 -1
  146. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +70 -20
  147. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +22 -2
  148. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +35 -44
  149. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +40 -0
  150. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +29 -0
  151. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +8 -0
  152. package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +126 -0
  153. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +81 -92
  154. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-paths.mjs +161 -0
  155. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-process.mjs +108 -0
  156. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +28 -265
  157. package/src/runtime/agent/orchestrator/tools/builtin.mjs +0 -6
  158. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +57 -3
  159. package/src/runtime/agent/orchestrator/tools/code-graph/keyword-match.mjs +82 -0
  160. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +10 -122
  161. package/src/runtime/agent/orchestrator/tools/code-graph/text-columns.mjs +45 -0
  162. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +6 -6
  163. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +6 -3
  164. package/src/runtime/agent/orchestrator/tools/patch/constants.mjs +9 -0
  165. package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +171 -0
  166. package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +471 -0
  167. package/src/runtime/agent/orchestrator/tools/patch/native-server.mjs +436 -0
  168. package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +342 -0
  169. package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +359 -0
  170. package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +340 -0
  171. package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +643 -0
  172. package/src/runtime/agent/orchestrator/tools/patch.mjs +36 -2959
  173. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +0 -21
  174. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +9 -72
  175. package/src/runtime/agent/orchestrator/tools/shell-powershell.mjs +77 -0
  176. package/src/runtime/agent/orchestrator/tools/shell-state.mjs +154 -0
  177. package/src/runtime/channels/backends/discord-access.mjs +32 -0
  178. package/src/runtime/channels/backends/discord-attachments.mjs +65 -0
  179. package/src/runtime/channels/backends/discord-gateway.mjs +233 -0
  180. package/src/runtime/channels/backends/discord.mjs +27 -318
  181. package/src/runtime/channels/backends/telegram.mjs +8 -12
  182. package/src/runtime/channels/index.mjs +247 -701
  183. package/src/runtime/channels/lib/backend-dispatch.mjs +46 -0
  184. package/src/runtime/channels/lib/config.mjs +37 -149
  185. package/src/runtime/channels/lib/event-pipeline.mjs +22 -5
  186. package/src/runtime/channels/lib/event-queue.mjs +78 -13
  187. package/src/runtime/channels/lib/inbound-routing.mjs +74 -0
  188. package/src/runtime/channels/lib/interaction-workflows.mjs +5 -113
  189. package/src/runtime/channels/lib/output-forwarder.mjs +1 -1
  190. package/src/runtime/channels/lib/owner-heartbeat.mjs +75 -0
  191. package/src/runtime/channels/lib/parent-bridge.mjs +88 -0
  192. package/src/runtime/channels/lib/runtime-paths.mjs +14 -4
  193. package/src/runtime/channels/lib/scheduler.mjs +27 -113
  194. package/src/runtime/channels/lib/session-discovery.mjs +56 -4
  195. package/src/runtime/channels/lib/tool-dispatch.mjs +158 -0
  196. package/src/runtime/channels/lib/tool-format.mjs +1 -1
  197. package/src/runtime/channels/lib/transcript-discovery.mjs +4 -4
  198. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +6 -3
  199. package/src/runtime/channels/lib/voice-transcription.mjs +179 -0
  200. package/src/runtime/channels/lib/webhook/deliveries.mjs +313 -0
  201. package/src/runtime/channels/lib/webhook/log.mjs +42 -0
  202. package/src/runtime/channels/lib/webhook/ngrok.mjs +181 -0
  203. package/src/runtime/channels/lib/webhook/signature.mjs +60 -0
  204. package/src/runtime/channels/lib/webhook.mjs +43 -616
  205. package/src/runtime/channels/tool-defs.mjs +11 -130
  206. package/src/runtime/memory/index.mjs +210 -1948
  207. package/src/runtime/memory/lib/core-memory-store.mjs +5 -1
  208. package/src/runtime/memory/lib/cycle-llm-adapters.mjs +58 -0
  209. package/src/runtime/memory/lib/cycle-scheduler.mjs +497 -0
  210. package/src/runtime/memory/lib/embedding-warmup.mjs +58 -0
  211. package/src/runtime/memory/lib/ko-morph.mjs +195 -0
  212. package/src/runtime/memory/lib/memory-config-flags.mjs +91 -0
  213. package/src/runtime/memory/lib/memory-cycle.mjs +1 -1
  214. package/src/runtime/memory/lib/memory-cycle2-gate.mjs +515 -0
  215. package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +324 -0
  216. package/src/runtime/memory/lib/memory-cycle2-shared.mjs +18 -0
  217. package/src/runtime/memory/lib/memory-cycle2.mjs +24 -842
  218. package/src/runtime/memory/lib/memory-embed.mjs +149 -0
  219. package/src/runtime/memory/lib/memory-process-lock.mjs +162 -0
  220. package/src/runtime/memory/lib/memory-recall-store.mjs +69 -12
  221. package/src/runtime/memory/lib/memory-text-utils.mjs +46 -0
  222. package/src/runtime/memory/lib/pg/supervisor.mjs +1 -1
  223. package/src/runtime/memory/lib/query-handlers.mjs +802 -0
  224. package/src/runtime/memory/lib/recall-format.mjs +55 -0
  225. package/src/runtime/memory/lib/runtime-fetcher.mjs +8 -3
  226. package/src/runtime/memory/lib/transcript-ingest.mjs +425 -0
  227. package/src/runtime/memory/tool-defs.mjs +5 -13
  228. package/src/runtime/search/lib/http-fetch.mjs +274 -0
  229. package/src/runtime/search/lib/ssrf-guard.mjs +333 -0
  230. package/src/runtime/search/lib/web-tools.mjs +24 -602
  231. package/src/runtime/shared/atomic-file.mjs +26 -1
  232. package/src/runtime/shared/config.mjs +14 -4
  233. package/src/runtime/shared/launcher-control.mjs +2 -2
  234. package/src/runtime/shared/markdown-frontmatter.mjs +19 -0
  235. package/src/runtime/shared/schedules-store.mjs +13 -3
  236. package/src/runtime/shared/tool-execution-contract.mjs +2 -2
  237. package/src/runtime/shared/tool-primitives.mjs +308 -0
  238. package/src/runtime/shared/tool-result-summary.mjs +515 -0
  239. package/src/runtime/shared/tool-surface.mjs +80 -898
  240. package/src/runtime/shared/transcript-writer.mjs +23 -0
  241. package/src/runtime/shared/update-checker.mjs +7 -4
  242. package/src/session-runtime/config-helpers.mjs +119 -2
  243. package/src/session-runtime/config-lifecycle.mjs +232 -0
  244. package/src/session-runtime/cwd-plugins.mjs +226 -0
  245. package/src/session-runtime/mcp-glue.mjs +177 -0
  246. package/src/session-runtime/model-recency.mjs +111 -0
  247. package/src/session-runtime/native-search.mjs +247 -0
  248. package/src/session-runtime/output-styles.mjs +11 -9
  249. package/src/session-runtime/prewarm.mjs +142 -0
  250. package/src/session-runtime/provider-models.mjs +278 -0
  251. package/src/session-runtime/provider-usage.mjs +120 -0
  252. package/src/session-runtime/quick-model-rows.mjs +205 -0
  253. package/src/session-runtime/quick-search-models.mjs +47 -0
  254. package/src/session-runtime/session-hooks.mjs +93 -0
  255. package/src/session-runtime/settings-api.mjs +352 -0
  256. package/src/session-runtime/tool-catalog.mjs +29 -29
  257. package/src/session-runtime/tool-defs.mjs +84 -0
  258. package/src/session-runtime/warmup-schedulers.mjs +201 -0
  259. package/src/session-runtime/workflow.mjs +1 -1
  260. package/src/standalone/agent-tool/helpers.mjs +237 -0
  261. package/src/standalone/agent-tool/notify.mjs +107 -0
  262. package/src/standalone/agent-tool/provider-init.mjs +143 -0
  263. package/src/standalone/agent-tool/render.mjs +152 -0
  264. package/src/standalone/agent-tool/tool-def.mjs +55 -0
  265. package/src/standalone/agent-tool.mjs +138 -669
  266. package/src/standalone/channel-admin.mjs +102 -90
  267. package/src/standalone/channel-worker.mjs +4 -7
  268. package/src/standalone/explore-tool.mjs +64 -14
  269. package/src/standalone/hook-bus/config.mjs +207 -0
  270. package/src/standalone/hook-bus/constants.mjs +90 -0
  271. package/src/standalone/hook-bus/handlers.mjs +481 -0
  272. package/src/standalone/hook-bus/payload.mjs +31 -0
  273. package/src/standalone/hook-bus/rules.mjs +77 -0
  274. package/src/standalone/hook-bus.mjs +77 -870
  275. package/src/standalone/memory-runtime-proxy.mjs +7 -0
  276. package/src/standalone/opencode-go-login.mjs +5 -1
  277. package/src/standalone/provider-admin.mjs +1 -16
  278. package/src/standalone/usage-dashboard.mjs +3 -1
  279. package/src/tui/App.jsx +1059 -8110
  280. package/src/tui/app/app-format.mjs +213 -0
  281. package/src/tui/app/channel-pickers.mjs +508 -0
  282. package/src/tui/app/clipboard.mjs +67 -0
  283. package/src/tui/app/core-memory-picker.mjs +210 -0
  284. package/src/tui/app/extension-pickers.mjs +506 -0
  285. package/src/tui/app/input-parsers.mjs +193 -0
  286. package/src/tui/app/maintenance-pickers.mjs +356 -0
  287. package/src/tui/app/model-options.mjs +334 -0
  288. package/src/tui/app/model-picker.mjs +365 -0
  289. package/src/tui/app/onboarding-steps.mjs +400 -0
  290. package/src/tui/app/project-picker.mjs +247 -0
  291. package/src/tui/app/provider-setup-picker.mjs +580 -0
  292. package/src/tui/app/resume-picker.mjs +55 -0
  293. package/src/tui/app/route-pickers.mjs +419 -0
  294. package/src/tui/app/settings-picker.mjs +489 -0
  295. package/src/tui/app/slash-commands.mjs +101 -0
  296. package/src/tui/app/slash-dispatch.mjs +427 -0
  297. package/src/tui/app/text-layout.mjs +46 -0
  298. package/src/tui/app/theme-effort-pickers.mjs +154 -0
  299. package/src/tui/app/transcript-window.mjs +677 -0
  300. package/src/tui/app/use-mouse-input.mjs +460 -0
  301. package/src/tui/app/use-prompt-handlers.mjs +310 -0
  302. package/src/tui/app/use-transcript-scroll.mjs +512 -0
  303. package/src/tui/app/use-transcript-window.mjs +607 -0
  304. package/src/tui/components/ConfirmBar.jsx +10 -7
  305. package/src/tui/components/Picker.jsx +64 -15
  306. package/src/tui/components/PromptInput.jsx +33 -102
  307. package/src/tui/components/SlashCommandPalette.jsx +8 -1
  308. package/src/tui/components/StatusLine.jsx +69 -15
  309. package/src/tui/components/TextEntryPanel.jsx +11 -0
  310. package/src/tui/components/ToolExecution.jsx +52 -594
  311. package/src/tui/components/TranscriptItem.jsx +105 -0
  312. package/src/tui/components/UsagePanel.jsx +18 -4
  313. package/src/tui/components/prompt-input/edit-helpers.mjs +72 -0
  314. package/src/tui/components/prompt-input/voice-indicator.mjs +39 -0
  315. package/src/tui/components/tool-execution/ResultBody.jsx +56 -0
  316. package/src/tui/components/tool-execution/surface-detail.mjs +405 -0
  317. package/src/tui/components/tool-execution/text-format.mjs +161 -0
  318. package/src/tui/display-width.mjs +20 -3
  319. package/src/tui/dist/index.mjs +13553 -12384
  320. package/src/tui/engine/agent-job-feed.mjs +133 -0
  321. package/src/tui/engine/notification-plan.mjs +76 -0
  322. package/src/tui/engine/render-timing.mjs +17 -0
  323. package/src/tui/engine/tool-approval.mjs +94 -0
  324. package/src/tui/engine/tool-card-results.mjs +234 -0
  325. package/src/tui/engine/tool-result-status.mjs +135 -0
  326. package/src/tui/engine.mjs +170 -574
  327. package/src/tui/figures.mjs +5 -0
  328. package/src/tui/index.jsx +65 -1
  329. package/src/tui/input-editing.mjs +2 -2
  330. package/src/tui/markdown/format-token.mjs +4 -1
  331. package/src/tui/statusline-ansi-bridge.mjs +11 -3
  332. package/src/tui/theme.mjs +6 -0
  333. package/src/ui/statusline-agents.mjs +213 -0
  334. package/src/ui/statusline-format.mjs +146 -0
  335. package/src/ui/statusline-segments.mjs +148 -0
  336. package/src/ui/statusline.mjs +77 -501
  337. package/src/ui/tool-card.mjs +0 -1
  338. package/src/vendor/statusline/bin/statusline-route.mjs +15 -2
  339. package/src/workflows/default/WORKFLOW.md +16 -18
  340. package/src/workflows/sequential/WORKFLOW.md +16 -18
  341. package/vendor/ink/build/display-width.js +19 -3
  342. package/vendor/ink/build/ink.js +112 -7
  343. package/vendor/ink/build/log-update.js +17 -3
  344. package/vendor/ink/build/wrap-text.js +125 -0
  345. package/scripts/_test-folder-dialog.mjs +0 -30
  346. package/scripts/fix-brief-fn.mjs +0 -35
  347. package/scripts/fix-format-tool-surface.mjs +0 -24
  348. package/scripts/fix-tool-exec-visible.mjs +0 -42
  349. package/scripts/patch-agent-brief.mjs +0 -48
  350. package/scripts/patch-app.mjs +0 -21
  351. package/scripts/patch-app2.mjs +0 -18
  352. package/scripts/patch-dist-brief.mjs +0 -96
  353. package/scripts/patch-tool-exec.mjs +0 -70
  354. package/src/examples/schedules/SCHEDULE.example.md +0 -32
  355. package/src/examples/webhooks/WEBHOOK.example.md +0 -40
  356. package/src/runtime/agent/orchestrator/session/manager.reactive-persist.test.mjs +0 -107
  357. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.test.mjs +0 -143
  358. package/src/runtime/agent/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -285
  359. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.test.mjs +0 -162
  360. package/src/runtime/agent/orchestrator/tools/builtin/open-config-tool.mjs +0 -26
  361. package/src/runtime/channels/lib/holidays.mjs +0 -138
  362. package/src/runtime/shared/channel-notification-routing.test.mjs +0 -45
  363. package/src/runtime/shared/task-notification-envelope.test.mjs +0 -107
  364. package/src/runtime/shared/tool-execution-contract.test.mjs +0 -183
  365. package/src/standalone/agent-task-status.test.mjs +0 -76
  366. package/src/tui/components/tool-output-format.test.mjs +0 -399
  367. package/src/tui/display-width.test.mjs +0 -35
  368. package/src/tui/engine-runtime-notification.test.mjs +0 -115
  369. package/src/tui/engine-tool-result-text.test.mjs +0 -75
  370. package/src/tui/input-editing.selection.test.mjs +0 -75
  371. package/src/tui/markdown/format-token.test.mjs +0 -354
  372. package/src/tui/markdown/render-ansi.test.mjs +0 -108
  373. package/src/tui/markdown/stream-fence.test.mjs +0 -26
  374. package/src/tui/markdown/streaming-markdown.test.mjs +0 -70
  375. package/src/tui/paste-fix.test.mjs +0 -119
  376. package/src/tui/prompt-history-store.test.mjs +0 -52
  377. package/src/tui/statusline-ansi-bridge.test.mjs +0 -159
  378. package/src/tui/transcript-tool-failures.test.mjs +0 -111
  379. package/src/ui/markdown.test.mjs +0 -70
  380. package/src/ui/statusline-context-label.test.mjs +0 -15
  381. package/src/vendor/statusline/bin/statusline-lib.mjs +0 -186
  382. package/src/vendor/statusline/bin/statusline-route.test.mjs +0 -80
package/README.md CHANGED
@@ -1,84 +1,158 @@
1
1
  # mixdog
2
2
 
3
- Mixdog is a standalone coding-agent CLI/TUI workspace for developers who want
4
- one terminal experience across multiple LLM providers.
3
+ Standalone coding-agent CLI/TUI for running a multi-provider AI workspace from
4
+ one terminal.
5
5
 
6
- It combines an Ink-based terminal UI, a multi-provider runtime, workflow agents,
7
- MCP/plugin/skill loading, memory, web search, channel integrations, and focused
8
- repo tools for reading, editing, testing, and reviewing code.
6
+ Mixdog combines an Ink-based terminal UI, model/provider routing, workflow
7
+ agents, MCP/plugin/skill loading, memory, web search, channel integrations, and
8
+ repo-focused tools for reading, editing, testing, and reviewing code.
9
9
 
10
10
  ## Highlights
11
11
 
12
- - Multi-provider model routing for Anthropic, OpenAI-compatible APIs, Google,
13
- XAI/Grok, OAuth-backed providers, and local endpoints.
14
- - Full-screen TUI with slash commands, model/workflow pickers, provider setup,
15
- usage dashboards, tool cards, statusline integration, and resumable sessions.
16
- - Agent task delegation through the `agent` tool and `/agent` command.
17
- - Focused repo tools for `read`, `grep`, `glob`, `list`, `code_graph`,
12
+ - **Multi-provider model picker** for Anthropic, OpenAI, Google/Gemini, xAI/Grok,
13
+ DeepSeek, OpenCode Go, OAuth-backed providers, OpenAI-compatible APIs, Ollama,
14
+ and LM Studio/local endpoints.
15
+ - **Live model catalog** from provider `/models` endpoints, enriched with
16
+ LiteLLM/models.dev metadata for context windows, output limits, pricing, tool
17
+ support, reasoning, web search, and recency.
18
+ - **Full-screen TUI** with slash commands, provider setup, model/workflow
19
+ pickers, usage dashboards, statusline integration, resumable sessions, and
20
+ detailed tool cards.
21
+ - **Workflow delegation** through `/agent` and the `agent` tool, including
22
+ worker, heavy-worker, reviewer, debugger, maintainer, and explorer roles.
23
+ - **Repo-native tools** for `read`, `grep`, `glob`, `list`, `code_graph`,
18
24
  `apply_patch`, `shell`, `cwd`, `explore`, web search, and memory recall.
19
- - Workflow agents for implementation, review, debugging, maintenance, web
20
- research, and heavier model routes.
21
- - Optional Discord/channel/webhook/schedule integrations for remote or event
22
- driven workflows.
25
+ - **Remote/event workflows** via optional Discord channel, webhook, schedule,
26
+ and channel-management integrations.
23
27
 
24
28
  ## Requirements
25
29
 
26
30
  - Node.js >= 22
27
31
 
28
- ## Setup
32
+ ## Install
29
33
 
30
34
  ```bash
31
35
  npm install
32
36
  ```
33
37
 
34
- To install the CLI globally from this checkout:
38
+ To install the `mixdog` command globally from this checkout:
35
39
 
36
40
  ```bash
37
41
  npm install -g .
38
42
  mixdog --help
39
43
  ```
40
44
 
41
- ## Usage
45
+ ## Run
42
46
 
43
47
  ```bash
44
- # Run the TUI from any project directory
48
+ # Start the TUI in the current project
45
49
  mixdog
46
50
 
47
- # Run the basic smoke test
48
- npm run smoke
51
+ # Start with an explicit route
52
+ mixdog --provider anthropic-oauth --model claude-haiku-4-5-20251001
49
53
 
50
- # Run the core smoke suite
51
- npm run smoke:all
54
+ # Read-only tool surface
55
+ mixdog --readonly
56
+
57
+ # Enable remote/channel mode for this session
58
+ mixdog --remote
59
+
60
+ # Re-run first-run setup
61
+ mixdog --onboarding
62
+ ```
63
+
64
+ Headless role mode is also supported:
65
+
66
+ ```bash
67
+ mixdog worker "fix the failing test"
68
+ mixdog reviewer "review the current diff"
52
69
  ```
53
70
 
54
- Inside the TUI, use `/providers` to configure model access, `/model` to switch
55
- models, `/workflow` to select a workflow, `/agents` to inspect available
56
- workflow agents, and `/agent` to manage active agent tasks.
71
+ ## TUI basics
57
72
 
58
- ## Project Layout
73
+ Common slash commands:
74
+
75
+ ```text
76
+ /help show help
77
+ /providers configure provider auth and local endpoints
78
+ /model choose provider/model, effort, and fast mode
79
+ /workflow choose the active workflow
80
+ /agents show available workflow agents
81
+ /agent manage active agent tasks
82
+ /mode switch tool surface: full | readonly
83
+ /compact compact older conversation context
84
+ /clear reset the conversation and screen
85
+ /OutputStyle show or switch Lead output style
86
+ ```
87
+
88
+ Use `/providers` first if no model is configured, then `/model` to pick the
89
+ route. The model picker warms the provider catalog in the background and keeps
90
+ Claude families such as Opus, Sonnet, Haiku, and Fable separate when filtering
91
+ current Anthropic models.
92
+
93
+ ## Scripts
94
+
95
+ ```bash
96
+ npm run smoke # basic smoke check
97
+ npm run smoke:all # core smoke suite
98
+ npm run smoke:tui # TUI render smoke
99
+ npm run smoke:tools # tool smoke suite
100
+ npm run build:tui # build the bundled Ink TUI
101
+ npm run audit:models # inspect model catalog metadata
102
+ ```
103
+
104
+ Additional diagnostics and benchmarks live under `scripts/`.
105
+
106
+ ## Data and configuration
107
+
108
+ Mixdog uses `~/.mixdog` as its home root. Runtime data lives in
109
+ `~/.mixdog/data` by default.
110
+
111
+ ```bash
112
+ MIXDOG_HOME=/path/to/home mixdog
113
+ MIXDOG_DATA_DIR=/path/to/data mixdog
114
+ ```
115
+
116
+ Useful environment toggles:
117
+
118
+ - `MIXDOG_TUI_MOUSE=0` — use terminal-native mouse behavior instead of the TUI
119
+ mouse/selection layer.
120
+ - `MIXDOG_DISABLE_MODEL_PREFETCH=1` — disable background provider model prefetch.
121
+ - `MIXDOG_PROVIDER_MODEL_WARMUP_DELAY_MS=<ms>` — tune model-catalog warmup delay.
122
+ - `MIXDOG_MODEL_STALE_MONTHS=<months>` — tune catalog staleness filtering.
123
+
124
+ ## Project layout
59
125
 
60
126
  ```text
61
127
  src/
62
128
  cli.mjs # CLI entry point (bin: mixdog)
63
- app.mjs # app wiring
64
- repl.mjs # plain REPL loop
65
- runtime/ # provider runtime, tools, memory, channels
66
- tui/ # canonical Ink TUI (bundled to dist/)
129
+ app.mjs # CLI/TUI/headless mode wiring
130
+ help.mjs # command help text
131
+ runtime/ # providers, tools, memory, channels, session runtime
132
+ session-runtime/
133
+ # model routing, catalog rows, workflow/session helpers
134
+ tui/ # canonical Ink TUI
67
135
  agents/ # workflow agent definitions
136
+ workflows/ # workflow definitions
68
137
  rules/ # Lead and agent instructions
69
138
  scripts/
70
139
  smoke*.mjs # smoke checks
140
+ *test.mjs # focused node:test checks
71
141
  build-tui.mjs # esbuild bundle for the React TUI
72
142
  vendor/
73
143
  ink/ # Mixdog Ink renderer
74
144
  ```
75
145
 
76
- ## Data And Configuration
146
+ ## Published package contents
147
+
148
+ The npm package is limited by `package.json#files` to:
77
149
 
78
- Standalone Mixdog uses `~/.mixdog` as its home root. Runtime data lives in
79
- `~/.mixdog/data` by default. Set `MIXDOG_HOME` to move the root, or
80
- `MIXDOG_DATA_DIR` to override only the data directory.
150
+ ```text
151
+ README.md
152
+ scripts/
153
+ src/
154
+ vendor/
155
+ ```
81
156
 
82
- The TUI uses alt-screen mode and app-owned mouse wheel scrolling / drag
83
- selection by default. Set `MIXDOG_TUI_MOUSE=0` to opt into terminal-native mouse
84
- behavior.
157
+ `docs/` is not included in the published package unless `package.json#files` is
158
+ changed.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mixdog",
3
- "version": "0.9.3",
3
+ "version": "0.9.5",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Standalone mixdog coding-agent CLI/TUI workspace.",
@@ -26,6 +26,7 @@
26
26
  "files": [
27
27
  "README.md",
28
28
  "scripts/",
29
+ "!scripts/bench/cache-hit-*.json",
29
30
  "src/",
30
31
  "vendor/"
31
32
  ],
@@ -33,7 +34,7 @@
33
34
  "prepack": "npm run build:tui",
34
35
  "start": "node src/cli.mjs",
35
36
  "smoke": "node scripts/smoke.mjs",
36
- "smoke:all": "npm run smoke && npm run smoke:boot && npm run smoke:tools && npm run smoke:output",
37
+ "smoke:all": "npm run smoke && npm run smoke:boot && npm run smoke:tools && npm run smoke:output && npm run smoke:tui && npm run smoke:freevars",
37
38
  "smoke:boot": "node scripts/boot-smoke.mjs",
38
39
  "smoke:compact": "node scripts/compact-smoke.mjs",
39
40
  "smoke:loop": "node scripts/smoke-loop.mjs",
@@ -41,6 +42,8 @@
41
42
  "smoke:loop:report": "node scripts/smoke-loop-report.mjs",
42
43
  "smoke:tools": "node scripts/tool-smoke.mjs",
43
44
  "smoke:output": "node scripts/output-style-smoke.mjs",
45
+ "smoke:tui": "node scripts/tui-render-smoke.mjs",
46
+ "smoke:freevars": "node scripts/freevar-smoke.mjs",
44
47
  "test:toolcall": "node --test scripts/toolcall-args-test.mjs",
45
48
  "test:providers": "node --test scripts/provider-toolcall-test.mjs",
46
49
  "failures": "node scripts/tool-failures.mjs",
@@ -52,6 +55,7 @@
52
55
  "bench:corpus": "node scripts/routing-corpus.mjs",
53
56
  "bench:run": "node scripts/bench-run.mjs",
54
57
  "bench:recall": "node scripts/recall-bench.mjs",
58
+ "audit:models": "node scripts/model-catalog-audit.mjs",
55
59
  "patch:replay": "node scripts/patch-replay.mjs",
56
60
  "build:tui": "node scripts/build-tui.mjs"
57
61
  },
@@ -70,6 +74,7 @@
70
74
  "discord.js": "^14.26.4",
71
75
  "ink": "^7.1.0",
72
76
  "jsdom": "^26.1.0",
77
+ "kiwi-nlp": "^0.21.0",
73
78
  "marked": "^14.1.4",
74
79
  "node-cron": "^4.5.0",
75
80
  "openai": "^6.44.0",
@@ -92,6 +97,8 @@
92
97
  }
93
98
  },
94
99
  "devDependencies": {
95
- "esbuild": "^0.28.1"
100
+ "acorn": "^8.17.0",
101
+ "esbuild": "^0.28.1",
102
+ "eslint-scope": "^9.1.2"
96
103
  }
97
104
  }
@@ -0,0 +1,20 @@
1
+ [
2
+ {
3
+ "id": "lead-review-session-runtime",
4
+ "agent": "reviewer",
5
+ "cwd": "C:/Project/mixdog-bench",
6
+ "prompt": "READ-ONLY review task: you and any delegated agents must NOT modify, create, or delete any files - report findings only. Review the folder src/session-runtime/ for correctness, regression, and security risks. Delegate exploration/reading to your workflow agents where useful and synthesize their findings. Focus on real actionable bugs: broken imports, undefined identifiers, race conditions, wrong fallbacks, data loss paths. Report findings ordered by severity, one line each, with file:line anchors. Skip style nits. End with a one-line verdict."
7
+ },
8
+ {
9
+ "id": "lead-review-channels-lib",
10
+ "agent": "reviewer",
11
+ "cwd": "C:/Project/mixdog-bench",
12
+ "prompt": "READ-ONLY review task: you and any delegated agents must NOT modify, create, or delete any files - report findings only. Review the folder src/runtime/channels/lib/ for correctness, regression, and security risks. Delegate exploration/reading to your workflow agents where useful and synthesize their findings. Focus on real actionable bugs: message loss, double-forwarding, ownership races, watcher leaks, unsafe input handling. Report findings ordered by severity, one line each, with file:line anchors. Skip style nits. End with a one-line verdict."
13
+ },
14
+ {
15
+ "id": "lead-review-compact",
16
+ "agent": "reviewer",
17
+ "cwd": "C:/Project/mixdog-bench",
18
+ "prompt": "READ-ONLY review task: you and any delegated agents must NOT modify, create, or delete any files - report findings only. Review the folder src/runtime/agent/orchestrator/session/compact/ for correctness, regression, and security risks. Delegate exploration/reading to your workflow agents where useful and synthesize their findings. Focus on real actionable bugs: schema validation gaps, data corruption on summarize, lossy round-trips, error swallowing. Report findings ordered by severity, one line each, with file:line anchors. Skip style nits. End with a one-line verdict."
19
+ }
20
+ ]
@@ -0,0 +1,20 @@
1
+ [
2
+ {
3
+ "id": "lead-review-session-runtime",
4
+ "agent": "reviewer",
5
+ "cwd": "C:/Project/mixdog-bench",
6
+ "prompt": "Review the folder src/session-runtime/ for correctness, regression, and security risks. Delegate exploration/reading to your workflow agents where useful and synthesize their findings. Focus on real actionable bugs: broken imports, undefined identifiers, race conditions, wrong fallbacks, data loss paths. Report findings ordered by severity, one line each, with file:line anchors. Skip style nits. End with a one-line verdict."
7
+ },
8
+ {
9
+ "id": "lead-review-channels-lib",
10
+ "agent": "reviewer",
11
+ "cwd": "C:/Project/mixdog-bench",
12
+ "prompt": "Review the folder src/runtime/channels/lib/ for correctness, regression, and security risks. Delegate exploration/reading to your workflow agents where useful and synthesize their findings. Focus on real actionable bugs: message loss, double-forwarding, ownership races, watcher leaks, unsafe input handling. Report findings ordered by severity, one line each, with file:line anchors. Skip style nits. End with a one-line verdict."
13
+ },
14
+ {
15
+ "id": "lead-review-compact",
16
+ "agent": "reviewer",
17
+ "cwd": "C:/Project/mixdog-bench",
18
+ "prompt": "Review the folder src/runtime/agent/orchestrator/session/compact/ for correctness, regression, and security risks. Delegate exploration/reading to your workflow agents where useful and synthesize their findings. Focus on real actionable bugs: schema validation gaps, data corruption on summarize, lossy round-trips, error swallowing. Report findings ordered by severity, one line each, with file:line anchors. Skip style nits. End with a one-line verdict."
19
+ }
20
+ ]
@@ -0,0 +1,20 @@
1
+ [
2
+ {
3
+ "id": "r4-debug-forwarding-gap",
4
+ "agent": "reviewer",
5
+ "cwd": "C:/Project/mixdog-bench",
6
+ "prompt": "Investigate a real reliability question in this repo: when the Discord channel bridge activates (bridge-state.json written) there can be a window where assistant output is not yet forwarded to the channel - transcript binding, fs.watch on a not-yet-created transcript file, and ownership probes are involved. Trace the full path from bridge activation to first forwarded message in src/runtime/channels/ (index.mjs, lib/output-forwarder.mjs), identify every gap where output produced during the window would be silently dropped or delayed, and state for each gap whether backlog catch-up recovers it. Report findings ordered by impact with file:line anchors. End with a one-line verdict."
7
+ },
8
+ {
9
+ "id": "r4-impl-usage-summary",
10
+ "agent": "worker",
11
+ "cwd": "C:/Project/mixdog-bench",
12
+ "prompt": "Implement a small feature: add a `usage:today` npm script backed by a new scripts/usage-today.mjs that reads ~/.mixdog/data/history/agent-trace.jsonl (respect MIXDOG_DATA_DIR), filters usage rows from local midnight, and prints per-model calls, input/cached/output tokens, and costUsd totals plus a grand total line. Follow the style of scripts/session-bench.mjs arg parsing. Verify with node --check and run it once. Report the diff summary."
13
+ },
14
+ {
15
+ "id": "r4-explain-compact-engine",
16
+ "agent": "explore",
17
+ "cwd": "C:/Project/mixdog-bench",
18
+ "prompt": "Map the compaction subsystem: starting from src/runtime/agent/orchestrator/session/compact/engine.mjs, produce a concise architecture brief - entry points and callers, the decision flow for when compaction fires, how the preserved tail is chosen, where redaction hooks in, and the failure/fallback paths. Anchor every claim with file:line. Keep it under 40 lines."
19
+ }
20
+ ]
@@ -0,0 +1,7 @@
1
+ [
2
+ {
3
+ "id": "r5-orchestrated-audit",
4
+ "agent": "lead",
5
+ "prompt": "You are coordinating work in this repo. Task: audit and improve the provider retry story in two independent scopes, then verify. Scope A: analyze src/runtime/agent/orchestrator/providers/retry-classifier.mjs and how openai-oauth-ws.mjs consumes its classifiers - list every classifier bucket, which are actually reachable, and any bucket that no code path can produce. Scope B: analyze the handshake retry loop in openai-oauth-ws.mjs (_acquireWithRetry) and the midstream retry loop (sendViaWebSocket) - document their budgets, backoff, and whether any error class can double-retry across both layers. These scopes are independent: delegate them to separate workers in parallel, then have the results cross-checked, and produce a single merged report with file:line evidence. Do NOT edit any files - analysis only. The final report is the deliverable."
6
+ }
7
+ ]
@@ -0,0 +1,20 @@
1
+ [
2
+ {
3
+ "id": "review-session-runtime",
4
+ "agent": "reviewer",
5
+ "cwd": "C:/Project/mixdog",
6
+ "prompt": "Review the folder src/session-runtime/ for correctness, regression, and security risks. Focus on real actionable bugs: broken imports, undefined identifiers, race conditions, wrong fallbacks, data loss paths. Report findings ordered by severity, one line each, with file:line anchors. Skip style nits. End with a one-line verdict."
7
+ },
8
+ {
9
+ "id": "review-channels-lib",
10
+ "agent": "reviewer",
11
+ "cwd": "C:/Project/mixdog",
12
+ "prompt": "Review the folder src/runtime/channels/lib/ for correctness, regression, and security risks. Focus on real actionable bugs: message loss, double-forwarding, ownership races, watcher leaks, unsafe input handling. Report findings ordered by severity, one line each, with file:line anchors. Skip style nits. End with a one-line verdict."
13
+ },
14
+ {
15
+ "id": "review-compact",
16
+ "agent": "reviewer",
17
+ "cwd": "C:/Project/mixdog",
18
+ "prompt": "Review the folder src/runtime/agent/orchestrator/session/compact/ for correctness, regression, and security risks. Focus on real actionable bugs: schema validation gaps, data corruption on summarize, lossy round-trips, error swallowing. Report findings ordered by severity, one line each, with file:line anchors. Skip style nits. End with a one-line verdict."
19
+ }
20
+ ]
@@ -0,0 +1,114 @@
1
+ {
2
+ "round": "1",
3
+ "runner": "codex",
4
+ "opts": {
5
+ "provider": "openai-oauth",
6
+ "model": "gpt-5.5",
7
+ "effort": "high",
8
+ "fast": false,
9
+ "env": {}
10
+ },
11
+ "tasks": 3,
12
+ "completed": 3,
13
+ "completion_rate": 100,
14
+ "sessions": [
15
+ "019f24e5-98ee-7cf0-afb0-a1a80ac81702",
16
+ "019f24e5-98f3-7f12-9638-7a899028c7e3",
17
+ "019f24e5-98f3-7f22-902c-934f0f7cbfb0"
18
+ ],
19
+ "results": [
20
+ {
21
+ "id": "review-session-runtime",
22
+ "agent": "reviewer",
23
+ "ok": true,
24
+ "ms": 300087,
25
+ "sessionId": "019f24e5-98ee-7cf0-afb0-a1a80ac81702",
26
+ "card": {
27
+ "session": "019f24e5-98ee-7cf0-afb0-a1a80ac81702",
28
+ "wall_ms": 300087,
29
+ "uncached_in": 157635,
30
+ "cached_in": 1071360,
31
+ "out_tokens": 8581,
32
+ "cache_ratio": 0.872,
33
+ "completed": 1
34
+ },
35
+ "output": "- High: `src/session-runtime/plugin-mcp.mjs:40` project `.mcp.json` stdio entries can set `cwd` to `..` or an absolute path outside the project, bypassing the stricter project-root guard in `normalizeMcpServerInput` and letting repo-local MCP config run with access scoped outside the opened repo.\n- Medium: `src/session-runtime/workflow.mjs:276` invalid persisted `effort` values throw from read paths like `summarizeWorkflowRoutes`/`agentRouteFromConfig` instead of being ignored, so one bad config entry can break onboarding status or agent listing.\n- Low: `src/session-runtime/provider-models.mjs:42` cached `{id, provider}` fallback metadata is returned before honoring `allowFetch`, so a prior non-fetch lookup prevents a later forced lookup from ever retrieving real model capabilities.\n\nVerdict: no broken imports found, but fix the project MCP cwd escape before trusting repo-local MCP configs."
36
+ },
37
+ {
38
+ "id": "review-channels-lib",
39
+ "agent": "reviewer",
40
+ "ok": true,
41
+ "ms": 172813,
42
+ "sessionId": "019f24e5-98f3-7f12-9638-7a899028c7e3",
43
+ "card": {
44
+ "session": "019f24e5-98f3-7f12-9638-7a899028c7e3",
45
+ "wall_ms": 172813,
46
+ "uncached_in": 136264,
47
+ "cached_in": 1237376,
48
+ "out_tokens": 8502,
49
+ "cache_ratio": 0.901,
50
+ "completed": 1
51
+ },
52
+ "output": "- High `src/runtime/channels/lib/webhook/deliveries.mjs:255`: delivery rows are appended asynchronously but the in-memory dedup state advances immediately, so crashes, append failures, out-of-order status writes, or compaction can lose/reorder `received/pending/done` rows and allow duplicate webhook dispatch or permanent dedup blockage.\n- High `src/runtime/channels/lib/event-queue.mjs:239`: queued events are moved to processed at `:241` after a fire-and-forget `injectFn`; if parent IPC drops/fails, the claimed event is acknowledged anyway and the message is lost.\n- Medium `src/runtime/channels/lib/output-forwarder.mjs:316`: actual backend send does not re-check `_isOwner()` at send time, so an ownership handoff during an in-flight drain can let the old owner send while the new owner tails the same transcript, causing double-forwarding.\n- Medium `src/runtime/channels/lib/output-forwarder.mjs:690`: `closeWatcher()` clears `sendRetryTimer` but leaves queued failed items in `finalLane/streamLane`, so transcript rebind/watch error during backoff can strand unsent messages until unrelated new activity kicks the drain.\n- Medium `src/runtime/channels/lib/webhook.mjs:530`: `startNgrok()` schedules `waitAndStart` timers that `stop()` at `:585` never cancels, so reload/stop during the delay can spawn a stale ngrok process after shutdown.\n- Low `src/runtime/channels/lib/inbound-routing.mjs:35`: stale dedup marker files are treated as non-duplicates but never refreshed/replaced, so cross-process duplicate inbound messages after TTL can bypass dedup repeatedly.\n\nVerdict: Not clean yet; I found real message-loss, double-forwarding, and lifecycle leak risks worth fixing before shipping."
53
+ },
54
+ {
55
+ "id": "review-compact",
56
+ "agent": "reviewer",
57
+ "ok": true,
58
+ "ms": 140945,
59
+ "sessionId": "019f24e5-98f3-7f22-902c-934f0f7cbfb0",
60
+ "card": {
61
+ "session": "019f24e5-98f3-7f22-902c-934f0f7cbfb0",
62
+ "wall_ms": 140945,
63
+ "uncached_in": 102061,
64
+ "cached_in": 416512,
65
+ "out_tokens": 7120,
66
+ "cache_ratio": 0.803,
67
+ "completed": 1
68
+ },
69
+ "output": "- High `src/runtime/agent/orchestrator/session/compact/engine.mjs:588` - `recallTailStartIndex()` relies on object identity, so when `fitSingleRecallTurnToCap()` clones/truncates the first tail user message, `indexOf()` fails and the fallback can misplace the tail, duplicating summarized user content and dropping/reordering recent messages.\n- High `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:269` - `redactMessageToolCallSecrets()` returns unchanged unless `m.toolCalls` exists, leaving Anthropic-style `content` / `assistantBlocks` `tool_use` inputs unredacted in preserved tails.\n- High `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:12` - the sensitive-key regex misses common camelCase token keys like `accessToken`, `idToken`, and `sessionToken`, so those secrets survive both prompt summaries and verbatim tail redaction.\n- Medium `src/runtime/agent/orchestrator/session/compact/budget.mjs:79` - `drainSessionCycle1()` swallows `cycle1` errors and returns a “successful” partial drain, so callers can proceed with raw pending rows while diagnostics lose the actual failure.\n- Medium `src/runtime/agent/orchestrator/session/compact/summary-schema.mjs:68` - semantic schema validation only checks top-level `##` anchors, while `truncateSummaryBySections()` can drop required `### Done/In Progress/Blocked` progress structure and still treat the summary as valid.\n\nVerdict: Needs fixes before compaction can be considered secure and loss-safe."
70
+ }
71
+ ],
72
+ "task_complete": true,
73
+ "task_errors": [],
74
+ "score_complete": true,
75
+ "score_errors": [],
76
+ "group": {
77
+ "n": 3,
78
+ "wall_ms": 204615,
79
+ "uncached_in": 131986.7,
80
+ "cached_in": 908416,
81
+ "out_tokens": 8067.7,
82
+ "cache_ratio": 0.9,
83
+ "completed": 1
84
+ },
85
+ "cards": [
86
+ {
87
+ "session": "019f24e5-98ee-7cf0-afb0-a1a80ac81702",
88
+ "wall_ms": 300087,
89
+ "uncached_in": 157635,
90
+ "cached_in": 1071360,
91
+ "out_tokens": 8581,
92
+ "cache_ratio": 0.872,
93
+ "completed": 1
94
+ },
95
+ {
96
+ "session": "019f24e5-98f3-7f12-9638-7a899028c7e3",
97
+ "wall_ms": 172813,
98
+ "uncached_in": 136264,
99
+ "cached_in": 1237376,
100
+ "out_tokens": 8502,
101
+ "cache_ratio": 0.901,
102
+ "completed": 1
103
+ },
104
+ {
105
+ "session": "019f24e5-98f3-7f22-902c-934f0f7cbfb0",
106
+ "wall_ms": 140945,
107
+ "uncached_in": 102061,
108
+ "cached_in": 416512,
109
+ "out_tokens": 7120,
110
+ "cache_ratio": 0.803,
111
+ "completed": 1
112
+ }
113
+ ]
114
+ }