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
@@ -56,451 +56,9 @@ export {
56
56
  // renders a path marker instead of pasting the tail. Matches the
57
57
  // SHELL_OUTPUT_MAX_CHARS used by the smart-truncate renderer in
58
58
  // builtin.mjs so spilled output and inline output share the same boundary.
59
- const SHELL_OUTPUT_INLINE_CAP = 30_000;
59
+ import { SHELL_OUTPUT_INLINE_CAP, SHELL_OUTPUT_DISK_CAP, SIZE_WATCHDOG_INTERVAL_MS, stripAnsi, treeKill, TaskOutput, ExecResult } from './shell-exec-output.mjs';
60
+ export { stripAnsi, ExecResult } from './shell-exec-output.mjs';
60
61
 
61
- // Hard ceiling on disk-backed output. Past this the SIZE_WATCHDOG (G2)
62
- // SIGKILLs the child to avoid filling the filesystem. 100 MB is generous
63
- // for any legitimate command output and tight enough to catch a runaway
64
- // loop within ~seconds on a typical SSD.
65
- const SHELL_OUTPUT_DISK_CAP = 100 * 1024 * 1024;
66
-
67
- // Background-task disk watchdog cadence. The size guard polls the spilled
68
- // stdout/stderr files every interval and SIGKILLs the child once the
69
- // combined size exceeds SHELL_OUTPUT_DISK_CAP — short enough that a runaway loop is caught within a
70
- // few seconds, long enough that the stat overhead is negligible.
71
- const SIZE_WATCHDOG_INTERVAL_MS = 1_000;
72
-
73
- // fsync throttle for spilled output reads. getStdout/getStderr call
74
- // fsyncSync before reading to ensure the caller sees the latest bytes.
75
- // On Windows every fsyncSync is a noticeable I/O syscall, so throttle
76
- // consecutive calls to at most one per this interval. Tune via env
77
- // MIXDOG_SHELL_FSYNC_THROTTLE_MS (default 1000 ms, positive integer).
78
- function positiveIntEnv(name, fallback) {
79
- const value = Number(process.env[name]);
80
- return Number.isFinite(value) && value > 0 ? Math.floor(value) : fallback;
81
- }
82
- const MIXDOG_SHELL_FSYNC_THROTTLE_MS = positiveIntEnv('MIXDOG_SHELL_FSYNC_THROTTLE_MS', 1000);
83
-
84
- // ANSI / VT control sequence stripper. Falls back to a regex sweep when
85
- // node:util's stripVTControlCharacters isn't available (older Node).
86
- const _ANSI_REGEX =
87
- /(?:\[[0-?]*[ -/]*[@-~]|\][\s\S]*?(?:|\\|œ))/g;
88
- const _stripAnsiImpl =
89
- typeof nodeUtil.stripVTControlCharacters === 'function'
90
- ? (s) => nodeUtil.stripVTControlCharacters(s)
91
- : (s) => String(s).replace(_ANSI_REGEX, () => '');
92
-
93
- export function stripAnsi(s) {
94
- if (typeof s !== 'string' || s.length === 0) return s;
95
- return _stripAnsiImpl(s);
96
- }
97
-
98
- // Tree-kill helper. spawn alone only signals the direct child, so a
99
- // `sleep 1000 &` or a forked node server inside the shell stays alive
100
- // holding the pipes open. POSIX path signals the process group (we spawn
101
- // with detached:true to give the child its own pgid). Windows uses
102
- // taskkill /T /F to walk the tree. Safe to call repeatedly; all errors
103
- // swallowed.
104
- function treeKill(child) {
105
- if (!child) return;
106
- // Track close/exit via the standard child fields (set by Node when
107
- // the corresponding events fire) instead of `child.killed`, which is
108
- // true the moment any signal is delivered — even before the child has
109
- // actually terminated. Using exitCode/signalCode means the SIGKILL
110
- // escalation only suppresses itself when the process is genuinely
111
- // gone.
112
- if (child.exitCode != null || child.signalCode != null) return;
113
- const pid = child.pid;
114
- if (!pid) return;
115
- try {
116
- if (process.platform === 'win32') {
117
- spawn('taskkill', ['/pid', String(pid), '/t', '/f'], {
118
- windowsHide: true,
119
- stdio: 'ignore',
120
- });
121
- } else {
122
- try {
123
- process.kill(-pid, 'SIGTERM');
124
- } catch {
125
- try {
126
- child.kill('SIGTERM');
127
- } catch {}
128
- }
129
- // Escalate to SIGKILL after 3s so a child that ignores SIGTERM
130
- // still comes down. Windows taskkill /F is already forceful so
131
- // skip the escalation timer there.
132
- const esc = setTimeout(() => {
133
- if (child.exitCode != null || child.signalCode != null) return;
134
- try {
135
- process.kill(-pid, 'SIGKILL');
136
- } catch {
137
- try {
138
- child.kill('SIGKILL');
139
- } catch {}
140
- }
141
- }, 3000);
142
- if (esc.unref) esc.unref();
143
- }
144
- } catch {
145
- /* swallow */
146
- }
147
- }
148
-
149
- // Head+tail read helper: avoid pulling a large spill back into memory, but
150
- // preserve BOTH the start of the output (where build / compiler / test errors
151
- // are usually printed first) and the most recent output. Past INLINE_CAP*4
152
- // bytes we return the first half-budget and the trailing half-budget with an
153
- // elision marker between; below that the full body is returned as-is. A tail-
154
- // only slice silently dropped early diagnostics. UTF-8 sequences are at most
155
- // 4 B, so a small padding window lets us cut/advance on codepoint boundaries
156
- // instead of emitting a U+FFFD glyph at the seam.
157
- function _readHeadTail(filePath, fileSize) {
158
- if (fileSize <= SHELL_OUTPUT_INLINE_CAP * 4) {
159
- return readFileSync(filePath, 'utf-8');
160
- }
161
- const padding = 4;
162
- const headBudget = Math.floor(SHELL_OUTPUT_INLINE_CAP / 2);
163
- const tailBudget = SHELL_OUTPUT_INLINE_CAP - headBudget;
164
- const fd = openSync(filePath, 'r');
165
- try {
166
- // Head: first headBudget bytes, dropping a split trailing codepoint.
167
- const headBuf = Buffer.allocUnsafe(headBudget + padding);
168
- const hn = readSync(fd, headBuf, 0, headBudget + padding, 0);
169
- let hEnd = Math.min(headBudget, hn);
170
- while (hEnd > 0 && hEnd < hn && (headBuf[hEnd] & 0xC0) === 0x80) hEnd--;
171
- const head = headBuf.slice(0, hEnd).toString('utf-8');
172
- // Tail: last tailBudget bytes, advancing past a leading split codepoint.
173
- const tailReadSize = tailBudget + padding;
174
- const tailStart = Math.max(hEnd, fileSize - tailReadSize);
175
- const tailBuf = Buffer.allocUnsafe(tailReadSize);
176
- const tn = readSync(fd, tailBuf, 0, tailReadSize, tailStart);
177
- let tOff = 0;
178
- if (tailStart > 0) {
179
- while (tOff < tn && tOff < padding && (tailBuf[tOff] & 0xC0) === 0x80) tOff++;
180
- }
181
- const tail = tailBuf.slice(tOff, tn).toString('utf-8');
182
- const elided = Math.max(0, (tailStart + tOff) - hEnd);
183
- return `${head}\n... [${elided} bytes elided of ${fileSize} total — head+tail shown; full output spilled to disk] ...\n${tail}`;
184
- } finally {
185
- try { closeSync(fd); } catch {}
186
- }
187
- }
188
-
189
- // Owns the captured stdout/stderr buffers for a single command run. Starts
190
- // fully in memory; once the combined byte total exceeds the spill threshold
191
- // (SHELL_OUTPUT_INLINE_CAP*4), opens append-only files in
192
- // $PLUGIN_DATA/shell-output/ and from then on writes go straight to disk.
193
- // On settle, the caller (execShellCommand) decides whether to keep the
194
- // spilled files based on the final size.
195
- class TaskOutput {
196
- constructor(taskId) {
197
- this.taskId = taskId;
198
- this.stdoutBuf = '';
199
- this.stderrBuf = '';
200
- this._inlineBytes = 0;
201
- this.stdoutFd = null;
202
- this.stderrFd = null;
203
- this.stdoutPath = null;
204
- this.stderrPath = null;
205
- this.spilled = false;
206
- this.stdoutFileSize = 0;
207
- this.stderrFileSize = 0;
208
- this.writeError = null;
209
- // CC parity: direct-capture mode hands the spill files to the child as
210
- // stdio fds (no JS pipes). Sizes are then tracked via stat, not writes.
211
- this.direct = false;
212
- // fsync throttle: task wait/read + tail-read polling can call getStdout/
213
- // getStderr many times per second. Every call used to fsyncSync(fd),
214
- // a noticeable I/O tax on Windows. Skip if a recent fsync landed
215
- // within MIXDOG_SHELL_FSYNC_THROTTLE_MS — the next read still picks up
216
- // writes via the kernel's normal write-back. Final settle (closeFds)
217
- // flushes via close anyway.
218
- this._lastStdoutFsyncMs = 0;
219
- this._lastStderrFsyncMs = 0;
220
- }
221
-
222
- _ensureFileBacking() {
223
- if (this.spilled) return;
224
- const dir = join(getPluginData(), 'shell-output');
225
- try {
226
- mkdirSync(dir, { recursive: true });
227
- } catch {}
228
- this.stdoutPath = join(dir, `${this.taskId}.stdout`);
229
- this.stderrPath = join(dir, `${this.taskId}.stderr`);
230
- // openSync failure (EMFILE, EACCES, ENOSPC, ENOTDIR after a race) used
231
- // to throw straight up into the stream `data` handler, which left the
232
- // child running with no further writes captured. Catch + record so the
233
- // run settles cleanly under inline-only mode; the partial buffer in
234
- // stdoutBuf/stderrBuf survives.
235
- try {
236
- this.stdoutFd = openSync(this.stdoutPath, 'a');
237
- this.stderrFd = openSync(this.stderrPath, 'a');
238
- } catch (err) {
239
- this._recordWriteError('spill-open', err);
240
- if (this.stdoutFd != null) {
241
- try { closeSync(this.stdoutFd); } catch {}
242
- this.stdoutFd = null;
243
- }
244
- this.stderrFd = null;
245
- this.stdoutPath = null;
246
- this.stderrPath = null;
247
- return;
248
- }
249
- if (this.stdoutBuf) {
250
- try {
251
- writeSync(this.stdoutFd, this.stdoutBuf);
252
- this.stdoutFileSize += Buffer.byteLength(this.stdoutBuf, 'utf-8');
253
- } catch (err) {
254
- this._recordWriteError('stdout-spill-flush', err);
255
- }
256
- }
257
- if (this.stderrBuf) {
258
- try {
259
- writeSync(this.stderrFd, this.stderrBuf);
260
- this.stderrFileSize += Buffer.byteLength(this.stderrBuf, 'utf-8');
261
- } catch (err) {
262
- this._recordWriteError('stderr-spill-flush', err);
263
- }
264
- }
265
- this.spilled = true;
266
- // The flushed bytes now live in the spill files and getStdout/getStderr
267
- // read from disk once spilled — drop the inline copies.
268
- this.stdoutBuf = '';
269
- this.stderrBuf = '';
270
- }
271
-
272
- _maybeSpill() {
273
- if (this.spilled) return;
274
- // Threshold is in BYTES — string .length counts UTF-16 units, which
275
- // understates CJK output by up to 3x against the byte-sized cap.
276
- if (this._inlineBytes > SHELL_OUTPUT_INLINE_CAP * 4) {
277
- this._ensureFileBacking();
278
- }
279
- }
280
-
281
- // Force the in-memory buffers onto disk-backed files regardless of the
282
- // SHELL_OUTPUT_INLINE_CAP*4 threshold. Used by the auto-background
283
- // transition: once a foreground command is adopted into a tracked job,
284
- // every subsequent stdout/stderr chunk must land in the spill files so
285
- // task wait/read can read it (the caller has already settled and will no
286
- // longer drain the in-memory buffers). No-op once already spilled.
287
- forceSpill() {
288
- if (this.spilled) return;
289
- this._ensureFileBacking();
290
- }
291
-
292
- // CC parity (ShellCommand file mode): open the spill files BEFORE spawn and
293
- // hand their fds to the child as stdio[1]/stdio[2]. The child (and any
294
- // grandchildren) write straight to disk with no parent-side pipes, so a
295
- // surviving grandchild can never wedge the caller by holding a pipe handle.
296
- // Returns null when file backing could not be opened — caller falls back to
297
- // pipe capture.
298
- openDirectCapture() {
299
- this._ensureFileBacking();
300
- if (!this.spilled || this.stdoutFd == null || this.stderrFd == null) return null;
301
- this.direct = true;
302
- return { stdoutFd: this.stdoutFd, stderrFd: this.stderrFd };
303
- }
304
-
305
- // Direct mode has no JS write path, so byte counters must come from the
306
- // filesystem (CC "poll the file tail" analogue).
307
- _refreshDirectSizes() {
308
- if (!this.direct) return;
309
- try { this.stdoutFileSize = statSync(this.stdoutPath).size; } catch {}
310
- try { this.stderrFileSize = statSync(this.stderrPath).size; } catch {}
311
- }
312
-
313
- _recordWriteError(stage, err) {
314
- if (this.writeError) return;
315
- const msg = (err && err.message) ? err.message : String(err);
316
- this.writeError = `[output-capture-error: ${stage}] ${msg}`;
317
- }
318
-
319
- writeStdout(s) {
320
- if (!s) return;
321
- if (this.spilled) {
322
- try {
323
- writeSync(this.stdoutFd, s);
324
- this.stdoutFileSize += Buffer.byteLength(s, 'utf-8');
325
- } catch (err) {
326
- this._recordWriteError('stdout-write', err);
327
- }
328
- return;
329
- }
330
- this.stdoutBuf += s;
331
- this._inlineBytes += Buffer.byteLength(s, 'utf-8');
332
- this._maybeSpill();
333
- }
334
-
335
- writeStderr(s) {
336
- if (!s) return;
337
- if (this.spilled) {
338
- try {
339
- writeSync(this.stderrFd, s);
340
- this.stderrFileSize += Buffer.byteLength(s, 'utf-8');
341
- } catch (err) {
342
- this._recordWriteError('stderr-write', err);
343
- }
344
- return;
345
- }
346
- this.stderrBuf += s;
347
- this._inlineBytes += Buffer.byteLength(s, 'utf-8');
348
- this._maybeSpill();
349
- }
350
-
351
- totalDiskBytes() {
352
- this._refreshDirectSizes();
353
- return this.stdoutFileSize + this.stderrFileSize;
354
- }
355
-
356
- // Cheap synchronous tail for live-progress consumers (running tool cards).
357
- // Never fsyncs and never throws: inline mode slices the in-memory buffers;
358
- // spilled mode reads the file tails directly (kernel write-back is fresh
359
- // enough for display). Best-effort — any FS error yields ''.
360
- getLiveTail(maxChars = 4000) {
361
- try {
362
- const merge = (out, err) => {
363
- const merged = err ? `${out}${out && err ? '\n' : ''}${err}` : out;
364
- return merged.length > maxChars ? merged.slice(-maxChars) : merged;
365
- };
366
- if (!this.spilled) return merge(this.stdoutBuf, this.stderrBuf);
367
- this._refreshDirectSizes();
368
- const readTail = (path, size) => {
369
- if (!path || !(size > 0)) return '';
370
- const bytes = Math.min(size, maxChars * 3);
371
- const fd = openSync(path, 'r');
372
- try {
373
- const buffer = Buffer.alloc(bytes);
374
- const read = readSync(fd, buffer, 0, bytes, Math.max(0, size - bytes));
375
- return buffer.toString('utf-8', 0, read);
376
- } finally {
377
- try { closeSync(fd); } catch {}
378
- }
379
- };
380
- return merge(
381
- readTail(this.stdoutPath, this.stdoutFileSize),
382
- readTail(this.stderrPath, this.stderrFileSize),
383
- );
384
- } catch {
385
- return '';
386
- }
387
- }
388
-
389
- async getStdout() {
390
- if (this.spilled) {
391
- this._refreshDirectSizes();
392
- const now = Date.now();
393
- if (!this.direct && now - this._lastStdoutFsyncMs >= MIXDOG_SHELL_FSYNC_THROTTLE_MS) {
394
- try { fsyncSync(this.stdoutFd); } catch {}
395
- this._lastStdoutFsyncMs = now;
396
- }
397
- try {
398
- return _readHeadTail(this.stdoutPath, this.stdoutFileSize);
399
- } catch (err) {
400
- throw new Error(`[shell-command] spilled stdout read failed (${this.stdoutPath}): ${err.message}`);
401
- }
402
- }
403
- return this.stdoutBuf;
404
- }
405
-
406
- async getStderr() {
407
- if (this.spilled) {
408
- this._refreshDirectSizes();
409
- const now = Date.now();
410
- if (!this.direct && now - this._lastStderrFsyncMs >= MIXDOG_SHELL_FSYNC_THROTTLE_MS) {
411
- try { fsyncSync(this.stderrFd); } catch {}
412
- this._lastStderrFsyncMs = now;
413
- }
414
- try {
415
- return _readHeadTail(this.stderrPath, this.stderrFileSize);
416
- } catch {
417
- return '';
418
- }
419
- }
420
- return this.stderrBuf;
421
- }
422
-
423
- closeFds() {
424
- if (this.stdoutFd != null) {
425
- try {
426
- closeSync(this.stdoutFd);
427
- } catch {}
428
- this.stdoutFd = null;
429
- }
430
- if (this.stderrFd != null) {
431
- try {
432
- closeSync(this.stderrFd);
433
- } catch {}
434
- this.stderrFd = null;
435
- }
436
- }
437
-
438
- // Drop the spilled files when the inline body already covers the full
439
- // output. Called when total spilled bytes <= SHELL_OUTPUT_INLINE_CAP, so
440
- // outputFilePath would only point at a duplicate of what the caller is
441
- // already pasting into the result.
442
- deleteFiles() {
443
- this.closeFds();
444
- if (this.stdoutPath) {
445
- try {
446
- unlinkSync(this.stdoutPath);
447
- } catch {}
448
- this.stdoutPath = null;
449
- }
450
- if (this.stderrPath) {
451
- try {
452
- unlinkSync(this.stderrPath);
453
- } catch {}
454
- this.stderrPath = null;
455
- }
456
- this.spilled = false;
457
- this.direct = false;
458
- }
459
- }
460
-
461
- export { TaskOutput };
462
-
463
- // Result envelope. Status markers ([exit code: N], [signal: SIGTERM]) are
464
- // the caller's responsibility — shell execution owns that
465
- // rendering convention.
466
- export class ExecResult {
467
- constructor(opts) {
468
- this.stdout = opts.stdout;
469
- this.stderr = opts.stderr;
470
- this.exitCode = opts.exitCode;
471
- this.signal = opts.signal || null;
472
- this.timedOut = opts.timedOut === true;
473
- this.killed = opts.killed === true;
474
- // Why mixdog initiated a tree kill. Keep this separate from `signal`,
475
- // which is the process-reported termination signal (SIGTERM/SIGKILL).
476
- this.killCause = opts.killCause || null;
477
- this.stdoutPath = opts.stdoutPath || null;
478
- this.stdoutFileSize = opts.stdoutFileSize || 0;
479
- this.stderrPath = opts.stderrPath || null;
480
- this.stderrFileSize = opts.stderrFileSize || 0;
481
- this.taskId = opts.taskId;
482
- this.partialOutput = opts.partialOutput === true;
483
- this.outputCaptureError = opts.outputCaptureError || null;
484
- // Distinguish a shell tool/control-plane failure (spawn/preflight/capture)
485
- // from a command process failure (non-zero exit/signal/timeout). The
486
- // renderer in builtin/bash-tool.mjs turns this into a model-visible marker.
487
- this.failurePhase = opts.failurePhase || null;
488
- this.failureReason = opts.failureReason || null;
489
- // Auto-background transition (CC startBackgrounding analogue). When a
490
- // foreground command outlives autoBackgroundMs the call settles with
491
- // backgrounded:true + the jobId for manual task control. The
492
- // child stays owned by the CLI process; stdout/stderr keep flowing to
493
- // the spill files now adopted by the shell-jobs registry.
494
- this.backgrounded = opts.backgrounded === true;
495
- this.jobId = opts.jobId || null;
496
- this.backgroundMessage = opts.backgroundMessage || null;
497
- }
498
- }
499
-
500
- // One-shot async shell runner. abortSignal optional (session-scoped abort
501
- // from getAbortSignalForSession in builtin.mjs). Timeout implemented via
502
- // treeKill so forked grandchildren also come down. Output streams capture
503
- // to TaskOutput which transparently spills to disk past the inline cap.
504
62
  async function _execPolicyBlockMessage(command) {
505
63
  const { checkExecPolicyMessage } = await import('./bash-policy-scan.mjs');
506
64
  return checkExecPolicyMessage(command);