mixdog 0.7.18 → 0.8.1

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 (847) hide show
  1. package/README.md +37 -331
  2. package/package.json +67 -99
  3. package/scripts/boot-smoke.mjs +94 -0
  4. package/scripts/build-tui.mjs +52 -0
  5. package/scripts/compact-smoke.mjs +199 -0
  6. package/scripts/lead-workflow-smoke.mjs +598 -0
  7. package/scripts/live-worker-smoke.mjs +239 -0
  8. package/scripts/output-style-smoke.mjs +101 -0
  9. package/scripts/session-context-bench.mjs +172 -0
  10. package/scripts/smoke-loop-report.mjs +221 -0
  11. package/scripts/smoke-loop.mjs +201 -0
  12. package/scripts/smoke.mjs +113 -0
  13. package/scripts/tool-failures.mjs +143 -0
  14. package/scripts/tool-smoke.mjs +452 -0
  15. package/src/agents/debugger/AGENT.md +3 -0
  16. package/src/agents/debugger/agent.json +6 -0
  17. package/src/agents/explore/AGENT.md +4 -0
  18. package/src/agents/explore/agent.json +6 -0
  19. package/src/agents/heavy-worker/AGENT.md +3 -0
  20. package/src/agents/heavy-worker/agent.json +6 -0
  21. package/src/agents/maintainer/AGENT.md +3 -0
  22. package/src/agents/maintainer/agent.json +6 -0
  23. package/src/agents/reviewer/AGENT.md +3 -0
  24. package/src/agents/reviewer/agent.json +6 -0
  25. package/src/agents/scheduler-task.md +3 -0
  26. package/src/agents/web-researcher/AGENT.md +3 -0
  27. package/src/agents/web-researcher/agent.json +6 -0
  28. package/src/agents/webhook-handler.md +3 -0
  29. package/src/agents/worker/AGENT.md +3 -0
  30. package/src/agents/worker/agent.json +6 -0
  31. package/src/app.mjs +90 -0
  32. package/src/cli.mjs +11 -0
  33. package/src/defaults/hidden-roles.json +72 -0
  34. package/src/defaults/mixdog-config.template.json +15 -0
  35. package/src/hooks/lib/permission-evaluator.cjs +488 -0
  36. package/src/hooks/lib/settings-loader.cjs +112 -0
  37. package/src/lib/keychain-cjs.cjs +332 -0
  38. package/src/lib/plugin-paths.cjs +28 -0
  39. package/src/lib/rules-builder.cjs +315 -0
  40. package/src/mixdog-session-runtime.mjs +3813 -0
  41. package/src/output-styles/default.md +38 -0
  42. package/src/output-styles/extreme-simple.md +17 -0
  43. package/src/output-styles/simple.md +17 -0
  44. package/src/repl.mjs +330 -0
  45. package/src/rules/bridge/00-common.md +5 -0
  46. package/src/rules/bridge/20-skip-protocol.md +11 -0
  47. package/src/rules/bridge/30-explorer.md +4 -0
  48. package/src/rules/bridge/40-cycle1-agent.md +28 -0
  49. package/src/rules/bridge/41-cycle2-agent.md +59 -0
  50. package/src/rules/lead/00-tool-lead.md +5 -0
  51. package/src/rules/lead/01-general.md +5 -0
  52. package/src/rules/lead/02-channels.md +3 -0
  53. package/src/rules/lead/04-workflow.md +12 -0
  54. package/src/rules/shared/00-language.md +3 -0
  55. package/src/rules/shared/01-tool.md +3 -0
  56. package/src/runtime/agent/orchestrator/bridge-trace.mjs +814 -0
  57. package/src/runtime/agent/orchestrator/cache-mtime.mjs +60 -0
  58. package/src/runtime/agent/orchestrator/config.mjs +446 -0
  59. package/src/runtime/agent/orchestrator/context/collect.mjs +796 -0
  60. package/src/runtime/agent/orchestrator/dispatch-persist.mjs +417 -0
  61. package/src/runtime/agent/orchestrator/internal-roles.mjs +188 -0
  62. package/src/runtime/agent/orchestrator/internal-tools.mjs +88 -0
  63. package/src/runtime/agent/orchestrator/mcp/client.mjs +345 -0
  64. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2104 -0
  65. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +784 -0
  66. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +341 -0
  67. package/src/runtime/agent/orchestrator/providers/gemini.mjs +1679 -0
  68. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +959 -0
  69. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +213 -0
  70. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +38 -0
  71. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +471 -0
  72. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +615 -0
  73. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +808 -0
  74. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +1719 -0
  75. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2587 -0
  76. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +1953 -0
  77. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +136 -0
  78. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +317 -0
  79. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +109 -0
  80. package/src/runtime/agent/orchestrator/providers/registry.mjs +247 -0
  81. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +332 -0
  82. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +11 -0
  83. package/src/runtime/agent/orchestrator/providers/trace-utils.mjs +50 -0
  84. package/src/runtime/agent/orchestrator/session/cache/post-edit-marks.mjs +42 -0
  85. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +142 -0
  86. package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +318 -0
  87. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +367 -0
  88. package/src/runtime/agent/orchestrator/session/compact.mjs +882 -0
  89. package/src/runtime/agent/orchestrator/session/context-utils.mjs +233 -0
  90. package/src/runtime/agent/orchestrator/session/loop.mjs +2269 -0
  91. package/src/runtime/agent/orchestrator/session/manager.mjs +2972 -0
  92. package/src/runtime/agent/orchestrator/session/result-classification.mjs +65 -0
  93. package/src/runtime/agent/orchestrator/session/store.mjs +870 -0
  94. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +166 -0
  95. package/src/runtime/agent/orchestrator/smart-bridge/bridge-llm.mjs +339 -0
  96. package/src/runtime/agent/orchestrator/smart-bridge/cache-strategy.mjs +419 -0
  97. package/src/runtime/agent/orchestrator/stall-policy.mjs +227 -0
  98. package/src/runtime/agent/orchestrator/tool-loop-guard.mjs +235 -0
  99. package/src/runtime/agent/orchestrator/tools/bash-session.mjs +723 -0
  100. package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +171 -0
  101. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +389 -0
  102. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +637 -0
  103. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +165 -0
  104. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +104 -0
  105. package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +194 -0
  106. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +596 -0
  107. package/src/runtime/agent/orchestrator/tools/builtin/native-edit-runner.mjs +110 -0
  108. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +153 -0
  109. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +118 -0
  110. package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +189 -0
  111. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +731 -0
  112. package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +168 -0
  113. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +602 -0
  114. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +465 -0
  115. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +160 -0
  116. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +982 -0
  117. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +1087 -0
  118. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +231 -0
  119. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +223 -0
  120. package/src/runtime/agent/orchestrator/tools/builtin.mjs +478 -0
  121. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +24 -0
  122. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4102 -0
  123. package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +323 -0
  124. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +154 -0
  125. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +26 -0
  126. package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +143 -0
  127. package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +18 -0
  128. package/src/runtime/agent/orchestrator/tools/patch.mjs +2772 -0
  129. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +114 -0
  130. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +880 -0
  131. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +312 -0
  132. package/src/runtime/channels/backends/discord.mjs +781 -0
  133. package/src/runtime/channels/data/voice-runtime-manifest.json +138 -0
  134. package/src/runtime/channels/index.mjs +3309 -0
  135. package/src/runtime/channels/lib/config.mjs +285 -0
  136. package/src/runtime/channels/lib/drop-trace.mjs +71 -0
  137. package/src/runtime/channels/lib/event-pipeline.mjs +81 -0
  138. package/src/runtime/channels/lib/holidays.mjs +138 -0
  139. package/src/runtime/channels/lib/hook-pipe-server.mjs +671 -0
  140. package/src/runtime/channels/lib/output-forwarder.mjs +765 -0
  141. package/src/runtime/channels/lib/runtime-paths.mjs +497 -0
  142. package/src/runtime/channels/lib/scheduler.mjs +710 -0
  143. package/src/runtime/channels/lib/session-discovery.mjs +102 -0
  144. package/src/runtime/channels/lib/state-file.mjs +68 -0
  145. package/src/runtime/channels/lib/status-snapshot.mjs +224 -0
  146. package/src/runtime/channels/lib/tool-format.mjs +122 -0
  147. package/src/runtime/channels/lib/transcript-discovery.mjs +195 -0
  148. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +734 -0
  149. package/src/runtime/channels/lib/webhook.mjs +1288 -0
  150. package/src/runtime/channels/tool-defs.mjs +177 -0
  151. package/src/runtime/lib/keychain-cjs.cjs +289 -0
  152. package/src/runtime/memory/data/runtime-manifest.json +40 -0
  153. package/src/runtime/memory/index.mjs +3706 -0
  154. package/src/runtime/memory/lib/core-memory-store.mjs +336 -0
  155. package/src/runtime/memory/lib/embedding-provider.mjs +275 -0
  156. package/src/runtime/memory/lib/embedding-worker.mjs +331 -0
  157. package/src/runtime/memory/lib/memory-cycle-requests.mjs +276 -0
  158. package/src/runtime/memory/lib/memory-cycle1.mjs +783 -0
  159. package/src/runtime/memory/lib/memory-cycle2.mjs +1389 -0
  160. package/src/runtime/memory/lib/memory-cycle3.mjs +646 -0
  161. package/src/runtime/memory/lib/memory-embed.mjs +300 -0
  162. package/src/runtime/memory/lib/memory-ops-policy.mjs +149 -0
  163. package/src/runtime/memory/lib/memory-recall-store.mjs +644 -0
  164. package/src/runtime/memory/lib/memory.mjs +418 -0
  165. package/src/runtime/memory/lib/pg/adapter.mjs +328 -0
  166. package/src/runtime/memory/lib/pg/process.mjs +366 -0
  167. package/src/runtime/memory/lib/pg/supervisor.mjs +495 -0
  168. package/src/runtime/memory/lib/runtime-fetcher.mjs +464 -0
  169. package/src/runtime/memory/lib/trace-store.mjs +734 -0
  170. package/src/runtime/memory/tool-defs.mjs +79 -0
  171. package/src/runtime/search/index.mjs +925 -0
  172. package/src/runtime/search/lib/config.mjs +61 -0
  173. package/src/runtime/search/lib/web-tools.mjs +1278 -0
  174. package/src/runtime/search/tool-defs.mjs +64 -0
  175. package/src/runtime/shared/atomic-file.mjs +435 -0
  176. package/src/runtime/shared/background-tasks.mjs +376 -0
  177. package/src/runtime/shared/child-guardian.mjs +98 -0
  178. package/src/runtime/shared/config.mjs +393 -0
  179. package/src/runtime/shared/err-text.mjs +121 -0
  180. package/src/runtime/shared/launcher-control.mjs +259 -0
  181. package/src/runtime/shared/llm/http-agent.mjs +129 -0
  182. package/src/runtime/shared/open-url.mjs +37 -0
  183. package/src/runtime/shared/plugin-paths.mjs +25 -0
  184. package/src/runtime/shared/process-shutdown.mjs +147 -0
  185. package/src/runtime/shared/schedules-store.mjs +70 -0
  186. package/src/runtime/shared/tool-execution-contract.mjs +104 -0
  187. package/src/runtime/shared/tool-surface.mjs +947 -0
  188. package/src/runtime/shared/user-cwd.mjs +221 -0
  189. package/src/runtime/shared/user-data-guard.mjs +232 -0
  190. package/src/runtime/shared/workspace-router.mjs +259 -0
  191. package/src/standalone/bridge-tool.mjs +1414 -0
  192. package/src/standalone/channel-admin.mjs +366 -0
  193. package/src/standalone/channel-worker-preload.cjs +3 -0
  194. package/src/standalone/channel-worker.mjs +353 -0
  195. package/src/standalone/explore-tool.mjs +233 -0
  196. package/src/standalone/hook-bus.mjs +246 -0
  197. package/src/standalone/plugin-admin.mjs +247 -0
  198. package/src/standalone/provider-admin.mjs +338 -0
  199. package/src/standalone/seeds.mjs +94 -0
  200. package/src/standalone/usage-dashboard.mjs +510 -0
  201. package/src/tui/App.jsx +5446 -0
  202. package/src/tui/components/AnsiText.jsx +199 -0
  203. package/src/tui/components/ContextPanel.jsx +265 -0
  204. package/src/tui/components/Markdown.jsx +205 -0
  205. package/src/tui/components/MarkdownTable.jsx +204 -0
  206. package/src/tui/components/Message.jsx +103 -0
  207. package/src/tui/components/Picker.jsx +317 -0
  208. package/src/tui/components/PromptInput.jsx +584 -0
  209. package/src/tui/components/QueuedCommands.jsx +47 -0
  210. package/src/tui/components/SlashCommandPalette.jsx +114 -0
  211. package/src/tui/components/Spinner.jsx +317 -0
  212. package/src/tui/components/StatusLine.jsx +87 -0
  213. package/src/tui/components/TextEntryPanel.jsx +323 -0
  214. package/src/tui/components/ToolExecution.jsx +791 -0
  215. package/src/tui/components/TurnDone.jsx +78 -0
  216. package/src/tui/components/UsagePanel.jsx +331 -0
  217. package/src/tui/dist/index.mjs +12420 -0
  218. package/src/tui/engine.mjs +2410 -0
  219. package/src/tui/figures.mjs +50 -0
  220. package/src/tui/hooks/useEngine.mjs +16 -0
  221. package/src/tui/index.jsx +254 -0
  222. package/src/tui/input-editing.mjs +242 -0
  223. package/src/tui/markdown/format-token.mjs +194 -0
  224. package/src/tui/paste-attachments.mjs +198 -0
  225. package/src/tui/runtime/shared/process-shutdown.mjs +1 -0
  226. package/src/tui/spinner-verbs.mjs +45 -0
  227. package/src/tui/theme.mjs +67 -0
  228. package/src/tui/time-format.mjs +53 -0
  229. package/src/ui/ansi.mjs +115 -0
  230. package/src/ui/markdown.mjs +195 -0
  231. package/src/ui/statusline.mjs +730 -0
  232. package/src/ui/tool-card.mjs +99 -0
  233. package/src/vendor/statusline/bin/statusline-lib.mjs +805 -0
  234. package/src/vendor/statusline/bin/statusline-route.mjs +596 -0
  235. package/src/vendor/statusline/scripts/lib/gateway-settings.mjs +285 -0
  236. package/src/vendor/statusline/src/gateway/claude-current.mjs +320 -0
  237. package/src/vendor/statusline/src/gateway/route-meta.mjs +753 -0
  238. package/src/vendor/statusline/src/gateway/session-routes.mjs +244 -0
  239. package/src/workflows/default/WORKFLOW.md +7 -0
  240. package/src/workflows/default/workflow.json +14 -0
  241. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  242. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  243. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  244. package/vendor/ink/build/colorize.d.ts +3 -0
  245. package/vendor/ink/build/colorize.js +48 -0
  246. package/vendor/ink/build/colorize.js.map +1 -0
  247. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  248. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  249. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  250. package/vendor/ink/build/components/AnimationContext.d.ts +9 -0
  251. package/vendor/ink/build/components/AnimationContext.js +13 -0
  252. package/vendor/ink/build/components/AnimationContext.js.map +1 -0
  253. package/vendor/ink/build/components/App.d.ts +24 -0
  254. package/vendor/ink/build/components/App.js +554 -0
  255. package/vendor/ink/build/components/App.js.map +1 -0
  256. package/vendor/ink/build/components/AppContext.d.ts +80 -0
  257. package/vendor/ink/build/components/AppContext.js +25 -0
  258. package/vendor/ink/build/components/AppContext.js.map +1 -0
  259. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  260. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  261. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  262. package/vendor/ink/build/components/Box.d.ts +130 -0
  263. package/vendor/ink/build/components/Box.js +34 -0
  264. package/vendor/ink/build/components/Box.js.map +1 -0
  265. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  266. package/vendor/ink/build/components/CursorContext.js +8 -0
  267. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  268. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  269. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  270. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  271. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  272. package/vendor/ink/build/components/ErrorOverview.js +90 -0
  273. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  274. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  275. package/vendor/ink/build/components/FocusContext.js +17 -0
  276. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  277. package/vendor/ink/build/components/Newline.d.ts +13 -0
  278. package/vendor/ink/build/components/Newline.js +8 -0
  279. package/vendor/ink/build/components/Newline.js.map +1 -0
  280. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  281. package/vendor/ink/build/components/Spacer.js +11 -0
  282. package/vendor/ink/build/components/Spacer.js.map +1 -0
  283. package/vendor/ink/build/components/Static.d.ts +24 -0
  284. package/vendor/ink/build/components/Static.js +28 -0
  285. package/vendor/ink/build/components/Static.js.map +1 -0
  286. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  287. package/vendor/ink/build/components/StderrContext.js +13 -0
  288. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  289. package/vendor/ink/build/components/StdinContext.d.ts +28 -0
  290. package/vendor/ink/build/components/StdinContext.js +20 -0
  291. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  292. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  293. package/vendor/ink/build/components/StdoutContext.js +13 -0
  294. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  295. package/vendor/ink/build/components/Text.d.ts +55 -0
  296. package/vendor/ink/build/components/Text.js +50 -0
  297. package/vendor/ink/build/components/Text.js.map +1 -0
  298. package/vendor/ink/build/components/Transform.d.ts +16 -0
  299. package/vendor/ink/build/components/Transform.js +15 -0
  300. package/vendor/ink/build/components/Transform.js.map +1 -0
  301. package/vendor/ink/build/cursor-helpers.d.ts +39 -0
  302. package/vendor/ink/build/cursor-helpers.js +62 -0
  303. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  304. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  305. package/vendor/ink/build/devtools-window-polyfill.js +68 -0
  306. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  307. package/vendor/ink/build/devtools.d.ts +1 -0
  308. package/vendor/ink/build/devtools.js +36 -0
  309. package/vendor/ink/build/devtools.js.map +1 -0
  310. package/vendor/ink/build/dom.d.ts +62 -0
  311. package/vendor/ink/build/dom.js +143 -0
  312. package/vendor/ink/build/dom.js.map +1 -0
  313. package/vendor/ink/build/get-max-width.d.ts +3 -0
  314. package/vendor/ink/build/get-max-width.js +10 -0
  315. package/vendor/ink/build/get-max-width.js.map +1 -0
  316. package/vendor/ink/build/hooks/use-animation.d.ts +49 -0
  317. package/vendor/ink/build/hooks/use-animation.js +87 -0
  318. package/vendor/ink/build/hooks/use-animation.js.map +1 -0
  319. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  320. package/vendor/ink/build/hooks/use-app.js +8 -0
  321. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  322. package/vendor/ink/build/hooks/use-box-metrics.d.ts +59 -0
  323. package/vendor/ink/build/hooks/use-box-metrics.js +81 -0
  324. package/vendor/ink/build/hooks/use-box-metrics.js.map +1 -0
  325. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  326. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  327. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  328. package/vendor/ink/build/hooks/use-focus-manager.d.ts +43 -0
  329. package/vendor/ink/build/hooks/use-focus-manager.js +18 -0
  330. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  331. package/vendor/ink/build/hooks/use-focus.d.ts +30 -0
  332. package/vendor/ink/build/hooks/use-focus.js +43 -0
  333. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  334. package/vendor/ink/build/hooks/use-input.d.ts +132 -0
  335. package/vendor/ink/build/hooks/use-input.js +126 -0
  336. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  337. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +6 -0
  338. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +12 -0
  339. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  340. package/vendor/ink/build/hooks/use-paste.d.ts +35 -0
  341. package/vendor/ink/build/hooks/use-paste.js +62 -0
  342. package/vendor/ink/build/hooks/use-paste.js.map +1 -0
  343. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  344. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  345. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  346. package/vendor/ink/build/hooks/use-stdin.d.ts +7 -0
  347. package/vendor/ink/build/hooks/use-stdin.js +9 -0
  348. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  349. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  350. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  351. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  352. package/vendor/ink/build/hooks/use-window-size.d.ts +18 -0
  353. package/vendor/ink/build/hooks/use-window-size.js +22 -0
  354. package/vendor/ink/build/hooks/use-window-size.js.map +1 -0
  355. package/vendor/ink/build/index.d.ts +42 -0
  356. package/vendor/ink/build/index.js +24 -0
  357. package/vendor/ink/build/index.js.map +1 -0
  358. package/vendor/ink/build/ink.d.ts +146 -0
  359. package/vendor/ink/build/ink.js +1022 -0
  360. package/vendor/ink/build/ink.js.map +1 -0
  361. package/vendor/ink/build/input-parser.d.ts +10 -0
  362. package/vendor/ink/build/input-parser.js +194 -0
  363. package/vendor/ink/build/input-parser.js.map +1 -0
  364. package/vendor/ink/build/instances.d.ts +3 -0
  365. package/vendor/ink/build/instances.js +8 -0
  366. package/vendor/ink/build/instances.js.map +1 -0
  367. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  368. package/vendor/ink/build/kitty-keyboard.js +32 -0
  369. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  370. package/vendor/ink/build/log-update.d.ts +20 -0
  371. package/vendor/ink/build/log-update.js +261 -0
  372. package/vendor/ink/build/log-update.js.map +1 -0
  373. package/vendor/ink/build/measure-element.d.ts +20 -0
  374. package/vendor/ink/build/measure-element.js +13 -0
  375. package/vendor/ink/build/measure-element.js.map +1 -0
  376. package/vendor/ink/build/measure-text.d.ts +6 -0
  377. package/vendor/ink/build/measure-text.js +21 -0
  378. package/vendor/ink/build/measure-text.js.map +1 -0
  379. package/vendor/ink/build/output.d.ts +35 -0
  380. package/vendor/ink/build/output.js +328 -0
  381. package/vendor/ink/build/output.js.map +1 -0
  382. package/vendor/ink/build/parse-keypress.d.ts +20 -0
  383. package/vendor/ink/build/parse-keypress.js +495 -0
  384. package/vendor/ink/build/parse-keypress.js.map +1 -0
  385. package/vendor/ink/build/reconciler.d.ts +4 -0
  386. package/vendor/ink/build/reconciler.js +306 -0
  387. package/vendor/ink/build/reconciler.js.map +1 -0
  388. package/vendor/ink/build/render-background.d.ts +4 -0
  389. package/vendor/ink/build/render-background.js +25 -0
  390. package/vendor/ink/build/render-background.js.map +1 -0
  391. package/vendor/ink/build/render-border.d.ts +4 -0
  392. package/vendor/ink/build/render-border.js +84 -0
  393. package/vendor/ink/build/render-border.js.map +1 -0
  394. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  395. package/vendor/ink/build/render-node-to-output.js +162 -0
  396. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  397. package/vendor/ink/build/render-to-string.d.ts +38 -0
  398. package/vendor/ink/build/render-to-string.js +116 -0
  399. package/vendor/ink/build/render-to-string.js.map +1 -0
  400. package/vendor/ink/build/render.d.ts +176 -0
  401. package/vendor/ink/build/render.js +71 -0
  402. package/vendor/ink/build/render.js.map +1 -0
  403. package/vendor/ink/build/renderer.d.ts +8 -0
  404. package/vendor/ink/build/renderer.js +64 -0
  405. package/vendor/ink/build/renderer.js.map +1 -0
  406. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  407. package/vendor/ink/build/sanitize-ansi.js +27 -0
  408. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  409. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  410. package/vendor/ink/build/squash-text-nodes.js +36 -0
  411. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  412. package/vendor/ink/build/styles.d.ts +302 -0
  413. package/vendor/ink/build/styles.js +303 -0
  414. package/vendor/ink/build/styles.js.map +1 -0
  415. package/vendor/ink/build/utils.d.ts +9 -0
  416. package/vendor/ink/build/utils.js +19 -0
  417. package/vendor/ink/build/utils.js.map +1 -0
  418. package/vendor/ink/build/wrap-text.d.ts +3 -0
  419. package/vendor/ink/build/wrap-text.js +38 -0
  420. package/vendor/ink/build/wrap-text.js.map +1 -0
  421. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  422. package/vendor/ink/build/write-synchronized.js +9 -0
  423. package/vendor/ink/build/write-synchronized.js.map +1 -0
  424. package/vendor/ink/license +10 -0
  425. package/vendor/ink/package.json +137 -0
  426. package/.claude-plugin/marketplace.json +0 -34
  427. package/.claude-plugin/plugin.json +0 -20
  428. package/.gitattributes +0 -34
  429. package/.mcp.json +0 -14
  430. package/ARCHITECTURE.md +0 -77
  431. package/CHANGELOG.md +0 -30
  432. package/CONTRIBUTING.md +0 -45
  433. package/DATA-FLOW.md +0 -79
  434. package/LICENSE +0 -21
  435. package/SECURITY.md +0 -138
  436. package/UNINSTALL.md +0 -115
  437. package/agents/maintenance.md +0 -5
  438. package/agents/memory-classification.md +0 -30
  439. package/agents/scheduler-task.md +0 -18
  440. package/agents/webhook-handler.md +0 -27
  441. package/agents/worker.md +0 -24
  442. package/bin/bridge +0 -133
  443. package/bin/statusline-launcher.mjs +0 -82
  444. package/bin/statusline-lib.mjs +0 -581
  445. package/bin/statusline-route.mjs +0 -273
  446. package/bin/statusline.mjs +0 -638
  447. package/bun.lock +0 -927
  448. package/commands/config.md +0 -16
  449. package/commands/doctor.md +0 -13
  450. package/commands/model.md +0 -61
  451. package/commands/setup.md +0 -17
  452. package/defaults/hidden-roles.json +0 -68
  453. package/defaults/memory-chunk-prompt.md +0 -63
  454. package/defaults/mixdog-config.template.json +0 -27
  455. package/defaults/user-workflow.json +0 -8
  456. package/defaults/user-workflow.md +0 -17
  457. package/hooks/hooks.json +0 -73
  458. package/hooks/lib/active-instance.cjs +0 -77
  459. package/hooks/lib/permission-evaluator.cjs +0 -411
  460. package/hooks/lib/permission-route.cjs +0 -63
  461. package/hooks/lib/settings-loader.cjs +0 -117
  462. package/hooks/post-tool-use.cjs +0 -84
  463. package/hooks/pre-mcp-sandbox.cjs +0 -158
  464. package/hooks/pre-tool-subagent.cjs +0 -258
  465. package/hooks/session-start.cjs +0 -1493
  466. package/hooks/shim-launcher.cjs +0 -65
  467. package/hooks/turn-timer.cjs +0 -82
  468. package/lib/claude-md-writer.cjs +0 -386
  469. package/lib/keychain-cjs.cjs +0 -290
  470. package/lib/plugin-paths.cjs +0 -69
  471. package/lib/rules-builder.cjs +0 -241
  472. package/native/README.md +0 -117
  473. package/native/prebuilt/linux-aarch64/mixdog-shim +0 -0
  474. package/native/prebuilt/linux-x86_64/mixdog-shim +0 -0
  475. package/native/prebuilt/macos-aarch64/mixdog-shim +0 -0
  476. package/native/prebuilt/macos-x86_64/mixdog-shim +0 -0
  477. package/native/prebuilt/windows-x86_64/mixdog-shim.exe +0 -0
  478. package/prompts/code-review.txt +0 -16
  479. package/prompts/security-audit.txt +0 -17
  480. package/rules/bridge/00-common.md +0 -39
  481. package/rules/bridge/20-skip-protocol.md +0 -18
  482. package/rules/bridge/30-explorer.md +0 -33
  483. package/rules/bridge/40-cycle1-agent.md +0 -52
  484. package/rules/bridge/41-cycle2-agent.md +0 -62
  485. package/rules/lead/00-tool-lead.md +0 -61
  486. package/rules/lead/01-general.md +0 -26
  487. package/rules/lead/02-channels.md +0 -49
  488. package/rules/lead/03-team.md +0 -27
  489. package/rules/lead/04-workflow.md +0 -20
  490. package/rules/shared/00-language.md +0 -14
  491. package/rules/shared/01-tool.md +0 -138
  492. package/scripts/bootstrap.mjs +0 -130
  493. package/scripts/bridge-unify-smoke.mjs +0 -308
  494. package/scripts/build-runtime-linux.sh +0 -348
  495. package/scripts/build-runtime-macos.sh +0 -217
  496. package/scripts/build-runtime-windows.ps1 +0 -242
  497. package/scripts/builtin-utils-smoke.mjs +0 -398
  498. package/scripts/bump.mjs +0 -80
  499. package/scripts/check-json.mjs +0 -45
  500. package/scripts/check-syntax-changed.mjs +0 -102
  501. package/scripts/check-syntax.mjs +0 -58
  502. package/scripts/code-graph-batch.test.mjs +0 -33
  503. package/scripts/config-preserve-smoke.mjs +0 -180
  504. package/scripts/doctor.mjs +0 -489
  505. package/scripts/edit-normalize-fuzz.mjs +0 -130
  506. package/scripts/edit-normalize-smoke.mjs +0 -401
  507. package/scripts/edit-operation-smoke.mjs +0 -369
  508. package/scripts/edit2-smoke.mjs +0 -63
  509. package/scripts/ensure-deps.mjs +0 -259
  510. package/scripts/fuzzy-e2e.mjs +0 -28
  511. package/scripts/fuzzy-smoke.mjs +0 -26
  512. package/scripts/gateway-model.mjs +0 -596
  513. package/scripts/generate-runtime-manifest.mjs +0 -166
  514. package/scripts/guard-smoke.mjs +0 -66
  515. package/scripts/hidden-role-schema-smoke.mjs +0 -162
  516. package/scripts/hook-routing-smoke.mjs +0 -29
  517. package/scripts/inject-input.ps1 +0 -204
  518. package/scripts/io-complex-smoke.mjs +0 -667
  519. package/scripts/io-explore-bench.mjs +0 -424
  520. package/scripts/io-guardrails-smoke.mjs +0 -205
  521. package/scripts/io-mini-bench-baseline.json +0 -11
  522. package/scripts/io-mini-bench.mjs +0 -216
  523. package/scripts/io-route-harness.mjs +0 -933
  524. package/scripts/io-telemetry-report.mjs +0 -691
  525. package/scripts/lib/gateway-inventory.mjs +0 -178
  526. package/scripts/lib/gateway-settings.mjs +0 -78
  527. package/scripts/mutation-bench.mjs +0 -564
  528. package/scripts/mutation-io-smoke.mjs +0 -1097
  529. package/scripts/native-patch-bridge-smoke.mjs +0 -288
  530. package/scripts/native-patch-smoke.mjs +0 -304
  531. package/scripts/openai-oauth-catalog-smoke.mjs +0 -53
  532. package/scripts/patch-interior-context-smoke.mjs +0 -49
  533. package/scripts/patch-newline-utf8-smoke.mjs +0 -157
  534. package/scripts/perf-hook-smoke.mjs +0 -71
  535. package/scripts/permission-eval-smoke.mjs +0 -443
  536. package/scripts/prep-patch.mjs +0 -53
  537. package/scripts/prep-shim.mjs +0 -96
  538. package/scripts/provider-cache-smoke.mjs +0 -687
  539. package/scripts/report-runtime-health.mjs +0 -132
  540. package/scripts/resolve-bun.mjs +0 -60
  541. package/scripts/run-mcp.mjs +0 -1473
  542. package/scripts/salvage-v4a-shatter.test.mjs +0 -58
  543. package/scripts/scoped-cache-io-smoke.mjs +0 -103
  544. package/scripts/shell-policy-round3-smoke.mjs +0 -46
  545. package/scripts/smoke-runtime-negative.ps1 +0 -100
  546. package/scripts/smoke-runtime-negative.sh +0 -95
  547. package/scripts/stall-policy-smoke.mjs +0 -50
  548. package/scripts/start-memory-worker.mjs +0 -23
  549. package/scripts/statusline-launcher-smoke.mjs +0 -235
  550. package/scripts/stress-atomic-write.mjs +0 -1028
  551. package/scripts/test-fault-inject.mjs +0 -164
  552. package/scripts/test-large-file.mjs +0 -174
  553. package/scripts/tool-edge-smoke.mjs +0 -209
  554. package/scripts/uninstall.mjs +0 -238
  555. package/scripts/webhook-selfheal-smoke.mjs +0 -27
  556. package/scripts/write-overwrite-guard-smoke.mjs +0 -56
  557. package/server-main.mjs +0 -3350
  558. package/server.mjs +0 -468
  559. package/setup/config-merge.mjs +0 -246
  560. package/setup/install.mjs +0 -574
  561. package/setup/launch-core.mjs +0 -617
  562. package/setup/launch.mjs +0 -101
  563. package/setup/locate-claude.mjs +0 -56
  564. package/setup/mixdog-cli.mjs +0 -122
  565. package/setup/setup-server.mjs +0 -3305
  566. package/setup/setup.html +0 -3740
  567. package/setup/tui.mjs +0 -325
  568. package/skills/retro-skill-proposer/SKILL.md +0 -92
  569. package/skills/schedule-add/SKILL.md +0 -77
  570. package/skills/setup/SKILL.md +0 -356
  571. package/skills/webhook-add/SKILL.md +0 -81
  572. package/src/agent/bridge-stall-watchdog.mjs +0 -337
  573. package/src/agent/index.mjs +0 -2229
  574. package/src/agent/orchestrator/ai-wrapped-dispatch.mjs +0 -1010
  575. package/src/agent/orchestrator/bridge-retry.mjs +0 -220
  576. package/src/agent/orchestrator/bridge-trace.mjs +0 -601
  577. package/src/agent/orchestrator/cache-mtime.mjs +0 -58
  578. package/src/agent/orchestrator/config.mjs +0 -405
  579. package/src/agent/orchestrator/context/collect.mjs +0 -651
  580. package/src/agent/orchestrator/dispatch-persist.mjs +0 -549
  581. package/src/agent/orchestrator/drain-registry.mjs +0 -50
  582. package/src/agent/orchestrator/explore-validator.mjs +0 -8
  583. package/src/agent/orchestrator/internal-roles.mjs +0 -118
  584. package/src/agent/orchestrator/internal-tools.mjs +0 -88
  585. package/src/agent/orchestrator/jobs.mjs +0 -116
  586. package/src/agent/orchestrator/mcp/client.mjs +0 -364
  587. package/src/agent/orchestrator/providers/anthropic-oauth.mjs +0 -1884
  588. package/src/agent/orchestrator/providers/anthropic.mjs +0 -598
  589. package/src/agent/orchestrator/providers/gemini.mjs +0 -1530
  590. package/src/agent/orchestrator/providers/grok-oauth.mjs +0 -779
  591. package/src/agent/orchestrator/providers/model-catalog.mjs +0 -374
  592. package/src/agent/orchestrator/providers/openai-compat-stream.mjs +0 -366
  593. package/src/agent/orchestrator/providers/openai-compat.mjs +0 -1511
  594. package/src/agent/orchestrator/providers/openai-oauth-ws.mjs +0 -1891
  595. package/src/agent/orchestrator/providers/openai-oauth.mjs +0 -1456
  596. package/src/agent/orchestrator/providers/openai-ws.mjs +0 -127
  597. package/src/agent/orchestrator/providers/registry.mjs +0 -192
  598. package/src/agent/orchestrator/providers/retry-classifier.mjs +0 -325
  599. package/src/agent/orchestrator/session/cache/post-edit-marks.mjs +0 -42
  600. package/src/agent/orchestrator/session/cache/prefetch-cache.mjs +0 -142
  601. package/src/agent/orchestrator/session/cache/read-cache.mjs +0 -319
  602. package/src/agent/orchestrator/session/cache/scoped-cache.mjs +0 -361
  603. package/src/agent/orchestrator/session/loop.mjs +0 -1619
  604. package/src/agent/orchestrator/session/manager.mjs +0 -1991
  605. package/src/agent/orchestrator/session/result-classification.mjs +0 -65
  606. package/src/agent/orchestrator/session/store.mjs +0 -632
  607. package/src/agent/orchestrator/session/stream-watchdog.mjs +0 -130
  608. package/src/agent/orchestrator/session/tool-result-offload.mjs +0 -166
  609. package/src/agent/orchestrator/session/trim.mjs +0 -491
  610. package/src/agent/orchestrator/smart-bridge/CACHE-SHARD.md +0 -115
  611. package/src/agent/orchestrator/smart-bridge/bridge-llm.mjs +0 -331
  612. package/src/agent/orchestrator/smart-bridge/cache-obs.mjs +0 -150
  613. package/src/agent/orchestrator/smart-bridge/cache-strategy.mjs +0 -228
  614. package/src/agent/orchestrator/smart-bridge/index.mjs +0 -215
  615. package/src/agent/orchestrator/smart-bridge/profiles.mjs +0 -37
  616. package/src/agent/orchestrator/smart-bridge/registry.mjs +0 -348
  617. package/src/agent/orchestrator/stall-policy.mjs +0 -201
  618. package/src/agent/orchestrator/tool-loop-guard.mjs +0 -75
  619. package/src/agent/orchestrator/tools/bash-session.mjs +0 -722
  620. package/src/agent/orchestrator/tools/builtin/advisory-lock.mjs +0 -171
  621. package/src/agent/orchestrator/tools/builtin/arg-guard.mjs +0 -511
  622. package/src/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -480
  623. package/src/agent/orchestrator/tools/builtin/builtin-tools.mjs +0 -256
  624. package/src/agent/orchestrator/tools/builtin/edit-base-guard.mjs +0 -58
  625. package/src/agent/orchestrator/tools/builtin/edit-byte-plan.mjs +0 -240
  626. package/src/agent/orchestrator/tools/builtin/edit-byte-utils.mjs +0 -113
  627. package/src/agent/orchestrator/tools/builtin/edit-commit.mjs +0 -74
  628. package/src/agent/orchestrator/tools/builtin/edit-context-utils.mjs +0 -242
  629. package/src/agent/orchestrator/tools/builtin/edit-diagnostics.mjs +0 -211
  630. package/src/agent/orchestrator/tools/builtin/edit-engine.mjs +0 -1364
  631. package/src/agent/orchestrator/tools/builtin/edit-failure-context.mjs +0 -126
  632. package/src/agent/orchestrator/tools/builtin/edit-hint.mjs +0 -141
  633. package/src/agent/orchestrator/tools/builtin/edit-match-utils.mjs +0 -194
  634. package/src/agent/orchestrator/tools/builtin/edit-partial-write.mjs +0 -60
  635. package/src/agent/orchestrator/tools/builtin/edit-stale-refresh.mjs +0 -168
  636. package/src/agent/orchestrator/tools/builtin/edit-tool.mjs +0 -173
  637. package/src/agent/orchestrator/tools/builtin/edit-utf8-guard.mjs +0 -48
  638. package/src/agent/orchestrator/tools/builtin/fuzzy-match.mjs +0 -99
  639. package/src/agent/orchestrator/tools/builtin/glob-walk.mjs +0 -193
  640. package/src/agent/orchestrator/tools/builtin/list-tool.mjs +0 -597
  641. package/src/agent/orchestrator/tools/builtin/native-edit-runner.mjs +0 -110
  642. package/src/agent/orchestrator/tools/builtin/notebook-edit-tool.mjs +0 -300
  643. package/src/agent/orchestrator/tools/builtin/path-diagnostics.mjs +0 -152
  644. package/src/agent/orchestrator/tools/builtin/read-formatting.mjs +0 -118
  645. package/src/agent/orchestrator/tools/builtin/read-open.mjs +0 -190
  646. package/src/agent/orchestrator/tools/builtin/read-single-tool.mjs +0 -728
  647. package/src/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +0 -173
  648. package/src/agent/orchestrator/tools/builtin/read-streaming.mjs +0 -602
  649. package/src/agent/orchestrator/tools/builtin/rename-tool.mjs +0 -196
  650. package/src/agent/orchestrator/tools/builtin/rg-runner.mjs +0 -422
  651. package/src/agent/orchestrator/tools/builtin/search-builders.mjs +0 -158
  652. package/src/agent/orchestrator/tools/builtin/search-tool.mjs +0 -869
  653. package/src/agent/orchestrator/tools/builtin/shell-jobs.mjs +0 -962
  654. package/src/agent/orchestrator/tools/builtin/shell-runtime.mjs +0 -223
  655. package/src/agent/orchestrator/tools/builtin/snapshot-store.mjs +0 -206
  656. package/src/agent/orchestrator/tools/builtin/write-tool.mjs +0 -401
  657. package/src/agent/orchestrator/tools/builtin.mjs +0 -503
  658. package/src/agent/orchestrator/tools/code-graph-tool-defs.mjs +0 -24
  659. package/src/agent/orchestrator/tools/code-graph.mjs +0 -4095
  660. package/src/agent/orchestrator/tools/cwd-tool.mjs +0 -298
  661. package/src/agent/orchestrator/tools/destructive-warning.mjs +0 -323
  662. package/src/agent/orchestrator/tools/edit-normalize.mjs +0 -603
  663. package/src/agent/orchestrator/tools/graph-binary-fetcher.mjs +0 -154
  664. package/src/agent/orchestrator/tools/graph-manifest.json +0 -26
  665. package/src/agent/orchestrator/tools/host-input.mjs +0 -204
  666. package/src/agent/orchestrator/tools/patch-binary-fetcher.mjs +0 -143
  667. package/src/agent/orchestrator/tools/patch-manifest.json +0 -26
  668. package/src/agent/orchestrator/tools/patch-tool-defs.mjs +0 -20
  669. package/src/agent/orchestrator/tools/patch.mjs +0 -2754
  670. package/src/agent/orchestrator/tools/progress-message.mjs +0 -118
  671. package/src/agent/orchestrator/tools/shell-command.mjs +0 -865
  672. package/src/agent/orchestrator/tools/shell-policy-imports.mjs +0 -7
  673. package/src/agent/orchestrator/tools/shell-snapshot.mjs +0 -313
  674. package/src/agent/orchestrator/workflow-store.mjs +0 -93
  675. package/src/agent/tool-defs.mjs +0 -110
  676. package/src/channels/backends/discord.mjs +0 -784
  677. package/src/channels/data/voice-runtime-manifest.json +0 -138
  678. package/src/channels/index.mjs +0 -3268
  679. package/src/channels/lib/config.mjs +0 -292
  680. package/src/channels/lib/drop-trace.mjs +0 -71
  681. package/src/channels/lib/event-pipeline.mjs +0 -81
  682. package/src/channels/lib/holidays.mjs +0 -138
  683. package/src/channels/lib/hook-pipe-server.mjs +0 -822
  684. package/src/channels/lib/output-forwarder.mjs +0 -765
  685. package/src/channels/lib/runtime-paths.mjs +0 -552
  686. package/src/channels/lib/scheduler.mjs +0 -723
  687. package/src/channels/lib/session-discovery.mjs +0 -103
  688. package/src/channels/lib/state-file.mjs +0 -68
  689. package/src/channels/lib/status-snapshot.mjs +0 -219
  690. package/src/channels/lib/tool-format.mjs +0 -140
  691. package/src/channels/lib/transcript-discovery.mjs +0 -195
  692. package/src/channels/lib/voice-runtime-fetcher.mjs +0 -734
  693. package/src/channels/lib/webhook.mjs +0 -1318
  694. package/src/channels/tool-defs.mjs +0 -170
  695. package/src/daemon/host.mjs +0 -118
  696. package/src/daemon/mcp-transport.mjs +0 -47
  697. package/src/daemon/session.mjs +0 -100
  698. package/src/daemon/thin-client.mjs +0 -71
  699. package/src/daemon/transport.mjs +0 -163
  700. package/src/gateway/claude-current.mjs +0 -255
  701. package/src/gateway/oauth-usage.mjs +0 -598
  702. package/src/gateway/route-meta.mjs +0 -629
  703. package/src/gateway/server.mjs +0 -713
  704. package/src/memory/data/runtime-manifest.json +0 -40
  705. package/src/memory/index.mjs +0 -3332
  706. package/src/memory/lib/core-memory-store.mjs +0 -330
  707. package/src/memory/lib/embedding-provider.mjs +0 -269
  708. package/src/memory/lib/embedding-worker.mjs +0 -323
  709. package/src/memory/lib/memory-cycle1.mjs +0 -645
  710. package/src/memory/lib/memory-cycle2.mjs +0 -1284
  711. package/src/memory/lib/memory-cycle3.mjs +0 -540
  712. package/src/memory/lib/memory-embed.mjs +0 -299
  713. package/src/memory/lib/memory-ops-policy.mjs +0 -190
  714. package/src/memory/lib/memory-recall-store.mjs +0 -638
  715. package/src/memory/lib/memory.mjs +0 -412
  716. package/src/memory/lib/pg/adapter.mjs +0 -308
  717. package/src/memory/lib/pg/process.mjs +0 -360
  718. package/src/memory/lib/pg/supervisor.mjs +0 -396
  719. package/src/memory/lib/runtime-fetcher.mjs +0 -458
  720. package/src/memory/lib/trace-store.mjs +0 -728
  721. package/src/memory/tool-defs.mjs +0 -79
  722. package/src/search/index.mjs +0 -1173
  723. package/src/search/lib/backends/anthropic-oauth.mjs +0 -98
  724. package/src/search/lib/backends/exa.mjs +0 -50
  725. package/src/search/lib/backends/firecrawl.mjs +0 -61
  726. package/src/search/lib/backends/gemini-api.mjs +0 -83
  727. package/src/search/lib/backends/grok-oauth.mjs +0 -86
  728. package/src/search/lib/backends/index.mjs +0 -150
  729. package/src/search/lib/backends/openai-api.mjs +0 -144
  730. package/src/search/lib/backends/openai-oauth.mjs +0 -102
  731. package/src/search/lib/backends/openai-web-search.mjs +0 -76
  732. package/src/search/lib/backends/tavily.mjs +0 -55
  733. package/src/search/lib/backends/xai-api.mjs +0 -113
  734. package/src/search/lib/config.mjs +0 -192
  735. package/src/search/lib/provider-usage.mjs +0 -67
  736. package/src/search/lib/providers.mjs +0 -47
  737. package/src/search/lib/search-intent.mjs +0 -109
  738. package/src/search/lib/setup-handler.mjs +0 -261
  739. package/src/search/lib/web-tools.mjs +0 -1219
  740. package/src/search/tool-defs.mjs +0 -83
  741. package/src/setup/defender-exclusion.mjs +0 -183
  742. package/src/shared/atomic-file.mjs +0 -436
  743. package/src/shared/config.mjs +0 -372
  744. package/src/shared/daemon-recycle.mjs +0 -108
  745. package/src/shared/disable-claude-builtins.mjs +0 -91
  746. package/src/shared/err-text.mjs +0 -12
  747. package/src/shared/llm/http-agent.mjs +0 -123
  748. package/src/shared/open-url.mjs +0 -62
  749. package/src/shared/plugin-paths.mjs +0 -58
  750. package/src/shared/schedules-store.mjs +0 -70
  751. package/src/shared/seed.mjs +0 -161
  752. package/src/shared/user-cwd.mjs +0 -225
  753. package/src/shared/user-data-guard.mjs +0 -244
  754. package/src/status/aggregator.mjs +0 -584
  755. package/src/status/server.mjs +0 -413
  756. package/tools.json +0 -1671
  757. /package/{defaults → src/defaults}/cycle3-review-prompt.md +0 -0
  758. /package/{defaults → src/defaults}/memory-promote-prompt.md +0 -0
  759. /package/{hooks → src/hooks}/lib/permission-rules.cjs +0 -0
  760. /package/{lib → src/lib}/config-cjs.cjs +0 -0
  761. /package/{lib → src/lib}/hook-pipe-path.cjs +0 -0
  762. /package/{lib → src/lib}/mixdog-debug.cjs +0 -0
  763. /package/{lib → src/lib}/text-utils.cjs +0 -0
  764. /package/{rules → src/rules}/bridge/42-cycle3-agent.md +0 -0
  765. /package/src/{agent → runtime/agent}/orchestrator/activity-bus.mjs +0 -0
  766. /package/src/{agent → runtime/agent}/orchestrator/providers/anthropic-betas.mjs +0 -0
  767. /package/src/{agent → runtime/agent}/orchestrator/session/abort-lookup.mjs +0 -0
  768. /package/src/{agent → runtime/agent}/orchestrator/session/cache/scoped-cache-outcome.mjs +0 -0
  769. /package/src/{agent → runtime/agent}/orchestrator/session/cache/util.mjs +0 -0
  770. /package/src/{agent → runtime/agent}/orchestrator/session/read-dedup.mjs +0 -0
  771. /package/src/{agent → runtime/agent}/orchestrator/session/save-session-worker.mjs +0 -0
  772. /package/src/{agent → runtime/agent}/orchestrator/smart-bridge/session-builder.mjs +0 -0
  773. /package/src/{agent → runtime/agent}/orchestrator/tools/bash-policy-scan.mjs +0 -0
  774. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/atomic-write.mjs +0 -0
  775. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/binary-file.mjs +0 -0
  776. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cache-layers.mjs +0 -0
  777. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cwd-utils.mjs +0 -0
  778. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/device-paths.mjs +0 -0
  779. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -0
  780. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diff-utils.mjs +0 -0
  781. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/fs-reachability.mjs +0 -0
  782. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/grep-formatting.mjs +0 -0
  783. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/hash-utils.mjs +0 -0
  784. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/list-formatting.mjs +0 -0
  785. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/open-config-tool.mjs +0 -0
  786. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-locks.mjs +0 -0
  787. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-utils.mjs +0 -0
  788. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-args.mjs +0 -0
  789. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-batch.mjs +0 -0
  790. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-constants.mjs +0 -0
  791. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image-resize.mjs +0 -0
  792. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image.mjs +0 -0
  793. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-lines.mjs +0 -0
  794. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-mode-tool.mjs +0 -0
  795. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-range-index.mjs +0 -0
  796. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-ranges.mjs +0 -0
  797. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-special-files.mjs +0 -0
  798. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-tool.mjs +0 -0
  799. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-windows.mjs +0 -0
  800. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-analysis.mjs +0 -0
  801. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-output.mjs +0 -0
  802. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-helpers.mjs +0 -0
  803. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-validation.mjs +0 -0
  804. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/text-stats.mjs +0 -0
  805. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/windows-roots.mjs +0 -0
  806. /package/src/{agent → runtime/agent}/orchestrator/tools/code-graph-prewarm-worker.mjs +0 -0
  807. /package/src/{agent → runtime/agent}/orchestrator/tools/env-scrub.mjs +0 -0
  808. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-content-cache.mjs +0 -0
  809. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-planner.mjs +0 -0
  810. /package/src/{agent → runtime/agent}/orchestrator/tools/next-call-utils.mjs +0 -0
  811. /package/src/{agent → runtime/agent}/orchestrator/tools/result-compression.mjs +0 -0
  812. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-exec-policy.mjs +0 -0
  813. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy-danger-target.mjs +0 -0
  814. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy.mjs +0 -0
  815. /package/src/{channels → runtime/channels}/lib/cli-worker-host.mjs +0 -0
  816. /package/src/{channels → runtime/channels}/lib/config-lock.mjs +0 -0
  817. /package/src/{channels → runtime/channels}/lib/event-queue.mjs +0 -0
  818. /package/src/{channels → runtime/channels}/lib/executor.mjs +0 -0
  819. /package/src/{channels → runtime/channels}/lib/format.mjs +0 -0
  820. /package/src/{channels → runtime/channels}/lib/interaction-workflows.mjs +0 -0
  821. /package/src/{channels → runtime/channels}/lib/memory-client.mjs +0 -0
  822. /package/src/{channels → runtime/channels}/lib/session-control.mjs +0 -0
  823. /package/src/{channels → runtime/channels}/lib/settings.mjs +0 -0
  824. /package/src/{channels → runtime/channels}/lib/whisper-server.mjs +0 -0
  825. /package/src/{memory → runtime/memory}/lib/agent-ipc.mjs +0 -0
  826. /package/src/{memory → runtime/memory}/lib/bridge-trace-queries.mjs +0 -0
  827. /package/src/{memory → runtime/memory}/lib/llm-worker-host.mjs +0 -0
  828. /package/src/{memory → runtime/memory}/lib/memory-cycle.mjs +0 -0
  829. /package/src/{memory → runtime/memory}/lib/memory-extraction.mjs +0 -0
  830. /package/src/{memory → runtime/memory}/lib/memory-maintenance-store.mjs +0 -0
  831. /package/src/{memory → runtime/memory}/lib/memory-recall-id-patch.mjs +0 -0
  832. /package/src/{memory → runtime/memory}/lib/memory-recall-read-query.mjs +0 -0
  833. /package/src/{memory → runtime/memory}/lib/memory-recall-scope-filter.mjs +0 -0
  834. /package/src/{memory → runtime/memory}/lib/memory-retrievers.mjs +0 -0
  835. /package/src/{memory → runtime/memory}/lib/memory-score.mjs +0 -0
  836. /package/src/{memory → runtime/memory}/lib/memory-text-utils.mjs +0 -0
  837. /package/src/{memory → runtime/memory}/lib/model-profile.mjs +0 -0
  838. /package/src/{memory → runtime/memory}/lib/project-id-resolver.mjs +0 -0
  839. /package/src/{search → runtime/search}/lib/cache.mjs +0 -0
  840. /package/src/{search → runtime/search}/lib/formatter.mjs +0 -0
  841. /package/src/{search → runtime/search}/lib/state.mjs +0 -0
  842. /package/src/{shared → runtime/shared}/abort-controller.mjs +0 -0
  843. /package/src/{shared → runtime/shared}/llm/cost.mjs +0 -0
  844. /package/src/{shared → runtime/shared}/llm/index.mjs +0 -0
  845. /package/src/{shared → runtime/shared}/llm/pid-cleanup.mjs +0 -0
  846. /package/src/{shared → runtime/shared}/llm/usage-log.mjs +0 -0
  847. /package/src/{shared → runtime/shared}/wsl.mjs +0 -0
@@ -0,0 +1,880 @@
1
+ 'use strict';
2
+ // Async one-shot shell runner.
3
+ //
4
+ // Replaces the legacy spawnSync path in builtin.mjs shell execution. The
5
+ // improvements over spawnSync are:
6
+ // - tree-kill on timeout / abort (Windows taskkill /T /F, POSIX process
7
+ // group SIGTERM->SIGKILL escalation) so forked children come down with
8
+ // the parent shell instead of being orphaned holding pipes.
9
+ // - automatic spill to $PLUGIN_DATA/shell-output/<taskId>.* once the
10
+ // in-memory buffers exceed SHELL_OUTPUT_INLINE_CAP*4 bytes. The caller
11
+ // receives an outputFilePath marker the model can FileRead later
12
+ // instead of losing the tail past the inline cap.
13
+ // - external AbortSignal hookup so a session-scoped abort (ESC, new
14
+ // prompt) cancels in-flight bash work without orphaning the child.
15
+ //
16
+ // Persistent shells in bash-session.mjs keep their separate stdin-marker
17
+ // protocol — that runner is stateful and uses a different model entirely.
18
+
19
+ import { spawn } from 'node:child_process';
20
+ import {
21
+ mkdirSync,
22
+ openSync,
23
+ closeSync,
24
+ readFileSync,
25
+ readSync,
26
+ writeSync,
27
+ fsyncSync,
28
+ unlinkSync,
29
+ writeFileSync,
30
+ } from 'node:fs';
31
+ import { join } from 'node:path';
32
+ import { randomUUID } from 'node:crypto';
33
+ import * as nodeUtil from 'node:util';
34
+ import { getPluginData } from '../config.mjs';
35
+ import { startChildGuardian } from '../../../shared/child-guardian.mjs';
36
+ // Runtime-only import (used inside execShellCommand's auto-background
37
+ // transition). shell-jobs.mjs imports stripAnsi from this module, so this is
38
+ // a static cycle — safe because neither binding is touched at module-eval
39
+ // time, only when the respective functions actually run.
40
+ import { adoptForegroundShellJob } from './builtin/shell-jobs.mjs';
41
+
42
+ // Inline cap. Output above this size is spilled to disk and the caller
43
+ // renders a path marker instead of pasting the tail. Matches the
44
+ // SHELL_OUTPUT_MAX_CHARS used by the smart-truncate renderer in
45
+ // builtin.mjs so spilled output and inline output share the same boundary.
46
+ const SHELL_OUTPUT_INLINE_CAP = 30_000;
47
+
48
+ // Hard ceiling on disk-backed output. Past this the SIZE_WATCHDOG (G2)
49
+ // SIGKILLs the child to avoid filling the filesystem. 100 MB is generous
50
+ // for any legitimate command output and tight enough to catch a runaway
51
+ // loop within ~seconds on a typical SSD.
52
+ const SHELL_OUTPUT_DISK_CAP = 100 * 1024 * 1024;
53
+
54
+ // Background-task disk watchdog cadence. The size guard polls the spilled
55
+ // stdout/stderr files every interval and SIGKILLs the child once the
56
+ // combined size exceeds SHELL_OUTPUT_DISK_CAP. 5 s matches Claude Code's
57
+ // upstream cadence — short enough that a runaway loop is caught within a
58
+ // few seconds, long enough that the stat overhead is negligible.
59
+ const SIZE_WATCHDOG_INTERVAL_MS = 1_000;
60
+
61
+ // fsync throttle for spilled output reads. getStdout/getStderr call
62
+ // fsyncSync before reading to ensure the caller sees the latest bytes.
63
+ // On Windows every fsyncSync is a noticeable I/O syscall, so throttle
64
+ // consecutive calls to at most one per this interval. Tune via env
65
+ // MIXDOG_SHELL_FSYNC_THROTTLE_MS (default 1000 ms, positive integer).
66
+ function positiveIntEnv(name, fallback) {
67
+ const value = Number(process.env[name]);
68
+ return Number.isFinite(value) && value > 0 ? Math.floor(value) : fallback;
69
+ }
70
+ const MIXDOG_SHELL_FSYNC_THROTTLE_MS = positiveIntEnv('MIXDOG_SHELL_FSYNC_THROTTLE_MS', 1000);
71
+
72
+ // ANSI / VT control sequence stripper. Falls back to a regex sweep when
73
+ // node:util's stripVTControlCharacters isn't available (older Node).
74
+ const _ANSI_REGEX =
75
+ /(?:\[[0-?]*[ -/]*[@-~]|\][\s\S]*?(?:|\\|œ))/g;
76
+ const _stripAnsiImpl =
77
+ typeof nodeUtil.stripVTControlCharacters === 'function'
78
+ ? (s) => nodeUtil.stripVTControlCharacters(s)
79
+ : (s) => String(s).replace(_ANSI_REGEX, () => '');
80
+
81
+ export function stripAnsi(s) {
82
+ if (typeof s !== 'string' || s.length === 0) return s;
83
+ return _stripAnsiImpl(s);
84
+ }
85
+
86
+ // Tree-kill helper. spawn alone only signals the direct child, so a
87
+ // `sleep 1000 &` or a forked node server inside the shell stays alive
88
+ // holding the pipes open. POSIX path signals the process group (we spawn
89
+ // with detached:true to give the child its own pgid). Windows uses
90
+ // taskkill /T /F to walk the tree. Safe to call repeatedly; all errors
91
+ // swallowed.
92
+ function treeKill(child) {
93
+ if (!child) return;
94
+ // Track close/exit via the standard child fields (set by Node when
95
+ // the corresponding events fire) instead of `child.killed`, which is
96
+ // true the moment any signal is delivered — even before the child has
97
+ // actually terminated. Using exitCode/signalCode means the SIGKILL
98
+ // escalation only suppresses itself when the process is genuinely
99
+ // gone.
100
+ if (child.exitCode != null || child.signalCode != null) return;
101
+ const pid = child.pid;
102
+ if (!pid) return;
103
+ try {
104
+ if (process.platform === 'win32') {
105
+ spawn('taskkill', ['/pid', String(pid), '/t', '/f'], {
106
+ windowsHide: true,
107
+ stdio: 'ignore',
108
+ });
109
+ } else {
110
+ try {
111
+ process.kill(-pid, 'SIGTERM');
112
+ } catch {
113
+ try {
114
+ child.kill('SIGTERM');
115
+ } catch {}
116
+ }
117
+ // Escalate to SIGKILL after 3s so a child that ignores SIGTERM
118
+ // still comes down. Windows taskkill /F is already forceful so
119
+ // skip the escalation timer there.
120
+ const esc = setTimeout(() => {
121
+ if (child.exitCode != null || child.signalCode != null) return;
122
+ try {
123
+ process.kill(-pid, 'SIGKILL');
124
+ } catch {
125
+ try {
126
+ child.kill('SIGKILL');
127
+ } catch {}
128
+ }
129
+ }, 3000);
130
+ if (esc.unref) esc.unref();
131
+ }
132
+ } catch {
133
+ /* swallow */
134
+ }
135
+ }
136
+
137
+ // Head+tail read helper: avoid pulling a large spill back into memory, but
138
+ // preserve BOTH the start of the output (where build / compiler / test errors
139
+ // are usually printed first) and the most recent output. Past INLINE_CAP*4
140
+ // bytes we return the first half-budget and the trailing half-budget with an
141
+ // elision marker between; below that the full body is returned as-is. A tail-
142
+ // only slice silently dropped early diagnostics. UTF-8 sequences are at most
143
+ // 4 B, so a small padding window lets us cut/advance on codepoint boundaries
144
+ // instead of emitting a U+FFFD glyph at the seam.
145
+ function _readHeadTail(filePath, fileSize) {
146
+ if (fileSize <= SHELL_OUTPUT_INLINE_CAP * 4) {
147
+ return readFileSync(filePath, 'utf-8');
148
+ }
149
+ const padding = 4;
150
+ const headBudget = Math.floor(SHELL_OUTPUT_INLINE_CAP / 2);
151
+ const tailBudget = SHELL_OUTPUT_INLINE_CAP - headBudget;
152
+ const fd = openSync(filePath, 'r');
153
+ try {
154
+ // Head: first headBudget bytes, dropping a split trailing codepoint.
155
+ const headBuf = Buffer.allocUnsafe(headBudget + padding);
156
+ const hn = readSync(fd, headBuf, 0, headBudget + padding, 0);
157
+ let hEnd = Math.min(headBudget, hn);
158
+ while (hEnd > 0 && hEnd < hn && (headBuf[hEnd] & 0xC0) === 0x80) hEnd--;
159
+ const head = headBuf.slice(0, hEnd).toString('utf-8');
160
+ // Tail: last tailBudget bytes, advancing past a leading split codepoint.
161
+ const tailReadSize = tailBudget + padding;
162
+ const tailStart = Math.max(hEnd, fileSize - tailReadSize);
163
+ const tailBuf = Buffer.allocUnsafe(tailReadSize);
164
+ const tn = readSync(fd, tailBuf, 0, tailReadSize, tailStart);
165
+ let tOff = 0;
166
+ if (tailStart > 0) {
167
+ while (tOff < tn && tOff < padding && (tailBuf[tOff] & 0xC0) === 0x80) tOff++;
168
+ }
169
+ const tail = tailBuf.slice(tOff, tn).toString('utf-8');
170
+ const elided = Math.max(0, (tailStart + tOff) - hEnd);
171
+ return `${head}\n... [${elided} bytes elided of ${fileSize} total — head+tail shown; full output spilled to disk] ...\n${tail}`;
172
+ } finally {
173
+ try { closeSync(fd); } catch {}
174
+ }
175
+ }
176
+
177
+ // Owns the captured stdout/stderr buffers for a single command run. Starts
178
+ // fully in memory; once the combined byte total exceeds the spill threshold
179
+ // (SHELL_OUTPUT_INLINE_CAP*4), opens append-only files in
180
+ // $PLUGIN_DATA/shell-output/ and from then on writes go straight to disk.
181
+ // On settle, the caller (execShellCommand) decides whether to keep the
182
+ // spilled files based on the final size.
183
+ class TaskOutput {
184
+ constructor(taskId) {
185
+ this.taskId = taskId;
186
+ this.stdoutBuf = '';
187
+ this.stderrBuf = '';
188
+ this._inlineBytes = 0;
189
+ this.stdoutFd = null;
190
+ this.stderrFd = null;
191
+ this.stdoutPath = null;
192
+ this.stderrPath = null;
193
+ this.spilled = false;
194
+ this.stdoutFileSize = 0;
195
+ this.stderrFileSize = 0;
196
+ this.writeError = null;
197
+ // fsync throttle: task wait/read + tail-read polling can call getStdout/
198
+ // getStderr many times per second. Every call used to fsyncSync(fd),
199
+ // a noticeable I/O tax on Windows. Skip if a recent fsync landed
200
+ // within MIXDOG_SHELL_FSYNC_THROTTLE_MS — the next read still picks up
201
+ // writes via the kernel's normal write-back. Final settle (closeFds)
202
+ // flushes via close anyway.
203
+ this._lastStdoutFsyncMs = 0;
204
+ this._lastStderrFsyncMs = 0;
205
+ }
206
+
207
+ _ensureFileBacking() {
208
+ if (this.spilled) return;
209
+ const dir = join(getPluginData(), 'shell-output');
210
+ try {
211
+ mkdirSync(dir, { recursive: true });
212
+ } catch {}
213
+ this.stdoutPath = join(dir, `${this.taskId}.stdout`);
214
+ this.stderrPath = join(dir, `${this.taskId}.stderr`);
215
+ // openSync failure (EMFILE, EACCES, ENOSPC, ENOTDIR after a race) used
216
+ // to throw straight up into the stream `data` handler, which left the
217
+ // child running with no further writes captured. Catch + record so the
218
+ // run settles cleanly under inline-only mode; the partial buffer in
219
+ // stdoutBuf/stderrBuf survives.
220
+ try {
221
+ this.stdoutFd = openSync(this.stdoutPath, 'a');
222
+ this.stderrFd = openSync(this.stderrPath, 'a');
223
+ } catch (err) {
224
+ this._recordWriteError('spill-open', err);
225
+ if (this.stdoutFd != null) {
226
+ try { closeSync(this.stdoutFd); } catch {}
227
+ this.stdoutFd = null;
228
+ }
229
+ this.stderrFd = null;
230
+ this.stdoutPath = null;
231
+ this.stderrPath = null;
232
+ return;
233
+ }
234
+ if (this.stdoutBuf) {
235
+ try {
236
+ writeSync(this.stdoutFd, this.stdoutBuf);
237
+ this.stdoutFileSize += Buffer.byteLength(this.stdoutBuf, 'utf-8');
238
+ } catch (err) {
239
+ this._recordWriteError('stdout-spill-flush', err);
240
+ }
241
+ }
242
+ if (this.stderrBuf) {
243
+ try {
244
+ writeSync(this.stderrFd, this.stderrBuf);
245
+ this.stderrFileSize += Buffer.byteLength(this.stderrBuf, 'utf-8');
246
+ } catch (err) {
247
+ this._recordWriteError('stderr-spill-flush', err);
248
+ }
249
+ }
250
+ this.spilled = true;
251
+ // The flushed bytes now live in the spill files and getStdout/getStderr
252
+ // read from disk once spilled — drop the inline copies.
253
+ this.stdoutBuf = '';
254
+ this.stderrBuf = '';
255
+ }
256
+
257
+ _maybeSpill() {
258
+ if (this.spilled) return;
259
+ // Threshold is in BYTES — string .length counts UTF-16 units, which
260
+ // understates CJK output by up to 3x against the byte-sized cap.
261
+ if (this._inlineBytes > SHELL_OUTPUT_INLINE_CAP * 4) {
262
+ this._ensureFileBacking();
263
+ }
264
+ }
265
+
266
+ // Force the in-memory buffers onto disk-backed files regardless of the
267
+ // SHELL_OUTPUT_INLINE_CAP*4 threshold. Used by the auto-background
268
+ // transition: once a foreground command is adopted into a tracked job,
269
+ // every subsequent stdout/stderr chunk must land in the spill files so
270
+ // task wait/read can read it (the caller has already settled and will no
271
+ // longer drain the in-memory buffers). No-op once already spilled.
272
+ forceSpill() {
273
+ if (this.spilled) return;
274
+ this._ensureFileBacking();
275
+ }
276
+
277
+ _recordWriteError(stage, err) {
278
+ if (this.writeError) return;
279
+ const msg = (err && err.message) ? err.message : String(err);
280
+ this.writeError = `[output-capture-error: ${stage}] ${msg}`;
281
+ }
282
+
283
+ writeStdout(s) {
284
+ if (!s) return;
285
+ if (this.spilled) {
286
+ try {
287
+ writeSync(this.stdoutFd, s);
288
+ this.stdoutFileSize += Buffer.byteLength(s, 'utf-8');
289
+ } catch (err) {
290
+ this._recordWriteError('stdout-write', err);
291
+ }
292
+ return;
293
+ }
294
+ this.stdoutBuf += s;
295
+ this._inlineBytes += Buffer.byteLength(s, 'utf-8');
296
+ this._maybeSpill();
297
+ }
298
+
299
+ writeStderr(s) {
300
+ if (!s) return;
301
+ if (this.spilled) {
302
+ try {
303
+ writeSync(this.stderrFd, s);
304
+ this.stderrFileSize += Buffer.byteLength(s, 'utf-8');
305
+ } catch (err) {
306
+ this._recordWriteError('stderr-write', err);
307
+ }
308
+ return;
309
+ }
310
+ this.stderrBuf += s;
311
+ this._inlineBytes += Buffer.byteLength(s, 'utf-8');
312
+ this._maybeSpill();
313
+ }
314
+
315
+ totalDiskBytes() {
316
+ return this.stdoutFileSize + this.stderrFileSize;
317
+ }
318
+
319
+ async getStdout() {
320
+ if (this.spilled) {
321
+ const now = Date.now();
322
+ if (now - this._lastStdoutFsyncMs >= MIXDOG_SHELL_FSYNC_THROTTLE_MS) {
323
+ try { fsyncSync(this.stdoutFd); } catch {}
324
+ this._lastStdoutFsyncMs = now;
325
+ }
326
+ try {
327
+ return _readHeadTail(this.stdoutPath, this.stdoutFileSize);
328
+ } catch (err) {
329
+ throw new Error(`[shell-command] spilled stdout read failed (${this.stdoutPath}): ${err.message}`);
330
+ }
331
+ }
332
+ return this.stdoutBuf;
333
+ }
334
+
335
+ async getStderr() {
336
+ if (this.spilled) {
337
+ const now = Date.now();
338
+ if (now - this._lastStderrFsyncMs >= MIXDOG_SHELL_FSYNC_THROTTLE_MS) {
339
+ try { fsyncSync(this.stderrFd); } catch {}
340
+ this._lastStderrFsyncMs = now;
341
+ }
342
+ try {
343
+ return _readHeadTail(this.stderrPath, this.stderrFileSize);
344
+ } catch {
345
+ return '';
346
+ }
347
+ }
348
+ return this.stderrBuf;
349
+ }
350
+
351
+ closeFds() {
352
+ if (this.stdoutFd != null) {
353
+ try {
354
+ closeSync(this.stdoutFd);
355
+ } catch {}
356
+ this.stdoutFd = null;
357
+ }
358
+ if (this.stderrFd != null) {
359
+ try {
360
+ closeSync(this.stderrFd);
361
+ } catch {}
362
+ this.stderrFd = null;
363
+ }
364
+ }
365
+
366
+ // Drop the spilled files when the inline body already covers the full
367
+ // output. Called when total spilled bytes <= SHELL_OUTPUT_INLINE_CAP, so
368
+ // outputFilePath would only point at a duplicate of what the caller is
369
+ // already pasting into the result.
370
+ deleteFiles() {
371
+ this.closeFds();
372
+ if (this.stdoutPath) {
373
+ try {
374
+ unlinkSync(this.stdoutPath);
375
+ } catch {}
376
+ this.stdoutPath = null;
377
+ }
378
+ if (this.stderrPath) {
379
+ try {
380
+ unlinkSync(this.stderrPath);
381
+ } catch {}
382
+ this.stderrPath = null;
383
+ }
384
+ this.spilled = false;
385
+ }
386
+ }
387
+
388
+ export { TaskOutput };
389
+
390
+ // Result envelope. Status markers ([exit code: N], [signal: SIGTERM]) are
391
+ // the caller's responsibility — shell execution owns that
392
+ // rendering convention.
393
+ export class ExecResult {
394
+ constructor(opts) {
395
+ this.stdout = opts.stdout;
396
+ this.stderr = opts.stderr;
397
+ this.exitCode = opts.exitCode;
398
+ this.signal = opts.signal || null;
399
+ this.timedOut = opts.timedOut === true;
400
+ this.killed = opts.killed === true;
401
+ this.stdoutPath = opts.stdoutPath || null;
402
+ this.stdoutFileSize = opts.stdoutFileSize || 0;
403
+ this.stderrPath = opts.stderrPath || null;
404
+ this.stderrFileSize = opts.stderrFileSize || 0;
405
+ this.taskId = opts.taskId;
406
+ this.partialOutput = opts.partialOutput === true;
407
+ this.outputCaptureError = opts.outputCaptureError || null;
408
+ // Auto-background transition (CC startBackgrounding analogue). When a
409
+ // foreground command outlives autoBackgroundMs the call settles with
410
+ // backgrounded:true + the jobId for manual task control. The
411
+ // child stays owned by the CLI process; stdout/stderr keep flowing to
412
+ // the spill files now adopted by the shell-jobs registry.
413
+ this.backgrounded = opts.backgrounded === true;
414
+ this.jobId = opts.jobId || null;
415
+ this.backgroundMessage = opts.backgroundMessage || null;
416
+ }
417
+ }
418
+
419
+ // On Windows, nested `powershell -Command "<inline>"` invocations can be
420
+ // mangled by an outer shell quoting layer before powershell.exe sees
421
+ // automatic variables (`$_`, `$args`, `$($_.Line)`, etc.). Rewrite
422
+ // `powershell -Command "<inline>"` / `pwsh -Command "<inline>"` to
423
+ // `-EncodedCommand <utf16le-base64>` so the payload stays opaque to the
424
+ // outer shell. Other shells / non-Windows are no-op pass-through.
425
+ // Match -Command "<body>" where the body may contain escaped quotes
426
+ // (`\"` or `""`). Stops at the first unescaped closing quote so nested
427
+ // patterns like `"... \"inner\" ..."` survive intact. Common PowerShell
428
+ // flags (NoProfile, NonInteractive, WindowStyle, ExecutionPolicy, Sta,
429
+ // Mta, NoLogo, NoExit) are recognised so they don't break the match.
430
+ // Single-quoted -Command '<body>' is also covered.
431
+ const _POWERSHELL_FLAGS_RE = /\s+-(?:NoProfile|NonInteractive|WindowStyle\s+\S+|ExecutionPolicy\s+\S+|Sta|Mta|NoLogo|NoExit)/.source;
432
+ const _POWERSHELL_DOUBLE_RE = new RegExp(
433
+ '\\b(powershell(?:\\.exe)?|pwsh(?:\\.exe)?)((?:' + _POWERSHELL_FLAGS_RE + ')*)\\s+(?:-Command|-c)\\s+"((?:[^"\\\\]|\\\\.|"")+?)"(?=\\s|$|;|&&|\\|\\|)',
434
+ 'gi',
435
+ );
436
+ const _POWERSHELL_SINGLE_RE = new RegExp(
437
+ "\\b(powershell(?:\\.exe)?|pwsh(?:\\.exe)?)((?:" + _POWERSHELL_FLAGS_RE + ")*)\\s+(?:-Command|-c)\\s+'((?:[^'\\\\]|\\\\.|'')+?)'(?=\\s|$|;|&&|\\|\\|)",
438
+ 'gi',
439
+ );
440
+
441
+ export function _maybeEncodePowerShellCommand(command) {
442
+ if (process.platform !== 'win32') return command;
443
+ if (typeof command !== 'string' || command.length === 0) return command;
444
+ const replaceFn = (match, exe, flags, body) => {
445
+ try {
446
+ // Unescape doubled-up quotes the caller used to embed " / ' inside
447
+ // the -Command literal. We're handing the body to powershell as
448
+ // base64 so the outer-shell escaping is no longer needed.
449
+ // Unescape both PowerShell-style doubled quotes (`""` / `''`) AND
450
+ // bash-style backslash-escaped quotes (`\"` / `\'`) since POSIX
451
+ // outer-shell wrappers commonly use backslash form. Without
452
+ // backslash unescape, `pwsh -Command "Get-Process \"foo\""` would
453
+ // base64-encode the literal backslash, breaking inside PowerShell.
454
+ const unescaped = body
455
+ .replace(/""/g, '"')
456
+ .replace(/''/g, "'")
457
+ .replace(/\\"/g, '"')
458
+ .replace(/\\'/g, "'");
459
+ const encoded = Buffer.from(unescaped, 'utf16le').toString('base64');
460
+ const trimmedFlags = (flags || '').replace(/\s+/g, ' ').trim();
461
+ return `${exe}${trimmedFlags ? ' ' + trimmedFlags : ''} -EncodedCommand ${encoded}`;
462
+ } catch {
463
+ return match;
464
+ }
465
+ };
466
+ return command.replace(_POWERSHELL_DOUBLE_RE, replaceFn).replace(_POWERSHELL_SINGLE_RE, replaceFn);
467
+ }
468
+
469
+ function _unescapePowerShellCommandBody(body) {
470
+ return String(body || '')
471
+ .replace(/""/g, '"')
472
+ .replace(/''/g, "'")
473
+ .replace(/\\"/g, '"')
474
+ .replace(/\\'/g, "'");
475
+ }
476
+
477
+ // Extract inline `powershell -Command "…"` bodies for policy scan parity
478
+ // with hard-block normalization (encoded payloads use decodePowerShellEncodedCommand).
479
+ export function extractPowerShellCommandInner(command) {
480
+ if (typeof command !== 'string' || command.length === 0) return [];
481
+ const out = [];
482
+ const push = (body) => {
483
+ const unescaped = _unescapePowerShellCommandBody(body);
484
+ if (unescaped.trim()) out.push(unescaped);
485
+ };
486
+ for (const m of command.matchAll(_POWERSHELL_DOUBLE_RE)) push(m[3]);
487
+ for (const m of command.matchAll(_POWERSHELL_SINGLE_RE)) push(m[3]);
488
+ return out;
489
+ }
490
+
491
+ // One-shot async shell runner. abortSignal optional (session-scoped abort
492
+ // from getAbortSignalForSession in builtin.mjs). Timeout implemented via
493
+ // treeKill so forked grandchildren also come down. Output streams capture
494
+ // to TaskOutput which transparently spills to disk past the inline cap.
495
+ async function _execPolicyBlockMessage(command) {
496
+ const { checkExecPolicyMessage } = await import('./bash-policy-scan.mjs');
497
+ return checkExecPolicyMessage(command);
498
+ }
499
+
500
+ export function execShellCommand({
501
+ shell,
502
+ shellArg,
503
+ shellArgs,
504
+ command,
505
+ env,
506
+ cwd,
507
+ timeoutMs,
508
+ abortSignal,
509
+ autoBackgroundMs,
510
+ onProgress,
511
+ clientHostPid,
512
+ }) {
513
+ return new Promise(async (resolve) => {
514
+ const taskId = `shell_${randomUUID().slice(0, 8)}`;
515
+ const taskOutput = new TaskOutput(taskId);
516
+ let timedOut = false;
517
+ let killed = false;
518
+ let settled = false;
519
+ let timer = null;
520
+ let abortHandler = null;
521
+ let partialOutput = false;
522
+ // MCP live-progress: throttled "running Ns, M lines" emits while the
523
+ // foreground command runs. Inert (never armed) when onProgress is null.
524
+ const _hasProgress = typeof onProgress === 'function';
525
+ const _startMs = Date.now();
526
+ let progressTimer = null;
527
+ const _clearProgressTimer = () => {
528
+ if (progressTimer) { clearInterval(progressTimer); progressTimer = null; }
529
+ };
530
+ // Auto-background transition flag. Set the moment the autoBackgroundMs
531
+ // timer fires and adopts the still-running child. Once
532
+ // true the normal settle()/close/exit/treeKill paths are inert for this
533
+ // run — the call has already resolved with a 'backgrounded' result and
534
+ // the child's lifecycle is owned by the shell-jobs registry. Mutually
535
+ // exclusive with `settled`: whichever transition wins first wins for good.
536
+ let autoBackgrounded = false;
537
+ let autoBgTimer = null;
538
+ // Treekill + force-settle deadline. treeKill alone leaves settle()
539
+ // pending on 'close'/'exit'; on Windows a taskkill miss or a grandchild
540
+ // holding stdio fds keeps the dispatch stalled until the upstream
541
+ // ceiling. Covers every kill path (timeout / pre-aborted / abort /
542
+ // capture-error / size-watchdog) so the hang risk does not live on
543
+ // outside the timeout branch. Function declaration so callers placed
544
+ // above settle()'s const definition still resolve via hoisting; the
545
+ // 5 s deadline always fires after settle is constructed.
546
+ function _treeKillForceSettle() {
547
+ treeKill(child);
548
+ const _killDeadline = setTimeout(() => {
549
+ if (settled) return;
550
+ partialOutput = true;
551
+ settle(1, 'SIGKILL');
552
+ }, 5000);
553
+ if (_killDeadline.unref) _killDeadline.unref();
554
+ }
555
+ // Background commands (trailing `&`) intentionally detach stdio
556
+ // from the parent shell, so 'close' may never fire while the
557
+ // backgrounded grandchild is still alive. For those we settle
558
+ // immediately on direct-child exit instead of waiting for close.
559
+ const _trimmed = String(command || '').replace(/\s+$/, '');
560
+ const _isBackground = /(^|[^&|])&$/.test(_trimmed);
561
+
562
+ let child;
563
+ try {
564
+ const _policyErr = await _execPolicyBlockMessage(command);
565
+ if (_policyErr) {
566
+ resolve(
567
+ new ExecResult({
568
+ stdout: '',
569
+ stderr: _policyErr,
570
+ exitCode: 1,
571
+ signal: null,
572
+ timedOut: false,
573
+ killed: false,
574
+ taskId,
575
+ }),
576
+ );
577
+ return;
578
+ }
579
+ const _spawnCommand = _maybeEncodePowerShellCommand(command);
580
+ const argv = Array.isArray(shellArgs) && shellArgs.length > 0
581
+ ? [...shellArgs, _spawnCommand]
582
+ : [shellArg, _spawnCommand];
583
+ child = spawn(shell, argv, {
584
+ env,
585
+ cwd,
586
+ windowsHide: true,
587
+ stdio: ['ignore', 'pipe', 'pipe'],
588
+ // POSIX: detached gives the child its own process group so treeKill can
589
+ // signal the whole group. The child is still CLI-owned because we do
590
+ // not unref it after adoption. Windows detached has different console
591
+ // semantics, so it stays off there.
592
+ detached: process.platform !== 'win32',
593
+ });
594
+ startChildGuardian({
595
+ childPid: child.pid,
596
+ childGroupPid: child.pid,
597
+ label: 'shell-command',
598
+ });
599
+ } catch (err) {
600
+ resolve(
601
+ new ExecResult({
602
+ stdout: '',
603
+ stderr: String((err && err.message) || err),
604
+ exitCode: 1,
605
+ signal: null,
606
+ timedOut: false,
607
+ killed: false,
608
+ taskId,
609
+ }),
610
+ );
611
+ return;
612
+ }
613
+
614
+ // Pre-aborted signal: kill immediately if the abort already fired
615
+ // before spawn returned (synchronous reentry from a parent abort), so
616
+ // the child doesn't run for the full timeoutMs window.
617
+ if (abortSignal && abortSignal.aborted) {
618
+ killed = true;
619
+ _treeKillForceSettle();
620
+ }
621
+
622
+ child.stdout.setEncoding('utf-8');
623
+ child.stderr.setEncoding('utf-8');
624
+ child.stdout.on('data', (chunk) => {
625
+ taskOutput.writeStdout(chunk);
626
+ });
627
+ child.stderr.on('data', (chunk) => taskOutput.writeStderr(chunk));
628
+
629
+ // If the spill writer hits an I/O failure (full disk, EBADF after
630
+ // an unlink race) bring the child down so the agent isn't deceived
631
+ // by a successful exit code on a truncated capture.
632
+ const _abortOnCaptureError = () => {
633
+ if (taskOutput.writeError && !killed && !settled && !autoBackgrounded) {
634
+ killed = true;
635
+ _treeKillForceSettle();
636
+ }
637
+ };
638
+
639
+ let sizeWatchdog = null;
640
+ const settle = async (exitCode, signal) => {
641
+ if (settled || autoBackgrounded) return;
642
+ settled = true;
643
+ if (timer) {
644
+ clearTimeout(timer);
645
+ timer = null;
646
+ }
647
+ _clearProgressTimer();
648
+ if (sizeWatchdog) {
649
+ clearInterval(sizeWatchdog);
650
+ sizeWatchdog = null;
651
+ }
652
+ if (autoBgTimer) {
653
+ clearTimeout(autoBgTimer);
654
+ autoBgTimer = null;
655
+ }
656
+ if (abortSignal && abortHandler) {
657
+ try {
658
+ abortSignal.removeEventListener('abort', abortHandler);
659
+ } catch {}
660
+ }
661
+ // getStdout/getStderr can throw on a spilled-file read failure (EBADF
662
+ // after unlink race, EACCES). Without this catch the rejection bubbles
663
+ // up and leaves the outer settle promise unresolved, hanging the call.
664
+ // Capture as writeError so the caller sees outputCaptureError and the
665
+ // partial inline buffer (if any) is still surfaced via partialOutput.
666
+ let stdout = '';
667
+ let stderr = '';
668
+ try { stdout = await taskOutput.getStdout(); }
669
+ catch (err) { taskOutput.writeError = taskOutput.writeError || err; }
670
+ try { stderr = await taskOutput.getStderr(); }
671
+ catch (err) { taskOutput.writeError = taskOutput.writeError || err; }
672
+ // Inline-only path: nothing spilled. Nothing to clean up.
673
+ // Spilled but tiny: drop the files — outputFilePath would duplicate
674
+ // the inline body. Spilled and large: keep the files, caller renders
675
+ // the path marker.
676
+ if (
677
+ taskOutput.spilled &&
678
+ stdout.length + stderr.length <= SHELL_OUTPUT_INLINE_CAP
679
+ ) {
680
+ taskOutput.deleteFiles();
681
+ } else {
682
+ taskOutput.closeFds();
683
+ }
684
+ resolve(
685
+ new ExecResult({
686
+ stdout,
687
+ stderr,
688
+ exitCode,
689
+ signal,
690
+ timedOut,
691
+ killed,
692
+ stdoutPath: taskOutput.spilled ? taskOutput.stdoutPath : null,
693
+ stdoutFileSize: taskOutput.stdoutFileSize,
694
+ stderrPath: taskOutput.spilled ? taskOutput.stderrPath : null,
695
+ stderrFileSize: taskOutput.stderrFileSize,
696
+ taskId,
697
+ partialOutput,
698
+ outputCaptureError: taskOutput.writeError,
699
+ }),
700
+ );
701
+ };
702
+
703
+ // P1 fix: settle on 'close', not 'exit'. 'exit' fires when the child
704
+ // terminates but stdout/stderr streams may still be flushing buffered
705
+ // bytes; settling there can lose the tail of the output. 'close' fires
706
+ // after stdio is fully drained, so getStdout()/getStderr() see the
707
+ // complete capture.
708
+ child.once('close', (code, signal) => settle(code, signal));
709
+ child.once('error', () => settle(1, null));
710
+ // 'close' only fires after stdio drains; a forked grandchild that
711
+ // inherited stdout/stderr fds can hold them open past direct-child
712
+ // exit and stall settle() until timeoutMs. 'exit' fires on direct
713
+ // child termination regardless — give 'close' a 2 s grace then
714
+ // settle anyway.
715
+ child.once('exit', (code, signal) => {
716
+ if (_isBackground) {
717
+ setImmediate(() => settle(code == null ? 1 : code, signal));
718
+ return;
719
+ }
720
+ const grace = setTimeout(() => {
721
+ if (settled || autoBackgrounded) return;
722
+ partialOutput = true;
723
+ settle(code == null ? 1 : code, signal);
724
+ }, 2000);
725
+ if (grace.unref) grace.unref();
726
+ });
727
+
728
+ // Auto-background transition (CC ASSISTANT_BLOCKING_BUDGET_MS +
729
+ // startBackgrounding analogue). Fires once, autoBackgroundMs after spawn,
730
+ // IFF the child is still running and the run has not already settled /
731
+ // been killed / timed out. It adopts the child into the shell-jobs
732
+ // registry while keeping it owned by this CLI process, then resolves the
733
+ // call immediately with a 'backgrounded' result so the tool stops hanging.
734
+ // The 600 s timeoutMs upper bound is carried into the adopted job detail
735
+ // so refreshShellJob still enforces it. Mutually exclusive with settle()
736
+ // via the autoBackgrounded flag set synchronously at the top before any await.
737
+ const _autoBackground = async () => {
738
+ // Win the race: bail if a terminal transition already happened, and
739
+ // claim the transition synchronously so a concurrently-queued settle()
740
+ // (which checks autoBackgrounded) becomes inert.
741
+ if (settled || autoBackgrounded || killed || timedOut) return;
742
+ if (child.exitCode != null || child.signalCode != null) return;
743
+ autoBackgrounded = true;
744
+ // The foreground capture is over; stop the local watchdogs/timers so
745
+ // they cannot treeKill the now-adopted child. The 600 s bound lives
746
+ // on in the adopted job detail (timeoutMs) for refreshShellJob.
747
+ if (timer) { clearTimeout(timer); timer = null; }
748
+ _clearProgressTimer();
749
+ if (sizeWatchdog) { clearInterval(sizeWatchdog); sizeWatchdog = null; }
750
+ if (autoBgTimer) { clearTimeout(autoBgTimer); autoBgTimer = null; }
751
+ if (abortSignal && abortHandler) {
752
+ try { abortSignal.removeEventListener('abort', abortHandler); } catch {}
753
+ abortHandler = null;
754
+ }
755
+ // Every subsequent stdout/stderr chunk must hit disk — the call is
756
+ // about to resolve and nobody will drain the in-memory buffers again.
757
+ try { taskOutput.forceSpill(); } catch {}
758
+ const stdoutPath = taskOutput.spilled ? taskOutput.stdoutPath : null;
759
+ const stderrPath = taskOutput.spilled ? taskOutput.stderrPath : null;
760
+ let job = null;
761
+ try {
762
+ job = adoptForegroundShellJob({
763
+ command,
764
+ cwd,
765
+ pid: child.pid,
766
+ timeoutMs,
767
+ mergeStderr: false,
768
+ stdoutPath,
769
+ stderrPath,
770
+ // Stamp the adopted job with the dispatching terminal's claude.exe
771
+ // pid so the statusline scopes it to the owning session.
772
+ clientHostPid,
773
+ });
774
+ } catch {
775
+ job = null;
776
+ }
777
+ // Wire the lifecycle: on close, write the exit-code file FIRST then
778
+ // touch donePath STRICTLY AFTER — the exact ordering refreshShellJob()
779
+ // gates completion on (donePath visible ⇒ exit file fully flushed).
780
+ if (job && job.exitPath && job.donePath) {
781
+ child.once('close', (code, signal) => {
782
+ const rc = code == null ? (signal ? 1 : 0) : code;
783
+ try { writeFileSync(job.exitPath, String(rc)); } catch {}
784
+ try { writeFileSync(job.donePath, ''); } catch {}
785
+ });
786
+ }
787
+ // Snapshot the partial output captured so far for the immediate result.
788
+ let stdout = '';
789
+ let stderr = '';
790
+ try { stdout = await taskOutput.getStdout(); }
791
+ catch (err) { taskOutput.writeError = taskOutput.writeError || err; }
792
+ try { stderr = await taskOutput.getStderr(); }
793
+ catch (err) { taskOutput.writeError = taskOutput.writeError || err; }
794
+ const jobId = job ? job.jobId : null;
795
+ const secs = Math.round(autoBackgroundMs / 1000);
796
+ resolve(
797
+ new ExecResult({
798
+ stdout,
799
+ stderr,
800
+ exitCode: null,
801
+ signal: null,
802
+ timedOut: false,
803
+ killed: false,
804
+ stdoutPath,
805
+ stdoutFileSize: taskOutput.stdoutFileSize,
806
+ stderrPath: taskOutput.spilled ? taskOutput.stderrPath : null,
807
+ stderrFileSize: taskOutput.stderrFileSize,
808
+ taskId,
809
+ partialOutput: true,
810
+ outputCaptureError: taskOutput.writeError,
811
+ backgrounded: true,
812
+ jobId,
813
+ backgroundMessage: jobId
814
+ ? `auto-backgrounded after ${secs}s; still running — completion will be delivered as a background task notification. Use task with task_id:${jobId} only for manual wait/status/read/cancel.`
815
+ : `auto-backgrounded after ${secs}s; still running`,
816
+ }),
817
+ );
818
+ };
819
+
820
+ if (timeoutMs > 0) {
821
+ timer = setTimeout(() => {
822
+ timedOut = true;
823
+ _treeKillForceSettle();
824
+ }, timeoutMs);
825
+ if (timer.unref) timer.unref();
826
+ }
827
+
828
+ // Live-progress heartbeat: every 2 s while the foreground command runs,
829
+ // emit "running Ns" so the MCP client renders live progress
830
+ // instead of an opaque hang. Only armed for a genuine foreground run with
831
+ // a subscribed client; trailing-`&` background commands settle on exit and
832
+ // never need it. Cleared on settle / auto-background (see above).
833
+ if (_hasProgress && !_isBackground) {
834
+ progressTimer = setInterval(() => {
835
+ if (settled || autoBackgrounded) return;
836
+ const secs = Math.round((Date.now() - _startMs) / 1000);
837
+ try { onProgress(`running ${secs}s`); } catch {}
838
+ }, 2000);
839
+ if (progressTimer.unref) progressTimer.unref();
840
+ }
841
+
842
+ // Arm the auto-background timer only for the genuine foreground one-shot
843
+ // path: a positive threshold strictly below the hard timeout, and not a
844
+ // trailing-`&` background command (those already detach + settle on exit).
845
+ if (
846
+ typeof autoBackgroundMs === 'number' &&
847
+ autoBackgroundMs > 0 &&
848
+ !_isBackground &&
849
+ (timeoutMs <= 0 || autoBackgroundMs < timeoutMs)
850
+ ) {
851
+ autoBgTimer = setTimeout(() => { _autoBackground(); }, autoBackgroundMs);
852
+ if (autoBgTimer.unref) autoBgTimer.unref();
853
+ }
854
+
855
+ // Size watchdog — a stuck command pumping GBs of stdout into the spill
856
+ // file would fill the user's disk before the timeout fires. Poll the
857
+ // running disk total every 5 s and SIGKILL once we cross the cap. The
858
+ // settle() path clears this interval directly (see top of this Promise
859
+ // body) so no extra exit / error listeners are needed here.
860
+ sizeWatchdog = setInterval(() => {
861
+ if (settled || autoBackgrounded) return;
862
+ _abortOnCaptureError();
863
+ if (taskOutput.totalDiskBytes() > SHELL_OUTPUT_DISK_CAP) {
864
+ killed = true;
865
+ _treeKillForceSettle();
866
+ }
867
+ }, SIZE_WATCHDOG_INTERVAL_MS);
868
+ if (sizeWatchdog.unref) sizeWatchdog.unref();
869
+
870
+ if (abortSignal) {
871
+ abortHandler = () => {
872
+ killed = true;
873
+ _treeKillForceSettle();
874
+ };
875
+ try {
876
+ abortSignal.addEventListener('abort', abortHandler, { once: true });
877
+ } catch {}
878
+ }
879
+ });
880
+ }