mixdog 0.9.63 → 0.9.65

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 (408) 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/turn-snapshot.mjs +184 -0
  187. package/src/runtime/shared/update-checker.mjs +1 -1
  188. package/src/runtime/shared/user-cwd.mjs +3 -3
  189. package/src/runtime/shared/user-data-guard.mjs +4 -4
  190. package/src/runtime/shared/workspace-router.mjs +5 -5
  191. package/src/session-runtime/config-helpers.mjs +2 -3
  192. package/src/session-runtime/config-lifecycle.mjs +1 -1
  193. package/src/session-runtime/hitch-profile.mjs +1 -1
  194. package/src/session-runtime/lifecycle-api.mjs +6 -4
  195. package/src/session-runtime/model-recency.mjs +5 -5
  196. package/src/session-runtime/plugin-mcp.mjs +1 -1
  197. package/src/session-runtime/provider-request-snapshot.mjs +338 -0
  198. package/src/session-runtime/runtime-core.mjs +4 -0
  199. package/src/session-runtime/session-text.mjs +4 -4
  200. package/src/session-runtime/session-turn-api.mjs +7 -0
  201. package/src/session-runtime/tool-catalog-schema.mjs +197 -0
  202. package/src/session-runtime/tool-catalog.mjs +6 -483
  203. package/src/session-runtime/tool-defs.mjs +1 -1
  204. package/src/standalone/agent-task-status.mjs +1 -1
  205. package/src/standalone/agent-tool/helpers.mjs +2 -2
  206. package/src/standalone/channel-admin.mjs +4 -4
  207. package/src/standalone/explore-tool.mjs +3 -3
  208. package/src/standalone/hook-bus/config.mjs +1 -1
  209. package/src/standalone/hook-bus/constants.mjs +1 -1
  210. package/src/standalone/hook-bus/rules.mjs +1 -1
  211. package/src/standalone/projects.mjs +1 -1
  212. package/src/standalone/provider-admin.mjs +2 -2
  213. package/src/tui/App.jsx +1 -1
  214. package/src/tui/app/app-format.mjs +2 -2
  215. package/src/tui/app/clipboard.mjs +3 -3
  216. package/src/tui/app/input-parsers.mjs +1 -1
  217. package/src/tui/app/text-layout.mjs +1 -1
  218. package/src/tui/app/transcript-row-estimate.mjs +360 -0
  219. package/src/tui/app/transcript-window.mjs +5 -347
  220. package/src/tui/app/use-mouse-input.mjs +1 -1
  221. package/src/tui/app/use-prompt-handlers.mjs +1 -1
  222. package/src/tui/components/tool-execution/surface-detail.mjs +9 -9
  223. package/src/tui/components/tool-execution/text-format.mjs +2 -2
  224. package/src/tui/components/tool-output-format.mjs +7 -7
  225. package/src/tui/display-width.mjs +4 -4
  226. package/src/tui/dist/index.mjs +187 -99
  227. package/src/tui/engine/agent-envelope.mjs +5 -5
  228. package/src/tui/engine/live-share.mjs +100 -0
  229. package/src/tui/engine/notification-plan.mjs +1 -1
  230. package/src/tui/engine/queue-helpers.mjs +3 -3
  231. package/src/tui/engine/render-timing.mjs +4 -5
  232. package/src/tui/engine/session-api-ext.mjs +6 -3
  233. package/src/tui/engine/tool-result-status.mjs +5 -5
  234. package/src/tui/engine/tool-result-text.mjs +1 -1
  235. package/src/tui/engine/transcript-spill.mjs +585 -0
  236. package/src/tui/engine/tui-steering-persist.mjs +1 -1
  237. package/src/tui/engine.mjs +29 -474
  238. package/src/tui/lib/voice-setup.mjs +1 -1
  239. package/src/tui/markdown/format-token.mjs +1 -1
  240. package/src/tui/markdown/render-ansi.mjs +1 -1
  241. package/src/tui/markdown/table-layout.mjs +4 -4
  242. package/src/tui/paste-attachments.mjs +1 -1
  243. package/src/tui/prompt-history-store.mjs +3 -3
  244. package/src/tui/statusline-ansi-bridge.mjs +2 -2
  245. package/src/tui/theme.mjs +1 -1
  246. package/src/tui/transcript-tool-failures.mjs +2 -2
  247. package/src/ui/ansi.mjs +0 -9
  248. package/src/ui/statusline-format.mjs +2 -4
  249. package/scripts/_bench-cwc.json +0 -20
  250. package/scripts/_jitter-fuzz.jsx +0 -42
  251. package/scripts/_jitter-fuzz2.jsx +0 -30
  252. package/scripts/_jitter-probe.jsx +0 -35
  253. package/scripts/_jp2.jsx +0 -16
  254. package/scripts/_smoke_wd.mjs +0 -7
  255. package/scripts/abort-recovery-test.mjs +0 -175
  256. package/scripts/agent-dispatch-abort-compose-test.mjs +0 -31
  257. package/scripts/agent-live-arg-guard-smoke.mjs +0 -20
  258. package/scripts/agent-live-path-suffix-smoke.mjs +0 -34
  259. package/scripts/agent-live-toolcall-args-smoke.mjs +0 -45
  260. package/scripts/agent-loop-policy-test.mjs +0 -37
  261. package/scripts/agent-model-liveness-test.mjs +0 -763
  262. package/scripts/agent-parallel-smoke.mjs +0 -435
  263. package/scripts/agent-route-batch-test.mjs +0 -40
  264. package/scripts/agent-tag-reuse-smoke.mjs +0 -441
  265. package/scripts/agent-terminal-reap-test.mjs +0 -252
  266. package/scripts/agent-trace-io-test.mjs +0 -133
  267. package/scripts/ansi-color-capability-test.mjs +0 -90
  268. package/scripts/anthropic-admission-retry-integration-test.mjs +0 -119
  269. package/scripts/anthropic-maxtokens-test.mjs +0 -119
  270. package/scripts/anthropic-oauth-refresh-race-test.mjs +0 -397
  271. package/scripts/anthropic-transport-policy-test.mjs +0 -726
  272. package/scripts/apply-patch-edit-smoke.mjs +0 -71
  273. package/scripts/arg-guard-test.mjs +0 -93
  274. package/scripts/async-notify-settlement-test.mjs +0 -99
  275. package/scripts/atomic-lock-tryonce-test.mjs +0 -125
  276. package/scripts/background-task-meta-smoke.mjs +0 -38
  277. package/scripts/bench-run.mjs +0 -508
  278. package/scripts/boot-smoke.mjs +0 -137
  279. package/scripts/build-runtime-windows.ps1 +0 -242
  280. package/scripts/channel-daemon-smoke.mjs +0 -1103
  281. package/scripts/code-graph-aggregate-cwd-test.mjs +0 -158
  282. package/scripts/code-graph-disk-hit-test.mjs +0 -290
  283. package/scripts/code-graph-dispatch-test.mjs +0 -96
  284. package/scripts/code-graph-root-federation-test.mjs +0 -273
  285. package/scripts/compact-active-turn-test.mjs +0 -68
  286. package/scripts/compact-file-reattach-test.mjs +0 -88
  287. package/scripts/compact-pressure-test.mjs +0 -788
  288. package/scripts/compact-prior-context-flatten-test.mjs +0 -252
  289. package/scripts/compact-recall-digest-test.mjs +0 -57
  290. package/scripts/compact-smoke.mjs +0 -1017
  291. package/scripts/compact-trigger-migration-smoke.mjs +0 -261
  292. package/scripts/compacted-placeholder-scrub-test.mjs +0 -63
  293. package/scripts/context-mcp-metering-test.mjs +0 -1406
  294. package/scripts/debounced-skills-async-save-test.mjs +0 -57
  295. package/scripts/deferred-tool-loading-test.mjs +0 -250
  296. package/scripts/desktop-session-bridge-test.mjs +0 -1013
  297. package/scripts/dispatch-persist-recovery-test.mjs +0 -141
  298. package/scripts/embedding-worker-exit-test.mjs +0 -76
  299. package/scripts/execution-completion-dedup-test.mjs +0 -205
  300. package/scripts/execution-pending-resume-kick-test.mjs +0 -151
  301. package/scripts/execution-resume-esc-integration-test.mjs +0 -176
  302. package/scripts/explore-bench-tmp.mjs +0 -36
  303. package/scripts/explore-bench.mjs +0 -248
  304. package/scripts/explore-prompt-policy-test.mjs +0 -256
  305. package/scripts/explore-timeout-cancel-test.mjs +0 -345
  306. package/scripts/find-fuzzy-hidden-test.mjs +0 -267
  307. package/scripts/forwarder-rebind-tail-test.mjs +0 -67
  308. package/scripts/freevar-smoke.mjs +0 -98
  309. package/scripts/gemini-provider-test.mjs +0 -1448
  310. package/scripts/generate-oc-icons.mjs +0 -11
  311. package/scripts/grok-oauth-refresh-race-test.mjs +0 -273
  312. package/scripts/headless-pristine-execution-test.mjs +0 -614
  313. package/scripts/hook-bus-test.mjs +0 -552
  314. package/scripts/ingest-pure-conversation-smoke.mjs +0 -175
  315. package/scripts/internal-comms-bench-test.mjs +0 -226
  316. package/scripts/internal-comms-bench.mjs +0 -853
  317. package/scripts/internal-comms-smoke.mjs +0 -277
  318. package/scripts/internal-tools-normalization-test.mjs +0 -62
  319. package/scripts/interrupted-turn-history-test.mjs +0 -399
  320. package/scripts/lead-workflow-smoke.mjs +0 -592
  321. package/scripts/lifecycle-api-test.mjs +0 -137
  322. package/scripts/live-share-test.mjs +0 -148
  323. package/scripts/live-worker-smoke.mjs +0 -333
  324. package/scripts/log-writer-guard-smoke.mjs +0 -131
  325. package/scripts/maintenance-default-routes-test.mjs +0 -164
  326. package/scripts/max-output-recovery-persist-test.mjs +0 -81
  327. package/scripts/max-output-recovery-test.mjs +0 -368
  328. package/scripts/mcp-client-normalization-test.mjs +0 -45
  329. package/scripts/mcp-grace-deferred-test.mjs +0 -225
  330. package/scripts/memory-core-input-test.mjs +0 -167
  331. package/scripts/memory-cycle-routing-test.mjs +0 -111
  332. package/scripts/memory-meta-concurrency-test.mjs +0 -20
  333. package/scripts/memory-pg-recovery-test.mjs +0 -59
  334. package/scripts/memory-rule-contract-test.mjs +0 -93
  335. package/scripts/model-list-sanitize-test.mjs +0 -37
  336. package/scripts/mouse-tracking-restore-smoke.mjs +0 -107
  337. package/scripts/native-edit-wire-test.mjs +0 -152
  338. package/scripts/notify-completion-mirror-test.mjs +0 -73
  339. package/scripts/openai-oauth-refresh-race-test.mjs +0 -120
  340. package/scripts/openai-oauth-ws-1006-retry-test.mjs +0 -954
  341. package/scripts/openai-ws-early-settle-test.mjs +0 -216
  342. package/scripts/output-style-bench.mjs +0 -292
  343. package/scripts/output-style-smoke.mjs +0 -145
  344. package/scripts/parent-abort-link-test.mjs +0 -90
  345. package/scripts/patch-binary-cache-test.mjs +0 -181
  346. package/scripts/path-suffix-test.mjs +0 -57
  347. package/scripts/pending-completion-drop-test.mjs +0 -239
  348. package/scripts/pending-messages-lock-nonblocking-test.mjs +0 -62
  349. package/scripts/pretool-ask-runtime-test.mjs +0 -54
  350. package/scripts/process-lifecycle-test.mjs +0 -461
  351. package/scripts/prompt-immediate-render-test.mjs +0 -89
  352. package/scripts/prompt-input-parity-test.mjs +0 -145
  353. package/scripts/provider-admission-scheduler-test.mjs +0 -681
  354. package/scripts/provider-contract-test.mjs +0 -632
  355. package/scripts/provider-stream-stall-test.mjs +0 -276
  356. package/scripts/provider-toolcall-test.mjs +0 -3063
  357. package/scripts/reactive-compact-persist-smoke.mjs +0 -203
  358. package/scripts/recall-bench.mjs +0 -359
  359. package/scripts/resource-admission-test.mjs +0 -792
  360. package/scripts/result-classification-test.mjs +0 -75
  361. package/scripts/rg-runner-test.mjs +0 -240
  362. package/scripts/routing-corpus-test.mjs +0 -349
  363. package/scripts/sanitize-tool-pairs-test.mjs +0 -260
  364. package/scripts/session-bench-cache-break-test.mjs +0 -102
  365. package/scripts/session-bench.mjs +0 -1708
  366. package/scripts/session-context-bench.mjs +0 -344
  367. package/scripts/session-heartbeat-lifecycle-test.mjs +0 -68
  368. package/scripts/session-ingest-compaction-smoke.mjs +0 -279
  369. package/scripts/session-ingest-smoke.mjs +0 -177
  370. package/scripts/session-orphan-sweep-test.mjs +0 -109
  371. package/scripts/set-effort-config-test.mjs +0 -41
  372. package/scripts/shell-failure-diagnostics-test.mjs +0 -280
  373. package/scripts/shell-hardening-test.mjs +0 -209
  374. package/scripts/shell-jobs-windows-hide-test.mjs +0 -164
  375. package/scripts/ship-mode-test.mjs +0 -98
  376. package/scripts/smoke-loop-failure-summary-test.mjs +0 -38
  377. package/scripts/smoke-loop-failure-summary.mjs +0 -16
  378. package/scripts/smoke-loop-report.mjs +0 -221
  379. package/scripts/smoke-loop.mjs +0 -202
  380. package/scripts/smoke-runtime-negative.ps1 +0 -106
  381. package/scripts/statusline-quota-hysteresis-test.mjs +0 -62
  382. package/scripts/steering-drain-buckets-test.mjs +0 -467
  383. package/scripts/steering-fold-provenance-test.mjs +0 -71
  384. package/scripts/streaming-tail-window-test.mjs +0 -175
  385. package/scripts/submit-commandbusy-race-test.mjs +0 -257
  386. package/scripts/task-bench.mjs +0 -205
  387. package/scripts/terminal-bench-isolation-guards-test.mjs +0 -102
  388. package/scripts/termio-input-smoke.mjs +0 -199
  389. package/scripts/tool-result-hook-test.mjs +0 -48
  390. package/scripts/tool-smoke.mjs +0 -2453
  391. package/scripts/tool-tui-presentation-test.mjs +0 -286
  392. package/scripts/toolcall-args-test.mjs +0 -239
  393. package/scripts/tui-ambiguous-width-test.mjs +0 -113
  394. package/scripts/tui-background-failure-smoke.mjs +0 -73
  395. package/scripts/tui-perf-run.ps1 +0 -26
  396. package/scripts/tui-render-smoke.mjs +0 -90
  397. package/scripts/tui-runtime-load-bench-entry.jsx +0 -608
  398. package/scripts/tui-runtime-load-bench.mjs +0 -50
  399. package/scripts/tui-store-frame-batch-test.mjs +0 -99
  400. package/scripts/tui-transcript-jitter-harness-entry.jsx +0 -383
  401. package/scripts/tui-transcript-perf-test.mjs +0 -934
  402. package/scripts/usage-metrics-epoch-smoke.mjs +0 -114
  403. package/scripts/verify-release-assets-test.mjs +0 -281
  404. package/scripts/web-fetch-routing-test.mjs +0 -158
  405. package/scripts/webhook-smoke.mjs +0 -201
  406. package/scripts/windows-hide-spawn-options-test.mjs +0 -19
  407. package/scripts/worker-notify-rejection-test.mjs +0 -51
  408. 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`);