mixdog 0.9.63 → 0.9.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (403) hide show
  1. package/README.md +3 -0
  2. package/package.json +9 -2
  3. package/scripts/code-graph-description-contract.mjs +3 -3
  4. package/scripts/verify-release-assets.mjs +2 -2
  5. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +11 -14
  6. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +6 -6
  7. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -2
  8. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
  9. package/src/runtime/agent/orchestrator/config.mjs +19 -124
  10. package/src/runtime/agent/orchestrator/context/collect.mjs +6 -6
  11. package/src/runtime/agent/orchestrator/dispatch-persist.mjs +2 -2
  12. package/src/runtime/agent/orchestrator/internal-agents.mjs +2 -2
  13. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +1 -1
  14. package/src/runtime/agent/orchestrator/mcp/client.mjs +4 -4
  15. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +2 -2
  16. package/src/runtime/agent/orchestrator/providers/anthropic-betas.mjs +4 -4
  17. package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +2 -2
  18. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +4 -4
  19. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +333 -0
  20. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +2 -2
  21. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -4
  22. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +1 -1
  23. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +3 -277
  24. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +2 -2
  25. package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +1 -1
  26. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +2 -2
  27. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +6 -6
  28. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +196 -0
  29. package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +460 -0
  30. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +14 -593
  31. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +1 -1
  32. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +1 -1
  33. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +1 -1
  34. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +4 -4
  35. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2 -2
  36. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +5 -280
  37. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +357 -0
  38. package/src/runtime/agent/orchestrator/providers/openai-ws-headers.mjs +216 -0
  39. package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +2 -188
  40. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +2 -2
  41. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +2 -2
  42. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +1 -1
  43. package/src/runtime/agent/orchestrator/providers/provider-catalog-cache.mjs +1 -1
  44. package/src/runtime/agent/orchestrator/providers/registry.mjs +1 -1
  45. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +2 -2
  46. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +1 -1
  47. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +1 -1
  48. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +3 -3
  49. package/src/runtime/agent/orchestrator/session/compact/budget.mjs +2 -2
  50. package/src/runtime/agent/orchestrator/session/compact/file-reattach.mjs +2 -2
  51. package/src/runtime/agent/orchestrator/session/compact/summary-schema.mjs +1 -1
  52. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +1 -1
  53. package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +2 -2
  54. package/src/runtime/agent/orchestrator/session/context-utils.mjs +4 -4
  55. package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +1 -1
  56. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +17 -0
  57. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +1 -1
  58. package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +18 -26
  59. package/src/runtime/agent/orchestrator/session/loop/termination.mjs +1 -1
  60. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +3 -3
  61. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +1 -0
  62. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
  63. package/src/runtime/agent/orchestrator/session/manager/delivered-completions.mjs +1 -1
  64. package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +1 -1
  65. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +49 -0
  66. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +49 -0
  67. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +260 -0
  68. package/src/runtime/agent/orchestrator/session/store/serialize.mjs +72 -0
  69. package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +163 -0
  70. package/src/runtime/agent/orchestrator/session/store/write-guards.mjs +1 -1
  71. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +1 -1
  72. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +4 -1
  73. package/src/runtime/agent/orchestrator/session/store.mjs +9 -561
  74. package/src/runtime/agent/orchestrator/session/tool-envelope.mjs +1 -1
  75. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +2 -2
  76. package/src/runtime/agent/orchestrator/stall-policy.mjs +11 -11
  77. package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +1 -1
  78. package/src/runtime/agent/orchestrator/tools/bash-session.mjs +2 -2
  79. package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +1 -1
  80. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +2 -2
  81. package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +1 -1
  82. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +2 -154
  83. package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +1 -1
  84. package/src/runtime/agent/orchestrator/tools/builtin/cwd-utils.mjs +1 -1
  85. package/src/runtime/agent/orchestrator/tools/builtin/fs-reachability.mjs +1 -1
  86. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +1 -1
  87. package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +1 -1
  88. package/src/runtime/agent/orchestrator/tools/builtin/path-locks.mjs +1 -1
  89. package/src/runtime/agent/orchestrator/tools/builtin/path-utils.mjs +1 -1
  90. package/src/runtime/agent/orchestrator/tools/builtin/read-args.mjs +2 -2
  91. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +2 -3
  92. package/src/runtime/agent/orchestrator/tools/builtin/read-image-resize.mjs +4 -4
  93. package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +1 -1
  94. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +1 -1
  95. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +2 -2
  96. package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +5 -5
  97. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +1 -1
  98. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-paths.mjs +2 -2
  99. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-process.mjs +2 -2
  100. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-spawn.mjs +519 -0
  101. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +5 -449
  102. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-helpers.mjs +1 -1
  103. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +212 -0
  104. package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -1
  105. package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +1 -7
  106. package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +9 -36
  107. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +15 -3
  108. package/src/runtime/agent/orchestrator/tools/code-graph/search-references.mjs +429 -0
  109. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +2 -395
  110. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +2 -2
  111. package/src/runtime/agent/orchestrator/tools/code-graph/text-mask.mjs +1 -1
  112. package/src/runtime/agent/orchestrator/tools/code-graph/trusted-roots.mjs +1 -1
  113. package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
  114. package/src/runtime/agent/orchestrator/tools/code-graph-state.mjs +3 -3
  115. package/src/runtime/agent/orchestrator/tools/mutation-planner.mjs +5 -5
  116. package/src/runtime/agent/orchestrator/tools/next-call-utils.mjs +1 -1
  117. package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +1 -1
  118. package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +7 -7
  119. package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +72 -9
  120. package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +4 -4
  121. package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +1 -1
  122. package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +1 -1
  123. package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +4 -4
  124. package/src/runtime/agent/orchestrator/tools/patch.mjs +1 -1
  125. package/src/runtime/agent/orchestrator/tools/result-compression.mjs +3 -3
  126. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +2 -444
  127. package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +505 -0
  128. package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +2 -2
  129. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +1 -1
  130. package/src/runtime/channels/lib/backend-dispatch.mjs +20 -5
  131. package/src/runtime/channels/lib/scheduler.mjs +1 -1
  132. package/src/runtime/channels/lib/telegram-format.mjs +1 -1
  133. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +4 -4
  134. package/src/runtime/channels/tool-defs.mjs +2 -3
  135. package/src/runtime/memory/index.mjs +1 -5
  136. package/src/runtime/memory/lib/core-memory-candidates.mjs +357 -0
  137. package/src/runtime/memory/lib/core-memory-store.mjs +7 -357
  138. package/src/runtime/memory/lib/cycle-signatures.mjs +1 -1
  139. package/src/runtime/memory/lib/embedding-model-config.mjs +1 -1
  140. package/src/runtime/memory/lib/embedding-provider.mjs +1 -5
  141. package/src/runtime/memory/lib/embedding-worker.mjs +1 -5
  142. package/src/runtime/memory/lib/ko-morph.mjs +2 -2
  143. package/src/runtime/memory/lib/memory-config-flags.mjs +2 -5
  144. package/src/runtime/memory/lib/memory-cycle-requests.mjs +3 -7
  145. package/src/runtime/memory/lib/memory-cycle1.mjs +4 -8
  146. package/src/runtime/memory/lib/memory-cycle2-gate.mjs +1 -1
  147. package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +1 -1
  148. package/src/runtime/memory/lib/memory-cycle2-shared.mjs +2 -5
  149. package/src/runtime/memory/lib/memory-cycle3.mjs +1 -5
  150. package/src/runtime/memory/lib/memory-embed.mjs +2 -6
  151. package/src/runtime/memory/lib/memory-log.mjs +8 -0
  152. package/src/runtime/memory/lib/memory-ops-policy.mjs +4 -8
  153. package/src/runtime/memory/lib/memory-recall-scope-filter.mjs +1 -1
  154. package/src/runtime/memory/lib/memory-recall-store.mjs +2 -193
  155. package/src/runtime/memory/lib/memory-score.mjs +1 -1
  156. package/src/runtime/memory/lib/memory-text-utils.mjs +2 -2
  157. package/src/runtime/memory/lib/memory.mjs +2 -6
  158. package/src/runtime/memory/lib/pg/adapter.mjs +2 -6
  159. package/src/runtime/memory/lib/pg/process.mjs +1 -5
  160. package/src/runtime/memory/lib/pg/supervisor.mjs +1 -5
  161. package/src/runtime/memory/lib/recall-format.mjs +2 -2
  162. package/src/runtime/memory/lib/recall-scoring.mjs +195 -0
  163. package/src/runtime/memory/lib/runtime-fetcher.mjs +1 -5
  164. package/src/runtime/memory/lib/trace-store.mjs +2 -6
  165. package/src/runtime/search/lib/http-fetch.mjs +6 -6
  166. package/src/runtime/search/lib/web-tools.mjs +2 -2
  167. package/src/runtime/shared/buffered-appender.mjs +1 -1
  168. package/src/runtime/shared/child-guardian.mjs +1 -1
  169. package/src/runtime/shared/child-spawn-gate.mjs +1 -1
  170. package/src/runtime/shared/config.mjs +4 -4
  171. package/src/runtime/shared/launcher-control.mjs +9 -10
  172. package/src/runtime/shared/llm/index.mjs +5 -20
  173. package/src/runtime/shared/markdown-frontmatter.mjs +1 -1
  174. package/src/runtime/shared/memory-snapshot.mjs +4 -4
  175. package/src/runtime/shared/pristine-execution.mjs +1 -1
  176. package/src/runtime/shared/process-lifecycle.mjs +0 -1
  177. package/src/runtime/shared/process-shutdown.mjs +1 -1
  178. package/src/runtime/shared/resource-admission.mjs +2 -2
  179. package/src/runtime/shared/schedule-session-run.mjs +1 -1
  180. package/src/runtime/shared/schedules-db.mjs +1 -1
  181. package/src/runtime/shared/service-discovery.mjs +2 -2
  182. package/src/runtime/shared/staged-update.mjs +6 -6
  183. package/src/runtime/shared/tool-execution-contract.mjs +1 -1
  184. package/src/runtime/shared/tool-primitives.mjs +1 -1
  185. package/src/runtime/shared/tool-surface.mjs +2 -2
  186. package/src/runtime/shared/update-checker.mjs +1 -1
  187. package/src/runtime/shared/user-cwd.mjs +3 -3
  188. package/src/runtime/shared/user-data-guard.mjs +4 -4
  189. package/src/runtime/shared/workspace-router.mjs +5 -5
  190. package/src/session-runtime/config-helpers.mjs +2 -3
  191. package/src/session-runtime/config-lifecycle.mjs +1 -1
  192. package/src/session-runtime/hitch-profile.mjs +1 -1
  193. package/src/session-runtime/lifecycle-api.mjs +6 -4
  194. package/src/session-runtime/model-recency.mjs +5 -5
  195. package/src/session-runtime/plugin-mcp.mjs +1 -1
  196. package/src/session-runtime/provider-request-snapshot.mjs +338 -0
  197. package/src/session-runtime/session-text.mjs +4 -4
  198. package/src/session-runtime/tool-catalog-schema.mjs +197 -0
  199. package/src/session-runtime/tool-catalog.mjs +6 -483
  200. package/src/session-runtime/tool-defs.mjs +1 -1
  201. package/src/standalone/agent-task-status.mjs +1 -1
  202. package/src/standalone/agent-tool/helpers.mjs +2 -2
  203. package/src/standalone/channel-admin.mjs +4 -4
  204. package/src/standalone/explore-tool.mjs +3 -3
  205. package/src/standalone/hook-bus/config.mjs +1 -1
  206. package/src/standalone/hook-bus/constants.mjs +1 -1
  207. package/src/standalone/hook-bus/rules.mjs +1 -1
  208. package/src/standalone/projects.mjs +1 -1
  209. package/src/standalone/provider-admin.mjs +2 -2
  210. package/src/tui/app/app-format.mjs +2 -2
  211. package/src/tui/app/clipboard.mjs +3 -3
  212. package/src/tui/app/input-parsers.mjs +1 -1
  213. package/src/tui/app/text-layout.mjs +1 -1
  214. package/src/tui/app/transcript-row-estimate.mjs +360 -0
  215. package/src/tui/app/transcript-window.mjs +5 -347
  216. package/src/tui/app/use-mouse-input.mjs +1 -1
  217. package/src/tui/app/use-prompt-handlers.mjs +1 -1
  218. package/src/tui/components/tool-execution/surface-detail.mjs +9 -9
  219. package/src/tui/components/tool-execution/text-format.mjs +2 -2
  220. package/src/tui/components/tool-output-format.mjs +7 -7
  221. package/src/tui/display-width.mjs +4 -4
  222. package/src/tui/dist/index.mjs +63 -97
  223. package/src/tui/engine/agent-envelope.mjs +5 -5
  224. package/src/tui/engine/notification-plan.mjs +1 -1
  225. package/src/tui/engine/queue-helpers.mjs +3 -3
  226. package/src/tui/engine/render-timing.mjs +4 -5
  227. package/src/tui/engine/session-api-ext.mjs +3 -3
  228. package/src/tui/engine/tool-result-status.mjs +5 -5
  229. package/src/tui/engine/tool-result-text.mjs +1 -1
  230. package/src/tui/engine/transcript-spill.mjs +585 -0
  231. package/src/tui/engine/tui-steering-persist.mjs +1 -1
  232. package/src/tui/engine.mjs +2 -474
  233. package/src/tui/lib/voice-setup.mjs +1 -1
  234. package/src/tui/markdown/format-token.mjs +1 -1
  235. package/src/tui/markdown/render-ansi.mjs +1 -1
  236. package/src/tui/markdown/table-layout.mjs +4 -4
  237. package/src/tui/paste-attachments.mjs +1 -1
  238. package/src/tui/prompt-history-store.mjs +3 -3
  239. package/src/tui/statusline-ansi-bridge.mjs +2 -2
  240. package/src/tui/theme.mjs +1 -1
  241. package/src/tui/transcript-tool-failures.mjs +2 -2
  242. package/src/ui/ansi.mjs +0 -9
  243. package/src/ui/statusline-format.mjs +2 -4
  244. package/scripts/_bench-cwc.json +0 -20
  245. package/scripts/_jitter-fuzz.jsx +0 -42
  246. package/scripts/_jitter-fuzz2.jsx +0 -30
  247. package/scripts/_jitter-probe.jsx +0 -35
  248. package/scripts/_jp2.jsx +0 -16
  249. package/scripts/_smoke_wd.mjs +0 -7
  250. package/scripts/abort-recovery-test.mjs +0 -175
  251. package/scripts/agent-dispatch-abort-compose-test.mjs +0 -31
  252. package/scripts/agent-live-arg-guard-smoke.mjs +0 -20
  253. package/scripts/agent-live-path-suffix-smoke.mjs +0 -34
  254. package/scripts/agent-live-toolcall-args-smoke.mjs +0 -45
  255. package/scripts/agent-loop-policy-test.mjs +0 -37
  256. package/scripts/agent-model-liveness-test.mjs +0 -763
  257. package/scripts/agent-parallel-smoke.mjs +0 -435
  258. package/scripts/agent-route-batch-test.mjs +0 -40
  259. package/scripts/agent-tag-reuse-smoke.mjs +0 -441
  260. package/scripts/agent-terminal-reap-test.mjs +0 -252
  261. package/scripts/agent-trace-io-test.mjs +0 -133
  262. package/scripts/ansi-color-capability-test.mjs +0 -90
  263. package/scripts/anthropic-admission-retry-integration-test.mjs +0 -119
  264. package/scripts/anthropic-maxtokens-test.mjs +0 -119
  265. package/scripts/anthropic-oauth-refresh-race-test.mjs +0 -397
  266. package/scripts/anthropic-transport-policy-test.mjs +0 -726
  267. package/scripts/apply-patch-edit-smoke.mjs +0 -71
  268. package/scripts/arg-guard-test.mjs +0 -93
  269. package/scripts/async-notify-settlement-test.mjs +0 -99
  270. package/scripts/atomic-lock-tryonce-test.mjs +0 -125
  271. package/scripts/background-task-meta-smoke.mjs +0 -38
  272. package/scripts/bench-run.mjs +0 -508
  273. package/scripts/boot-smoke.mjs +0 -137
  274. package/scripts/build-runtime-windows.ps1 +0 -242
  275. package/scripts/channel-daemon-smoke.mjs +0 -1103
  276. package/scripts/code-graph-aggregate-cwd-test.mjs +0 -158
  277. package/scripts/code-graph-disk-hit-test.mjs +0 -290
  278. package/scripts/code-graph-dispatch-test.mjs +0 -96
  279. package/scripts/code-graph-root-federation-test.mjs +0 -273
  280. package/scripts/compact-active-turn-test.mjs +0 -68
  281. package/scripts/compact-file-reattach-test.mjs +0 -88
  282. package/scripts/compact-pressure-test.mjs +0 -788
  283. package/scripts/compact-prior-context-flatten-test.mjs +0 -252
  284. package/scripts/compact-recall-digest-test.mjs +0 -57
  285. package/scripts/compact-smoke.mjs +0 -1017
  286. package/scripts/compact-trigger-migration-smoke.mjs +0 -261
  287. package/scripts/compacted-placeholder-scrub-test.mjs +0 -63
  288. package/scripts/context-mcp-metering-test.mjs +0 -1406
  289. package/scripts/debounced-skills-async-save-test.mjs +0 -57
  290. package/scripts/deferred-tool-loading-test.mjs +0 -250
  291. package/scripts/desktop-session-bridge-test.mjs +0 -1013
  292. package/scripts/dispatch-persist-recovery-test.mjs +0 -141
  293. package/scripts/embedding-worker-exit-test.mjs +0 -76
  294. package/scripts/execution-completion-dedup-test.mjs +0 -205
  295. package/scripts/execution-pending-resume-kick-test.mjs +0 -151
  296. package/scripts/execution-resume-esc-integration-test.mjs +0 -176
  297. package/scripts/explore-bench-tmp.mjs +0 -36
  298. package/scripts/explore-bench.mjs +0 -248
  299. package/scripts/explore-prompt-policy-test.mjs +0 -256
  300. package/scripts/explore-timeout-cancel-test.mjs +0 -345
  301. package/scripts/find-fuzzy-hidden-test.mjs +0 -267
  302. package/scripts/forwarder-rebind-tail-test.mjs +0 -67
  303. package/scripts/freevar-smoke.mjs +0 -98
  304. package/scripts/gemini-provider-test.mjs +0 -1448
  305. package/scripts/generate-oc-icons.mjs +0 -11
  306. package/scripts/grok-oauth-refresh-race-test.mjs +0 -273
  307. package/scripts/headless-pristine-execution-test.mjs +0 -614
  308. package/scripts/hook-bus-test.mjs +0 -552
  309. package/scripts/ingest-pure-conversation-smoke.mjs +0 -175
  310. package/scripts/internal-comms-bench-test.mjs +0 -226
  311. package/scripts/internal-comms-bench.mjs +0 -853
  312. package/scripts/internal-comms-smoke.mjs +0 -277
  313. package/scripts/internal-tools-normalization-test.mjs +0 -62
  314. package/scripts/interrupted-turn-history-test.mjs +0 -399
  315. package/scripts/lead-workflow-smoke.mjs +0 -592
  316. package/scripts/lifecycle-api-test.mjs +0 -137
  317. package/scripts/live-share-test.mjs +0 -148
  318. package/scripts/live-worker-smoke.mjs +0 -333
  319. package/scripts/log-writer-guard-smoke.mjs +0 -131
  320. package/scripts/maintenance-default-routes-test.mjs +0 -164
  321. package/scripts/max-output-recovery-persist-test.mjs +0 -81
  322. package/scripts/max-output-recovery-test.mjs +0 -368
  323. package/scripts/mcp-client-normalization-test.mjs +0 -45
  324. package/scripts/mcp-grace-deferred-test.mjs +0 -225
  325. package/scripts/memory-core-input-test.mjs +0 -167
  326. package/scripts/memory-cycle-routing-test.mjs +0 -111
  327. package/scripts/memory-meta-concurrency-test.mjs +0 -20
  328. package/scripts/memory-pg-recovery-test.mjs +0 -59
  329. package/scripts/memory-rule-contract-test.mjs +0 -93
  330. package/scripts/model-list-sanitize-test.mjs +0 -37
  331. package/scripts/mouse-tracking-restore-smoke.mjs +0 -107
  332. package/scripts/native-edit-wire-test.mjs +0 -152
  333. package/scripts/notify-completion-mirror-test.mjs +0 -73
  334. package/scripts/openai-oauth-refresh-race-test.mjs +0 -120
  335. package/scripts/openai-oauth-ws-1006-retry-test.mjs +0 -954
  336. package/scripts/openai-ws-early-settle-test.mjs +0 -216
  337. package/scripts/output-style-bench.mjs +0 -292
  338. package/scripts/output-style-smoke.mjs +0 -145
  339. package/scripts/parent-abort-link-test.mjs +0 -90
  340. package/scripts/patch-binary-cache-test.mjs +0 -181
  341. package/scripts/path-suffix-test.mjs +0 -57
  342. package/scripts/pending-completion-drop-test.mjs +0 -239
  343. package/scripts/pending-messages-lock-nonblocking-test.mjs +0 -62
  344. package/scripts/pretool-ask-runtime-test.mjs +0 -54
  345. package/scripts/process-lifecycle-test.mjs +0 -461
  346. package/scripts/prompt-immediate-render-test.mjs +0 -89
  347. package/scripts/prompt-input-parity-test.mjs +0 -145
  348. package/scripts/provider-admission-scheduler-test.mjs +0 -681
  349. package/scripts/provider-contract-test.mjs +0 -632
  350. package/scripts/provider-stream-stall-test.mjs +0 -276
  351. package/scripts/provider-toolcall-test.mjs +0 -3063
  352. package/scripts/reactive-compact-persist-smoke.mjs +0 -203
  353. package/scripts/recall-bench.mjs +0 -359
  354. package/scripts/resource-admission-test.mjs +0 -792
  355. package/scripts/result-classification-test.mjs +0 -75
  356. package/scripts/rg-runner-test.mjs +0 -240
  357. package/scripts/routing-corpus-test.mjs +0 -349
  358. package/scripts/sanitize-tool-pairs-test.mjs +0 -260
  359. package/scripts/session-bench-cache-break-test.mjs +0 -102
  360. package/scripts/session-bench.mjs +0 -1708
  361. package/scripts/session-context-bench.mjs +0 -344
  362. package/scripts/session-heartbeat-lifecycle-test.mjs +0 -68
  363. package/scripts/session-ingest-compaction-smoke.mjs +0 -279
  364. package/scripts/session-ingest-smoke.mjs +0 -177
  365. package/scripts/session-orphan-sweep-test.mjs +0 -109
  366. package/scripts/set-effort-config-test.mjs +0 -41
  367. package/scripts/shell-failure-diagnostics-test.mjs +0 -280
  368. package/scripts/shell-hardening-test.mjs +0 -209
  369. package/scripts/shell-jobs-windows-hide-test.mjs +0 -164
  370. package/scripts/ship-mode-test.mjs +0 -98
  371. package/scripts/smoke-loop-failure-summary-test.mjs +0 -38
  372. package/scripts/smoke-loop-failure-summary.mjs +0 -16
  373. package/scripts/smoke-loop-report.mjs +0 -221
  374. package/scripts/smoke-loop.mjs +0 -202
  375. package/scripts/smoke-runtime-negative.ps1 +0 -106
  376. package/scripts/statusline-quota-hysteresis-test.mjs +0 -62
  377. package/scripts/steering-drain-buckets-test.mjs +0 -467
  378. package/scripts/steering-fold-provenance-test.mjs +0 -71
  379. package/scripts/streaming-tail-window-test.mjs +0 -175
  380. package/scripts/submit-commandbusy-race-test.mjs +0 -257
  381. package/scripts/task-bench.mjs +0 -205
  382. package/scripts/terminal-bench-isolation-guards-test.mjs +0 -102
  383. package/scripts/termio-input-smoke.mjs +0 -199
  384. package/scripts/tool-result-hook-test.mjs +0 -48
  385. package/scripts/tool-smoke.mjs +0 -2453
  386. package/scripts/tool-tui-presentation-test.mjs +0 -286
  387. package/scripts/toolcall-args-test.mjs +0 -239
  388. package/scripts/tui-ambiguous-width-test.mjs +0 -113
  389. package/scripts/tui-background-failure-smoke.mjs +0 -73
  390. package/scripts/tui-perf-run.ps1 +0 -26
  391. package/scripts/tui-render-smoke.mjs +0 -90
  392. package/scripts/tui-runtime-load-bench-entry.jsx +0 -608
  393. package/scripts/tui-runtime-load-bench.mjs +0 -50
  394. package/scripts/tui-store-frame-batch-test.mjs +0 -99
  395. package/scripts/tui-transcript-jitter-harness-entry.jsx +0 -383
  396. package/scripts/tui-transcript-perf-test.mjs +0 -934
  397. package/scripts/usage-metrics-epoch-smoke.mjs +0 -114
  398. package/scripts/verify-release-assets-test.mjs +0 -281
  399. package/scripts/web-fetch-routing-test.mjs +0 -158
  400. package/scripts/webhook-smoke.mjs +0 -201
  401. package/scripts/windows-hide-spawn-options-test.mjs +0 -19
  402. package/scripts/worker-notify-rejection-test.mjs +0 -51
  403. package/scripts/write-backpressure-test.mjs +0 -147
@@ -1,277 +0,0 @@
1
- #!/usr/bin/env node
2
- // Static smoke for internal-comms token-optimization rules (min chars / max
3
- // info). Asserts the Lead brief contract and the agent handoff contract are
4
- // present and injected, without any model call. Live token A/B is a separate
5
- // bench (scripts/internal-comms-bench.mjs).
6
- import { createRequire } from 'node:module';
7
- import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
8
- import { tmpdir } from 'node:os';
9
- import { dirname, join, resolve } from 'node:path';
10
- import { fileURLToPath } from 'node:url';
11
-
12
- const root = resolve(dirname(fileURLToPath(import.meta.url)), '..');
13
- const require = createRequire(import.meta.url);
14
- const rulesBuilder = require('../src/lib/rules-builder.cjs');
15
-
16
- function assert(condition, message) {
17
- if (!condition) throw new Error(message);
18
- }
19
- function readSrc(...parts) {
20
- return readFileSync(join(root, 'src', ...parts), 'utf8');
21
- }
22
- function normalize(text) {
23
- return String(text || '').replace(/\s+/g, ' ').trim();
24
- }
25
- function rawBlock(text, start, end, label) {
26
- const source = String(text);
27
- const from = source.indexOf(start);
28
- if (from < 0) throw new Error(`${label}: missing start marker ${start}`);
29
- const finish = source.indexOf(end, from + start.length);
30
- if (finish < 0) throw new Error(`${label}: missing end marker ${end}`);
31
- return source.slice(from, finish);
32
- }
33
- function block(text, start, end, label) {
34
- return normalize(rawBlock(text, start, end, label));
35
- }
36
- function bodyAfterFrontmatter(text, label) {
37
- const source = String(text);
38
- const opening = source.match(/^---[ \t]*\r?\n/);
39
- if (!opening) throw new Error(`${label}: missing frontmatter opening fence`);
40
- const closing = source.slice(opening[0].length).match(/^---[ \t]*(?:\r?\n|$)/m);
41
- if (!closing) throw new Error(`${label}: missing frontmatter closing fence`);
42
- return source.slice(opening[0].length + closing.index + closing[0].length);
43
- }
44
- function roleBody(text, label) {
45
- return normalize(bodyAfterFrontmatter(text, label));
46
- }
47
- function frontmatter(text, label) {
48
- const source = String(text);
49
- const opening = source.match(/^---[ \t]*\r?\n/);
50
- if (!opening) throw new Error(`${label}: missing frontmatter opening fence`);
51
- const closing = source.slice(opening[0].length).match(/^---[ \t]*(?:\r?\n|$)/m);
52
- if (!closing) throw new Error(`${label}: missing frontmatter closing fence`);
53
- return source.slice(opening[0].length, opening[0].length + closing.index);
54
- }
55
-
56
- // --- Compact rule contracts -------------------------------------------------
57
- const workflow = readSrc('workflows', 'default', 'WORKFLOW.md');
58
- const leadBrief = readSrc('rules', 'lead', 'lead-brief.md');
59
- const solo = readSrc('workflows', 'solo', 'WORKFLOW.md');
60
- const general = readSrc('rules', 'lead', '01-general.md');
61
- const leadTool = readSrc('rules', 'lead', 'lead-tool.md');
62
- const core = readSrc('rules', 'agent', '00-core.md');
63
- const common = readSrc('rules', 'agent', '00-common.md');
64
- const skip = readSrc('rules', 'agent', '20-skip-protocol.md');
65
- const OPTIONAL_BRIEF_FIELDS = ['Anchors:', 'Allow/Forbid:', 'Deliver:'];
66
- const TOKEN_PRINCIPLE = /minimum (?:characters|chars), maximum (?:information|info)/i;
67
- function requireAll(text, label, patterns) {
68
- for (const pattern of patterns) assert(pattern.test(normalize(text).toLowerCase()), `${label}: missing ${pattern}`);
69
- }
70
- assert(TOKEN_PRINCIPLE.test(normalize(leadBrief)), 'lead-brief.md: brief must state min-char/max-info principle');
71
- assert(leadBrief.includes('Task:'), 'lead-brief.md: brief must require labeled field Task:');
72
- assert(!leadBrief.includes('Goal:'), 'lead-brief.md: Goal: must be replaced by Task:');
73
- for (const field of OPTIONAL_BRIEF_FIELDS) assert(leadBrief.includes(field), `lead-brief.md: brief missing optional labeled field ${field}`);
74
- assert(!leadBrief.includes('Verify:'), 'lead-brief.md: must not prescribe Verify:');
75
- assert(
76
- !/copy a prior role(?:'s)? brief|worker\s*(?:->|→)\s*debugger\s*(?:->|→)\s*reviewer|\blead\s*\/\s*worker\b/i.test(leadBrief),
77
- 'lead-brief.md: must not restore cross-role Task copying or lineage',
78
- );
79
- requireAll(leadBrief, 'Lead brief task', [
80
- /`task:` is mandatory and lossless/, /intent/, /required outcomes/, /negative outcomes/,
81
- /completion\/stop boundary/, /all other fields are optional task-specific deltas/,
82
- /preserve user-supplied exact targets and exact replacements\/outputs in `task:`/,
83
- /never infer exactness from a task name, file count, or perceived difficulty/,
84
- /each role independently constructs a role-appropriate, lossless `task:` from/,
85
- /the original request and official spec\/test acceptance criteria/,
86
- ]);
87
- assert(/role-known|already (?:owns|knows)|wasted cost|wasted/i.test(normalize(leadBrief)), 'lead-brief.md: brief must ban restating known rules/background as cost');
88
- assert(/original request and official spec\/test acceptance criteria/i.test(normalize(leadBrief)), 'lead-brief.md: original request and official acceptance criteria must beat summary');
89
- requireAll(leadBrief, 'Lead brief lifecycle', [
90
- /full brief only for fresh spawn\/`respawned: true`/, /live follow-ups are delta/,
91
- /dead-tag send is cold: re-supply anchors/, /never `send` mid-run/,
92
- /batch one follow-up after completion/, /interrupt only to cancel/,
93
- /agent communication is english/,
94
- ]);
95
- assert(/lead brief contract/i.test(normalize(workflow)), 'WORKFLOW.md: must defer to the lead brief contract');
96
- assert(!OPTIONAL_BRIEF_FIELDS.every((field) => workflow.includes(field)), 'WORKFLOW.md: must not duplicate the optional brief field list');
97
-
98
- assert(/fragments/i.test(core), '00-core: handoff must require fragments');
99
- assert(/file:line/i.test(core), '00-core: handoff must anchor evidence to file:line');
100
- for (const banned of ['headings', 'tables', 'narration', 'raw logs', 'next-checks']) {
101
- assert(core.toLowerCase().includes(banned), `00-core: banned list missing ${banned}`);
102
- }
103
- assert(/Public Agent Constraints/i.test(common), '00-common: must be titled public-only constraints');
104
- assert(/git operations deferred to Lead/i.test(normalize(common)), '00-common: must refuse git/Ship');
105
- assert(/Overflow goes to a file/i.test(common), '00-common: must keep overflow-to-file rule');
106
- requireAll(common, 'Public-agent shell', [
107
- /shell only verifies own edits/, /no exploration, install, or state change beyond brief/,
108
- ]);
109
-
110
- // --- Per-role output contracts --------------------------------------------
111
- const roles = {
112
- 'worker/AGENT.md': readSrc('agents', 'worker', 'AGENT.md'),
113
- 'heavy-worker/AGENT.md': readSrc('agents', 'heavy-worker', 'AGENT.md'),
114
- 'reviewer/AGENT.md': readSrc('agents', 'reviewer', 'AGENT.md'),
115
- 'debugger/AGENT.md': readSrc('agents', 'debugger', 'AGENT.md'),
116
- };
117
- const reviewerRole = roles['reviewer/AGENT.md'];
118
- assert(
119
- !/construct the review\s*`task:` independently/i.test(reviewerRole),
120
- 'reviewer/AGENT.md: must not restore Reviewer-specific Task construction',
121
- );
122
- assert(
123
- !/treat prior reports as unverified claims rather than evidence/i.test(reviewerRole),
124
- 'reviewer/AGENT.md: must not restore prior-report framing',
125
- );
126
-
127
- // Semantic contracts deliberately avoid prose snapshots.
128
- function snapshot(actual, expected, label) {
129
- assert(normalize(actual) === normalize(expected), `${label}: canonical snapshot changed`);
130
- }
131
- assert(/^agents:\s*$/m.test(frontmatter(solo, 'Solo workflow')), 'Solo: agents frontmatter must be empty');
132
- requireAll(workflow, 'Default approval', [
133
- /read-only investigation\/planning while consulting/, /later explicit user message after the latest plan/,
134
- /initial\/additional\/changed requests reset planning/, /scope change needs a revised plan and fresh approval/,
135
- /no edits, state mutation, or delegation/,
136
- ]);
137
- const WORKER_HEAVY_ROUTING_CONTRACT = [
138
- /select worker or heavy worker by solution and validation complexity/,
139
- /worker owns work whose approach is established and whose correctness can be shown with a focused check/,
140
- /heavy worker owns work requiring investigation to establish the approach, resolution of material uncertainty or dependencies, iteration across hypotheses or checkpoints, or multi-step, empirical, integration, or real-use validation/,
141
- ];
142
- requireAll(workflow, 'Default Worker/Heavy Worker routing', WORKER_HEAVY_ROUTING_CONTRACT);
143
- assert(
144
- !/fully\s+specified\s+artifact/i.test(workflow),
145
- 'Default: removed Worker routing criterion must not return',
146
- );
147
- const ROUTING_REVIEW_POLICY = [
148
- /lead-direct execution is limited to a conceptually one-step mechanical action with an immediate deterministic check/,
149
- /routine configuration\/git work/,
150
- /operational support for planning, delegation, or verification/,
151
- /multiple steps must not be reframed as one command to fit this boundary/,
152
- /work requiring implementation judgment, investigation, iteration, or artifact authoring delegates to worker or heavy worker/,
153
- /debugger owns diagnosis and reverse engineering/,
154
- /applying a debugger result is implementation, not diagnosis/,
155
- /review is exempt only for pure read\/analysis with no edit, artifact, or state mutation; git\/configuration; or a request where the user explicitly supplies both the exact target and exact replacement\/output\. every non-exempt mutation or artifact/,
156
- /every non-exempt mutation or artifact/,
157
- /worker, heavy worker, debugger, or lead/,
158
- /one reviewer .*lead integration\/cross-scope verification in parallel/,
159
- /debugger analysis cannot substitute for implementation review/,
160
- /applying a debugger result triggers the same reviewer \+ lead verification/,
161
- /loop fix -> re-verify \(same reviewer \+ lead re-check\) until clean/,
162
- /exempt mutations still require shell self-verification/,
163
- ];
164
- requireAll(workflow, 'Default routing/review policy', ROUTING_REVIEW_POLICY);
165
- assert(
166
- !/(high clarity|low structural complexity|immediate 1-step|genuinely simple)/i.test(workflow),
167
- 'Default: heuristic routing/review language must not return',
168
- );
169
- requireAll(workflow, 'Default lifecycle', [
170
- /draft before any implementation/, /all ready scopes in one turn, with no count cap/,
171
- /real dependency, overlapping write, or inseparable coupling/,
172
- /after async spawn, end the turn/,
173
- /high-risk scopes add distinct lenses/,
174
- /original live session/,
175
- /bug surviving 2\+ fix cycles/, /agent reports relay.*as in-progress, never conclusions/,
176
- /final \(not interim\) report/, /never forward raw agent output/,
177
- /explicit user request after issue-free feedback/, /outcome\/direction change, pause and re-consult/,
178
- ]);
179
- requireAll(solo, 'Solo lifecycle', [
180
- /no edits or state mutation/, /never spawn, send, delegate, or ask agents to work/,
181
- /read-only investigation\/planning while consulting/,
182
- /later explicit user message after the latest plan/,
183
- /initial\/additional\/changed requests reset planning/,
184
- /scope change needs a revised plan and fresh approval/,
185
- /checks\/fixes directly until clean or reports a blocker/, /final \(not interim\) report/,
186
- /interim updates are in-progress, never conclusions/,
187
- /issue-free feedback/,
188
- ]);
189
- requireAll(leadTool, 'Lead tools', [
190
- /write-role agents self-verify/, /cross-scope verification.*benches.*all git/,
191
- ]);
192
- requireAll(general, 'General safety', [
193
- /identify as mixdog\/current coding agent/, /destructive\/hard-to-reverse action needs explicit confirmation/,
194
- ]);
195
- requireAll(workflow, 'Default ship safety', [
196
- /build\/deploy\/commit\/push require an explicit user request after issue-free feedback/,
197
- /implementation approval alone is insufficient/,
198
- ]);
199
- requireAll(skip, 'Silent skip', [
200
- /webhook-handler/, /scheduler-task/, /label-only, duplicate\/dedup, no action needed\/report/,
201
- /whole response.*\[meta:silent\]/,
202
- ]);
203
-
204
- const roleSnapshots = {
205
- 'worker/AGENT.md': `# Worker
206
- Scoped implementation agent.
207
-
208
- Own only the bounded responsibility assigned in the brief. Trust its
209
- \`file:line\` anchors; do only minimal targeted discovery, then make the
210
- smallest coherent patch. No drive-by cleanup or scope expansion.
211
-
212
- EDIT-FIRST DISCIPLINE. Patch promptly rather than repeating read-only turns;
213
- stop and report blocked when the assigned scope cannot be completed.
214
-
215
- Self-verify with a targeted check (for example, \`node --check\` or a focused
216
- test), then report the changed \`file:line\` and stop.`,
217
- 'heavy-worker/AGENT.md': `# Heavy Worker
218
- Own the assigned implementation slice through staged delivery.
219
-
220
- Break work into bounded, dependency-aware slices and execute them in sequence.
221
- At each checkpoint, run the narrowest relevant test or build before expanding
222
- the slice. Keep the smallest coherent change; control blast radius rather than
223
- rewriting adjacent systems.
224
-
225
- EDIT-FIRST DISCIPLINE. Patch incrementally and stop at the first explicit
226
- boundary: unclear ownership, a missing dependency, or growing blast radius.
227
- Do not cross that boundary without a new bounded assignment; report blocked
228
- work with the relevant file:line.
229
-
230
- Self-verify each checkpoint and the final slice with shell (targeted test/build).`,
231
- 'reviewer/AGENT.md': `# Reviewer
232
- Independent regression/risk review agent.
233
-
234
- Review the diff and tests with independent judgment. Prioritize actionable
235
- correctness, regression, security, and verification risks; inspect affected
236
- boundaries. Do not reimplement the change or report non-risky nits. Independently
237
- evaluate the final deliverable with a critical lens, actively seeking errors,
238
- unsupported assumptions, and counterexamples before confirming.
239
-
240
- Report findings first, severity-ordered, with one line per \`file:line\`. If clean,
241
- say so in one line and include only material residual risk.
242
-
243
- When the work comes with stated criteria or reference material for judging
244
- it, verify against those as given — substituting your own interpretation or
245
- a self-built check is a verification risk to report.`,
246
- 'debugger/AGENT.md': `# Debugger
247
- Root-cause analysis agent.
248
-
249
- Smallest confirmed cause chain before fixes. Return likely cause, evidence
250
- (\`file:line\`), smallest next check/fix. Mark confirmed facts vs inferences;
251
- avoid broad speculation.
252
-
253
- Converge, don't sweep: when new evidence stops accruing, report the best
254
- cause chain so far.`,
255
- };
256
- for (const [name, expected] of Object.entries(roleSnapshots)) {
257
- const text = roles[name];
258
- const permission = text.match(/^permission:\s*(.+)$/m)?.[1];
259
- assert(permission === (name === 'worker/AGENT.md' || name === 'heavy-worker/AGENT.md' ? 'read-write' : 'read'), `${name}: permission contract changed`);
260
- snapshot(roleBody(text, name), expected, name);
261
- }
262
- assert(/confirmed facts vs inferences/i.test(normalize(roles['debugger/AGENT.md'])), 'debugger: must separate confirmed facts from inferences');
263
- assert(/file:line/i.test(normalize(roles['debugger/AGENT.md'])), 'debugger: must anchor evidence to file:line');
264
-
265
- // --- Injection: Lead rules actually carry the brief contract ---------------
266
- const dataDir = mkdtempSync(join(tmpdir(), 'mixdog-internal-comms-smoke-'));
267
- try {
268
- const leadRules = rulesBuilder.buildInjectionContent({ PLUGIN_ROOT: join(root, 'src'), DATA_DIR: dataDir });
269
- assert(TOKEN_PRINCIPLE.test(normalize(leadRules)), 'injected Lead rules must carry the brief token principle');
270
- assert(leadRules.includes('Task:'), 'injected Lead rules missing mandatory brief field Task:');
271
- assert(!leadRules.includes('Goal:'), 'injected Lead rules must not retain Goal:');
272
- for (const field of OPTIONAL_BRIEF_FIELDS) assert(leadRules.includes(field), `injected Lead rules missing optional brief field ${field}`);
273
- } finally {
274
- rmSync(dataDir, { recursive: true, force: true });
275
- }
276
-
277
- process.stdout.write('internal comms smoke passed\n');
@@ -1,62 +0,0 @@
1
- #!/usr/bin/env node
2
- import test from 'node:test';
3
- import assert from 'node:assert/strict';
4
- import {
5
- executeInternalTool,
6
- setInternalToolsProvider,
7
- } from '../src/runtime/agent/orchestrator/internal-tools.mjs';
8
- import { classifyResultKind } from '../src/runtime/agent/orchestrator/session/result-classification.mjs';
9
-
10
- async function normalizeToolResult(result) {
11
- setInternalToolsProvider({
12
- tools: [{ name: 'normalization_test' }],
13
- executor: async () => result,
14
- });
15
- return executeInternalTool('normalization_test', {});
16
- }
17
-
18
- test('already-prefixed handler errors keep one canonical Error: prefix', async () => {
19
- const result = await normalizeToolResult({
20
- content: [{ type: 'text', text: 'Error: web search failed' }],
21
- isError: true,
22
- });
23
- assert.equal(result, 'Error: web search failed');
24
- assert.equal(classifyResultKind(result), 'error');
25
- });
26
-
27
- test('ordinary handler error text receives the canonical Error: prefix', async () => {
28
- const result = await normalizeToolResult({
29
- content: [{ type: 'text', text: 'core add: project_id required' }],
30
- isError: true,
31
- });
32
- assert.equal(result, 'Error: core add: project_id required');
33
- assert.equal(classifyResultKind(result), 'error');
34
- });
35
-
36
- test('successful empty output stays normal', async () => {
37
- const result = await normalizeToolResult({
38
- content: [{ type: 'text', text: '' }],
39
- isError: false,
40
- });
41
- assert.equal(result, '');
42
- assert.equal(classifyResultKind(result), 'normal');
43
- });
44
-
45
- test('isError:false output stays normal', async () => {
46
- const result = await normalizeToolResult({
47
- content: [{ type: 'text', text: 'search complete' }],
48
- isError: false,
49
- });
50
- assert.equal(result, 'search complete');
51
- assert.equal(classifyResultKind(result), 'normal');
52
- });
53
-
54
- test('structured image output survives internal tool normalization', async () => {
55
- const input = {
56
- content: [
57
- { type: 'text', text: 'downloaded' },
58
- { type: 'image', source: { type: 'base64', media_type: 'image/png', data: 'YWJj' } },
59
- ],
60
- };
61
- assert.deepEqual(await normalizeToolResult(input), input);
62
- });