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,464 @@
1
+ {
2
+ "round": "13",
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_61152_1783057816877_1783057817120_023e2391ca2b6389040710a0f40c324d",
18
+ "sess_52268_1783057816891_1783057817127_5bc1c64bbe5c4a5698673bc61a98bc3b",
19
+ "sess_55452_1783057816916_1783057817161_5c20dccba874865f7b2d10ce85b7ef95",
20
+ "sess_49304_1783057907855_1783057908084_7050982a0db72b0dcbdfe2f43a649c34",
21
+ "sess_59336_1783057927217_1783057927463_8079787653b69fd7bc75a898880ebfca",
22
+ "sess_24180_1783058017094_1783058017348_05fca0c0bad5d3e560120be956dac063"
23
+ ],
24
+ "results": [
25
+ {
26
+ "id": "r4-debug-forwarding-gap#1",
27
+ "agent": "reviewer",
28
+ "ok": true,
29
+ "ms": 110340,
30
+ "sessionId": "sess_61152_1783057816877_1783057817120_023e2391ca2b6389040710a0f40c324d",
31
+ "output": "sessionId: sess_61152_1783057816877_1783057817120_023e2391ca2b6389040710a0f40c324d\n조사 범위를 활성화 진입점과 첫 전송 경로까지 한 번에 좁혀 확인하겠습니다.조사 완료: `bridge-state.json` 기록 뒤 첫 Discord forward까지의 경로에는 “기존 파일을 EOF로 바인딩”하는 경우가 가장 위험하고, missing transcript/watch/ownership 창은 대체로 backlog catch-up이 있습니다.\n\n**경로 요약** \n`start()`가 `channelBridgeActive=true`와 `bridge-state.json`을 기록한 뒤 `refreshBridgeOwnership()` → `startOwnedRuntime()` → `bindPersistedTranscriptIfAny()` → `rebindTranscriptContext()` → `applyTranscriptBinding()` → `OutputForwarder.startWatch()` → `forwardNewText()` → `backend.sendMessage()`로 이어집니다. 주요 앵커는 `src/runtime/channels/index.mjs:1734`, `src/runtime/channels/index.mjs:710`, `src/runtime/channels/index.mjs:577`, `src/runtime/channels/index.mjs:394`, `src/runtime/channels/index.mjs:317`, `src/runtime/channels/lib/output-forwarder.mjs:647`, `src/runtime/channels/lib/output-forwarder.mjs:351`, `src/runtime/channels/index.mjs:284`입니다.\n\n**1. 기존 transcript를 EOF로 바인딩하면 이미 쓰인 assistant 출력은 복구되지 않습니다.** \n`OutputForwarder.setContext()`는 `replayFromStart`도, 같은 transcript의 `catchUpFromPersisted`도 아니면 `readFileSize/lastFileSize`를 현재 파일 크기로 둡니다 (`src/runtime/channels/lib/output-forwarder.mjs:115`, `src/runtime/channels/lib/output-forwarder.mjs:117`, `src/runtime/channels/lib/output-forwarder.mjs:125`). 활성화 중 assistant 출력이 먼저 파일에 들어간 뒤 이 경로로 바인딩되면 그 bytes는 “이미 읽은 것”이 되어 backlog catch-up으로 복구되지 않습니다.\n\n**2. persisted cursor가 다른 transcript에 속하면 catch-up이 아니라 EOF skip이 됩니다.** \n부팅/활성화 복원은 `catchUpFromPersisted: true`로 들어가지만 (`src/runtime/channels/index.mjs:625`), `sameResolvedPath()`가 아니면 `setContext()`가 현재 크기를 선택합니다 (`src/runtime/channels/lib/output-forwarder.mjs:120`, `src/runtime/channels/lib/output-forwarder.mjs:123`). 즉 새 transcript가 이미 존재하는 상태로 발견되면 activation-window 출력은 조용히 스킵되고, 이후 catch-up은 그 앞부분을 되살리지 못합니다.\n\n**3. channel binding이 없으면 자동 복원 경로가 끊기고, 나중에 바인딩돼도 기존 backlog는 보장되지 않습니다.** \n`bindPersistedTranscriptIfAny()`는 status/main channel을 못 찾으면 그냥 반환합니다 (`src/runtime/channels/index.mjs:610`, `src/runtime/channels/index.mjs:624`), `forwardNewText()`도 `channelId` 없으면 반환합니다 (`src/runtime/channels/lib/output-forwarder.mjs:352`). 첫 inbound에서 바인딩될 수는 있지만 기존 파일 fast-path는 EOF 바인딩이어서 backlog catch-up이 아니라 skip이 될 수 있습니다 (`src/runtime/channels/index.mjs:1597`, `src/runtime/channels/index.mjs:1602`).\n\n**4. not-yet-created transcript의 `fs.watch` 실패는 보통 지연이며 60초 안에는 복구됩니다.** \n`startWatch()`는 없는 파일에서 catch 후 watcher를 닫습니다 (`src/runtime/channels/lib/output-forwarder.mjs:656`, `src/runtime/channels/lib/output-forwarder.mjs:667`), 이를 `schedulePendingTranscriptRearm()`가 250ms polling으로 보완하고 파일 생성 시 `startWatch()`와 `forwardNewText()`를 호출합니다 (`src/runtime/channels/index.mjs:357`, `src/runtime/channels/index.mjs:376`, `src/runtime/channels/index.mjs:378`). 다만 60초 timeout 뒤 생성되면 자동 catch-up은 중단됩니다 (`src/runtime/channels/index.mjs:384`).\n\n**5. ownership/backend 연결 전 watcher flush는 drop이 아니라 지연입니다.** \nforwarder ownership probe는 `bridgeRuntimeConnected && currentOwnerState().owned`라서 연결 전 `forwardNewText()`가 바로 false로 끝납니다 (`src/runtime/channels/index.mjs:316`, `src/runtime/channels/lib/output-forwarder.mjs:36`, `src/runtime/channels/lib/output-forwarder.mjs:351`). 이때 읽기/커밋을 하지 않으므로 bytes는 남고, 연결 후 `forwardNewText()` 또는 re-arm 재스케줄이 catch-up합니다 (`src/runtime/channels/index.mjs:801`, `src/runtime/channels/index.mjs:803`, `src/runtime/channels/index.mjs:809`).\n\n판정: activation-window의 recoverable delay는 처리되어 있지만, “이미 존재하는 transcript를 EOF로 바인딩”하는 경로는 assistant 출력이 조용히 유실될 수 있습니다.",
32
+ "card": {
33
+ "session": "sess_61152_1783057816877_1783057817120_023e2391ca2b6389040710a0f40c324d",
34
+ "provider": "openai-oauth",
35
+ "model": "gpt-5.5",
36
+ "wall_ms": 99848,
37
+ "turns": 5,
38
+ "tool_calls": 6,
39
+ "tools_per_turn": 1.2,
40
+ "total_tool_ms": 562,
41
+ "llm_stream_ms": 98843,
42
+ "cache_ratio": 0.38371452563905767,
43
+ "cached_tokens": 42496,
44
+ "prompt_tokens": 110749,
45
+ "uncached_tokens": 68253,
46
+ "output_tokens": 9489,
47
+ "cache_weighted_input_10": 72502.6,
48
+ "cache_weighted_input_25": 78877,
49
+ "prompt_growth": 42096,
50
+ "antipatterns": 1,
51
+ "issues": 4,
52
+ "issue_types": [
53
+ "cache",
54
+ "broad_tool_result",
55
+ "service_tier",
56
+ "tool_churn_cluster"
57
+ ],
58
+ "read_fragmentation_paths": [],
59
+ "grep_sweep_count": 0
60
+ }
61
+ },
62
+ {
63
+ "id": "r4-impl-usage-summary#1",
64
+ "agent": "worker",
65
+ "ok": true,
66
+ "ms": 264690,
67
+ "sessionId": "sess_52268_1783057816891_1783057817127_5bc1c64bbe5c4a5698673bc61a98bc3b",
68
+ "output": "sessionId: sess_52268_1783057816891_1783057817127_5bc1c64bbe5c4a5698673bc61a98bc3b\n요청 범위가 명확해 바로 구현하고 검증까지 진행하겠습니다.`usage:today`가 이미 일부 존재해 요구사항과 맞는지 확인한 뒤 필요한 보완만 하겠습니다.필요한 구현은 `package.json`과 새 스크립트에만 한정되어 있어 바로 검증합니다.검증은 통과했고, 최종 변경 범위만 확인합니다.재영님, `usage:today` 기능 구현과 검증을 완료했습니다.\n\n- **변경 요약**: `package.json`에 `usage:today` 스크립트를 추가하고, `scripts/usage-today.mjs`를 새로 추가했습니다.\n\n- **동작**: `MIXDOG_DATA_DIR` 또는 `~/.mixdog/data/history/agent-trace.jsonl`을 읽어 오늘 자정 이후 usage를 모델별/총합으로 집계합니다.\n\n- **검증**: `node --check scripts/usage-today.mjs`와 `npm run usage:today` 모두 성공했고, 실행 결과 `GRAND TOTAL`까지 출력됐습니다.\n\n- **참고**: 기존 작업 중인 변경으로 보이는 `src/runtime/channels/lib/*` 파일들은 건드리지 않았습니다.",
69
+ "card": {
70
+ "session": "sess_52268_1783057816891_1783057817127_5bc1c64bbe5c4a5698673bc61a98bc3b",
71
+ "provider": "openai-oauth",
72
+ "model": "gpt-5.5",
73
+ "wall_ms": 254191,
74
+ "turns": 9,
75
+ "tool_calls": 10,
76
+ "tools_per_turn": 1.1,
77
+ "total_tool_ms": 2612,
78
+ "llm_stream_ms": 62036,
79
+ "cache_ratio": 0.7420684003247764,
80
+ "cached_tokens": 97792,
81
+ "prompt_tokens": 131783,
82
+ "uncached_tokens": 33991,
83
+ "output_tokens": 4789,
84
+ "cache_weighted_input_10": 43770.2,
85
+ "cache_weighted_input_25": 58439,
86
+ "prompt_growth": 17331,
87
+ "antipatterns": 1,
88
+ "issues": 4,
89
+ "issue_types": [
90
+ "cache",
91
+ "service_tier",
92
+ "missed_parallelism",
93
+ "tool_churn_cluster"
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": 90941,
104
+ "sessionId": "sess_55452_1783057816916_1783057817161_5c20dccba874865f7b2d10ce85b7ef95",
105
+ "output": "sessionId: sess_55452_1783057816916_1783057817161_5c20dccba874865f7b2d10ce85b7ef95\n완료했습니다, 재영님. compaction subsystem 아키텍처 맵은 아래와 같습니다.\n\n- **엔진 진입점**: `semanticCompactMessages`와 `recallFastTrackCompactMessages`가 `engine.mjs`의 공개 엔트리이며 `compact.mjs`가 재수출합니다 (`engine.mjs:278`, `engine.mjs:445`, `compact.mjs:52-55`).\n- **주 호출자**: pre-send loop는 정책 산출 뒤 recall-fasttrack 또는 semantic 엔진을 호출하고, manager/manual 경로는 `runSessionCompaction`을 호출합니다 (`loop.mjs:329-364`, `loop.mjs:414-459`, `manager.mjs:1849`, `manager.mjs:1950`).\n- **manual/auto-clear runner**: `runSessionCompaction`은 같은 엔진을 import해 type별로 recall-fasttrack, semantic, prune fallback을 수행합니다 (`compaction-runner.mjs:8-16`, `compaction-runner.mjs:143-147`, `compaction-runner.mjs:207-306`).\n- **recall pipeline 래퍼**: loop의 `runRecallFastTrackCompact`가 memory ingest/dump/cycle1 후 `recallFastTrackCompactMessages`에 recall text와 tail 정책을 넘깁니다 (`recall-fasttrack.mjs:61-84`, `recall-fasttrack.mjs:103-148`, `recall-fasttrack.mjs:161-172`).\n\n- **자동 발화 조건**: loop는 queued steering을 먼저 반영한 뒤 정책을 만들고 현재 messages token estimate로 compaction 여부를 판단합니다 (`loop.mjs:324-353`).\n- **정책 산출**: auto가 꺼지면 중단하고, boundary는 context/boundary/autoLimit에서 산출하며, explicit autoLimit은 boundary보다 작을 때만 trigger가 됩니다 (`compact-policy.mjs:90-117`).\n- **압력 계산**: compaction은 reactive overflow면 무조건, token estimate가 없으면 보수적으로, 아니면 `messages + reserve >= trigger`일 때 발화합니다 (`compact-policy.mjs:151-174`).\n- **대상 예산**: compact target은 boundary 안에서 targetEffective + request/configured reserve로 잡습니다 (`compact-policy.mjs:118-148`, `compact-policy.mjs:163-168`, `loop.mjs:362-364`).\n- **manual runner 조건**: runner는 auto disabled, 짧은 history, context window 없음, below-threshold를 조기 반환하고 manual/force는 threshold를 우회합니다 (`compaction-runner.mjs:143-199`).\n\n- **공통 분리 단계**: 엔진은 tool pair sanitize/dedup/reconcile 후 protected prefix, previous summary, live(non-summary)를 분리합니다 (`engine.mjs:100-111`, `messages.mjs:56-81`).\n- **semantic tail 선택**: live에 user turn이 있으면 기본 2개 최신 turn을 budget 안에서 보존하고, 최신 turn이 너무 크면 suffix를 잘라 보존합니다 (`engine.mjs:46`, `engine.mjs:134-185`, `engine.mjs:235-245`).\n- **no-user semantic tail**: user turn이 없으면 tool result로 시작하지 않는 cut point만 허용해 assistant/tool-only transcript도 provider-valid tail로 유지합니다 (`engine.mjs:121-127`, `engine.mjs:193-232`).\n- **tail 후처리**: 선택된 tail은 다시 sanitize/dedup/reconcile되며, empty live만 unrecoverable입니다 (`engine.mjs:244-255`).\n- **recall tail 정책**: recall-fasttrack은 최신 최대 2 user-anchored turns, 기본 8k cap을 보존하고 초과 시 오래된 turn drop 후 truncation합니다 (`engine.mjs:449-468`, `engine.mjs:593-611`).\n- **recall no-user tail**: recall tail도 no-user 구조를 허용하고, tool orphan 방지를 위해 backward 확장 및 sanitize guard를 둡니다 (`engine.mjs:525-575`, `engine.mjs:613-619`).\n\n- **redaction 시점**: fits-budget no-op은 기존 semantics 유지를 위해 redaction 없이 sanitized transcript를 반환합니다 (`engine.mjs:284-304`, `engine.mjs:625-643`).\n- **verbatim tail redaction**: compaction이 실제 진행될 때만 window selection 전에 tool-call secret argument values를 redact해 system/tail이 redacted 상태로 측정·출력됩니다 (`engine.mjs:306-314`, `engine.mjs:389-392`, `engine.mjs:644-646`).\n- **redaction 구현**: redactor는 assistant toolCalls argument values만 shape/order/pairing 보존 방식으로 바꾸며 raw key/value secrets도 제거합니다 (`text-utils.mjs:217-326`).\n- **prompt-side redaction**: summarized head는 prompt transcript 생성 시 tool-call summary와 argument normalization 경로에서 별도로 truncation/redaction됩니다 (`summary.mjs:85-115`, `text-utils.mjs:121-160`).\n\n- **semantic 실패 지점**: provider 없음, compactable head 없음, prompt fit 실패, empty summary, summary fit 실패, final budget 초과가 throw됩니다 (`engine.mjs:279-281`, `engine.mjs:315-337`, `engine.mjs:371-386`, `engine.mjs:395-397`).\n- **recall 실패 지점**: compactable prior/recall text 없음, recall summary fit 실패, final budget 초과가 throw됩니다 (`engine.mjs:653-668`, `engine.mjs:691-700`).\n- **budget fallback**: mandatory system+tail이 target보다 크면 거절하지 않고 summary room만큼 budget을 raise합니다 (`engine.mjs:319-330`, `engine.mjs:658-663`).\n- **schema fallback**: semantic provider response가 malformed여도 summary schema를 deterministic repair 후 사용합니다 (`engine.mjs:373-377`).\n- **loop fallback**: semantic 실패는 non-LLM `pruneToolOutputsUnanchored`로 한 번 salvage하고, recall-fasttrack 실패는 prune으로 숨기지 않고 overflow failure로 escalate합니다 (`loop.mjs:486-536`, `loop.mjs:546-626`).\n- **runner fallback**: manager/manual 경로는 recall-fasttrack 실패 시 semantic fallback을 한 번 시도하고, non-recall 실패에는 prune fallback을 시도한 뒤 실패 metadata를 기록합니다 (`compaction-runner.mjs:231-278`, `compaction-runner.mjs:322-397`).\n- **성공 적용**: 성공 시 transcript를 compacted messages로 교체하고 providerState를 무효화하며 compaction telemetry를 갱신합니다 (`loop.mjs:629-664`, `compaction-runner.mjs:399-470`).",
106
+ "card": {
107
+ "session": "sess_55452_1783057816916_1783057817161_5c20dccba874865f7b2d10ce85b7ef95",
108
+ "provider": "openai-oauth",
109
+ "model": "gpt-5.5",
110
+ "wall_ms": 80435,
111
+ "turns": 11,
112
+ "tool_calls": 21,
113
+ "tools_per_turn": 1.9,
114
+ "total_tool_ms": 849,
115
+ "llm_stream_ms": 79479,
116
+ "cache_ratio": 0.7835232577551613,
117
+ "cached_tokens": 253440,
118
+ "prompt_tokens": 323462,
119
+ "uncached_tokens": 70022,
120
+ "output_tokens": 5788,
121
+ "cache_weighted_input_10": 95366,
122
+ "cache_weighted_input_25": 133382,
123
+ "prompt_growth": 51254,
124
+ "antipatterns": 1,
125
+ "issues": 6,
126
+ "issue_types": [
127
+ "cache_miss",
128
+ "readonly_stall",
129
+ "cache",
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": 123581,
143
+ "sessionId": "sess_49304_1783057907855_1783057908084_7050982a0db72b0dcbdfe2f43a649c34",
144
+ "output": "sessionId: sess_49304_1783057907855_1783057908084_7050982a0db72b0dcbdfe2f43a649c34\n완료: `bridge-state.json` 기록부터 첫 전송까지 추적했고, 핵심 리스크는 “전송 준비 전 기존 파일 크기를 EOF로 잡는 바인딩”입니다.\n\n**경로 요약**: activation은 `src/runtime/channels/lib/tool-dispatch.mjs:45-64` 또는 `src/runtime/channels/index.mjs:1734-1747`에서 state 기록 → ownership/start runtime `src/runtime/channels/index.mjs:881-927`, `710-813` → transcript bind `577-629`, `394-516`, `317-337` → watch/flush/send `src/runtime/channels/lib/output-forwarder.mjs:647-731`, `351-410`, `283-340`.\n\n**1. 이미 쓰인 transcript를 첫 바인딩할 때 EOF로 커서가 잡힘**: `setContext()`는 `replayFromStart`도 아니고 동일 persisted cursor도 아니면 `currentSize`를 시작점으로 삼아, bridge 활성화 후 바인딩 전 생성된 assistant bytes를 “과거분”으로 보고 건너뜁니다. 복구: 기본 backlog catch-up으로는 복구 안 됨; 같은 transcript의 `lastFileSize`가 persisted되어 있거나 pending 경로가 `replayFromStart`로 잡힌 경우만 복구됩니다. `src/runtime/channels/lib/output-forwarder.mjs:111-127`, `src/runtime/channels/index.mjs:625-629`, `433-449`.\n\n**2. transcript가 아직 없어서 `fs.watch` 설치가 실패하는 구간**: pending path에 bind하면 `startWatch()`가 `ENOENT`류로 닫히고, `schedulePendingTranscriptRearm()`가 250ms polling/60s timeout으로 생성을 기다린 뒤 `startWatch()`와 `forwardNewText()`를 호출합니다. 복구: 60초 내 생성되면 backlog 복구, timeout 이후에는 다음 rebind/다른 flush 계기가 없으면 지연 상태로 남습니다. `src/runtime/channels/index.mjs:339-346`, `357-392`, `493-510`; `src/runtime/channels/lib/output-forwarder.mjs:647-670`.\n\n**3. ownership probe가 connect 전에는 fail-closed라 flush가 무시됨**: ownerGetter는 `bridgeRuntimeConnected && currentOwnerState().owned`라서 backend connect 전 `forwardNewText()`/`forwardFinalText()`는 false/return으로 끝나지만 커서는 전진하지 않습니다. 복구: post-connect에서 pending rearm 재설치 또는 `forwardNewText()`를 호출하므로 정상적으로는 지연만 발생합니다. `src/runtime/channels/index.mjs:316`, `758-763`, `776`, `801-812`; `src/runtime/channels/lib/output-forwarder.mjs:351-353`, `490-497`.\n\n**4. watch 설치 직전/이벤트 누락 구간**: `startWatch()`는 설치 직후 `scheduleWatchFlush()`를 강제 호출하므로 stat 이후 watch 설치 전 쓰인 bytes나 누락된 첫 이벤트는 100ms debounce 뒤 읽힙니다. 복구: backlog catch-up 됨; 최악은 첫 전송 지연입니다. `src/runtime/channels/lib/output-forwarder.mjs:665-666`, `703-731`.\n\n**5. target channel이 없으면 bind 자체가 중단됨**: activation restore는 status에서 channel을 찾고 없으면 main channel로 자동 bind하지만, 둘 다 없으면 반환되어 output forwarding 경로가 없습니다. 복구: 이후 inbound로 channel이 생겨 rebind되면 가능하지만, 그때 EOF 바인딩이면 기존 bytes는 다시 1번 리스크를 탑니다. `src/runtime/channels/index.mjs:577-624`.\n\n판정: bridge activation은 대부분 지연 후 catch-up되지만, “바인딩 전 이미 존재한 bytes를 EOF 기준으로 시작하는 경우”는 실제 silent drop 가능성이 남아 있습니다.",
145
+ "card": {
146
+ "session": "sess_49304_1783057907855_1783057908084_7050982a0db72b0dcbdfe2f43a649c34",
147
+ "provider": "openai-oauth",
148
+ "model": "gpt-5.5",
149
+ "wall_ms": 113090,
150
+ "turns": 9,
151
+ "tool_calls": 13,
152
+ "tools_per_turn": 1.4,
153
+ "total_tool_ms": 932,
154
+ "llm_stream_ms": 112197,
155
+ "cache_ratio": 0.6753989684387698,
156
+ "cached_tokens": 261632,
157
+ "prompt_tokens": 387374,
158
+ "uncached_tokens": 125742,
159
+ "output_tokens": 9822,
160
+ "cache_weighted_input_10": 151905.2,
161
+ "cache_weighted_input_25": 191150,
162
+ "prompt_growth": 56276,
163
+ "antipatterns": 1,
164
+ "issues": 8,
165
+ "issue_types": [
166
+ "cache_miss",
167
+ "readonly_stall",
168
+ "cache",
169
+ "broad_tool_result",
170
+ "service_tier",
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": 89816,
182
+ "sessionId": "sess_59336_1783057927217_1783057927463_8079787653b69fd7bc75a898880ebfca",
183
+ "output": "sessionId: sess_59336_1783057927217_1783057927463_8079787653b69fd7bc75a898880ebfca\n요청 범위에 맞춰 기존 스크립트 스타일과 package.json만 확인한 뒤 바로 구현하겠습니다.현재 브랜치에는 `scripts/usage-today.mjs`와 `usage:today`가 이미 있어, 요구사항 충족 여부를 맞춰 확인하고 필요한 보정만 하겠습니다.요구사항 대부분이 이미 반영된 상태라, 실제 변경 여부를 `git` 기준으로 확인하고 부족한 부분만 패치하겠습니다.기능 코드는 요구사항과 맞지만, trace 포맷 호환성만 한 번 더 맞춘 뒤 검증하겠습니다.필요한 항목이 이미 target diff에 잡혀 있어, 문법 검사와 실제 실행으로 확인하겠습니다.검증은 통과했고, 최종 보고용으로 target diff만 확인하겠습니다.재영님, `usage:today` 기능 구현 및 검증 완료했습니다.\n\n- **Diff 요약**: `package.json`에 `usage:today` npm script 추가, `scripts/usage-today.mjs` 신규 추가.\n\n- **동작**: `MIXDOG_DATA_DIR` 또는 `~/.mixdog/data/history/agent-trace.jsonl`을 읽고, 로컬 자정 이후 usage row를 모델별로 집계해 `calls/input/cached/output/costUsd`와 `GRAND TOTAL`을 출력합니다.\n\n- **검증**: `node --check scripts/usage-today.mjs` 통과, `npm run usage:today` 실행 성공.\n\n- **참고**: 현재 워킹트리에 별도 변경 `src/runtime/channels/lib/event-queue.mjs`, `src/runtime/channels/lib/output-forwarder.mjs`가 남아 있습니다.",
184
+ "card": {
185
+ "session": "sess_59336_1783057927217_1783057927463_8079787653b69fd7bc75a898880ebfca",
186
+ "provider": "openai-oauth",
187
+ "model": "gpt-5.5",
188
+ "wall_ms": 79319,
189
+ "turns": 10,
190
+ "tool_calls": 13,
191
+ "tools_per_turn": 1.3,
192
+ "total_tool_ms": 2980,
193
+ "llm_stream_ms": 76320,
194
+ "cache_ratio": 0.5524303168138784,
195
+ "cached_tokens": 104448,
196
+ "prompt_tokens": 189070,
197
+ "uncached_tokens": 84622,
198
+ "output_tokens": 4364,
199
+ "cache_weighted_input_10": 95066.8,
200
+ "cache_weighted_input_25": 110734,
201
+ "prompt_growth": 24627,
202
+ "antipatterns": 1,
203
+ "issues": 6,
204
+ "issue_types": [
205
+ "cache_miss",
206
+ "cache",
207
+ "service_tier",
208
+ "missed_parallelism",
209
+ "tool_churn_cluster"
210
+ ],
211
+ "read_fragmentation_paths": [],
212
+ "grep_sweep_count": 0
213
+ }
214
+ },
215
+ {
216
+ "id": "r4-explain-compact-engine#2",
217
+ "agent": "explore",
218
+ "ok": true,
219
+ "ms": 85751,
220
+ "sessionId": "sess_24180_1783058017094_1783058017348_05fca0c0bad5d3e560120be956dac063",
221
+ "output": "sessionId: sess_24180_1783058017094_1783058017348_05fca0c0bad5d3e560120be956dac063\n- **Entry points/callers:** `engine.mjs` exposes `semanticCompactMessages` and `recallFastTrackCompactMessages`; `compact.mjs` re-exports them for existing callers (`loop.mjs`, `manager.mjs`, session-builder, memory, scripts). `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:1`, `src/runtime/agent/orchestrator/session/compact.mjs:52`\n\n- **Loop trigger:** Before each provider send, the loop drains queued steering, resolves policy, estimates tokens, and compacts when `forceReactive` is set, token estimate is unknown, or transcript pressure reaches `triggerTokens`. `src/runtime/agent/orchestrator/session/loop.mjs:324`, `src/runtime/agent/orchestrator/session/loop.mjs:329`, `src/runtime/agent/orchestrator/session/loop.mjs:351`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:170`\n\n- **Policy math:** Auto compact is enabled unless disabled, boundary comes from context/window metadata, trigger is explicit sub-boundary limit or `boundary - buffer`, reserve includes tool/schema reserve, and type resolves to semantic or recall-fasttrack. `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:89`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:101`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:107`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:117`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:121`\n\n- **Manual/session runner:** `runSessionCompaction` handles manual/auto session compaction; auto exits when disabled, too small, missing boundary, or below threshold, while manual forces compaction. `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:143`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:145`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:147`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:149`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:176`\n\n- **Semantic path:** Semantic compaction sanitizes first, no-ops if already within budget and not forced, then redacts tool-call secrets before selecting the window and building the summary prompt. `src/runtime/agent/orchestrator/session/compact/engine.mjs:283`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:289`, `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:314`\n\n- **Preserved tail:** Windowing splits protected/system context, previous summary, and live non-summary messages; user-turn sessions keep up to `tailTurns` recent turns within `preserveRecentBudget`, while no-user sessions choose the newest valid non-tool cut that fits. `src/runtime/agent/orchestrator/session/compact/engine.mjs:100`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:110`, `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:193`\n\n- **Tool-pair safety:** Tail boundaries never start on a `tool` message, and the chosen tail is re-sanitized/deduped/reconciled so assistant tool calls and tool results remain provider-valid. `src/runtime/agent/orchestrator/session/compact/engine.mjs:121`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:124`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:246`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:250`\n\n- **Redaction hook:** Secret keys/raw `key:value` strings are normalized in `text-utils`, and semantic/recall paths both call `redactToolCallSecretsInMessages` after base sanitization so emitted preserved system/tail content is redacted. `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:12`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:46`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:312`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:644`\n\n- **Recall-fasttrack path:** Recall pipeline ingests session history, dumps memory roots, drains raw cycle1 rows when needed, caps recall injection to 5% of context with a floor, then calls `recallFastTrackCompactMessages`. `src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:61`, `src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:84`, `src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:109`, `src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:151`, `src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:161`\n\n- **Recall tail:** Recall keeps the newest user-anchored turns, drops oldest turns if over cap, truncates the oldest surviving content if needed, and allows no-user assistant/tool tails. `src/runtime/agent/orchestrator/session/compact/engine.mjs:593`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:601`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:602`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:610`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:613`\n\n- **Budget/fallback:** If mandatory system+tail plus summary room exceeds target, semantic/recall raise the working budget instead of refusing; if semantic fails, loop/runner try unanchored tool-output prune, but recall-fasttrack failures are not silently pruned. `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:658`, `src/runtime/agent/orchestrator/session/loop.mjs:501`, `src/runtime/agent/orchestrator/session/loop.mjs:511`\n\n- **Failure paths:** Recall-fasttrack runner can fall back once to semantic in `runSessionCompaction`; loop failures record `overflow_failed`, emit failure telemetry, and throw `AgentContextOverflowError`; provider send overflow gets one reactive compact retry. `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/loop.mjs:552`, `src/runtime/agent/orchestrator/session/loop.mjs:618`, `src/runtime/agent/orchestrator/session/loop.mjs:982`",
222
+ "card": {
223
+ "session": "sess_24180_1783058017094_1783058017348_05fca0c0bad5d3e560120be956dac063",
224
+ "provider": "openai-oauth",
225
+ "model": "gpt-5.5",
226
+ "wall_ms": 75181,
227
+ "turns": 9,
228
+ "tool_calls": 8,
229
+ "tools_per_turn": 0.9,
230
+ "total_tool_ms": 1343,
231
+ "llm_stream_ms": 66031,
232
+ "cache_ratio": 0.5456843130985551,
233
+ "cached_tokens": 107520,
234
+ "prompt_tokens": 197037,
235
+ "uncached_tokens": 89517,
236
+ "output_tokens": 4375,
237
+ "cache_weighted_input_10": 100269,
238
+ "cache_weighted_input_25": 116397,
239
+ "prompt_growth": 47535,
240
+ "antipatterns": 1,
241
+ "issues": 8,
242
+ "issue_types": [
243
+ "cache_miss",
244
+ "readonly_stall",
245
+ "cache",
246
+ "broad_tool_result",
247
+ "service_tier",
248
+ "missed_parallelism",
249
+ "tool_churn_cluster"
250
+ ],
251
+ "read_fragmentation_paths": [],
252
+ "grep_sweep_count": 0
253
+ }
254
+ }
255
+ ],
256
+ "task_complete": true,
257
+ "task_errors": [],
258
+ "score_complete": true,
259
+ "score_errors": [],
260
+ "group": {
261
+ "n": 6,
262
+ "wall_ms": 117010.7,
263
+ "turns": 8.8,
264
+ "tool_calls": 11.8,
265
+ "tools_per_turn": 1.3,
266
+ "total_tool_ms": 1546.3,
267
+ "llm_stream_ms": 82484.3,
268
+ "cache_ratio": 0.6,
269
+ "cached_tokens": 144554.7,
270
+ "prompt_tokens": 223245.8,
271
+ "uncached_tokens": 78691.2,
272
+ "output_tokens": 6437.8,
273
+ "cache_weighted_input_10": 93146.6,
274
+ "cache_weighted_input_25": 114829.8,
275
+ "prompt_growth": 39853.2,
276
+ "antipatterns": 1,
277
+ "issues": 6,
278
+ "grep_sweep_count": 0
279
+ },
280
+ "cards": [
281
+ {
282
+ "session": "sess_61152_1783057816877_1783057817120_023e2391ca2b6389040710a0f40c324d",
283
+ "provider": "openai-oauth",
284
+ "model": "gpt-5.5",
285
+ "wall_ms": 99848,
286
+ "turns": 5,
287
+ "tool_calls": 6,
288
+ "tools_per_turn": 1.2,
289
+ "total_tool_ms": 562,
290
+ "llm_stream_ms": 98843,
291
+ "cache_ratio": 0.38371452563905767,
292
+ "cached_tokens": 42496,
293
+ "prompt_tokens": 110749,
294
+ "uncached_tokens": 68253,
295
+ "output_tokens": 9489,
296
+ "cache_weighted_input_10": 72502.6,
297
+ "cache_weighted_input_25": 78877,
298
+ "prompt_growth": 42096,
299
+ "antipatterns": 1,
300
+ "issues": 4,
301
+ "issue_types": [
302
+ "cache",
303
+ "broad_tool_result",
304
+ "service_tier",
305
+ "tool_churn_cluster"
306
+ ],
307
+ "read_fragmentation_paths": [],
308
+ "grep_sweep_count": 0
309
+ },
310
+ {
311
+ "session": "sess_52268_1783057816891_1783057817127_5bc1c64bbe5c4a5698673bc61a98bc3b",
312
+ "provider": "openai-oauth",
313
+ "model": "gpt-5.5",
314
+ "wall_ms": 254191,
315
+ "turns": 9,
316
+ "tool_calls": 10,
317
+ "tools_per_turn": 1.1,
318
+ "total_tool_ms": 2612,
319
+ "llm_stream_ms": 62036,
320
+ "cache_ratio": 0.7420684003247764,
321
+ "cached_tokens": 97792,
322
+ "prompt_tokens": 131783,
323
+ "uncached_tokens": 33991,
324
+ "output_tokens": 4789,
325
+ "cache_weighted_input_10": 43770.2,
326
+ "cache_weighted_input_25": 58439,
327
+ "prompt_growth": 17331,
328
+ "antipatterns": 1,
329
+ "issues": 4,
330
+ "issue_types": [
331
+ "cache",
332
+ "service_tier",
333
+ "missed_parallelism",
334
+ "tool_churn_cluster"
335
+ ],
336
+ "read_fragmentation_paths": [],
337
+ "grep_sweep_count": 0
338
+ },
339
+ {
340
+ "session": "sess_55452_1783057816916_1783057817161_5c20dccba874865f7b2d10ce85b7ef95",
341
+ "provider": "openai-oauth",
342
+ "model": "gpt-5.5",
343
+ "wall_ms": 80435,
344
+ "turns": 11,
345
+ "tool_calls": 21,
346
+ "tools_per_turn": 1.9,
347
+ "total_tool_ms": 849,
348
+ "llm_stream_ms": 79479,
349
+ "cache_ratio": 0.7835232577551613,
350
+ "cached_tokens": 253440,
351
+ "prompt_tokens": 323462,
352
+ "uncached_tokens": 70022,
353
+ "output_tokens": 5788,
354
+ "cache_weighted_input_10": 95366,
355
+ "cache_weighted_input_25": 133382,
356
+ "prompt_growth": 51254,
357
+ "antipatterns": 1,
358
+ "issues": 6,
359
+ "issue_types": [
360
+ "cache_miss",
361
+ "readonly_stall",
362
+ "cache",
363
+ "service_tier",
364
+ "missed_parallelism",
365
+ "tool_churn_cluster"
366
+ ],
367
+ "read_fragmentation_paths": [],
368
+ "grep_sweep_count": 0
369
+ },
370
+ {
371
+ "session": "sess_49304_1783057907855_1783057908084_7050982a0db72b0dcbdfe2f43a649c34",
372
+ "provider": "openai-oauth",
373
+ "model": "gpt-5.5",
374
+ "wall_ms": 113090,
375
+ "turns": 9,
376
+ "tool_calls": 13,
377
+ "tools_per_turn": 1.4,
378
+ "total_tool_ms": 932,
379
+ "llm_stream_ms": 112197,
380
+ "cache_ratio": 0.6753989684387698,
381
+ "cached_tokens": 261632,
382
+ "prompt_tokens": 387374,
383
+ "uncached_tokens": 125742,
384
+ "output_tokens": 9822,
385
+ "cache_weighted_input_10": 151905.2,
386
+ "cache_weighted_input_25": 191150,
387
+ "prompt_growth": 56276,
388
+ "antipatterns": 1,
389
+ "issues": 8,
390
+ "issue_types": [
391
+ "cache_miss",
392
+ "readonly_stall",
393
+ "cache",
394
+ "broad_tool_result",
395
+ "service_tier",
396
+ "tool_churn_cluster"
397
+ ],
398
+ "read_fragmentation_paths": [],
399
+ "grep_sweep_count": 0
400
+ },
401
+ {
402
+ "session": "sess_59336_1783057927217_1783057927463_8079787653b69fd7bc75a898880ebfca",
403
+ "provider": "openai-oauth",
404
+ "model": "gpt-5.5",
405
+ "wall_ms": 79319,
406
+ "turns": 10,
407
+ "tool_calls": 13,
408
+ "tools_per_turn": 1.3,
409
+ "total_tool_ms": 2980,
410
+ "llm_stream_ms": 76320,
411
+ "cache_ratio": 0.5524303168138784,
412
+ "cached_tokens": 104448,
413
+ "prompt_tokens": 189070,
414
+ "uncached_tokens": 84622,
415
+ "output_tokens": 4364,
416
+ "cache_weighted_input_10": 95066.8,
417
+ "cache_weighted_input_25": 110734,
418
+ "prompt_growth": 24627,
419
+ "antipatterns": 1,
420
+ "issues": 6,
421
+ "issue_types": [
422
+ "cache_miss",
423
+ "cache",
424
+ "service_tier",
425
+ "missed_parallelism",
426
+ "tool_churn_cluster"
427
+ ],
428
+ "read_fragmentation_paths": [],
429
+ "grep_sweep_count": 0
430
+ },
431
+ {
432
+ "session": "sess_24180_1783058017094_1783058017348_05fca0c0bad5d3e560120be956dac063",
433
+ "provider": "openai-oauth",
434
+ "model": "gpt-5.5",
435
+ "wall_ms": 75181,
436
+ "turns": 9,
437
+ "tool_calls": 8,
438
+ "tools_per_turn": 0.9,
439
+ "total_tool_ms": 1343,
440
+ "llm_stream_ms": 66031,
441
+ "cache_ratio": 0.5456843130985551,
442
+ "cached_tokens": 107520,
443
+ "prompt_tokens": 197037,
444
+ "uncached_tokens": 89517,
445
+ "output_tokens": 4375,
446
+ "cache_weighted_input_10": 100269,
447
+ "cache_weighted_input_25": 116397,
448
+ "prompt_growth": 47535,
449
+ "antipatterns": 1,
450
+ "issues": 8,
451
+ "issue_types": [
452
+ "cache_miss",
453
+ "readonly_stall",
454
+ "cache",
455
+ "broad_tool_result",
456
+ "service_tier",
457
+ "missed_parallelism",
458
+ "tool_churn_cluster"
459
+ ],
460
+ "read_fragmentation_paths": [],
461
+ "grep_sweep_count": 0
462
+ }
463
+ ]
464
+ }