mixdog 0.7.18 → 0.8.0

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