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
@@ -0,0 +1,637 @@
1
+ import { getAbortSignalForSession } from '../../session/abort-lookup.mjs';
2
+ import { execShellCommand, stripAnsi } from '../shell-command.mjs';
3
+ import { wrapCommandWithSnapshot } from '../shell-snapshot.mjs';
4
+ import { getDestructiveCommandWarning } from '../destructive-warning.mjs';
5
+ import { maybeRewriteWmicProcessCommand } from '../shell-policy.mjs';
6
+ import { buildBashPolicyScanTargets, checkExecPolicyMessage, injectionBlockTargets } from '../bash-policy-scan.mjs';
7
+ import { markCodeGraphDirtyPaths, drainCodeGraphCache } from '../code-graph.mjs';
8
+ import {
9
+ buildJobNotFoundMessage,
10
+ startBackgroundShellJob,
11
+ waitForShellJob,
12
+ peekShellJob,
13
+ killShellJob,
14
+ watchBackgroundShellJob,
15
+ cancelBackgroundShellJobWatch,
16
+ beginShellJobWait,
17
+ endShellJobWait,
18
+ clearShellJobNotifyCtx,
19
+ shellJobPublicTaskResult,
20
+ } from './shell-jobs.mjs';
21
+ import {
22
+ analyzeShellCommandEffects,
23
+ foregroundLongCommandHint,
24
+ preflightShellLargeFileProbe,
25
+ } from './shell-analysis.mjs';
26
+ import {
27
+ cancelBackgroundTask,
28
+ completeBackgroundTask,
29
+ getBackgroundTask,
30
+ listBackgroundTasks,
31
+ registerBackgroundTask,
32
+ renderBackgroundTask,
33
+ renderBackgroundTaskList,
34
+ resolveExecutionMode,
35
+ } from '../../../../shared/background-tasks.mjs';
36
+ import { resolveShellFor } from './shell-runtime.mjs';
37
+ import { smartMiddleTruncate } from './shell-output.mjs';
38
+ import { normalizeOutputPath } from './path-utils.mjs';
39
+ import { normalizeErrorMessage } from './path-diagnostics.mjs';
40
+ import { invalidateBuiltinResultCache } from './cache-layers.mjs';
41
+ import { resolveOptionalCwd } from './cwd-utils.mjs';
42
+ import { scrubLoaderVars, scrubProviderSecrets } from '../env-scrub.mjs';
43
+
44
+ // Post-exec drift detection. After a foreground shell command, compare the
45
+ // live mtime+size of files mixdog has already read this session against their
46
+ // pre-command state (captured just before exec). Files this command changed
47
+ // surface as ONE compact reminder so the model re-reads before editing —
48
+ // closing the "external write -> stale old_string -> code 8" gap when shell is
49
+ // routed through this tool. Bounded to the tracked-read set (capped) so cost
50
+ // stays off the whole-cwd path; emits nothing when no read file changed.
51
+ const _DRIFT_SCAN_CAP = 256;
52
+ export function _captureTrackedMtimes(_scope) {
53
+ return new Map();
54
+ }
55
+ export function _trackedDriftNoteAfter(_scope, _pre) {
56
+ return '';
57
+ }
58
+
59
+ // Combine an existing session abort signal with an externally-supplied
60
+ // AbortSignal (e.g. the MCP/request signal threaded through options.abortSignal).
61
+ // Returns null when neither is present so existing session-only behavior is
62
+ // preserved unchanged. Uses AbortSignal.any when available; falls back to a
63
+ // manual controller + listener bridge otherwise. The returned signal aborts as
64
+ // soon as either input signal aborts, which propagates to execShellCommand /
65
+ // executeBashSessionTool and triggers the same child-kill path the session
66
+ // signal already drives.
67
+ function _combineAbortSignals(sessionSignal, externalSignal) {
68
+ const a = sessionSignal || null;
69
+ const b = externalSignal || null;
70
+ if (!a && !b) return null;
71
+ if (!a) return b;
72
+ if (!b) return a;
73
+ if (a === b) return a;
74
+ if (typeof AbortSignal !== 'undefined' && typeof AbortSignal.any === 'function') {
75
+ try { return AbortSignal.any([a, b]); } catch { /* fall through */ }
76
+ }
77
+ const ctl = new AbortController();
78
+ const onAbort = (sig) => {
79
+ if (ctl.signal.aborted) return;
80
+ try { ctl.abort(sig?.reason); } catch { try { ctl.abort(); } catch {} }
81
+ };
82
+ if (a.aborted) { onAbort(a); return ctl.signal; }
83
+ if (b.aborted) { onAbort(b); return ctl.signal; }
84
+ try { a.addEventListener('abort', () => onAbort(a), { once: true }); } catch {}
85
+ try { b.addEventListener('abort', () => onAbort(b), { once: true }); } catch {}
86
+ return ctl.signal;
87
+ }
88
+
89
+ // Decode ANSI-C $'…' and locale $"…" escapes so the blocklist scan sees the
90
+ // literal command (e.g. $'\x72m' → "rm"). Defensive against quoting bypass.
91
+ function _decodeAnsiCQuotes(s) {
92
+ if (typeof s !== 'string') return '';
93
+ if (s.indexOf('$') === -1) return s;
94
+ return s.replace(/\$(['"])((?:\\.|[^\\])*?)\1/g, (_full, _q, body) =>
95
+ body
96
+ .replace(/\\x([0-9a-fA-F]{1,2})/g, (_m, h) => String.fromCharCode(parseInt(h, 16)))
97
+ .replace(/\\u([0-9a-fA-F]{1,4})/g, (_m, h) => String.fromCharCode(parseInt(h, 16)))
98
+ .replace(/\\0([0-7]{1,3})/g, (_m, o) => String.fromCharCode(parseInt(o, 8)))
99
+ .replace(/\\([0-7]{1,3})/g, (_m, o) => String.fromCharCode(parseInt(o, 8)))
100
+ .replace(/\\n/g, '\n').replace(/\\t/g, '\t').replace(/\\r/g, '\r')
101
+ .replace(/\\\\/g, '\\').replace(/\\(['"])/g, '$1'),
102
+ );
103
+ }
104
+
105
+ // Extract $(…) and `…` command-substitution bodies so each is re-scanned by
106
+ // isBlockedCommand (e.g. eval $(printf 'rm -rf ~')).
107
+ function _extractSubstitutionBodies(s) {
108
+ if (typeof s !== 'string') return [];
109
+ const out = [];
110
+ const re = /\$\(([^()]*(?:\([^()]*\)[^()]*)*)\)|`([^`]*)`/g;
111
+ let m;
112
+ while ((m = re.exec(s)) !== null) {
113
+ const body = m[1] != null ? m[1] : m[2];
114
+ if (body && body.trim()) out.push(body);
115
+ }
116
+ return out;
117
+ }
118
+
119
+ // Combined injection-aware block targets: decoded form + substitution bodies
120
+ // (and their decoded forms). Used on BOTH the persistent and stateless paths.
121
+ export function _injectionBlockTargets(cmd) {
122
+ return injectionBlockTargets(cmd);
123
+ }
124
+
125
+ function _prefixPowerShellUtf8(command) {
126
+ const prefix = '[Console]::OutputEncoding=[System.Text.Encoding]::UTF8; $OutputEncoding=[System.Text.Encoding]::UTF8;';
127
+ const text = String(command || '');
128
+ return text.trimStart().startsWith(prefix) ? text : `${prefix}\n${text}`;
129
+ }
130
+
131
+ const _unquoteSpansForPolicy = (s) => s.replace(/"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/g, (m) => m.slice(1, -1));
132
+
133
+ // Same normalized + decoded target set as hard-block (strip/unquote/shell -c/PS).
134
+ export { buildBashPolicyScanTargets } from '../bash-policy-scan.mjs';
135
+
136
+ export function getDedupedDestructiveWarnings(command) {
137
+ const seenMsg = new Set();
138
+ const warnings = [];
139
+ for (const t of buildBashPolicyScanTargets(command)) {
140
+ const w = getDestructiveCommandWarning(t);
141
+ if (w && !seenMsg.has(w)) {
142
+ seenMsg.add(w);
143
+ warnings.push(w);
144
+ }
145
+ }
146
+ return warnings;
147
+ }
148
+
149
+ function _prependDestructiveWarning(command, text) {
150
+ const warnings = getDedupedDestructiveWarnings(command);
151
+ if (!warnings.length) return text;
152
+ return `${warnings.map((w) => `⚠️ ${w}`).join('\n')}\n${text}`;
153
+ }
154
+
155
+ export async function executeBashTool(args, workDir, options = {}) {
156
+ const requestedCwd = args.cwd ?? args.workdir;
157
+ const cwdResult = resolveOptionalCwd(requestedCwd, workDir);
158
+ if (cwdResult.error) return cwdResult.error;
159
+ const bashWorkDir = cwdResult.cwd;
160
+ const _readStateScope = options?.readStateScope ?? options?.sessionId ?? null;
161
+ const executionMode = resolveExecutionMode(args || {}, args?.run_in_background === true ? 'async' : 'sync');
162
+ const runInBackground = executionMode === 'async';
163
+
164
+ // Run hard-block policy BEFORE branching into the persistent-shell tool.
165
+ // The persistent path used to bypass the one-shot block scan because the
166
+ // normalization (stripQuotedAndHeredoc / extractShellCInner / unquoted
167
+ // span sweep) lived only on the one-shot side. Centralised policy in
168
+ // shell-policy.mjs already covers the literal scan + EncodedCommand
169
+ // decode + rm token guard; calling it here applies the same allowlist
170
+ // to both persistent and stateless paths.
171
+ const _rawCmd = String(args && args.command != null ? args.command : '');
172
+ if (_rawCmd) {
173
+ // R5-③: persistent:true used to route into bash_session BEFORE the
174
+ // stripQuotedAndHeredoc / extractShellCInner / unquote sweep ran
175
+ // (that sweep lived only on the stateless one-shot path below at
176
+ // ~:218). Result: `bash -c 'shutdown -h now'` / `sh -c 'mkfs ...'` /
177
+ // dd payloads were rejected stateless but accepted with
178
+ // persistent:true. Run the full sweep here so both paths share the
179
+ // same blocklist before dispatch.
180
+ const _policyBlock = checkExecPolicyMessage(_rawCmd);
181
+ if (_policyBlock) return _policyBlock;
182
+ }
183
+
184
+ // An empty-string session_id is NOT a persistent-session request: `typeof
185
+ // '' === 'string'` would otherwise route a stateless call into the
186
+ // persistent path and (on Windows) hard-fail with the disabled-sessions
187
+ // error, which models then retry in a loop. Require a non-blank id.
188
+ if (args.persistent === true || (typeof args.session_id === 'string' && args.session_id.trim().length > 0)) {
189
+ if (process.platform === 'win32') {
190
+ return 'Error: persistent shell sessions are disabled on Windows native-shell mode; run one-shot PowerShell commands without persistent/session_id.';
191
+ }
192
+ const { executeBashSessionTool } = await import('../bash-session.mjs');
193
+ let persistAbort = null;
194
+ try { persistAbort = (await getAbortSignalForSession(options?.sessionId)) || null; }
195
+ catch { persistAbort = null; }
196
+ const combinedPersistAbort = _combineAbortSignals(persistAbort, options?.abortSignal || null);
197
+ let effectiveArgs = (args.persistent === true && !args.session_id && options?.sessionId)
198
+ ? { ...args, session_id: `__default__${options.sessionId}` }
199
+ : (typeof args.session_id === 'string' && options?.sessionId)
200
+ ? { ...args, session_id: `${options.sessionId}__${args.session_id}` }
201
+ : args;
202
+ const userProvidedSession = typeof args.session_id === 'string' && args.session_id.trim().length > 0;
203
+ const shouldCreate = args.create === true || !userProvidedSession;
204
+ effectiveArgs = { ...effectiveArgs, create: shouldCreate };
205
+ return executeBashSessionTool('bash_session', effectiveArgs, bashWorkDir, { abortSignal: combinedPersistAbort, sessionId: options?.sessionId });
206
+ }
207
+
208
+ let command = args.command;
209
+ if (!command) return 'Error: command is required';
210
+
211
+ // Resolve the shell up front so shell-type-specific handling (PS-only wmic
212
+ // rewrite, PS UTF-8 prefix) can gate on it. kind 'default' is byte-identical
213
+ // to today's resolveShell(); kind 'bash' on Windows resolves Git Bash, and a
214
+ // null spec means it is genuinely not installed — surface a clear error with
215
+ // NO silent fallback to the other shell.
216
+ const shellKind = args.shell === 'bash' || args.shell === 'powershell' ? args.shell : 'default';
217
+ const resolvedSpec = resolveShellFor(shellKind);
218
+ if (!resolvedSpec) {
219
+ if (shellKind === 'bash') {
220
+ return "Error: Git Bash not found — install Git for Windows or omit shell:'bash'.";
221
+ }
222
+ return "Error: pwsh (PowerShell) not found — install PowerShell or omit shell:'powershell'.";
223
+ }
224
+
225
+ // wmic→PowerShell rewrite is PowerShell-only; never mangle a command bound
226
+ // for bash (gate on the resolved shell type).
227
+ // Note: gating this to powershell did NOT change POSIX behavior — wmic is a
228
+ // Windows-only tool, so the rewrite was already dead code on POSIX hosts;
229
+ // the gate just makes that explicit.
230
+ const wmicRewrite = resolvedSpec.shellType === 'powershell'
231
+ ? maybeRewriteWmicProcessCommand(command)
232
+ : null;
233
+ if (wmicRewrite?.error) return `Error: ${wmicRewrite.error}`;
234
+ if (wmicRewrite?.command) command = wmicRewrite.command;
235
+
236
+ const _execPolicyBlock = checkExecPolicyMessage(command);
237
+ if (_execPolicyBlock) {
238
+ return _execPolicyBlock;
239
+ }
240
+
241
+ const largeProbe = await preflightShellLargeFileProbe(command, bashWorkDir);
242
+ if (largeProbe) return `Error: ${largeProbe.message}`;
243
+ let shellEffects;
244
+ try {
245
+ shellEffects = await analyzeShellCommandEffects(command, bashWorkDir);
246
+ } catch (err) {
247
+ return `Error: ${normalizeErrorMessage(err instanceof Error ? err.message : String(err))}`;
248
+ }
249
+ // Keep foreground commands on a long tool-owned timeout. The MCP dispatch
250
+ // layer must not add a shorter fallback ceiling when timeout is omitted.
251
+ const DEFAULT_BASH_TIMEOUT_MS = 600_000;
252
+ const DEFAULT_BACKGROUND_BASH_TIMEOUT_MS = 600_000;
253
+ const MAX_BASH_TIMEOUT_MS = 1_800_000;
254
+ const defaultTimeoutMs = runInBackground
255
+ ? DEFAULT_BACKGROUND_BASH_TIMEOUT_MS
256
+ : DEFAULT_BASH_TIMEOUT_MS;
257
+ const rawTimeout = (typeof args.timeout === 'number' && args.timeout > 0)
258
+ ? args.timeout : defaultTimeoutMs;
259
+ const timeoutMs = rawTimeout;
260
+ const timeout = Math.min(timeoutMs, wmicRewrite?.timeoutMs || MAX_BASH_TIMEOUT_MS);
261
+ const mergeStderr = args.merge_stderr === true;
262
+ const longForegroundHint = foregroundLongCommandHint(command, timeout, { ...args, run_in_background: runInBackground });
263
+ if (longForegroundHint) return longForegroundHint;
264
+ // Auto-background threshold (CC ASSISTANT_BLOCKING_BUDGET_MS analogue):
265
+ // a foreground one-shot that is still running after this many ms is
266
+ // detached into a tracked shell-job instead of blocking the tool call
267
+ // indefinitely. Only the foreground one-shot path uses it — never
268
+ // run_in_background (already detached) or persistent sessions (handled
269
+ // far above). Capped below the hard timeout so the 600 s upper bound
270
+ // stays a separate, later ceiling.
271
+ const DEFAULT_AUTO_BACKGROUND_MS = 30_000;
272
+ const autoBackgroundMs = runInBackground
273
+ ? 0
274
+ : Math.min(DEFAULT_AUTO_BACKGROUND_MS, timeout);
275
+
276
+ try {
277
+ const { shell, shellArg, shellArgs, shellType } = resolvedSpec;
278
+ const spawnEnv = { ...process.env, LANG: 'C.UTF-8', LC_ALL: 'C.UTF-8' };
279
+ // R5/R11: same scrub as background/persistent spawn sites (env-scrub.mjs).
280
+ scrubProviderSecrets(spawnEnv);
281
+ scrubLoaderVars(spawnEnv);
282
+ let wrappedCommand;
283
+ // PowerShell UTF-8 prefix is PS-only: the Windows Git Bash path
284
+ // (shellType==='posix') must NOT receive it. Snapshot wrapper stays
285
+ // POSIX-host-only for now — no snapshot for Windows Git Bash initially.
286
+ if (process.platform === 'win32' && shellType === 'powershell') {
287
+ wrappedCommand = _prefixPowerShellUtf8(command);
288
+ } else if (process.platform !== 'win32' && (shell.includes('bash') || shell.includes('zsh'))) {
289
+ try {
290
+ wrappedCommand = await wrapCommandWithSnapshot(shell, command);
291
+ } catch (wrapErr) {
292
+ return `Error: shell snapshot wrapper failed — ${normalizeErrorMessage(wrapErr instanceof Error ? wrapErr.message : String(wrapErr))}`;
293
+ }
294
+ } else {
295
+ wrappedCommand = command;
296
+ }
297
+ if (runInBackground) {
298
+ const job = startBackgroundShellJob({
299
+ command: wrappedCommand,
300
+ timeoutMs: timeout,
301
+ workDir: bashWorkDir,
302
+ mergeStderr,
303
+ spawnEnv,
304
+ shell,
305
+ shellArg,
306
+ shellArgs,
307
+ shellType,
308
+ // Per-terminal session stamp: the dispatching terminal's
309
+ // claude.exe pid (server-main threads callerSession.clientHostPid).
310
+ clientHostPid: options?.clientHostPid,
311
+ });
312
+ if (job && job.error) return `Error: ${job.error}`;
313
+ let task;
314
+ try {
315
+ task = registerBackgroundTask({
316
+ taskId: job.jobId,
317
+ surface: 'shell',
318
+ operation: 'shell',
319
+ label: String(command).replace(/\s+/g, ' ').slice(0, 120),
320
+ input: { command, cwd: bashWorkDir },
321
+ context: {
322
+ notifyFn: typeof options?.notifyFn === 'function' ? options.notifyFn : null,
323
+ callerSessionId: options?.callerSessionId || options?.sessionId || null,
324
+ routingSessionId: options?.routingSessionId || options?.sessionId || null,
325
+ clientHostPid: options?.clientHostPid,
326
+ },
327
+ meta: {
328
+ task_id: job.jobId,
329
+ pid: job.pid,
330
+ stdout: normalizeOutputPath(job.stdoutPath),
331
+ stderr: mergeStderr ? null : normalizeOutputPath(job.stderrPath),
332
+ cwd: bashWorkDir,
333
+ timeoutMs: timeout,
334
+ },
335
+ resultType: 'shell_task_result',
336
+ cancel: () => killShellJob(job.jobId),
337
+ });
338
+ } catch (err) {
339
+ try { killShellJob(job.jobId); } catch { /* best effort cleanup */ }
340
+ return `Error: ${normalizeErrorMessage(err instanceof Error ? err.message : String(err))}`;
341
+ }
342
+ // Wire a one-shot completion push so the dispatching session learns
343
+ // the background task finished (no polling tool is auto-driven). The
344
+ // notify ctx is threaded down from the MCP dispatch frame
345
+ // (server-main agentContext / _dispatchByModule) the same way the
346
+ // bridge/explore-style tools receive notifyFn/routingSessionId/clientHostPid.
347
+ // Missing notifyFn (e.g. a non-MCP caller) degrades to a stderr
348
+ // diagnostic inside watchBackgroundShellJob — never fails the spawn.
349
+ try {
350
+ watchBackgroundShellJob(job.jobId, {
351
+ notifyFn: typeof options?.notifyFn === 'function' ? options.notifyFn : null,
352
+ callerSessionId: options?.callerSessionId || options?.sessionId,
353
+ routingSessionId: options?.routingSessionId,
354
+ clientHostPid: options?.clientHostPid,
355
+ });
356
+ } catch { /* watcher arm is best-effort; never blocks the spawn */ }
357
+ return _prependDestructiveWarning(command, renderBackgroundTask(task));
358
+ }
359
+
360
+ let bashAbortSignal = null;
361
+ try { bashAbortSignal = (await getAbortSignalForSession(options?.sessionId)) || null; }
362
+ catch { bashAbortSignal = null; }
363
+ const combinedBashAbort = _combineAbortSignals(bashAbortSignal, options?.abortSignal || null);
364
+ const result = await execShellCommand({
365
+ shell, shellArg, shellArgs, command: wrappedCommand,
366
+ env: spawnEnv,
367
+ cwd: bashWorkDir,
368
+ timeoutMs: timeout,
369
+ abortSignal: combinedBashAbort,
370
+ autoBackgroundMs,
371
+ // Threaded so an auto-backgrounded foreground job is stamped with
372
+ // the dispatching terminal's claude.exe pid (per-terminal scope).
373
+ clientHostPid: options?.clientHostPid,
374
+ // MCP live-progress reporter (null unless the client subscribed via
375
+ // callTool onprogress). execShellCommand emits throttled "running
376
+ // Ns" frames while the foreground command runs.
377
+ onProgress: typeof options?.onProgress === 'function' ? options.onProgress : null,
378
+ });
379
+ // Auto-backgrounded: the command outlived autoBackgroundMs and is
380
+ // still running, now adopted as a tracked shell-job. Surface the
381
+ // task_id + partial output for manual task control instead of
382
+ // keeping the tool call open until the hard timeout.
383
+ if (result.backgrounded) {
384
+ let task = null;
385
+ if (result.jobId) {
386
+ try {
387
+ task = registerBackgroundTask({
388
+ taskId: result.jobId,
389
+ surface: 'shell',
390
+ operation: 'shell',
391
+ label: String(command).replace(/\s+/g, ' ').slice(0, 120),
392
+ input: { command, cwd: bashWorkDir },
393
+ context: {
394
+ notifyFn: typeof options?.notifyFn === 'function' ? options.notifyFn : null,
395
+ callerSessionId: options?.callerSessionId || options?.sessionId || null,
396
+ routingSessionId: options?.routingSessionId || options?.sessionId || null,
397
+ clientHostPid: options?.clientHostPid,
398
+ },
399
+ meta: {
400
+ task_id: result.jobId,
401
+ stdout: result.stdoutPath ? normalizeOutputPath(result.stdoutPath) : null,
402
+ stderr: (!mergeStderr && result.stderrPath) ? normalizeOutputPath(result.stderrPath) : null,
403
+ cwd: bashWorkDir,
404
+ timeoutMs: timeout,
405
+ },
406
+ resultType: 'shell_task_result',
407
+ cancel: () => killShellJob(result.jobId),
408
+ });
409
+ } catch { task = null; }
410
+ try {
411
+ watchBackgroundShellJob(result.jobId, {
412
+ notifyFn: typeof options?.notifyFn === 'function' ? options.notifyFn : null,
413
+ callerSessionId: options?.callerSessionId || options?.sessionId,
414
+ routingSessionId: options?.routingSessionId || options?.sessionId,
415
+ clientHostPid: options?.clientHostPid,
416
+ });
417
+ } catch { /* best effort */ }
418
+ }
419
+ const partialStdout = smartMiddleTruncate(stripAnsi(result.stdout || ''));
420
+ const partialStderr = stripAnsi(result.stderr || '');
421
+ const lines = [
422
+ task ? renderBackgroundTask(task) : (result.jobId ? `[task_id: ${result.jobId}]` : null),
423
+ '',
424
+ result.backgroundMessage || 'auto-backgrounded; still running',
425
+ partialStdout ? `\n[partial stdout]\n${partialStdout}` : '',
426
+ (!mergeStderr && partialStderr) ? `\n[partial stderr]\n${partialStderr}` : '',
427
+ ].filter((l) => l !== null && l !== '');
428
+ return _prependDestructiveWarning(command, lines.join('\n'));
429
+ }
430
+ const stdout = stripAnsi(result.stdout || '');
431
+ const stderr = stripAnsi(result.stderr || '');
432
+ const signal = result.timedOut
433
+ ? 'SIGTERM'
434
+ : (result.killed ? 'SIGKILL' : (result.signal || null));
435
+ const exitCode = signal ? null : result.exitCode;
436
+ const isReallyErrored = !!signal || (exitCode !== 0 && exitCode !== null);
437
+ const _driftNote = '';
438
+ // Distinct timeout marker so callers see "killed by timeout after Nms"
439
+ // vs an external signal (e.g. user Ctrl-C, OOM kill). result.timedOut
440
+ // is the runtime's own timeout escalation (SIGTERM → SIGKILL via
441
+ // treeKill on Windows taskkill), so report the timeout ceiling that
442
+ // fired alongside the actual signal used to kill the tree.
443
+ // Timeout marker carries an inline recovery hint so the caller can
444
+ // act in one round (increase ceiling or detach) instead of repeating
445
+ // the same command and hitting the same wall.
446
+ const statusMarker = result.timedOut
447
+ ? `[timeout: ${timeout}ms signal: ${signal || 'SIGTERM'}]`
448
+ : (signal
449
+ ? `[signal: ${signal}]`
450
+ : (isReallyErrored ? `[exit code: ${exitCode}]` : ''));
451
+ const errorPrefix = isReallyErrored ? 'Error: ' : '';
452
+ if (mergeStderr) {
453
+ // Post-exit concatenation. True chunk-level interleaving would
454
+ // require shell-level `2>&1` redirection (bash) or `*>&1`
455
+ // (PowerShell) inside wrappedCommand, or an in-process ordered
456
+ // merged stream in shell-command.mjs. Current implementation
457
+ // preserves stdout/stderr ordering within each stream but loses
458
+ // cross-stream interleaving. Acceptable for most diagnostic
459
+ // outputs; flag in shell-command if exact interleaving is required.
460
+ const merged = stdout + stderr;
461
+ if (statusMarker) return _prependDestructiveWarning(command, errorPrefix + smartMiddleTruncate(`${statusMarker}\n\n${merged || '(no output)'}`) + _driftNote);
462
+ return _prependDestructiveWarning(command, smartMiddleTruncate(merged || '(no output)') + _driftNote);
463
+ }
464
+ const truncatedStdout = smartMiddleTruncate(stdout);
465
+ const truncatedStderr = stderr ? smartMiddleTruncate(stderr) : '';
466
+ const body = truncatedStdout || (truncatedStderr ? '' : '(no output)');
467
+ const stderrBlock = truncatedStderr ? `\n\n[stderr]\n${truncatedStderr}` : '';
468
+ let spillBlock = '';
469
+ if (result.stdoutPath) {
470
+ const sizeKb = Math.round((result.stdoutFileSize || 0) / 1024);
471
+ spillBlock += `\n\n[stdout: ${normalizeOutputPath(result.stdoutPath)} (${sizeKb} KB)]`;
472
+ }
473
+ if (result.stderrPath && (result.stderrFileSize || 0) > 0) {
474
+ const sizeKb = Math.round((result.stderrFileSize || 0) / 1024);
475
+ spillBlock += `\n[stderr: ${normalizeOutputPath(result.stderrPath)} (${sizeKb} KB)]`;
476
+ }
477
+ const warningBlock = [
478
+ wmicRewrite?.note || '',
479
+ ].filter(Boolean).join('\n');
480
+ const payload = `${body}${stderrBlock}${spillBlock}${_driftNote}`;
481
+ if (statusMarker) return _prependDestructiveWarning(command, `${errorPrefix}${warningBlock ? `${warningBlock}\n` : ''}${statusMarker}\n\n${payload}`);
482
+ return _prependDestructiveWarning(command, warningBlock ? `${warningBlock}\n${payload}` : payload);
483
+ }
484
+ finally {
485
+ if (shellEffects.mutationMode === 'paths') {
486
+ invalidateBuiltinResultCache(shellEffects.paths);
487
+ markCodeGraphDirtyPaths(shellEffects.paths);
488
+ } else if (shellEffects.mutationMode === 'global') {
489
+ invalidateBuiltinResultCache();
490
+ drainCodeGraphCache();
491
+ }
492
+ }
493
+ }
494
+
495
+ const TERMINAL_TASK_STATUSES = new Set(['completed', 'failed', 'cancelled']);
496
+
497
+ function sleep(ms) {
498
+ return new Promise((resolve) => setTimeout(resolve, ms));
499
+ }
500
+
501
+ function shellJobToTaskStatus(status) {
502
+ if (status === 'completed') return 'completed';
503
+ if (status === 'cancelled') return 'cancelled';
504
+ if (status === 'running') return 'running';
505
+ return 'failed';
506
+ }
507
+
508
+ function refreshShellTask(taskId, { includeRunning = false } = {}) {
509
+ const job = peekShellJob(taskId);
510
+ if (!job) return null;
511
+ const publicResult = shellJobPublicTaskResult(job);
512
+ if (job.status !== 'running') {
513
+ completeBackgroundTask(taskId, {
514
+ status: shellJobToTaskStatus(job.status),
515
+ result: publicResult,
516
+ resultText: JSON.stringify(publicResult, null, 2),
517
+ notify: false,
518
+ });
519
+ } else if (includeRunning) {
520
+ const task = getBackgroundTask(taskId);
521
+ if (task) {
522
+ task.result = publicResult;
523
+ task.resultText = JSON.stringify(publicResult, null, 2);
524
+ }
525
+ }
526
+ return job;
527
+ }
528
+
529
+ async function waitForGenericTask(taskId, { timeoutMs = 30_000, pollMs = 250, context = {} } = {}) {
530
+ const started = Date.now();
531
+ const deadline = started + Math.max(0, Number(timeoutMs) || 0);
532
+ let task = getBackgroundTask(taskId, { context });
533
+ if (!task) return null;
534
+ while (task && task.status === 'running' && Date.now() < deadline) {
535
+ await sleep(Math.max(25, Number(pollMs) || 250));
536
+ task = getBackgroundTask(taskId, { context });
537
+ }
538
+ return {
539
+ task,
540
+ waitedMs: Date.now() - started,
541
+ waitTimedOut: Boolean(task && task.status === 'running'),
542
+ };
543
+ }
544
+
545
+ export async function executeTaskTool(args, options = {}) {
546
+ const action = typeof args.action === 'string' ? args.action.toLowerCase() : (args.task_id ? 'wait' : 'list');
547
+ if (action === 'list') return renderBackgroundTaskList({ context: options });
548
+
549
+ const taskId = typeof args.task_id === 'string' ? args.task_id.trim() : '';
550
+ if (!taskId) return 'Error: task_id is required';
551
+ // bridge_* / sess_* are bridge-worker / orchestrator session ids, not
552
+ // background shell jobs. task only resolves `shell mode=async`
553
+ // jobs, so surface a self-correcting hint instead of the bare
554
+ // "job not found" that otherwise invites a wrong-tool retry loop.
555
+ if (/^(?:bridge_|sess_)/.test(taskId)) {
556
+ return `Error: "${taskId}" is a bridge/session id, not a background task_id. Bridge agents deliver completion notifications; use bridge list/read only for manual recovery.`;
557
+ }
558
+
559
+ const task = getBackgroundTask(taskId, { context: options });
560
+ if (!task) return `Error: task not found: ${taskId}`;
561
+ const isShellTask = task.surface === 'shell';
562
+
563
+ if (action === 'status' || action === 'read') {
564
+ if (isShellTask) refreshShellTask(taskId, { includeRunning: action === 'read' });
565
+ const latest = getBackgroundTask(taskId, { context: options }) || task;
566
+ return renderBackgroundTask(latest, { includeResult: action === 'read' });
567
+ }
568
+
569
+ if (action === 'cancel') {
570
+ if (isShellTask) {
571
+ const job = killShellJob(taskId);
572
+ cancelBackgroundShellJobWatch(taskId);
573
+ clearShellJobNotifyCtx(taskId);
574
+ cancelBackgroundTask(taskId, 'cancelled by task control');
575
+ return job ? renderBackgroundTask(getBackgroundTask(taskId, { context: options }) || task, { includeResult: true }) : buildJobNotFoundMessage(taskId);
576
+ }
577
+ cancelBackgroundTask(taskId, 'cancelled by task control');
578
+ return renderBackgroundTask(getBackgroundTask(taskId, { context: options }) || task, { includeResult: true });
579
+ }
580
+
581
+ if (action !== 'wait') {
582
+ return `Error: task action must be one of list|status|read|wait|cancel (got ${JSON.stringify(args.action)})`;
583
+ }
584
+
585
+ if (!isShellTask) {
586
+ const waited = await waitForGenericTask(taskId, {
587
+ timeoutMs: typeof args.timeout_ms === 'number' ? args.timeout_ms : 30_000,
588
+ pollMs: typeof args.poll_ms === 'number' ? args.poll_ms : 250,
589
+ context: options,
590
+ });
591
+ if (!waited?.task) return `Error: task not found: ${taskId}`;
592
+ const rendered = renderBackgroundTask(waited.task, { includeResult: TERMINAL_TASK_STATUSES.has(waited.task.status) });
593
+ return waited.waitTimedOut ? `${rendered}\nwait_timed_out: true\nwaited_ms: ${waited.waitedMs}` : rendered;
594
+ }
595
+ // Register as a synchronous waiter and cancel the armed watcher BEFORE
596
+ // awaiting: the caller consumes the outcome via task wait, so no async
597
+ // push is wanted, and cancelling up front closes the race where the armed
598
+ // watcher (watch callback or 2s poll) fires during the await window. The
599
+ // persistent notify ctx survives the cancel for a possible re-arm.
600
+ beginShellJobWait(taskId);
601
+ cancelBackgroundShellJobWatch(taskId);
602
+ try {
603
+ const job = await waitForShellJob(taskId, {
604
+ timeoutMs: typeof args.timeout_ms === 'number' ? args.timeout_ms : 30_000,
605
+ pollMs: typeof args.poll_ms === 'number' ? args.poll_ms : 250,
606
+ });
607
+ if (!job) return buildJobNotFoundMessage(taskId);
608
+ if (job.status !== 'running') {
609
+ const publicResult = shellJobPublicTaskResult(job);
610
+ completeBackgroundTask(taskId, {
611
+ status: shellJobToTaskStatus(job.status),
612
+ result: publicResult,
613
+ resultText: JSON.stringify(publicResult, null, 2),
614
+ notify: false,
615
+ });
616
+ }
617
+ const latest = getBackgroundTask(taskId, { context: options }) || task;
618
+ const rendered = renderBackgroundTask(latest, { includeResult: job.status !== 'running' });
619
+ return job.status === 'running' ? `${rendered}\nwait_timed_out: true\nwaited_ms: ${job.waitedMs}` : rendered;
620
+ } finally {
621
+ // Only the LAST concurrent waiter (post-decrement count 0) may re-arm,
622
+ // and only for a still-running job (timed-out wait). Re-arm with no ctx
623
+ // arg — watchBackgroundShellJob falls back to the persistent ctx. This
624
+ // prevents the concurrent-waiter double-deliver: while any other waiter
625
+ // is still synchronously consuming the outcome, the watcher stays off.
626
+ const remaining = endShellJobWait(taskId);
627
+ if (remaining === 0) {
628
+ const latest = peekShellJob(taskId);
629
+ if (latest && latest.status === 'running') watchBackgroundShellJob(taskId);
630
+ // LAST waiter out and the job already finished — the outcome was
631
+ // consumed synchronously, so no re-arm. Drop the persisted ctx here
632
+ // or it leaks (cleanup only runs on a real watcher settle, which
633
+ // never happens for a never-re-armed entry).
634
+ else clearShellJobNotifyCtx(taskId);
635
+ }
636
+ }
637
+ }