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
@@ -3,9 +3,9 @@ import { getHiddenAgent } from './internal-agents.mjs';
3
3
  const SECOND_MS = 1000;
4
4
  const MIN_PROVIDER_TIMEOUT_MS = 30_000;
5
5
 
6
- export const STALL_TICK_MS = 15_000;
7
- export const DEFAULT_STALL_WARN_S = 300;
8
- export const DEFAULT_STALL_ABORT_S = 600;
6
+ const STALL_TICK_MS = 15_000;
7
+ const DEFAULT_STALL_WARN_S = 300;
8
+ const DEFAULT_STALL_ABORT_S = 600;
9
9
  // First-byte (no-stream-delta) abort for the agent stall watchdog. A wedged
10
10
  // socket can sit at stage=requesting with zero server events. The 30s deadline
11
11
  // trialed here false-aborted slow high-reasoning first bytes (e.g. gpt-5.5
@@ -13,14 +13,14 @@ export const DEFAULT_STALL_ABORT_S = 600;
13
13
  // with dispatch auto-retry, produced premature aborts + duplicate re-dispatches.
14
14
  // Auto-retry is now removed, so a single
15
15
  // attempt must get a generous first-byte window: 300s (5 min). Env-overridable.
16
- export const DEFAULT_STALL_FIRST_BYTE_ABORT_S = (() => {
16
+ const DEFAULT_STALL_FIRST_BYTE_ABORT_S = (() => {
17
17
  const raw = process.env.MIXDOG_STALL_FIRST_BYTE_ABORT_S;
18
18
  const n = Number.parseInt(raw, 10);
19
19
  if (Number.isFinite(n) && n > 0) return Math.min(Math.max(n, 5), 600);
20
20
  return 300;
21
21
  })();
22
22
 
23
- export function envThresholdSeconds(env = process.env) {
23
+ function envThresholdSeconds(env = process.env) {
24
24
  const raw = env.STALL_TIMEOUT_S;
25
25
  if (!raw) return null;
26
26
  const n = Number.parseInt(raw, 10);
@@ -28,17 +28,17 @@ export function envThresholdSeconds(env = process.env) {
28
28
  return n;
29
29
  }
30
30
 
31
- export function resolveBaseStallThresholds(env = process.env) {
31
+ function resolveBaseStallThresholds(env = process.env) {
32
32
  const abort = envThresholdSeconds(env) ?? DEFAULT_STALL_ABORT_S;
33
33
  const warn = abort > DEFAULT_STALL_WARN_S ? DEFAULT_STALL_WARN_S : Math.floor(abort / 2);
34
34
  return { warn, abort };
35
35
  }
36
36
 
37
37
  const _baseThresholds = resolveBaseStallThresholds();
38
- export const STALL_WARN_S = _baseThresholds.warn;
38
+ const STALL_WARN_S = _baseThresholds.warn;
39
39
  export const STALL_ABORT_S = _baseThresholds.abort;
40
- export const STALL_WARN_MS = STALL_WARN_S * SECOND_MS;
41
- export const STALL_ABORT_MS = STALL_ABORT_S * SECOND_MS;
40
+ const STALL_WARN_MS = STALL_WARN_S * SECOND_MS;
41
+ const STALL_ABORT_MS = STALL_ABORT_S * SECOND_MS;
42
42
 
43
43
  export const PROVIDER_MAX_BEFORE_WARN_MS = Math.max(
44
44
  SECOND_MS,
@@ -78,7 +78,7 @@ export const PROVIDER_GENERATE_TOTAL_TIMEOUT_MS = resolveTimeoutMs(
78
78
  { minMs: PROVIDER_FIRST_BYTE_TIMEOUT_MS, maxMs: PROVIDER_MAX_BEFORE_WARN_MS },
79
79
  );
80
80
 
81
- export const PROVIDER_NONSTREAM_TOTAL_TIMEOUT_MS = resolveTimeoutMs(
81
+ const PROVIDER_NONSTREAM_TOTAL_TIMEOUT_MS = resolveTimeoutMs(
82
82
  ['MIXDOG_NONSTREAM_TOTAL_TIMEOUT_MS', 'MIXDOG_COMPAT_NONSTREAM_TOTAL_TIMEOUT_MS'],
83
83
  480_000,
84
84
  { minMs: PROVIDER_GENERATE_TOTAL_TIMEOUT_MS, maxMs: STALL_ABORT_MS },
@@ -187,7 +187,7 @@ export const PROVIDER_WS_ACQUIRE_TIMEOUT_MS = resolveTimeoutMs(
187
187
  // silently blackholes response.create frames until a downstream timeout. An
188
188
  // idle pooled socket is pinged on this cadence; a reused socket that has been
189
189
  // quiet longer than the stale window is ping-probed before hand-out.
190
- // Gated OFF by default for codex/opencode parity — neither pings model
190
+ // Gated OFF by default for reference-CLI parity — they do not ping model
191
191
  // sockets. Enable with MIXDOG_PROVIDER_WS_PING_ENABLED=1. When disabled, no
192
192
  // liveness interval is armed and the acquire-reuse ping probe is skipped (the
193
193
  // non-OPEN eviction scan still runs); lastAliveAt stamping is harmless.
@@ -29,7 +29,7 @@ function _extractSubstitutionBodies(s) {
29
29
  return out;
30
30
  }
31
31
 
32
- export function injectionBlockTargets(cmd) {
32
+ function injectionBlockTargets(cmd) {
33
33
  const targets = [];
34
34
  const decoded = _decodeAnsiCQuotes(cmd);
35
35
  if (decoded && decoded !== cmd) targets.push(decoded);
@@ -52,7 +52,7 @@ import { resourceAdmission } from '../../../shared/resource-admission.mjs';
52
52
 
53
53
  globalThis.__mixdogBashSessionRuntimeLoaded = true;
54
54
 
55
- // Claude Code parity (refs/claude-code src/utils/timeouts.ts): default 120 s
55
+ // Official-client parity: default 120 s
56
56
  // (2 min), max 600 s (10 min), BASH_DEFAULT_TIMEOUT_MS / BASH_MAX_TIMEOUT_MS
57
57
  // env overrides (max floored at default). Matches the one-shot bash tool
58
58
  // (builtin/bash-tool.mjs): an omitted `timeout` uses the 120 s default bounded
@@ -804,7 +804,7 @@ export async function shutdownBashSessions(reason = 'runtime-close') {
804
804
 
805
805
  // Best-effort cleanup on process exit so orphan bash children don't linger
806
806
  // when the plugin host shuts down. Self-registered exit drain; bare 'exit' hook stays as idempotent backup.
807
- export function drainBashSessions(reason = 'process-exit') {
807
+ function drainBashSessions(reason = 'process-exit') {
808
808
  let closed = 0;
809
809
  for (const id of [..._sessions.keys()]) {
810
810
  if (_killSessionNow(id, reason)) closed += 1;
@@ -79,7 +79,7 @@ function tryCreateLock(lockFile, token) {
79
79
  return true;
80
80
  }
81
81
 
82
- export async function acquireAdvisoryLock(targetPath, { timeoutMs = 5000, pollMs = 25 } = {}) {
82
+ async function acquireAdvisoryLock(targetPath, { timeoutMs = 5000, pollMs = 25 } = {}) {
83
83
  const lockFile = lockFileFor(targetPath);
84
84
  // Ensure parent directory exists before openSync('wx'); the lockfile lives
85
85
  // next to the target, so writes to new files in missing parent dirs would
@@ -23,12 +23,12 @@ export const GREP_CONTEXT_MAX = 200;
23
23
  // explicit requests are honored up to the generic GREP_CONTEXT_MAX; total
24
24
  // output stays bounded by the block clamp, the stream line cap, and the
25
25
  // tool-output byte cap.
26
- export const GREP_CTX_HEAD_LIMIT_MAX = 40;
26
+ const GREP_CTX_HEAD_LIMIT_MAX = 40;
27
27
 
28
28
  // Unbounded (no offset/limit) plain full reads default to this window instead of
29
29
  // pulling the whole file; the read tool's ranged-read footer then hands the
30
30
  // caller the next offset to page with.
31
- export const READ_GUARD_DEFAULT_LIMIT = 800;
31
+ const READ_GUARD_DEFAULT_LIMIT = 800;
32
32
 
33
33
  // Best-effort clamp notice channel: stash a one-line note on the args so a
34
34
  // surfacing consumer can echo it. Underscore-prefixed; ignored by executors.
@@ -57,7 +57,7 @@ function ioTraceDone(event, started, fields = {}) {
57
57
  });
58
58
  }
59
59
 
60
- export function atomicWriteShouldFsync(value) {
60
+ function atomicWriteShouldFsync(value) {
61
61
  if (value === true || value === false) return value;
62
62
  return /^(1|true|yes|on|sync)$/i.test(String(process.env.MIXDOG_ATOMIC_FSYNC || ''));
63
63
  }
@@ -328,7 +328,7 @@ export async function executeBashTool(args, workDir, options = {}) {
328
328
  }
329
329
  // Keep foreground commands on a long tool-owned timeout. The MCP dispatch
330
330
  // layer must not add a shorter fallback ceiling when timeout is omitted.
331
- // Reference-CLI parity (opencode/codex/claude-code): sync-first, no hard
331
+ // Reference-CLI parity: sync-first, no hard
332
332
  // upper ceiling on a caller-provided total timeout. Default 120 s (2 min)
333
333
  // when omitted; BASH_DEFAULT_TIMEOUT_MS / BASH_MAX_TIMEOUT_MS env overrides
334
334
  // bound the blocking window when timeout promotion is available.
@@ -683,156 +683,4 @@ export async function executeBashTool(args, workDir, options = {}) {
683
683
  }
684
684
  }
685
685
 
686
- const TERMINAL_TASK_STATUSES = new Set(['completed', 'failed', 'cancelled']);
687
-
688
- function sleep(ms) {
689
- return new Promise((resolve) => setTimeout(resolve, ms));
690
- }
691
-
692
- function shellJobToTaskStatus(status) {
693
- if (status === 'completed') return 'completed';
694
- if (status === 'cancelled') return 'cancelled';
695
- if (status === 'running') return 'running';
696
- return 'failed';
697
- }
698
-
699
- function refreshShellTask(taskId, { includeRunning = false } = {}) {
700
- const job = peekShellJob(taskId);
701
- if (!job) return null;
702
- const publicResult = shellJobPublicTaskResult(job);
703
- if (job.status !== 'running') {
704
- completeBackgroundTask(taskId, {
705
- status: shellJobToTaskStatus(job.status),
706
- result: publicResult,
707
- resultText: JSON.stringify(publicResult, null, 2),
708
- notify: false,
709
- });
710
- } else if (includeRunning) {
711
- const task = getBackgroundTask(taskId);
712
- if (task) {
713
- task.result = publicResult;
714
- task.resultText = JSON.stringify(publicResult, null, 2);
715
- }
716
- }
717
- return job;
718
- }
719
-
720
- async function waitForGenericTask(taskId, { timeoutMs = 30_000, pollMs = 250, context = {} } = {}) {
721
- const started = Date.now();
722
- const deadline = started + Math.max(0, Number(timeoutMs) || 0);
723
- let task = getBackgroundTask(taskId, { context });
724
- if (!task) return null;
725
- while (task && task.status === 'running' && Date.now() < deadline) {
726
- await sleep(Math.max(25, Number(pollMs) || 250));
727
- task = getBackgroundTask(taskId, { context });
728
- }
729
- return {
730
- task,
731
- waitedMs: Date.now() - started,
732
- waitTimedOut: Boolean(task && task.status === 'running'),
733
- };
734
- }
735
-
736
- function renderTaskCancelSuccess(taskId, task) {
737
- const surface = task?.surface || 'task';
738
- const operation = task?.operation || 'run';
739
- return [
740
- 'status: completed',
741
- `task_id: ${taskId}`,
742
- `cancelled: ${surface}/${operation}`,
743
- ].join('\n');
744
- }
745
-
746
- export async function executeTaskTool(args, options = {}) {
747
- const action = typeof args.action === 'string' ? args.action.toLowerCase() : (args.task_id ? 'wait' : 'list');
748
- if (action === 'list') return renderBackgroundTaskList({ context: options });
749
-
750
- const taskId = typeof args.task_id === 'string' ? args.task_id.trim() : '';
751
- if (!taskId) return 'Error: task_id is required';
752
- // sess_* values are agent/orchestrator session ids, not background shell
753
- // tasks. task only resolves `shell mode=async` tasks, so surface a
754
- // self-correcting hint instead of the bare "task not found" that otherwise
755
- // invites a wrong-tool retry loop.
756
- if (/^sess_/.test(taskId)) {
757
- return `Error: "${taskId}" is an agent/session id, not a background task_id. Agent tasks deliver completion notifications; use agent list/read only for manual recovery.`;
758
- }
759
-
760
- const task = getBackgroundTask(taskId, { context: options });
761
- if (!task) return `Error: task not found: ${taskId}`;
762
- const isShellTask = task.surface === 'shell';
763
-
764
- if (action === 'status' || action === 'read') {
765
- if (isShellTask) refreshShellTask(taskId, { includeRunning: action === 'read' });
766
- const latest = getBackgroundTask(taskId, { context: options }) || task;
767
- return renderBackgroundTask(latest, { includeResult: action === 'read' });
768
- }
769
-
770
- if (action === 'cancel') {
771
- if (isShellTask) {
772
- const job = killShellJob(taskId);
773
- cancelBackgroundShellJobWatch(taskId);
774
- clearShellJobNotifyCtx(taskId);
775
- cancelBackgroundTask(taskId, 'cancelled by task control');
776
- return job ? renderTaskCancelSuccess(taskId, getBackgroundTask(taskId, { context: options }) || task) : buildJobNotFoundMessage(taskId);
777
- }
778
- cancelBackgroundTask(taskId, 'cancelled by task control');
779
- return renderTaskCancelSuccess(taskId, getBackgroundTask(taskId, { context: options }) || task);
780
- }
781
-
782
- if (action !== 'wait') {
783
- return `Error: task action must be one of list|status|read|wait|cancel (got ${JSON.stringify(args.action)})`;
784
- }
785
-
786
- if (!isShellTask) {
787
- const waited = await waitForGenericTask(taskId, {
788
- timeoutMs: typeof args.timeout_ms === 'number' ? args.timeout_ms : 30_000,
789
- pollMs: typeof args.poll_ms === 'number' ? args.poll_ms : 250,
790
- context: options,
791
- });
792
- if (!waited?.task) return `Error: task not found: ${taskId}`;
793
- const rendered = renderBackgroundTask(waited.task, { includeResult: TERMINAL_TASK_STATUSES.has(waited.task.status) });
794
- return waited.waitTimedOut ? `${rendered}\nwait_timed_out: true\nwaited_ms: ${waited.waitedMs}` : rendered;
795
- }
796
- // Register as a synchronous waiter and cancel the armed watcher BEFORE
797
- // awaiting: the caller consumes the outcome via task wait, so no async
798
- // push is wanted, and cancelling up front closes the race where the armed
799
- // watcher (watch callback or 2s poll) fires during the await window. The
800
- // persistent notify ctx survives the cancel for a possible re-arm.
801
- beginShellJobWait(taskId);
802
- cancelBackgroundShellJobWatch(taskId);
803
- try {
804
- const job = await waitForShellJob(taskId, {
805
- timeoutMs: typeof args.timeout_ms === 'number' ? args.timeout_ms : 30_000,
806
- pollMs: typeof args.poll_ms === 'number' ? args.poll_ms : 250,
807
- });
808
- if (!job) return buildJobNotFoundMessage(taskId);
809
- if (job.status !== 'running') {
810
- const publicResult = shellJobPublicTaskResult(job);
811
- completeBackgroundTask(taskId, {
812
- status: shellJobToTaskStatus(job.status),
813
- result: publicResult,
814
- resultText: JSON.stringify(publicResult, null, 2),
815
- notify: false,
816
- });
817
- }
818
- const latest = getBackgroundTask(taskId, { context: options }) || task;
819
- const rendered = renderBackgroundTask(latest, { includeResult: job.status !== 'running' });
820
- return job.status === 'running' ? `${rendered}\nwait_timed_out: true\nwaited_ms: ${job.waitedMs}` : rendered;
821
- } finally {
822
- // Only the LAST concurrent waiter (post-decrement count 0) may re-arm,
823
- // and only for a still-running job (timed-out wait). Re-arm with no ctx
824
- // arg — watchBackgroundShellJob falls back to the persistent ctx. This
825
- // prevents the concurrent-waiter double-deliver: while any other waiter
826
- // is still synchronously consuming the outcome, the watcher stays off.
827
- const remaining = endShellJobWait(taskId);
828
- if (remaining === 0) {
829
- const latest = peekShellJob(taskId);
830
- if (latest && latest.status === 'running') watchBackgroundShellJob(taskId);
831
- // LAST waiter out and the job already finished — the outcome was
832
- // consumed synchronously, so no re-arm. Drop the persisted ctx here
833
- // or it leaks (cleanup only runs on a real watcher settle, which
834
- // never happens for a never-re-armed entry).
835
- else clearShellJobNotifyCtx(taskId);
836
- }
837
- }
838
- }
686
+ export { executeTaskTool } from './task-tool.mjs';
@@ -79,7 +79,7 @@ function bumpPathMutationGeneration(path) {
79
79
  }
80
80
  }
81
81
 
82
- export function getPathMutationGeneration(path) {
82
+ function getPathMutationGeneration(path) {
83
83
  const key = canonicalCachePath(path);
84
84
  let generation = PATH_MUTATION_GLOBAL_GENERATION;
85
85
  for (const [changedPath, value] of PATH_MUTATION_GENERATIONS) {
@@ -6,7 +6,7 @@ import {
6
6
  resolveAgainstCwd,
7
7
  } from './path-utils.mjs';
8
8
 
9
- export function literalPathHint(rawPath) {
9
+ function literalPathHint(rawPath) {
10
10
  const s = String(rawPath || '');
11
11
  if (/\$env:[A-Za-z_][A-Za-z0-9_]*|\$[A-Za-z_][A-Za-z0-9_]*|%[^%]+%/.test(s)) {
12
12
  return ' Path fields do not expand shell environment variables; pass the resolved absolute path.';
@@ -12,7 +12,7 @@
12
12
  // logic is unchanged; we only refuse to enter it when the path is unreachable.
13
13
  import { stat } from 'node:fs/promises';
14
14
 
15
- export const FS_REACHABILITY_DEADLINE_MS = 5000;
15
+ const FS_REACHABILITY_DEADLINE_MS = 5000;
16
16
 
17
17
  // Resolve true when the path is reachable (exists OR cleanly absent — ENOENT,
18
18
  // EACCES, etc. are "the FS answered", let the real sync logic produce its own
@@ -85,7 +85,7 @@ function prepareFuzzyScore(query) {
85
85
  * @param {string} str candidate path (relative)
86
86
  * @returns {number|null} score, or null if `query` is not a subsequence
87
87
  */
88
- export function fuzzyScore(query, str) {
88
+ function fuzzyScore(query, str) {
89
89
  const scorer = prepareFuzzyScore(query);
90
90
  return typeof scorer === 'function' ? scorer(str) : scorer;
91
91
  }
@@ -124,7 +124,7 @@ export const NOISE_DIR_NAMES = new Set([
124
124
  '.gradle',
125
125
  ]);
126
126
 
127
- export const MAX_WALK_ENTRIES = 200_000;
127
+ const MAX_WALK_ENTRIES = 200_000;
128
128
 
129
129
  // Unified directory walk used by list / tree / find_files. The visitor
130
130
  // callback owns the "should I record this entry?" decision; returning
@@ -2,7 +2,7 @@
2
2
  // chain so that overlapping calls for the same file are serialised in-process.
3
3
  const editLocks = new Map();
4
4
 
5
- export function pathLockKey(absPath) {
5
+ function pathLockKey(absPath) {
6
6
  const text = String(absPath || '');
7
7
  return process.platform === 'win32' ? text.toLowerCase() : text;
8
8
  }
@@ -35,7 +35,7 @@ export function posixPathToWindowsPath(posixPath) {
35
35
  // a literal under WSL — the drive surfaces at `/mnt/<letter>/...`. Map
36
36
  // `<drive>:` → `/mnt/<lowercase-drive>` and flip backslashes to slashes. Only
37
37
  // drive-letter paths are touched; anything else is returned unchanged.
38
- export function windowsPathToPosixPath(winPath) {
38
+ function windowsPathToPosixPath(winPath) {
39
39
  if (typeof winPath !== 'string') return winPath;
40
40
  const m = winPath.match(/^([a-zA-Z]):[\\/](.*)$/);
41
41
  if (m) return `/mnt/${m[1].toLowerCase()}/${m[2].replace(/\\/g, '/')}`;
@@ -6,7 +6,7 @@ export function parseReadLineNumberArg(value) {
6
6
  return Number.isFinite(n) && n > 0 ? Math.trunc(n) : null;
7
7
  }
8
8
 
9
- export function parseReadPathLineSpec(rawPath) {
9
+ function parseReadPathLineSpec(rawPath) {
10
10
  if (typeof rawPath !== 'string' || rawPath.length === 0) return null;
11
11
  const text = rawPath.trim();
12
12
  let m = /^(.+?)#L(\d+)(?:-L?(\d+))?(?:\b.*)?$/i.exec(text);
@@ -23,7 +23,7 @@ export function parseReadPathLineSpec(rawPath) {
23
23
  return { path: m[1], lineNo, endLine, inverted, invertedEnd: inverted ? endLineRaw : null };
24
24
  }
25
25
 
26
- export function resolveExistingPathLineCoordinate(rawPath, workDir) {
26
+ function resolveExistingPathLineCoordinate(rawPath, workDir) {
27
27
  const spec = parseReadPathLineSpec(rawPath);
28
28
  if (!spec) return null;
29
29
  const normalizedRawPath = normalizeInputPath(rawPath);
@@ -18,8 +18,7 @@ export const SMART_READ_TAIL_LINES = _readEnvInt('MIXDOG_READ_TAIL_LINES', 400);
18
18
  // floor mostly fired on full:true mid-size reads where the advisory was pure
19
19
  // tail bloat. Raised to 40 KB to keep the guidance only where re-reading a big
20
20
  // file actually hurts.
21
- export const READ_CONTEXT_ADVISORY_BYTES = 40 * 1024;
22
- export const READ_MAX_RENDERED_LINE_CHARS = 2_000;
21
+ const READ_MAX_RENDERED_LINE_CHARS = 2_000;
23
22
  // The read line-prefix separator is `→` (the `→`
24
23
  // arrow), matching default cat -n format `<n>→<content>`. It
25
24
  // MUST be a NON-WHITESPACE glyph: a tab/space separator collides with the
@@ -84,7 +83,7 @@ export function appendReadContextAdvisory(out, { filePath: _filePath, lineCount:
84
83
  return out;
85
84
  }
86
85
 
87
- export function formatPaginationHint(remaining, nextOffset) {
86
+ function formatPaginationHint(remaining, nextOffset) {
88
87
  const n = Number(remaining);
89
88
  const label = Number.isFinite(n) && n > 0 ? `${n} more entries` : 'more entries';
90
89
  return `... [${label}; next offset: ${nextOffset}]`;
@@ -13,13 +13,13 @@
13
13
  // that stays under that cap after the 4/3 base64 inflation.
14
14
  export const API_IMAGE_MAX_BASE64_SIZE = 5 * 1024 * 1024; // 5 MB
15
15
  export const IMAGE_TARGET_RAW_SIZE = (API_IMAGE_MAX_BASE64_SIZE * 3) / 4; // 3.75 MB
16
- export const IMAGE_MAX_WIDTH = 2000;
17
- export const IMAGE_MAX_HEIGHT = 2000;
16
+ const IMAGE_MAX_WIDTH = 2000;
17
+ const IMAGE_MAX_HEIGHT = 2000;
18
18
  // Token budget for a single image. est tokens = base64.length * 0.125 (CC's
19
19
  // per-image heuristic). Default aligns to the 5MB base64 API ceiling so the
20
20
  // dimension/raw-size resize governs the common case and the token gate only
21
21
  // fires on pathologically dense images.
22
- export const DEFAULT_IMAGE_MAX_TOKENS = Math.ceil(API_IMAGE_MAX_BASE64_SIZE * 0.125);
22
+ const DEFAULT_IMAGE_MAX_TOKENS = Math.ceil(API_IMAGE_MAX_BASE64_SIZE * 0.125);
23
23
 
24
24
  // Cached dynamic import. Resolves to the sharp factory or null (absent /
25
25
  // failed). Cached so repeated reads don't re-attempt a failing import.
@@ -39,7 +39,7 @@ async function loadSharp() {
39
39
  }
40
40
 
41
41
  // True when sharp resolved; used for the per-file change summary / fallback note.
42
- export async function sharpAvailable() {
42
+ async function sharpAvailable() {
43
43
  return (await loadSharp()) !== null;
44
44
  }
45
45
 
@@ -106,7 +106,7 @@ export function readPathStringGuardError(filePath, workDir) {
106
106
  }
107
107
 
108
108
  /** Post-stat / symlink guards. Returns error message or null. */
109
- export function readPathStatGuardError(userPath, fullPath, st) {
109
+ function readPathStatGuardError(userPath, fullPath, st) {
110
110
  if (isSpecialFileStat(st)) {
111
111
  return `cannot read special file (FIFO / character / block device / socket): ${normalizeOutputPath(userPath)}`;
112
112
  }
@@ -225,7 +225,7 @@ export async function streamReadRange(fullPath, offset, limit, stHint = null, ho
225
225
  return { text: out, firstEmitted, lastEmitted, prefixHash };
226
226
  }
227
227
 
228
- export function tryWindowedSmartReadSummary(fullPath, st, source = 'read_smart_stream', hooks = {}) {
228
+ function tryWindowedSmartReadSummary(fullPath, st, source = 'read_smart_stream', hooks = {}) {
229
229
  const { ioTraceStart, ioTraceDone } = streamingHooks(hooks);
230
230
  const displayPath = hooks.displayPath || fullPath;
231
231
  const traceStart = ioTraceStart();
@@ -81,7 +81,7 @@ function _walkRgArgs(argsList, visit) {
81
81
  // is the NEXT arg, short-attached (`-j8`), and long-attached (`--threads=8`).
82
82
  // Used by both the _withRgThreads injection guard and the EAGAIN retry guard
83
83
  // so the two never disagree.
84
- export function _hasRgThreadArg(argsList) {
84
+ function _hasRgThreadArg(argsList) {
85
85
  let found = false;
86
86
  _walkRgArgs(argsList, (a, _index, _valueIndex, options) => {
87
87
  if (!options || typeof a !== 'string') return;
@@ -121,7 +121,7 @@ export function _rgEagainRetryArgs(argsList) {
121
121
  // retry would change nothing. Matches the separated `-j 1` / `--threads 1` form
122
122
  // and the attached `-j1` / `--threads=1` form. Any other thread pin (e.g. -j8)
123
123
  // is NOT "single-thread pinned": the retry should still run and downshift it.
124
- export function _isRgSingleThreadPinned(argsList) {
124
+ function _isRgSingleThreadPinned(argsList) {
125
125
  let found = false;
126
126
  _walkRgArgs(argsList, (a, _index, valueIndex, options) => {
127
127
  if (!options || typeof a !== 'string') return;
@@ -65,7 +65,7 @@ export function stripEmbeddedPathQuotes(p) {
65
65
  // must not trigger same-basename guidance or the BFS scan.
66
66
  const NOT_FOUND_CODES = new Set(['ENOENT', 'ENOTDIR']);
67
67
 
68
- export const ENOENT_FIND_NUDGE = 'Locate with find on the basename before retrying.';
68
+ const ENOENT_FIND_NUDGE = 'Locate with find on the basename before retrying.';
69
69
 
70
70
  // Per-invocation memo for the ENOENT recovery fs scans. A single grep/glob
71
71
  // ENOENT surfaces the SAME missing path through tryReadFamilyEnoentRedirect
@@ -109,7 +109,7 @@ function nearestExistingParentRel(workDir, missingPath) {
109
109
  return null;
110
110
  }
111
111
 
112
- export function spaceJoinedPathHint(requestedPath) {
112
+ function spaceJoinedPathHint(requestedPath) {
113
113
  if (typeof requestedPath !== 'string') return '';
114
114
  const trimmed = requestedPath.trim();
115
115
  if (!/\s/.test(trimmed)) return '';
@@ -118,7 +118,7 @@ export function spaceJoinedPathHint(requestedPath) {
118
118
  return ' Pass multiple scopes as path[] array (not a space-joined string).';
119
119
  }
120
120
 
121
- export function appendEnoentFindNudge(text = '') {
121
+ function appendEnoentFindNudge(text = '') {
122
122
  const base = String(text || '');
123
123
  if (base.includes(ENOENT_FIND_NUDGE)) return base;
124
124
  const sep = base.length && !/\s$/.test(base) ? ' ' : '';
@@ -130,7 +130,7 @@ export function finalizeReadFamilyEnoentTail(hint, requestedPath, errCode = 'ENO
130
130
  return appendEnoentFindNudge(String(hint || '') + spaceJoinedPathHint(requestedPath));
131
131
  }
132
132
 
133
- export function resolveUniqueEnoentRedirect(workDir, missingPath, errCode = 'ENOENT', cache = null) {
133
+ function resolveUniqueEnoentRedirect(workDir, missingPath, errCode = 'ENOENT', cache = null) {
134
134
  if (!NOT_FOUND_CODES.has(String(errCode || 'ENOENT'))) return null;
135
135
  const suffixHit = cachedSuffixStrip(workDir, missingPath, cache);
136
136
  if (suffixHit) return suffixHit;
@@ -143,7 +143,7 @@ export function resolveUniqueEnoentRedirect(workDir, missingPath, errCode = 'ENO
143
143
  return null;
144
144
  }
145
145
 
146
- export function redirectedFromPrefix(requestedPath) {
146
+ function redirectedFromPrefix(requestedPath) {
147
147
  return `[redirected from ${normalizeOutputPath(requestedPath)}]\n`;
148
148
  }
149
149
 
@@ -761,7 +761,7 @@ export async function analyzeShellCommandEffects(command, cwd) {
761
761
  // its deadline. Only the first top-level segment is considered — sleeps inside
762
762
  // pipelines/subshells/scripts are legitimate pacing and pass through. Float
763
763
  // durations (sleep 0.5) are allowed, mirroring the reference CLI.
764
- export function detectBlockedSleepPattern(command) {
764
+ function detectBlockedSleepPattern(command) {
765
765
  const cmd = String(command || '').trim();
766
766
  if (!cmd) return null;
767
767
  const sep = cmd.match(/&&|\|\||;|\|/);
@@ -13,7 +13,7 @@ const SHELL_JOB_SPILL_KEEP_BYTES = 4 * 1024 * 1024;
13
13
  // Tail-trim a single spill log in place: if it exceeds maxBytes, rewrite it
14
14
  // keeping only the last keepBytes. Sync, best-effort, no-op on a missing file.
15
15
  // Mirrors rotateBoundedLog in src/lib/mixdog-debug.cjs. Returns true if trimmed.
16
- export function trimShellJobSpillFile(filePath, maxBytes = SHELL_JOB_SPILL_MAX_BYTES, keepBytes = SHELL_JOB_SPILL_KEEP_BYTES) {
16
+ function trimShellJobSpillFile(filePath, maxBytes = SHELL_JOB_SPILL_MAX_BYTES, keepBytes = SHELL_JOB_SPILL_KEEP_BYTES) {
17
17
  try {
18
18
  const st = statSync(filePath);
19
19
  if (st.size <= maxBytes) return false;
@@ -214,7 +214,7 @@ export function shellJobEnforcedPath(jobId) { return join(getShellJobsDir(), `${
214
214
  // precede its per-tick scan cap — otherwise other sessions' newer jobs evict
215
215
  // this session's live jobs before filtering. Swept alongside the other
216
216
  // artefacts.
217
- export function shellJobOwnerPath(jobId, pid) { return join(getShellJobsDir(), `${jobId}.owner-${pid}`); }
217
+ function shellJobOwnerPath(jobId, pid) { return join(getShellJobsDir(), `${jobId}.owner-${pid}`); }
218
218
 
219
219
  // Resolve the CLI host pid that owns a freshly-spawned job. Standalone CLI
220
220
  // execution is process-owned: background tasks are scoped to this CLI lifetime,
@@ -20,7 +20,7 @@ export function isPidAlive(pid) {
20
20
  // detached group. Windows has no process-group probe in Node; the root PID is
21
21
  // the strongest non-invasive lifecycle signal available here (tree-kill still
22
22
  // uses taskkill /T).
23
- export function isProcessTreeAlive(pid) {
23
+ function isProcessTreeAlive(pid) {
24
24
  if (!Number.isFinite(pid) || pid <= 0) return false;
25
25
  if (process.platform === 'win32') return isPidAlive(pid);
26
26
  try {
@@ -301,7 +301,7 @@ export function _killLiveJobPid(pid, { sync = false } = {}) {
301
301
  return false;
302
302
  }
303
303
  }
304
- export function _sweepLiveJobsSync() {
304
+ function _sweepLiveJobsSync() {
305
305
  for (const pid of _liveJobPids) {
306
306
  _killLiveJobPid(pid, { sync: true });
307
307
  }