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,456 @@
1
+ {
2
+ "round": "17",
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_55884_1783059815805_1783059816044_1d290d1d86ad152644020350714e0b6a",
18
+ "sess_48508_1783059815820_1783059816056_cebabb220978834570309408a4932033",
19
+ "sess_12172_1783059815886_1783059816130_c1422313e74ff647937bfb7ccc713170",
20
+ "sess_44152_1783059834394_1783059834618_56b4c9c66902e5730af3a1b5d05d85c4",
21
+ "sess_25912_1783059899801_1783059900029_f989eab921374da513570e09d7d39c55",
22
+ "sess_60436_1783059931841_1783059932082_99b61f2d2925940ee5554fa92042346c"
23
+ ],
24
+ "results": [
25
+ {
26
+ "id": "r4-debug-forwarding-gap#1",
27
+ "agent": "reviewer",
28
+ "ok": true,
29
+ "ms": 116038,
30
+ "sessionId": "sess_55884_1783059815805_1783059816044_1d290d1d86ad152644020350714e0b6a",
31
+ "output": "sessionId: sess_55884_1783059815805_1783059816044_1d290d1d86ad152644020350714e0b6a\n관련 경로를 먼저 확인해 전체 흐름과 줄 번호를 맞추겠습니다.조사 결과, not-yet-created transcript는 대부분 복구되지만 “이미 존재하는 transcript를 처음 EOF로 묶는” 경로에는 실제 무손실 보장이 없습니다.\n\n- **최대 영향: 기존 transcript를 EOF로 바인딩하면 선행 출력 드롭** — `setContext()`가 기본적으로 `currentSize`로 커서를 잡고(`src/runtime/channels/lib/output-forwarder.mjs:111-129`), `applyTranscriptBinding()` 호출은 즉시 watch만 겁니다(`src/runtime/channels/index.mjs:317-321`). backlog catch-up: **아니오**, `replayFromStart` 또는 같은 transcript의 persisted cursor가 없으면 이미 쓴 assistant 출력은 읽지 않습니다.\n\n- **not-yet-created transcript는 지연 후 대체로 복구** — `fs.watch`는 없는 파일에서 실패하지만(`src/runtime/channels/lib/output-forwarder.mjs:647-670`), re-arm poll이 생성 감지 후 watch 설치와 `forwardNewText()`를 실행합니다(`src/runtime/channels/index.mjs:357-389`, `486-498`). backlog catch-up: **예**, 단 60초 timeout 이후에는 다음 rebind 없이는 stranded입니다.\n\n- **활성화 직후 ownership/backend 연결 전 출력은 지연** — `bridge-state.json`은 먼저 쓰이고(`src/runtime/channels/index.mjs:1735-1744`), owner gate는 `bridgeRuntimeConnected && currentOwnerState().owned`가 되기 전 `forwardNewText()`를 no-op 처리합니다(`src/runtime/channels/index.mjs:316`, `src/runtime/channels/lib/output-forwarder.mjs:351-354`). backlog catch-up: **조건부 예**, 커서가 앞서 EOF로 잡히지 않았을 때 post-connect/rearm flush가 회수합니다(`src/runtime/channels/index.mjs:801-809`).\n\n- **watch 이벤트 중 ownership probe 실패는 지연 가능** — `_isOwner()`는 probe 예외/false를 fail-closed로 처리하고(`src/runtime/channels/lib/output-forwarder.mjs:36-41`), watch flush는 실패 시 별도 retry를 예약하지 않습니다(`src/runtime/channels/lib/output-forwarder.mjs:703-731`). backlog catch-up: **부분적 예**, 커서는 안 움직이므로 다음 write/turn-end/rebind가 있으면 회수되지만 마지막 출력이면 지연될 수 있습니다.\n\n- **stat→watch 설치 사이의 짧은 레이스는 커버됨** — watch 설치 직후 `scheduleWatchFlush()`가 실행되어 그 사이 쓰인 bytes를 읽습니다(`src/runtime/channels/lib/output-forwarder.mjs:653-667`). backlog catch-up: **예**.\n\n판정: bridge activation 이후 pending transcript 경로는 복구 설계가 있지만, 기존 transcript를 처음 바인딩하는 EOF cursor 경로는 assistant 출력 유실 가능성이 남아 있습니다.",
32
+ "card": {
33
+ "session": "sess_55884_1783059815805_1783059816044_1d290d1d86ad152644020350714e0b6a",
34
+ "provider": "openai-oauth",
35
+ "model": "gpt-5.5",
36
+ "wall_ms": 105545,
37
+ "turns": 5,
38
+ "tool_calls": 7,
39
+ "tools_per_turn": 1.4,
40
+ "total_tool_ms": 439,
41
+ "llm_stream_ms": 104528,
42
+ "cache_ratio": 0.23191906990789674,
43
+ "cached_tokens": 23040,
44
+ "prompt_tokens": 99345,
45
+ "uncached_tokens": 76305,
46
+ "output_tokens": 11249,
47
+ "cache_weighted_input_10": 78609,
48
+ "cache_weighted_input_25": 82065,
49
+ "prompt_growth": 38284,
50
+ "antipatterns": 0,
51
+ "issues": 10,
52
+ "issue_types": [
53
+ "cache",
54
+ "cache_break",
55
+ "cache_miss",
56
+ "broad_tool_result",
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": 18575,
68
+ "sessionId": "sess_48508_1783059815820_1783059816056_cebabb220978834570309408a4932033",
69
+ "output": "sessionId: sess_48508_1783059815820_1783059816056_cebabb220978834570309408a4932033\n재영님, 진행 계획은 아래처럼 잡겠습니다. 승인해 주시면 바로 구현·검증하겠습니다.\n\n- **스크립트 추가**: `scripts/usage-today.mjs`에서 `MIXDOG_DATA_DIR` 또는 `~/.mixdog/data`의 `history/agent-trace.jsonl`을 읽고 오늘 00:00 이후 usage row만 집계\n- **출력**: 모델별 calls, input/cached/output tokens, costUsd와 grand total 출력\n- **연결/검증**: `package.json`에 `usage:today` 추가 후 `node --check`, 실제 1회 실행까지 확인\n\n진행해도 될까요?",
70
+ "card": {
71
+ "session": "sess_48508_1783059815820_1783059816056_cebabb220978834570309408a4932033",
72
+ "provider": "openai-oauth",
73
+ "model": "gpt-5.5",
74
+ "wall_ms": 8082,
75
+ "turns": 1,
76
+ "tool_calls": 0,
77
+ "tools_per_turn": 0,
78
+ "total_tool_ms": 0,
79
+ "llm_stream_ms": 7179,
80
+ "cache_ratio": 0,
81
+ "cached_tokens": 0,
82
+ "prompt_tokens": 4748,
83
+ "uncached_tokens": 4748,
84
+ "output_tokens": 466,
85
+ "cache_weighted_input_10": 4748,
86
+ "cache_weighted_input_25": 4748,
87
+ "prompt_growth": 0,
88
+ "antipatterns": 0,
89
+ "issues": 3,
90
+ "issue_types": [
91
+ "cache",
92
+ "cache_break",
93
+ "service_tier"
94
+ ],
95
+ "read_fragmentation_paths": [],
96
+ "grep_sweep_count": 0
97
+ }
98
+ },
99
+ {
100
+ "id": "r4-explain-compact-engine#1",
101
+ "agent": "explore",
102
+ "ok": true,
103
+ "ms": 83971,
104
+ "sessionId": "sess_12172_1783059815886_1783059816130_c1422313e74ff647937bfb7ccc713170",
105
+ "output": "sessionId: sess_12172_1783059815886_1783059816130_c1422313e74ff647937bfb7ccc713170\n완료했습니다 — compaction subsystem architecture brief입니다.\n\n```text\n1. Public surface re-exports `semanticCompactMessages` and `recallFastTrackCompactMessages`; existing callers import through `session/compact.mjs`. src/runtime/agent/orchestrator/session/compact.mjs:52\n2. Main auto entry is pre-send in `agentLoop`: drain queued messages, resolve policy, estimate tokens, decide, then choose recall-fasttrack or semantic. src/runtime/agent/orchestrator/session/loop.mjs:324\n3. Manual/API entry is `compact()` → `compactSessionMessages()` → `runSessionCompaction(... force:true)`. src/mixdog-session-runtime.mjs:2452, src/runtime/agent/orchestrator/session/manager.mjs:1950\n4. Auto-clear can pre-compact before clearing when a compact type is requested. src/runtime/agent/orchestrator/session/manager.mjs:1834\n5. Policy is enabled unless `compaction.auto === false` / env disables it, and requires a boundary from explicit boundary/context/auto limit. src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:89\n6. Trigger tokens are explicit sub-boundary auto limit or boundary minus configured/default buffer. src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:107\n7. Compaction fires when reactive overflow is pending, token estimate is unknown, or `messages+reserve >= triggerTokens`. src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:170\n8. Target budget is the compact target plus reserve, clamped to the boundary. src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:163\n9. Auto loop tags reactive retries separately from proactive auto compaction. src/runtime/agent/orchestrator/session/loop.mjs:351\n10. Recall-fasttrack path runs first when policy type is recall-fasttrack; semantic path is the default semantic branch. src/runtime/agent/orchestrator/session/loop.mjs:414, src/runtime/agent/orchestrator/session/loop.mjs:439\n11. Agent-owned sessions are forced to semantic to avoid injecting unrelated main-session recall. src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:39\n12. Semantic compaction sanitizes tool pairs/dedups, no-ops if already within budget and not forced, otherwise redacts before windowing. src/runtime/agent/orchestrator/session/compact/engine.mjs:284\n13. Redaction scrubs sensitive tool-call argument values while preserving message/tool-call shape and order. src/runtime/agent/orchestrator/session/compact/text-utils.mjs:219\n14. Redaction is applied before semantic window selection so preserved system/tail are measured and emitted redacted. src/runtime/agent/orchestrator/session/compact/engine.mjs:306\n15. Redaction is also applied before recall-fasttrack splitting. src/runtime/agent/orchestrator/session/compact/engine.mjs:644\n16. Semantic windowing separates protected prefix, prior summary, and live non-summary messages. src/runtime/agent/orchestrator/session/compact/engine.mjs:100\n17. Semantic tail keeps recent user-anchored turns when user messages exist, bounded by preserved-recent budget and `tailTurns`. src/runtime/agent/orchestrator/session/compact/engine.mjs:134\n18. If no user turns exist, semantic tail starts at a valid non-tool cut point so tool results never become the first preserved message. src/runtime/agent/orchestrator/session/compact/engine.mjs:121\n19. Semantic head is everything before `tailStartIdx`; tail is re-sanitized to repair pair/dedup artifacts. src/runtime/agent/orchestrator/session/compact/engine.mjs:244\n20. Semantic refuses only an empty live window or no compactable prior history without previous summary. src/runtime/agent/orchestrator/session/compact/engine.mjs:254, src/runtime/agent/orchestrator/session/compact/engine.mjs:315\n21. Semantic raises budget to fit mandatory preserved context plus minimum summary room instead of refusing mandatory overflow. src/runtime/agent/orchestrator/session/compact/engine.mjs:319\n22. Semantic prompt is fitted to 85% headroom, sent with low/fast settings and a timeout signal. src/runtime/agent/orchestrator/session/compact/engine.mjs:333\n23. Semantic malformed summaries are schema-repaired before becoming the summary message. src/runtime/agent/orchestrator/session/compact/engine.mjs:371\n24. Recall-fasttrack preserves newest structured turns, default max two user turns and 8k cap. src/runtime/agent/orchestrator/session/compact/engine.mjs:449\n25. Recall tail drops oldest kept turns first, then truncates the oldest surviving content while keeping newest content whole. src/runtime/agent/orchestrator/session/compact/engine.mjs:601\n26. Recall no-user tails are valid and preserve recent assistant/tool structure. src/runtime/agent/orchestrator/session/compact/engine.mjs:613\n27. Recall summary input combines session id, cycle-1 hydrated chunks/raw fallback, and recall text. src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:148\n28. Recall injection is capped to 5% of context window with a floor when context window is known. src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:151\n29. Recall-fasttrack throws on no compactable prior plus empty recall/prior unless `allowEmptyRecall` is true. src/runtime/agent/orchestrator/session/compact/engine.mjs:653\n30. Recall-fasttrack raises budget for mandatory preserved context the same way semantic does. src/runtime/agent/orchestrator/session/compact/engine.mjs:658\n31. Recall-fasttrack then fits a recall summary message and validates final tokens against budget. src/runtime/agent/orchestrator/session/compact/engine.mjs:684\n32. In loop auto path, recall-fasttrack failure is logged and rethrown; semantic fallback is not attempted there. src/runtime/agent/orchestrator/session/loop.mjs:429\n33. In manual/session runner, recall-fasttrack failure can degrade to semantic once if semantic is enabled and provider is available. src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:237\n34. Semantic/manual non-recall failure falls back to anchor-independent tool-output pruning if the salvaged transcript fits the effective budget. src/runtime/agent/orchestrator/session/loop.mjs:501\n35. Session-runner mirrors the same non-recall prune fallback. src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:322\n36. If no fallback succeeds in the loop, telemetry/event records `overflow_failed` and raises `AgentContextOverflowError`. src/runtime/agent/orchestrator/session/loop.mjs:552\n37. `AgentContextOverflowError` reports stage, budget, reserve, context window, estimate, and original cause. src/runtime/agent/orchestrator/session/loop/context-overflow.mjs:4\n38. On success, loop replaces messages, clears provider state, resets iteration count, records telemetry, and emits compact event. src/runtime/agent/orchestrator/session/loop.mjs:631\n```",
106
+ "card": {
107
+ "session": "sess_12172_1783059815886_1783059816130_c1422313e74ff647937bfb7ccc713170",
108
+ "provider": "openai-oauth",
109
+ "model": "gpt-5.5",
110
+ "wall_ms": 73427,
111
+ "turns": 9,
112
+ "tool_calls": 11,
113
+ "tools_per_turn": 1.2,
114
+ "total_tool_ms": 1049,
115
+ "llm_stream_ms": 72134,
116
+ "cache_ratio": 0.8001111265453535,
117
+ "cached_tokens": 207360,
118
+ "prompt_tokens": 259164,
119
+ "uncached_tokens": 51804,
120
+ "output_tokens": 4631,
121
+ "cache_weighted_input_10": 72540,
122
+ "cache_weighted_input_25": 103644,
123
+ "prompt_growth": 45252,
124
+ "antipatterns": 1,
125
+ "issues": 14,
126
+ "issue_types": [
127
+ "cache",
128
+ "cache_break",
129
+ "readonly_stall",
130
+ "service_tier",
131
+ "missed_parallelism",
132
+ "tool_churn_cluster"
133
+ ],
134
+ "read_fragmentation_paths": [],
135
+ "grep_sweep_count": 0
136
+ }
137
+ },
138
+ {
139
+ "id": "r4-debug-forwarding-gap#2",
140
+ "agent": "reviewer",
141
+ "ok": true,
142
+ "ms": 119286,
143
+ "sessionId": "sess_44152_1783059834394_1783059834618_56b4c9c66902e5730af3a1b5d05d85c4",
144
+ "output": "sessionId: sess_44152_1783059834394_1783059834618_56b4c9c66902e5730af3a1b5d05d85c4\n요청 범위의 핵심 파일을 먼저 확인해 활성화부터 첫 전달까지 흐름을 추적하겠습니다.Done — traced activation to first forward; one path can silently skip existing output, while most startup races are delayed and caught up.\n\n- **Highest impact: EOF baseline on first existing transcript** — activation uses `catchUpFromPersisted`, but if no matching persisted cursor exists, `setContext()` starts at `currentSize`, so assistant bytes already in the transcript are marked read and not replayed. Backlog catch-up: **No**. Anchors: `src/runtime/channels/index.mjs:625`, `src/runtime/channels/lib/output-forwarder.mjs:117`.\n\n- **Missing transcript file** — `fs.watch()` cannot attach to a not-yet-created `.jsonl`, so output waits for the re-arm poll; if the file appears within 60s, `forwardNewText()` replays from the saved cursor/start. Backlog catch-up: **Yes within 60s; no automatic recovery after timeout**. Anchors: `src/runtime/channels/lib/output-forwarder.mjs:647`, `src/runtime/channels/index.mjs:357`.\n\n- **Bridge active before backend/ownership ready** — `bridge-state.json` is written before `backend.connect()` and `bridgeRuntimeConnected=true`; early flushes fail owner probe and read nothing. Backlog catch-up: **Yes on normal connect via post-connect `forwardNewText()`/re-arm; no if this process loses ownership**. Anchors: `src/runtime/channels/index.mjs:1735`, `src/runtime/channels/index.mjs:776`, `src/runtime/channels/lib/output-forwarder.mjs:351`.\n\n- **No channel binding** — if persisted status and main-channel fallback cannot provide a channel, binding returns and `forwardNewText()` no-ops. Backlog catch-up: **No automatic recovery until a later inbound establishes a channel, and existing bytes may then hit the EOF-baseline issue**. Anchors: `src/runtime/channels/index.mjs:610`, `src/runtime/channels/lib/output-forwarder.mjs:353`.\n\n- **Covered micro-gap** — bytes written between `setContext()` stat and `fs.watch()` install are explicitly flushed after watcher install. Backlog catch-up: **Yes**. Anchor: `src/runtime/channels/lib/output-forwarder.mjs:665`.\n\nVerdict: the bridge is mostly self-healing for startup timing races, but activation can still silently drop pre-bind output when an existing transcript is first bound without a matching persisted cursor.",
145
+ "card": {
146
+ "session": "sess_44152_1783059834394_1783059834618_56b4c9c66902e5730af3a1b5d05d85c4",
147
+ "provider": "openai-oauth",
148
+ "model": "gpt-5.5",
149
+ "wall_ms": 108812,
150
+ "turns": 6,
151
+ "tool_calls": 5,
152
+ "tools_per_turn": 0.8,
153
+ "total_tool_ms": 304,
154
+ "llm_stream_ms": 107642,
155
+ "cache_ratio": 0.7334463495955811,
156
+ "cached_tokens": 117248,
157
+ "prompt_tokens": 159859,
158
+ "uncached_tokens": 42611,
159
+ "output_tokens": 10625,
160
+ "cache_weighted_input_10": 54335.8,
161
+ "cache_weighted_input_25": 71923,
162
+ "prompt_growth": 36198,
163
+ "antipatterns": 1,
164
+ "issues": 11,
165
+ "issue_types": [
166
+ "cache",
167
+ "cache_break",
168
+ "broad_tool_result",
169
+ "service_tier",
170
+ "missed_parallelism",
171
+ "tool_churn_cluster"
172
+ ],
173
+ "read_fragmentation_paths": [],
174
+ "grep_sweep_count": 0
175
+ }
176
+ },
177
+ {
178
+ "id": "r4-impl-usage-summary#2",
179
+ "agent": "worker",
180
+ "ok": true,
181
+ "ms": 58353,
182
+ "sessionId": "sess_25912_1783059899801_1783059900029_f989eab921374da513570e09d7d39c55",
183
+ "output": "sessionId: sess_25912_1783059899801_1783059900029_f989eab921374da513570e09d7d39c55\n요청 범위가 명확해 바로 구현하고 검증까지 진행하겠습니다.이미 같은 이름의 스크립트가 있어 현재 구현 상태를 기준으로 누락 여부와 diff를 확인하겠습니다.구현 파일이 이미 작업트리에 있어 요구사항 충족 여부를 검증하고 diff를 정리하겠습니다.완료했습니다. `usage:today` 스크립트와 `scripts/usage-today.mjs`가 추가되어 오늘 사용량을 모델별/총합으로 출력합니다.\n\n- **Diff 요약**: `package.json`에 `usage:today` 추가, `scripts/usage-today.mjs` 신규 추가.\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`에 별도 수정이 있었습니다.",
184
+ "card": {
185
+ "session": "sess_25912_1783059899801_1783059900029_f989eab921374da513570e09d7d39c55",
186
+ "provider": "openai-oauth",
187
+ "model": "gpt-5.5",
188
+ "wall_ms": 47887,
189
+ "turns": 6,
190
+ "tool_calls": 10,
191
+ "tools_per_turn": 1.7,
192
+ "total_tool_ms": 2312,
193
+ "llm_stream_ms": 45195,
194
+ "cache_ratio": 0.6885261237663127,
195
+ "cached_tokens": 58880,
196
+ "prompt_tokens": 85516,
197
+ "uncached_tokens": 26636,
198
+ "output_tokens": 3571,
199
+ "cache_weighted_input_10": 32524,
200
+ "cache_weighted_input_25": 41356,
201
+ "prompt_growth": 16109,
202
+ "antipatterns": 0,
203
+ "issues": 8,
204
+ "issue_types": [
205
+ "cache",
206
+ "cache_break",
207
+ "service_tier"
208
+ ],
209
+ "read_fragmentation_paths": [],
210
+ "grep_sweep_count": 0
211
+ }
212
+ },
213
+ {
214
+ "id": "r4-explain-compact-engine#2",
215
+ "agent": "explore",
216
+ "ok": true,
217
+ "ms": 60242,
218
+ "sessionId": "sess_60436_1783059931841_1783059932082_99b61f2d2925940ee5554fa92042346c",
219
+ "output": "sessionId: sess_60436_1783059931841_1783059932082_99b61f2d2925940ee5554fa92042346c\n완료했습니다. compaction subsystem 아키텍처 브리프입니다.\n\n- **Entry points**: public facade exports `semanticCompactMessages`/`recallFastTrackCompactMessages` from `compact.mjs`, backed by `engine.mjs` exports at `src/runtime/agent/orchestrator/session/compact.mjs:52-54`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:278`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:445`.\n\n- **Callers**: pre-send agent loop calls recall-fasttrack or semantic compaction at `src/runtime/agent/orchestrator/session/loop.mjs:414-459`; manual/clear/session compaction uses `runSessionCompaction` via manager at `src/runtime/agent/orchestrator/session/manager.mjs:1849`, `src/runtime/agent/orchestrator/session/manager.mjs:1950`.\n\n- **Fire decision**: loop drains queued steering before measuring, resolves worker policy, estimates transcript tokens, then calls `shouldCompactForSession` at `src/runtime/agent/orchestrator/session/loop.mjs:324-353`.\n\n- **Thresholds**: auto compaction is disabled by `cfg.auto === false` or env flag, otherwise boundary/trigger/reserve/type/tail settings are derived at `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:90-148`.\n\n- **Trigger rule**: compaction fires on reactive overflow, unknown token estimate, or `messageTokens + reserveTokens >= triggerTokens` at `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:170-174`.\n\n- **Path choice**: loop prefers recall-fasttrack when policy says so, otherwise semantic, otherwise throws unavailable compact type at `src/runtime/agent/orchestrator/session/loop.mjs:414-498`.\n\n- **Semantic window**: engine sanitizes, splits protected/system prefix, previous summary, and live non-summary messages at `src/runtime/agent/orchestrator/session/compact/engine.mjs:100-111`.\n\n- **Semantic tail**: if user turns exist, it keeps up to configured recent turns within preserved budget; if no user turns, it cuts on non-`tool` boundaries to keep provider-valid pairs at `src/runtime/agent/orchestrator/session/compact/engine.mjs:134-185`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:193-233`.\n\n- **Tail repair**: selected tail is sanitized/deduped/reconciled after the cut so orphan tool pairs are repaired at `src/runtime/agent/orchestrator/session/compact/engine.mjs:244-250`.\n\n- **Recall tail**: recall-fasttrack preserves newest turns, drops oldest turns until under cap, truncates the oldest surviving content if needed, then returns `head` before the tail at `src/runtime/agent/orchestrator/session/compact/engine.mjs:593-619`.\n\n- **Redaction hook**: both semantic and recall paths redact tool-call secrets after no-op budget check and before window/tail selection at `src/runtime/agent/orchestrator/session/compact/engine.mjs:306-314`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:644-651`.\n\n- **Redaction scope**: redaction targets assistant `toolCalls` argument values, with sensitive key/raw-string patterns handled in text utils at `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:12-17`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:121-127`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:321-323`.\n\n- **Semantic failure checks**: missing provider, no compactable head, prompt fit failure, empty provider summary, summary fit failure, or final budget overflow throw from `src/runtime/agent/orchestrator/session/compact/engine.mjs:279-280`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:315-317`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:335-386`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:394-397`.\n\n- **Recall failure checks**: no compactable prior/recall, empty recall, summary fit failure, or final budget overflow throw from `src/runtime/agent/orchestrator/session/compact/engine.mjs:653-668`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:684-699`.\n\n- **Loop fallback**: semantic failures may recover with non-LLM unanchored tool-output prune; recall failures skip that fallback and escalate to overflow at `src/runtime/agent/orchestrator/session/loop.mjs:501-538`, `src/runtime/agent/orchestrator/session/loop.mjs:546-626`.\n\n- **Manager fallback**: session/manual compaction degrades recall-fasttrack to semantic once, then non-recall failures may prune; unrecovered failures are recorded and returned without mutating messages at `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:237-270`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:322-397`.\n\n- **Successful mutation**: loop replaces in-memory messages and clears provider state; manager writes `session.messages`, clears `session.providerState`, and records compact metadata at `src/runtime/agent/orchestrator/session/loop.mjs:630-647`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:410-445`.",
220
+ "card": {
221
+ "session": "sess_60436_1783059931841_1783059932082_99b61f2d2925940ee5554fa92042346c",
222
+ "provider": "openai-oauth",
223
+ "model": "gpt-5.5",
224
+ "wall_ms": 49755,
225
+ "turns": 6,
226
+ "tool_calls": 7,
227
+ "tools_per_turn": 1.2,
228
+ "total_tool_ms": 656,
229
+ "llm_stream_ms": 48561,
230
+ "cache_ratio": 0.5869960043588812,
231
+ "cached_tokens": 51712,
232
+ "prompt_tokens": 88096,
233
+ "uncached_tokens": 36384,
234
+ "output_tokens": 3580,
235
+ "cache_weighted_input_10": 41555.2,
236
+ "cache_weighted_input_25": 49312,
237
+ "prompt_growth": 30432,
238
+ "antipatterns": 1,
239
+ "issues": 10,
240
+ "issue_types": [
241
+ "cache",
242
+ "cache_break",
243
+ "broad_tool_result",
244
+ "service_tier",
245
+ "tool_churn_cluster"
246
+ ],
247
+ "read_fragmentation_paths": [],
248
+ "grep_sweep_count": 0
249
+ }
250
+ }
251
+ ],
252
+ "task_complete": true,
253
+ "task_errors": [],
254
+ "score_complete": true,
255
+ "score_errors": [],
256
+ "group": {
257
+ "n": 6,
258
+ "wall_ms": 65584.7,
259
+ "turns": 5.5,
260
+ "tool_calls": 6.7,
261
+ "tools_per_turn": 1.1,
262
+ "total_tool_ms": 793.3,
263
+ "llm_stream_ms": 64206.5,
264
+ "cache_ratio": 0.5,
265
+ "cached_tokens": 76373.3,
266
+ "prompt_tokens": 116121.3,
267
+ "uncached_tokens": 39748,
268
+ "output_tokens": 5687,
269
+ "cache_weighted_input_10": 47385.3,
270
+ "cache_weighted_input_25": 58841.3,
271
+ "prompt_growth": 27712.5,
272
+ "antipatterns": 0.5,
273
+ "issues": 9.3,
274
+ "grep_sweep_count": 0
275
+ },
276
+ "cards": [
277
+ {
278
+ "session": "sess_55884_1783059815805_1783059816044_1d290d1d86ad152644020350714e0b6a",
279
+ "provider": "openai-oauth",
280
+ "model": "gpt-5.5",
281
+ "wall_ms": 105545,
282
+ "turns": 5,
283
+ "tool_calls": 7,
284
+ "tools_per_turn": 1.4,
285
+ "total_tool_ms": 439,
286
+ "llm_stream_ms": 104528,
287
+ "cache_ratio": 0.23191906990789674,
288
+ "cached_tokens": 23040,
289
+ "prompt_tokens": 99345,
290
+ "uncached_tokens": 76305,
291
+ "output_tokens": 11249,
292
+ "cache_weighted_input_10": 78609,
293
+ "cache_weighted_input_25": 82065,
294
+ "prompt_growth": 38284,
295
+ "antipatterns": 0,
296
+ "issues": 10,
297
+ "issue_types": [
298
+ "cache",
299
+ "cache_break",
300
+ "cache_miss",
301
+ "broad_tool_result",
302
+ "service_tier"
303
+ ],
304
+ "read_fragmentation_paths": [],
305
+ "grep_sweep_count": 0
306
+ },
307
+ {
308
+ "session": "sess_48508_1783059815820_1783059816056_cebabb220978834570309408a4932033",
309
+ "provider": "openai-oauth",
310
+ "model": "gpt-5.5",
311
+ "wall_ms": 8082,
312
+ "turns": 1,
313
+ "tool_calls": 0,
314
+ "tools_per_turn": 0,
315
+ "total_tool_ms": 0,
316
+ "llm_stream_ms": 7179,
317
+ "cache_ratio": 0,
318
+ "cached_tokens": 0,
319
+ "prompt_tokens": 4748,
320
+ "uncached_tokens": 4748,
321
+ "output_tokens": 466,
322
+ "cache_weighted_input_10": 4748,
323
+ "cache_weighted_input_25": 4748,
324
+ "prompt_growth": 0,
325
+ "antipatterns": 0,
326
+ "issues": 3,
327
+ "issue_types": [
328
+ "cache",
329
+ "cache_break",
330
+ "service_tier"
331
+ ],
332
+ "read_fragmentation_paths": [],
333
+ "grep_sweep_count": 0
334
+ },
335
+ {
336
+ "session": "sess_12172_1783059815886_1783059816130_c1422313e74ff647937bfb7ccc713170",
337
+ "provider": "openai-oauth",
338
+ "model": "gpt-5.5",
339
+ "wall_ms": 73427,
340
+ "turns": 9,
341
+ "tool_calls": 11,
342
+ "tools_per_turn": 1.2,
343
+ "total_tool_ms": 1049,
344
+ "llm_stream_ms": 72134,
345
+ "cache_ratio": 0.8001111265453535,
346
+ "cached_tokens": 207360,
347
+ "prompt_tokens": 259164,
348
+ "uncached_tokens": 51804,
349
+ "output_tokens": 4631,
350
+ "cache_weighted_input_10": 72540,
351
+ "cache_weighted_input_25": 103644,
352
+ "prompt_growth": 45252,
353
+ "antipatterns": 1,
354
+ "issues": 14,
355
+ "issue_types": [
356
+ "cache",
357
+ "cache_break",
358
+ "readonly_stall",
359
+ "service_tier",
360
+ "missed_parallelism",
361
+ "tool_churn_cluster"
362
+ ],
363
+ "read_fragmentation_paths": [],
364
+ "grep_sweep_count": 0
365
+ },
366
+ {
367
+ "session": "sess_44152_1783059834394_1783059834618_56b4c9c66902e5730af3a1b5d05d85c4",
368
+ "provider": "openai-oauth",
369
+ "model": "gpt-5.5",
370
+ "wall_ms": 108812,
371
+ "turns": 6,
372
+ "tool_calls": 5,
373
+ "tools_per_turn": 0.8,
374
+ "total_tool_ms": 304,
375
+ "llm_stream_ms": 107642,
376
+ "cache_ratio": 0.7334463495955811,
377
+ "cached_tokens": 117248,
378
+ "prompt_tokens": 159859,
379
+ "uncached_tokens": 42611,
380
+ "output_tokens": 10625,
381
+ "cache_weighted_input_10": 54335.8,
382
+ "cache_weighted_input_25": 71923,
383
+ "prompt_growth": 36198,
384
+ "antipatterns": 1,
385
+ "issues": 11,
386
+ "issue_types": [
387
+ "cache",
388
+ "cache_break",
389
+ "broad_tool_result",
390
+ "service_tier",
391
+ "missed_parallelism",
392
+ "tool_churn_cluster"
393
+ ],
394
+ "read_fragmentation_paths": [],
395
+ "grep_sweep_count": 0
396
+ },
397
+ {
398
+ "session": "sess_25912_1783059899801_1783059900029_f989eab921374da513570e09d7d39c55",
399
+ "provider": "openai-oauth",
400
+ "model": "gpt-5.5",
401
+ "wall_ms": 47887,
402
+ "turns": 6,
403
+ "tool_calls": 10,
404
+ "tools_per_turn": 1.7,
405
+ "total_tool_ms": 2312,
406
+ "llm_stream_ms": 45195,
407
+ "cache_ratio": 0.6885261237663127,
408
+ "cached_tokens": 58880,
409
+ "prompt_tokens": 85516,
410
+ "uncached_tokens": 26636,
411
+ "output_tokens": 3571,
412
+ "cache_weighted_input_10": 32524,
413
+ "cache_weighted_input_25": 41356,
414
+ "prompt_growth": 16109,
415
+ "antipatterns": 0,
416
+ "issues": 8,
417
+ "issue_types": [
418
+ "cache",
419
+ "cache_break",
420
+ "service_tier"
421
+ ],
422
+ "read_fragmentation_paths": [],
423
+ "grep_sweep_count": 0
424
+ },
425
+ {
426
+ "session": "sess_60436_1783059931841_1783059932082_99b61f2d2925940ee5554fa92042346c",
427
+ "provider": "openai-oauth",
428
+ "model": "gpt-5.5",
429
+ "wall_ms": 49755,
430
+ "turns": 6,
431
+ "tool_calls": 7,
432
+ "tools_per_turn": 1.2,
433
+ "total_tool_ms": 656,
434
+ "llm_stream_ms": 48561,
435
+ "cache_ratio": 0.5869960043588812,
436
+ "cached_tokens": 51712,
437
+ "prompt_tokens": 88096,
438
+ "uncached_tokens": 36384,
439
+ "output_tokens": 3580,
440
+ "cache_weighted_input_10": 41555.2,
441
+ "cache_weighted_input_25": 49312,
442
+ "prompt_growth": 30432,
443
+ "antipatterns": 1,
444
+ "issues": 10,
445
+ "issue_types": [
446
+ "cache",
447
+ "cache_break",
448
+ "broad_tool_result",
449
+ "service_tier",
450
+ "tool_churn_cluster"
451
+ ],
452
+ "read_fragmentation_paths": [],
453
+ "grep_sweep_count": 0
454
+ }
455
+ ]
456
+ }