mixdog 0.7.18 → 0.8.1

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