mixdog 0.9.62 → 0.9.64

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 (403) hide show
  1. package/README.md +3 -0
  2. package/package.json +9 -2
  3. package/scripts/code-graph-description-contract.mjs +3 -3
  4. package/scripts/verify-release-assets.mjs +2 -2
  5. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +11 -14
  6. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +6 -6
  7. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -2
  8. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
  9. package/src/runtime/agent/orchestrator/config.mjs +19 -124
  10. package/src/runtime/agent/orchestrator/context/collect.mjs +6 -6
  11. package/src/runtime/agent/orchestrator/dispatch-persist.mjs +2 -2
  12. package/src/runtime/agent/orchestrator/internal-agents.mjs +2 -2
  13. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +1 -1
  14. package/src/runtime/agent/orchestrator/mcp/client.mjs +4 -4
  15. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +2 -2
  16. package/src/runtime/agent/orchestrator/providers/anthropic-betas.mjs +4 -4
  17. package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +2 -2
  18. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +4 -4
  19. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +333 -0
  20. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +2 -2
  21. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -4
  22. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +1 -1
  23. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +3 -277
  24. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +2 -2
  25. package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +1 -1
  26. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +2 -2
  27. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +6 -6
  28. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +196 -0
  29. package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +460 -0
  30. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +14 -593
  31. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +1 -1
  32. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +1 -1
  33. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +1 -1
  34. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +4 -4
  35. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2 -2
  36. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +5 -280
  37. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +357 -0
  38. package/src/runtime/agent/orchestrator/providers/openai-ws-headers.mjs +216 -0
  39. package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +2 -188
  40. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +2 -2
  41. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +2 -2
  42. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +1 -1
  43. package/src/runtime/agent/orchestrator/providers/provider-catalog-cache.mjs +1 -1
  44. package/src/runtime/agent/orchestrator/providers/registry.mjs +1 -1
  45. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +2 -2
  46. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +1 -1
  47. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +1 -1
  48. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +3 -3
  49. package/src/runtime/agent/orchestrator/session/compact/budget.mjs +2 -2
  50. package/src/runtime/agent/orchestrator/session/compact/file-reattach.mjs +2 -2
  51. package/src/runtime/agent/orchestrator/session/compact/summary-schema.mjs +1 -1
  52. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +1 -1
  53. package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +2 -2
  54. package/src/runtime/agent/orchestrator/session/context-utils.mjs +4 -4
  55. package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +1 -1
  56. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +17 -0
  57. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +1 -1
  58. package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +18 -26
  59. package/src/runtime/agent/orchestrator/session/loop/termination.mjs +1 -1
  60. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +3 -3
  61. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +1 -0
  62. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
  63. package/src/runtime/agent/orchestrator/session/manager/delivered-completions.mjs +1 -1
  64. package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +1 -1
  65. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +49 -0
  66. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +49 -0
  67. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +260 -0
  68. package/src/runtime/agent/orchestrator/session/store/serialize.mjs +72 -0
  69. package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +163 -0
  70. package/src/runtime/agent/orchestrator/session/store/write-guards.mjs +1 -1
  71. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +1 -1
  72. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +4 -1
  73. package/src/runtime/agent/orchestrator/session/store.mjs +9 -561
  74. package/src/runtime/agent/orchestrator/session/tool-envelope.mjs +1 -1
  75. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +2 -2
  76. package/src/runtime/agent/orchestrator/stall-policy.mjs +11 -11
  77. package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +1 -1
  78. package/src/runtime/agent/orchestrator/tools/bash-session.mjs +2 -2
  79. package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +1 -1
  80. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +2 -2
  81. package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +1 -1
  82. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +2 -154
  83. package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +1 -1
  84. package/src/runtime/agent/orchestrator/tools/builtin/cwd-utils.mjs +1 -1
  85. package/src/runtime/agent/orchestrator/tools/builtin/fs-reachability.mjs +1 -1
  86. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +1 -1
  87. package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +1 -1
  88. package/src/runtime/agent/orchestrator/tools/builtin/path-locks.mjs +1 -1
  89. package/src/runtime/agent/orchestrator/tools/builtin/path-utils.mjs +1 -1
  90. package/src/runtime/agent/orchestrator/tools/builtin/read-args.mjs +2 -2
  91. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +2 -3
  92. package/src/runtime/agent/orchestrator/tools/builtin/read-image-resize.mjs +4 -4
  93. package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +1 -1
  94. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +1 -1
  95. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +2 -2
  96. package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +5 -5
  97. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +1 -1
  98. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-paths.mjs +2 -2
  99. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-process.mjs +2 -2
  100. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-spawn.mjs +519 -0
  101. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +5 -449
  102. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-helpers.mjs +1 -1
  103. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +212 -0
  104. package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -1
  105. package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +1 -7
  106. package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +9 -36
  107. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +15 -3
  108. package/src/runtime/agent/orchestrator/tools/code-graph/search-references.mjs +429 -0
  109. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +2 -395
  110. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +2 -2
  111. package/src/runtime/agent/orchestrator/tools/code-graph/text-mask.mjs +1 -1
  112. package/src/runtime/agent/orchestrator/tools/code-graph/trusted-roots.mjs +1 -1
  113. package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
  114. package/src/runtime/agent/orchestrator/tools/code-graph-state.mjs +3 -3
  115. package/src/runtime/agent/orchestrator/tools/mutation-planner.mjs +5 -5
  116. package/src/runtime/agent/orchestrator/tools/next-call-utils.mjs +1 -1
  117. package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +1 -1
  118. package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +7 -7
  119. package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +72 -9
  120. package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +4 -4
  121. package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +1 -1
  122. package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +1 -1
  123. package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +4 -4
  124. package/src/runtime/agent/orchestrator/tools/patch.mjs +1 -1
  125. package/src/runtime/agent/orchestrator/tools/result-compression.mjs +3 -3
  126. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +2 -444
  127. package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +505 -0
  128. package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +2 -2
  129. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +1 -1
  130. package/src/runtime/channels/lib/backend-dispatch.mjs +20 -5
  131. package/src/runtime/channels/lib/scheduler.mjs +1 -1
  132. package/src/runtime/channels/lib/telegram-format.mjs +1 -1
  133. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +4 -4
  134. package/src/runtime/channels/tool-defs.mjs +2 -3
  135. package/src/runtime/memory/index.mjs +1 -5
  136. package/src/runtime/memory/lib/core-memory-candidates.mjs +357 -0
  137. package/src/runtime/memory/lib/core-memory-store.mjs +7 -357
  138. package/src/runtime/memory/lib/cycle-signatures.mjs +1 -1
  139. package/src/runtime/memory/lib/embedding-model-config.mjs +1 -1
  140. package/src/runtime/memory/lib/embedding-provider.mjs +1 -5
  141. package/src/runtime/memory/lib/embedding-worker.mjs +1 -5
  142. package/src/runtime/memory/lib/ko-morph.mjs +2 -2
  143. package/src/runtime/memory/lib/memory-config-flags.mjs +2 -5
  144. package/src/runtime/memory/lib/memory-cycle-requests.mjs +3 -7
  145. package/src/runtime/memory/lib/memory-cycle1.mjs +4 -8
  146. package/src/runtime/memory/lib/memory-cycle2-gate.mjs +1 -1
  147. package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +1 -1
  148. package/src/runtime/memory/lib/memory-cycle2-shared.mjs +2 -5
  149. package/src/runtime/memory/lib/memory-cycle3.mjs +1 -5
  150. package/src/runtime/memory/lib/memory-embed.mjs +2 -6
  151. package/src/runtime/memory/lib/memory-log.mjs +8 -0
  152. package/src/runtime/memory/lib/memory-ops-policy.mjs +4 -8
  153. package/src/runtime/memory/lib/memory-recall-scope-filter.mjs +1 -1
  154. package/src/runtime/memory/lib/memory-recall-store.mjs +2 -193
  155. package/src/runtime/memory/lib/memory-score.mjs +1 -1
  156. package/src/runtime/memory/lib/memory-text-utils.mjs +2 -2
  157. package/src/runtime/memory/lib/memory.mjs +2 -6
  158. package/src/runtime/memory/lib/pg/adapter.mjs +2 -6
  159. package/src/runtime/memory/lib/pg/process.mjs +1 -5
  160. package/src/runtime/memory/lib/pg/supervisor.mjs +1 -5
  161. package/src/runtime/memory/lib/recall-format.mjs +2 -2
  162. package/src/runtime/memory/lib/recall-scoring.mjs +195 -0
  163. package/src/runtime/memory/lib/runtime-fetcher.mjs +1 -5
  164. package/src/runtime/memory/lib/trace-store.mjs +2 -6
  165. package/src/runtime/search/lib/http-fetch.mjs +6 -6
  166. package/src/runtime/search/lib/web-tools.mjs +2 -2
  167. package/src/runtime/shared/buffered-appender.mjs +1 -1
  168. package/src/runtime/shared/child-guardian.mjs +1 -1
  169. package/src/runtime/shared/child-spawn-gate.mjs +1 -1
  170. package/src/runtime/shared/config.mjs +4 -4
  171. package/src/runtime/shared/launcher-control.mjs +9 -10
  172. package/src/runtime/shared/llm/index.mjs +5 -20
  173. package/src/runtime/shared/markdown-frontmatter.mjs +1 -1
  174. package/src/runtime/shared/memory-snapshot.mjs +4 -4
  175. package/src/runtime/shared/pristine-execution.mjs +1 -1
  176. package/src/runtime/shared/process-lifecycle.mjs +0 -1
  177. package/src/runtime/shared/process-shutdown.mjs +1 -1
  178. package/src/runtime/shared/resource-admission.mjs +2 -2
  179. package/src/runtime/shared/schedule-session-run.mjs +1 -1
  180. package/src/runtime/shared/schedules-db.mjs +1 -1
  181. package/src/runtime/shared/service-discovery.mjs +2 -2
  182. package/src/runtime/shared/staged-update.mjs +6 -6
  183. package/src/runtime/shared/tool-execution-contract.mjs +1 -1
  184. package/src/runtime/shared/tool-primitives.mjs +1 -1
  185. package/src/runtime/shared/tool-surface.mjs +2 -2
  186. package/src/runtime/shared/update-checker.mjs +1 -1
  187. package/src/runtime/shared/user-cwd.mjs +3 -3
  188. package/src/runtime/shared/user-data-guard.mjs +4 -4
  189. package/src/runtime/shared/workspace-router.mjs +5 -5
  190. package/src/session-runtime/config-helpers.mjs +2 -3
  191. package/src/session-runtime/config-lifecycle.mjs +1 -1
  192. package/src/session-runtime/hitch-profile.mjs +1 -1
  193. package/src/session-runtime/lifecycle-api.mjs +6 -4
  194. package/src/session-runtime/model-recency.mjs +5 -5
  195. package/src/session-runtime/plugin-mcp.mjs +1 -1
  196. package/src/session-runtime/provider-request-snapshot.mjs +338 -0
  197. package/src/session-runtime/session-text.mjs +4 -4
  198. package/src/session-runtime/tool-catalog-schema.mjs +197 -0
  199. package/src/session-runtime/tool-catalog.mjs +6 -483
  200. package/src/session-runtime/tool-defs.mjs +1 -1
  201. package/src/standalone/agent-task-status.mjs +1 -1
  202. package/src/standalone/agent-tool/helpers.mjs +2 -2
  203. package/src/standalone/channel-admin.mjs +4 -4
  204. package/src/standalone/explore-tool.mjs +3 -3
  205. package/src/standalone/hook-bus/config.mjs +1 -1
  206. package/src/standalone/hook-bus/constants.mjs +1 -1
  207. package/src/standalone/hook-bus/rules.mjs +1 -1
  208. package/src/standalone/projects.mjs +1 -1
  209. package/src/standalone/provider-admin.mjs +2 -2
  210. package/src/tui/app/app-format.mjs +2 -2
  211. package/src/tui/app/clipboard.mjs +3 -3
  212. package/src/tui/app/input-parsers.mjs +1 -1
  213. package/src/tui/app/text-layout.mjs +1 -1
  214. package/src/tui/app/transcript-row-estimate.mjs +360 -0
  215. package/src/tui/app/transcript-window.mjs +5 -347
  216. package/src/tui/app/use-mouse-input.mjs +1 -1
  217. package/src/tui/app/use-prompt-handlers.mjs +1 -1
  218. package/src/tui/components/tool-execution/surface-detail.mjs +9 -9
  219. package/src/tui/components/tool-execution/text-format.mjs +2 -2
  220. package/src/tui/components/tool-output-format.mjs +7 -7
  221. package/src/tui/display-width.mjs +4 -4
  222. package/src/tui/dist/index.mjs +63 -97
  223. package/src/tui/engine/agent-envelope.mjs +5 -5
  224. package/src/tui/engine/notification-plan.mjs +1 -1
  225. package/src/tui/engine/queue-helpers.mjs +3 -3
  226. package/src/tui/engine/render-timing.mjs +4 -5
  227. package/src/tui/engine/session-api-ext.mjs +3 -3
  228. package/src/tui/engine/tool-result-status.mjs +5 -5
  229. package/src/tui/engine/tool-result-text.mjs +1 -1
  230. package/src/tui/engine/transcript-spill.mjs +585 -0
  231. package/src/tui/engine/tui-steering-persist.mjs +1 -1
  232. package/src/tui/engine.mjs +2 -474
  233. package/src/tui/lib/voice-setup.mjs +1 -1
  234. package/src/tui/markdown/format-token.mjs +1 -1
  235. package/src/tui/markdown/render-ansi.mjs +1 -1
  236. package/src/tui/markdown/table-layout.mjs +4 -4
  237. package/src/tui/paste-attachments.mjs +1 -1
  238. package/src/tui/prompt-history-store.mjs +3 -3
  239. package/src/tui/statusline-ansi-bridge.mjs +2 -2
  240. package/src/tui/theme.mjs +1 -1
  241. package/src/tui/transcript-tool-failures.mjs +2 -2
  242. package/src/ui/ansi.mjs +0 -9
  243. package/src/ui/statusline-format.mjs +2 -4
  244. package/scripts/_bench-cwc.json +0 -20
  245. package/scripts/_jitter-fuzz.jsx +0 -42
  246. package/scripts/_jitter-fuzz2.jsx +0 -30
  247. package/scripts/_jitter-probe.jsx +0 -35
  248. package/scripts/_jp2.jsx +0 -16
  249. package/scripts/_smoke_wd.mjs +0 -7
  250. package/scripts/abort-recovery-test.mjs +0 -175
  251. package/scripts/agent-dispatch-abort-compose-test.mjs +0 -31
  252. package/scripts/agent-live-arg-guard-smoke.mjs +0 -20
  253. package/scripts/agent-live-path-suffix-smoke.mjs +0 -34
  254. package/scripts/agent-live-toolcall-args-smoke.mjs +0 -45
  255. package/scripts/agent-loop-policy-test.mjs +0 -37
  256. package/scripts/agent-model-liveness-test.mjs +0 -763
  257. package/scripts/agent-parallel-smoke.mjs +0 -435
  258. package/scripts/agent-route-batch-test.mjs +0 -40
  259. package/scripts/agent-tag-reuse-smoke.mjs +0 -441
  260. package/scripts/agent-terminal-reap-test.mjs +0 -252
  261. package/scripts/agent-trace-io-test.mjs +0 -133
  262. package/scripts/ansi-color-capability-test.mjs +0 -90
  263. package/scripts/anthropic-admission-retry-integration-test.mjs +0 -119
  264. package/scripts/anthropic-maxtokens-test.mjs +0 -119
  265. package/scripts/anthropic-oauth-refresh-race-test.mjs +0 -397
  266. package/scripts/anthropic-transport-policy-test.mjs +0 -726
  267. package/scripts/apply-patch-edit-smoke.mjs +0 -71
  268. package/scripts/arg-guard-test.mjs +0 -93
  269. package/scripts/async-notify-settlement-test.mjs +0 -99
  270. package/scripts/atomic-lock-tryonce-test.mjs +0 -125
  271. package/scripts/background-task-meta-smoke.mjs +0 -38
  272. package/scripts/bench-run.mjs +0 -508
  273. package/scripts/boot-smoke.mjs +0 -137
  274. package/scripts/build-runtime-windows.ps1 +0 -242
  275. package/scripts/channel-daemon-smoke.mjs +0 -1103
  276. package/scripts/code-graph-aggregate-cwd-test.mjs +0 -158
  277. package/scripts/code-graph-disk-hit-test.mjs +0 -290
  278. package/scripts/code-graph-dispatch-test.mjs +0 -96
  279. package/scripts/code-graph-root-federation-test.mjs +0 -273
  280. package/scripts/compact-active-turn-test.mjs +0 -68
  281. package/scripts/compact-file-reattach-test.mjs +0 -88
  282. package/scripts/compact-pressure-test.mjs +0 -788
  283. package/scripts/compact-prior-context-flatten-test.mjs +0 -252
  284. package/scripts/compact-recall-digest-test.mjs +0 -57
  285. package/scripts/compact-smoke.mjs +0 -1017
  286. package/scripts/compact-trigger-migration-smoke.mjs +0 -261
  287. package/scripts/compacted-placeholder-scrub-test.mjs +0 -63
  288. package/scripts/context-mcp-metering-test.mjs +0 -1406
  289. package/scripts/debounced-skills-async-save-test.mjs +0 -57
  290. package/scripts/deferred-tool-loading-test.mjs +0 -250
  291. package/scripts/desktop-session-bridge-test.mjs +0 -1013
  292. package/scripts/dispatch-persist-recovery-test.mjs +0 -141
  293. package/scripts/embedding-worker-exit-test.mjs +0 -76
  294. package/scripts/execution-completion-dedup-test.mjs +0 -205
  295. package/scripts/execution-pending-resume-kick-test.mjs +0 -151
  296. package/scripts/execution-resume-esc-integration-test.mjs +0 -176
  297. package/scripts/explore-bench-tmp.mjs +0 -36
  298. package/scripts/explore-bench.mjs +0 -248
  299. package/scripts/explore-prompt-policy-test.mjs +0 -256
  300. package/scripts/explore-timeout-cancel-test.mjs +0 -345
  301. package/scripts/find-fuzzy-hidden-test.mjs +0 -267
  302. package/scripts/forwarder-rebind-tail-test.mjs +0 -67
  303. package/scripts/freevar-smoke.mjs +0 -98
  304. package/scripts/gemini-provider-test.mjs +0 -1448
  305. package/scripts/generate-oc-icons.mjs +0 -11
  306. package/scripts/grok-oauth-refresh-race-test.mjs +0 -273
  307. package/scripts/headless-pristine-execution-test.mjs +0 -614
  308. package/scripts/hook-bus-test.mjs +0 -552
  309. package/scripts/ingest-pure-conversation-smoke.mjs +0 -175
  310. package/scripts/internal-comms-bench-test.mjs +0 -226
  311. package/scripts/internal-comms-bench.mjs +0 -853
  312. package/scripts/internal-comms-smoke.mjs +0 -277
  313. package/scripts/internal-tools-normalization-test.mjs +0 -62
  314. package/scripts/interrupted-turn-history-test.mjs +0 -399
  315. package/scripts/lead-workflow-smoke.mjs +0 -592
  316. package/scripts/lifecycle-api-test.mjs +0 -137
  317. package/scripts/live-share-test.mjs +0 -148
  318. package/scripts/live-worker-smoke.mjs +0 -333
  319. package/scripts/log-writer-guard-smoke.mjs +0 -131
  320. package/scripts/maintenance-default-routes-test.mjs +0 -164
  321. package/scripts/max-output-recovery-persist-test.mjs +0 -81
  322. package/scripts/max-output-recovery-test.mjs +0 -368
  323. package/scripts/mcp-client-normalization-test.mjs +0 -45
  324. package/scripts/mcp-grace-deferred-test.mjs +0 -225
  325. package/scripts/memory-core-input-test.mjs +0 -167
  326. package/scripts/memory-cycle-routing-test.mjs +0 -111
  327. package/scripts/memory-meta-concurrency-test.mjs +0 -20
  328. package/scripts/memory-pg-recovery-test.mjs +0 -59
  329. package/scripts/memory-rule-contract-test.mjs +0 -93
  330. package/scripts/model-list-sanitize-test.mjs +0 -37
  331. package/scripts/mouse-tracking-restore-smoke.mjs +0 -107
  332. package/scripts/native-edit-wire-test.mjs +0 -152
  333. package/scripts/notify-completion-mirror-test.mjs +0 -73
  334. package/scripts/openai-oauth-refresh-race-test.mjs +0 -120
  335. package/scripts/openai-oauth-ws-1006-retry-test.mjs +0 -954
  336. package/scripts/openai-ws-early-settle-test.mjs +0 -216
  337. package/scripts/output-style-bench.mjs +0 -292
  338. package/scripts/output-style-smoke.mjs +0 -145
  339. package/scripts/parent-abort-link-test.mjs +0 -90
  340. package/scripts/patch-binary-cache-test.mjs +0 -181
  341. package/scripts/path-suffix-test.mjs +0 -57
  342. package/scripts/pending-completion-drop-test.mjs +0 -239
  343. package/scripts/pending-messages-lock-nonblocking-test.mjs +0 -62
  344. package/scripts/pretool-ask-runtime-test.mjs +0 -54
  345. package/scripts/process-lifecycle-test.mjs +0 -461
  346. package/scripts/prompt-immediate-render-test.mjs +0 -89
  347. package/scripts/prompt-input-parity-test.mjs +0 -145
  348. package/scripts/provider-admission-scheduler-test.mjs +0 -681
  349. package/scripts/provider-contract-test.mjs +0 -632
  350. package/scripts/provider-stream-stall-test.mjs +0 -276
  351. package/scripts/provider-toolcall-test.mjs +0 -3063
  352. package/scripts/reactive-compact-persist-smoke.mjs +0 -203
  353. package/scripts/recall-bench.mjs +0 -359
  354. package/scripts/resource-admission-test.mjs +0 -792
  355. package/scripts/result-classification-test.mjs +0 -75
  356. package/scripts/rg-runner-test.mjs +0 -240
  357. package/scripts/routing-corpus-test.mjs +0 -349
  358. package/scripts/sanitize-tool-pairs-test.mjs +0 -260
  359. package/scripts/session-bench-cache-break-test.mjs +0 -102
  360. package/scripts/session-bench.mjs +0 -1708
  361. package/scripts/session-context-bench.mjs +0 -344
  362. package/scripts/session-heartbeat-lifecycle-test.mjs +0 -68
  363. package/scripts/session-ingest-compaction-smoke.mjs +0 -279
  364. package/scripts/session-ingest-smoke.mjs +0 -177
  365. package/scripts/session-orphan-sweep-test.mjs +0 -109
  366. package/scripts/set-effort-config-test.mjs +0 -41
  367. package/scripts/shell-failure-diagnostics-test.mjs +0 -280
  368. package/scripts/shell-hardening-test.mjs +0 -209
  369. package/scripts/shell-jobs-windows-hide-test.mjs +0 -164
  370. package/scripts/ship-mode-test.mjs +0 -98
  371. package/scripts/smoke-loop-failure-summary-test.mjs +0 -38
  372. package/scripts/smoke-loop-failure-summary.mjs +0 -16
  373. package/scripts/smoke-loop-report.mjs +0 -221
  374. package/scripts/smoke-loop.mjs +0 -202
  375. package/scripts/smoke-runtime-negative.ps1 +0 -106
  376. package/scripts/statusline-quota-hysteresis-test.mjs +0 -62
  377. package/scripts/steering-drain-buckets-test.mjs +0 -467
  378. package/scripts/steering-fold-provenance-test.mjs +0 -71
  379. package/scripts/streaming-tail-window-test.mjs +0 -175
  380. package/scripts/submit-commandbusy-race-test.mjs +0 -257
  381. package/scripts/task-bench.mjs +0 -205
  382. package/scripts/terminal-bench-isolation-guards-test.mjs +0 -102
  383. package/scripts/termio-input-smoke.mjs +0 -199
  384. package/scripts/tool-result-hook-test.mjs +0 -48
  385. package/scripts/tool-smoke.mjs +0 -2453
  386. package/scripts/tool-tui-presentation-test.mjs +0 -286
  387. package/scripts/toolcall-args-test.mjs +0 -239
  388. package/scripts/tui-ambiguous-width-test.mjs +0 -113
  389. package/scripts/tui-background-failure-smoke.mjs +0 -73
  390. package/scripts/tui-perf-run.ps1 +0 -26
  391. package/scripts/tui-render-smoke.mjs +0 -90
  392. package/scripts/tui-runtime-load-bench-entry.jsx +0 -608
  393. package/scripts/tui-runtime-load-bench.mjs +0 -50
  394. package/scripts/tui-store-frame-batch-test.mjs +0 -99
  395. package/scripts/tui-transcript-jitter-harness-entry.jsx +0 -383
  396. package/scripts/tui-transcript-perf-test.mjs +0 -934
  397. package/scripts/usage-metrics-epoch-smoke.mjs +0 -114
  398. package/scripts/verify-release-assets-test.mjs +0 -281
  399. package/scripts/web-fetch-routing-test.mjs +0 -158
  400. package/scripts/webhook-smoke.mjs +0 -201
  401. package/scripts/windows-hide-spawn-options-test.mjs +0 -19
  402. package/scripts/worker-notify-rejection-test.mjs +0 -51
  403. package/scripts/write-backpressure-test.mjs +0 -147
@@ -1,176 +0,0 @@
1
- // Production-path regression: runtime completion notification -> feed enqueue
2
- // -> session drain -> real runTurn -> Esc. This deliberately uses the real
3
- // feed, queue, API, and turn implementations rather than fabricating restore
4
- // state, so ownership survives the same path used by the TUI.
5
- import test from 'node:test';
6
- import assert from 'node:assert/strict';
7
-
8
- import { createAgentJobFeed } from '../src/tui/engine/agent-job-feed.mjs';
9
- import { createSessionFlow } from '../src/tui/engine/session-flow.mjs';
10
- import { createRunTurn } from '../src/tui/engine/turn.mjs';
11
- import { createEngineApiA } from '../src/tui/engine/session-api.mjs';
12
- import { _clearDeliveredCompletions } from '../src/runtime/agent/orchestrator/session/manager/delivered-completions.mjs';
13
-
14
- const tick = () => new Promise((resolve) => setImmediate(resolve));
15
- const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
16
-
17
- function completion(executionId, body) {
18
- return {
19
- content: `Async agent task ${executionId} completed finished.\n\nResult:\n> ${body}`,
20
- meta: { type: 'agent_task_result', execution_id: executionId, status: 'completed' },
21
- };
22
- }
23
-
24
- function makeHarness() {
25
- let seq = 0;
26
- let notify = null;
27
- let activeAsk = null;
28
- let feed = null;
29
- const asks = [];
30
- const pending = [];
31
- const itemIndexById = new Map();
32
- const state = {
33
- items: [],
34
- queued: [],
35
- busy: false,
36
- commandBusy: false,
37
- spinner: null,
38
- thinking: null,
39
- lastTurn: null,
40
- stats: { turns: 0, inputTokens: 0, outputTokens: 0 },
41
- };
42
- const runtime = {
43
- id: null,
44
- toolMode: 'auto',
45
- onNotification: (fn) => { notify = fn; return () => {}; },
46
- consumePendingSessionReset: () => null,
47
- ask: async (text, options) => new Promise((resolve, reject) => {
48
- activeAsk = { text, options, reject };
49
- asks.push(activeAsk);
50
- }),
51
- abort: () => {
52
- const error = new Error('interrupted');
53
- error.name = 'SessionClosedError';
54
- activeAsk?.reject(error);
55
- return true;
56
- },
57
- };
58
- const bag = {
59
- runtime,
60
- nextId: () => `id_${++seq}`,
61
- tuiDebug: () => {},
62
- LEAD_TURN_TIMEOUT_MS: 300_000,
63
- flags: { leadTurnEpoch: 0, drainEpoch: 0, disposed: false, draining: false, activePromptRestore: null },
64
- pending,
65
- pendingNotificationKeys: new Set(),
66
- displayedExecutionNotificationKeys: new Set(),
67
- listeners: new Set(),
68
- itemIndexById,
69
- getState: () => state,
70
- set: (patch) => Object.assign(state, patch),
71
- pushItem: (item) => {
72
- state.items = [...state.items, item];
73
- if (item?.id != null) itemIndexById.set(item.id, state.items.length - 1);
74
- },
75
- patchItem: (id, patch) => {
76
- const index = state.items.findIndex((item) => item.id === id);
77
- if (index < 0) return false;
78
- state.items = state.items.map((item, i) => i === index ? { ...item, ...patch } : item);
79
- return true;
80
- },
81
- replaceItems: (items) => items,
82
- pushNotice: () => {},
83
- pushUserOrSyntheticItem: (text, id) => {
84
- state.items = [...state.items, { kind: 'injected', id, text }];
85
- },
86
- autoClearState: () => ({ enabled: false }),
87
- agentStatusState: () => ({}),
88
- routeState: () => ({}),
89
- syncContextStats: () => {},
90
- denyAllToolApprovals: () => {},
91
- requestToolApproval: async () => ({ approved: false }),
92
- markToolCallActive: () => {},
93
- markToolCallDone: () => {},
94
- clearActiveToolSummary: () => {},
95
- patchToolCardResult: () => {},
96
- flushToolResults: () => {},
97
- // session-flow captures this dependency before the feed is constructed;
98
- // keep that production ordering while forwarding to the live feed.
99
- flushDeferredExecutionPendingResumeKick: () => feed?.flushDeferredExecutionPendingResumeKick(),
100
- };
101
-
102
- Object.assign(bag, createSessionFlow(bag));
103
- feed = createAgentJobFeed({
104
- runtime,
105
- getState: bag.getState,
106
- set: bag.set,
107
- nextId: bag.nextId,
108
- getDisposed: () => bag.flags.disposed,
109
- patchItem: bag.patchItem,
110
- enqueue: (...args) => bag.enqueue(...args),
111
- drain: (...args) => bag.drain(...args),
112
- pushUserOrSyntheticItem: bag.pushUserOrSyntheticItem,
113
- makeQueueEntry: (...args) => bag.makeQueueEntry(...args),
114
- getPending: () => pending,
115
- agentStatusState: bag.agentStatusState,
116
- displayedExecutionNotificationKeys: bag.displayedExecutionNotificationKeys,
117
- pushNotice: bag.pushNotice,
118
- });
119
- Object.assign(bag, feed);
120
- bag.runTurn = createRunTurn(bag);
121
- const api = createEngineApiA(bag);
122
- feed.subscribeRuntimeNotifications();
123
-
124
- return {
125
- api,
126
- state,
127
- asks,
128
- deliver: (event) => notify(event),
129
- activeAsk: () => activeAsk,
130
- };
131
- }
132
-
133
- for (const phase of ['before first delta', 'after response progress']) {
134
- test(`runtime completion Esc ${phase} does not restart it, while a new completion wakes`, async () => {
135
- _clearDeliveredCompletions();
136
- const harness = makeHarness();
137
-
138
- const first = completion('execution_A', 'first result');
139
- harness.deliver(first);
140
- await tick();
141
- assert.equal(harness.asks.length, 1, 'runtime notification drained into a real turn');
142
- assert.match(harness.activeAsk().text, /first result/, 'completion body reached runtime.ask');
143
- assert.equal(first.modelVisibleDelivered, true, 'notification was acknowledged on the TUI path');
144
-
145
- if (phase === 'after response progress') {
146
- harness.activeAsk().options.onTextDelta('partial response\n');
147
- await wait(40);
148
- assert.equal(
149
- harness.state.streamingTail?.kind === 'assistant'
150
- && /partial response/.test(harness.state.streamingTail.text),
151
- true,
152
- 'response progress reached the dedicated live tail',
153
- );
154
- }
155
-
156
- assert.equal(harness.api.abort().aborted, true, 'Esc aborts the active runTurn');
157
- await tick();
158
- assert.equal(harness.state.busy, false, 'busy clears after the real abort unwind');
159
- assert.equal(harness.state.spinner, null, 'spinner clears after Esc');
160
- assert.equal(harness.state.thinking, null, 'thinking clears after Esc');
161
- assert.equal(harness.state.streamingTail == null, true, 'Esc leaves no orphaned streaming tail');
162
-
163
- harness.deliver(completion('execution_A', 'duplicate retry'));
164
- await tick();
165
- assert.equal(harness.asks.length, 1, 'duplicate execution delivery cannot restart the aborted completion');
166
-
167
- harness.deliver(completion('execution_B', 'later result'));
168
- await tick();
169
- assert.equal(harness.asks.length, 2, 'a genuinely new execution still wakes a turn');
170
- assert.match(harness.activeAsk().text, /later result/);
171
-
172
- // Finish the second intentionally-open mocked provider request.
173
- harness.api.abort();
174
- await tick();
175
- });
176
- }
@@ -1,36 +0,0 @@
1
- import { readFileSync, existsSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { homedir } from 'node:os';
4
- import { runExplore } from '../src/standalone/explore-tool.mjs';
5
- // Attribute LLM send time (not just wall) for this high-fanout batch.
6
- process.env.MIXDOG_AGENT_TRACE_TIMING = '1';
7
- const queries = [
8
- 'standalone explore tool implementation entry point',
9
- 'V4A patch format parsing/conversion implementation',
10
- 'recall memory entries persistent store (sqlite) read/query implementation',
11
- 'output styles: how style definitions are loaded and applied at session runtime',
12
- 'Discord backend outbound message send implementation',
13
- 'shell command destructive/danger policy scan before execution',
14
- 'where does mixdog store per-user data and sessions on this machine (out of repo)',
15
- 'channel runtime crash logging write path',
16
- ];
17
- const t0 = Date.now();
18
- const res = await runExplore({ query: queries, cwd: 'C:/Project/mixdog' }, { callerCwd: 'C:/Project/mixdog' });
19
- console.log('BATCH_ELAPSED_MS', Date.now() - t0);
20
- const txt = res.content?.[0]?.text || '';
21
- console.log('FAILED_COUNT', (txt.match(/EXPLORATION_FAILED/g) || []).length);
22
- // Sum send_ms from loop rows emitted since t0 → LLM time vs the wall above.
23
- const tracePath = process.env.MIXDOG_AGENT_TRACE_PATH
24
- || join(process.env.MIXDOG_DATA_DIR || join(process.env.MIXDOG_HOME || join(homedir(), '.mixdog'), 'data'), 'history', 'agent-trace.jsonl');
25
- let sendMs = 0, sends = 0; const sessions = new Set();
26
- if (existsSync(tracePath)) {
27
- for (const line of readFileSync(tracePath, 'utf8').split('\n')) {
28
- if (!line) continue;
29
- try {
30
- const r = JSON.parse(line);
31
- if (r.ts >= t0 && r.kind === 'loop' && r.agent === 'explorer') { sendMs += Number(r.send_ms) || 0; sends++; sessions.add(r.session_id); }
32
- } catch { /* skip */ }
33
- }
34
- }
35
- console.log('LLM_SEND_MS_TOTAL', sendMs, 'sends', sends, 'sessions', sessions.size);
36
- process.exit(0);
@@ -1,248 +0,0 @@
1
- // Explore quality bench — round-based tuning harness.
2
- //
3
- // Runs a fixed query set through runExplore against this repo, then reads
4
- // agent-trace.jsonl to report per-session tool-call counts, wall time, and
5
- // anchor quality. Usage:
6
- // node scripts/explore-bench.mjs [roundLabel]
7
- // Fresh process per run = no in-memory result cache carryover.
8
- import { readFileSync, existsSync } from 'node:fs';
9
- import { join, isAbsolute } from 'node:path';
10
- import { homedir } from 'node:os';
11
- import { runExplore } from '../src/standalone/explore-tool.mjs';
12
-
13
- const ROUND = process.argv[2] || 'r0';
14
- const CWD = 'C:/Project/mixdog';
15
-
16
- // Anchor helpers: an anchor line carries a `path:line`. Strict quality =
17
- // expected token must land ON such a line (not merely somewhere in the text),
18
- // and anchors===0 is always a miss (except expectFail). Spot-accuracy verifies
19
- // the referenced file exists and the line number is within the file length.
20
- function anchorLinesOf(text) {
21
- return text.split('\n').filter((l) => /:\d+/.test(l));
22
- }
23
- // Variant-aware token matching for the fabricated-line guard. Split
24
- // camelCase and snake_case/kebab joins into atomic sub-tokens, then compare
25
- // on a light stem so plural/verb forms unify (importance/importanceScore/
26
- // chunk_importance -> {importance,score,chunk}; scoring~score, memories~memory).
27
- // Matching is exact stem-equality of sub-tokens (never substring), so it does
28
- // not loosen into generic-word overlap.
29
- function splitSubtokens(s) {
30
- return String(s)
31
- .replace(/([a-z0-9])([A-Z])/g, '$1 $2') // camelCase boundary
32
- .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2') // ACRONYMWord boundary
33
- .split(/[^A-Za-z0-9]+/) // snake_case / kebab / punctuation
34
- .map((t) => t.toLowerCase())
35
- .filter(Boolean);
36
- }
37
- function stemToken(t) {
38
- if (t.length <= 4) return t;
39
- return t
40
- .replace(/ies$/, 'y')
41
- .replace(/(ings|ing|edly|ed|es|ly|s)$/, '')
42
- .replace(/e$/, '');
43
- }
44
- function checkAnchorLine(line, ctxTokens = []) {
45
- const m = line.match(/([A-Za-z0-9_.\/\\-]+):(\d+)/);
46
- if (!m) return null; // no parseable path:line
47
- const p = m[1];
48
- const ln = Number(m[2]);
49
- const full = isAbsolute(p) ? p : join(CWD, p);
50
- if (!existsSync(full)) return false;
51
- try {
52
- const fileLines = readFileSync(full, 'utf8').split('\n');
53
- if (!(ln >= 1 && ln <= fileLines.length)) return false;
54
- // Fabricated-line guard: the cited line's ±2 window must contain a
55
- // query/expected token, so a plausible-but-wrong line number fails.
56
- if (ctxTokens.length) {
57
- // ±2 lines around the 1-based cited line (indices ln-3 .. ln+1 inclusive).
58
- const win = fileLines.slice(Math.max(0, ln - 3), ln + 2).join('\n');
59
- const winStems = [...new Set(splitSubtokens(win).map(stemToken))];
60
- const wantStems = ctxTokens.map((t) => stemToken(t.toLowerCase()));
61
- // Exact stem-equality unifies plural/verb variants; a prefix relation
62
- // additionally bridges derivational forms (compact/compaction) without
63
- // matching generic filler. Guard the bridge so a short generic line
64
- // token can't satisfy a longer wanted token (impl~implementation,
65
- // clas~classifier): require the shorter stem >=5 chars AND a
66
- // shorter/longer length ratio >=0.6.
67
- const prefixBridge = (s, w) => {
68
- if (!(s.startsWith(w) || w.startsWith(s))) return false;
69
- const short = Math.min(s.length, w.length);
70
- const long = Math.max(s.length, w.length);
71
- return short >= 5 && short / long >= 0.6;
72
- };
73
- const hitStem = (w) => winStems.some((s) => s === w || prefixBridge(s, w));
74
- if (!wantStems.some(hitStem)) return false;
75
- }
76
- return true;
77
- } catch { return false; }
78
- }
79
-
80
- // High-fanout timing attribution: emit lightweight per-iteration send_ms
81
- // loop rows (no verbose payload estimate) so we can split LLM send time
82
- // from tool time under the parallel round below. Trace-only; no behavior
83
- // or provider change.
84
- if (!process.env.MIXDOG_AGENT_TRACE_TIMING) process.env.MIXDOG_AGENT_TRACE_TIMING = '1';
85
-
86
- // Representative locator queries with ground truth: expect = substrings, at
87
- // least one must appear in the anchor output (quality hit). expectFail = the
88
- // correct answer is EXPLORATION_FAILED (miss discipline).
89
- const QUERIES = [
90
- {
91
- q: 'where is the tool-call stall watchdog policy resolved and what defaults does it use',
92
- expect: ['agent-progress-watchdog', 'stall-policy'],
93
- },
94
- {
95
- q: 'session compact / smart compact trigger threshold logic',
96
- expect: ['compact'],
97
- },
98
- {
99
- q: 'where are hidden agent tool schema profiles defined (read / read-write-search)',
100
- expect: ['agent-dispatch', 'agents.json', 'internal-agents'],
101
- },
102
- {
103
- q: 'recall memory chunk importance scoring implementation',
104
- expect: ['importance', 'memory'],
105
- },
106
- {
107
- q: 'websocket reconnect backoff handling',
108
- expect: ['openai-oauth-ws', 'retry-classifier'],
109
- },
110
- // ── extended set: symbol-exact, filename, error-string, korean, flow, config ──
111
- {
112
- q: 'buildExplorerPrompt definition', // exact known symbol
113
- expect: ['explore-tool'],
114
- },
115
- {
116
- q: 'where does the explore tool cache results and what is the TTL',
117
- expect: ['explore-tool'],
118
- },
119
- {
120
- q: 'error text "maintenance route unresolved for agent" — where is it thrown',
121
- expect: ['agent-dispatch'],
122
- },
123
- {
124
- q: '\uC5D0\uC774\uC804\uD2B8 \uC138\uC158\uC758 \uCD5C\uB300 \uB8E8\uD504 \uBC18\uBCF5 \uD69F\uC218\uB294 \uC5B4\uB514\uC11C \uC815\uD574\uC838?', // korean concept query
125
- expect: ['agent-loop-policy'],
126
- },
127
- {
128
- q: 'how does a fixed agent slot map to a workflow slot (explore/explorer)',
129
- expect: ['session-runtime/workflow', 'FIXED_AGENT_SLOTS'],
130
- },
131
- {
132
- q: 'where is the mixdog config json file path resolved (data dir)',
133
- expect: ['config', 'plugin-paths'],
134
- },
135
- {
136
- // path-only class: the correct answer is a verified file/dir location on
137
- // disk; a bare path (no :line) is an allowed HIT for this query.
138
- q: 'where does mixdog store background shell job stdout logs on disk',
139
- expect: ['shell-jobs', 'shell-job-paths', 'getShellJobsDir', 'shellJobStdout'],
140
- pathOnly: true,
141
- },
142
- {
143
- q: 'GraphQL schema stitching resolver implementation', // not in this repo
144
- expectFail: true,
145
- },
146
- ];
147
-
148
- function tracePath() {
149
- return process.env.MIXDOG_AGENT_TRACE_PATH
150
- || join(process.env.MIXDOG_DATA_DIR || join(process.env.MIXDOG_HOME || join(homedir(), '.mixdog'), 'data'), 'history', 'agent-trace.jsonl');
151
- }
152
-
153
- function readTraceSince(ts) {
154
- const p = tracePath();
155
- if (!existsSync(p)) return [];
156
- const rows = [];
157
- for (const line of readFileSync(p, 'utf8').split('\n')) {
158
- if (!line) continue;
159
- try {
160
- const r = JSON.parse(line);
161
- // Keep every row since ts; explorer-session attribution happens at
162
- // aggregation time.
163
- if (r.ts >= ts) rows.push(r);
164
- } catch { /* skip */ }
165
- }
166
- return rows;
167
- }
168
-
169
- const t0 = Date.now();
170
- // Parallel round: all queries fire at once. Per-session trace attribution is
171
- // by session_id so counts stay correct; per-query ms includes queueing.
172
- const results = await Promise.all(QUERIES.map(async ({ q, expect, expectFail, pathOnly }) => {
173
- const qt0 = Date.now();
174
- const res = await runExplore({ query: q, cwd: CWD }, { callerCwd: CWD });
175
- const text = res?.content?.[0]?.text || '';
176
- const aLines = anchorLinesOf(text);
177
- const anchors = aLines.length;
178
- const failed = /EXPLORATION_FAILED/.test(text);
179
- // Context tokens for the fabricated-line guard: expanded expected + query
180
- // words, length>=4 to drop filler.
181
- const ctxTokens = [
182
- ...(expect || []).flatMap((e) => e.toLowerCase().split(/[^a-z0-9]+/)),
183
- ...q.toLowerCase().split(/[^a-z0-9]+/),
184
- ].filter((t) => t.length >= 4);
185
- // Spot-check up to 2 anchors per query for file/line validity + line context.
186
- let badAnchors = 0;
187
- for (const l of aLines.slice(0, 2)) {
188
- if (checkAnchorLine(l, ctxTokens) === false) badAnchors++;
189
- }
190
- const allLines = text.split('\n').filter((l) => l.trim());
191
- // Strict hit: expected token must appear ON an anchor line (>=1 anchor). For
192
- // the path-only class, an expected token on any verified path line HITs even
193
- // without :line. expectFail wants EXPLORATION_FAILED with zero anchors.
194
- const hit = expectFail
195
- ? (failed && anchors === 0)
196
- : pathOnly
197
- ? (!failed && (expect || []).some(
198
- (e) => allLines.some((l) => l.toLowerCase().includes(e.toLowerCase())),
199
- ))
200
- : (!failed && anchors > 0 && (expect || []).some(
201
- (e) => aLines.some((l) => l.toLowerCase().includes(e.toLowerCase())),
202
- ));
203
- return { q: q.slice(0, 48), ms: Date.now() - qt0, anchors, failed, hit, badAnchors, bytes: text.length };
204
- }));
205
-
206
- // Identify explorer sessions from trace rows, then attribute both tool calls
207
- // and LLM send time per session.
208
- const rows = readTraceSince(t0);
209
- const explorerSessions = new Set(
210
- rows.filter((r) => r.agent === 'explorer').map((r) => r.session_id)
211
- );
212
- const bySession = new Map();
213
- for (const r of rows) {
214
- if (r.kind !== 'tool' || !explorerSessions.has(r.session_id)) continue;
215
- const s = bySession.get(r.session_id) || { calls: 0, tools: [] };
216
- s.calls++; s.tools.push(r.tool_name);
217
- bySession.set(r.session_id, s);
218
- }
219
- const callCounts = [...bySession.values()].map((s) => s.calls).sort((a, b) => a - b);
220
- const p50 = callCounts[Math.floor(callCounts.length / 2)] ?? 0;
221
-
222
- // LLM send-time attribution from loop rows (kind='loop', send_ms), emitted
223
- // under MIXDOG_AGENT_TRACE_TIMING. Under the parallel round, sends overlap
224
- // wall time, so send/wall > 1 quantifies provider contention.
225
- const sendBySession = new Map();
226
- for (const r of rows) {
227
- if (r.kind !== 'loop' || !explorerSessions.has(r.session_id)) continue;
228
- const cur = sendBySession.get(r.session_id) || { sends: 0, ms: 0 };
229
- cur.sends++; cur.ms += Number(r.send_ms) || 0;
230
- sendBySession.set(r.session_id, cur);
231
- }
232
- const sendMsPer = [...sendBySession.values()].map((s) => s.ms).sort((a, b) => a - b);
233
- const sendTotal = sendMsPer.reduce((a, b) => a + b, 0);
234
- const sendP50 = sendMsPer[Math.floor(sendMsPer.length / 2)] ?? 0;
235
- const sendMax = sendMsPer[sendMsPer.length - 1] ?? 0;
236
- const sendCount = [...sendBySession.values()].reduce((a, s) => a + s.sends, 0);
237
-
238
- console.log(`\n=== explore-bench round=${ROUND} ===`);
239
- for (const r of results) {
240
- console.log(` [${String(r.ms).padStart(6)}ms] ${r.hit ? 'HIT ' : 'MISS'} anchors=${r.anchors} bad=${r.badAnchors} failed=${r.failed} bytes=${r.bytes} ${r.q}`);
241
- }
242
- const badTotal = results.reduce((a, r) => a + r.badAnchors, 0);
243
- console.log(` quality: ${results.filter((r) => r.hit).length}/${results.length} hits (strict) bad-anchors=${badTotal}`);
244
- console.log(` sessions=${bySession.size} toolcalls p50=${p50} max=${callCounts[callCounts.length - 1] ?? 0} total=${callCounts.reduce((a, b) => a + b, 0)}`);
245
- for (const [id, s] of bySession) console.log(` ${id.slice(-8)}: ${s.tools.join(',')}`);
246
- const wallMs = Date.now() - t0;
247
- console.log(` llm-send: sessions=${sendBySession.size} sends=${sendCount} ms/session p50=${sendP50} max=${sendMax} total=${sendTotal}`);
248
- console.log(` wall total=${(wallMs / 1000).toFixed(1)}s send/wall=${wallMs > 0 ? (sendTotal / wallMs).toFixed(2) : '0.00'}x`);