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
@@ -1,722 +0,0 @@
1
- // bash_session — persistent shell with state preserved across calls.
2
- //
3
- // Companion to the stateless `bash` tool. The default `bash` spawns a fresh
4
- // subshell every call: cwd, exports, `source`d virtualenvs, shell functions
5
- // all vanish between invocations. That's the safe default but it's clumsy
6
- // for the common "cd into a project → activate venv → run three commands"
7
- // workflow; each step has to reconstruct the prior shell context by hand.
8
- //
9
- // bash_session keeps a long-lived `bash` child process per session_id. The
10
- // caller writes commands to stdin; we frame each command with a sentinel
11
- // so we know when the command has finished and what its exit code was.
12
- // State carried automatically: $PWD, exports, shell vars, readline history
13
- // (not that we use it), aliases, function defs, `source`d files.
14
- //
15
- // Session lifecycle:
16
- // - session_id omitted → mint a fresh id, spawn child, run command
17
- // - session_id matches pool → reuse existing child
18
- // - session_id misses pool → spawn child for that id (pool empty after
19
- // orchestrator restart or idle eviction)
20
- // - close:true → terminate child after command returns
21
- // - idle > IDLE_TIMEOUT_MS → reaper removes & kills the child
22
- // - pool > MAX_SESSIONS → oldest-idle evicted at spawn time
23
- //
24
- // Output protocol:
25
- // write: <command>\necho "__MIXDOG_END__:$?"\n
26
- // read: everything on stdout up to (not including) the marker line
27
- // exit: the N in __MIXDOG_END__:N
28
- // stderr: captured in parallel; sentinel not echoed there, so we flush
29
- // whatever arrived up to the command's completion. Small
30
- // quiescence window (STDERR_DRAIN_MS) after the stdout marker
31
- // so trailing writes on stderr don't get cut off.
32
- //
33
- // Safety: same BLOCKED_PATTERNS as the `bash` tool. The session holds state
34
- // so a dangerous command can't hide in an earlier turn (we scan per call).
35
- // Same ANSI strip + smart middle-truncate applied to stdout/stderr.
36
- //
37
- // This tool takes a command, not a file path — no path-safety check applies.
38
-
39
- import { spawn } from 'node:child_process';
40
- import * as nodeUtil from 'node:util';
41
- import { existsSync } from 'node:fs';
42
- import { randomUUID } from 'node:crypto';
43
- import { invalidateBuiltinResultCache, analyzeShellCommandEffects, preflightShellLargeFileProbe } from './builtin.mjs';
44
- import { markCodeGraphDirtyPaths, drainCodeGraphCache } from './code-graph.mjs';
45
- import { isBlockedCommand, maybeRewriteWmicProcessCommand } from './shell-policy.mjs';
46
- import { stripQuotedAndHeredoc, extractShellCInner } from './destructive-warning.mjs';
47
- import { _maybeEncodePowerShellCommand } from './shell-command.mjs';
48
- import { _captureTrackedMtimes, _trackedDriftNoteAfter, _injectionBlockTargets, getDedupedDestructiveWarnings } from './builtin/bash-tool.mjs';
49
- import { scrubLoaderVars, scrubProviderSecrets } from './env-scrub.mjs';
50
- import { checkExecPolicyMessage } from './bash-policy-scan.mjs';
51
-
52
- // Default 600 s (10 min), max 1800 s. Aligned with the one-shot bash tool's
53
- // 600 s default (builtin/bash-tool.mjs); the persistent shell carries
54
- // longer-running pipelines (build/test/install) than one-shot calls, so a
55
- // 120 s default left those workflows timing out at 2 min. Per-call `timeout`
56
- // still overrides, capped at MAX_TIMEOUT_MS.
57
- const DEFAULT_TIMEOUT_MS = 600_000;
58
- const MAX_TIMEOUT_MS = 1_800_000;
59
- const IDLE_TIMEOUT_MS = 5 * 60_000;
60
- const MAX_SESSIONS = 10;
61
- const STDERR_DRAIN_MS = 25;
62
- const STDERR_DRAIN_MAX_MS = 250;
63
- const STDERR_QUIESCENT_MS = 25;
64
- // SHELL_OUTPUT_MAX_CHARS — output preview cap, matches the `bash` tool.
65
- // Duplicated here so bash-session stays decoupled from builtin.mjs private constants.
66
- const SHELL_OUTPUT_MAX_CHARS = 30_000;
67
- // STREAM_BUF_BYTE_CAP — hard byte cap per in-memory stream buffer. Past the
68
- // cap data is dropped and a truncation marker injected so a runaway command
69
- // (e.g. `cat /dev/urandom`) can't OOM the orchestrator.
70
- const STREAM_BUF_BYTE_CAP = 4 * 1024 * 1024; // 4 MB per stream
71
- const STREAM_TRUNC_MARKER = '\n... [TRUNCATED — stream cap reached] ...\n';
72
- // Output truncation runtime envelope: 400 lines / 30 KB total;
73
- // head=80 + tail=80 lines preserved on middle-truncation.
74
- const SMART_BASH_MAX_LINES = 400;
75
- const SMART_BASH_MAX_BYTES = 30 * 1024;
76
- const SMART_BASH_HEAD_LINES = 80;
77
- const SMART_BASH_TAIL_LINES = 80;
78
-
79
- // Marker prefix for per-command sentinels. A random suffix is added on each
80
- // command so user output that happens to contain the static prefix does not
81
- // terminate the command early.
82
- const MARKER_PREFIX = '__MIXDOG_END__';
83
-
84
- // --- ANSI strip (self-contained; mirrors builtin.mjs's implementation) ---
85
- const _ANSI_REGEX = /\u001B(?:\[[0-?]*[ -/]*[@-~]|\][\s\S]*?(?:\u0007|\u001B\\|\u009C))/g;
86
- const _stripAnsi = typeof nodeUtil.stripVTControlCharacters === 'function'
87
- ? (s) => nodeUtil.stripVTControlCharacters(s)
88
- : (s) => s.replace(_ANSI_REGEX, () => '');
89
- function stripAnsi(s) {
90
- if (typeof s !== 'string' || s.length === 0) return s;
91
- return _stripAnsi(s);
92
- }
93
-
94
- function escapeRegex(s) {
95
- return String(s).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
96
- }
97
-
98
- // --- Smart middle-truncate (shared with bash tool) ---
99
- function smartMiddleTruncate(content) {
100
- const s = typeof content === 'string' ? content : String(content ?? '');
101
- if (s.length <= SMART_BASH_MAX_BYTES) {
102
- const fastLines = s.split('\n');
103
- if (fastLines.length <= SMART_BASH_MAX_LINES) return s;
104
- const head = fastLines.slice(0, SMART_BASH_HEAD_LINES).join('\n');
105
- const tail = fastLines.slice(-SMART_BASH_TAIL_LINES).join('\n');
106
- const middle = fastLines.length - SMART_BASH_HEAD_LINES - SMART_BASH_TAIL_LINES;
107
- return `${head}\n\n... [TRUNCATED — ${middle} lines middle elided; total ${fastLines.length} lines. Rerun with tighter filters for more] ...\n\n${tail}`;
108
- }
109
- const lines = s.split('\n');
110
- if (lines.length <= SMART_BASH_MAX_LINES) {
111
- const head = s.slice(0, SMART_BASH_MAX_BYTES);
112
- return `${head}\n\n... [TRUNCATED — output exceeded ${Math.round(SMART_BASH_MAX_BYTES / 1024)} KB on a single line] ...`;
113
- }
114
- const head = lines.slice(0, SMART_BASH_HEAD_LINES).join('\n');
115
- const tail = lines.slice(-SMART_BASH_TAIL_LINES).join('\n');
116
- const middle = lines.length - SMART_BASH_HEAD_LINES - SMART_BASH_TAIL_LINES;
117
- const totalKb = Math.round(s.length / 1024);
118
- return `${head}\n\n... [TRUNCATED — ${middle} lines middle elided; total ${lines.length} lines / ${totalKb} KB. Rerun with tighter filters for more] ...\n\n${tail}`;
119
- }
120
-
121
- function _prependDestructiveWarning(command, text) {
122
- const warnings = getDedupedDestructiveWarnings(command);
123
- if (!warnings.length) return text;
124
- return `${warnings.map((w) => `⚠️ ${w}`).join('\n')}\n${text}`;
125
- }
126
-
127
- // Blocked command check delegated to shell-policy.mjs (shared with
128
- // builtin.mjs). See that module for the full pattern set and rationale.
129
- // Locate a usable bash binary on POSIX. Windows intentionally does not
130
- // support persistent shell sessions; one-shot commands use PowerShell
131
- // through builtin/bash-tool.mjs. We deliberately pin bash (not sh) since
132
- // the feature set depended on by the sentinel echo and `$?` is bash-shaped.
133
- function resolveBash() {
134
- if (process.platform === 'win32') {
135
- throw new Error('persistent shell sessions are not supported on Windows; use one-shot PowerShell commands');
136
- }
137
- if (existsSync('/bin/bash')) return '/bin/bash';
138
- if (existsSync('/usr/bin/bash')) return '/usr/bin/bash';
139
- return '/bin/sh'; // fallback; `$?` + echo still work
140
- }
141
-
142
- // --- Session pool ---
143
- // Map<id, { proc, lastUsed, stdoutBuf, stderrBuf, busy }>
144
- const _sessions = new Map();
145
- let _reaperTimer = null;
146
- // R17 parent-exit hook installed exactly once at first _spawnSession. Without
147
- // it, persistent bash shells orphan on server-main death (the async
148
- // 'process-exit' path at the bottom of this module never gets to run its
149
- // awaits when the host dies abruptly). Sync iteration of _sessions + direct
150
- // _killProcessTree (sync taskkill on win, sync process.kill on posix).
151
- let _parentExitInstalled = false;
152
- function _installParentExitHook() {
153
- if (_parentExitInstalled) return;
154
- _parentExitInstalled = true;
155
- const sweep = () => {
156
- for (const [, s] of _sessions) {
157
- try { _killProcessTree(s.proc); } catch { /* ignore */ }
158
- }
159
- };
160
- try { process.on('exit', sweep); } catch { /* ignore */ }
161
- try { process.on('SIGTERM', sweep); } catch { /* ignore */ }
162
- try { process.on('SIGINT', sweep); } catch { /* ignore */ }
163
- }
164
-
165
- function _startReaper() {
166
- if (_reaperTimer) return;
167
- _reaperTimer = setInterval(() => {
168
- const now = Date.now();
169
- for (const [id, s] of _sessions) {
170
- if (!s.busy && now - s.lastUsed > IDLE_TIMEOUT_MS) {
171
- _killSession(id, 'idle-timeout');
172
- }
173
- }
174
- if (_sessions.size === 0) {
175
- clearInterval(_reaperTimer);
176
- _reaperTimer = null;
177
- }
178
- }, 30_000);
179
- // Don't keep the event loop alive just for the reaper.
180
- if (typeof _reaperTimer.unref === 'function') _reaperTimer.unref();
181
- }
182
-
183
- // Kill a spawned shell along with any child processes it forked. Posix path
184
- // signals the process group (pgid == pid because we spawn with detached:true),
185
- // so `sleep 1000 &` or a node server started inside the session is reaped
186
- // instead of being left orphaned holding pipes open. Windows uses taskkill
187
- // /T /F to walk the process tree. SIGTERM is sent first so well-behaved
188
- // children can shut down cleanly; a SIGKILL escalation timer (3 s) forces the
189
- // issue if they don't. Safe to call multiple times — all errors swallowed.
190
- function _killProcessTree(proc) {
191
- // proc.killed flips to true the moment a signal is *sent*, NOT when the
192
- // child actually exits — escalation off `proc.killed` was a no-op. We
193
- // instead track the real exit/close state via a flag and only escalate
194
- // when neither has fired by the timer deadline.
195
- if (!proc) return;
196
- const pid = proc.pid;
197
- if (!pid) return;
198
- let exited = false;
199
- const onDone = () => { exited = true; };
200
- try { proc.once('exit', onDone); } catch {}
201
- try { proc.once('close', onDone); } catch {}
202
- // Already dead from a prior call? Skip the SIGTERM but still let the
203
- // listener wiring above clean up if a future exit/close arrives.
204
- if (proc.exitCode !== null && proc.exitCode !== undefined) {
205
- exited = true;
206
- } else if (proc.signalCode) {
207
- exited = true;
208
- }
209
- try {
210
- if (process.platform === 'win32') {
211
- // /T walks the tree, /F forces — no graceful SIGTERM on win.
212
- spawn('taskkill', ['/pid', String(pid), '/t', '/f'], { windowsHide: true, stdio: 'ignore' });
213
- } else if (!exited) {
214
- try { process.kill(-pid, 'SIGTERM'); }
215
- catch { try { proc.kill('SIGTERM'); } catch { /* ignore */ } }
216
- }
217
- } catch { /* ignore */ }
218
- // Escalate to SIGKILL if the child hasn't actually exited by the
219
- // deadline. Windows taskkill /F is already forceful, so only posix
220
- // needs the escalation timer.
221
- if (process.platform !== 'win32') {
222
- const esc = setTimeout(() => {
223
- if (exited) return;
224
- try { process.kill(-pid, 'SIGKILL'); }
225
- catch { try { proc.kill('SIGKILL'); } catch { /* ignore */ } }
226
- }, 3000);
227
- if (typeof esc.unref === 'function') esc.unref();
228
- }
229
- }
230
-
231
- async function _killSession(id, _reason) {
232
- const s = _sessions.get(id);
233
- if (!s) return;
234
- _sessions.delete(id);
235
- const exited = new Promise((resolve) => {
236
- s.proc.once('exit', resolve);
237
- s.proc.once('close', resolve);
238
- });
239
- try { s.proc.stdin?.end(); } catch { /* ignore */ }
240
- _killProcessTree(s.proc);
241
- await Promise.race([exited, new Promise((r) => setTimeout(r, 3000))]);
242
- }
243
-
244
- function shellQuoteSingle(s) {
245
- return `'${String(s).replace(/'/g, `'\"'\"'`)}'`;
246
- }
247
-
248
- function _hostPathToShellPath(p) {
249
- let s = String(p || '').replace(/\\/g, '/');
250
- return s;
251
- }
252
-
253
- function _shellPwdToHostPath(p) {
254
- return String(p || '').trim();
255
- }
256
-
257
- function _cwdKey(p) {
258
- let s = _hostPathToShellPath(p).replace(/\/+$/, '');
259
- if (process.platform === 'win32') s = s.toLowerCase();
260
- return s || '/';
261
- }
262
-
263
- async function _ensureSessionCwd(entry, targetCwd, timeoutMs) {
264
- if (!targetCwd || _cwdKey(entry.cwd) === _cwdKey(targetCwd)) return null;
265
- const cdTarget = _hostPathToShellPath(targetCwd);
266
- const result = await _runCommand(entry, `cd ${shellQuoteSingle(cdTarget)}`, Math.min(timeoutMs, 5000));
267
- if (result?.exit_code !== 0) {
268
- const stderr = stripAnsi(result?.stderr || '').trim();
269
- return `Error: failed to set persistent cwd: ${targetCwd}${stderr ? `\n\n[stderr]\n${stderr}` : ''}`;
270
- }
271
- entry.cwd = targetCwd;
272
- return null;
273
- }
274
-
275
- function _evictOldestIfFull() {
276
- if (_sessions.size < MAX_SESSIONS) return;
277
- // Prefer an idle session. If all are busy we can't evict safely; throw.
278
- let oldestId = null;
279
- let oldestTs = Infinity;
280
- for (const [id, s] of _sessions) {
281
- if (s.busy) continue;
282
- if (s.lastUsed < oldestTs) {
283
- oldestTs = s.lastUsed;
284
- oldestId = id;
285
- }
286
- }
287
- if (oldestId) {
288
- _killSession(oldestId, 'pool-full');
289
- return;
290
- }
291
- throw new Error(`bash_session pool full (${MAX_SESSIONS} concurrent sessions, all busy)`);
292
- }
293
-
294
- // Build the env handed to the child bash. This path is POSIX-only; Windows
295
- // one-shot commands use PowerShell and persistent shell sessions are disabled.
296
- function buildBashEnv() {
297
- const env = { ...process.env, LANG: 'C.UTF-8', LC_ALL: 'C.UTF-8' };
298
- // R5 secret scrub — strip provider/cloud tokens before handing env to
299
- // the persistent shell. The stateless `bash` tool applies this same
300
- // sweep in builtin/bash-tool.mjs; the persistent shell's env is
301
- // constructed here and returns before that site runs, so it must be
302
- // done independently. Shared with shell-jobs and shell-snapshot via
303
- // env-scrub.mjs so the prefix/suffix lists never drift.
304
- scrubProviderSecrets(env);
305
- // R11 loader/execution scrub (NODE_OPTIONS, LD_PRELOAD, DYLD_*, …).
306
- scrubLoaderVars(env);
307
- return env;
308
- }
309
-
310
- function _spawnSession(id, initialCwd = process.cwd()) {
311
- _installParentExitHook();
312
- _evictOldestIfFull();
313
- const shell = resolveBash();
314
- const proc = spawn(shell, [], {
315
- stdio: ['pipe', 'pipe', 'pipe'],
316
- env: buildBashEnv(),
317
- cwd: initialCwd,
318
- windowsHide: true,
319
- // detached:true on posix gives the child its own process group so
320
- // _killProcessTree can signal the whole group (catches `sleep 1000 &`
321
- // and similar backgrounded children). Skipped on win32 where
322
- // detached has different semantics (no console attached, used for
323
- // daemonization — unwanted here).
324
- detached: process.platform !== 'win32',
325
- });
326
- proc.stdout.setEncoding('utf-8');
327
- proc.stderr.setEncoding('utf-8');
328
- const entry = {
329
- proc,
330
- lastUsed: Date.now(),
331
- cwd: initialCwd,
332
- stdoutBuf: '',
333
- stderrBuf: '',
334
- busy: false,
335
- dead: false,
336
- exitInfo: null,
337
- };
338
- // Hard-capped concat: past STREAM_BUF_BYTE_CAP we drop further
339
- // chunks and stamp a truncation marker once. Without this a runaway
340
- // command (e.g. `cat /dev/urandom`) blocks until OOM long before any
341
- // smartMiddleTruncate downstream gets a chance to trim.
342
- entry.stdoutCapped = false;
343
- entry.stderrCapped = false;
344
- proc.stdout.on('data', (chunk) => {
345
- if (entry.stdoutCapped) return;
346
- entry.stdoutBuf += chunk;
347
- if (entry.stdoutBuf.length >= STREAM_BUF_BYTE_CAP) {
348
- entry.stdoutBuf = entry.stdoutBuf.slice(0, STREAM_BUF_BYTE_CAP) + STREAM_TRUNC_MARKER;
349
- entry.stdoutCapped = true;
350
- }
351
- });
352
- proc.stderr.on('data', (chunk) => {
353
- if (entry.stderrCapped) return;
354
- entry.stderrBuf += chunk;
355
- if (entry.stderrBuf.length >= STREAM_BUF_BYTE_CAP) {
356
- entry.stderrBuf = entry.stderrBuf.slice(0, STREAM_BUF_BYTE_CAP) + STREAM_TRUNC_MARKER;
357
- entry.stderrCapped = true;
358
- }
359
- });
360
- proc.on('error', (err) => {
361
- entry.dead = true;
362
- entry.exitInfo = { error: err?.message || String(err) };
363
- });
364
- proc.on('exit', (code, signal) => {
365
- entry.dead = true;
366
- entry.exitInfo = { code, signal };
367
- _sessions.delete(id);
368
- });
369
- _sessions.set(id, entry);
370
- _startReaper();
371
- return entry;
372
- }
373
-
374
- function _getOrCreate(sessionId, initialCwd = process.cwd(), opts = {}) {
375
- const explicit = typeof sessionId === 'string' && sessionId.length > 0;
376
- const id = explicit ? sessionId : `sess_${randomUUID()}`;
377
- let entry = _sessions.get(id);
378
- if (entry && entry.dead) {
379
- _sessions.delete(id);
380
- entry = null;
381
- }
382
- if (!entry) {
383
- if (explicit && opts.create !== true) {
384
- return { error: `Error: unknown session_id "${id}" (pass create:true to start a new persistent session)` };
385
- }
386
- entry = _spawnSession(id, initialCwd);
387
- }
388
- return { id, entry };
389
- }
390
-
391
- // Core command-run: frame with sentinel, wait for marker on stdout, flush
392
- // stderr with a small drain window, return { stdout, stderr, exit_code }.
393
- function _runCommand(entry, command, timeoutMs, abortSignal = null) {
394
- return new Promise((resolve, reject) => {
395
- entry.busy = true;
396
- // Reset buffers for this command. Anything left from a prior run is
397
- // unexpected (we only return after the marker), but be defensive.
398
- entry.stdoutBuf = '';
399
- entry.stderrBuf = '';
400
-
401
- let finished = false;
402
- let timeoutHandle = null;
403
- let abortHandler = null;
404
- const marker = `${MARKER_PREFIX}:${randomUUID()}`;
405
- const markerRe = new RegExp(`^${escapeRegex(marker)}:(-?\\d+)\\s*$`, 'm');
406
-
407
- const onExit = () => {
408
- if (finished) return;
409
- fail(new Error('bash_session: shell exited before command completed'));
410
- };
411
-
412
- const cleanup = () => {
413
- finished = true;
414
- entry.busy = false;
415
- entry.lastUsed = Date.now();
416
- if (timeoutHandle) clearTimeout(timeoutHandle);
417
- if (abortSignal && abortHandler) {
418
- try { abortSignal.removeEventListener('abort', abortHandler); } catch {}
419
- }
420
- entry.proc.stdout.removeListener('data', onStdout);
421
- entry.proc.removeListener('exit', onExit);
422
- };
423
-
424
- const settle = (result) => {
425
- if (finished) return;
426
- cleanup();
427
- resolve(result);
428
- };
429
-
430
- const fail = (err) => {
431
- if (finished) return;
432
- cleanup();
433
- reject(err);
434
- };
435
-
436
- const onStdout = () => {
437
- const m = markerRe.exec(entry.stdoutBuf);
438
- if (!m) return;
439
- const exitCode = Number(m[1]);
440
- // Everything before the marker line is the real stdout.
441
- const before = entry.stdoutBuf.slice(0, m.index);
442
- // Drain pending stderr writes adaptively. The fixed 25 ms
443
- // window dropped late stderr from forked children that
444
- // flushed slightly after the parent shell exited. Loop
445
- // instead: poll the stderr buffer length and finish only
446
- // once it's been quiescent for STDERR_QUIESCENT_MS, the
447
- // child closed stderr, or we hit the absolute ceiling.
448
- const drainStart = Date.now();
449
- let lastLen = entry.stderrBuf.length;
450
- let lastChange = drainStart;
451
- let stderrClosed = false;
452
- const onStderrEnd = () => { stderrClosed = true; };
453
- try { entry.proc.stderr.once('end', onStderrEnd); } catch {}
454
- const finish = () => {
455
- try { entry.proc.stderr.removeListener('end', onStderrEnd); } catch {}
456
- const stderr = entry.stderrBuf;
457
- entry.stdoutBuf = '';
458
- entry.stderrBuf = '';
459
- settle({ stdout: before, stderr, exit_code: exitCode });
460
- };
461
- const tick = () => {
462
- if (finished) { try { entry.proc.stderr.removeListener('end', onStderrEnd); } catch {} return; }
463
- const now = Date.now();
464
- const curLen = entry.stderrBuf.length;
465
- if (curLen !== lastLen) {
466
- lastLen = curLen;
467
- lastChange = now;
468
- }
469
- if (stderrClosed) return finish();
470
- if (now - drainStart >= STDERR_DRAIN_MAX_MS) return finish();
471
- if (now - lastChange >= STDERR_QUIESCENT_MS) return finish();
472
- setTimeout(tick, 10);
473
- };
474
- setTimeout(tick, STDERR_DRAIN_MS);
475
- };
476
-
477
- // Caller-driven abort (ESC / new prompt / session close). Kill the
478
- // shell immediately and resolve with an aborted marker so the agent
479
- // sees the cancellation rather than waiting for timeoutMs.
480
- if (abortSignal) {
481
- const fireAbort = () => {
482
- if (finished) return;
483
- const partialOut = entry.stdoutBuf || '';
484
- const partialErr = entry.stderrBuf || '';
485
- entry.stdoutBuf = '';
486
- entry.stderrBuf = '';
487
- _killProcessTree(entry.proc);
488
- // Mark dead and remove from pool immediately so the next call
489
- // doesn't pick up a killed shell entry.
490
- entry.dead = true;
491
- for (const [sid, s] of _sessions) { if (s === entry) { _sessions.delete(sid); break; } }
492
- cleanup();
493
- resolve({
494
- stdout: partialOut,
495
- stderr: partialErr,
496
- exit_code: null,
497
- signal: 'SIGTERM',
498
- aborted: true,
499
- });
500
- };
501
- if (abortSignal.aborted) { fireAbort(); return; }
502
- abortHandler = fireAbort;
503
- abortSignal.addEventListener('abort', abortHandler, { once: true });
504
- }
505
-
506
- entry.proc.stdout.on('data', onStdout);
507
- // Check the buffer in case the marker already arrived (tiny commands).
508
- onStdout();
509
-
510
- entry.proc.on('exit', onExit);
511
-
512
- timeoutHandle = setTimeout(() => {
513
- // Timeout: surface what we have but don't leave the shell in a
514
- // half-run state. Killing the process is the only reliable way
515
- // to interrupt a stuck command; the caller can mint a new session.
516
- const partialOut = entry.stdoutBuf;
517
- const partialErr = entry.stderrBuf;
518
- entry.stdoutBuf = '';
519
- entry.stderrBuf = '';
520
- _killProcessTree(entry.proc);
521
- cleanup();
522
- // Return a structured result (not a reject) so the caller
523
- // renders a proper exit/stderr block instead of a bare Error.
524
- resolve({
525
- stdout: partialOut,
526
- stderr: partialErr,
527
- exit_code: null,
528
- signal: 'SIGTERM',
529
- timed_out: true,
530
- timeout_ms: timeoutMs,
531
- });
532
- }, timeoutMs);
533
-
534
- // Write the command + sentinel. Newline before `echo` in case the
535
- // command didn't end with one. `$?` captures the final pipeline's
536
- // exit status as of bash semantics.
537
- const _preEncodePolicy = checkExecPolicyMessage(command);
538
- if (_preEncodePolicy) {
539
- fail(new Error(_preEncodePolicy.replace(/^Error: /, '')));
540
- return;
541
- }
542
- const encoded = _maybeEncodePowerShellCommand(command);
543
- const payload = `${encoded}\necho "${marker}:$?"\n`;
544
- try {
545
- entry.proc.stdin.write(payload, 'utf-8');
546
- } catch (err) {
547
- fail(err);
548
- }
549
- });
550
- }
551
-
552
- async function _syncSessionCwd(entry, timeoutMs) {
553
- try {
554
- const result = await _runCommand(entry, 'pwd', Math.min(timeoutMs, 2000));
555
- if (result?.exit_code !== 0) return;
556
- const stdout = stripAnsi(result.stdout || '').trim();
557
- if (!stdout) return;
558
- const lines = stdout.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
559
- if (lines.length > 0) entry.cwd = _shellPwdToHostPath(lines[lines.length - 1]);
560
- } catch (err) {
561
- entry.syncError = `[bash-session] persistent-session cwd sync failed: ${err.message}`;
562
- }
563
- }
564
-
565
- async function bash_session(args, cwd = process.cwd(), opts = {}) {
566
- if (process.platform === 'win32') {
567
- return 'Error: persistent shell sessions are not supported on Windows; use one-shot PowerShell commands without persistent/session_id.';
568
- }
569
- const abortSignal = opts && opts.abortSignal ? opts.abortSignal : null;
570
- let command = typeof args?.command === 'string' ? args.command : '';
571
- const close = args?.close === true;
572
- const implicitSessionId = args?.persistent === true && typeof opts?.sessionId === 'string'
573
- ? `__default__${opts.sessionId}`
574
- : '';
575
- const requestedSessionId = typeof args?.session_id === 'string' ? args.session_id : implicitSessionId;
576
- if (!command && close) {
577
- if (!requestedSessionId) return 'Error: command is required';
578
- const existing = _sessions.get(requestedSessionId);
579
- if (existing?.busy) return `Error: session "${requestedSessionId}" is busy executing a prior command`;
580
- if (existing) await _killSession(requestedSessionId, 'close-requested');
581
- return `[session: ${requestedSessionId}]\n[closed]\n\n${existing ? '(no output)' : '(no active session)'}`;
582
- }
583
- if (!command) return 'Error: command is required';
584
- const wmicRewrite = maybeRewriteWmicProcessCommand(command);
585
- if (wmicRewrite?.error) return `Error: ${wmicRewrite.error}`;
586
- if (wmicRewrite?.command) command = wmicRewrite.command;
587
- // R5-③: match the stateless one-shot path's full sweep so callers that
588
- // reach bash_session directly (via session_id without going through
589
- // executeBashTool) still get stripQuotedAndHeredoc + extractShellCInner
590
- // + unquote-span coverage. Persistent:true callers funnel through
591
- // executeBashTool which now pre-sweeps, but bash_session is also reached
592
- // by close:true session reuse and by direct tool dispatch.
593
- const _bsPolicy = checkExecPolicyMessage(command);
594
- if (_bsPolicy) return _bsPolicy;
595
- const explicitCwd = typeof args?.cwd === 'string' && args.cwd.trim().length > 0;
596
- const requestedCwd = cwd || process.cwd();
597
- const baseCwd = (() => {
598
- if (explicitCwd) return requestedCwd;
599
- if (requestedSessionId) {
600
- const existing = _sessions.get(requestedSessionId);
601
- if (existing?.cwd) return existing.cwd;
602
- }
603
- return requestedCwd;
604
- })();
605
- const largeProbe = await preflightShellLargeFileProbe(command, baseCwd);
606
- if (largeProbe) return `Error: ${largeProbe.message}`;
607
- const rawTimeout = typeof args?.timeout === 'number' ? args.timeout : DEFAULT_TIMEOUT_MS;
608
- // Accept seconds OR milliseconds for ergonomics: values ≤ 600 are
609
- // treated as seconds (matches the spec's "max 600s"); larger values
610
- // are taken as ms. Cap either way.
611
- const timeoutMs = rawTimeout <= 600 ? rawTimeout * 1000 : rawTimeout;
612
- const effectiveTimeout = Math.min(Math.max(timeoutMs, 1000), wmicRewrite?.timeoutMs || MAX_TIMEOUT_MS);
613
- const resolved = _getOrCreate(requestedSessionId || args?.session_id, baseCwd, { create: args?.create === true });
614
- if (resolved.error) return resolved.error;
615
- const { id, entry } = resolved;
616
- if (entry.syncError) {
617
- const msg = entry.syncError;
618
- delete entry.syncError;
619
- throw new Error(msg);
620
- }
621
- if (entry.busy) {
622
- return `Error: session "${id}" is busy executing a prior command`;
623
- }
624
- if (explicitCwd) {
625
- const cwdErr = await _ensureSessionCwd(entry, requestedCwd, effectiveTimeout);
626
- if (cwdErr) return cwdErr;
627
- }
628
-
629
- let shellEffects;
630
- try {
631
- shellEffects = await analyzeShellCommandEffects(command, entry.cwd || baseCwd);
632
- } catch (err) {
633
- return `Error: ${err?.message || String(err)}`;
634
- }
635
-
636
- const _bsScope = opts?.readStateScope ?? opts?.sessionId ?? null;
637
- const _bsPreDrift = _captureTrackedMtimes(_bsScope);
638
- let result;
639
- try {
640
- result = await _runCommand(entry, command, effectiveTimeout, abortSignal);
641
- } catch (err) {
642
- return `Error: ${err?.message || String(err)}`;
643
- }
644
- if (result.exit_code === 0 && shellEffects.finalCwd) {
645
- entry.cwd = shellEffects.finalCwd;
646
- }
647
- // Skip cwd sync on abort: the shell was already killed, so issuing
648
- // another `pwd` would either hang on a dead pipe or spawn a fresh
649
- // session against caller intent. Mark dead so the next call mints a
650
- // new shell rather than reusing this one. Same logic for timeouts.
651
- if (result.aborted) {
652
- entry.dead = true;
653
- } else if (!close && !result.timed_out) {
654
- await _syncSessionCwd(entry, effectiveTimeout);
655
- }
656
- if (shellEffects.mutationMode === 'paths') {
657
- invalidateBuiltinResultCache(shellEffects.paths);
658
- markCodeGraphDirtyPaths(shellEffects.paths);
659
- } else if (shellEffects.mutationMode === 'global') {
660
- invalidateBuiltinResultCache();
661
- drainCodeGraphCache();
662
- }
663
- const _bsDriftNote = _trackedDriftNoteAfter(_bsScope, _bsPreDrift);
664
-
665
- if (close) {
666
- await _killSession(id, 'close-requested');
667
- }
668
-
669
- const stdoutClean = stripAnsi(result.stdout || '');
670
- const stderrClean = stripAnsi(result.stderr || '');
671
- const stdoutT = smartMiddleTruncate(stdoutClean);
672
- const stderrT = stderrClean ? smartMiddleTruncate(stderrClean) : '';
673
-
674
- // Structured header so the agent can parse session_id + exit_code out
675
- // of the text response without bespoke JSON. Keeps parity with the
676
- // `bash` tool's free-form `[exit code: N]` marker but additive.
677
- const headerLines = [`[session: ${id}]`];
678
- if (wmicRewrite?.note) headerLines.push(wmicRewrite.note);
679
- if (result.aborted) {
680
- headerLines.push(`[aborted: caller cancelled — session killed]`);
681
- } else if (result.timed_out) {
682
- headerLines.push(`[timeout: ${result.timeout_ms} ms — session killed]`);
683
- } else if (result.exit_code !== 0 && result.exit_code !== null) {
684
- headerLines.push(`[exit code: ${result.exit_code}]`);
685
- }
686
- if (close) headerLines.push(`[closed]`);
687
- const header = headerLines.join('\n');
688
-
689
- const body = stdoutT || (stderrT ? '' : '(no output)');
690
- const stderrBlock = stderrT ? `\n\n[stderr]\n${stderrT}` : '';
691
- return _prependDestructiveWarning(command, `${header}\n\n${body}${stderrBlock}${_bsDriftNote}`);
692
- }
693
-
694
- // BASH_SESSION_TOOL_DEFS removed in 0.1.126: the `bash` tool's
695
- // `persistent:true` option absorbed every use case; the dedicated
696
- // `bash_session` schema only added prompt bytes and triggered LLM
697
- // hallucinations of the legacy name. Implementation (executeBashSessionTool,
698
- // closeBashSession) stays — `bash` with persistent:true routes here.
699
- export async function executeBashSessionTool(name, args, _cwd, opts = {}) {
700
- switch (name) {
701
- case 'bash_session':
702
- return bash_session(args || {}, _cwd || process.cwd(), opts);
703
- default:
704
- throw new Error(`Unknown bash-session tool: ${name}`);
705
- }
706
- }
707
-
708
- export function closeBashSession(sessionId, reason = 'external-close') {
709
- if (!sessionId || !_sessions.has(sessionId)) return false;
710
- _killSession(sessionId, reason);
711
- return true;
712
- }
713
-
714
- // Best-effort cleanup on process exit so orphan bash children don't linger
715
- // when the plugin host shuts down. drain-registry runs this on signal exit
716
- // paths; the bare 'exit' hook stays as an idempotent backup.
717
- export function drainBashSessions() {
718
- for (const id of [..._sessions.keys()]) _killSession(id, 'process-exit');
719
- }
720
- if (typeof process?.on === 'function') {
721
- process.on('exit', drainBashSessions);
722
- }