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
@@ -0,0 +1,468 @@
1
+ {
2
+ "round": "18",
3
+ "runner": "lead",
4
+ "opts": {
5
+ "provider": "openai-oauth",
6
+ "model": "gpt-5.5",
7
+ "effort": null,
8
+ "fast": false,
9
+ "env": {
10
+ "MIXDOG_DATA_DIR": "C:\\Users\\tempe\\.mixdog\\bench-data"
11
+ }
12
+ },
13
+ "tasks": 6,
14
+ "completed": 6,
15
+ "completion_rate": 100,
16
+ "sessions": [
17
+ "sess_24800_1783060135637_1783060135875_396d1f1283f84451dc348604178b23f8",
18
+ "sess_22404_1783060135650_1783060135889_630e370d8ff15d6c58914f3e6ade30c3",
19
+ "sess_10516_1783060135671_1783060135907_3c455a35c2d88303ec51be56689a9e3c",
20
+ "sess_35760_1783060217488_1783060217721_527b673486b2ddb9ace2cd8196d6f95a",
21
+ "sess_34948_1783060223630_1783060223848_a086c7c3dc32e8d9d25fdba3a4b15cf9",
22
+ "sess_44084_1783060296498_1783060296721_5059cdd1f7776ce3ddcb030a83e15e87"
23
+ ],
24
+ "results": [
25
+ {
26
+ "id": "r4-debug-forwarding-gap#1",
27
+ "agent": "reviewer",
28
+ "ok": true,
29
+ "ms": 160816,
30
+ "sessionId": "sess_24800_1783060135637_1783060135875_396d1f1283f84451dc348604178b23f8",
31
+ "output": "sessionId: sess_24800_1783060135637_1783060135875_396d1f1283f84451dc348604178b23f8\n재영님, 조사 결과 현재 가장 큰 위험은 “이미 존재하는 새 transcript”에 바인딩할 때 EOF로 시작해 초기 출력이 영구 누락될 수 있다는 점입니다.\n\n- **영구 누락 가능**: `bindPersistedTranscriptIfAny()` → `rebindTranscriptContext(... catchUpFromPersisted:true)`가 새 기존 파일에 붙으면 `setContext()`가 `currentSize`를 cursor로 잡아 이미 써진 출력은 스킵합니다. Backlog catch-up 불가. `src/runtime/channels/index.mjs:625`, `src/runtime/channels/lib/output-forwarder.mjs:117`\n\n- **지연 후 복구**: transcript가 아직 없으면 `fs.watch()` 설치가 실패하지만 re-arm poll이 파일 생성 후 `startWatch()` + `forwardNewText()`를 호출합니다. 60초 안이면 backlog catch-up 가능, 이후엔 다음 rebind 없이는 지연/미전송입니다. `src/runtime/channels/index.mjs:469`, `src/runtime/channels/index.mjs:497`, `src/runtime/channels/index.mjs:376`\n\n- **pre-connect 소유권 게이트 지연**: bridge-state는 먼저 쓰이고 backend 연결 전에는 `_isOwner()`가 false라 forwarding이 안 됩니다. cursor는 advance되지 않으며, 연결 후 `forwardNewText()`가 호출돼 backlog를 회수합니다. `src/runtime/channels/index.mjs:1735`, `src/runtime/channels/index.mjs:776`, `src/runtime/channels/index.mjs:809`, `src/runtime/channels/lib/output-forwarder.mjs:351`\n\n- **stat→watch 설치 경계**: `setContext()` 이후 `fs.watch()` 설치 사이에 쓰인 bytes는 `scheduleWatchFlush()`가 즉시 한 번 읽어 회수합니다. Backlog catch-up 가능. `src/runtime/channels/lib/output-forwarder.mjs:112`, `src/runtime/channels/lib/output-forwarder.mjs:665`\n\nVerdict: 기존 파일에 새로 붙는 non-persisted 바인딩만 실제 drop 위험이고, 나머지 활성화 창은 대부분 지연 후 catch-up 구조입니다.",
32
+ "card": {
33
+ "session": "sess_24800_1783060135637_1783060135875_396d1f1283f84451dc348604178b23f8",
34
+ "provider": "openai-oauth",
35
+ "model": "gpt-5.5",
36
+ "wall_ms": 150321,
37
+ "turns": 9,
38
+ "tool_calls": 10,
39
+ "tools_per_turn": 1.1,
40
+ "total_tool_ms": 684,
41
+ "llm_stream_ms": 149263,
42
+ "cache_ratio": 0.7854485808851528,
43
+ "cached_tokens": 214528,
44
+ "prompt_tokens": 273128,
45
+ "uncached_tokens": 58600,
46
+ "output_tokens": 6747,
47
+ "cache_weighted_input_10": 80052.8,
48
+ "cache_weighted_input_25": 112232,
49
+ "prompt_growth": 43499,
50
+ "antipatterns": 1,
51
+ "issues": 12,
52
+ "issue_types": [
53
+ "cache",
54
+ "cache_break",
55
+ "service_tier",
56
+ "tool_churn_cluster"
57
+ ],
58
+ "read_fragmentation_paths": [],
59
+ "grep_sweep_count": 0
60
+ }
61
+ },
62
+ {
63
+ "id": "r4-impl-usage-summary#1",
64
+ "agent": "worker",
65
+ "ok": true,
66
+ "ms": 81842,
67
+ "sessionId": "sess_22404_1783060135650_1783060135889_630e370d8ff15d6c58914f3e6ade30c3",
68
+ "output": "sessionId: sess_22404_1783060135650_1783060135889_630e370d8ff15d6c58914f3e6ade30c3\n요청 범위가 작고 실행 승인이 포함되어 있어 바로 반영하고 검증하겠습니다.이미 해당 스크립트와 npm 엔트리가 있어 요구사항과 동작을 확인한 뒤 필요한 경우만 보정하겠습니다.필요 구현은 이미 작업트리에 반영된 상태라 검증을 실행하겠습니다.완료했습니다, 재영님.\n\n- **Diff 요약**: `package.json`에 `usage:today` 추가, `scripts/usage-today.mjs` 신규 추가.\n- **기능**: `MIXDOG_DATA_DIR` 우선으로 `history/agent-trace.jsonl`을 읽고, 로컬 자정 이후 `usage` rows를 모델별/총합으로 집계합니다.\n- **검증**: `node --check scripts/usage-today.mjs` 통과, `npm run usage:today` 실행 완료.\n- **참고**: 기존 작업트리에 있던 `src/runtime/channels/lib/*` 수정은 건드리지 않았습니다.",
69
+ "card": {
70
+ "session": "sess_22404_1783060135650_1783060135889_630e370d8ff15d6c58914f3e6ade30c3",
71
+ "provider": "openai-oauth",
72
+ "model": "gpt-5.5",
73
+ "wall_ms": 71343,
74
+ "turns": 13,
75
+ "tool_calls": 15,
76
+ "tools_per_turn": 1.2,
77
+ "total_tool_ms": 2475,
78
+ "llm_stream_ms": 68564,
79
+ "cache_ratio": 0.74159765963732,
80
+ "cached_tokens": 155648,
81
+ "prompt_tokens": 209882,
82
+ "uncached_tokens": 54234,
83
+ "output_tokens": 5536,
84
+ "cache_weighted_input_10": 69798.8,
85
+ "cache_weighted_input_25": 93146,
86
+ "prompt_growth": 14590,
87
+ "antipatterns": 1,
88
+ "issues": 15,
89
+ "issue_types": [
90
+ "cache",
91
+ "cache_break",
92
+ "cache_miss",
93
+ "service_tier",
94
+ "missed_parallelism",
95
+ "tool_churn_cluster"
96
+ ],
97
+ "read_fragmentation_paths": [],
98
+ "grep_sweep_count": 0
99
+ }
100
+ },
101
+ {
102
+ "id": "r4-explain-compact-engine#1",
103
+ "agent": "explore",
104
+ "ok": true,
105
+ "ms": 87968,
106
+ "sessionId": "sess_10516_1783060135671_1783060135907_3c455a35c2d88303ec51be56689a9e3c",
107
+ "output": "sessionId: sess_10516_1783060135671_1783060135907_3c455a35c2d88303ec51be56689a9e3c\n완료했습니다, 재영님. compaction subsystem 요약입니다.\n\n- **진입점:** `engine.mjs`는 `semanticCompactMessages`와 `recallFastTrackCompactMessages`를 내보내고, `compact.mjs` facade가 그대로 re-export합니다. `src/runtime/agent/orchestrator/session/compact/engine.mjs:278`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:445`, `src/runtime/agent/orchestrator/session/compact.mjs:52`\n\n- **주요 호출자:** live loop는 pre-send에서 정책을 계산해 semantic/recall 경로를 호출하고, manager의 manual/auto-clear 경로는 `runSessionCompaction`을 통해 같은 엔진을 호출합니다. `src/runtime/agent/orchestrator/session/loop.mjs:329`, `src/runtime/agent/orchestrator/session/loop.mjs:414`, `src/runtime/agent/orchestrator/session/loop.mjs:441`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:143`\n\n- **발화 조건:** auto가 켜져 있고 boundary가 있으면 trigger는 explicit sub-boundary limit 또는 boundary-buffer로 정해지며, pressure가 trigger 이상이거나 reactive overflow면 compact가 실행됩니다. `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:89`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:107`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:117`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:170`\n\n- **실행 흐름:** loop는 queued steering까지 반영한 뒤 토큰을 추정하고, compact 대상이면 `compacting` stage/telemetry 후 recall-fasttrack 또는 semantic 중 하나를 실행합니다. `src/runtime/agent/orchestrator/session/loop.mjs:324`, `src/runtime/agent/orchestrator/session/loop.mjs:351`, `src/runtime/agent/orchestrator/session/loop.mjs:373`, `src/runtime/agent/orchestrator/session/loop.mjs:414`\n\n- **semantic window:** 먼저 tool-pair sanitize/dedup 후 protected prefix, live, previous summary를 분리하고, user turn이 있으면 최근 user turns 기준, 없으면 tool-result로 시작하지 않는 cut point 기준으로 head/tail을 자릅니다. `src/runtime/agent/orchestrator/session/compact/engine.mjs:100`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:121`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:235`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:240`\n\n- **semantic tail:** 기본 최근 2 turns를 `preserveRecentBudget` 안에서 보존하고, 최신 turn이 너무 크면 suffix만 보존하며, no-user transcript는 valid cut을 최신→과거로 확장하다 초과 직전에 멈춥니다. `src/runtime/agent/orchestrator/session/compact/engine.mjs:46`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:134`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:151`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:193`\n\n- **recall tail:** recall-fasttrack은 최신 user-anchored turns 최대 2개를 구조 그대로 보존하고, cap 초과 시 오래된 turn을 버린 뒤 단일 turn을 truncate하며 no-user tail도 허용합니다. `src/runtime/agent/orchestrator/session/compact/engine.mjs:449`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:593`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:601`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:613`\n\n- **redaction hook:** fits-budget no-op이 아니면 window selection 전에 `redactToolCallSecretsInMessages`가 실행되어 preserved system/tail에 남는 tool-call argument 값만 shape-preserving 방식으로 scrub됩니다. `src/runtime/agent/orchestrator/session/compact/engine.mjs:286`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:306`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:219`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:323`\n\n- **semantic output:** mandatory(system+tail)가 target보다 크면 budget을 summary room까지 올리고, fitted prompt를 provider에 보내 summary schema를 repair한 뒤 summary+tail 결과가 budget을 넘으면 실패합니다. `src/runtime/agent/orchestrator/session/compact/engine.mjs:319`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:328`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:333`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:371`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:392`\n\n- **recall pipeline:** loop recall-fasttrack은 session memory ingest/dump/cycle1 drain을 시도하고, 실패한 ingest/cycle1은 diagnostics로 남긴 뒤 combined recall text를 `recallFastTrackCompactMessages`에 주입합니다. `src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:61`, `src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:84`, `src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:105`, `src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:148`, `src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:161`\n\n- **fallback:** loop semantic 실패는 non-recall일 때 `pruneToolOutputsUnanchored`로 한 번 salvage하고, salvage 실패 시 overflow telemetry 후 `agentContextOverflowError`를 던집니다. `src/runtime/agent/orchestrator/session/loop.mjs:500`, `src/runtime/agent/orchestrator/session/loop.mjs:517`, `src/runtime/agent/orchestrator/session/loop.mjs:527`, `src/runtime/agent/orchestrator/session/loop.mjs:552`, `src/runtime/agent/orchestrator/session/loop.mjs:618`\n\n- **manager fallback:** manager recall-fasttrack 실패는 semantic fallback을 한 번 시도하고, non-recall 실패는 prune fallback을 시도하며, 그래도 실패하면 `lastStage`를 `manual_failed`/`post_turn_failed`로 기록합니다. `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:231`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:242`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:322`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:348`\n\n- **reactive path:** provider context-overflow refusal은 한 번만 `reactiveOverflowRetryPending`을 세워 다음 loop에서 동일 pre-send compact path를 강제하고, 재실패하면 overflow를 surface합니다. `src/runtime/agent/orchestrator/session/loop.mjs:982`, `src/runtime/agent/orchestrator/session/loop.mjs:995`, `src/runtime/agent/orchestrator/session/loop.mjs:1002`, `src/runtime/agent/orchestrator/session/loop.mjs:1018`",
108
+ "card": {
109
+ "session": "sess_10516_1783060135671_1783060135907_3c455a35c2d88303ec51be56689a9e3c",
110
+ "provider": "openai-oauth",
111
+ "model": "gpt-5.5",
112
+ "wall_ms": 77458,
113
+ "turns": 9,
114
+ "tool_calls": 12,
115
+ "tools_per_turn": 1.3,
116
+ "total_tool_ms": 1160,
117
+ "llm_stream_ms": 75762,
118
+ "cache_ratio": 0.6091671542812561,
119
+ "cached_tokens": 124928,
120
+ "prompt_tokens": 205080,
121
+ "uncached_tokens": 80152,
122
+ "output_tokens": 6295,
123
+ "cache_weighted_input_10": 92644.8,
124
+ "cache_weighted_input_25": 111384,
125
+ "prompt_growth": 60721,
126
+ "antipatterns": 1,
127
+ "issues": 17,
128
+ "issue_types": [
129
+ "cache",
130
+ "cache_break",
131
+ "cache_miss",
132
+ "broad_tool_result",
133
+ "service_tier",
134
+ "missed_parallelism",
135
+ "tool_churn_cluster"
136
+ ],
137
+ "read_fragmentation_paths": [],
138
+ "grep_sweep_count": 0
139
+ }
140
+ },
141
+ {
142
+ "id": "r4-debug-forwarding-gap#2",
143
+ "agent": "reviewer",
144
+ "ok": true,
145
+ "ms": 126411,
146
+ "sessionId": "sess_35760_1783060217488_1783060217721_527b673486b2ddb9ace2cd8196d6f95a",
147
+ "output": "sessionId: sess_35760_1783060217488_1783060217721_527b673486b2ddb9ace2cd8196d6f95a\n재영님, 조사 결과 `bridge-state.json`은 `start()` 초반에 먼저 활성화되고(`src/runtime/channels/index.mjs:1734`), 실제 Discord 연결·소유권·transcript binding·watch는 그 뒤에 따라옵니다.\n\n- **최대 손실: 기존 transcript를 EOF에서 바인딩** — `catchUpFromPersisted`가 같은 persisted path가 아니면 cursor를 `currentSize`로 잡아(`src/runtime/channels/lib/output-forwarder.mjs:117`) activation 이후 binding 전 출력도 backlog로 읽지 않습니다. 자동 복구 없음.\n\n- **경로 미발견: watch/rearm 자체 없음** — activation 시 transcript도 previous path도 못 찾으면 rebind가 실패하고(`src/runtime/channels/index.mjs:515`), 나중에 첫 inbound가 기존 파일을 잡아도 일반 bind는 EOF 시작입니다(`src/runtime/channels/index.mjs:1597`). 자동 복구 없음.\n\n- **파일 미생성: fs.watch 실패 구간** — missing file은 `watch()`가 catch되고 닫힙니다(`src/runtime/channels/lib/output-forwarder.mjs:647`). pending path가 있으면 re-arm poll이 생성 후 `forwardNewText()`로 backlog를 회수합니다(`src/runtime/channels/index.mjs:469`), 단 60초 timeout 이후는 복구 없음(`src/runtime/channels/index.mjs:384`).\n\n- **소유권/연결 전 출력 지연** — owner probe가 `bridgeRuntimeConnected && currentOwnerState().owned`라 pre-connect flush는 읽기 전에 반환합니다(`src/runtime/channels/index.mjs:316`, `src/runtime/channels/lib/output-forwarder.mjs:351`). cursor가 전진하지 않아 post-connect 재시도에서 복구됩니다(`src/runtime/channels/index.mjs:801`).\n\n- **watch 설치 race는 방어됨** — `setContext()` stat 후 `watch()` 설치 사이 쓰인 bytes는 즉시 flush 예약으로 회수됩니다(`src/runtime/channels/lib/output-forwarder.mjs:665`); partial line도 newline 전에는 소비하지 않습니다(`src/runtime/channels/lib/output-forwarder.mjs:172`).\n\nVerdict: pending transcript path가 잡힌 경우는 대체로 지연 후 회수되지만, 기존 transcript를 persisted cursor 없이 EOF로 바인딩하는 activation window는 실제 silent drop 가능성이 있습니다.",
148
+ "card": {
149
+ "session": "sess_35760_1783060217488_1783060217721_527b673486b2ddb9ace2cd8196d6f95a",
150
+ "provider": "openai-oauth",
151
+ "model": "gpt-5.5",
152
+ "wall_ms": 115932,
153
+ "turns": 7,
154
+ "tool_calls": 8,
155
+ "tools_per_turn": 1.1,
156
+ "total_tool_ms": 524,
157
+ "llm_stream_ms": 111128,
158
+ "cache_ratio": 0.32630401223640043,
159
+ "cached_tokens": 69120,
160
+ "prompt_tokens": 211827,
161
+ "uncached_tokens": 142707,
162
+ "output_tokens": 8039,
163
+ "cache_weighted_input_10": 149619,
164
+ "cache_weighted_input_25": 159987,
165
+ "prompt_growth": 35107,
166
+ "antipatterns": 1,
167
+ "issues": 11,
168
+ "issue_types": [
169
+ "cache",
170
+ "cache_break",
171
+ "broad_tool_result",
172
+ "service_tier",
173
+ "tool_churn_cluster"
174
+ ],
175
+ "read_fragmentation_paths": [],
176
+ "grep_sweep_count": 0
177
+ }
178
+ },
179
+ {
180
+ "id": "r4-impl-usage-summary#2",
181
+ "agent": "worker",
182
+ "ok": true,
183
+ "ms": 89481,
184
+ "sessionId": "sess_34948_1783060223630_1783060223848_a086c7c3dc32e8d9d25fdba3a4b15cf9",
185
+ "output": "sessionId: sess_34948_1783060223630_1783060223848_a086c7c3dc32e8d9d25fdba3a4b15cf9\n요청 범위대로 스크립트 추가와 검증까지 진행하겠습니다.구현 항목은 이미 작업 트리에 반영되어 있어 검증을 실행하겠습니다.관련 변경만 확인해 diff 요약을 정리하겠습니다.완료됨 — `usage:today` 스크립트와 `scripts/usage-today.mjs`가 작업 트리에 반영되어 있고 검증도 통과했습니다.\n\n- **Diff 요약**: `package.json`에 `usage:today` 추가, 새 스크립트는 `MIXDOG_DATA_DIR`/기본 history 경로를 읽어 오늘 usage를 모델별·총합으로 집계합니다.\n- **검증**: `node --check scripts/usage-today.mjs` 통과, `npm run usage:today` 실행 완료.\n- **참고**: 현재 `src/runtime/channels/lib/event-queue.mjs`, `src/runtime/channels/lib/output-forwarder.mjs`의 기존 수정은 이번 작업에서 건드리지 않았습니다.",
186
+ "card": {
187
+ "session": "sess_34948_1783060223630_1783060223848_a086c7c3dc32e8d9d25fdba3a4b15cf9",
188
+ "provider": "openai-oauth",
189
+ "model": "gpt-5.5",
190
+ "wall_ms": 79007,
191
+ "turns": 11,
192
+ "tool_calls": 15,
193
+ "tools_per_turn": 1.4,
194
+ "total_tool_ms": 2544,
195
+ "llm_stream_ms": 76106,
196
+ "cache_ratio": 0.8223639038744482,
197
+ "cached_tokens": 134144,
198
+ "prompt_tokens": 163120,
199
+ "uncached_tokens": 28976,
200
+ "output_tokens": 6085,
201
+ "cache_weighted_input_10": 42390.4,
202
+ "cache_weighted_input_25": 62512,
203
+ "prompt_growth": 15753,
204
+ "antipatterns": 1,
205
+ "issues": 14,
206
+ "issue_types": [
207
+ "cache",
208
+ "cache_break",
209
+ "service_tier",
210
+ "missed_parallelism",
211
+ "tool_churn_cluster"
212
+ ],
213
+ "read_fragmentation_paths": [],
214
+ "grep_sweep_count": 0
215
+ }
216
+ },
217
+ {
218
+ "id": "r4-explain-compact-engine#2",
219
+ "agent": "explore",
220
+ "ok": true,
221
+ "ms": 73478,
222
+ "sessionId": "sess_44084_1783060296498_1783060296721_5059cdd1f7776ce3ddcb030a83e15e87",
223
+ "output": "sessionId: sess_44084_1783060296498_1783060296721_5059cdd1f7776ce3ddcb030a83e15e87\nArchitecture brief, anchored:\n\n- `engine.mjs` exports two compactors: `semanticCompactMessages` and `recallFastTrackCompactMessages`. `src/runtime/agent/orchestrator/session/compact/engine.mjs:278`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:445`\n- Live auto-compaction enters from `agentLoop`, reached by `askSession`; manual/API compaction enters through `runSessionCompaction`. `src/runtime/agent/orchestrator/session/loop.mjs:441`, `src/runtime/agent/orchestrator/session/manager.mjs:1379`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:143`\n- Compaction fires pre-send after queued steering is drained, then only when policy is auto-enabled and pressure reaches trigger, tokens are unknown, or reactive overflow forces it. `src/runtime/agent/orchestrator/session/loop.mjs:324`, `src/runtime/agent/orchestrator/session/loop.mjs:329`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:170`\n- Policy resolves boundary, trigger, reserve, type, semantic/recall flags, and preserved-tail budgets from session/env/tool reserve. `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:89`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:124`\n- Runtime chooses recall-fasttrack first when configured, otherwise semantic; unsupported types fail. `src/runtime/agent/orchestrator/session/loop.mjs:414`, `src/runtime/agent/orchestrator/session/loop.mjs:439`, `src/runtime/agent/orchestrator/session/loop.mjs:496`\n- Semantic compaction sanitizes tool pairs, splits protected prefix/live/previous summary, then redacts tool-call secrets before window selection. `src/runtime/agent/orchestrator/session/compact/engine.mjs:284`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:100`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:312`\n- Semantic preserved tail is chosen by recent user turns if present, otherwise by non-tool cut points; tail is re-sanitized so tool pairs stay valid. `src/runtime/agent/orchestrator/session/compact/engine.mjs:240`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:121`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:250`\n- Semantic output is protected prefix + fitted summary + preserved tail, with mandatory tail/system cost allowed to raise budget. `src/runtime/agent/orchestrator/session/compact/engine.mjs:319`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:328`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:392`\n- Recall-fasttrack preserves the newest structured turns, drops oldest turns over cap, then truncates oldest surviving content if needed. `src/runtime/agent/orchestrator/session/compact/engine.mjs:449`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:593`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:601`\n- Recall-fasttrack also redacts before splitting context, then emits protected prefix + recall summary + preserved tail. `src/runtime/agent/orchestrator/session/compact/engine.mjs:644`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:646`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:695`\n- Redaction is shape-preserving for verbatim retained tool-call args and raw secret strings; prompt-side preserved facts also redact raw secrets. `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:217`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:230`, `src/runtime/agent/orchestrator/session/compact/budget.mjs:152`\n- Semantic no-op returns sanitized messages without preserved-tail redaction; redaction only hooks into real compaction. `src/runtime/agent/orchestrator/session/compact/engine.mjs:286`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:306`\n- Failures include empty live/head, missing provider, prompt/summary fit failures, empty provider response, and final budget overflow. `src/runtime/agent/orchestrator/session/compact/engine.mjs:254`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:279`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:335`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:371`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:394`\n- Loop fallback: semantic failures can recover via unanchored tool-output prune; unrecovered failures emit telemetry and raise context overflow. `src/runtime/agent/orchestrator/session/loop.mjs:501`, `src/runtime/agent/orchestrator/session/loop.mjs:517`, `src/runtime/agent/orchestrator/session/loop.mjs:552`, `src/runtime/agent/orchestrator/session/loop.mjs:618`\n- Manual/session fallback: recall-fasttrack failure may degrade to semantic; non-recall failures may prune; otherwise result records error without replacing history. `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:237`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:245`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:322`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:348`",
224
+ "card": {
225
+ "session": "sess_44084_1783060296498_1783060296721_5059cdd1f7776ce3ddcb030a83e15e87",
226
+ "provider": "openai-oauth",
227
+ "model": "gpt-5.5",
228
+ "wall_ms": 62943,
229
+ "turns": 8,
230
+ "tool_calls": 8,
231
+ "tools_per_turn": 1,
232
+ "total_tool_ms": 735,
233
+ "llm_stream_ms": 61541,
234
+ "cache_ratio": 0.6553850865104884,
235
+ "cached_tokens": 107008,
236
+ "prompt_tokens": 163275,
237
+ "uncached_tokens": 56267,
238
+ "output_tokens": 5391,
239
+ "cache_weighted_input_10": 66967.8,
240
+ "cache_weighted_input_25": 83019,
241
+ "prompt_growth": 38835,
242
+ "antipatterns": 1,
243
+ "issues": 14,
244
+ "issue_types": [
245
+ "cache",
246
+ "cache_break",
247
+ "cache_miss",
248
+ "broad_tool_result",
249
+ "service_tier",
250
+ "missed_parallelism",
251
+ "tool_churn_cluster"
252
+ ],
253
+ "read_fragmentation_paths": [],
254
+ "grep_sweep_count": 0
255
+ }
256
+ }
257
+ ],
258
+ "task_complete": true,
259
+ "task_errors": [],
260
+ "score_complete": true,
261
+ "score_errors": [],
262
+ "group": {
263
+ "n": 6,
264
+ "wall_ms": 92834,
265
+ "turns": 9.5,
266
+ "tool_calls": 11.3,
267
+ "tools_per_turn": 1.2,
268
+ "total_tool_ms": 1353.7,
269
+ "llm_stream_ms": 90394,
270
+ "cache_ratio": 0.7,
271
+ "cached_tokens": 134229.3,
272
+ "prompt_tokens": 204385.3,
273
+ "uncached_tokens": 70156,
274
+ "output_tokens": 6348.8,
275
+ "cache_weighted_input_10": 83578.9,
276
+ "cache_weighted_input_25": 103713.3,
277
+ "prompt_growth": 34750.8,
278
+ "antipatterns": 1,
279
+ "issues": 13.8,
280
+ "grep_sweep_count": 0
281
+ },
282
+ "cards": [
283
+ {
284
+ "session": "sess_24800_1783060135637_1783060135875_396d1f1283f84451dc348604178b23f8",
285
+ "provider": "openai-oauth",
286
+ "model": "gpt-5.5",
287
+ "wall_ms": 150321,
288
+ "turns": 9,
289
+ "tool_calls": 10,
290
+ "tools_per_turn": 1.1,
291
+ "total_tool_ms": 684,
292
+ "llm_stream_ms": 149263,
293
+ "cache_ratio": 0.7854485808851528,
294
+ "cached_tokens": 214528,
295
+ "prompt_tokens": 273128,
296
+ "uncached_tokens": 58600,
297
+ "output_tokens": 6747,
298
+ "cache_weighted_input_10": 80052.8,
299
+ "cache_weighted_input_25": 112232,
300
+ "prompt_growth": 43499,
301
+ "antipatterns": 1,
302
+ "issues": 12,
303
+ "issue_types": [
304
+ "cache",
305
+ "cache_break",
306
+ "service_tier",
307
+ "tool_churn_cluster"
308
+ ],
309
+ "read_fragmentation_paths": [],
310
+ "grep_sweep_count": 0
311
+ },
312
+ {
313
+ "session": "sess_22404_1783060135650_1783060135889_630e370d8ff15d6c58914f3e6ade30c3",
314
+ "provider": "openai-oauth",
315
+ "model": "gpt-5.5",
316
+ "wall_ms": 71343,
317
+ "turns": 13,
318
+ "tool_calls": 15,
319
+ "tools_per_turn": 1.2,
320
+ "total_tool_ms": 2475,
321
+ "llm_stream_ms": 68564,
322
+ "cache_ratio": 0.74159765963732,
323
+ "cached_tokens": 155648,
324
+ "prompt_tokens": 209882,
325
+ "uncached_tokens": 54234,
326
+ "output_tokens": 5536,
327
+ "cache_weighted_input_10": 69798.8,
328
+ "cache_weighted_input_25": 93146,
329
+ "prompt_growth": 14590,
330
+ "antipatterns": 1,
331
+ "issues": 15,
332
+ "issue_types": [
333
+ "cache",
334
+ "cache_break",
335
+ "cache_miss",
336
+ "service_tier",
337
+ "missed_parallelism",
338
+ "tool_churn_cluster"
339
+ ],
340
+ "read_fragmentation_paths": [],
341
+ "grep_sweep_count": 0
342
+ },
343
+ {
344
+ "session": "sess_10516_1783060135671_1783060135907_3c455a35c2d88303ec51be56689a9e3c",
345
+ "provider": "openai-oauth",
346
+ "model": "gpt-5.5",
347
+ "wall_ms": 77458,
348
+ "turns": 9,
349
+ "tool_calls": 12,
350
+ "tools_per_turn": 1.3,
351
+ "total_tool_ms": 1160,
352
+ "llm_stream_ms": 75762,
353
+ "cache_ratio": 0.6091671542812561,
354
+ "cached_tokens": 124928,
355
+ "prompt_tokens": 205080,
356
+ "uncached_tokens": 80152,
357
+ "output_tokens": 6295,
358
+ "cache_weighted_input_10": 92644.8,
359
+ "cache_weighted_input_25": 111384,
360
+ "prompt_growth": 60721,
361
+ "antipatterns": 1,
362
+ "issues": 17,
363
+ "issue_types": [
364
+ "cache",
365
+ "cache_break",
366
+ "cache_miss",
367
+ "broad_tool_result",
368
+ "service_tier",
369
+ "missed_parallelism",
370
+ "tool_churn_cluster"
371
+ ],
372
+ "read_fragmentation_paths": [],
373
+ "grep_sweep_count": 0
374
+ },
375
+ {
376
+ "session": "sess_35760_1783060217488_1783060217721_527b673486b2ddb9ace2cd8196d6f95a",
377
+ "provider": "openai-oauth",
378
+ "model": "gpt-5.5",
379
+ "wall_ms": 115932,
380
+ "turns": 7,
381
+ "tool_calls": 8,
382
+ "tools_per_turn": 1.1,
383
+ "total_tool_ms": 524,
384
+ "llm_stream_ms": 111128,
385
+ "cache_ratio": 0.32630401223640043,
386
+ "cached_tokens": 69120,
387
+ "prompt_tokens": 211827,
388
+ "uncached_tokens": 142707,
389
+ "output_tokens": 8039,
390
+ "cache_weighted_input_10": 149619,
391
+ "cache_weighted_input_25": 159987,
392
+ "prompt_growth": 35107,
393
+ "antipatterns": 1,
394
+ "issues": 11,
395
+ "issue_types": [
396
+ "cache",
397
+ "cache_break",
398
+ "broad_tool_result",
399
+ "service_tier",
400
+ "tool_churn_cluster"
401
+ ],
402
+ "read_fragmentation_paths": [],
403
+ "grep_sweep_count": 0
404
+ },
405
+ {
406
+ "session": "sess_34948_1783060223630_1783060223848_a086c7c3dc32e8d9d25fdba3a4b15cf9",
407
+ "provider": "openai-oauth",
408
+ "model": "gpt-5.5",
409
+ "wall_ms": 79007,
410
+ "turns": 11,
411
+ "tool_calls": 15,
412
+ "tools_per_turn": 1.4,
413
+ "total_tool_ms": 2544,
414
+ "llm_stream_ms": 76106,
415
+ "cache_ratio": 0.8223639038744482,
416
+ "cached_tokens": 134144,
417
+ "prompt_tokens": 163120,
418
+ "uncached_tokens": 28976,
419
+ "output_tokens": 6085,
420
+ "cache_weighted_input_10": 42390.4,
421
+ "cache_weighted_input_25": 62512,
422
+ "prompt_growth": 15753,
423
+ "antipatterns": 1,
424
+ "issues": 14,
425
+ "issue_types": [
426
+ "cache",
427
+ "cache_break",
428
+ "service_tier",
429
+ "missed_parallelism",
430
+ "tool_churn_cluster"
431
+ ],
432
+ "read_fragmentation_paths": [],
433
+ "grep_sweep_count": 0
434
+ },
435
+ {
436
+ "session": "sess_44084_1783060296498_1783060296721_5059cdd1f7776ce3ddcb030a83e15e87",
437
+ "provider": "openai-oauth",
438
+ "model": "gpt-5.5",
439
+ "wall_ms": 62943,
440
+ "turns": 8,
441
+ "tool_calls": 8,
442
+ "tools_per_turn": 1,
443
+ "total_tool_ms": 735,
444
+ "llm_stream_ms": 61541,
445
+ "cache_ratio": 0.6553850865104884,
446
+ "cached_tokens": 107008,
447
+ "prompt_tokens": 163275,
448
+ "uncached_tokens": 56267,
449
+ "output_tokens": 5391,
450
+ "cache_weighted_input_10": 66967.8,
451
+ "cache_weighted_input_25": 83019,
452
+ "prompt_growth": 38835,
453
+ "antipatterns": 1,
454
+ "issues": 14,
455
+ "issue_types": [
456
+ "cache",
457
+ "cache_break",
458
+ "cache_miss",
459
+ "broad_tool_result",
460
+ "service_tier",
461
+ "missed_parallelism",
462
+ "tool_churn_cluster"
463
+ ],
464
+ "read_fragmentation_paths": [],
465
+ "grep_sweep_count": 0
466
+ }
467
+ ]
468
+ }