mixdog 0.7.18 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (844) hide show
  1. package/README.md +37 -331
  2. package/package.json +67 -99
  3. package/scripts/boot-smoke.mjs +94 -0
  4. package/scripts/build-tui.mjs +52 -0
  5. package/scripts/compact-smoke.mjs +199 -0
  6. package/scripts/lead-workflow-smoke.mjs +598 -0
  7. package/scripts/live-worker-smoke.mjs +239 -0
  8. package/scripts/output-style-smoke.mjs +101 -0
  9. package/scripts/smoke-loop-report.mjs +221 -0
  10. package/scripts/smoke-loop.mjs +201 -0
  11. package/scripts/smoke.mjs +113 -0
  12. package/scripts/tool-failures.mjs +143 -0
  13. package/scripts/tool-smoke.mjs +456 -0
  14. package/src/agents/debugger/AGENT.md +3 -0
  15. package/src/agents/debugger/agent.json +6 -0
  16. package/src/agents/explore/AGENT.md +4 -0
  17. package/src/agents/explore/agent.json +6 -0
  18. package/src/agents/heavy-worker/AGENT.md +3 -0
  19. package/src/agents/heavy-worker/agent.json +6 -0
  20. package/src/agents/maintainer/AGENT.md +3 -0
  21. package/src/agents/maintainer/agent.json +6 -0
  22. package/src/agents/reviewer/AGENT.md +3 -0
  23. package/src/agents/reviewer/agent.json +6 -0
  24. package/src/agents/scheduler-task.md +3 -0
  25. package/src/agents/web-researcher/AGENT.md +3 -0
  26. package/src/agents/web-researcher/agent.json +6 -0
  27. package/src/agents/webhook-handler.md +3 -0
  28. package/src/agents/worker/AGENT.md +3 -0
  29. package/src/agents/worker/agent.json +6 -0
  30. package/src/app.mjs +90 -0
  31. package/src/cli.mjs +11 -0
  32. package/src/defaults/hidden-roles.json +72 -0
  33. package/src/defaults/mixdog-config.template.json +15 -0
  34. package/src/hooks/lib/permission-evaluator.cjs +488 -0
  35. package/src/hooks/lib/settings-loader.cjs +112 -0
  36. package/src/lib/keychain-cjs.cjs +332 -0
  37. package/src/lib/plugin-paths.cjs +28 -0
  38. package/src/lib/rules-builder.cjs +315 -0
  39. package/src/mixdog-session-runtime.mjs +3704 -0
  40. package/src/output-styles/default.md +38 -0
  41. package/src/output-styles/extreme-simple.md +17 -0
  42. package/src/output-styles/simple.md +17 -0
  43. package/src/repl.mjs +322 -0
  44. package/src/rules/bridge/00-common.md +5 -0
  45. package/src/rules/bridge/20-skip-protocol.md +11 -0
  46. package/src/rules/bridge/30-explorer.md +4 -0
  47. package/src/rules/bridge/40-cycle1-agent.md +28 -0
  48. package/src/rules/bridge/41-cycle2-agent.md +59 -0
  49. package/src/rules/lead/00-tool-lead.md +5 -0
  50. package/src/rules/lead/01-general.md +5 -0
  51. package/src/rules/lead/02-channels.md +3 -0
  52. package/src/rules/lead/04-workflow.md +12 -0
  53. package/src/rules/shared/00-language.md +3 -0
  54. package/src/rules/shared/01-tool.md +3 -0
  55. package/src/runtime/agent/orchestrator/bridge-trace.mjs +814 -0
  56. package/src/runtime/agent/orchestrator/cache-mtime.mjs +60 -0
  57. package/src/runtime/agent/orchestrator/config.mjs +446 -0
  58. package/src/runtime/agent/orchestrator/context/collect.mjs +796 -0
  59. package/src/runtime/agent/orchestrator/dispatch-persist.mjs +417 -0
  60. package/src/runtime/agent/orchestrator/internal-roles.mjs +188 -0
  61. package/src/runtime/agent/orchestrator/internal-tools.mjs +88 -0
  62. package/src/runtime/agent/orchestrator/mcp/client.mjs +345 -0
  63. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2104 -0
  64. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +784 -0
  65. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +341 -0
  66. package/src/runtime/agent/orchestrator/providers/gemini.mjs +1679 -0
  67. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +959 -0
  68. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +213 -0
  69. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +38 -0
  70. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +471 -0
  71. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +615 -0
  72. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +808 -0
  73. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +1719 -0
  74. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2587 -0
  75. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +1953 -0
  76. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +136 -0
  77. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +317 -0
  78. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +109 -0
  79. package/src/runtime/agent/orchestrator/providers/registry.mjs +247 -0
  80. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +332 -0
  81. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +11 -0
  82. package/src/runtime/agent/orchestrator/providers/trace-utils.mjs +50 -0
  83. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +142 -0
  84. package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +318 -0
  85. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +367 -0
  86. package/src/runtime/agent/orchestrator/session/compact.mjs +882 -0
  87. package/src/runtime/agent/orchestrator/session/context-utils.mjs +233 -0
  88. package/src/runtime/agent/orchestrator/session/loop.mjs +2320 -0
  89. package/src/runtime/agent/orchestrator/session/manager.mjs +2960 -0
  90. package/src/runtime/agent/orchestrator/session/result-classification.mjs +65 -0
  91. package/src/runtime/agent/orchestrator/session/store.mjs +663 -0
  92. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +166 -0
  93. package/src/runtime/agent/orchestrator/smart-bridge/bridge-llm.mjs +339 -0
  94. package/src/runtime/agent/orchestrator/smart-bridge/cache-strategy.mjs +419 -0
  95. package/src/runtime/agent/orchestrator/stall-policy.mjs +227 -0
  96. package/src/runtime/agent/orchestrator/tool-loop-guard.mjs +235 -0
  97. package/src/runtime/agent/orchestrator/tools/bash-session.mjs +723 -0
  98. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +389 -0
  99. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +637 -0
  100. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +165 -0
  101. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +104 -0
  102. package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +194 -0
  103. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +596 -0
  104. package/src/runtime/agent/orchestrator/tools/builtin/native-edit-runner.mjs +110 -0
  105. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +153 -0
  106. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +118 -0
  107. package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +189 -0
  108. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +731 -0
  109. package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +168 -0
  110. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +602 -0
  111. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +465 -0
  112. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +160 -0
  113. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +982 -0
  114. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +1087 -0
  115. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +231 -0
  116. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +223 -0
  117. package/src/runtime/agent/orchestrator/tools/builtin.mjs +478 -0
  118. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +24 -0
  119. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4102 -0
  120. package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +323 -0
  121. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +154 -0
  122. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +26 -0
  123. package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +143 -0
  124. package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +18 -0
  125. package/src/runtime/agent/orchestrator/tools/patch.mjs +2772 -0
  126. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +114 -0
  127. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +880 -0
  128. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +312 -0
  129. package/src/runtime/channels/backends/discord.mjs +781 -0
  130. package/src/runtime/channels/data/voice-runtime-manifest.json +138 -0
  131. package/src/runtime/channels/index.mjs +3309 -0
  132. package/src/runtime/channels/lib/config.mjs +285 -0
  133. package/src/runtime/channels/lib/drop-trace.mjs +71 -0
  134. package/src/runtime/channels/lib/event-pipeline.mjs +81 -0
  135. package/src/runtime/channels/lib/holidays.mjs +138 -0
  136. package/src/runtime/channels/lib/hook-pipe-server.mjs +671 -0
  137. package/src/runtime/channels/lib/output-forwarder.mjs +765 -0
  138. package/src/runtime/channels/lib/runtime-paths.mjs +497 -0
  139. package/src/runtime/channels/lib/scheduler.mjs +710 -0
  140. package/src/runtime/channels/lib/session-discovery.mjs +102 -0
  141. package/src/runtime/channels/lib/state-file.mjs +68 -0
  142. package/src/runtime/channels/lib/status-snapshot.mjs +224 -0
  143. package/src/runtime/channels/lib/tool-format.mjs +124 -0
  144. package/src/runtime/channels/lib/transcript-discovery.mjs +195 -0
  145. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +734 -0
  146. package/src/runtime/channels/lib/webhook.mjs +1288 -0
  147. package/src/runtime/channels/tool-defs.mjs +177 -0
  148. package/src/runtime/lib/keychain-cjs.cjs +289 -0
  149. package/src/runtime/memory/data/runtime-manifest.json +40 -0
  150. package/src/runtime/memory/index.mjs +3600 -0
  151. package/src/runtime/memory/lib/core-memory-store.mjs +336 -0
  152. package/src/runtime/memory/lib/embedding-provider.mjs +275 -0
  153. package/src/runtime/memory/lib/embedding-worker.mjs +331 -0
  154. package/src/runtime/memory/lib/memory-cycle-requests.mjs +276 -0
  155. package/src/runtime/memory/lib/memory-cycle1.mjs +783 -0
  156. package/src/runtime/memory/lib/memory-cycle2.mjs +1389 -0
  157. package/src/runtime/memory/lib/memory-cycle3.mjs +646 -0
  158. package/src/runtime/memory/lib/memory-embed.mjs +300 -0
  159. package/src/runtime/memory/lib/memory-ops-policy.mjs +149 -0
  160. package/src/runtime/memory/lib/memory-recall-store.mjs +644 -0
  161. package/src/runtime/memory/lib/memory.mjs +418 -0
  162. package/src/runtime/memory/lib/pg/adapter.mjs +314 -0
  163. package/src/runtime/memory/lib/pg/process.mjs +366 -0
  164. package/src/runtime/memory/lib/pg/supervisor.mjs +495 -0
  165. package/src/runtime/memory/lib/runtime-fetcher.mjs +464 -0
  166. package/src/runtime/memory/lib/trace-store.mjs +734 -0
  167. package/src/runtime/memory/tool-defs.mjs +79 -0
  168. package/src/runtime/search/index.mjs +925 -0
  169. package/src/runtime/search/lib/config.mjs +61 -0
  170. package/src/runtime/search/lib/web-tools.mjs +1278 -0
  171. package/src/runtime/search/tool-defs.mjs +64 -0
  172. package/src/runtime/shared/atomic-file.mjs +435 -0
  173. package/src/runtime/shared/background-tasks.mjs +376 -0
  174. package/src/runtime/shared/child-guardian.mjs +98 -0
  175. package/src/runtime/shared/config.mjs +393 -0
  176. package/src/runtime/shared/err-text.mjs +121 -0
  177. package/src/runtime/shared/launcher-control.mjs +259 -0
  178. package/src/runtime/shared/llm/http-agent.mjs +129 -0
  179. package/src/runtime/shared/open-url.mjs +37 -0
  180. package/src/runtime/shared/plugin-paths.mjs +25 -0
  181. package/src/runtime/shared/process-shutdown.mjs +147 -0
  182. package/src/runtime/shared/schedules-store.mjs +70 -0
  183. package/src/runtime/shared/tool-execution-contract.mjs +104 -0
  184. package/src/runtime/shared/tool-surface.mjs +950 -0
  185. package/src/runtime/shared/user-cwd.mjs +221 -0
  186. package/src/runtime/shared/user-data-guard.mjs +232 -0
  187. package/src/runtime/shared/workspace-router.mjs +259 -0
  188. package/src/standalone/bridge-tool.mjs +1414 -0
  189. package/src/standalone/channel-admin.mjs +366 -0
  190. package/src/standalone/channel-worker-preload.cjs +3 -0
  191. package/src/standalone/channel-worker.mjs +353 -0
  192. package/src/standalone/explore-tool.mjs +233 -0
  193. package/src/standalone/hook-bus.mjs +246 -0
  194. package/src/standalone/plugin-admin.mjs +247 -0
  195. package/src/standalone/provider-admin.mjs +338 -0
  196. package/src/standalone/seeds.mjs +94 -0
  197. package/src/standalone/usage-dashboard.mjs +510 -0
  198. package/src/tui/App.jsx +5438 -0
  199. package/src/tui/components/AnsiText.jsx +199 -0
  200. package/src/tui/components/ContextPanel.jsx +217 -0
  201. package/src/tui/components/Markdown.jsx +205 -0
  202. package/src/tui/components/MarkdownTable.jsx +204 -0
  203. package/src/tui/components/Message.jsx +103 -0
  204. package/src/tui/components/Picker.jsx +317 -0
  205. package/src/tui/components/PromptInput.jsx +584 -0
  206. package/src/tui/components/QueuedCommands.jsx +47 -0
  207. package/src/tui/components/SlashCommandPalette.jsx +114 -0
  208. package/src/tui/components/Spinner.jsx +317 -0
  209. package/src/tui/components/StatusLine.jsx +87 -0
  210. package/src/tui/components/TextEntryPanel.jsx +323 -0
  211. package/src/tui/components/ToolExecution.jsx +772 -0
  212. package/src/tui/components/TurnDone.jsx +78 -0
  213. package/src/tui/components/UsagePanel.jsx +331 -0
  214. package/src/tui/dist/index.mjs +12359 -0
  215. package/src/tui/engine.mjs +2410 -0
  216. package/src/tui/figures.mjs +50 -0
  217. package/src/tui/hooks/useEngine.mjs +16 -0
  218. package/src/tui/index.jsx +254 -0
  219. package/src/tui/input-editing.mjs +242 -0
  220. package/src/tui/markdown/format-token.mjs +194 -0
  221. package/src/tui/paste-attachments.mjs +198 -0
  222. package/src/tui/runtime/shared/process-shutdown.mjs +1 -0
  223. package/src/tui/spinner-verbs.mjs +45 -0
  224. package/src/tui/theme.mjs +67 -0
  225. package/src/tui/time-format.mjs +53 -0
  226. package/src/ui/ansi.mjs +115 -0
  227. package/src/ui/markdown.mjs +195 -0
  228. package/src/ui/statusline.mjs +730 -0
  229. package/src/ui/tool-card.mjs +101 -0
  230. package/src/vendor/statusline/bin/statusline-lib.mjs +805 -0
  231. package/src/vendor/statusline/bin/statusline-route.mjs +596 -0
  232. package/src/vendor/statusline/scripts/lib/gateway-settings.mjs +285 -0
  233. package/src/vendor/statusline/src/gateway/claude-current.mjs +320 -0
  234. package/src/vendor/statusline/src/gateway/route-meta.mjs +753 -0
  235. package/src/vendor/statusline/src/gateway/session-routes.mjs +244 -0
  236. package/src/workflows/default/WORKFLOW.md +7 -0
  237. package/src/workflows/default/workflow.json +14 -0
  238. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  239. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  240. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  241. package/vendor/ink/build/colorize.d.ts +3 -0
  242. package/vendor/ink/build/colorize.js +48 -0
  243. package/vendor/ink/build/colorize.js.map +1 -0
  244. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  245. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  246. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  247. package/vendor/ink/build/components/AnimationContext.d.ts +9 -0
  248. package/vendor/ink/build/components/AnimationContext.js +13 -0
  249. package/vendor/ink/build/components/AnimationContext.js.map +1 -0
  250. package/vendor/ink/build/components/App.d.ts +24 -0
  251. package/vendor/ink/build/components/App.js +554 -0
  252. package/vendor/ink/build/components/App.js.map +1 -0
  253. package/vendor/ink/build/components/AppContext.d.ts +80 -0
  254. package/vendor/ink/build/components/AppContext.js +25 -0
  255. package/vendor/ink/build/components/AppContext.js.map +1 -0
  256. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  257. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  258. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  259. package/vendor/ink/build/components/Box.d.ts +130 -0
  260. package/vendor/ink/build/components/Box.js +34 -0
  261. package/vendor/ink/build/components/Box.js.map +1 -0
  262. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  263. package/vendor/ink/build/components/CursorContext.js +8 -0
  264. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  265. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  266. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  267. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  268. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  269. package/vendor/ink/build/components/ErrorOverview.js +90 -0
  270. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  271. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  272. package/vendor/ink/build/components/FocusContext.js +17 -0
  273. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  274. package/vendor/ink/build/components/Newline.d.ts +13 -0
  275. package/vendor/ink/build/components/Newline.js +8 -0
  276. package/vendor/ink/build/components/Newline.js.map +1 -0
  277. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  278. package/vendor/ink/build/components/Spacer.js +11 -0
  279. package/vendor/ink/build/components/Spacer.js.map +1 -0
  280. package/vendor/ink/build/components/Static.d.ts +24 -0
  281. package/vendor/ink/build/components/Static.js +28 -0
  282. package/vendor/ink/build/components/Static.js.map +1 -0
  283. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  284. package/vendor/ink/build/components/StderrContext.js +13 -0
  285. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  286. package/vendor/ink/build/components/StdinContext.d.ts +28 -0
  287. package/vendor/ink/build/components/StdinContext.js +20 -0
  288. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  289. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  290. package/vendor/ink/build/components/StdoutContext.js +13 -0
  291. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  292. package/vendor/ink/build/components/Text.d.ts +55 -0
  293. package/vendor/ink/build/components/Text.js +50 -0
  294. package/vendor/ink/build/components/Text.js.map +1 -0
  295. package/vendor/ink/build/components/Transform.d.ts +16 -0
  296. package/vendor/ink/build/components/Transform.js +15 -0
  297. package/vendor/ink/build/components/Transform.js.map +1 -0
  298. package/vendor/ink/build/cursor-helpers.d.ts +39 -0
  299. package/vendor/ink/build/cursor-helpers.js +62 -0
  300. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  301. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  302. package/vendor/ink/build/devtools-window-polyfill.js +68 -0
  303. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  304. package/vendor/ink/build/devtools.d.ts +1 -0
  305. package/vendor/ink/build/devtools.js +36 -0
  306. package/vendor/ink/build/devtools.js.map +1 -0
  307. package/vendor/ink/build/dom.d.ts +62 -0
  308. package/vendor/ink/build/dom.js +143 -0
  309. package/vendor/ink/build/dom.js.map +1 -0
  310. package/vendor/ink/build/get-max-width.d.ts +3 -0
  311. package/vendor/ink/build/get-max-width.js +10 -0
  312. package/vendor/ink/build/get-max-width.js.map +1 -0
  313. package/vendor/ink/build/hooks/use-animation.d.ts +49 -0
  314. package/vendor/ink/build/hooks/use-animation.js +87 -0
  315. package/vendor/ink/build/hooks/use-animation.js.map +1 -0
  316. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  317. package/vendor/ink/build/hooks/use-app.js +8 -0
  318. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  319. package/vendor/ink/build/hooks/use-box-metrics.d.ts +59 -0
  320. package/vendor/ink/build/hooks/use-box-metrics.js +81 -0
  321. package/vendor/ink/build/hooks/use-box-metrics.js.map +1 -0
  322. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  323. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  324. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  325. package/vendor/ink/build/hooks/use-focus-manager.d.ts +43 -0
  326. package/vendor/ink/build/hooks/use-focus-manager.js +18 -0
  327. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  328. package/vendor/ink/build/hooks/use-focus.d.ts +30 -0
  329. package/vendor/ink/build/hooks/use-focus.js +43 -0
  330. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  331. package/vendor/ink/build/hooks/use-input.d.ts +132 -0
  332. package/vendor/ink/build/hooks/use-input.js +126 -0
  333. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  334. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +6 -0
  335. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +12 -0
  336. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  337. package/vendor/ink/build/hooks/use-paste.d.ts +35 -0
  338. package/vendor/ink/build/hooks/use-paste.js +62 -0
  339. package/vendor/ink/build/hooks/use-paste.js.map +1 -0
  340. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  341. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  342. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  343. package/vendor/ink/build/hooks/use-stdin.d.ts +7 -0
  344. package/vendor/ink/build/hooks/use-stdin.js +9 -0
  345. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  346. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  347. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  348. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  349. package/vendor/ink/build/hooks/use-window-size.d.ts +18 -0
  350. package/vendor/ink/build/hooks/use-window-size.js +22 -0
  351. package/vendor/ink/build/hooks/use-window-size.js.map +1 -0
  352. package/vendor/ink/build/index.d.ts +42 -0
  353. package/vendor/ink/build/index.js +24 -0
  354. package/vendor/ink/build/index.js.map +1 -0
  355. package/vendor/ink/build/ink.d.ts +146 -0
  356. package/vendor/ink/build/ink.js +1022 -0
  357. package/vendor/ink/build/ink.js.map +1 -0
  358. package/vendor/ink/build/input-parser.d.ts +10 -0
  359. package/vendor/ink/build/input-parser.js +194 -0
  360. package/vendor/ink/build/input-parser.js.map +1 -0
  361. package/vendor/ink/build/instances.d.ts +3 -0
  362. package/vendor/ink/build/instances.js +8 -0
  363. package/vendor/ink/build/instances.js.map +1 -0
  364. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  365. package/vendor/ink/build/kitty-keyboard.js +32 -0
  366. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  367. package/vendor/ink/build/log-update.d.ts +20 -0
  368. package/vendor/ink/build/log-update.js +261 -0
  369. package/vendor/ink/build/log-update.js.map +1 -0
  370. package/vendor/ink/build/measure-element.d.ts +20 -0
  371. package/vendor/ink/build/measure-element.js +13 -0
  372. package/vendor/ink/build/measure-element.js.map +1 -0
  373. package/vendor/ink/build/measure-text.d.ts +6 -0
  374. package/vendor/ink/build/measure-text.js +21 -0
  375. package/vendor/ink/build/measure-text.js.map +1 -0
  376. package/vendor/ink/build/output.d.ts +35 -0
  377. package/vendor/ink/build/output.js +328 -0
  378. package/vendor/ink/build/output.js.map +1 -0
  379. package/vendor/ink/build/parse-keypress.d.ts +20 -0
  380. package/vendor/ink/build/parse-keypress.js +495 -0
  381. package/vendor/ink/build/parse-keypress.js.map +1 -0
  382. package/vendor/ink/build/reconciler.d.ts +4 -0
  383. package/vendor/ink/build/reconciler.js +306 -0
  384. package/vendor/ink/build/reconciler.js.map +1 -0
  385. package/vendor/ink/build/render-background.d.ts +4 -0
  386. package/vendor/ink/build/render-background.js +25 -0
  387. package/vendor/ink/build/render-background.js.map +1 -0
  388. package/vendor/ink/build/render-border.d.ts +4 -0
  389. package/vendor/ink/build/render-border.js +84 -0
  390. package/vendor/ink/build/render-border.js.map +1 -0
  391. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  392. package/vendor/ink/build/render-node-to-output.js +162 -0
  393. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  394. package/vendor/ink/build/render-to-string.d.ts +38 -0
  395. package/vendor/ink/build/render-to-string.js +116 -0
  396. package/vendor/ink/build/render-to-string.js.map +1 -0
  397. package/vendor/ink/build/render.d.ts +176 -0
  398. package/vendor/ink/build/render.js +71 -0
  399. package/vendor/ink/build/render.js.map +1 -0
  400. package/vendor/ink/build/renderer.d.ts +8 -0
  401. package/vendor/ink/build/renderer.js +64 -0
  402. package/vendor/ink/build/renderer.js.map +1 -0
  403. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  404. package/vendor/ink/build/sanitize-ansi.js +27 -0
  405. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  406. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  407. package/vendor/ink/build/squash-text-nodes.js +36 -0
  408. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  409. package/vendor/ink/build/styles.d.ts +302 -0
  410. package/vendor/ink/build/styles.js +303 -0
  411. package/vendor/ink/build/styles.js.map +1 -0
  412. package/vendor/ink/build/utils.d.ts +9 -0
  413. package/vendor/ink/build/utils.js +19 -0
  414. package/vendor/ink/build/utils.js.map +1 -0
  415. package/vendor/ink/build/wrap-text.d.ts +3 -0
  416. package/vendor/ink/build/wrap-text.js +38 -0
  417. package/vendor/ink/build/wrap-text.js.map +1 -0
  418. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  419. package/vendor/ink/build/write-synchronized.js +9 -0
  420. package/vendor/ink/build/write-synchronized.js.map +1 -0
  421. package/vendor/ink/license +10 -0
  422. package/vendor/ink/package.json +137 -0
  423. package/.claude-plugin/marketplace.json +0 -34
  424. package/.claude-plugin/plugin.json +0 -20
  425. package/.gitattributes +0 -34
  426. package/.mcp.json +0 -14
  427. package/ARCHITECTURE.md +0 -77
  428. package/CHANGELOG.md +0 -30
  429. package/CONTRIBUTING.md +0 -45
  430. package/DATA-FLOW.md +0 -79
  431. package/LICENSE +0 -21
  432. package/SECURITY.md +0 -138
  433. package/UNINSTALL.md +0 -115
  434. package/agents/maintenance.md +0 -5
  435. package/agents/memory-classification.md +0 -30
  436. package/agents/scheduler-task.md +0 -18
  437. package/agents/webhook-handler.md +0 -27
  438. package/agents/worker.md +0 -24
  439. package/bin/bridge +0 -133
  440. package/bin/statusline-launcher.mjs +0 -82
  441. package/bin/statusline-lib.mjs +0 -581
  442. package/bin/statusline-route.mjs +0 -273
  443. package/bin/statusline.mjs +0 -638
  444. package/bun.lock +0 -927
  445. package/commands/config.md +0 -16
  446. package/commands/doctor.md +0 -13
  447. package/commands/model.md +0 -61
  448. package/commands/setup.md +0 -17
  449. package/defaults/hidden-roles.json +0 -68
  450. package/defaults/memory-chunk-prompt.md +0 -63
  451. package/defaults/mixdog-config.template.json +0 -27
  452. package/defaults/user-workflow.json +0 -8
  453. package/defaults/user-workflow.md +0 -17
  454. package/hooks/hooks.json +0 -73
  455. package/hooks/lib/active-instance.cjs +0 -77
  456. package/hooks/lib/permission-evaluator.cjs +0 -411
  457. package/hooks/lib/permission-route.cjs +0 -63
  458. package/hooks/lib/settings-loader.cjs +0 -117
  459. package/hooks/post-tool-use.cjs +0 -84
  460. package/hooks/pre-mcp-sandbox.cjs +0 -158
  461. package/hooks/pre-tool-subagent.cjs +0 -258
  462. package/hooks/session-start.cjs +0 -1493
  463. package/hooks/shim-launcher.cjs +0 -65
  464. package/hooks/turn-timer.cjs +0 -82
  465. package/lib/claude-md-writer.cjs +0 -386
  466. package/lib/keychain-cjs.cjs +0 -290
  467. package/lib/plugin-paths.cjs +0 -69
  468. package/lib/rules-builder.cjs +0 -241
  469. package/native/README.md +0 -117
  470. package/native/prebuilt/linux-aarch64/mixdog-shim +0 -0
  471. package/native/prebuilt/linux-x86_64/mixdog-shim +0 -0
  472. package/native/prebuilt/macos-aarch64/mixdog-shim +0 -0
  473. package/native/prebuilt/macos-x86_64/mixdog-shim +0 -0
  474. package/native/prebuilt/windows-x86_64/mixdog-shim.exe +0 -0
  475. package/prompts/code-review.txt +0 -16
  476. package/prompts/security-audit.txt +0 -17
  477. package/rules/bridge/00-common.md +0 -39
  478. package/rules/bridge/20-skip-protocol.md +0 -18
  479. package/rules/bridge/30-explorer.md +0 -33
  480. package/rules/bridge/40-cycle1-agent.md +0 -52
  481. package/rules/bridge/41-cycle2-agent.md +0 -62
  482. package/rules/lead/00-tool-lead.md +0 -61
  483. package/rules/lead/01-general.md +0 -26
  484. package/rules/lead/02-channels.md +0 -49
  485. package/rules/lead/03-team.md +0 -27
  486. package/rules/lead/04-workflow.md +0 -20
  487. package/rules/shared/00-language.md +0 -14
  488. package/rules/shared/01-tool.md +0 -138
  489. package/scripts/bootstrap.mjs +0 -130
  490. package/scripts/bridge-unify-smoke.mjs +0 -308
  491. package/scripts/build-runtime-linux.sh +0 -348
  492. package/scripts/build-runtime-macos.sh +0 -217
  493. package/scripts/build-runtime-windows.ps1 +0 -242
  494. package/scripts/builtin-utils-smoke.mjs +0 -398
  495. package/scripts/bump.mjs +0 -80
  496. package/scripts/check-json.mjs +0 -45
  497. package/scripts/check-syntax-changed.mjs +0 -102
  498. package/scripts/check-syntax.mjs +0 -58
  499. package/scripts/code-graph-batch.test.mjs +0 -33
  500. package/scripts/config-preserve-smoke.mjs +0 -180
  501. package/scripts/doctor.mjs +0 -489
  502. package/scripts/edit-normalize-fuzz.mjs +0 -130
  503. package/scripts/edit-normalize-smoke.mjs +0 -401
  504. package/scripts/edit-operation-smoke.mjs +0 -369
  505. package/scripts/edit2-smoke.mjs +0 -63
  506. package/scripts/ensure-deps.mjs +0 -259
  507. package/scripts/fuzzy-e2e.mjs +0 -28
  508. package/scripts/fuzzy-smoke.mjs +0 -26
  509. package/scripts/gateway-model.mjs +0 -596
  510. package/scripts/generate-runtime-manifest.mjs +0 -166
  511. package/scripts/guard-smoke.mjs +0 -66
  512. package/scripts/hidden-role-schema-smoke.mjs +0 -162
  513. package/scripts/hook-routing-smoke.mjs +0 -29
  514. package/scripts/inject-input.ps1 +0 -204
  515. package/scripts/io-complex-smoke.mjs +0 -667
  516. package/scripts/io-explore-bench.mjs +0 -424
  517. package/scripts/io-guardrails-smoke.mjs +0 -205
  518. package/scripts/io-mini-bench-baseline.json +0 -11
  519. package/scripts/io-mini-bench.mjs +0 -216
  520. package/scripts/io-route-harness.mjs +0 -933
  521. package/scripts/io-telemetry-report.mjs +0 -691
  522. package/scripts/lib/gateway-inventory.mjs +0 -178
  523. package/scripts/lib/gateway-settings.mjs +0 -78
  524. package/scripts/mutation-bench.mjs +0 -564
  525. package/scripts/mutation-io-smoke.mjs +0 -1097
  526. package/scripts/native-patch-bridge-smoke.mjs +0 -288
  527. package/scripts/native-patch-smoke.mjs +0 -304
  528. package/scripts/openai-oauth-catalog-smoke.mjs +0 -53
  529. package/scripts/patch-interior-context-smoke.mjs +0 -49
  530. package/scripts/patch-newline-utf8-smoke.mjs +0 -157
  531. package/scripts/perf-hook-smoke.mjs +0 -71
  532. package/scripts/permission-eval-smoke.mjs +0 -443
  533. package/scripts/prep-patch.mjs +0 -53
  534. package/scripts/prep-shim.mjs +0 -96
  535. package/scripts/provider-cache-smoke.mjs +0 -687
  536. package/scripts/report-runtime-health.mjs +0 -132
  537. package/scripts/resolve-bun.mjs +0 -60
  538. package/scripts/run-mcp.mjs +0 -1473
  539. package/scripts/salvage-v4a-shatter.test.mjs +0 -58
  540. package/scripts/scoped-cache-io-smoke.mjs +0 -103
  541. package/scripts/shell-policy-round3-smoke.mjs +0 -46
  542. package/scripts/smoke-runtime-negative.ps1 +0 -100
  543. package/scripts/smoke-runtime-negative.sh +0 -95
  544. package/scripts/stall-policy-smoke.mjs +0 -50
  545. package/scripts/start-memory-worker.mjs +0 -23
  546. package/scripts/statusline-launcher-smoke.mjs +0 -235
  547. package/scripts/stress-atomic-write.mjs +0 -1028
  548. package/scripts/test-fault-inject.mjs +0 -164
  549. package/scripts/test-large-file.mjs +0 -174
  550. package/scripts/tool-edge-smoke.mjs +0 -209
  551. package/scripts/uninstall.mjs +0 -238
  552. package/scripts/webhook-selfheal-smoke.mjs +0 -27
  553. package/scripts/write-overwrite-guard-smoke.mjs +0 -56
  554. package/server-main.mjs +0 -3350
  555. package/server.mjs +0 -468
  556. package/setup/config-merge.mjs +0 -246
  557. package/setup/install.mjs +0 -574
  558. package/setup/launch-core.mjs +0 -617
  559. package/setup/launch.mjs +0 -101
  560. package/setup/locate-claude.mjs +0 -56
  561. package/setup/mixdog-cli.mjs +0 -122
  562. package/setup/setup-server.mjs +0 -3305
  563. package/setup/setup.html +0 -3740
  564. package/setup/tui.mjs +0 -325
  565. package/skills/retro-skill-proposer/SKILL.md +0 -92
  566. package/skills/schedule-add/SKILL.md +0 -77
  567. package/skills/setup/SKILL.md +0 -356
  568. package/skills/webhook-add/SKILL.md +0 -81
  569. package/src/agent/bridge-stall-watchdog.mjs +0 -337
  570. package/src/agent/index.mjs +0 -2229
  571. package/src/agent/orchestrator/ai-wrapped-dispatch.mjs +0 -1010
  572. package/src/agent/orchestrator/bridge-retry.mjs +0 -220
  573. package/src/agent/orchestrator/bridge-trace.mjs +0 -601
  574. package/src/agent/orchestrator/cache-mtime.mjs +0 -58
  575. package/src/agent/orchestrator/config.mjs +0 -405
  576. package/src/agent/orchestrator/context/collect.mjs +0 -651
  577. package/src/agent/orchestrator/dispatch-persist.mjs +0 -549
  578. package/src/agent/orchestrator/drain-registry.mjs +0 -50
  579. package/src/agent/orchestrator/explore-validator.mjs +0 -8
  580. package/src/agent/orchestrator/internal-roles.mjs +0 -118
  581. package/src/agent/orchestrator/internal-tools.mjs +0 -88
  582. package/src/agent/orchestrator/jobs.mjs +0 -116
  583. package/src/agent/orchestrator/mcp/client.mjs +0 -364
  584. package/src/agent/orchestrator/providers/anthropic-oauth.mjs +0 -1884
  585. package/src/agent/orchestrator/providers/anthropic.mjs +0 -598
  586. package/src/agent/orchestrator/providers/gemini.mjs +0 -1530
  587. package/src/agent/orchestrator/providers/grok-oauth.mjs +0 -779
  588. package/src/agent/orchestrator/providers/model-catalog.mjs +0 -374
  589. package/src/agent/orchestrator/providers/openai-compat-stream.mjs +0 -366
  590. package/src/agent/orchestrator/providers/openai-compat.mjs +0 -1511
  591. package/src/agent/orchestrator/providers/openai-oauth-ws.mjs +0 -1891
  592. package/src/agent/orchestrator/providers/openai-oauth.mjs +0 -1456
  593. package/src/agent/orchestrator/providers/openai-ws.mjs +0 -127
  594. package/src/agent/orchestrator/providers/registry.mjs +0 -192
  595. package/src/agent/orchestrator/providers/retry-classifier.mjs +0 -325
  596. package/src/agent/orchestrator/session/cache/prefetch-cache.mjs +0 -142
  597. package/src/agent/orchestrator/session/cache/read-cache.mjs +0 -319
  598. package/src/agent/orchestrator/session/cache/scoped-cache.mjs +0 -361
  599. package/src/agent/orchestrator/session/loop.mjs +0 -1619
  600. package/src/agent/orchestrator/session/manager.mjs +0 -1991
  601. package/src/agent/orchestrator/session/result-classification.mjs +0 -65
  602. package/src/agent/orchestrator/session/store.mjs +0 -632
  603. package/src/agent/orchestrator/session/stream-watchdog.mjs +0 -130
  604. package/src/agent/orchestrator/session/tool-result-offload.mjs +0 -166
  605. package/src/agent/orchestrator/session/trim.mjs +0 -491
  606. package/src/agent/orchestrator/smart-bridge/CACHE-SHARD.md +0 -115
  607. package/src/agent/orchestrator/smart-bridge/bridge-llm.mjs +0 -331
  608. package/src/agent/orchestrator/smart-bridge/cache-obs.mjs +0 -150
  609. package/src/agent/orchestrator/smart-bridge/cache-strategy.mjs +0 -228
  610. package/src/agent/orchestrator/smart-bridge/index.mjs +0 -215
  611. package/src/agent/orchestrator/smart-bridge/profiles.mjs +0 -37
  612. package/src/agent/orchestrator/smart-bridge/registry.mjs +0 -348
  613. package/src/agent/orchestrator/stall-policy.mjs +0 -201
  614. package/src/agent/orchestrator/tool-loop-guard.mjs +0 -75
  615. package/src/agent/orchestrator/tools/bash-session.mjs +0 -722
  616. package/src/agent/orchestrator/tools/builtin/arg-guard.mjs +0 -511
  617. package/src/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -480
  618. package/src/agent/orchestrator/tools/builtin/builtin-tools.mjs +0 -256
  619. package/src/agent/orchestrator/tools/builtin/edit-base-guard.mjs +0 -58
  620. package/src/agent/orchestrator/tools/builtin/edit-byte-plan.mjs +0 -240
  621. package/src/agent/orchestrator/tools/builtin/edit-byte-utils.mjs +0 -113
  622. package/src/agent/orchestrator/tools/builtin/edit-commit.mjs +0 -74
  623. package/src/agent/orchestrator/tools/builtin/edit-context-utils.mjs +0 -242
  624. package/src/agent/orchestrator/tools/builtin/edit-diagnostics.mjs +0 -211
  625. package/src/agent/orchestrator/tools/builtin/edit-engine.mjs +0 -1364
  626. package/src/agent/orchestrator/tools/builtin/edit-failure-context.mjs +0 -126
  627. package/src/agent/orchestrator/tools/builtin/edit-hint.mjs +0 -141
  628. package/src/agent/orchestrator/tools/builtin/edit-match-utils.mjs +0 -194
  629. package/src/agent/orchestrator/tools/builtin/edit-partial-write.mjs +0 -60
  630. package/src/agent/orchestrator/tools/builtin/edit-stale-refresh.mjs +0 -168
  631. package/src/agent/orchestrator/tools/builtin/edit-tool.mjs +0 -173
  632. package/src/agent/orchestrator/tools/builtin/edit-utf8-guard.mjs +0 -48
  633. package/src/agent/orchestrator/tools/builtin/fuzzy-match.mjs +0 -99
  634. package/src/agent/orchestrator/tools/builtin/glob-walk.mjs +0 -193
  635. package/src/agent/orchestrator/tools/builtin/list-tool.mjs +0 -597
  636. package/src/agent/orchestrator/tools/builtin/native-edit-runner.mjs +0 -110
  637. package/src/agent/orchestrator/tools/builtin/notebook-edit-tool.mjs +0 -300
  638. package/src/agent/orchestrator/tools/builtin/path-diagnostics.mjs +0 -152
  639. package/src/agent/orchestrator/tools/builtin/read-formatting.mjs +0 -118
  640. package/src/agent/orchestrator/tools/builtin/read-open.mjs +0 -190
  641. package/src/agent/orchestrator/tools/builtin/read-single-tool.mjs +0 -728
  642. package/src/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +0 -173
  643. package/src/agent/orchestrator/tools/builtin/read-streaming.mjs +0 -602
  644. package/src/agent/orchestrator/tools/builtin/rename-tool.mjs +0 -196
  645. package/src/agent/orchestrator/tools/builtin/rg-runner.mjs +0 -422
  646. package/src/agent/orchestrator/tools/builtin/search-builders.mjs +0 -158
  647. package/src/agent/orchestrator/tools/builtin/search-tool.mjs +0 -869
  648. package/src/agent/orchestrator/tools/builtin/shell-jobs.mjs +0 -962
  649. package/src/agent/orchestrator/tools/builtin/shell-runtime.mjs +0 -223
  650. package/src/agent/orchestrator/tools/builtin/snapshot-store.mjs +0 -206
  651. package/src/agent/orchestrator/tools/builtin/write-tool.mjs +0 -401
  652. package/src/agent/orchestrator/tools/builtin.mjs +0 -503
  653. package/src/agent/orchestrator/tools/code-graph-tool-defs.mjs +0 -24
  654. package/src/agent/orchestrator/tools/code-graph.mjs +0 -4095
  655. package/src/agent/orchestrator/tools/cwd-tool.mjs +0 -298
  656. package/src/agent/orchestrator/tools/destructive-warning.mjs +0 -323
  657. package/src/agent/orchestrator/tools/edit-normalize.mjs +0 -603
  658. package/src/agent/orchestrator/tools/graph-binary-fetcher.mjs +0 -154
  659. package/src/agent/orchestrator/tools/graph-manifest.json +0 -26
  660. package/src/agent/orchestrator/tools/host-input.mjs +0 -204
  661. package/src/agent/orchestrator/tools/patch-binary-fetcher.mjs +0 -143
  662. package/src/agent/orchestrator/tools/patch-manifest.json +0 -26
  663. package/src/agent/orchestrator/tools/patch-tool-defs.mjs +0 -20
  664. package/src/agent/orchestrator/tools/patch.mjs +0 -2754
  665. package/src/agent/orchestrator/tools/progress-message.mjs +0 -118
  666. package/src/agent/orchestrator/tools/shell-command.mjs +0 -865
  667. package/src/agent/orchestrator/tools/shell-policy-imports.mjs +0 -7
  668. package/src/agent/orchestrator/tools/shell-snapshot.mjs +0 -313
  669. package/src/agent/orchestrator/workflow-store.mjs +0 -93
  670. package/src/agent/tool-defs.mjs +0 -110
  671. package/src/channels/backends/discord.mjs +0 -784
  672. package/src/channels/data/voice-runtime-manifest.json +0 -138
  673. package/src/channels/index.mjs +0 -3268
  674. package/src/channels/lib/config.mjs +0 -292
  675. package/src/channels/lib/drop-trace.mjs +0 -71
  676. package/src/channels/lib/event-pipeline.mjs +0 -81
  677. package/src/channels/lib/holidays.mjs +0 -138
  678. package/src/channels/lib/hook-pipe-server.mjs +0 -822
  679. package/src/channels/lib/output-forwarder.mjs +0 -765
  680. package/src/channels/lib/runtime-paths.mjs +0 -552
  681. package/src/channels/lib/scheduler.mjs +0 -723
  682. package/src/channels/lib/session-discovery.mjs +0 -103
  683. package/src/channels/lib/state-file.mjs +0 -68
  684. package/src/channels/lib/status-snapshot.mjs +0 -219
  685. package/src/channels/lib/tool-format.mjs +0 -140
  686. package/src/channels/lib/transcript-discovery.mjs +0 -195
  687. package/src/channels/lib/voice-runtime-fetcher.mjs +0 -734
  688. package/src/channels/lib/webhook.mjs +0 -1318
  689. package/src/channels/tool-defs.mjs +0 -170
  690. package/src/daemon/host.mjs +0 -118
  691. package/src/daemon/mcp-transport.mjs +0 -47
  692. package/src/daemon/session.mjs +0 -100
  693. package/src/daemon/thin-client.mjs +0 -71
  694. package/src/daemon/transport.mjs +0 -163
  695. package/src/gateway/claude-current.mjs +0 -255
  696. package/src/gateway/oauth-usage.mjs +0 -598
  697. package/src/gateway/route-meta.mjs +0 -629
  698. package/src/gateway/server.mjs +0 -713
  699. package/src/memory/data/runtime-manifest.json +0 -40
  700. package/src/memory/index.mjs +0 -3332
  701. package/src/memory/lib/core-memory-store.mjs +0 -330
  702. package/src/memory/lib/embedding-provider.mjs +0 -269
  703. package/src/memory/lib/embedding-worker.mjs +0 -323
  704. package/src/memory/lib/memory-cycle1.mjs +0 -645
  705. package/src/memory/lib/memory-cycle2.mjs +0 -1284
  706. package/src/memory/lib/memory-cycle3.mjs +0 -540
  707. package/src/memory/lib/memory-embed.mjs +0 -299
  708. package/src/memory/lib/memory-ops-policy.mjs +0 -190
  709. package/src/memory/lib/memory-recall-store.mjs +0 -638
  710. package/src/memory/lib/memory.mjs +0 -412
  711. package/src/memory/lib/pg/adapter.mjs +0 -308
  712. package/src/memory/lib/pg/process.mjs +0 -360
  713. package/src/memory/lib/pg/supervisor.mjs +0 -396
  714. package/src/memory/lib/runtime-fetcher.mjs +0 -458
  715. package/src/memory/lib/trace-store.mjs +0 -728
  716. package/src/memory/tool-defs.mjs +0 -79
  717. package/src/search/index.mjs +0 -1173
  718. package/src/search/lib/backends/anthropic-oauth.mjs +0 -98
  719. package/src/search/lib/backends/exa.mjs +0 -50
  720. package/src/search/lib/backends/firecrawl.mjs +0 -61
  721. package/src/search/lib/backends/gemini-api.mjs +0 -83
  722. package/src/search/lib/backends/grok-oauth.mjs +0 -86
  723. package/src/search/lib/backends/index.mjs +0 -150
  724. package/src/search/lib/backends/openai-api.mjs +0 -144
  725. package/src/search/lib/backends/openai-oauth.mjs +0 -102
  726. package/src/search/lib/backends/openai-web-search.mjs +0 -76
  727. package/src/search/lib/backends/tavily.mjs +0 -55
  728. package/src/search/lib/backends/xai-api.mjs +0 -113
  729. package/src/search/lib/config.mjs +0 -192
  730. package/src/search/lib/provider-usage.mjs +0 -67
  731. package/src/search/lib/providers.mjs +0 -47
  732. package/src/search/lib/search-intent.mjs +0 -109
  733. package/src/search/lib/setup-handler.mjs +0 -261
  734. package/src/search/lib/web-tools.mjs +0 -1219
  735. package/src/search/tool-defs.mjs +0 -83
  736. package/src/setup/defender-exclusion.mjs +0 -183
  737. package/src/shared/atomic-file.mjs +0 -436
  738. package/src/shared/config.mjs +0 -372
  739. package/src/shared/daemon-recycle.mjs +0 -108
  740. package/src/shared/disable-claude-builtins.mjs +0 -91
  741. package/src/shared/err-text.mjs +0 -12
  742. package/src/shared/llm/http-agent.mjs +0 -123
  743. package/src/shared/open-url.mjs +0 -62
  744. package/src/shared/plugin-paths.mjs +0 -58
  745. package/src/shared/schedules-store.mjs +0 -70
  746. package/src/shared/seed.mjs +0 -161
  747. package/src/shared/user-cwd.mjs +0 -225
  748. package/src/shared/user-data-guard.mjs +0 -244
  749. package/src/status/aggregator.mjs +0 -584
  750. package/src/status/server.mjs +0 -413
  751. package/tools.json +0 -1671
  752. /package/{defaults → src/defaults}/cycle3-review-prompt.md +0 -0
  753. /package/{defaults → src/defaults}/memory-promote-prompt.md +0 -0
  754. /package/{hooks → src/hooks}/lib/permission-rules.cjs +0 -0
  755. /package/{lib → src/lib}/config-cjs.cjs +0 -0
  756. /package/{lib → src/lib}/hook-pipe-path.cjs +0 -0
  757. /package/{lib → src/lib}/mixdog-debug.cjs +0 -0
  758. /package/{lib → src/lib}/text-utils.cjs +0 -0
  759. /package/{rules → src/rules}/bridge/42-cycle3-agent.md +0 -0
  760. /package/src/{agent → runtime/agent}/orchestrator/activity-bus.mjs +0 -0
  761. /package/src/{agent → runtime/agent}/orchestrator/providers/anthropic-betas.mjs +0 -0
  762. /package/src/{agent → runtime/agent}/orchestrator/session/abort-lookup.mjs +0 -0
  763. /package/src/{agent → runtime/agent}/orchestrator/session/cache/post-edit-marks.mjs +0 -0
  764. /package/src/{agent → runtime/agent}/orchestrator/session/cache/scoped-cache-outcome.mjs +0 -0
  765. /package/src/{agent → runtime/agent}/orchestrator/session/cache/util.mjs +0 -0
  766. /package/src/{agent → runtime/agent}/orchestrator/session/read-dedup.mjs +0 -0
  767. /package/src/{agent → runtime/agent}/orchestrator/session/save-session-worker.mjs +0 -0
  768. /package/src/{agent → runtime/agent}/orchestrator/smart-bridge/session-builder.mjs +0 -0
  769. /package/src/{agent → runtime/agent}/orchestrator/tools/bash-policy-scan.mjs +0 -0
  770. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/advisory-lock.mjs +0 -0
  771. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/atomic-write.mjs +0 -0
  772. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/binary-file.mjs +0 -0
  773. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cache-layers.mjs +0 -0
  774. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cwd-utils.mjs +0 -0
  775. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/device-paths.mjs +0 -0
  776. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -0
  777. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diff-utils.mjs +0 -0
  778. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/fs-reachability.mjs +0 -0
  779. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/grep-formatting.mjs +0 -0
  780. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/hash-utils.mjs +0 -0
  781. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/list-formatting.mjs +0 -0
  782. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/open-config-tool.mjs +0 -0
  783. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-locks.mjs +0 -0
  784. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-utils.mjs +0 -0
  785. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-args.mjs +0 -0
  786. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-batch.mjs +0 -0
  787. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-constants.mjs +0 -0
  788. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image-resize.mjs +0 -0
  789. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image.mjs +0 -0
  790. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-lines.mjs +0 -0
  791. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-mode-tool.mjs +0 -0
  792. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-range-index.mjs +0 -0
  793. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-ranges.mjs +0 -0
  794. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-special-files.mjs +0 -0
  795. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-tool.mjs +0 -0
  796. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-windows.mjs +0 -0
  797. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-analysis.mjs +0 -0
  798. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-output.mjs +0 -0
  799. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-helpers.mjs +0 -0
  800. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-validation.mjs +0 -0
  801. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/text-stats.mjs +0 -0
  802. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/windows-roots.mjs +0 -0
  803. /package/src/{agent → runtime/agent}/orchestrator/tools/code-graph-prewarm-worker.mjs +0 -0
  804. /package/src/{agent → runtime/agent}/orchestrator/tools/env-scrub.mjs +0 -0
  805. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-content-cache.mjs +0 -0
  806. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-planner.mjs +0 -0
  807. /package/src/{agent → runtime/agent}/orchestrator/tools/next-call-utils.mjs +0 -0
  808. /package/src/{agent → runtime/agent}/orchestrator/tools/result-compression.mjs +0 -0
  809. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-exec-policy.mjs +0 -0
  810. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy-danger-target.mjs +0 -0
  811. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy.mjs +0 -0
  812. /package/src/{channels → runtime/channels}/lib/cli-worker-host.mjs +0 -0
  813. /package/src/{channels → runtime/channels}/lib/config-lock.mjs +0 -0
  814. /package/src/{channels → runtime/channels}/lib/event-queue.mjs +0 -0
  815. /package/src/{channels → runtime/channels}/lib/executor.mjs +0 -0
  816. /package/src/{channels → runtime/channels}/lib/format.mjs +0 -0
  817. /package/src/{channels → runtime/channels}/lib/interaction-workflows.mjs +0 -0
  818. /package/src/{channels → runtime/channels}/lib/memory-client.mjs +0 -0
  819. /package/src/{channels → runtime/channels}/lib/session-control.mjs +0 -0
  820. /package/src/{channels → runtime/channels}/lib/settings.mjs +0 -0
  821. /package/src/{channels → runtime/channels}/lib/whisper-server.mjs +0 -0
  822. /package/src/{memory → runtime/memory}/lib/agent-ipc.mjs +0 -0
  823. /package/src/{memory → runtime/memory}/lib/bridge-trace-queries.mjs +0 -0
  824. /package/src/{memory → runtime/memory}/lib/llm-worker-host.mjs +0 -0
  825. /package/src/{memory → runtime/memory}/lib/memory-cycle.mjs +0 -0
  826. /package/src/{memory → runtime/memory}/lib/memory-extraction.mjs +0 -0
  827. /package/src/{memory → runtime/memory}/lib/memory-maintenance-store.mjs +0 -0
  828. /package/src/{memory → runtime/memory}/lib/memory-recall-id-patch.mjs +0 -0
  829. /package/src/{memory → runtime/memory}/lib/memory-recall-read-query.mjs +0 -0
  830. /package/src/{memory → runtime/memory}/lib/memory-recall-scope-filter.mjs +0 -0
  831. /package/src/{memory → runtime/memory}/lib/memory-retrievers.mjs +0 -0
  832. /package/src/{memory → runtime/memory}/lib/memory-score.mjs +0 -0
  833. /package/src/{memory → runtime/memory}/lib/memory-text-utils.mjs +0 -0
  834. /package/src/{memory → runtime/memory}/lib/model-profile.mjs +0 -0
  835. /package/src/{memory → runtime/memory}/lib/project-id-resolver.mjs +0 -0
  836. /package/src/{search → runtime/search}/lib/cache.mjs +0 -0
  837. /package/src/{search → runtime/search}/lib/formatter.mjs +0 -0
  838. /package/src/{search → runtime/search}/lib/state.mjs +0 -0
  839. /package/src/{shared → runtime/shared}/abort-controller.mjs +0 -0
  840. /package/src/{shared → runtime/shared}/llm/cost.mjs +0 -0
  841. /package/src/{shared → runtime/shared}/llm/index.mjs +0 -0
  842. /package/src/{shared → runtime/shared}/llm/pid-cleanup.mjs +0 -0
  843. /package/src/{shared → runtime/shared}/llm/usage-log.mjs +0 -0
  844. /package/src/{shared → runtime/shared}/wsl.mjs +0 -0
@@ -0,0 +1,723 @@
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 { maybeRewriteWmicProcessCommand } from './shell-policy.mjs';
46
+ import { _maybeEncodePowerShellCommand } from './shell-command.mjs';
47
+ import { _captureTrackedMtimes, _trackedDriftNoteAfter, _injectionBlockTargets, getDedupedDestructiveWarnings } from './builtin/bash-tool.mjs';
48
+ import { scrubLoaderVars, scrubProviderSecrets } from './env-scrub.mjs';
49
+ import { checkExecPolicyMessage } from './bash-policy-scan.mjs';
50
+ import { startChildGuardian } from '../../../shared/child-guardian.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
+ // STREAM_BUF_BYTE_CAP — hard byte cap per in-memory stream buffer. Past the
67
+ // cap data is dropped and a truncation marker injected so a runaway command
68
+ // (e.g. `cat /dev/urandom`) can't OOM the orchestrator.
69
+ const STREAM_BUF_BYTE_CAP = 4 * 1024 * 1024; // 4 MB per stream
70
+ const STREAM_TRUNC_MARKER = '\n... [TRUNCATED — stream cap reached] ...\n';
71
+ // Output truncation runtime envelope: 400 lines / 30 KB total;
72
+ // head=80 + tail=80 lines preserved on middle-truncation.
73
+ const SMART_BASH_MAX_LINES = 400;
74
+ const SMART_BASH_MAX_BYTES = 30 * 1024;
75
+ const SMART_BASH_HEAD_LINES = 80;
76
+ const SMART_BASH_TAIL_LINES = 80;
77
+
78
+ // Marker prefix for per-command sentinels. A random suffix is added on each
79
+ // command so user output that happens to contain the static prefix does not
80
+ // terminate the command early.
81
+ const MARKER_PREFIX = '__MIXDOG_END__';
82
+
83
+ // --- ANSI strip (self-contained; mirrors builtin.mjs's implementation) ---
84
+ const _ANSI_REGEX = /\u001B(?:\[[0-?]*[ -/]*[@-~]|\][\s\S]*?(?:\u0007|\u001B\\|\u009C))/g;
85
+ const _stripAnsi = typeof nodeUtil.stripVTControlCharacters === 'function'
86
+ ? (s) => nodeUtil.stripVTControlCharacters(s)
87
+ : (s) => s.replace(_ANSI_REGEX, () => '');
88
+ function stripAnsi(s) {
89
+ if (typeof s !== 'string' || s.length === 0) return s;
90
+ return _stripAnsi(s);
91
+ }
92
+
93
+ function escapeRegex(s) {
94
+ return String(s).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
95
+ }
96
+
97
+ // --- Smart middle-truncate (shared with bash tool) ---
98
+ function smartMiddleTruncate(content) {
99
+ const s = typeof content === 'string' ? content : String(content ?? '');
100
+ if (s.length <= SMART_BASH_MAX_BYTES) {
101
+ const fastLines = s.split('\n');
102
+ if (fastLines.length <= SMART_BASH_MAX_LINES) return s;
103
+ const head = fastLines.slice(0, SMART_BASH_HEAD_LINES).join('\n');
104
+ const tail = fastLines.slice(-SMART_BASH_TAIL_LINES).join('\n');
105
+ const middle = fastLines.length - SMART_BASH_HEAD_LINES - SMART_BASH_TAIL_LINES;
106
+ return `${head}\n\n... [TRUNCATED — ${middle} lines middle elided; total ${fastLines.length} lines. Rerun with tighter filters for more] ...\n\n${tail}`;
107
+ }
108
+ const lines = s.split('\n');
109
+ if (lines.length <= SMART_BASH_MAX_LINES) {
110
+ const head = s.slice(0, SMART_BASH_MAX_BYTES);
111
+ return `${head}\n\n... [TRUNCATED — output exceeded ${Math.round(SMART_BASH_MAX_BYTES / 1024)} KB on a single line] ...`;
112
+ }
113
+ const head = lines.slice(0, SMART_BASH_HEAD_LINES).join('\n');
114
+ const tail = lines.slice(-SMART_BASH_TAIL_LINES).join('\n');
115
+ const middle = lines.length - SMART_BASH_HEAD_LINES - SMART_BASH_TAIL_LINES;
116
+ const totalKb = Math.round(s.length / 1024);
117
+ return `${head}\n\n... [TRUNCATED — ${middle} lines middle elided; total ${lines.length} lines / ${totalKb} KB. Rerun with tighter filters for more] ...\n\n${tail}`;
118
+ }
119
+
120
+ function _prependDestructiveWarning(command, text) {
121
+ const warnings = getDedupedDestructiveWarnings(command);
122
+ if (!warnings.length) return text;
123
+ return `${warnings.map((w) => `⚠️ ${w}`).join('\n')}\n${text}`;
124
+ }
125
+
126
+ // Blocked command check delegated to shell-policy.mjs (shared with
127
+ // builtin.mjs). See that module for the full pattern set and rationale.
128
+ // Locate a usable bash binary on POSIX. Windows intentionally does not
129
+ // support persistent shell sessions; one-shot commands use PowerShell
130
+ // through builtin/bash-tool.mjs. We deliberately pin bash (not sh) since
131
+ // the feature set depended on by the sentinel echo and `$?` is bash-shaped.
132
+ function resolveBash() {
133
+ if (process.platform === 'win32') {
134
+ throw new Error('persistent shell sessions are not supported on Windows; use one-shot PowerShell commands');
135
+ }
136
+ if (existsSync('/bin/bash')) return '/bin/bash';
137
+ if (existsSync('/usr/bin/bash')) return '/usr/bin/bash';
138
+ return '/bin/sh'; // fallback; `$?` + echo still work
139
+ }
140
+
141
+ // --- Session pool ---
142
+ // Map<id, { proc, lastUsed, stdoutBuf, stderrBuf, busy }>
143
+ const _sessions = new Map();
144
+ let _reaperTimer = null;
145
+ // R17 parent-exit hook installed exactly once at first _spawnSession. Without
146
+ // it, persistent bash shells orphan on server-main death (the async
147
+ // 'process-exit' path at the bottom of this module never gets to run its
148
+ // awaits when the host dies abruptly). Sync iteration of _sessions + direct
149
+ // _killProcessTree (sync taskkill on win, sync process.kill on posix).
150
+ let _parentExitInstalled = false;
151
+ function _installParentExitHook() {
152
+ if (_parentExitInstalled) return;
153
+ _parentExitInstalled = true;
154
+ const sweep = () => {
155
+ for (const [, s] of _sessions) {
156
+ try { _killProcessTree(s.proc); } catch { /* ignore */ }
157
+ }
158
+ };
159
+ try { process.on('exit', sweep); } catch { /* ignore */ }
160
+ try { process.on('SIGTERM', sweep); } catch { /* ignore */ }
161
+ try { process.on('SIGINT', sweep); } catch { /* ignore */ }
162
+ try { process.on('SIGHUP', 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
+ startChildGuardian({
327
+ childPid: proc.pid,
328
+ childGroupPid: proc.pid,
329
+ label: 'bash-session',
330
+ });
331
+ proc.stdout.setEncoding('utf-8');
332
+ proc.stderr.setEncoding('utf-8');
333
+ const entry = {
334
+ proc,
335
+ lastUsed: Date.now(),
336
+ cwd: initialCwd,
337
+ stdoutBuf: '',
338
+ stderrBuf: '',
339
+ busy: false,
340
+ dead: false,
341
+ exitInfo: null,
342
+ };
343
+ // Hard-capped concat: past STREAM_BUF_BYTE_CAP we drop further
344
+ // chunks and stamp a truncation marker once. Without this a runaway
345
+ // command (e.g. `cat /dev/urandom`) blocks until OOM long before any
346
+ // smartMiddleTruncate downstream gets a chance to trim.
347
+ entry.stdoutCapped = false;
348
+ entry.stderrCapped = false;
349
+ proc.stdout.on('data', (chunk) => {
350
+ if (entry.stdoutCapped) return;
351
+ entry.stdoutBuf += chunk;
352
+ if (entry.stdoutBuf.length >= STREAM_BUF_BYTE_CAP) {
353
+ entry.stdoutBuf = entry.stdoutBuf.slice(0, STREAM_BUF_BYTE_CAP) + STREAM_TRUNC_MARKER;
354
+ entry.stdoutCapped = true;
355
+ }
356
+ });
357
+ proc.stderr.on('data', (chunk) => {
358
+ if (entry.stderrCapped) return;
359
+ entry.stderrBuf += chunk;
360
+ if (entry.stderrBuf.length >= STREAM_BUF_BYTE_CAP) {
361
+ entry.stderrBuf = entry.stderrBuf.slice(0, STREAM_BUF_BYTE_CAP) + STREAM_TRUNC_MARKER;
362
+ entry.stderrCapped = true;
363
+ }
364
+ });
365
+ proc.on('error', (err) => {
366
+ entry.dead = true;
367
+ entry.exitInfo = { error: err?.message || String(err) };
368
+ });
369
+ proc.on('exit', (code, signal) => {
370
+ entry.dead = true;
371
+ entry.exitInfo = { code, signal };
372
+ _sessions.delete(id);
373
+ });
374
+ _sessions.set(id, entry);
375
+ _startReaper();
376
+ return entry;
377
+ }
378
+
379
+ function _getOrCreate(sessionId, initialCwd = process.cwd(), opts = {}) {
380
+ const explicit = typeof sessionId === 'string' && sessionId.length > 0;
381
+ const id = explicit ? sessionId : `sess_${randomUUID()}`;
382
+ let entry = _sessions.get(id);
383
+ if (entry && entry.dead) {
384
+ _sessions.delete(id);
385
+ entry = null;
386
+ }
387
+ if (!entry) {
388
+ if (explicit && opts.create !== true) {
389
+ return { error: `Error: unknown session_id "${id}" (pass create:true to start a new persistent session)` };
390
+ }
391
+ entry = _spawnSession(id, initialCwd);
392
+ }
393
+ return { id, entry };
394
+ }
395
+
396
+ // Core command-run: frame with sentinel, wait for marker on stdout, flush
397
+ // stderr with a small drain window, return { stdout, stderr, exit_code }.
398
+ function _runCommand(entry, command, timeoutMs, abortSignal = null) {
399
+ return new Promise((resolve, reject) => {
400
+ entry.busy = true;
401
+ // Reset buffers for this command. Anything left from a prior run is
402
+ // unexpected (we only return after the marker), but be defensive.
403
+ entry.stdoutBuf = '';
404
+ entry.stderrBuf = '';
405
+
406
+ let finished = false;
407
+ let timeoutHandle = null;
408
+ let abortHandler = null;
409
+ const marker = `${MARKER_PREFIX}:${randomUUID()}`;
410
+ const markerRe = new RegExp(`^${escapeRegex(marker)}:(-?\\d+)\\s*$`, 'm');
411
+
412
+ const onExit = () => {
413
+ if (finished) return;
414
+ fail(new Error('bash_session: shell exited before command completed'));
415
+ };
416
+
417
+ const cleanup = () => {
418
+ finished = true;
419
+ entry.busy = false;
420
+ entry.lastUsed = Date.now();
421
+ if (timeoutHandle) clearTimeout(timeoutHandle);
422
+ if (abortSignal && abortHandler) {
423
+ try { abortSignal.removeEventListener('abort', abortHandler); } catch {}
424
+ }
425
+ entry.proc.stdout.removeListener('data', onStdout);
426
+ entry.proc.removeListener('exit', onExit);
427
+ };
428
+
429
+ const settle = (result) => {
430
+ if (finished) return;
431
+ cleanup();
432
+ resolve(result);
433
+ };
434
+
435
+ const fail = (err) => {
436
+ if (finished) return;
437
+ cleanup();
438
+ reject(err);
439
+ };
440
+
441
+ const onStdout = () => {
442
+ const m = markerRe.exec(entry.stdoutBuf);
443
+ if (!m) return;
444
+ const exitCode = Number(m[1]);
445
+ // Everything before the marker line is the real stdout.
446
+ const before = entry.stdoutBuf.slice(0, m.index);
447
+ // Drain pending stderr writes adaptively. The fixed 25 ms
448
+ // window dropped late stderr from forked children that
449
+ // flushed slightly after the parent shell exited. Loop
450
+ // instead: poll the stderr buffer length and finish only
451
+ // once it's been quiescent for STDERR_QUIESCENT_MS, the
452
+ // child closed stderr, or we hit the absolute ceiling.
453
+ const drainStart = Date.now();
454
+ let lastLen = entry.stderrBuf.length;
455
+ let lastChange = drainStart;
456
+ let stderrClosed = false;
457
+ const onStderrEnd = () => { stderrClosed = true; };
458
+ try { entry.proc.stderr.once('end', onStderrEnd); } catch {}
459
+ const finish = () => {
460
+ try { entry.proc.stderr.removeListener('end', onStderrEnd); } catch {}
461
+ const stderr = entry.stderrBuf;
462
+ entry.stdoutBuf = '';
463
+ entry.stderrBuf = '';
464
+ settle({ stdout: before, stderr, exit_code: exitCode });
465
+ };
466
+ const tick = () => {
467
+ if (finished) { try { entry.proc.stderr.removeListener('end', onStderrEnd); } catch {} return; }
468
+ const now = Date.now();
469
+ const curLen = entry.stderrBuf.length;
470
+ if (curLen !== lastLen) {
471
+ lastLen = curLen;
472
+ lastChange = now;
473
+ }
474
+ if (stderrClosed) return finish();
475
+ if (now - drainStart >= STDERR_DRAIN_MAX_MS) return finish();
476
+ if (now - lastChange >= STDERR_QUIESCENT_MS) return finish();
477
+ setTimeout(tick, 10);
478
+ };
479
+ setTimeout(tick, STDERR_DRAIN_MS);
480
+ };
481
+
482
+ // Caller-driven abort (ESC / new prompt / session close). Kill the
483
+ // shell immediately and resolve with an aborted marker so the agent
484
+ // sees the cancellation rather than waiting for timeoutMs.
485
+ if (abortSignal) {
486
+ const fireAbort = () => {
487
+ if (finished) return;
488
+ const partialOut = entry.stdoutBuf || '';
489
+ const partialErr = entry.stderrBuf || '';
490
+ entry.stdoutBuf = '';
491
+ entry.stderrBuf = '';
492
+ _killProcessTree(entry.proc);
493
+ // Mark dead and remove from pool immediately so the next call
494
+ // doesn't pick up a killed shell entry.
495
+ entry.dead = true;
496
+ for (const [sid, s] of _sessions) { if (s === entry) { _sessions.delete(sid); break; } }
497
+ cleanup();
498
+ resolve({
499
+ stdout: partialOut,
500
+ stderr: partialErr,
501
+ exit_code: null,
502
+ signal: 'SIGTERM',
503
+ aborted: true,
504
+ });
505
+ };
506
+ if (abortSignal.aborted) { fireAbort(); return; }
507
+ abortHandler = fireAbort;
508
+ abortSignal.addEventListener('abort', abortHandler, { once: true });
509
+ }
510
+
511
+ entry.proc.stdout.on('data', onStdout);
512
+ // Check the buffer in case the marker already arrived (tiny commands).
513
+ onStdout();
514
+
515
+ entry.proc.on('exit', onExit);
516
+
517
+ timeoutHandle = setTimeout(() => {
518
+ // Timeout: surface what we have but don't leave the shell in a
519
+ // half-run state. Killing the process is the only reliable way
520
+ // to interrupt a stuck command; the caller can mint a new session.
521
+ const partialOut = entry.stdoutBuf;
522
+ const partialErr = entry.stderrBuf;
523
+ entry.stdoutBuf = '';
524
+ entry.stderrBuf = '';
525
+ _killProcessTree(entry.proc);
526
+ cleanup();
527
+ // Return a structured result (not a reject) so the caller
528
+ // renders a proper exit/stderr block instead of a bare Error.
529
+ resolve({
530
+ stdout: partialOut,
531
+ stderr: partialErr,
532
+ exit_code: null,
533
+ signal: 'SIGTERM',
534
+ timed_out: true,
535
+ timeout_ms: timeoutMs,
536
+ });
537
+ }, timeoutMs);
538
+
539
+ // Write the command + sentinel. Newline before `echo` in case the
540
+ // command didn't end with one. `$?` captures the final pipeline's
541
+ // exit status as of bash semantics.
542
+ const _preEncodePolicy = checkExecPolicyMessage(command);
543
+ if (_preEncodePolicy) {
544
+ fail(new Error(_preEncodePolicy.replace(/^Error: /, '')));
545
+ return;
546
+ }
547
+ const encoded = _maybeEncodePowerShellCommand(command);
548
+ const payload = `${encoded}\necho "${marker}:$?"\n`;
549
+ try {
550
+ entry.proc.stdin.write(payload, 'utf-8');
551
+ } catch (err) {
552
+ fail(err);
553
+ }
554
+ });
555
+ }
556
+
557
+ async function _syncSessionCwd(entry, timeoutMs) {
558
+ try {
559
+ const result = await _runCommand(entry, 'pwd', Math.min(timeoutMs, 2000));
560
+ if (result?.exit_code !== 0) return;
561
+ const stdout = stripAnsi(result.stdout || '').trim();
562
+ if (!stdout) return;
563
+ const lines = stdout.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
564
+ if (lines.length > 0) entry.cwd = _shellPwdToHostPath(lines[lines.length - 1]);
565
+ } catch (err) {
566
+ entry.syncError = `[bash-session] persistent-session cwd sync failed: ${err.message}`;
567
+ }
568
+ }
569
+
570
+ async function bash_session(args, cwd = process.cwd(), opts = {}) {
571
+ if (process.platform === 'win32') {
572
+ return 'Error: persistent shell sessions are not supported on Windows; use one-shot PowerShell commands without persistent/session_id.';
573
+ }
574
+ const abortSignal = opts && opts.abortSignal ? opts.abortSignal : null;
575
+ let command = typeof args?.command === 'string' ? args.command : '';
576
+ const close = args?.close === true;
577
+ const implicitSessionId = args?.persistent === true && typeof opts?.sessionId === 'string'
578
+ ? `__default__${opts.sessionId}`
579
+ : '';
580
+ const requestedSessionId = typeof args?.session_id === 'string' ? args.session_id : implicitSessionId;
581
+ if (!command && close) {
582
+ if (!requestedSessionId) return 'Error: command is required';
583
+ const existing = _sessions.get(requestedSessionId);
584
+ if (existing?.busy) return `Error: session "${requestedSessionId}" is busy executing a prior command`;
585
+ if (existing) await _killSession(requestedSessionId, 'close-requested');
586
+ return `[session: ${requestedSessionId}]\n[closed]\n\n${existing ? '(no output)' : '(no active session)'}`;
587
+ }
588
+ if (!command) return 'Error: command is required';
589
+ const wmicRewrite = maybeRewriteWmicProcessCommand(command);
590
+ if (wmicRewrite?.error) return `Error: ${wmicRewrite.error}`;
591
+ if (wmicRewrite?.command) command = wmicRewrite.command;
592
+ // R5-③: match the stateless one-shot path's full sweep so callers that
593
+ // reach bash_session directly (via session_id without going through
594
+ // executeBashTool) still get stripQuotedAndHeredoc + extractShellCInner
595
+ // + unquote-span coverage. Persistent:true callers funnel through
596
+ // executeBashTool which now pre-sweeps, but bash_session is also reached
597
+ // by close:true session reuse and by direct tool dispatch.
598
+ const _bsPolicy = checkExecPolicyMessage(command);
599
+ if (_bsPolicy) return _bsPolicy;
600
+ const explicitCwd = typeof args?.cwd === 'string' && args.cwd.trim().length > 0;
601
+ const requestedCwd = cwd || process.cwd();
602
+ const baseCwd = (() => {
603
+ if (explicitCwd) return requestedCwd;
604
+ if (requestedSessionId) {
605
+ const existing = _sessions.get(requestedSessionId);
606
+ if (existing?.cwd) return existing.cwd;
607
+ }
608
+ return requestedCwd;
609
+ })();
610
+ const largeProbe = await preflightShellLargeFileProbe(command, baseCwd);
611
+ if (largeProbe) return `Error: ${largeProbe.message}`;
612
+ const rawTimeout = typeof args?.timeout === 'number' ? args.timeout : DEFAULT_TIMEOUT_MS;
613
+ const timeoutMs = rawTimeout;
614
+ const effectiveTimeout = Math.min(Math.max(timeoutMs, 1), wmicRewrite?.timeoutMs || MAX_TIMEOUT_MS);
615
+ const resolved = _getOrCreate(requestedSessionId || args?.session_id, baseCwd, { create: args?.create === true });
616
+ if (resolved.error) return resolved.error;
617
+ const { id, entry } = resolved;
618
+ if (entry.syncError) {
619
+ const msg = entry.syncError;
620
+ delete entry.syncError;
621
+ throw new Error(msg);
622
+ }
623
+ if (entry.busy) {
624
+ return `Error: session "${id}" is busy executing a prior command`;
625
+ }
626
+ if (explicitCwd) {
627
+ const cwdErr = await _ensureSessionCwd(entry, requestedCwd, effectiveTimeout);
628
+ if (cwdErr) return cwdErr;
629
+ }
630
+
631
+ let shellEffects;
632
+ try {
633
+ shellEffects = await analyzeShellCommandEffects(command, entry.cwd || baseCwd);
634
+ } catch (err) {
635
+ return `Error: ${err?.message || String(err)}`;
636
+ }
637
+
638
+ const _bsScope = opts?.readStateScope ?? opts?.sessionId ?? null;
639
+ const _bsPreDrift = _captureTrackedMtimes(_bsScope);
640
+ let result;
641
+ try {
642
+ result = await _runCommand(entry, command, effectiveTimeout, abortSignal);
643
+ } catch (err) {
644
+ return `Error: ${err?.message || String(err)}`;
645
+ }
646
+ if (result.exit_code === 0 && shellEffects.finalCwd) {
647
+ entry.cwd = shellEffects.finalCwd;
648
+ }
649
+ // Skip cwd sync on abort: the shell was already killed, so issuing
650
+ // another `pwd` would either hang on a dead pipe or spawn a fresh
651
+ // session against caller intent. Mark dead so the next call mints a
652
+ // new shell rather than reusing this one. Same logic for timeouts.
653
+ if (result.aborted) {
654
+ entry.dead = true;
655
+ } else if (!close && !result.timed_out) {
656
+ await _syncSessionCwd(entry, effectiveTimeout);
657
+ }
658
+ if (shellEffects.mutationMode === 'paths') {
659
+ invalidateBuiltinResultCache(shellEffects.paths);
660
+ markCodeGraphDirtyPaths(shellEffects.paths);
661
+ } else if (shellEffects.mutationMode === 'global') {
662
+ invalidateBuiltinResultCache();
663
+ drainCodeGraphCache();
664
+ }
665
+ const _bsDriftNote = _trackedDriftNoteAfter(_bsScope, _bsPreDrift);
666
+
667
+ if (close) {
668
+ await _killSession(id, 'close-requested');
669
+ }
670
+
671
+ const stdoutClean = stripAnsi(result.stdout || '');
672
+ const stderrClean = stripAnsi(result.stderr || '');
673
+ const stdoutT = smartMiddleTruncate(stdoutClean);
674
+ const stderrT = stderrClean ? smartMiddleTruncate(stderrClean) : '';
675
+
676
+ // Structured header so the agent can parse session_id + exit_code out
677
+ // of the text response without bespoke JSON. Keeps parity with the
678
+ // `bash` tool's free-form `[exit code: N]` marker but additive.
679
+ const headerLines = [`[session: ${id}]`];
680
+ if (wmicRewrite?.note) headerLines.push(wmicRewrite.note);
681
+ if (result.aborted) {
682
+ headerLines.push(`[aborted: caller cancelled — session killed]`);
683
+ } else if (result.timed_out) {
684
+ headerLines.push(`[timeout: ${result.timeout_ms} ms — session killed]`);
685
+ } else if (result.exit_code !== 0 && result.exit_code !== null) {
686
+ headerLines.push(`[exit code: ${result.exit_code}]`);
687
+ }
688
+ if (close) headerLines.push(`[closed]`);
689
+ const header = headerLines.join('\n');
690
+
691
+ const body = stdoutT || (stderrT ? '' : '(no output)');
692
+ const stderrBlock = stderrT ? `\n\n[stderr]\n${stderrT}` : '';
693
+ return _prependDestructiveWarning(command, `${header}\n\n${body}${stderrBlock}${_bsDriftNote}`);
694
+ }
695
+
696
+ // BASH_SESSION_TOOL_DEFS removed in 0.1.126: the `bash` tool's
697
+ // `persistent:true` option absorbed every use case; the dedicated
698
+ // `bash_session` schema only added prompt bytes and triggered LLM
699
+ // hallucinations of the legacy name. Implementation (executeBashSessionTool,
700
+ // closeBashSession) stays — `bash` with persistent:true routes here.
701
+ export async function executeBashSessionTool(name, args, _cwd, opts = {}) {
702
+ switch (name) {
703
+ case 'bash_session':
704
+ return bash_session(args || {}, _cwd || process.cwd(), opts);
705
+ default:
706
+ throw new Error(`Unknown bash-session tool: ${name}`);
707
+ }
708
+ }
709
+
710
+ export function closeBashSession(sessionId, reason = 'external-close') {
711
+ if (!sessionId || !_sessions.has(sessionId)) return false;
712
+ _killSession(sessionId, reason);
713
+ return true;
714
+ }
715
+
716
+ // Best-effort cleanup on process exit so orphan bash children don't linger
717
+ // when the plugin host shuts down. Self-registered exit drain; bare 'exit' hook stays as idempotent backup.
718
+ export function drainBashSessions() {
719
+ for (const id of [..._sessions.keys()]) _killSession(id, 'process-exit');
720
+ }
721
+ if (typeof process?.on === 'function') {
722
+ process.on('exit', drainBashSessions);
723
+ }