mixdog 0.7.18 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (847) hide show
  1. package/README.md +37 -331
  2. package/package.json +67 -99
  3. package/scripts/boot-smoke.mjs +94 -0
  4. package/scripts/build-tui.mjs +52 -0
  5. package/scripts/compact-smoke.mjs +199 -0
  6. package/scripts/lead-workflow-smoke.mjs +598 -0
  7. package/scripts/live-worker-smoke.mjs +239 -0
  8. package/scripts/output-style-smoke.mjs +101 -0
  9. package/scripts/session-context-bench.mjs +172 -0
  10. package/scripts/smoke-loop-report.mjs +221 -0
  11. package/scripts/smoke-loop.mjs +201 -0
  12. package/scripts/smoke.mjs +113 -0
  13. package/scripts/tool-failures.mjs +143 -0
  14. package/scripts/tool-smoke.mjs +452 -0
  15. package/src/agents/debugger/AGENT.md +3 -0
  16. package/src/agents/debugger/agent.json +6 -0
  17. package/src/agents/explore/AGENT.md +4 -0
  18. package/src/agents/explore/agent.json +6 -0
  19. package/src/agents/heavy-worker/AGENT.md +3 -0
  20. package/src/agents/heavy-worker/agent.json +6 -0
  21. package/src/agents/maintainer/AGENT.md +3 -0
  22. package/src/agents/maintainer/agent.json +6 -0
  23. package/src/agents/reviewer/AGENT.md +3 -0
  24. package/src/agents/reviewer/agent.json +6 -0
  25. package/src/agents/scheduler-task.md +3 -0
  26. package/src/agents/web-researcher/AGENT.md +3 -0
  27. package/src/agents/web-researcher/agent.json +6 -0
  28. package/src/agents/webhook-handler.md +3 -0
  29. package/src/agents/worker/AGENT.md +3 -0
  30. package/src/agents/worker/agent.json +6 -0
  31. package/src/app.mjs +90 -0
  32. package/src/cli.mjs +11 -0
  33. package/src/defaults/hidden-roles.json +72 -0
  34. package/src/defaults/mixdog-config.template.json +15 -0
  35. package/src/hooks/lib/permission-evaluator.cjs +488 -0
  36. package/src/hooks/lib/settings-loader.cjs +112 -0
  37. package/src/lib/keychain-cjs.cjs +332 -0
  38. package/src/lib/plugin-paths.cjs +28 -0
  39. package/src/lib/rules-builder.cjs +315 -0
  40. package/src/mixdog-session-runtime.mjs +3813 -0
  41. package/src/output-styles/default.md +38 -0
  42. package/src/output-styles/extreme-simple.md +17 -0
  43. package/src/output-styles/simple.md +17 -0
  44. package/src/repl.mjs +330 -0
  45. package/src/rules/bridge/00-common.md +5 -0
  46. package/src/rules/bridge/20-skip-protocol.md +11 -0
  47. package/src/rules/bridge/30-explorer.md +4 -0
  48. package/src/rules/bridge/40-cycle1-agent.md +28 -0
  49. package/src/rules/bridge/41-cycle2-agent.md +59 -0
  50. package/src/rules/lead/00-tool-lead.md +5 -0
  51. package/src/rules/lead/01-general.md +5 -0
  52. package/src/rules/lead/02-channels.md +3 -0
  53. package/src/rules/lead/04-workflow.md +12 -0
  54. package/src/rules/shared/00-language.md +3 -0
  55. package/src/rules/shared/01-tool.md +3 -0
  56. package/src/runtime/agent/orchestrator/bridge-trace.mjs +814 -0
  57. package/src/runtime/agent/orchestrator/cache-mtime.mjs +60 -0
  58. package/src/runtime/agent/orchestrator/config.mjs +446 -0
  59. package/src/runtime/agent/orchestrator/context/collect.mjs +796 -0
  60. package/src/runtime/agent/orchestrator/dispatch-persist.mjs +417 -0
  61. package/src/runtime/agent/orchestrator/internal-roles.mjs +188 -0
  62. package/src/runtime/agent/orchestrator/internal-tools.mjs +88 -0
  63. package/src/runtime/agent/orchestrator/mcp/client.mjs +345 -0
  64. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2104 -0
  65. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +784 -0
  66. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +341 -0
  67. package/src/runtime/agent/orchestrator/providers/gemini.mjs +1679 -0
  68. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +959 -0
  69. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +213 -0
  70. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +38 -0
  71. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +471 -0
  72. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +615 -0
  73. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +808 -0
  74. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +1719 -0
  75. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2587 -0
  76. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +1953 -0
  77. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +136 -0
  78. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +317 -0
  79. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +109 -0
  80. package/src/runtime/agent/orchestrator/providers/registry.mjs +247 -0
  81. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +332 -0
  82. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +11 -0
  83. package/src/runtime/agent/orchestrator/providers/trace-utils.mjs +50 -0
  84. package/src/runtime/agent/orchestrator/session/cache/post-edit-marks.mjs +42 -0
  85. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +142 -0
  86. package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +318 -0
  87. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +367 -0
  88. package/src/runtime/agent/orchestrator/session/compact.mjs +882 -0
  89. package/src/runtime/agent/orchestrator/session/context-utils.mjs +233 -0
  90. package/src/runtime/agent/orchestrator/session/loop.mjs +2269 -0
  91. package/src/runtime/agent/orchestrator/session/manager.mjs +2972 -0
  92. package/src/runtime/agent/orchestrator/session/result-classification.mjs +65 -0
  93. package/src/runtime/agent/orchestrator/session/store.mjs +870 -0
  94. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +166 -0
  95. package/src/runtime/agent/orchestrator/smart-bridge/bridge-llm.mjs +339 -0
  96. package/src/runtime/agent/orchestrator/smart-bridge/cache-strategy.mjs +419 -0
  97. package/src/runtime/agent/orchestrator/stall-policy.mjs +227 -0
  98. package/src/runtime/agent/orchestrator/tool-loop-guard.mjs +235 -0
  99. package/src/runtime/agent/orchestrator/tools/bash-session.mjs +723 -0
  100. package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +171 -0
  101. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +389 -0
  102. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +637 -0
  103. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +165 -0
  104. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +104 -0
  105. package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +194 -0
  106. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +596 -0
  107. package/src/runtime/agent/orchestrator/tools/builtin/native-edit-runner.mjs +110 -0
  108. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +153 -0
  109. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +118 -0
  110. package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +189 -0
  111. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +731 -0
  112. package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +168 -0
  113. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +602 -0
  114. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +465 -0
  115. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +160 -0
  116. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +982 -0
  117. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +1087 -0
  118. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +231 -0
  119. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +223 -0
  120. package/src/runtime/agent/orchestrator/tools/builtin.mjs +478 -0
  121. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +24 -0
  122. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4102 -0
  123. package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +323 -0
  124. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +154 -0
  125. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +26 -0
  126. package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +143 -0
  127. package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +18 -0
  128. package/src/runtime/agent/orchestrator/tools/patch.mjs +2772 -0
  129. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +114 -0
  130. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +880 -0
  131. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +312 -0
  132. package/src/runtime/channels/backends/discord.mjs +781 -0
  133. package/src/runtime/channels/data/voice-runtime-manifest.json +138 -0
  134. package/src/runtime/channels/index.mjs +3309 -0
  135. package/src/runtime/channels/lib/config.mjs +285 -0
  136. package/src/runtime/channels/lib/drop-trace.mjs +71 -0
  137. package/src/runtime/channels/lib/event-pipeline.mjs +81 -0
  138. package/src/runtime/channels/lib/holidays.mjs +138 -0
  139. package/src/runtime/channels/lib/hook-pipe-server.mjs +671 -0
  140. package/src/runtime/channels/lib/output-forwarder.mjs +765 -0
  141. package/src/runtime/channels/lib/runtime-paths.mjs +497 -0
  142. package/src/runtime/channels/lib/scheduler.mjs +710 -0
  143. package/src/runtime/channels/lib/session-discovery.mjs +102 -0
  144. package/src/runtime/channels/lib/state-file.mjs +68 -0
  145. package/src/runtime/channels/lib/status-snapshot.mjs +224 -0
  146. package/src/runtime/channels/lib/tool-format.mjs +122 -0
  147. package/src/runtime/channels/lib/transcript-discovery.mjs +195 -0
  148. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +734 -0
  149. package/src/runtime/channels/lib/webhook.mjs +1288 -0
  150. package/src/runtime/channels/tool-defs.mjs +177 -0
  151. package/src/runtime/lib/keychain-cjs.cjs +289 -0
  152. package/src/runtime/memory/data/runtime-manifest.json +40 -0
  153. package/src/runtime/memory/index.mjs +3706 -0
  154. package/src/runtime/memory/lib/core-memory-store.mjs +336 -0
  155. package/src/runtime/memory/lib/embedding-provider.mjs +275 -0
  156. package/src/runtime/memory/lib/embedding-worker.mjs +331 -0
  157. package/src/runtime/memory/lib/memory-cycle-requests.mjs +276 -0
  158. package/src/runtime/memory/lib/memory-cycle1.mjs +783 -0
  159. package/src/runtime/memory/lib/memory-cycle2.mjs +1389 -0
  160. package/src/runtime/memory/lib/memory-cycle3.mjs +646 -0
  161. package/src/runtime/memory/lib/memory-embed.mjs +300 -0
  162. package/src/runtime/memory/lib/memory-ops-policy.mjs +149 -0
  163. package/src/runtime/memory/lib/memory-recall-store.mjs +644 -0
  164. package/src/runtime/memory/lib/memory.mjs +418 -0
  165. package/src/runtime/memory/lib/pg/adapter.mjs +328 -0
  166. package/src/runtime/memory/lib/pg/process.mjs +366 -0
  167. package/src/runtime/memory/lib/pg/supervisor.mjs +495 -0
  168. package/src/runtime/memory/lib/runtime-fetcher.mjs +464 -0
  169. package/src/runtime/memory/lib/trace-store.mjs +734 -0
  170. package/src/runtime/memory/tool-defs.mjs +79 -0
  171. package/src/runtime/search/index.mjs +925 -0
  172. package/src/runtime/search/lib/config.mjs +61 -0
  173. package/src/runtime/search/lib/web-tools.mjs +1278 -0
  174. package/src/runtime/search/tool-defs.mjs +64 -0
  175. package/src/runtime/shared/atomic-file.mjs +435 -0
  176. package/src/runtime/shared/background-tasks.mjs +376 -0
  177. package/src/runtime/shared/child-guardian.mjs +98 -0
  178. package/src/runtime/shared/config.mjs +393 -0
  179. package/src/runtime/shared/err-text.mjs +121 -0
  180. package/src/runtime/shared/launcher-control.mjs +259 -0
  181. package/src/runtime/shared/llm/http-agent.mjs +129 -0
  182. package/src/runtime/shared/open-url.mjs +37 -0
  183. package/src/runtime/shared/plugin-paths.mjs +25 -0
  184. package/src/runtime/shared/process-shutdown.mjs +147 -0
  185. package/src/runtime/shared/schedules-store.mjs +70 -0
  186. package/src/runtime/shared/tool-execution-contract.mjs +104 -0
  187. package/src/runtime/shared/tool-surface.mjs +947 -0
  188. package/src/runtime/shared/user-cwd.mjs +221 -0
  189. package/src/runtime/shared/user-data-guard.mjs +232 -0
  190. package/src/runtime/shared/workspace-router.mjs +259 -0
  191. package/src/standalone/bridge-tool.mjs +1414 -0
  192. package/src/standalone/channel-admin.mjs +366 -0
  193. package/src/standalone/channel-worker-preload.cjs +3 -0
  194. package/src/standalone/channel-worker.mjs +353 -0
  195. package/src/standalone/explore-tool.mjs +233 -0
  196. package/src/standalone/hook-bus.mjs +246 -0
  197. package/src/standalone/plugin-admin.mjs +247 -0
  198. package/src/standalone/provider-admin.mjs +338 -0
  199. package/src/standalone/seeds.mjs +94 -0
  200. package/src/standalone/usage-dashboard.mjs +510 -0
  201. package/src/tui/App.jsx +5446 -0
  202. package/src/tui/components/AnsiText.jsx +199 -0
  203. package/src/tui/components/ContextPanel.jsx +265 -0
  204. package/src/tui/components/Markdown.jsx +205 -0
  205. package/src/tui/components/MarkdownTable.jsx +204 -0
  206. package/src/tui/components/Message.jsx +103 -0
  207. package/src/tui/components/Picker.jsx +317 -0
  208. package/src/tui/components/PromptInput.jsx +584 -0
  209. package/src/tui/components/QueuedCommands.jsx +47 -0
  210. package/src/tui/components/SlashCommandPalette.jsx +114 -0
  211. package/src/tui/components/Spinner.jsx +317 -0
  212. package/src/tui/components/StatusLine.jsx +87 -0
  213. package/src/tui/components/TextEntryPanel.jsx +323 -0
  214. package/src/tui/components/ToolExecution.jsx +791 -0
  215. package/src/tui/components/TurnDone.jsx +78 -0
  216. package/src/tui/components/UsagePanel.jsx +331 -0
  217. package/src/tui/dist/index.mjs +12420 -0
  218. package/src/tui/engine.mjs +2410 -0
  219. package/src/tui/figures.mjs +50 -0
  220. package/src/tui/hooks/useEngine.mjs +16 -0
  221. package/src/tui/index.jsx +254 -0
  222. package/src/tui/input-editing.mjs +242 -0
  223. package/src/tui/markdown/format-token.mjs +194 -0
  224. package/src/tui/paste-attachments.mjs +198 -0
  225. package/src/tui/runtime/shared/process-shutdown.mjs +1 -0
  226. package/src/tui/spinner-verbs.mjs +45 -0
  227. package/src/tui/theme.mjs +67 -0
  228. package/src/tui/time-format.mjs +53 -0
  229. package/src/ui/ansi.mjs +115 -0
  230. package/src/ui/markdown.mjs +195 -0
  231. package/src/ui/statusline.mjs +730 -0
  232. package/src/ui/tool-card.mjs +99 -0
  233. package/src/vendor/statusline/bin/statusline-lib.mjs +805 -0
  234. package/src/vendor/statusline/bin/statusline-route.mjs +596 -0
  235. package/src/vendor/statusline/scripts/lib/gateway-settings.mjs +285 -0
  236. package/src/vendor/statusline/src/gateway/claude-current.mjs +320 -0
  237. package/src/vendor/statusline/src/gateway/route-meta.mjs +753 -0
  238. package/src/vendor/statusline/src/gateway/session-routes.mjs +244 -0
  239. package/src/workflows/default/WORKFLOW.md +7 -0
  240. package/src/workflows/default/workflow.json +14 -0
  241. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  242. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  243. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  244. package/vendor/ink/build/colorize.d.ts +3 -0
  245. package/vendor/ink/build/colorize.js +48 -0
  246. package/vendor/ink/build/colorize.js.map +1 -0
  247. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  248. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  249. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  250. package/vendor/ink/build/components/AnimationContext.d.ts +9 -0
  251. package/vendor/ink/build/components/AnimationContext.js +13 -0
  252. package/vendor/ink/build/components/AnimationContext.js.map +1 -0
  253. package/vendor/ink/build/components/App.d.ts +24 -0
  254. package/vendor/ink/build/components/App.js +554 -0
  255. package/vendor/ink/build/components/App.js.map +1 -0
  256. package/vendor/ink/build/components/AppContext.d.ts +80 -0
  257. package/vendor/ink/build/components/AppContext.js +25 -0
  258. package/vendor/ink/build/components/AppContext.js.map +1 -0
  259. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  260. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  261. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  262. package/vendor/ink/build/components/Box.d.ts +130 -0
  263. package/vendor/ink/build/components/Box.js +34 -0
  264. package/vendor/ink/build/components/Box.js.map +1 -0
  265. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  266. package/vendor/ink/build/components/CursorContext.js +8 -0
  267. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  268. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  269. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  270. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  271. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  272. package/vendor/ink/build/components/ErrorOverview.js +90 -0
  273. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  274. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  275. package/vendor/ink/build/components/FocusContext.js +17 -0
  276. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  277. package/vendor/ink/build/components/Newline.d.ts +13 -0
  278. package/vendor/ink/build/components/Newline.js +8 -0
  279. package/vendor/ink/build/components/Newline.js.map +1 -0
  280. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  281. package/vendor/ink/build/components/Spacer.js +11 -0
  282. package/vendor/ink/build/components/Spacer.js.map +1 -0
  283. package/vendor/ink/build/components/Static.d.ts +24 -0
  284. package/vendor/ink/build/components/Static.js +28 -0
  285. package/vendor/ink/build/components/Static.js.map +1 -0
  286. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  287. package/vendor/ink/build/components/StderrContext.js +13 -0
  288. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  289. package/vendor/ink/build/components/StdinContext.d.ts +28 -0
  290. package/vendor/ink/build/components/StdinContext.js +20 -0
  291. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  292. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  293. package/vendor/ink/build/components/StdoutContext.js +13 -0
  294. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  295. package/vendor/ink/build/components/Text.d.ts +55 -0
  296. package/vendor/ink/build/components/Text.js +50 -0
  297. package/vendor/ink/build/components/Text.js.map +1 -0
  298. package/vendor/ink/build/components/Transform.d.ts +16 -0
  299. package/vendor/ink/build/components/Transform.js +15 -0
  300. package/vendor/ink/build/components/Transform.js.map +1 -0
  301. package/vendor/ink/build/cursor-helpers.d.ts +39 -0
  302. package/vendor/ink/build/cursor-helpers.js +62 -0
  303. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  304. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  305. package/vendor/ink/build/devtools-window-polyfill.js +68 -0
  306. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  307. package/vendor/ink/build/devtools.d.ts +1 -0
  308. package/vendor/ink/build/devtools.js +36 -0
  309. package/vendor/ink/build/devtools.js.map +1 -0
  310. package/vendor/ink/build/dom.d.ts +62 -0
  311. package/vendor/ink/build/dom.js +143 -0
  312. package/vendor/ink/build/dom.js.map +1 -0
  313. package/vendor/ink/build/get-max-width.d.ts +3 -0
  314. package/vendor/ink/build/get-max-width.js +10 -0
  315. package/vendor/ink/build/get-max-width.js.map +1 -0
  316. package/vendor/ink/build/hooks/use-animation.d.ts +49 -0
  317. package/vendor/ink/build/hooks/use-animation.js +87 -0
  318. package/vendor/ink/build/hooks/use-animation.js.map +1 -0
  319. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  320. package/vendor/ink/build/hooks/use-app.js +8 -0
  321. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  322. package/vendor/ink/build/hooks/use-box-metrics.d.ts +59 -0
  323. package/vendor/ink/build/hooks/use-box-metrics.js +81 -0
  324. package/vendor/ink/build/hooks/use-box-metrics.js.map +1 -0
  325. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  326. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  327. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  328. package/vendor/ink/build/hooks/use-focus-manager.d.ts +43 -0
  329. package/vendor/ink/build/hooks/use-focus-manager.js +18 -0
  330. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  331. package/vendor/ink/build/hooks/use-focus.d.ts +30 -0
  332. package/vendor/ink/build/hooks/use-focus.js +43 -0
  333. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  334. package/vendor/ink/build/hooks/use-input.d.ts +132 -0
  335. package/vendor/ink/build/hooks/use-input.js +126 -0
  336. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  337. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +6 -0
  338. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +12 -0
  339. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  340. package/vendor/ink/build/hooks/use-paste.d.ts +35 -0
  341. package/vendor/ink/build/hooks/use-paste.js +62 -0
  342. package/vendor/ink/build/hooks/use-paste.js.map +1 -0
  343. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  344. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  345. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  346. package/vendor/ink/build/hooks/use-stdin.d.ts +7 -0
  347. package/vendor/ink/build/hooks/use-stdin.js +9 -0
  348. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  349. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  350. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  351. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  352. package/vendor/ink/build/hooks/use-window-size.d.ts +18 -0
  353. package/vendor/ink/build/hooks/use-window-size.js +22 -0
  354. package/vendor/ink/build/hooks/use-window-size.js.map +1 -0
  355. package/vendor/ink/build/index.d.ts +42 -0
  356. package/vendor/ink/build/index.js +24 -0
  357. package/vendor/ink/build/index.js.map +1 -0
  358. package/vendor/ink/build/ink.d.ts +146 -0
  359. package/vendor/ink/build/ink.js +1022 -0
  360. package/vendor/ink/build/ink.js.map +1 -0
  361. package/vendor/ink/build/input-parser.d.ts +10 -0
  362. package/vendor/ink/build/input-parser.js +194 -0
  363. package/vendor/ink/build/input-parser.js.map +1 -0
  364. package/vendor/ink/build/instances.d.ts +3 -0
  365. package/vendor/ink/build/instances.js +8 -0
  366. package/vendor/ink/build/instances.js.map +1 -0
  367. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  368. package/vendor/ink/build/kitty-keyboard.js +32 -0
  369. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  370. package/vendor/ink/build/log-update.d.ts +20 -0
  371. package/vendor/ink/build/log-update.js +261 -0
  372. package/vendor/ink/build/log-update.js.map +1 -0
  373. package/vendor/ink/build/measure-element.d.ts +20 -0
  374. package/vendor/ink/build/measure-element.js +13 -0
  375. package/vendor/ink/build/measure-element.js.map +1 -0
  376. package/vendor/ink/build/measure-text.d.ts +6 -0
  377. package/vendor/ink/build/measure-text.js +21 -0
  378. package/vendor/ink/build/measure-text.js.map +1 -0
  379. package/vendor/ink/build/output.d.ts +35 -0
  380. package/vendor/ink/build/output.js +328 -0
  381. package/vendor/ink/build/output.js.map +1 -0
  382. package/vendor/ink/build/parse-keypress.d.ts +20 -0
  383. package/vendor/ink/build/parse-keypress.js +495 -0
  384. package/vendor/ink/build/parse-keypress.js.map +1 -0
  385. package/vendor/ink/build/reconciler.d.ts +4 -0
  386. package/vendor/ink/build/reconciler.js +306 -0
  387. package/vendor/ink/build/reconciler.js.map +1 -0
  388. package/vendor/ink/build/render-background.d.ts +4 -0
  389. package/vendor/ink/build/render-background.js +25 -0
  390. package/vendor/ink/build/render-background.js.map +1 -0
  391. package/vendor/ink/build/render-border.d.ts +4 -0
  392. package/vendor/ink/build/render-border.js +84 -0
  393. package/vendor/ink/build/render-border.js.map +1 -0
  394. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  395. package/vendor/ink/build/render-node-to-output.js +162 -0
  396. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  397. package/vendor/ink/build/render-to-string.d.ts +38 -0
  398. package/vendor/ink/build/render-to-string.js +116 -0
  399. package/vendor/ink/build/render-to-string.js.map +1 -0
  400. package/vendor/ink/build/render.d.ts +176 -0
  401. package/vendor/ink/build/render.js +71 -0
  402. package/vendor/ink/build/render.js.map +1 -0
  403. package/vendor/ink/build/renderer.d.ts +8 -0
  404. package/vendor/ink/build/renderer.js +64 -0
  405. package/vendor/ink/build/renderer.js.map +1 -0
  406. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  407. package/vendor/ink/build/sanitize-ansi.js +27 -0
  408. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  409. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  410. package/vendor/ink/build/squash-text-nodes.js +36 -0
  411. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  412. package/vendor/ink/build/styles.d.ts +302 -0
  413. package/vendor/ink/build/styles.js +303 -0
  414. package/vendor/ink/build/styles.js.map +1 -0
  415. package/vendor/ink/build/utils.d.ts +9 -0
  416. package/vendor/ink/build/utils.js +19 -0
  417. package/vendor/ink/build/utils.js.map +1 -0
  418. package/vendor/ink/build/wrap-text.d.ts +3 -0
  419. package/vendor/ink/build/wrap-text.js +38 -0
  420. package/vendor/ink/build/wrap-text.js.map +1 -0
  421. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  422. package/vendor/ink/build/write-synchronized.js +9 -0
  423. package/vendor/ink/build/write-synchronized.js.map +1 -0
  424. package/vendor/ink/license +10 -0
  425. package/vendor/ink/package.json +137 -0
  426. package/.claude-plugin/marketplace.json +0 -34
  427. package/.claude-plugin/plugin.json +0 -20
  428. package/.gitattributes +0 -34
  429. package/.mcp.json +0 -14
  430. package/ARCHITECTURE.md +0 -77
  431. package/CHANGELOG.md +0 -30
  432. package/CONTRIBUTING.md +0 -45
  433. package/DATA-FLOW.md +0 -79
  434. package/LICENSE +0 -21
  435. package/SECURITY.md +0 -138
  436. package/UNINSTALL.md +0 -115
  437. package/agents/maintenance.md +0 -5
  438. package/agents/memory-classification.md +0 -30
  439. package/agents/scheduler-task.md +0 -18
  440. package/agents/webhook-handler.md +0 -27
  441. package/agents/worker.md +0 -24
  442. package/bin/bridge +0 -133
  443. package/bin/statusline-launcher.mjs +0 -82
  444. package/bin/statusline-lib.mjs +0 -581
  445. package/bin/statusline-route.mjs +0 -273
  446. package/bin/statusline.mjs +0 -638
  447. package/bun.lock +0 -927
  448. package/commands/config.md +0 -16
  449. package/commands/doctor.md +0 -13
  450. package/commands/model.md +0 -61
  451. package/commands/setup.md +0 -17
  452. package/defaults/hidden-roles.json +0 -68
  453. package/defaults/memory-chunk-prompt.md +0 -63
  454. package/defaults/mixdog-config.template.json +0 -27
  455. package/defaults/user-workflow.json +0 -8
  456. package/defaults/user-workflow.md +0 -17
  457. package/hooks/hooks.json +0 -73
  458. package/hooks/lib/active-instance.cjs +0 -77
  459. package/hooks/lib/permission-evaluator.cjs +0 -411
  460. package/hooks/lib/permission-route.cjs +0 -63
  461. package/hooks/lib/settings-loader.cjs +0 -117
  462. package/hooks/post-tool-use.cjs +0 -84
  463. package/hooks/pre-mcp-sandbox.cjs +0 -158
  464. package/hooks/pre-tool-subagent.cjs +0 -258
  465. package/hooks/session-start.cjs +0 -1493
  466. package/hooks/shim-launcher.cjs +0 -65
  467. package/hooks/turn-timer.cjs +0 -82
  468. package/lib/claude-md-writer.cjs +0 -386
  469. package/lib/keychain-cjs.cjs +0 -290
  470. package/lib/plugin-paths.cjs +0 -69
  471. package/lib/rules-builder.cjs +0 -241
  472. package/native/README.md +0 -117
  473. package/native/prebuilt/linux-aarch64/mixdog-shim +0 -0
  474. package/native/prebuilt/linux-x86_64/mixdog-shim +0 -0
  475. package/native/prebuilt/macos-aarch64/mixdog-shim +0 -0
  476. package/native/prebuilt/macos-x86_64/mixdog-shim +0 -0
  477. package/native/prebuilt/windows-x86_64/mixdog-shim.exe +0 -0
  478. package/prompts/code-review.txt +0 -16
  479. package/prompts/security-audit.txt +0 -17
  480. package/rules/bridge/00-common.md +0 -39
  481. package/rules/bridge/20-skip-protocol.md +0 -18
  482. package/rules/bridge/30-explorer.md +0 -33
  483. package/rules/bridge/40-cycle1-agent.md +0 -52
  484. package/rules/bridge/41-cycle2-agent.md +0 -62
  485. package/rules/lead/00-tool-lead.md +0 -61
  486. package/rules/lead/01-general.md +0 -26
  487. package/rules/lead/02-channels.md +0 -49
  488. package/rules/lead/03-team.md +0 -27
  489. package/rules/lead/04-workflow.md +0 -20
  490. package/rules/shared/00-language.md +0 -14
  491. package/rules/shared/01-tool.md +0 -138
  492. package/scripts/bootstrap.mjs +0 -130
  493. package/scripts/bridge-unify-smoke.mjs +0 -308
  494. package/scripts/build-runtime-linux.sh +0 -348
  495. package/scripts/build-runtime-macos.sh +0 -217
  496. package/scripts/build-runtime-windows.ps1 +0 -242
  497. package/scripts/builtin-utils-smoke.mjs +0 -398
  498. package/scripts/bump.mjs +0 -80
  499. package/scripts/check-json.mjs +0 -45
  500. package/scripts/check-syntax-changed.mjs +0 -102
  501. package/scripts/check-syntax.mjs +0 -58
  502. package/scripts/code-graph-batch.test.mjs +0 -33
  503. package/scripts/config-preserve-smoke.mjs +0 -180
  504. package/scripts/doctor.mjs +0 -489
  505. package/scripts/edit-normalize-fuzz.mjs +0 -130
  506. package/scripts/edit-normalize-smoke.mjs +0 -401
  507. package/scripts/edit-operation-smoke.mjs +0 -369
  508. package/scripts/edit2-smoke.mjs +0 -63
  509. package/scripts/ensure-deps.mjs +0 -259
  510. package/scripts/fuzzy-e2e.mjs +0 -28
  511. package/scripts/fuzzy-smoke.mjs +0 -26
  512. package/scripts/gateway-model.mjs +0 -596
  513. package/scripts/generate-runtime-manifest.mjs +0 -166
  514. package/scripts/guard-smoke.mjs +0 -66
  515. package/scripts/hidden-role-schema-smoke.mjs +0 -162
  516. package/scripts/hook-routing-smoke.mjs +0 -29
  517. package/scripts/inject-input.ps1 +0 -204
  518. package/scripts/io-complex-smoke.mjs +0 -667
  519. package/scripts/io-explore-bench.mjs +0 -424
  520. package/scripts/io-guardrails-smoke.mjs +0 -205
  521. package/scripts/io-mini-bench-baseline.json +0 -11
  522. package/scripts/io-mini-bench.mjs +0 -216
  523. package/scripts/io-route-harness.mjs +0 -933
  524. package/scripts/io-telemetry-report.mjs +0 -691
  525. package/scripts/lib/gateway-inventory.mjs +0 -178
  526. package/scripts/lib/gateway-settings.mjs +0 -78
  527. package/scripts/mutation-bench.mjs +0 -564
  528. package/scripts/mutation-io-smoke.mjs +0 -1097
  529. package/scripts/native-patch-bridge-smoke.mjs +0 -288
  530. package/scripts/native-patch-smoke.mjs +0 -304
  531. package/scripts/openai-oauth-catalog-smoke.mjs +0 -53
  532. package/scripts/patch-interior-context-smoke.mjs +0 -49
  533. package/scripts/patch-newline-utf8-smoke.mjs +0 -157
  534. package/scripts/perf-hook-smoke.mjs +0 -71
  535. package/scripts/permission-eval-smoke.mjs +0 -443
  536. package/scripts/prep-patch.mjs +0 -53
  537. package/scripts/prep-shim.mjs +0 -96
  538. package/scripts/provider-cache-smoke.mjs +0 -687
  539. package/scripts/report-runtime-health.mjs +0 -132
  540. package/scripts/resolve-bun.mjs +0 -60
  541. package/scripts/run-mcp.mjs +0 -1473
  542. package/scripts/salvage-v4a-shatter.test.mjs +0 -58
  543. package/scripts/scoped-cache-io-smoke.mjs +0 -103
  544. package/scripts/shell-policy-round3-smoke.mjs +0 -46
  545. package/scripts/smoke-runtime-negative.ps1 +0 -100
  546. package/scripts/smoke-runtime-negative.sh +0 -95
  547. package/scripts/stall-policy-smoke.mjs +0 -50
  548. package/scripts/start-memory-worker.mjs +0 -23
  549. package/scripts/statusline-launcher-smoke.mjs +0 -235
  550. package/scripts/stress-atomic-write.mjs +0 -1028
  551. package/scripts/test-fault-inject.mjs +0 -164
  552. package/scripts/test-large-file.mjs +0 -174
  553. package/scripts/tool-edge-smoke.mjs +0 -209
  554. package/scripts/uninstall.mjs +0 -238
  555. package/scripts/webhook-selfheal-smoke.mjs +0 -27
  556. package/scripts/write-overwrite-guard-smoke.mjs +0 -56
  557. package/server-main.mjs +0 -3350
  558. package/server.mjs +0 -468
  559. package/setup/config-merge.mjs +0 -246
  560. package/setup/install.mjs +0 -574
  561. package/setup/launch-core.mjs +0 -617
  562. package/setup/launch.mjs +0 -101
  563. package/setup/locate-claude.mjs +0 -56
  564. package/setup/mixdog-cli.mjs +0 -122
  565. package/setup/setup-server.mjs +0 -3305
  566. package/setup/setup.html +0 -3740
  567. package/setup/tui.mjs +0 -325
  568. package/skills/retro-skill-proposer/SKILL.md +0 -92
  569. package/skills/schedule-add/SKILL.md +0 -77
  570. package/skills/setup/SKILL.md +0 -356
  571. package/skills/webhook-add/SKILL.md +0 -81
  572. package/src/agent/bridge-stall-watchdog.mjs +0 -337
  573. package/src/agent/index.mjs +0 -2229
  574. package/src/agent/orchestrator/ai-wrapped-dispatch.mjs +0 -1010
  575. package/src/agent/orchestrator/bridge-retry.mjs +0 -220
  576. package/src/agent/orchestrator/bridge-trace.mjs +0 -601
  577. package/src/agent/orchestrator/cache-mtime.mjs +0 -58
  578. package/src/agent/orchestrator/config.mjs +0 -405
  579. package/src/agent/orchestrator/context/collect.mjs +0 -651
  580. package/src/agent/orchestrator/dispatch-persist.mjs +0 -549
  581. package/src/agent/orchestrator/drain-registry.mjs +0 -50
  582. package/src/agent/orchestrator/explore-validator.mjs +0 -8
  583. package/src/agent/orchestrator/internal-roles.mjs +0 -118
  584. package/src/agent/orchestrator/internal-tools.mjs +0 -88
  585. package/src/agent/orchestrator/jobs.mjs +0 -116
  586. package/src/agent/orchestrator/mcp/client.mjs +0 -364
  587. package/src/agent/orchestrator/providers/anthropic-oauth.mjs +0 -1884
  588. package/src/agent/orchestrator/providers/anthropic.mjs +0 -598
  589. package/src/agent/orchestrator/providers/gemini.mjs +0 -1530
  590. package/src/agent/orchestrator/providers/grok-oauth.mjs +0 -779
  591. package/src/agent/orchestrator/providers/model-catalog.mjs +0 -374
  592. package/src/agent/orchestrator/providers/openai-compat-stream.mjs +0 -366
  593. package/src/agent/orchestrator/providers/openai-compat.mjs +0 -1511
  594. package/src/agent/orchestrator/providers/openai-oauth-ws.mjs +0 -1891
  595. package/src/agent/orchestrator/providers/openai-oauth.mjs +0 -1456
  596. package/src/agent/orchestrator/providers/openai-ws.mjs +0 -127
  597. package/src/agent/orchestrator/providers/registry.mjs +0 -192
  598. package/src/agent/orchestrator/providers/retry-classifier.mjs +0 -325
  599. package/src/agent/orchestrator/session/cache/post-edit-marks.mjs +0 -42
  600. package/src/agent/orchestrator/session/cache/prefetch-cache.mjs +0 -142
  601. package/src/agent/orchestrator/session/cache/read-cache.mjs +0 -319
  602. package/src/agent/orchestrator/session/cache/scoped-cache.mjs +0 -361
  603. package/src/agent/orchestrator/session/loop.mjs +0 -1619
  604. package/src/agent/orchestrator/session/manager.mjs +0 -1991
  605. package/src/agent/orchestrator/session/result-classification.mjs +0 -65
  606. package/src/agent/orchestrator/session/store.mjs +0 -632
  607. package/src/agent/orchestrator/session/stream-watchdog.mjs +0 -130
  608. package/src/agent/orchestrator/session/tool-result-offload.mjs +0 -166
  609. package/src/agent/orchestrator/session/trim.mjs +0 -491
  610. package/src/agent/orchestrator/smart-bridge/CACHE-SHARD.md +0 -115
  611. package/src/agent/orchestrator/smart-bridge/bridge-llm.mjs +0 -331
  612. package/src/agent/orchestrator/smart-bridge/cache-obs.mjs +0 -150
  613. package/src/agent/orchestrator/smart-bridge/cache-strategy.mjs +0 -228
  614. package/src/agent/orchestrator/smart-bridge/index.mjs +0 -215
  615. package/src/agent/orchestrator/smart-bridge/profiles.mjs +0 -37
  616. package/src/agent/orchestrator/smart-bridge/registry.mjs +0 -348
  617. package/src/agent/orchestrator/stall-policy.mjs +0 -201
  618. package/src/agent/orchestrator/tool-loop-guard.mjs +0 -75
  619. package/src/agent/orchestrator/tools/bash-session.mjs +0 -722
  620. package/src/agent/orchestrator/tools/builtin/advisory-lock.mjs +0 -171
  621. package/src/agent/orchestrator/tools/builtin/arg-guard.mjs +0 -511
  622. package/src/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -480
  623. package/src/agent/orchestrator/tools/builtin/builtin-tools.mjs +0 -256
  624. package/src/agent/orchestrator/tools/builtin/edit-base-guard.mjs +0 -58
  625. package/src/agent/orchestrator/tools/builtin/edit-byte-plan.mjs +0 -240
  626. package/src/agent/orchestrator/tools/builtin/edit-byte-utils.mjs +0 -113
  627. package/src/agent/orchestrator/tools/builtin/edit-commit.mjs +0 -74
  628. package/src/agent/orchestrator/tools/builtin/edit-context-utils.mjs +0 -242
  629. package/src/agent/orchestrator/tools/builtin/edit-diagnostics.mjs +0 -211
  630. package/src/agent/orchestrator/tools/builtin/edit-engine.mjs +0 -1364
  631. package/src/agent/orchestrator/tools/builtin/edit-failure-context.mjs +0 -126
  632. package/src/agent/orchestrator/tools/builtin/edit-hint.mjs +0 -141
  633. package/src/agent/orchestrator/tools/builtin/edit-match-utils.mjs +0 -194
  634. package/src/agent/orchestrator/tools/builtin/edit-partial-write.mjs +0 -60
  635. package/src/agent/orchestrator/tools/builtin/edit-stale-refresh.mjs +0 -168
  636. package/src/agent/orchestrator/tools/builtin/edit-tool.mjs +0 -173
  637. package/src/agent/orchestrator/tools/builtin/edit-utf8-guard.mjs +0 -48
  638. package/src/agent/orchestrator/tools/builtin/fuzzy-match.mjs +0 -99
  639. package/src/agent/orchestrator/tools/builtin/glob-walk.mjs +0 -193
  640. package/src/agent/orchestrator/tools/builtin/list-tool.mjs +0 -597
  641. package/src/agent/orchestrator/tools/builtin/native-edit-runner.mjs +0 -110
  642. package/src/agent/orchestrator/tools/builtin/notebook-edit-tool.mjs +0 -300
  643. package/src/agent/orchestrator/tools/builtin/path-diagnostics.mjs +0 -152
  644. package/src/agent/orchestrator/tools/builtin/read-formatting.mjs +0 -118
  645. package/src/agent/orchestrator/tools/builtin/read-open.mjs +0 -190
  646. package/src/agent/orchestrator/tools/builtin/read-single-tool.mjs +0 -728
  647. package/src/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +0 -173
  648. package/src/agent/orchestrator/tools/builtin/read-streaming.mjs +0 -602
  649. package/src/agent/orchestrator/tools/builtin/rename-tool.mjs +0 -196
  650. package/src/agent/orchestrator/tools/builtin/rg-runner.mjs +0 -422
  651. package/src/agent/orchestrator/tools/builtin/search-builders.mjs +0 -158
  652. package/src/agent/orchestrator/tools/builtin/search-tool.mjs +0 -869
  653. package/src/agent/orchestrator/tools/builtin/shell-jobs.mjs +0 -962
  654. package/src/agent/orchestrator/tools/builtin/shell-runtime.mjs +0 -223
  655. package/src/agent/orchestrator/tools/builtin/snapshot-store.mjs +0 -206
  656. package/src/agent/orchestrator/tools/builtin/write-tool.mjs +0 -401
  657. package/src/agent/orchestrator/tools/builtin.mjs +0 -503
  658. package/src/agent/orchestrator/tools/code-graph-tool-defs.mjs +0 -24
  659. package/src/agent/orchestrator/tools/code-graph.mjs +0 -4095
  660. package/src/agent/orchestrator/tools/cwd-tool.mjs +0 -298
  661. package/src/agent/orchestrator/tools/destructive-warning.mjs +0 -323
  662. package/src/agent/orchestrator/tools/edit-normalize.mjs +0 -603
  663. package/src/agent/orchestrator/tools/graph-binary-fetcher.mjs +0 -154
  664. package/src/agent/orchestrator/tools/graph-manifest.json +0 -26
  665. package/src/agent/orchestrator/tools/host-input.mjs +0 -204
  666. package/src/agent/orchestrator/tools/patch-binary-fetcher.mjs +0 -143
  667. package/src/agent/orchestrator/tools/patch-manifest.json +0 -26
  668. package/src/agent/orchestrator/tools/patch-tool-defs.mjs +0 -20
  669. package/src/agent/orchestrator/tools/patch.mjs +0 -2754
  670. package/src/agent/orchestrator/tools/progress-message.mjs +0 -118
  671. package/src/agent/orchestrator/tools/shell-command.mjs +0 -865
  672. package/src/agent/orchestrator/tools/shell-policy-imports.mjs +0 -7
  673. package/src/agent/orchestrator/tools/shell-snapshot.mjs +0 -313
  674. package/src/agent/orchestrator/workflow-store.mjs +0 -93
  675. package/src/agent/tool-defs.mjs +0 -110
  676. package/src/channels/backends/discord.mjs +0 -784
  677. package/src/channels/data/voice-runtime-manifest.json +0 -138
  678. package/src/channels/index.mjs +0 -3268
  679. package/src/channels/lib/config.mjs +0 -292
  680. package/src/channels/lib/drop-trace.mjs +0 -71
  681. package/src/channels/lib/event-pipeline.mjs +0 -81
  682. package/src/channels/lib/holidays.mjs +0 -138
  683. package/src/channels/lib/hook-pipe-server.mjs +0 -822
  684. package/src/channels/lib/output-forwarder.mjs +0 -765
  685. package/src/channels/lib/runtime-paths.mjs +0 -552
  686. package/src/channels/lib/scheduler.mjs +0 -723
  687. package/src/channels/lib/session-discovery.mjs +0 -103
  688. package/src/channels/lib/state-file.mjs +0 -68
  689. package/src/channels/lib/status-snapshot.mjs +0 -219
  690. package/src/channels/lib/tool-format.mjs +0 -140
  691. package/src/channels/lib/transcript-discovery.mjs +0 -195
  692. package/src/channels/lib/voice-runtime-fetcher.mjs +0 -734
  693. package/src/channels/lib/webhook.mjs +0 -1318
  694. package/src/channels/tool-defs.mjs +0 -170
  695. package/src/daemon/host.mjs +0 -118
  696. package/src/daemon/mcp-transport.mjs +0 -47
  697. package/src/daemon/session.mjs +0 -100
  698. package/src/daemon/thin-client.mjs +0 -71
  699. package/src/daemon/transport.mjs +0 -163
  700. package/src/gateway/claude-current.mjs +0 -255
  701. package/src/gateway/oauth-usage.mjs +0 -598
  702. package/src/gateway/route-meta.mjs +0 -629
  703. package/src/gateway/server.mjs +0 -713
  704. package/src/memory/data/runtime-manifest.json +0 -40
  705. package/src/memory/index.mjs +0 -3332
  706. package/src/memory/lib/core-memory-store.mjs +0 -330
  707. package/src/memory/lib/embedding-provider.mjs +0 -269
  708. package/src/memory/lib/embedding-worker.mjs +0 -323
  709. package/src/memory/lib/memory-cycle1.mjs +0 -645
  710. package/src/memory/lib/memory-cycle2.mjs +0 -1284
  711. package/src/memory/lib/memory-cycle3.mjs +0 -540
  712. package/src/memory/lib/memory-embed.mjs +0 -299
  713. package/src/memory/lib/memory-ops-policy.mjs +0 -190
  714. package/src/memory/lib/memory-recall-store.mjs +0 -638
  715. package/src/memory/lib/memory.mjs +0 -412
  716. package/src/memory/lib/pg/adapter.mjs +0 -308
  717. package/src/memory/lib/pg/process.mjs +0 -360
  718. package/src/memory/lib/pg/supervisor.mjs +0 -396
  719. package/src/memory/lib/runtime-fetcher.mjs +0 -458
  720. package/src/memory/lib/trace-store.mjs +0 -728
  721. package/src/memory/tool-defs.mjs +0 -79
  722. package/src/search/index.mjs +0 -1173
  723. package/src/search/lib/backends/anthropic-oauth.mjs +0 -98
  724. package/src/search/lib/backends/exa.mjs +0 -50
  725. package/src/search/lib/backends/firecrawl.mjs +0 -61
  726. package/src/search/lib/backends/gemini-api.mjs +0 -83
  727. package/src/search/lib/backends/grok-oauth.mjs +0 -86
  728. package/src/search/lib/backends/index.mjs +0 -150
  729. package/src/search/lib/backends/openai-api.mjs +0 -144
  730. package/src/search/lib/backends/openai-oauth.mjs +0 -102
  731. package/src/search/lib/backends/openai-web-search.mjs +0 -76
  732. package/src/search/lib/backends/tavily.mjs +0 -55
  733. package/src/search/lib/backends/xai-api.mjs +0 -113
  734. package/src/search/lib/config.mjs +0 -192
  735. package/src/search/lib/provider-usage.mjs +0 -67
  736. package/src/search/lib/providers.mjs +0 -47
  737. package/src/search/lib/search-intent.mjs +0 -109
  738. package/src/search/lib/setup-handler.mjs +0 -261
  739. package/src/search/lib/web-tools.mjs +0 -1219
  740. package/src/search/tool-defs.mjs +0 -83
  741. package/src/setup/defender-exclusion.mjs +0 -183
  742. package/src/shared/atomic-file.mjs +0 -436
  743. package/src/shared/config.mjs +0 -372
  744. package/src/shared/daemon-recycle.mjs +0 -108
  745. package/src/shared/disable-claude-builtins.mjs +0 -91
  746. package/src/shared/err-text.mjs +0 -12
  747. package/src/shared/llm/http-agent.mjs +0 -123
  748. package/src/shared/open-url.mjs +0 -62
  749. package/src/shared/plugin-paths.mjs +0 -58
  750. package/src/shared/schedules-store.mjs +0 -70
  751. package/src/shared/seed.mjs +0 -161
  752. package/src/shared/user-cwd.mjs +0 -225
  753. package/src/shared/user-data-guard.mjs +0 -244
  754. package/src/status/aggregator.mjs +0 -584
  755. package/src/status/server.mjs +0 -413
  756. package/tools.json +0 -1671
  757. /package/{defaults → src/defaults}/cycle3-review-prompt.md +0 -0
  758. /package/{defaults → src/defaults}/memory-promote-prompt.md +0 -0
  759. /package/{hooks → src/hooks}/lib/permission-rules.cjs +0 -0
  760. /package/{lib → src/lib}/config-cjs.cjs +0 -0
  761. /package/{lib → src/lib}/hook-pipe-path.cjs +0 -0
  762. /package/{lib → src/lib}/mixdog-debug.cjs +0 -0
  763. /package/{lib → src/lib}/text-utils.cjs +0 -0
  764. /package/{rules → src/rules}/bridge/42-cycle3-agent.md +0 -0
  765. /package/src/{agent → runtime/agent}/orchestrator/activity-bus.mjs +0 -0
  766. /package/src/{agent → runtime/agent}/orchestrator/providers/anthropic-betas.mjs +0 -0
  767. /package/src/{agent → runtime/agent}/orchestrator/session/abort-lookup.mjs +0 -0
  768. /package/src/{agent → runtime/agent}/orchestrator/session/cache/scoped-cache-outcome.mjs +0 -0
  769. /package/src/{agent → runtime/agent}/orchestrator/session/cache/util.mjs +0 -0
  770. /package/src/{agent → runtime/agent}/orchestrator/session/read-dedup.mjs +0 -0
  771. /package/src/{agent → runtime/agent}/orchestrator/session/save-session-worker.mjs +0 -0
  772. /package/src/{agent → runtime/agent}/orchestrator/smart-bridge/session-builder.mjs +0 -0
  773. /package/src/{agent → runtime/agent}/orchestrator/tools/bash-policy-scan.mjs +0 -0
  774. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/atomic-write.mjs +0 -0
  775. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/binary-file.mjs +0 -0
  776. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cache-layers.mjs +0 -0
  777. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cwd-utils.mjs +0 -0
  778. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/device-paths.mjs +0 -0
  779. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -0
  780. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diff-utils.mjs +0 -0
  781. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/fs-reachability.mjs +0 -0
  782. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/grep-formatting.mjs +0 -0
  783. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/hash-utils.mjs +0 -0
  784. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/list-formatting.mjs +0 -0
  785. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/open-config-tool.mjs +0 -0
  786. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-locks.mjs +0 -0
  787. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-utils.mjs +0 -0
  788. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-args.mjs +0 -0
  789. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-batch.mjs +0 -0
  790. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-constants.mjs +0 -0
  791. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image-resize.mjs +0 -0
  792. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image.mjs +0 -0
  793. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-lines.mjs +0 -0
  794. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-mode-tool.mjs +0 -0
  795. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-range-index.mjs +0 -0
  796. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-ranges.mjs +0 -0
  797. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-special-files.mjs +0 -0
  798. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-tool.mjs +0 -0
  799. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-windows.mjs +0 -0
  800. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-analysis.mjs +0 -0
  801. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-output.mjs +0 -0
  802. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-helpers.mjs +0 -0
  803. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-validation.mjs +0 -0
  804. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/text-stats.mjs +0 -0
  805. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/windows-roots.mjs +0 -0
  806. /package/src/{agent → runtime/agent}/orchestrator/tools/code-graph-prewarm-worker.mjs +0 -0
  807. /package/src/{agent → runtime/agent}/orchestrator/tools/env-scrub.mjs +0 -0
  808. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-content-cache.mjs +0 -0
  809. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-planner.mjs +0 -0
  810. /package/src/{agent → runtime/agent}/orchestrator/tools/next-call-utils.mjs +0 -0
  811. /package/src/{agent → runtime/agent}/orchestrator/tools/result-compression.mjs +0 -0
  812. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-exec-policy.mjs +0 -0
  813. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy-danger-target.mjs +0 -0
  814. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy.mjs +0 -0
  815. /package/src/{channels → runtime/channels}/lib/cli-worker-host.mjs +0 -0
  816. /package/src/{channels → runtime/channels}/lib/config-lock.mjs +0 -0
  817. /package/src/{channels → runtime/channels}/lib/event-queue.mjs +0 -0
  818. /package/src/{channels → runtime/channels}/lib/executor.mjs +0 -0
  819. /package/src/{channels → runtime/channels}/lib/format.mjs +0 -0
  820. /package/src/{channels → runtime/channels}/lib/interaction-workflows.mjs +0 -0
  821. /package/src/{channels → runtime/channels}/lib/memory-client.mjs +0 -0
  822. /package/src/{channels → runtime/channels}/lib/session-control.mjs +0 -0
  823. /package/src/{channels → runtime/channels}/lib/settings.mjs +0 -0
  824. /package/src/{channels → runtime/channels}/lib/whisper-server.mjs +0 -0
  825. /package/src/{memory → runtime/memory}/lib/agent-ipc.mjs +0 -0
  826. /package/src/{memory → runtime/memory}/lib/bridge-trace-queries.mjs +0 -0
  827. /package/src/{memory → runtime/memory}/lib/llm-worker-host.mjs +0 -0
  828. /package/src/{memory → runtime/memory}/lib/memory-cycle.mjs +0 -0
  829. /package/src/{memory → runtime/memory}/lib/memory-extraction.mjs +0 -0
  830. /package/src/{memory → runtime/memory}/lib/memory-maintenance-store.mjs +0 -0
  831. /package/src/{memory → runtime/memory}/lib/memory-recall-id-patch.mjs +0 -0
  832. /package/src/{memory → runtime/memory}/lib/memory-recall-read-query.mjs +0 -0
  833. /package/src/{memory → runtime/memory}/lib/memory-recall-scope-filter.mjs +0 -0
  834. /package/src/{memory → runtime/memory}/lib/memory-retrievers.mjs +0 -0
  835. /package/src/{memory → runtime/memory}/lib/memory-score.mjs +0 -0
  836. /package/src/{memory → runtime/memory}/lib/memory-text-utils.mjs +0 -0
  837. /package/src/{memory → runtime/memory}/lib/model-profile.mjs +0 -0
  838. /package/src/{memory → runtime/memory}/lib/project-id-resolver.mjs +0 -0
  839. /package/src/{search → runtime/search}/lib/cache.mjs +0 -0
  840. /package/src/{search → runtime/search}/lib/formatter.mjs +0 -0
  841. /package/src/{search → runtime/search}/lib/state.mjs +0 -0
  842. /package/src/{shared → runtime/shared}/abort-controller.mjs +0 -0
  843. /package/src/{shared → runtime/shared}/llm/cost.mjs +0 -0
  844. /package/src/{shared → runtime/shared}/llm/index.mjs +0 -0
  845. /package/src/{shared → runtime/shared}/llm/pid-cleanup.mjs +0 -0
  846. /package/src/{shared → runtime/shared}/llm/usage-log.mjs +0 -0
  847. /package/src/{shared → runtime/shared}/wsl.mjs +0 -0
@@ -0,0 +1,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
+ }