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,257 @@
1
+ {
2
+ "round": "11",
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": 3,
14
+ "completed": 3,
15
+ "completion_rate": 100,
16
+ "sessions": [
17
+ "sess_47100_1783055745198_1783055745435_dcf2093a36ef942ce3a48b2cc5b2544f",
18
+ "sess_37868_1783055745212_1783055745449_8ddb3a100a3e63e79471cd301c4b4e9d",
19
+ "sess_24344_1783055745227_1783055745464_1171ce7c8fbe4ebac0323e11cd6150ac"
20
+ ],
21
+ "results": [
22
+ {
23
+ "id": "r4-debug-forwarding-gap",
24
+ "agent": "reviewer",
25
+ "ok": true,
26
+ "ms": 110161,
27
+ "sessionId": "sess_47100_1783055745198_1783055745435_dcf2093a36ef942ce3a48b2cc5b2544f",
28
+ "output": "sessionId: sess_47100_1783055745198_1783055745435_dcf2093a36ef942ce3a48b2cc5b2544f\n재영님, 조사 결과 활성화 직후 출력은 “지연”은 대체로 복구되지만, 이미 존재하는 새 transcript에 대한 첫 바인딩은 실제 유실 경로입니다.\n\n**경로 요약**: `bridge-state.json`은 `activate_channel_bridge`에서 먼저 쓰이고(`src/runtime/channels/lib/tool-dispatch.mjs:45-59`), worker start도 동일하게 먼저 활성화합니다(`src/runtime/channels/index.mjs:1735-1745`). 이후 ownership/connect, persisted transcript bind, `fs.watch`, `forwardNewText()`가 이어집니다.\n\n**1. 최대 영향 — 기존 transcript를 첫 바인딩하면 EOF로 점프해 이전 출력 유실**: `catchUpFromPersisted`는 같은 persisted path일 때만 이전 cursor를 쓰고, 아니면 `currentSize`로 시작합니다(`src/runtime/channels/lib/output-forwarder.mjs:117-126`). 활성화 bind는 이 상태로 `forwardNewText()`를 호출하므로(`src/runtime/channels/index.mjs:625-629`, `src/runtime/channels/index.mjs:801-812`) 바인딩 전 이미 파일에 쓰인 assistant 출력은 backlog로 복구되지 않습니다. 단, 같은 transcript의 persisted `lastFileSize`가 남아 있으면 복구됩니다.\n\n**2. 채널 바인딩이 없으면 나중의 첫 inbound에서 기존 출력이 EOF 처리될 수 있음**: 활성화 시 status/main channel이 없으면 bind가 아예 중단됩니다(`src/runtime/channels/index.mjs:610-624`), `forwardNewText()`도 `channelId` 없이 no-op입니다(`src/runtime/channels/lib/output-forwarder.mjs:351-354`). 나중에 inbound가 기존 transcript를 `applyTranscriptBinding()`하면 catch-up 옵션 없이 EOF로 잡힐 수 있어(`src/runtime/channels/index.mjs:1597-1603`) backlog는 기존 파일에 대해 복구하지 못합니다.\n\n**3. not-yet-created transcript의 `fs.watch` 실패는 설계상 지연 복구됨**: `startWatch()`는 없는 파일에서 catch 후 watcher를 닫습니다(`src/runtime/channels/lib/output-forwarder.mjs:647-670`), 이를 `schedulePendingTranscriptRearm()`이 250ms polling으로 재설치하고 즉시 `forwardNewText()` 합니다(`src/runtime/channels/index.mjs:339-346`, `src/runtime/channels/index.mjs:376-381`, `src/runtime/channels/index.mjs:493-498`). 60초 내 생성되고 ownership이 유지되면 backlog 복구됩니다; timeout/ownership loss 후 재bind가 없으면 복구되지 않습니다.\n\n**4. bridge-state write 후 ownership/backend connect 전 출력은 지연됨**: forwarder는 `bridgeRuntimeConnected && currentOwnerState().owned`가 false면 읽지 않습니다(`src/runtime/channels/index.mjs:316`, `src/runtime/channels/lib/output-forwarder.mjs:351-353`). connect 완료 후 `bridgeRuntimeConnected = true`가 되고 post-connect `forwardNewText()`가 실행됩니다(`src/runtime/channels/index.mjs:769-781`, `src/runtime/channels/index.mjs:801-812`), 그래서 cursor가 보존된 경우 backlog 복구됩니다.\n\n**5. watch 설치 직전/직후의 짧은 race는 복구됨**: `setContext()`의 stat 이후 watch 설치 사이에 쓰인 bytes는 `startWatch()`가 즉시 `scheduleWatchFlush()`를 호출해 읽습니다(`src/runtime/channels/lib/output-forwarder.mjs:665-666`, `src/runtime/channels/lib/output-forwarder.mjs:703-731`). 단, `setContext()` stat 이전 bytes는 1번 유실 조건에 속합니다.\n\n**Verdict**: 활성화-연결-미생성 파일 구간의 지연은 대부분 catch-up 되지만, “새로 발견된 이미 존재하는 transcript”를 EOF로 바인딩하는 경로는 첫 assistant 출력을 조용히 유실할 수 있습니다.",
29
+ "card": {
30
+ "session": "sess_47100_1783055745198_1783055745435_dcf2093a36ef942ce3a48b2cc5b2544f",
31
+ "provider": "openai-oauth",
32
+ "model": "gpt-5.5",
33
+ "wall_ms": 99667,
34
+ "turns": 6,
35
+ "tool_calls": 7,
36
+ "tools_per_turn": 1.2,
37
+ "total_tool_ms": 654,
38
+ "llm_stream_ms": 98986,
39
+ "cache_ratio": 0.4810080500736896,
40
+ "cached_tokens": 81920,
41
+ "prompt_tokens": 170309,
42
+ "uncached_tokens": 88389,
43
+ "output_tokens": 10473,
44
+ "cache_weighted_input_10": 96581,
45
+ "cache_weighted_input_25": 108869,
46
+ "prompt_growth": 49597,
47
+ "antipatterns": 1,
48
+ "issues": 5,
49
+ "issue_types": [
50
+ "cache_miss",
51
+ "cache",
52
+ "broad_tool_result",
53
+ "service_tier",
54
+ "tool_churn_cluster"
55
+ ],
56
+ "read_fragmentation_paths": [],
57
+ "grep_sweep_count": 0
58
+ }
59
+ },
60
+ {
61
+ "id": "r4-impl-usage-summary",
62
+ "agent": "worker",
63
+ "ok": true,
64
+ "ms": 76472,
65
+ "sessionId": "sess_37868_1783055745212_1783055745449_8ddb3a100a3e63e79471cd301c4b4e9d",
66
+ "output": "sessionId: sess_37868_1783055745212_1783055745449_8ddb3a100a3e63e79471cd301c4b4e9d\n구현 상태를 확인하고 요청하신 검증을 바로 실행하겠습니다.요청한 기본 경로에 맞도록 `MIXDOG_DATA_DIR`가 없을 때는 `~/.mixdog/data`만 사용하게 조정하겠습니다.패치 도구가 실패해 PowerShell로 동일 변경을 적용하고 검증까지 다시 실행하겠습니다.완료했습니다: `usage:today` npm script와 새 `scripts/usage-today.mjs`를 추가했습니다.\n\n- **변경 요약**: `package.json:58`에 `usage:today`를 추가했고, 새 스크립트가 `MIXDOG_DATA_DIR` 또는 `~/.mixdog/data/history/agent-trace.jsonl`을 읽어 오늘 사용량을 모델별/총합으로 출력합니다.\n\n- **출력 항목**: 모델별 `calls`, `input`, `cached`, `output`, `costUsd`와 `GRAND TOTAL`을 표로 출력하며 `--trace`, `--json`도 지원합니다.\n\n- **검증 완료**: `node --check scripts/usage-today.mjs` 통과, `npm run usage:today` 실행 완료; 현재 환경에서는 총 `1157` calls, `76.2205` costUsd가 출력됐습니다.\n\n- **참고**: 기존 작업트리의 무관한 수정 `src/runtime/channels/lib/event-queue.mjs`, `src/runtime/channels/lib/output-forwarder.mjs`는 건드리지 않았습니다.",
67
+ "card": {
68
+ "session": "sess_37868_1783055745212_1783055745449_8ddb3a100a3e63e79471cd301c4b4e9d",
69
+ "provider": "openai-oauth",
70
+ "model": "gpt-5.5",
71
+ "wall_ms": 65981,
72
+ "turns": 9,
73
+ "tool_calls": 9,
74
+ "tools_per_turn": 1,
75
+ "total_tool_ms": 3173,
76
+ "llm_stream_ms": 62795,
77
+ "cache_ratio": 0.6369198951943337,
78
+ "cached_tokens": 81920,
79
+ "prompt_tokens": 128619,
80
+ "uncached_tokens": 46699,
81
+ "output_tokens": 5005,
82
+ "cache_weighted_input_10": 54891,
83
+ "cache_weighted_input_25": 67179,
84
+ "prompt_growth": 16779,
85
+ "antipatterns": 1,
86
+ "issues": 7,
87
+ "issue_types": [
88
+ "cache_miss",
89
+ "cache",
90
+ "tool_error",
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",
101
+ "agent": "explore",
102
+ "ok": true,
103
+ "ms": 63493,
104
+ "sessionId": "sess_24344_1783055745227_1783055745464_1171ce7c8fbe4ebac0323e11cd6150ac",
105
+ "output": "sessionId: sess_24344_1783055745227_1783055745464_1171ce7c8fbe4ebac0323e11cd6150ac\nI’ll trace the code paths and line anchors directly from the repository, then condense the map.Architecture brief:\n\n- **Public surface:** `compact.mjs` is the facade and re-exports `semanticCompactMessages` / `recallFastTrackCompactMessages` from `engine.mjs` (`src/runtime/agent/orchestrator/session/compact.mjs:1-5`, `:52-55`; `engine.mjs:278`, `:445-447`).\n\n- **Main callers:** active turns enter through `askSession → agentLoop` (`manager.mjs:1379-1380`), then pre-send auto compaction calls recall-fasttrack or semantic paths (`loop.mjs:414-428`, `:439-465`).\n\n- **Manual/clear callers:** `compactSessionMessages` and clear-before-compact call `runSessionCompaction` (`manager.mjs:1841-1850`, `:1943-1957`), which dispatches recall-fasttrack or semantic (`compaction-runner.mjs:207-224`, `:280-310`).\n\n- **Fire decision:** loop drains pending steering before sizing so the next provider payload is measured (`loop.mjs:324-329`), resolves policy (`loop.mjs:329`; `compact-policy.mjs:89-148`), and compacts when pressure crosses trigger or reactive overflow forces it (`loop.mjs:351-364`; `compact-policy.mjs:170-174`).\n\n- **Policy math:** boundary comes from explicit/session context window, trigger is boundary minus buffer, reserve includes request/tool schema reserve, and target budget is capped to compact target plus reserve (`compact-policy.mjs:94-117`, `:121-145`, `:163-168`).\n\n- **Reactive path:** if provider send returns context overflow, one retry marks `reactiveOverflowRetryPending`, loops back through normal pre-send compaction, then surfaces overflow if it fails again (`loop.mjs:981-1010`, `:1012-1026`).\n\n- **Manual threshold:** `runSessionCompaction` treats manual as forced, skips auto if disabled, returns “below threshold” when non-forced pressure is under trigger (`compaction-runner.mjs:143-176`).\n\n- **Semantic window:** `splitLiveCompactionContext` sanitizes/repairs tool pairs, separates protected system/reminder prefix, extracts previous summary, and filters summary messages out of live history (`engine.mjs:100-111`; `messages.mjs:56-81`).\n\n- **Semantic tail choice:** if live has user turns, keep up to `tailTurns` recent turns within preserved budget and split newest turn suffix if needed; otherwise choose a valid non-`tool` cut point so tool results never start the tail (`engine.mjs:46`, `:134-185`, `:121-127`, `:193-232`, `:235-242`).\n\n- **Semantic assembly:** head is summarized, tail is preserved, tail is re-sanitized/reconciled for provider-valid tool pairs, and empty live windows or no prior head without summary throw (`engine.mjs:244-255`, `:314-317`, `:319-337`, `:367-397`).\n\n- **Recall tail choice:** recall fast-track keeps newest structured turns, default max two user turns / 8k cap, drops oldest kept turns first, truncates the oldest survivor if still too large, and permits no-user assistant/tool tails (`engine.mjs:449-468`, `:593-619`).\n\n- **Recall assembly:** recall path splits protected/live context, selects preserved tail, requires compactable head/previous/recall unless explicitly allowed, caps recall injection room, then emits `system + recall summary + preserved tail` (`engine.mjs:644-668`, `:679-699`).\n\n- **Redaction hook:** no-op fast paths return sanitized messages unchanged, but real semantic/recall compaction redacts tool-call secret arguments before window selection so preserved system/tail are measured and emitted redacted (`engine.mjs:286-312`, `:389-392`, `:622-645`).\n\n- **Redaction semantics:** secret-key and raw `key:value`/`key=value` values are replaced while preserving tool-call argument shape for verbatim tail messages (`text-utils.mjs:12-17`, `:40-80`, `:219-229`, `:230-288`).\n\n- **Fallbacks:** semantic auto failures can recover by unanchored tool-output prune; recall-fasttrack auto failures do not silently prune and escalate as overflow (`loop.mjs:500-537`, `:546-626`).\n\n- **Session fallback:** manual/clear recall-fasttrack failure tries semantic once when enabled/provider exists, then non-recall failures may use the same unanchored prune safety net; otherwise failure metadata is recorded without replacing history (`compaction-runner.mjs:231-278`, `:322-347`, `:348-397`).\n\n- **State after success:** changed loop compaction replaces in-memory messages, clears provider state, resets iteration/usage epoch, and emits telemetry/events; session compaction persists compacted messages and clears provider state (`loop.mjs:630-648`, `:651-716`; `compaction-runner.mjs:399-447`).",
106
+ "card": {
107
+ "session": "sess_24344_1783055745227_1783055745464_1171ce7c8fbe4ebac0323e11cd6150ac",
108
+ "provider": "openai-oauth",
109
+ "model": "gpt-5.5",
110
+ "wall_ms": 52999,
111
+ "turns": 8,
112
+ "tool_calls": 7,
113
+ "tools_per_turn": 0.9,
114
+ "total_tool_ms": 484,
115
+ "llm_stream_ms": 52522,
116
+ "cache_ratio": 0.27245049171494007,
117
+ "cached_tokens": 40448,
118
+ "prompt_tokens": 148460,
119
+ "uncached_tokens": 108012,
120
+ "output_tokens": 3624,
121
+ "cache_weighted_input_10": 112056.8,
122
+ "cache_weighted_input_25": 118124,
123
+ "prompt_growth": 39153,
124
+ "antipatterns": 1,
125
+ "issues": 9,
126
+ "issue_types": [
127
+ "cache_miss",
128
+ "cache",
129
+ "broad_tool_result",
130
+ "service_tier",
131
+ "missed_parallelism",
132
+ "tool_churn_cluster"
133
+ ],
134
+ "read_fragmentation_paths": [],
135
+ "grep_sweep_count": 0
136
+ }
137
+ }
138
+ ],
139
+ "task_complete": true,
140
+ "task_errors": [],
141
+ "score_complete": true,
142
+ "score_errors": [],
143
+ "group": {
144
+ "n": 3,
145
+ "wall_ms": 72882.3,
146
+ "turns": 7.7,
147
+ "tool_calls": 7.7,
148
+ "tools_per_turn": 1,
149
+ "total_tool_ms": 1437,
150
+ "llm_stream_ms": 71434.3,
151
+ "cache_ratio": 0.5,
152
+ "cached_tokens": 68096,
153
+ "prompt_tokens": 149129.3,
154
+ "uncached_tokens": 81033.3,
155
+ "output_tokens": 6367.3,
156
+ "cache_weighted_input_10": 87842.9,
157
+ "cache_weighted_input_25": 98057.3,
158
+ "prompt_growth": 35176.3,
159
+ "antipatterns": 1,
160
+ "issues": 7,
161
+ "grep_sweep_count": 0
162
+ },
163
+ "cards": [
164
+ {
165
+ "session": "sess_47100_1783055745198_1783055745435_dcf2093a36ef942ce3a48b2cc5b2544f",
166
+ "provider": "openai-oauth",
167
+ "model": "gpt-5.5",
168
+ "wall_ms": 99667,
169
+ "turns": 6,
170
+ "tool_calls": 7,
171
+ "tools_per_turn": 1.2,
172
+ "total_tool_ms": 654,
173
+ "llm_stream_ms": 98986,
174
+ "cache_ratio": 0.4810080500736896,
175
+ "cached_tokens": 81920,
176
+ "prompt_tokens": 170309,
177
+ "uncached_tokens": 88389,
178
+ "output_tokens": 10473,
179
+ "cache_weighted_input_10": 96581,
180
+ "cache_weighted_input_25": 108869,
181
+ "prompt_growth": 49597,
182
+ "antipatterns": 1,
183
+ "issues": 5,
184
+ "issue_types": [
185
+ "cache_miss",
186
+ "cache",
187
+ "broad_tool_result",
188
+ "service_tier",
189
+ "tool_churn_cluster"
190
+ ],
191
+ "read_fragmentation_paths": [],
192
+ "grep_sweep_count": 0
193
+ },
194
+ {
195
+ "session": "sess_37868_1783055745212_1783055745449_8ddb3a100a3e63e79471cd301c4b4e9d",
196
+ "provider": "openai-oauth",
197
+ "model": "gpt-5.5",
198
+ "wall_ms": 65981,
199
+ "turns": 9,
200
+ "tool_calls": 9,
201
+ "tools_per_turn": 1,
202
+ "total_tool_ms": 3173,
203
+ "llm_stream_ms": 62795,
204
+ "cache_ratio": 0.6369198951943337,
205
+ "cached_tokens": 81920,
206
+ "prompt_tokens": 128619,
207
+ "uncached_tokens": 46699,
208
+ "output_tokens": 5005,
209
+ "cache_weighted_input_10": 54891,
210
+ "cache_weighted_input_25": 67179,
211
+ "prompt_growth": 16779,
212
+ "antipatterns": 1,
213
+ "issues": 7,
214
+ "issue_types": [
215
+ "cache_miss",
216
+ "cache",
217
+ "tool_error",
218
+ "service_tier",
219
+ "missed_parallelism",
220
+ "tool_churn_cluster"
221
+ ],
222
+ "read_fragmentation_paths": [],
223
+ "grep_sweep_count": 0
224
+ },
225
+ {
226
+ "session": "sess_24344_1783055745227_1783055745464_1171ce7c8fbe4ebac0323e11cd6150ac",
227
+ "provider": "openai-oauth",
228
+ "model": "gpt-5.5",
229
+ "wall_ms": 52999,
230
+ "turns": 8,
231
+ "tool_calls": 7,
232
+ "tools_per_turn": 0.9,
233
+ "total_tool_ms": 484,
234
+ "llm_stream_ms": 52522,
235
+ "cache_ratio": 0.27245049171494007,
236
+ "cached_tokens": 40448,
237
+ "prompt_tokens": 148460,
238
+ "uncached_tokens": 108012,
239
+ "output_tokens": 3624,
240
+ "cache_weighted_input_10": 112056.8,
241
+ "cache_weighted_input_25": 118124,
242
+ "prompt_growth": 39153,
243
+ "antipatterns": 1,
244
+ "issues": 9,
245
+ "issue_types": [
246
+ "cache_miss",
247
+ "cache",
248
+ "broad_tool_result",
249
+ "service_tier",
250
+ "missed_parallelism",
251
+ "tool_churn_cluster"
252
+ ],
253
+ "read_fragmentation_paths": [],
254
+ "grep_sweep_count": 0
255
+ }
256
+ ]
257
+ }