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
@@ -26,6 +26,9 @@ import {
26
26
  MEASURED_TOOL_USAGE,
27
27
  READONLY_TOOL_NAMES,
28
28
  } from './tool-catalog-data.mjs';
29
+ import { toolKind, measuredToolUsage, parseToolSelection, parseToolSearchQuerySelection, measuredToolRank, sortedCatalogByMeasuredUsage, activeToolForSurface, deferredProviderMode, nativeProviderFamily } from './tool-catalog-schema.mjs';
30
+ export { toolKind, toolSchemaBucket, estimateToolSchemaBreakdown, measuredToolUsage, parseToolSelection, parseToolSearchQuerySelection, sortedCatalogByMeasuredUsage } from './tool-catalog-schema.mjs';
31
+ export { resolveProviderRequestTools, snapshotProviderRequestTools } from './provider-request-snapshot.mjs';
29
32
  export {
30
33
  DEFERRED_DEFAULT_FULL_TOOLS,
31
34
  DEFERRED_DEFAULT_LEAD_TOOLS,
@@ -33,486 +36,6 @@ export {
33
36
  MEASURED_TOOL_USAGE,
34
37
  } from './tool-catalog-data.mjs';
35
38
 
36
- const toolSchemaBreakdownMemo = new WeakMap();
37
-
38
- function sameToolSchemaEntries(cached, tools) {
39
- if (!cached || cached.entries.length !== tools.length) return false;
40
- const nativePrefixCount = providerNativeToolPrefixCount(tools);
41
- for (let index = 0; index < tools.length; index += 1) {
42
- const entry = cached.entries[index];
43
- const tool = tools[index];
44
- if (entry.tool !== tool
45
- || entry.name !== tool?.name
46
- || entry.description !== tool?.description
47
- || entry.inputSchema !== tool?.inputSchema
48
- || entry.input_schema !== tool?.input_schema
49
- || entry.parameters !== tool?.parameters
50
- || entry.schema !== tool?.schema
51
- || entry.deferLoading !== tool?.deferLoading
52
- || entry.defer_loading !== tool?.defer_loading
53
- || entry.annotationsMixdogKind !== tool?.annotations?.mixdogKind
54
- || entry.annotationsAgentHidden !== tool?.annotations?.agentHidden
55
- || entry.native !== (index < nativePrefixCount)
56
- || entry.wireSignature !== toolSchemaSignature(toolMeteringList(tool, index < nativePrefixCount))) return false;
57
- }
58
- return true;
59
- }
60
-
61
- function toolMeteringList(tool, native) {
62
- return native ? finalizeProviderRequestTools([tool], 1) : [tool];
63
- }
64
-
65
- function toolSchemaEntry(tool, native = false) {
66
- return {
67
- tool,
68
- name: tool?.name,
69
- description: tool?.description,
70
- inputSchema: tool?.inputSchema,
71
- input_schema: tool?.input_schema,
72
- parameters: tool?.parameters,
73
- schema: tool?.schema,
74
- deferLoading: tool?.deferLoading,
75
- defer_loading: tool?.defer_loading,
76
- annotationsMixdogKind: tool?.annotations?.mixdogKind,
77
- annotationsAgentHidden: tool?.annotations?.agentHidden,
78
- native,
79
- wireSignature: toolSchemaSignature(toolMeteringList(tool, native)),
80
- };
81
- }
82
- export function toolKind(tool) {
83
- const name = clean(tool?.name);
84
- if (name.startsWith('mcp__')) return 'mcp';
85
- if (name.startsWith('skill:') || tool?.annotations?.mixdogKind === 'skill') return 'skill';
86
- if (name === 'Skill' || name.startsWith('skill_') || name === 'skills_list' || name === 'skill_view') return 'skill';
87
- if (tool?.annotations?.agentHidden) return 'control';
88
- if (['apply_patch', 'shell'].includes(name)) return 'mutation';
89
- return 'tool';
90
- }
91
-
92
- export function toolSchemaBucket(tool) {
93
- const name = clean(tool?.name);
94
- const kind = toolKind(tool);
95
- if (kind === 'mcp') return 'mcp';
96
- if (kind === 'skill') return 'skills';
97
- if (name === 'memory' || name === 'recall' || name.includes('memory')) return 'memory';
98
- if (name === 'search' || name === 'web_fetch') return 'web';
99
- if (['read', 'grep', 'find', 'glob', 'list', 'code_graph', 'explore'].includes(name)) return 'code';
100
- if (['shell', 'apply_patch'].includes(name)) return 'mutation';
101
- if (name === 'agent' || name === 'delegate') return 'agents';
102
- if (name === 'session_manage') return 'session';
103
- if (name.includes('channel') || name.includes('discord') || name.includes('webhook')) return 'channels';
104
- if (name.includes('provider') || name === 'load_tool' || name === 'tool_search' || name === 'cwd') return 'setup';
105
- if (kind === 'control') return 'control';
106
- return 'other';
107
- }
108
-
109
- export function estimateToolSchemaBreakdown(tools) {
110
- if (Array.isArray(tools)) {
111
- const cached = toolSchemaBreakdownMemo.get(tools);
112
- if (sameToolSchemaEntries(cached, tools)) return cached.value;
113
- }
114
- const out = {};
115
- const list = Array.isArray(tools) ? tools : [];
116
- const nativePrefixCount = providerNativeToolPrefixCount(list);
117
- for (let index = 0; index < list.length; index += 1) {
118
- const tool = list[index];
119
- const bucket = toolSchemaBucket(tool);
120
- const row = out[bucket] || { count: 0, tokens: 0 };
121
- row.count += 1;
122
- row.tokens += estimateToolSchemaTokens(toolMeteringList(tool, index < nativePrefixCount));
123
- out[bucket] = row;
124
- }
125
- if (Array.isArray(tools)) {
126
- toolSchemaBreakdownMemo.set(tools, {
127
- entries: tools.map((tool, index) => toolSchemaEntry(tool, index < nativePrefixCount)),
128
- value: out,
129
- });
130
- }
131
- return out;
132
- }
133
-
134
- export function measuredToolUsage(name) {
135
- return MEASURED_TOOL_USAGE[clean(name)] || 0;
136
- }
137
-
138
- export function parseToolSelection(value) {
139
- if (Array.isArray(value)) return value.map(clean).filter(Boolean);
140
- if (value && typeof value !== 'string' && typeof value[Symbol.iterator] === 'function') {
141
- return [...value].map(clean).filter(Boolean);
142
- }
143
- return String(value || '').replace(/^select\s*:/i, '')
144
- .split(/[,\s]+/)
145
- .map(clean)
146
- .filter(Boolean);
147
- }
148
-
149
- export function parseToolSearchQuerySelection(query) {
150
- const match = clean(query).match(/^select\s*:\s*(.+)$/i);
151
- return match ? parseToolSelection(match[1]) : [];
152
- }
153
-
154
- function measuredToolRank(name) {
155
- const index = MEASURED_TOOL_ORDER.indexOf(clean(name));
156
- return index === -1 ? Number.MAX_SAFE_INTEGER : index;
157
- }
158
-
159
- export function sortedCatalogByMeasuredUsage(catalog) {
160
- return (catalog || [])
161
- .map((tool, index) => ({ tool, index }))
162
- .sort((a, b) => {
163
- const au = measuredToolUsage(a.tool?.name);
164
- const bu = measuredToolUsage(b.tool?.name);
165
- if (bu !== au) return bu - au;
166
- const ar = measuredToolRank(a.tool?.name);
167
- const br = measuredToolRank(b.tool?.name);
168
- if (ar !== br) return ar - br;
169
- return a.index - b.index;
170
- })
171
- .map((entry) => entry.tool);
172
- }
173
-
174
- function activeToolForSurface(tool) {
175
- if (!tool || typeof tool !== 'object') return tool;
176
- return JSON.parse(JSON.stringify(tool));
177
- }
178
-
179
- function deferredProviderMode(provider) {
180
- const p = clean(provider).toLowerCase();
181
- if (p === 'gemini') return 'manifest';
182
- if (p === 'anthropic' || p === 'anthropic-oauth'
183
- || p === 'openai' || p === 'openai-oauth') {
184
- return 'native';
185
- }
186
- // xAI/Grok and every other OpenAI-compatible backend have no native
187
- // tool_search/tool_search_output contract. Give them one complete canonical
188
- // function array instead of a load-driven array whose bytes churn.
189
- return 'canonical';
190
- }
191
-
192
- function nativeProviderFamily(provider) {
193
- const p = clean(provider).toLowerCase();
194
- if (p === 'openai' || p === 'openai-oauth') return 'openai';
195
- if (p === 'anthropic' || p === 'anthropic-oauth') return 'anthropic';
196
- return '';
197
- }
198
-
199
- const ANTHROPIC_NATIVE_PROVIDERS = new Set(['anthropic', 'anthropic-oauth']);
200
-
201
- // Pure projection of the tool definitions that the next provider request will
202
- // serialize. Anthropic's native deferred surface sends the base active tools
203
- // plus only definitions that have actually been discovered through the
204
- // session/native tool-search history. Every other provider already receives
205
- // its canonical/native surface in `tools`, so preserve that array verbatim.
206
- export function resolveProviderRequestTools({
207
- provider,
208
- tools,
209
- messages,
210
- session,
211
- } = {}) {
212
- const activeTools = Array.isArray(tools) ? tools : [];
213
- const normalizedProvider = clean(provider || session?.provider).toLowerCase();
214
- if (!ANTHROPIC_NATIVE_PROVIDERS.has(normalizedProvider)
215
- || session?.deferredNativeTools !== true
216
- || activeTools.length === 0) {
217
- return activeTools;
218
- }
219
- const discovered = new Set(
220
- parseToolSelection(session?.deferredDiscoveredTools),
221
- );
222
- for (const message of Array.isArray(messages) ? messages : []) {
223
- const native = message?.nativeToolSearch;
224
- const source = clean(native?.provider).toLowerCase();
225
- if (source && source !== normalizedProvider
226
- && !(ANTHROPIC_NATIVE_PROVIDERS.has(source)
227
- && ANTHROPIC_NATIVE_PROVIDERS.has(normalizedProvider))) continue;
228
- for (const name of parseToolSelection(native?.toolReferences)) discovered.add(name);
229
- }
230
- if (discovered.size === 0) return activeTools;
231
- const activeNames = new Set(activeTools.map((tool) => clean(tool?.name)).filter(Boolean));
232
- const catalog = Array.isArray(session?.deferredToolCatalog) ? session.deferredToolCatalog : [];
233
- const deferredTools = catalog
234
- .filter((tool) => {
235
- const name = clean(tool?.name);
236
- return name && discovered.has(name) && !activeNames.has(name);
237
- })
238
- .map((tool) => ({ ...tool, deferLoading: true }));
239
- return deferredTools.length ? [...activeTools, ...deferredTools] : activeTools;
240
- }
241
-
242
- const OMIT_REQUEST_TOOL_VALUE = Symbol('omit-request-tool-value');
243
- const MAX_PROVIDER_SNAPSHOT_ARRAY_LENGTH = 1_000_000;
244
-
245
- function defineEnumerableDataProperty(target, key, value) {
246
- Object.defineProperty(target, key, {
247
- value,
248
- enumerable: true,
249
- configurable: false,
250
- writable: false,
251
- });
252
- }
253
-
254
- function boxedJsonPrimitive(value) {
255
- try { return { matched: true, value: Number.prototype.valueOf.call(value) }; } catch {}
256
- try { return { matched: true, value: String.prototype.valueOf.call(value) }; } catch {}
257
- try { return { matched: true, value: Boolean.prototype.valueOf.call(value) }; } catch {}
258
- try { return { matched: true, value: BigInt.prototype.valueOf.call(value) }; } catch {}
259
- return { matched: false, value: null };
260
- }
261
-
262
- function providerSnapshotLengthPrimitive(value) {
263
- if ((typeof value !== 'object' || value === null) && typeof value !== 'function') return value;
264
- const exotic = value[Symbol.toPrimitive];
265
- if (exotic !== undefined && exotic !== null) {
266
- if (typeof exotic !== 'function') throw new TypeError('invalid length primitive');
267
- const primitive = exotic.call(value, 'number');
268
- if ((typeof primitive === 'object' && primitive !== null) || typeof primitive === 'function') {
269
- throw new TypeError('invalid length primitive');
270
- }
271
- return primitive;
272
- }
273
- for (const methodName of ['valueOf', 'toString']) {
274
- const method = value[methodName];
275
- if (typeof method !== 'function') continue;
276
- const primitive = method.call(value);
277
- if ((typeof primitive !== 'object' || primitive === null) && typeof primitive !== 'function') {
278
- return primitive;
279
- }
280
- }
281
- throw new TypeError('invalid length primitive');
282
- }
283
-
284
- function providerSnapshotArrayLength(rawLength) {
285
- let primitive;
286
- let numeric;
287
- try {
288
- primitive = providerSnapshotLengthPrimitive(rawLength);
289
- if (typeof primitive === 'bigint' || typeof primitive === 'symbol') {
290
- throw new TypeError('invalid length primitive');
291
- }
292
- numeric = Number(primitive);
293
- } catch {
294
- throw new TypeError('provider tool snapshot: invalid array length');
295
- }
296
- if (Number.isNaN(numeric) || numeric <= 0) return 0;
297
- if (!Number.isFinite(numeric)) {
298
- throw new RangeError(
299
- `provider tool snapshot: array length exceeds safe limit ${MAX_PROVIDER_SNAPSHOT_ARRAY_LENGTH}`,
300
- );
301
- }
302
- const effectiveLength = Math.floor(numeric);
303
- if (effectiveLength > MAX_PROVIDER_SNAPSHOT_ARRAY_LENGTH) {
304
- throw new RangeError(
305
- `provider tool snapshot: array length exceeds safe limit ${MAX_PROVIDER_SNAPSHOT_ARRAY_LENGTH}`,
306
- );
307
- }
308
- return effectiveLength;
309
- }
310
-
311
- function normalizeRequestToolJson(value, state, {
312
- arrayEntry = false,
313
- key = '',
314
- applyToJSON = true,
315
- seededProperties = null,
316
- } = {}) {
317
- if (value === null || typeof value === 'string' || typeof value === 'boolean') return value;
318
- if (typeof value === 'number') return Number.isFinite(value) ? value : null;
319
- if (typeof value === 'bigint') {
320
- throw new TypeError('provider tool snapshot: BigInt is not JSON-serializable');
321
- }
322
- if (value === undefined || typeof value === 'function' || typeof value === 'symbol') {
323
- return arrayEntry ? null : OMIT_REQUEST_TOOL_VALUE;
324
- }
325
- if (typeof value !== 'object') {
326
- throw new TypeError(`provider tool snapshot: unsupported JSON value type ${typeof value}`);
327
- }
328
- if (state.active.has(value)) {
329
- throw new TypeError('provider tool snapshot: cyclic value is not JSON-serializable');
330
- }
331
- if (state.memo.has(value)) return state.memo.get(value);
332
-
333
- let capturedProperties = seededProperties;
334
- if (applyToJSON) {
335
- // JSON reads `toJSON` once before serializing an object. Preserve that
336
- // single observation for an own-enumerable non-function (and for a
337
- // callable that returns `this`) so property traversal cannot invoke a
338
- // stateful accessor a second time.
339
- const toJSONDescriptor = Object.getOwnPropertyDescriptor(value, 'toJSON');
340
- const toJSON = value.toJSON;
341
- if (typeof toJSON === 'function') {
342
- // Keep the source guarded through both hook execution and replacement
343
- // normalization. A hook returning itself, or any replacement graph that
344
- // points back to its source, is a JSON cycle rather than another hook
345
- // invocation.
346
- state.active.add(value);
347
- try {
348
- const replacement = toJSON.call(value, key);
349
- const normalized = normalizeRequestToolJson(replacement, state, {
350
- arrayEntry,
351
- key,
352
- applyToJSON: false,
353
- seededProperties: null,
354
- });
355
- state.memo.set(value, normalized);
356
- return normalized;
357
- } finally {
358
- state.active.delete(value);
359
- }
360
- }
361
- if (toJSONDescriptor?.enumerable) {
362
- capturedProperties = { ...(seededProperties || {}), toJSON };
363
- }
364
- }
365
- const boxed = boxedJsonPrimitive(value);
366
- if (boxed.matched) {
367
- return normalizeRequestToolJson(boxed.value, state, { arrayEntry, key });
368
- }
369
-
370
- const isArray = Array.isArray(value);
371
- const normalized = isArray ? [] : {};
372
- state.active.add(value);
373
- try {
374
- if (isArray) {
375
- // JSON.stringify captures array length once. Accessors may mutate the
376
- // source array, but they cannot extend or shorten this iteration bound.
377
- const rawLength = value.length;
378
- const length = providerSnapshotArrayLength(rawLength);
379
- for (let index = 0; index < length; index += 1) {
380
- const entry = value[index];
381
- normalized.push(normalizeRequestToolJson(entry, state, {
382
- arrayEntry: true,
383
- key: String(index),
384
- }));
385
- }
386
- } else {
387
- // JSON-compatible request schemas are own-enumerable data. Normalize class
388
- // instances/accessors to a plain record, ignore inherited mutable fields,
389
- // and define keys explicitly so an own "__proto__" remains ordinary data.
390
- for (const key of Reflect.ownKeys(value)) {
391
- if (typeof key !== 'string') continue;
392
- const descriptor = Object.getOwnPropertyDescriptor(value, key);
393
- if (!descriptor?.enumerable) continue;
394
- // Deferred catalog selection captures `name` once before touching the
395
- // candidate schema. Seed that captured value here so a stateful/throwing
396
- // getter is never observed a second time during JSON normalization.
397
- const entry = capturedProperties && Object.hasOwn(capturedProperties, key)
398
- ? capturedProperties[key]
399
- : value[key];
400
- const child = normalizeRequestToolJson(entry, state, { key });
401
- if (child !== OMIT_REQUEST_TOOL_VALUE) defineEnumerableDataProperty(normalized, key, child);
402
- }
403
- }
404
- } finally {
405
- state.active.delete(value);
406
- }
407
- Object.freeze(normalized);
408
- state.memo.set(value, normalized);
409
- return normalized;
410
- }
411
-
412
- // Establish one immutable request-attempt snapshot. Nested schema records are
413
- // cloned before freezing, so a catalog refresh or in-place schema mutation
414
- // after this boundary cannot change either provider bytes or their signature.
415
- export function snapshotProviderRequestTools(options = {}) {
416
- const {
417
- provider,
418
- tools,
419
- nativeTools,
420
- messages,
421
- session,
422
- } = options;
423
- const activeTools = Array.isArray(tools) ? tools : [];
424
- const state = { active: new WeakSet(), memo: new WeakMap() };
425
- const snapshots = [];
426
- const names = new Set();
427
- const activeCandidateRefs = new WeakSet();
428
- // Anthropic native definitions are already provider-wire objects. Preserve
429
- // their prior prepend order and duplicate behavior, but freeze the exact
430
- // bytes into the same request snapshot used for accounting and retries.
431
- if (ANTHROPIC_NATIVE_PROVIDERS.has(clean(provider || session?.provider).toLowerCase())) {
432
- for (const nativeTool of Array.isArray(nativeTools) ? nativeTools : []) {
433
- if (!nativeTool || typeof nativeTool !== 'object') continue;
434
- const normalized = normalizeRequestToolJson(nativeTool, state);
435
- if (normalized && typeof normalized === 'object' && !Array.isArray(normalized)) {
436
- snapshots.push(normalized);
437
- }
438
- }
439
- }
440
- const nativePrefixCount = snapshots.length;
441
- const finish = () => finalizeProviderRequestTools(snapshots, nativePrefixCount);
442
- const appendSnapshot = (candidate, selectedName = null, deferred = false) => {
443
- const normalized = normalizeRequestToolJson(candidate, state, {
444
- seededProperties: selectedName === null ? null : { name: selectedName },
445
- });
446
- if (deferred && (
447
- !normalized
448
- || typeof normalized !== 'object'
449
- || Array.isArray(normalized)
450
- || typeof normalized.name !== 'string'
451
- || !clean(normalized.name)
452
- || normalized.name !== selectedName
453
- )) {
454
- throw new TypeError(`provider tool snapshot: selected tool identity mismatch for ${JSON.stringify(selectedName)}`);
455
- }
456
- if (!normalized || typeof normalized !== 'object' || Array.isArray(normalized)) return;
457
- const name = clean(normalized.name);
458
- if (!name || names.has(name)) return;
459
- names.add(name);
460
- if (!deferred) {
461
- snapshots.push(normalized);
462
- return;
463
- }
464
- const deferredSnapshot = {};
465
- for (const key of Object.keys(normalized)) {
466
- if (key === 'deferLoading' || key === 'defer_loading') continue;
467
- defineEnumerableDataProperty(deferredSnapshot, key, normalized[key]);
468
- }
469
- defineEnumerableDataProperty(deferredSnapshot, 'deferLoading', true);
470
- snapshots.push(Object.freeze(deferredSnapshot));
471
- };
472
-
473
- // Active candidates are provider-visible by definition: normalize each once,
474
- // then perform all validation/dedupe from the plain snapshot only.
475
- for (const tool of activeTools) {
476
- if (tool && typeof tool === 'object') activeCandidateRefs.add(tool);
477
- appendSnapshot(tool);
478
- }
479
-
480
- const normalizedProvider = clean(provider || session?.provider).toLowerCase();
481
- if (!ANTHROPIC_NATIVE_PROVIDERS.has(normalizedProvider)
482
- || session?.deferredNativeTools !== true
483
- // Native definitions preserve their historical prepend behavior, but they
484
- // do not make an otherwise all-deferred catalog eligible for expansion.
485
- || names.size === 0) {
486
- return finish();
487
- }
488
- const discovered = new Set(parseToolSelection(session?.deferredDiscoveredTools));
489
- for (const message of Array.isArray(messages) ? messages : []) {
490
- const native = message?.nativeToolSearch;
491
- const source = clean(native?.provider).toLowerCase();
492
- if (source && source !== normalizedProvider
493
- && !(ANTHROPIC_NATIVE_PROVIDERS.has(source)
494
- && ANTHROPIC_NATIVE_PROVIDERS.has(normalizedProvider))) continue;
495
- for (const name of parseToolSelection(native?.toolReferences)) discovered.add(name);
496
- }
497
- if (discovered.size === 0) return finish();
498
-
499
- // Catalog arrays have no separate key map, so `name` is their explicit
500
- // selection key contract: capture it once, skip undiscovered/duplicate
501
- // entries without touching schemas, and seed selected normalization with the
502
- // captured value to avoid a second getter evaluation.
503
- const seenCatalogRefs = new WeakSet();
504
- for (const tool of Array.isArray(session?.deferredToolCatalog) ? session.deferredToolCatalog : []) {
505
- if (tool && typeof tool === 'object') {
506
- if (activeCandidateRefs.has(tool) || seenCatalogRefs.has(tool)) continue;
507
- seenCatalogRefs.add(tool);
508
- }
509
- const capturedName = tool?.name;
510
- const selectionName = typeof capturedName === 'string' ? clean(capturedName) : '';
511
- if (!selectionName || !discovered.has(selectionName) || names.has(selectionName)) continue;
512
- appendSnapshot(tool, capturedName, true);
513
- }
514
- return finish();
515
- }
516
39
 
517
40
  export function filterDisallowedTools(tools, disallowed = []) {
518
41
  if (!Array.isArray(disallowed) || disallowed.length === 0) return tools;
@@ -663,7 +186,7 @@ function setDeferredToolState(session, names) {
663
186
  return selected;
664
187
  }
665
188
 
666
- export function deferredPoolToolNames(session) {
189
+ function deferredPoolToolNames(session) {
667
190
  if (!session || session.deferredProviderMode === 'full'
668
191
  || session.deferredProviderMode === 'manifest'
669
192
  || session.deferredProviderMode === 'canonical') return [];
@@ -876,7 +399,7 @@ export function refreshInitialDeferredMcpSurface(session, liveMcpTools) {
876
399
  }
877
400
 
878
401
  /**
879
- * Turn-boundary reconciliation (Codex-style snapshot + CC-style delta).
402
+ * Turn-boundary reconciliation (full snapshot + delta).
880
403
  * Merge currently-connected MCP tools into session.deferredLateToolCatalog (a
881
404
  * SEPARATE pool from the boot-frozen session.deferredToolCatalog) so tools from
882
405
  * servers that finished their handshake AFTER this session was created become
@@ -1129,7 +652,7 @@ export function selectDeferredTools(session, names, mode, options = {}) {
1129
652
  // query "select:a,b" → legacy query-side loader
1130
653
  // A free-text `query` is NOT a search anymore: it yields no names, and the
1131
654
  // caller is steered back to names[].
1132
- export function parseLoadToolNames(args = {}) {
655
+ function parseLoadToolNames(args = {}) {
1133
656
  const fromNames = parseToolSelection(args.names);
1134
657
  if (fromNames.length) return fromNames;
1135
658
  const fromSelect = parseToolSelection(args.select);
@@ -97,7 +97,7 @@ export const SESSION_MANAGE_TOOL = {
97
97
  };
98
98
 
99
99
  export const LEAD_DISALLOWED_TOOLS = Object.freeze([]);
100
- export const AGENT_HIDDEN_WRAPPER_TOOLS = new Set([]);
100
+ const AGENT_HIDDEN_WRAPPER_TOOLS = new Set([]);
101
101
 
102
102
  export function applyStandaloneToolDefaults(tool) {
103
103
  if (!tool || !AGENT_HIDDEN_WRAPPER_TOOLS.has(tool.name)) return tool;
@@ -44,7 +44,7 @@ export function formatAgentWatchdogSummary(policy, snapshot = null) {
44
44
  return parts.length ? `armed ${parts.join(' ')}` : null;
45
45
  }
46
46
 
47
- export function resolveSilentForSeconds(now, snapshot, runtime) {
47
+ function resolveSilentForSeconds(now, snapshot, runtime) {
48
48
  const last = Math.max(
49
49
  snapshot?.lastProgressAt || 0,
50
50
  runtime?.lastProgressAt || 0,
@@ -75,7 +75,7 @@ export function presetKey(preset) {
75
75
  return clean(preset?.id || preset?.name);
76
76
  }
77
77
 
78
- export function bridgeRouteForStatusline(preset = {}) {
78
+ function bridgeRouteForStatusline(preset = {}) {
79
79
  const provider = clean(preset.provider);
80
80
  const model = clean(preset.model);
81
81
  if (!provider || !model) return null;
@@ -191,7 +191,7 @@ export function compactIso(value) {
191
191
  return text.replace('T', ' ').replace(/\.\d+Z$/, 'Z');
192
192
  }
193
193
 
194
- export function formatElapsedMs(ms) {
194
+ function formatElapsedMs(ms) {
195
195
  const n = Number(ms);
196
196
  if (!Number.isFinite(n) || n < 0) return '';
197
197
  const totalSec = Math.floor(n / 1000);
@@ -162,7 +162,7 @@ function listEntryDirs(dir) {
162
162
 
163
163
  // Single-channel read: resolves `cfg.channel` into the flat shape the
164
164
  // settings/TUI layer consumes.
165
- export function getChannel(config = {}) {
165
+ function getChannel(config = {}) {
166
166
  const cfg = normalizeChannelsConfig(config);
167
167
  const backend = cfg.backend === 'telegram' ? 'telegram' : 'discord';
168
168
  const entry = resolveChannelEntry(cfg);
@@ -325,7 +325,7 @@ const DAY_TOKEN_TO_DOW = {
325
325
  // expression: daily -> '*', weekday -> '1-5', weekend -> '0,6', explicit day
326
326
  // lists ("mon,wed,fri" | "1,3,5") -> comma-joined numbers. Throws on an
327
327
  // unmappable token so bad combos surface instead of silently mis-scheduling.
328
- export function foldDaysIntoCron(cron, days) {
328
+ function foldDaysIntoCron(cron, days) {
329
329
  const parts = String(cron).trim().split(/\s+/);
330
330
  const dowIndex = parts.length - 1;
331
331
  const raw = String(days || '').trim().toLowerCase();
@@ -446,7 +446,7 @@ export async function setScheduleEnabled(name, enabled) {
446
446
  // (webhooks-db.mjs) — the single source of truth. Legacy per-endpoint
447
447
  // WEBHOOK.md + secret folders are imported once at boot and deleted by the
448
448
  // store's migration hook.
449
- export async function listWebhooks() {
449
+ async function listWebhooks() {
450
450
  const endpoints = await dbListEndpoints();
451
451
  return endpoints.map((ep) => ({
452
452
  name: ep.name,
@@ -556,7 +556,7 @@ export async function channelSetup(config = null) {
556
556
  };
557
557
  }
558
558
 
559
- export async function renderChannelStatus(config = null) {
559
+ async function renderChannelStatus(config = null) {
560
560
  const setup = await channelSetup(config);
561
561
  const lines = [];
562
562
  lines.push(`discord ${setup.discord.status}${setup.discord.problem ? ` (${setup.discord.problem})` : ''}`);
@@ -33,14 +33,14 @@ export const EXPLORE_TOOL = {
33
33
  // Total merged-output character cap. The original source uses a very large cap
34
34
  // (50MB) plus a smart-read summariser downstream; the standalone path returns
35
35
  // the merged text in-turn, so we keep a sane bound to protect the Lead context.
36
- export const EXPLORE_OUTPUT_CHAR_CAP = 24_000;
36
+ const EXPLORE_OUTPUT_CHAR_CAP = 24_000;
37
37
  const EXPLORE_TRUNCATION_MARKER = '\n\n[explore: output truncated; narrow cwd or split queries to see more]';
38
38
  // Bound fan-out so a hostile/poisoned query array cannot spawn unbounded subs.
39
39
  export const MAX_FANOUT_QUERIES = 8;
40
40
  // Mechanical turn cap per explorer sub-session: 3 free turns (contract: tool
41
41
  // turn 1 = whole batched search, turns 2-3 = miss recovery), then the agent
42
42
  // loop forces one tool-less final-answer turn. Overridable for tuning.
43
- export const EXPLORE_MAX_LOOP_ITERATIONS = (() => {
43
+ const EXPLORE_MAX_LOOP_ITERATIONS = (() => {
44
44
  const raw = Number(process.env.MIXDOG_EXPLORE_MAX_LOOP);
45
45
  return Number.isFinite(raw) && raw > 0 ? Math.floor(raw) : 3;
46
46
  })();
@@ -528,7 +528,7 @@ function anchorLineExists(line, cwd, captureRe = ANCHOR_PATH_CAPTURE_RE) {
528
528
  try { return existsSync(isAbsolute(p) ? p : resolve(cwd, p)); } catch { return true; }
529
529
  }
530
530
 
531
- export function cleanExplorerText(text, cwd = null) {
531
+ function cleanExplorerText(text, cwd = null) {
532
532
  const raw = String(text || '').trim();
533
533
  if (!raw) return '';
534
534
  const anchors = [];
@@ -35,7 +35,7 @@ function readTrustedProjects(dataDir) {
35
35
  return out;
36
36
  }
37
37
 
38
- export function isProjectTrusted(dataDir, projectDir) {
38
+ function isProjectTrusted(dataDir, projectDir) {
39
39
  if (!projectDir) return false;
40
40
  const abs = resolve(projectDir);
41
41
  const key = process.platform === 'win32' ? abs.toLowerCase() : abs;
@@ -22,7 +22,7 @@ export const USER_PROMPT_TIMEOUT_S = 30;
22
22
  export const MESSAGE_DISPLAY_TIMEOUT_S = 10;
23
23
  export const DEFAULT_PROMPT_TIMEOUT_S = 30;
24
24
  export const DEFAULT_AGENT_TIMEOUT_S = 60;
25
- export const MAX_OUTPUT_CHARS = 10_000;
25
+ const MAX_OUTPUT_CHARS = 10_000;
26
26
  export const MAX_BUFFER_BYTES = 10 * 1024 * 1024;
27
27
 
28
28
  export const TOOL_IF_EVENTS = new Set([
@@ -1,7 +1,7 @@
1
1
  import { compactValue } from './payload.mjs';
2
2
  import { defaultShellKind } from './handlers.mjs';
3
3
 
4
- export function matchesList(pattern, value) {
4
+ function matchesList(pattern, value) {
5
5
  if (pattern == null || pattern === '*' || pattern === 'all') return true;
6
6
  const items = Array.isArray(pattern) ? pattern : [pattern];
7
7
  return items.some((item) => {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * standalone/projects.mjs — user-registered project (cwd) store.
3
3
  *
4
- * Projects are working directories the user explicitly registers (Codex-style).
4
+ * Projects are working directories the user explicitly registers.
5
5
  * There is NO git scanning and NO recent-history auto-import; only entries the
6
6
  * user creates appear here. Persisted as JSON at <MIXDOG_HOME>/projects.json.
7
7
  *