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