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,473 @@
1
+ {
2
+ "round": "21",
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
+ "MIXDOG_OAI_WS_DELTA": "1"
12
+ }
13
+ },
14
+ "tasks": 6,
15
+ "completed": 6,
16
+ "completion_rate": 100,
17
+ "sessions": [
18
+ "sess_53040_1783061772419_1783061772667_52530e4a94c00ff1a9af3420ba33999d",
19
+ "sess_44948_1783061772432_1783061772678_1dc2eccd0ea785768ca34e3a5ae803d0",
20
+ "sess_39556_1783061772446_1783061772692_aa271e435633f4354e8a22e39cf2c817",
21
+ "sess_44472_1783061844580_1783061844803_7cea5dcd79cef6e363bcecd4e5901e9b",
22
+ "sess_29908_1783061880433_1783061880659_3a0ccb5163abe4322c4be7c7cabec26e",
23
+ "sess_59932_1783061888249_1783061888489_ce57d1706ce48640a8a1d9b85bc7b315"
24
+ ],
25
+ "results": [
26
+ {
27
+ "id": "r4-debug-forwarding-gap#1",
28
+ "agent": "reviewer",
29
+ "ok": true,
30
+ "ms": 115828,
31
+ "sessionId": "sess_53040_1783061772419_1783061772667_52530e4a94c00ff1a9af3420ba33999d",
32
+ "output": "sessionId: sess_53040_1783061772419_1783061772667_52530e4a94c00ff1a9af3420ba33999d\nI’ll trace the activation-to-forwarding path directly in the channel runtime files and verify the recovery behavior against the implemented backlog logic.조사 완료: 활성화 직후 출력은 일부 경로에서 지연 후 회수되지만, “이미 존재하는 새 transcript를 처음 EOF로 바인딩”하거나 “잘못된 transcript를 500ms 안에 못 훔친” 경우는 첫 출력이 조용히 누락될 수 있습니다.\n\n- **최대 영향 — 첫 바인딩이 EOF로 시작**: `setContext()`는 기본/비매칭 `catchUpFromPersisted`에서 현재 파일 크기를 커서로 잡습니다(`src/runtime/channels/lib/output-forwarder.mjs:111`–`127`). 활성화 후 바인딩 전에 이미 쓰인 출력은 `replayFromStart`나 같은 transcript의 persisted cursor가 없으면 회수되지 않습니다.\n\n- **잘못된/stale transcript 바인딩**: 첫 inbound에서 self transcript 발견이 늦으면 500ms만 재탐색합니다(`src/runtime/channels/index.mjs:1526`–`1531`, `1571`–`1596`). 이후 실제 transcript가 이미 존재한 상태로 훔치면 일반 `applyTranscriptBinding()`이 EOF로 잡아 이전 출력은 회수되지 않을 수 있습니다(`src/runtime/channels/index.mjs:1597`–`1602`).\n\n- **소유권/백엔드 연결 전 watch flush**: owner probe가 false면 `forwardNewText()`가 읽지 않고 종료합니다(`src/runtime/channels/index.mjs:316`, `src/runtime/channels/lib/output-forwarder.mjs:351`–`354`). 커서는 안 움직여 손실은 아니며, 연결 후 `forwardNewText()`로 회수됩니다(`src/runtime/channels/index.mjs:801`–`812`).\n\n- **아직 없는 transcript 파일**: `fs.watch` 설치 실패는 re-arm poll이 파일 생성 후 watch 설치와 즉시 catch-up을 수행합니다(`src/runtime/channels/index.mjs:339`–`346`, `376`–`381`). 단 60초 제한 이후 생성되면 다음 rebind 전까지 지연/미회수입니다(`src/runtime/channels/index.mjs:348`–`385`).\n\n- **stat→watch 설치 사이 쓰기**: watch 설치 직후 flush를 예약해 그 사이의 backlog를 읽습니다(`src/runtime/channels/lib/output-forwarder.mjs:647`–`667`, `703`–`731`). 이 구간은 회수됩니다.\n\n판정: bridge 활성화 창의 지연은 대부분 backlog catch-up으로 복구되지만, EOF 초기 바인딩/늦은 self-transcript 탈환 경로에는 실제 silent drop 가능성이 남아 있습니다.",
33
+ "card": {
34
+ "session": "sess_53040_1783061772419_1783061772667_52530e4a94c00ff1a9af3420ba33999d",
35
+ "provider": "openai-oauth",
36
+ "model": "gpt-5.5",
37
+ "wall_ms": 105316,
38
+ "turns": 7,
39
+ "tool_calls": 8,
40
+ "tools_per_turn": 1.1,
41
+ "total_tool_ms": 657,
42
+ "llm_stream_ms": 104332,
43
+ "cache_ratio": 0.5201565655306525,
44
+ "cached_tokens": 83456,
45
+ "prompt_tokens": 160444,
46
+ "uncached_tokens": 76988,
47
+ "output_tokens": 10039,
48
+ "cache_weighted_input_10": 85333.6,
49
+ "cache_weighted_input_25": 97852,
50
+ "prompt_growth": 32398,
51
+ "antipatterns": 0,
52
+ "issues": 4,
53
+ "issue_types": [
54
+ "cache_break",
55
+ "cache_miss",
56
+ "cache",
57
+ "service_tier"
58
+ ],
59
+ "read_fragmentation_paths": [],
60
+ "grep_sweep_count": 0
61
+ }
62
+ },
63
+ {
64
+ "id": "r4-impl-usage-summary#1",
65
+ "agent": "worker",
66
+ "ok": true,
67
+ "ms": 72147,
68
+ "sessionId": "sess_44948_1783061772432_1783061772678_1dc2eccd0ea785768ca34e3a5ae803d0",
69
+ "output": "sessionId: sess_44948_1783061772432_1783061772678_1dc2eccd0ea785768ca34e3a5ae803d0\n요청 범위가 작고 명확해서 바로 구현한 뒤 검증까지 진행하겠습니다.완료했습니다, 재영님.\n\n- **추가**: `usage:today` npm script와 `scripts/usage-today.mjs`가 구성됐습니다.\n- **동작**: `MIXDOG_DATA_DIR`를 우선 사용하고, 오늘 0시 이후 `usage_raw/usage`를 모델별·총합으로 집계합니다.\n- **검증**: `node --check scripts/usage-today.mjs` 통과, `npm run usage:today` 실행 완료.\n- **참고**: 워킹트리에 기존 수정 `src/runtime/channels/lib/*` 2개가 있어 건드리지 않았습니다.",
70
+ "card": {
71
+ "session": "sess_44948_1783061772432_1783061772678_1dc2eccd0ea785768ca34e3a5ae803d0",
72
+ "provider": "openai-oauth",
73
+ "model": "gpt-5.5",
74
+ "wall_ms": 61635,
75
+ "turns": 12,
76
+ "tool_calls": 12,
77
+ "tools_per_turn": 1,
78
+ "total_tool_ms": 2827,
79
+ "llm_stream_ms": 58371,
80
+ "cache_ratio": 0.5649887302779865,
81
+ "cached_tokens": 96256,
82
+ "prompt_tokens": 170368,
83
+ "uncached_tokens": 74112,
84
+ "output_tokens": 3491,
85
+ "cache_weighted_input_10": 83737.6,
86
+ "cache_weighted_input_25": 98176,
87
+ "prompt_growth": 12579,
88
+ "antipatterns": 1,
89
+ "issues": 9,
90
+ "issue_types": [
91
+ "cache_break",
92
+ "cache_miss",
93
+ "cache",
94
+ "service_tier",
95
+ "missed_parallelism",
96
+ "tool_churn_cluster"
97
+ ],
98
+ "read_fragmentation_paths": [],
99
+ "grep_sweep_count": 0
100
+ }
101
+ },
102
+ {
103
+ "id": "r4-explain-compact-engine#1",
104
+ "agent": "explore",
105
+ "ok": true,
106
+ "ms": 107990,
107
+ "sessionId": "sess_39556_1783061772446_1783061772692_aa271e435633f4354e8a22e39cf2c817",
108
+ "output": "sessionId: sess_39556_1783061772446_1783061772692_aa271e435633f4354e8a22e39cf2c817\n재영님, compaction subsystem 맵입니다.\n\n- **Entry points**: engine exports `semanticCompactMessages` and `recallFastTrackCompactMessages`; facade `compact.mjs` re-exports them as the stable public API. `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-55`\n\n- **Main callers**: `agentLoop` runs auto pre-send compaction; manager uses `runSessionCompaction` for manual compact and auto-clear pre-compact. `src/runtime/agent/orchestrator/session/loop.mjs:324-330`, `src/runtime/agent/orchestrator/session/manager.mjs:1841-1850`, `src/runtime/agent/orchestrator/session/manager.mjs:1943-1957`\n\n- **Policy/trigger**: auto is disabled by `cfg.auto === false`; boundary comes from explicit boundary/context/autoLimit, trigger is explicit sub-boundary limit or `boundary - buffer`. `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:89-117`\n\n- **Fire decision**: compaction fires when `forceReactive`, token estimate is unavailable, or `messageTokens + reserve >= trigger`; otherwise telemetry records `pre_send_check`. `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:170-174`, `src/runtime/agent/orchestrator/session/loop.mjs:351-371`\n\n- **Type routing**: agent-owned sessions force semantic; otherwise config/env selects semantic vs recall-fasttrack, and loop dispatches recall first or semantic. `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:39-51`, `src/runtime/agent/orchestrator/session/loop.mjs:414-465`\n\n- **Semantic flow**: sanitize → no-op if already within budget unless forced → redact → select window → prompt summary provider → insert summary between protected prefix and preserved tail. `src/runtime/agent/orchestrator/session/compact/engine.mjs:284-314`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:367-392`\n\n- **Window split**: protected system/reminder prefix is separated, prior summary is detected, live excludes summary messages, and head/tail are cut from live. `src/runtime/agent/orchestrator/session/compact/engine.mjs:100-111`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:235-267`\n\n- **Semantic tail choice**: with user turns, keep up to `tailTurns` recent turns within `preserveRecentBudget`, splitting newest suffix if needed; without user turns, cut at newest valid non-tool boundary that fits. `src/runtime/agent/orchestrator/session/compact/engine.mjs:134-185`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:193-232`, `src/runtime/agent/orchestrator/session/compact/budget.mjs:274-288`\n\n- **Recall tail choice**: recall-fasttrack preserves newest structured turns, drops oldest kept turns until cap, then truncates the oldest surviving turn/message while allowing no-user assistant/tool tails. `src/runtime/agent/orchestrator/session/compact/engine.mjs:593-619`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:525-575`\n\n- **Redaction hook**: no-op returns the sanitized transcript unchanged; actual compaction redacts tool-call argument values before window selection, so preserved prefix/tail are emitted redacted. `src/runtime/agent/orchestrator/session/compact/engine.mjs:286-312`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:389-392`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:644-651`\n\n- **Redaction behavior**: sensitive keys become `[redacted]`, raw secret pairs inside strings are scrubbed, and tool-call structure/order/pairing is preserved. `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:219-238`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:261-326`\n\n- **Budget fallback**: if mandatory prefix+tail plus summary room exceeds target, working budget is raised instead of refusing. `src/runtime/agent/orchestrator/session/compact/engine.mjs:319-331`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:658-664`\n\n- **Prompt/summary fallback**: semantic prompt fitting shrinks/drops prior summary/facts and can reduce older head messages; malformed provider summaries are schema-repaired before insertion. `src/runtime/agent/orchestrator/session/compact/summary.mjs:199-281`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:371-384`\n\n- **Runtime fallback**: semantic failures try anchor-independent `pruneToolOutputsUnanchored`; recall-fasttrack failures do not silently prune in loop, while manager can try semantic fallback after recall failure. `src/runtime/agent/orchestrator/session/loop.mjs:500-537`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:231-278`\n\n- **Hard failure paths**: unresolved compact failure records `overflow_failed` and throws `agentContextOverflowError`; provider send overflow gets one reactive compact retry, then surfaces overflow. `src/runtime/agent/orchestrator/session/loop.mjs:552-626`, `src/runtime/agent/orchestrator/session/loop.mjs:982-1026`\n\n- **Persistence recovery**: stale `lastStage='compacting'` is normalized to `interrupted` on fresh ask/resume so UI does not stay stuck. `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:28-43`, `src/runtime/agent/orchestrator/session/manager.mjs:1233-1237`, `src/runtime/agent/orchestrator/session/manager.mjs:1774-1781`",
109
+ "card": {
110
+ "session": "sess_39556_1783061772446_1783061772692_aa271e435633f4354e8a22e39cf2c817",
111
+ "provider": "openai-oauth",
112
+ "model": "gpt-5.5",
113
+ "wall_ms": 97475,
114
+ "turns": 13,
115
+ "tool_calls": 18,
116
+ "tools_per_turn": 1.4,
117
+ "total_tool_ms": 838,
118
+ "llm_stream_ms": 96234,
119
+ "cache_ratio": 0.8082769625109276,
120
+ "cached_tokens": 380928,
121
+ "prompt_tokens": 471284,
122
+ "uncached_tokens": 90356,
123
+ "output_tokens": 7636,
124
+ "cache_weighted_input_10": 128448.8,
125
+ "cache_weighted_input_25": 185588,
126
+ "prompt_growth": 77840,
127
+ "antipatterns": 1,
128
+ "issues": 8,
129
+ "issue_types": [
130
+ "cache_break",
131
+ "readonly_stall",
132
+ "cache",
133
+ "broad_tool_result",
134
+ "service_tier",
135
+ "missed_parallelism",
136
+ "tool_churn_cluster"
137
+ ],
138
+ "read_fragmentation_paths": [],
139
+ "grep_sweep_count": 0
140
+ }
141
+ },
142
+ {
143
+ "id": "r4-debug-forwarding-gap#2",
144
+ "agent": "reviewer",
145
+ "ok": true,
146
+ "ms": 88433,
147
+ "sessionId": "sess_44472_1783061844580_1783061844803_7cea5dcd79cef6e363bcecd4e5901e9b",
148
+ "output": "sessionId: sess_44472_1783061844580_1783061844803_7cea5dcd79cef6e363bcecd4e5901e9b\nTraced the activation-to-forward path; the main true-loss cases are binding/cursor selection, while owner/backend/watch races are mostly delayed and caught up.\n\n- **Highest impact — no usable binding:** if no `channelId` is restored or auto-bound, no context is installed, and a later normal bind starts at EOF; backlog catch-up does **not** recover it. `src/runtime/channels/index.mjs:610-629`, `src/runtime/channels/lib/output-forwarder.mjs:93-129`\n\n- **Existing transcript before first bind:** `catchUpFromPersisted` only replays from a persisted cursor for the same transcript; a fresh existing file is cursored to current size, so earlier assistant bytes are skipped. Recovery: **only if same persisted path exists**. `src/runtime/channels/lib/output-forwarder.mjs:117-126`\n\n- **Bridge active before owner/backend ready:** `bridge-state.json` is written before `refreshBridgeOwnership`; `_isOwner()` blocks forwarding but does not advance the cursor, then post-connect `forwardNewText()` catches up. Recovery: **yes, delayed**. `src/runtime/channels/index.mjs:1735-1747`, `src/runtime/channels/index.mjs:801-812`, `src/runtime/channels/lib/output-forwarder.mjs:351-358`\n\n- **Transcript file not yet created:** initial `fs.watch()` fails, but pending re-arm polls and forwards backlog once the file appears. Recovery: **yes within 60s; no after timeout unless another rebind occurs**. `src/runtime/channels/index.mjs:339-389`, `src/runtime/channels/lib/output-forwarder.mjs:647-670`\n\n- **Pre-connect re-arm exits on non-owner:** a re-arm tick can stop while `bridgeRuntimeConnected` is still false, but startup re-arms or forwards after connect. Recovery: **yes**. `src/runtime/channels/index.mjs:369-379`, `src/runtime/channels/index.mjs:803-812`\n\n- **Watch/debounce race after binding:** bytes written between `setContext()` stat and watch install are covered by scheduled flush; flush debounce adds latency. Recovery: **yes, delayed about 100ms+send time**. `src/runtime/channels/lib/output-forwarder.mjs:665-666`, `src/runtime/channels/lib/output-forwarder.mjs:703-731`\n\nVerdict: the activation window is mostly catch-up safe, except when the first bind has no destination or binds an already-existing unpersisted transcript at EOF.",
149
+ "card": {
150
+ "session": "sess_44472_1783061844580_1783061844803_7cea5dcd79cef6e363bcecd4e5901e9b",
151
+ "provider": "openai-oauth",
152
+ "model": "gpt-5.5",
153
+ "wall_ms": 77953,
154
+ "turns": 7,
155
+ "tool_calls": 8,
156
+ "tools_per_turn": 1.1,
157
+ "total_tool_ms": 658,
158
+ "llm_stream_ms": 76661,
159
+ "cache_ratio": 0.336732434720323,
160
+ "cached_tokens": 51712,
161
+ "prompt_tokens": 153570,
162
+ "uncached_tokens": 101858,
163
+ "output_tokens": 8026,
164
+ "cache_weighted_input_10": 107029.2,
165
+ "cache_weighted_input_25": 114786,
166
+ "prompt_growth": 35224,
167
+ "antipatterns": 1,
168
+ "issues": 8,
169
+ "issue_types": [
170
+ "cache_break",
171
+ "cache_miss",
172
+ "cache",
173
+ "broad_tool_result",
174
+ "service_tier",
175
+ "missed_parallelism",
176
+ "tool_churn_cluster"
177
+ ],
178
+ "read_fragmentation_paths": [],
179
+ "grep_sweep_count": 0
180
+ }
181
+ },
182
+ {
183
+ "id": "r4-impl-usage-summary#2",
184
+ "agent": "worker",
185
+ "ok": true,
186
+ "ms": 68113,
187
+ "sessionId": "sess_29908_1783061880433_1783061880659_3a0ccb5163abe4322c4be7c7cabec26e",
188
+ "output": "sessionId: sess_29908_1783061880433_1783061880659_3a0ccb5163abe4322c4be7c7cabec26e\n구현 기준을 확인한 뒤 바로 반영하고 검증하겠습니다.이미 일부 구현이 있어 실제 기록 포맷과 맞는지 확인한 뒤 필요한 보정만 하겠습니다.기능 파일은 이미 작업 트리에 준비되어 있어 문법 검사와 실제 실행으로 검증하겠습니다.완료했습니다, 재영님. `usage:today` 스크립트와 `scripts/usage-today.mjs`가 준비됐고 검증도 통과했습니다.\n\n- **Diff 요약**: `package.json`에 `usage:today` 추가, 새 스크립트가 오늘 0시 이후 usage를 모델별/총합으로 집계합니다.\n- **검증**: `node --check scripts/usage-today.mjs` 통과, `node scripts/usage-today.mjs` 실행 완료.\n- **참고**: 기존 수정 파일 `src/runtime/channels/...` 2개는 건드리지 않았습니다.",
189
+ "card": {
190
+ "session": "sess_29908_1783061880433_1783061880659_3a0ccb5163abe4322c4be7c7cabec26e",
191
+ "provider": "openai-oauth",
192
+ "model": "gpt-5.5",
193
+ "wall_ms": 57635,
194
+ "turns": 11,
195
+ "tool_calls": 10,
196
+ "tools_per_turn": 0.9,
197
+ "total_tool_ms": 1834,
198
+ "llm_stream_ms": 55184,
199
+ "cache_ratio": 0.7788073227427078,
200
+ "cached_tokens": 145408,
201
+ "prompt_tokens": 186706,
202
+ "uncached_tokens": 41298,
203
+ "output_tokens": 3729,
204
+ "cache_weighted_input_10": 55838.8,
205
+ "cache_weighted_input_25": 77650,
206
+ "prompt_growth": 18346,
207
+ "antipatterns": 1,
208
+ "issues": 6,
209
+ "issue_types": [
210
+ "cache_break",
211
+ "cache_miss",
212
+ "cache",
213
+ "service_tier",
214
+ "missed_parallelism",
215
+ "tool_churn_cluster"
216
+ ],
217
+ "read_fragmentation_paths": [],
218
+ "grep_sweep_count": 0
219
+ }
220
+ },
221
+ {
222
+ "id": "r4-explain-compact-engine#2",
223
+ "agent": "explore",
224
+ "ok": true,
225
+ "ms": 72005,
226
+ "sessionId": "sess_59932_1783061888249_1783061888489_ce57d1706ce48640a8a1d9b85bc7b315",
227
+ "output": "sessionId: sess_59932_1783061888249_1783061888489_ce57d1706ce48640a8a1d9b85bc7b315\n compaction 구조를 `engine.mjs` 기준으로 호출자·분기·실패 경로까지 추적해 간결히 정리하겠습니다.완료했습니다. `engine.mjs` 기준 compaction 아키텍처 요약입니다.\n\n- **Entry points**: `semanticCompactMessages`와 `recallFastTrackCompactMessages`가 public engine API이고 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- **Callers**: live loop는 recall-fasttrack 또는 semantic 중 하나를 호출하고, manager runner는 manual/auto session compaction에서 같은 두 경로를 호출한다. `src/runtime/agent/orchestrator/session/loop.mjs:414`, `src/runtime/agent/orchestrator/session/loop.mjs:439`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:207`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:280`\n\n- **Fire decision**: worker policy computes boundary/trigger/buffer/reserve/type; auto fires when reactive, estimate is null, or `messages+reserve >= trigger`. `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:89`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:117`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:170`\n\n- **Loop trigger path**: loop estimates transcript tokens, calls `shouldCompactForSession`, then targets `compactTargetBudget` before running compaction. `src/runtime/agent/orchestrator/session/loop.mjs:351`, `src/runtime/agent/orchestrator/session/loop.mjs:353`, `src/runtime/agent/orchestrator/session/loop.mjs:362`\n\n- **Manager trigger path**: manual sets `force`, auto can return `below threshold`, and missing boundary only throws for forced compaction. `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:143`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:153`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:176`\n\n- **Common preprocessing**: engine sanitizes tool pairs, dedups tool bodies, separates protected prefix, finds previous summary, and treats non-summary messages as live history. `src/runtime/agent/orchestrator/session/compact/engine.mjs:100`\n\n- **Semantic no-op**: if sanitized input already fits and `force` is not true, semantic returns unchanged without preserved-tail redaction. `src/runtime/agent/orchestrator/session/compact/engine.mjs:284`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:289`\n\n- **Semantic tail**: with user turns, it keeps up to `tailTurns` recent turns within `preserveRecentBudget`, splitting the newest turn suffix if needed. `src/runtime/agent/orchestrator/session/compact/engine.mjs:134`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:151`\n\n- **No-user semantic tail**: without user anchors, valid cut points exclude `tool` messages so assistant/tool pairs stay together, then newest-fitting suffix is chosen. `src/runtime/agent/orchestrator/session/compact/engine.mjs:121`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:193`\n\n- **Semantic window**: `selectCompactionWindow` chooses user-turn or cut-point path, splits `head/tail`, repairs tail pairs, and only empty live history is fatal. `src/runtime/agent/orchestrator/session/compact/engine.mjs:235`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:240`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:250`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:254`\n\n- **Semantic execution**: mandatory cost is `system+tail`; budget is raised to fit mandatory plus summary room; prompt is fit and sent to provider. `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:367`\n\n- **Semantic output**: provider text is schema-repaired, summary is fit into remaining room, then result is `system + summary + tail` with final budget check. `src/runtime/agent/orchestrator/session/compact/engine.mjs:371`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:376`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:384`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:392`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:395`\n\n- **Recall tail**: recall-fasttrack preserves newest structured turns, default max two user turns and 8k cap, dropping oldest turns then truncating oldest surviving content. `src/runtime/agent/orchestrator/session/compact/engine.mjs:449`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:467`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:601`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:610`\n\n- **Recall no-user handling**: no-user recent tail is valid, and orphan tool results are repaired by extending backward or rebuilding from newest non-tool. `src/runtime/agent/orchestrator/session/compact/engine.mjs:525`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:558`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:613`\n\n- **Recall execution**: recall path redacts, splits live context, selects preserved tail, requires compactable prior/recall unless explicitly allowed, caps recall injection room, then emits `system + recall summary + 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:651`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:653`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:681`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:695`\n\n- **Redaction hook**: semantic and recall both call `redactToolCallSecretsInMessages` after fit/no-op check but before window/tail selection, so preserved system/tail are measured and emitted redacted. `src/runtime/agent/orchestrator/session/compact/engine.mjs:306`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:312`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:389`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:644`\n\n- **Engine failures**: semantic throws for missing provider, empty live, no compactable prior, prompt not fitting, empty provider summary, summary not fitting, or final budget overflow. `src/runtime/agent/orchestrator/session/compact/engine.mjs:279`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:254`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:315`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:335`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:372`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:385`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:395`\n\n- **Fallbacks**: loop semantic failure can recover via unanchored prune, but recall-fasttrack failures skip that prune and escalate; manager recall-fasttrack failure first tries semantic fallback, then semantic/prune failure records `*_failed`. `src/runtime/agent/orchestrator/session/loop.mjs:500`, `src/runtime/agent/orchestrator/session/loop.mjs:517`, `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:327`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:348`",
228
+ "card": {
229
+ "session": "sess_59932_1783061888249_1783061888489_ce57d1706ce48640a8a1d9b85bc7b315",
230
+ "provider": "openai-oauth",
231
+ "model": "gpt-5.5",
232
+ "wall_ms": 61515,
233
+ "turns": 8,
234
+ "tool_calls": 9,
235
+ "tools_per_turn": 1.1,
236
+ "total_tool_ms": 318,
237
+ "llm_stream_ms": 60614,
238
+ "cache_ratio": 0.5796200062741247,
239
+ "cached_tokens": 84992,
240
+ "prompt_tokens": 146634,
241
+ "uncached_tokens": 61642,
242
+ "output_tokens": 4622,
243
+ "cache_weighted_input_10": 70141.2,
244
+ "cache_weighted_input_25": 82890,
245
+ "prompt_growth": 24384,
246
+ "antipatterns": 1,
247
+ "issues": 6,
248
+ "issue_types": [
249
+ "cache_break",
250
+ "cache_miss",
251
+ "cache",
252
+ "service_tier",
253
+ "missed_parallelism",
254
+ "tool_churn_cluster"
255
+ ],
256
+ "read_fragmentation_paths": [],
257
+ "grep_sweep_count": 0
258
+ }
259
+ }
260
+ ],
261
+ "task_complete": true,
262
+ "task_errors": [],
263
+ "score_complete": true,
264
+ "score_errors": [],
265
+ "group": {
266
+ "n": 6,
267
+ "wall_ms": 76921.5,
268
+ "turns": 9.7,
269
+ "tool_calls": 10.8,
270
+ "tools_per_turn": 1.1,
271
+ "total_tool_ms": 1188.7,
272
+ "llm_stream_ms": 75232.7,
273
+ "cache_ratio": 0.6,
274
+ "cached_tokens": 140458.7,
275
+ "prompt_tokens": 214834.3,
276
+ "uncached_tokens": 74375.7,
277
+ "output_tokens": 6257.2,
278
+ "cache_weighted_input_10": 88421.5,
279
+ "cache_weighted_input_25": 109490.3,
280
+ "prompt_growth": 33461.8,
281
+ "antipatterns": 0.8,
282
+ "issues": 6.8,
283
+ "grep_sweep_count": 0
284
+ },
285
+ "cards": [
286
+ {
287
+ "session": "sess_53040_1783061772419_1783061772667_52530e4a94c00ff1a9af3420ba33999d",
288
+ "provider": "openai-oauth",
289
+ "model": "gpt-5.5",
290
+ "wall_ms": 105316,
291
+ "turns": 7,
292
+ "tool_calls": 8,
293
+ "tools_per_turn": 1.1,
294
+ "total_tool_ms": 657,
295
+ "llm_stream_ms": 104332,
296
+ "cache_ratio": 0.5201565655306525,
297
+ "cached_tokens": 83456,
298
+ "prompt_tokens": 160444,
299
+ "uncached_tokens": 76988,
300
+ "output_tokens": 10039,
301
+ "cache_weighted_input_10": 85333.6,
302
+ "cache_weighted_input_25": 97852,
303
+ "prompt_growth": 32398,
304
+ "antipatterns": 0,
305
+ "issues": 4,
306
+ "issue_types": [
307
+ "cache_break",
308
+ "cache_miss",
309
+ "cache",
310
+ "service_tier"
311
+ ],
312
+ "read_fragmentation_paths": [],
313
+ "grep_sweep_count": 0
314
+ },
315
+ {
316
+ "session": "sess_44948_1783061772432_1783061772678_1dc2eccd0ea785768ca34e3a5ae803d0",
317
+ "provider": "openai-oauth",
318
+ "model": "gpt-5.5",
319
+ "wall_ms": 61635,
320
+ "turns": 12,
321
+ "tool_calls": 12,
322
+ "tools_per_turn": 1,
323
+ "total_tool_ms": 2827,
324
+ "llm_stream_ms": 58371,
325
+ "cache_ratio": 0.5649887302779865,
326
+ "cached_tokens": 96256,
327
+ "prompt_tokens": 170368,
328
+ "uncached_tokens": 74112,
329
+ "output_tokens": 3491,
330
+ "cache_weighted_input_10": 83737.6,
331
+ "cache_weighted_input_25": 98176,
332
+ "prompt_growth": 12579,
333
+ "antipatterns": 1,
334
+ "issues": 9,
335
+ "issue_types": [
336
+ "cache_break",
337
+ "cache_miss",
338
+ "cache",
339
+ "service_tier",
340
+ "missed_parallelism",
341
+ "tool_churn_cluster"
342
+ ],
343
+ "read_fragmentation_paths": [],
344
+ "grep_sweep_count": 0
345
+ },
346
+ {
347
+ "session": "sess_39556_1783061772446_1783061772692_aa271e435633f4354e8a22e39cf2c817",
348
+ "provider": "openai-oauth",
349
+ "model": "gpt-5.5",
350
+ "wall_ms": 97475,
351
+ "turns": 13,
352
+ "tool_calls": 18,
353
+ "tools_per_turn": 1.4,
354
+ "total_tool_ms": 838,
355
+ "llm_stream_ms": 96234,
356
+ "cache_ratio": 0.8082769625109276,
357
+ "cached_tokens": 380928,
358
+ "prompt_tokens": 471284,
359
+ "uncached_tokens": 90356,
360
+ "output_tokens": 7636,
361
+ "cache_weighted_input_10": 128448.8,
362
+ "cache_weighted_input_25": 185588,
363
+ "prompt_growth": 77840,
364
+ "antipatterns": 1,
365
+ "issues": 8,
366
+ "issue_types": [
367
+ "cache_break",
368
+ "readonly_stall",
369
+ "cache",
370
+ "broad_tool_result",
371
+ "service_tier",
372
+ "missed_parallelism",
373
+ "tool_churn_cluster"
374
+ ],
375
+ "read_fragmentation_paths": [],
376
+ "grep_sweep_count": 0
377
+ },
378
+ {
379
+ "session": "sess_44472_1783061844580_1783061844803_7cea5dcd79cef6e363bcecd4e5901e9b",
380
+ "provider": "openai-oauth",
381
+ "model": "gpt-5.5",
382
+ "wall_ms": 77953,
383
+ "turns": 7,
384
+ "tool_calls": 8,
385
+ "tools_per_turn": 1.1,
386
+ "total_tool_ms": 658,
387
+ "llm_stream_ms": 76661,
388
+ "cache_ratio": 0.336732434720323,
389
+ "cached_tokens": 51712,
390
+ "prompt_tokens": 153570,
391
+ "uncached_tokens": 101858,
392
+ "output_tokens": 8026,
393
+ "cache_weighted_input_10": 107029.2,
394
+ "cache_weighted_input_25": 114786,
395
+ "prompt_growth": 35224,
396
+ "antipatterns": 1,
397
+ "issues": 8,
398
+ "issue_types": [
399
+ "cache_break",
400
+ "cache_miss",
401
+ "cache",
402
+ "broad_tool_result",
403
+ "service_tier",
404
+ "missed_parallelism",
405
+ "tool_churn_cluster"
406
+ ],
407
+ "read_fragmentation_paths": [],
408
+ "grep_sweep_count": 0
409
+ },
410
+ {
411
+ "session": "sess_29908_1783061880433_1783061880659_3a0ccb5163abe4322c4be7c7cabec26e",
412
+ "provider": "openai-oauth",
413
+ "model": "gpt-5.5",
414
+ "wall_ms": 57635,
415
+ "turns": 11,
416
+ "tool_calls": 10,
417
+ "tools_per_turn": 0.9,
418
+ "total_tool_ms": 1834,
419
+ "llm_stream_ms": 55184,
420
+ "cache_ratio": 0.7788073227427078,
421
+ "cached_tokens": 145408,
422
+ "prompt_tokens": 186706,
423
+ "uncached_tokens": 41298,
424
+ "output_tokens": 3729,
425
+ "cache_weighted_input_10": 55838.8,
426
+ "cache_weighted_input_25": 77650,
427
+ "prompt_growth": 18346,
428
+ "antipatterns": 1,
429
+ "issues": 6,
430
+ "issue_types": [
431
+ "cache_break",
432
+ "cache_miss",
433
+ "cache",
434
+ "service_tier",
435
+ "missed_parallelism",
436
+ "tool_churn_cluster"
437
+ ],
438
+ "read_fragmentation_paths": [],
439
+ "grep_sweep_count": 0
440
+ },
441
+ {
442
+ "session": "sess_59932_1783061888249_1783061888489_ce57d1706ce48640a8a1d9b85bc7b315",
443
+ "provider": "openai-oauth",
444
+ "model": "gpt-5.5",
445
+ "wall_ms": 61515,
446
+ "turns": 8,
447
+ "tool_calls": 9,
448
+ "tools_per_turn": 1.1,
449
+ "total_tool_ms": 318,
450
+ "llm_stream_ms": 60614,
451
+ "cache_ratio": 0.5796200062741247,
452
+ "cached_tokens": 84992,
453
+ "prompt_tokens": 146634,
454
+ "uncached_tokens": 61642,
455
+ "output_tokens": 4622,
456
+ "cache_weighted_input_10": 70141.2,
457
+ "cache_weighted_input_25": 82890,
458
+ "prompt_growth": 24384,
459
+ "antipatterns": 1,
460
+ "issues": 6,
461
+ "issue_types": [
462
+ "cache_break",
463
+ "cache_miss",
464
+ "cache",
465
+ "service_tier",
466
+ "missed_parallelism",
467
+ "tool_churn_cluster"
468
+ ],
469
+ "read_fragmentation_paths": [],
470
+ "grep_sweep_count": 0
471
+ }
472
+ ]
473
+ }