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,982 @@
1
+ import { statSync } from 'fs';
2
+ import { isAbsolute, resolve } from 'path';
3
+ import { trueCasePath } from './path-utils.mjs';
4
+ import {
5
+ canonicalizeGlobSlashes,
6
+ coerceShapeFlex,
7
+ extractGlobBaseDirectory,
8
+ hasGlobMagic,
9
+ normalizeGlobArgs,
10
+ normalizeGrepArgs,
11
+ normalizeInputPath,
12
+ normalizeOutputPath,
13
+ normalizeSearchPattern,
14
+ resolveAgainstCwd,
15
+ } from './path-utils.mjs';
16
+ import {
17
+ buildGlobCacheKey,
18
+ buildGrepCacheKey,
19
+ buildGrepRgArgs,
20
+ DEFAULT_IGNORE_GLOBS,
21
+ } from './search-builders.mjs';
22
+ import { runRg, runRgWindowedLines } from './rg-runner.mjs';
23
+ import { markScopedCacheIncomplete } from '../../session/cache/scoped-cache-outcome.mjs';
24
+ import {
25
+ groupGrepContentByFile,
26
+ normalizeGrepLine,
27
+ splitGrepCountPrefix,
28
+ splitGrepLinePrefix,
29
+ } from './grep-formatting.mjs';
30
+ import {
31
+ cacheGet,
32
+ cacheSet,
33
+ statPathsForMtime,
34
+ } from './cache-layers.mjs';
35
+ import { recordReadSnapshot } from './read-snapshot-runtime.mjs';
36
+ import { applyGrepContextLeadPolicy, GREP_CONTEXT_MAX } from './arg-guard.mjs';
37
+
38
+ function expandLegacyEscapedAlternationPattern(rawPattern) {
39
+ if (typeof rawPattern !== 'string' || !rawPattern.includes('\\|')) return null;
40
+ const parts = rawPattern.split('\\|').map((part) => part.trim()).filter(Boolean);
41
+ return parts.length > 1 ? parts : null;
42
+ }
43
+
44
+ // Deterministic ENOENT recovery: when a grep path does not exist, surface
45
+ // indexed files that share the missing path's basename, turning a guessed or
46
+ // misplaced path (e.g. session/result-compression.mjs vs the real
47
+ // tools/result-compression.mjs) into the actual file in one step. Exact
48
+ // basename only — no stem/token fuzzing — so the hint is high-signal and
49
+ // noise-free. Invariant: every ENOENT runs the same basename lookup; there is
50
+ // no "guessed a lot" branch. Returns '' (appends nothing) when no same-named
51
+ // indexed file exists or the glob child is unavailable.
52
+ async function _suggestIndexedPaths(missingPath, executeChildBuiltinTool, workDir) {
53
+ if (typeof executeChildBuiltinTool !== 'function') return '';
54
+ const base = String(missingPath).replace(/\\/g, '/').split('/').pop();
55
+ // Skip when there is no usable basename or it carries glob magic (the
56
+ // pattern, not a literal filename, would not map to a real file).
57
+ if (!base || /[*?[\]{}]/.test(base)) return '';
58
+ try {
59
+ const out = await executeChildBuiltinTool('glob', { pattern: `**/${base}`, head_limit: 6 }, workDir);
60
+ if (typeof out !== 'string') return '';
61
+ // Drop ONLY the exact diagnostic forms glob emits: the empty-result line
62
+ // ("(no files found ...", "(no entries after offset ...") and the
63
+ // suffix/warning lines ("... [N more entries]", "... [warning] ...").
64
+ // A broad startsWith('(' / '...' / 'Error') would wrongly drop real
65
+ // paths like ErrorBoundary.mjs or a "(draft)/x.mjs" leading segment.
66
+ const hits = out.split('\n')
67
+ .filter((s) => s && !/^\(no (?:files found|entries\b)/.test(s) && !/^\.\.\. \[/.test(s))
68
+ .map((s) => s.trim())
69
+ .filter(Boolean)
70
+ .slice(0, 5);
71
+ return hits.length ? `\n[path not found here; same-named indexed file(s): ${hits.join(', ')}]` : '';
72
+ } catch {
73
+ return '';
74
+ }
75
+ }
76
+
77
+ function relativePathPrefix(pathPrefix, workDir) {
78
+ if (!workDir) return pathPrefix;
79
+ const cwdFwd = workDir.replace(/\\/g, '/').replace(/\/+$/, '');
80
+ const absFwd = String(pathPrefix || '').replace(/\\/g, '/');
81
+ const haystack = process.platform === 'win32' ? absFwd.toLocaleLowerCase() : absFwd;
82
+ const needle = process.platform === 'win32' ? cwdFwd.toLocaleLowerCase() : cwdFwd;
83
+ if (haystack.startsWith(needle + '/') || haystack === needle) {
84
+ return absFwd.slice(cwdFwd.length + 1) || '.';
85
+ }
86
+ return pathPrefix;
87
+ }
88
+
89
+ function relativeGrepLine(line, workDir, pathOnly = false, outputMode = 'content', filenameOmitted = false) {
90
+ const normalized = normalizeGrepLine(line, pathOnly, outputMode, filenameOmitted);
91
+ if (!workDir) return normalized;
92
+ if (pathOnly) return relativePathPrefix(normalized, workDir);
93
+ if (filenameOmitted) return normalized;
94
+ const split = splitGrepLinePrefix(normalized);
95
+ if (split) {
96
+ return relativePathPrefix(normalized.slice(0, split.pathEnd), workDir) + normalized.slice(split.pathEnd);
97
+ }
98
+ if (outputMode === 'count') {
99
+ const countSplit = splitGrepCountPrefix(normalized);
100
+ if (countSplit) {
101
+ return relativePathPrefix(normalized.slice(0, countSplit.pathEnd), workDir) + normalized.slice(countSplit.pathEnd);
102
+ }
103
+ }
104
+ return normalized;
105
+ }
106
+
107
+ function relativeSearchResultPath(path, workDir) {
108
+ const normalizedWorkDir = normalizeOutputPath(workDir);
109
+ const normalizedAbs = normalizeOutputPath(path);
110
+ if (normalizedAbs.startsWith(normalizedWorkDir + '/') || normalizedAbs.startsWith(normalizedWorkDir + '\\')) {
111
+ return normalizedAbs.slice(normalizedWorkDir.length + 1);
112
+ }
113
+ return normalizedAbs;
114
+ }
115
+
116
+ function uniqueStrings(values) {
117
+ return Array.from(new Set(values.filter((value) => typeof value === 'string' && value)));
118
+ }
119
+
120
+ function isRgRegexParseError(err) {
121
+ const msg = `${err?.stderr || ''}\n${err?.message || err || ''}`;
122
+ return /regex parse error/i.test(msg);
123
+ }
124
+
125
+ function regexPatternToFixedTerms(pattern) {
126
+ const raw = String(pattern || '');
127
+ if (!raw) return [];
128
+ return raw
129
+ .split(/\\?\|/g)
130
+ .map((part) => part.trim())
131
+ .map((part) => part
132
+ .replace(/\\[bB]/g, '')
133
+ .replace(/^\^/, '')
134
+ .replace(/\$$/, '')
135
+ .replace(/\\([\\.^$*+?()[\]{}|/-])/g, '$1')
136
+ .trim())
137
+ .filter((part) => part.length > 0);
138
+ }
139
+
140
+ function coerceNonNegInt(value) {
141
+ if (value === undefined || value === null || value === '') return null;
142
+ const n = Number(value);
143
+ if (!Number.isFinite(n) || n < 0) return NaN;
144
+ return Math.floor(n);
145
+ }
146
+
147
+ function globMtimeTiePath(entry) {
148
+ const p = String(entry?.path ?? entry?.full ?? '');
149
+ return process.platform === 'win32' ? p.toLocaleLowerCase() : p;
150
+ }
151
+
152
+ // CC parity (GrepTool.ts): a single glob string may pack multiple filters
153
+ // separated by whitespace or commas, e.g. "*.ts,*.tsx" or "*.ts *.tsx". Split
154
+ // each into its own --glob. Brace patterns ("*.{ts,tsx}") are left intact so
155
+ // their internal commas are not torn apart.
156
+ function splitGlobString(value) {
157
+ const out = [];
158
+ const str = String(value);
159
+ let depth = 0;
160
+ let token = '';
161
+ const flush = () => {
162
+ const trimmed = token.trim();
163
+ if (trimmed) out.push(trimmed);
164
+ token = '';
165
+ };
166
+ for (const ch of str) {
167
+ if (ch === '{') {
168
+ depth++;
169
+ token += ch;
170
+ } else if (ch === '}') {
171
+ if (depth > 0) depth--;
172
+ token += ch;
173
+ } else if (depth === 0 && (ch === ',' || /\s/.test(ch))) {
174
+ flush();
175
+ } else {
176
+ token += ch;
177
+ }
178
+ }
179
+ flush();
180
+ return out;
181
+ }
182
+
183
+ function resolveSearchScope(root, workDir) {
184
+ return isAbsolute(root) ? resolve(root) : resolveAgainstCwd(root, workDir);
185
+ }
186
+
187
+ function isUncOrSmbPath(path) {
188
+ if (typeof path !== 'string' || !path) return false;
189
+ return path.startsWith('\\\\') || path.startsWith('//');
190
+ }
191
+
192
+ function uncRefusalMessage(toolName, original, resolved) {
193
+ const shown = normalizeOutputPath(resolved || original || '');
194
+ return `Error: ${toolName} refuses UNC/SMB path ${JSON.stringify(shown)}; remote share access is blocked to prevent NTLM credential leaks`;
195
+ }
196
+
197
+ function basePathDiagnostic(basePaths, workDir) {
198
+ return basePaths.map((basePath) => {
199
+ const resolved = resolveSearchScope(basePath, workDir);
200
+ try {
201
+ const st = statSync(resolved);
202
+ return `${normalizeOutputPath(basePath)}: ${st.isDirectory() ? 'path exists (dir)' : 'path exists (file)'}`;
203
+ } catch (err) {
204
+ return `${normalizeOutputPath(basePath)}: path does not exist (${err?.code || 'ENOENT'})`;
205
+ }
206
+ }).join('; ');
207
+ }
208
+
209
+ function grepMissingPatternMessage() {
210
+ return 'Error: grep requires pattern.';
211
+ }
212
+
213
+ function globMissingPatternMessage() {
214
+ return 'Error: glob requires pattern.';
215
+ }
216
+
217
+ function parseGrepCountLine(line) {
218
+ const text = String(line || '');
219
+ const searchFrom = /^[A-Za-z]:/.test(text) ? 2 : 0;
220
+ const idx = text.lastIndexOf(':');
221
+ if (idx <= searchFrom) return null;
222
+ const count = Number(text.slice(idx + 1));
223
+ if (!Number.isFinite(count) || count <= 0) return null;
224
+ const path = text.slice(0, idx);
225
+ if (!path) return null;
226
+ return { path, count };
227
+ }
228
+
229
+ // Per-pattern file-count probe for array grby: runs ONE rg --files-with-matches
230
+ // per pattern (reusing the same scope/glob/type/flags as the merged search) so
231
+ // the summary line can surface patterns that matched zero files — otherwise the
232
+ // merged result hides which member of the array contributed nothing.
233
+ async function _perPatternFileCounts({ patterns, searchPath, globPatterns, caseInsensitive, multilineMode, fileType, workDir }) {
234
+ const results = await Promise.all(patterns.map(async (pattern) => {
235
+ try {
236
+ const rgArgs = buildGrepRgArgs({
237
+ patterns: [pattern],
238
+ searchPath,
239
+ globPatterns,
240
+ outputMode: 'files_with_matches',
241
+ caseInsensitive,
242
+ showLineNumbers: false,
243
+ beforeN: null,
244
+ afterN: null,
245
+ contextN: null,
246
+ multilineMode,
247
+ fileType,
248
+ onlyMatching: false,
249
+ });
250
+ const stdout = await runRg(rgArgs, { cwd: workDir });
251
+ // A boxed partial/truncated stdout means the count is not the true
252
+ // total — render '?' rather than a misleadingly-low or zero number.
253
+ if (stdout && typeof stdout === 'object' && (stdout.partial || stdout.truncated)) return null;
254
+ return String(stdout).split('\n').filter(Boolean).length;
255
+ } catch {
256
+ // Probe threw → count unknown, NOT zero.
257
+ return null;
258
+ }
259
+ }));
260
+ // Quote first (so newline/control chars can't inject footer lines), then
261
+ // truncate the quoted string to 40 chars — matches the no-match path.
262
+ const trunc = (p) => {
263
+ const q = JSON.stringify(p);
264
+ return q.length > 40 ? `${q.slice(0, 40)}...` : q;
265
+ };
266
+ return `\n# per-pattern: ${patterns.map((p, i) => `${trunc(p)}=${results[i] === null ? '?' : `${results[i]} files`}`).join(', ')}`;
267
+ }
268
+
269
+ function formatGrepOutput({ windowed, totalWindowed, totalKnown, headLimit, offset, outputMode, patterns: _patterns, beforeN, afterN, contextN, searchPath, grepResolvedPath: _grepResolvedPath, workDir, globPatterns: _globPatterns, fileType: _fileType, filenameOmitted = false, prefix = '', broadAdvisory: _broadAdvisory = true }) {
270
+ const lines = headLimit === Infinity ? windowed : windowed.slice(0, headLimit);
271
+ const normalized = lines.map((line) => relativeGrepLine(line, workDir, outputMode === 'files_with_matches', outputMode, filenameOmitted));
272
+ const remaining = Math.max(0, totalWindowed - lines.length);
273
+ const shown = lines.length;
274
+ const total = totalWindowed;
275
+ const scopePath = JSON.stringify(normalizeOutputPath(searchPath));
276
+ const truncated = (remaining > 0 || !totalKnown)
277
+ ? (totalKnown
278
+ ? `\n[Showing ${shown} of ${total} results; pass offset:${offset + shown} for more]`
279
+ : `\n[Showing ${shown} (more matches exist — use output_mode:'count' for the exact total on ${scopePath}); pass offset:${offset + shown} for more]`)
280
+ : '';
281
+
282
+ let countSummary = '';
283
+ if (outputMode === 'count') {
284
+ let totalMatches = 0;
285
+ let fileCount = 0;
286
+ for (const line of normalized) {
287
+ const m = line.match(/(?:^|:)(\d+)$/);
288
+ if (m) { totalMatches += Number(m[1]); fileCount++; }
289
+ }
290
+ countSummary = `\n[total ${totalMatches} match${totalMatches === 1 ? '' : 'es'} across ${fileCount} file${fileCount === 1 ? '' : 's'}]`;
291
+ }
292
+ const hasContext = (beforeN > 0 || afterN > 0 || contextN > 0);
293
+ const groupedBody = (outputMode === 'content' && !hasContext && !filenameOmitted)
294
+ ? groupGrepContentByFile(normalized)
295
+ : normalized.join('\n');
296
+ const body = groupedBody + truncated + countSummary;
297
+ return `${prefix}${body}`;
298
+ }
299
+
300
+ export async function executeGrepTool(args, workDir, executeChildBuiltinTool, readStateScope = null, options = {}) {
301
+ args = normalizeGrepArgs(args);
302
+ // Shape context immediately before deriving rg flags. This keeps the
303
+ // Lead-direct MCP path and direct executeGrepTool callers on the same
304
+ // policy even if they bypass or race the outer builtin arg guard.
305
+ applyGrepContextLeadPolicy(args);
306
+ args.path = normalizeInputPath(args.path);
307
+ args.pattern = coerceShapeFlex(args.pattern);
308
+ args.glob = coerceShapeFlex(args.glob);
309
+ const rawPattern = args.pattern;
310
+ const rawPatterns = Array.isArray(rawPattern)
311
+ ? rawPattern.filter(p => typeof p === 'string' && p)
312
+ : (rawPattern ? (expandLegacyEscapedAlternationPattern(String(rawPattern)) || [String(rawPattern)]) : []);
313
+ const patterns = uniqueStrings(rawPatterns.map(normalizeSearchPattern));
314
+ if (patterns.length === 0) {
315
+ if (args.glob || hasGlobMagic(args.path)) {
316
+ const globArgs = {
317
+ pattern: hasGlobMagic(args.path) ? args.path : args.glob,
318
+ path: hasGlobMagic(args.path) ? undefined : (args.path || '.'),
319
+ };
320
+ if (args.head_limit !== undefined) globArgs.head_limit = args.head_limit;
321
+ if (args.offset !== undefined) globArgs.offset = args.offset;
322
+ return executeChildBuiltinTool('glob', globArgs, workDir);
323
+ }
324
+ return grepMissingPatternMessage();
325
+ }
326
+
327
+ const GREP_MULTILINE_PATTERN_CAP = 5;
328
+ const GREP_ARRAY_PATTERN_CAP = 20;
329
+ const multilineMode = args.multiline === true;
330
+ if (multilineMode && patterns.length > GREP_MULTILINE_PATTERN_CAP) {
331
+ return `Error: multiline:true with more than ${GREP_MULTILINE_PATTERN_CAP} patterns is not allowed (got ${patterns.length}); split into separate grep calls`;
332
+ }
333
+ if (patterns.length > GREP_ARRAY_PATTERN_CAP) {
334
+ return `Error: pattern array exceeds the ${GREP_ARRAY_PATTERN_CAP}-pattern cap (got ${patterns.length}); split into separate grep calls`;
335
+ }
336
+
337
+ let searchPath = args.path || '.';
338
+ const rawGlob = args.glob;
339
+ const rawGlobs = uniqueStrings((Array.isArray(rawGlob)
340
+ ? rawGlob.filter(g => typeof g === 'string' && g)
341
+ : (rawGlob ? [String(rawGlob)] : []))
342
+ .flatMap(splitGlobString)
343
+ .map(normalizeInputPath));
344
+ if (hasGlobMagic(searchPath)) {
345
+ const { baseDir, relativePattern } = extractGlobBaseDirectory(searchPath);
346
+ searchPath = baseDir || '.';
347
+ rawGlobs.unshift(relativePattern.replace(/^\//, ''));
348
+ }
349
+ const grepResolvedPath = resolveSearchScope(searchPath, workDir);
350
+ if (isUncOrSmbPath(searchPath) || isUncOrSmbPath(grepResolvedPath)) {
351
+ return uncRefusalMessage('grep', searchPath, grepResolvedPath);
352
+ }
353
+ const globPatterns = [];
354
+ const rootFwd = normalizeOutputPath(grepResolvedPath).replace(/\/+$/, '');
355
+ for (const g of rawGlobs) {
356
+ if (isAbsolute(g)) {
357
+ const { baseDir, relativePattern } = extractGlobBaseDirectory(g);
358
+ const baseFwd = baseDir ? normalizeOutputPath(baseDir).replace(/\/+$/, '') : '';
359
+ const rel = relativePattern.replace(/^\//, '');
360
+ // Windows is case-insensitive: compare path casing accordingly so a
361
+ // valid in-root absolute glob is not rejected when its drive/dir
362
+ // casing differs from the resolved root.
363
+ const ci = process.platform === 'win32';
364
+ const baseCmp = ci ? baseFwd.toLowerCase() : baseFwd;
365
+ const rootCmp = ci ? rootFwd.toLowerCase() : rootFwd;
366
+ if (!baseFwd || baseCmp === rootCmp) {
367
+ globPatterns.push(rel);
368
+ } else if (baseCmp.startsWith(rootCmp + '/')) {
369
+ const prefix = baseFwd.slice(rootFwd.length + 1);
370
+ globPatterns.push(prefix ? `${prefix}/${rel}` : rel);
371
+ } else {
372
+ return `Error: absolute glob ${JSON.stringify(g)} resolves outside search root ${JSON.stringify(rootFwd)}; pass a relative glob or move the search path`;
373
+ }
374
+ } else {
375
+ globPatterns.push(g);
376
+ }
377
+ }
378
+ // ripgrep `--glob` uses forward slashes on all platforms; canonicalize
379
+ // `\`→`/` (win32 only) so a `**\*.ts` filter matches instead of being
380
+ // parsed as an escape sequence.
381
+ const normalizedGlobPatterns = uniqueStrings(globPatterns.map(canonicalizeGlobSlashes));
382
+
383
+ const ALLOWED_OUTPUT_MODES = new Set(['files_with_matches', 'content', 'count']);
384
+ const rawOutputMode = typeof args.output_mode === 'string' ? args.output_mode.trim() : '';
385
+ if (rawOutputMode && !ALLOWED_OUTPUT_MODES.has(rawOutputMode)) {
386
+ return `Error: invalid output_mode ${JSON.stringify(args.output_mode)}; expected one of ${[...ALLOWED_OUTPUT_MODES].join(', ')}`;
387
+ }
388
+ // Default to `content` when output_mode is omitted. A pattern is always
389
+ // present here (the no-pattern case returned above), so this is a content
390
+ // search — it should return the matching lines WITH line numbers, not just
391
+ // filenames. Filename-only was forcing callers to re-grep for the actual
392
+ // coordinates (the explorer over-iteration root cause). `files_with_matches`
393
+ // is now opt-in; pure filename discovery belongs to `glob`.
394
+ const outputMode = rawOutputMode || 'content';
395
+ const headLimitRaw = args.head_limit;
396
+ const headLimitCoerced = coerceNonNegInt(headLimitRaw);
397
+ if (Number.isNaN(headLimitCoerced)) {
398
+ return `Error: invalid head_limit ${JSON.stringify(headLimitRaw)}; expected a non-negative integer (0 = unlimited)`;
399
+ }
400
+ const headLimit = headLimitCoerced === null
401
+ ? 80
402
+ : (headLimitCoerced === 0 ? Infinity : headLimitCoerced);
403
+ const offsetCoerced = coerceNonNegInt(args.offset);
404
+ if (Number.isNaN(offsetCoerced)) {
405
+ return `Error: invalid offset ${JSON.stringify(args.offset)}; expected a non-negative integer`;
406
+ }
407
+ const offset = offsetCoerced === null || offsetCoerced === 0 ? 0 : offsetCoerced;
408
+ const caseInsensitive = args['-i'] === true;
409
+ const showLineNumbers = args['-n'] !== false;
410
+ const coerceContext = (value) => {
411
+ if (value === undefined || value === null || value === '') return null;
412
+ const n = Number(value);
413
+ if (!Number.isFinite(n) || n < 0) return NaN;
414
+ return Math.min(Math.floor(n), GREP_CONTEXT_MAX);
415
+ };
416
+ let afterN = coerceContext(args['-A']);
417
+ let beforeN = coerceContext(args['-B']);
418
+ let contextN = args['-C'] !== undefined && args['-C'] !== null && args['-C'] !== ''
419
+ ? coerceContext(args['-C'])
420
+ : coerceContext(args.context);
421
+ if (contextN !== null && contextN > 0) {
422
+ if (afterN === 0) afterN = null;
423
+ if (beforeN === 0) beforeN = null;
424
+ }
425
+ for (const [name, value] of [['-A', afterN], ['-B', beforeN], ['-C', contextN]]) {
426
+ if (Number.isNaN(value)) {
427
+ return `Error: invalid context option ${name}; expected a non-negative finite integer`;
428
+ }
429
+ }
430
+ const rawType = args.type;
431
+ let fileType = '';
432
+ let fileTypes = [];
433
+ if (Array.isArray(rawType)) {
434
+ for (const entry of rawType) {
435
+ if (typeof entry !== 'string') {
436
+ return `Error: invalid type entry ${JSON.stringify(entry)}; expected string`;
437
+ }
438
+ const t = entry.trim();
439
+ if (t) fileTypes.push(t);
440
+ }
441
+ } else if (typeof rawType === 'string') {
442
+ const t = rawType.trim();
443
+ if (t) {
444
+ fileTypes = [t];
445
+ fileType = t;
446
+ }
447
+ } else if (rawType !== undefined && rawType !== null) {
448
+ return `Error: invalid type ${JSON.stringify(rawType)}; expected string or string[]`;
449
+ }
450
+ if (fileTypes.length > 1) fileType = fileTypes;
451
+ else if (fileTypes.length === 1) fileType = fileTypes[0];
452
+ const cacheKey = buildGrepCacheKey({
453
+ patterns,
454
+ searchPath: normalizeOutputPath(grepResolvedPath),
455
+ globPatterns: normalizedGlobPatterns,
456
+ outputMode,
457
+ headLimit,
458
+ offset,
459
+ caseInsensitive,
460
+ showLineNumbers,
461
+ beforeN,
462
+ afterN,
463
+ contextN,
464
+ multilineMode,
465
+ onlyMatching: args['-o'] === true,
466
+ fileType,
467
+ });
468
+ // Single-file grep registers a whole-file read snapshot (parity with
469
+ // apply_patch), satisfying the read-before-edit guard while keeping drift
470
+ // detection intact via the auto-computed contentHash. Directory/glob greps
471
+ // do NOT record.
472
+ const recordGrepReadSnapshot = (st) => {
473
+ try {
474
+ if (st && st.isFile()) {
475
+ recordReadSnapshot(grepResolvedPath, st, readStateScope, { source: 'grep' });
476
+ }
477
+ } catch {}
478
+ };
479
+
480
+ const cached = cacheGet(cacheKey);
481
+ // Cache-hit returns a PRIOR grep's output; the file may have changed since
482
+ // that result was cached. Recording a fresh whole-file snapshot here would
483
+ // mismatch what the caller actually saw (stale cached lines) and defeat
484
+ // drift detection. So only the fresh-compute path (below) records a read.
485
+ if (cached !== null) return cached;
486
+
487
+ let grepStat;
488
+ try { grepStat = statSync(grepResolvedPath); }
489
+ catch (err) {
490
+ const msg = `Error: path does not exist: ${normalizeOutputPath(grepResolvedPath)} (${err?.code || 'ENOENT'})`;
491
+ return msg + await _suggestIndexedPaths(grepResolvedPath, executeChildBuiltinTool, workDir);
492
+ }
493
+ const filenameOmitted = grepStat.isFile();
494
+
495
+ // rg builds --glob overrides rooted at its process cwd and relativizes each
496
+ // candidate against it with a CASE-SENSITIVE prefix strip; workDir is
497
+ // case-normalized (lowercased) while callers pass real-cased absolute paths,
498
+ // so the strip fails and slash-anchored globs (src/**/*.mjs) silently match
499
+ // nothing. Spawn rg at the TRUE-CASED search root so relativization — and
500
+ // therefore glob anchoring — always engages. Relative searchPath keeps the
501
+ // workDir cwd (both sides already share workDir's casing).
502
+ let rgSpawnCwd = workDir;
503
+ if (isAbsolute(searchPath)) {
504
+ searchPath = trueCasePath(searchPath);
505
+ if (grepStat.isDirectory()) rgSpawnCwd = searchPath;
506
+ }
507
+
508
+ const GREP_CONTENT_HARD_CAP = 300;
509
+ try {
510
+ const callerExplicitUnlimited = headLimitCoerced === 0;
511
+ const effectiveHeadLimit = headLimit === Infinity
512
+ ? (callerExplicitUnlimited ? Infinity : (outputMode === 'content' ? GREP_CONTENT_HARD_CAP : Infinity))
513
+ : headLimit;
514
+ const rgArgs = buildGrepRgArgs({
515
+ patterns,
516
+ searchPath,
517
+ globPatterns: normalizedGlobPatterns,
518
+ outputMode,
519
+ caseInsensitive,
520
+ showLineNumbers,
521
+ beforeN,
522
+ afterN,
523
+ contextN,
524
+ multilineMode,
525
+ fileType,
526
+ onlyMatching: args['-o'] === true,
527
+ });
528
+ let windowed;
529
+ let totalWindowed = 0;
530
+ let totalKnown = true;
531
+ let rgPartialSuffix = '';
532
+ if (effectiveHeadLimit !== Infinity) {
533
+ const summaryLimit = outputMode === 'content' ? 120 : 0;
534
+ const streamed = await runRgWindowedLines(rgArgs, { cwd: rgSpawnCwd }, {
535
+ offset,
536
+ limit: effectiveHeadLimit,
537
+ summaryLimit,
538
+ });
539
+ windowed = streamed.lines;
540
+ totalWindowed = streamed.totalSeen;
541
+ totalKnown = streamed.complete;
542
+ if (streamed.partial) {
543
+ totalKnown = false;
544
+ rgPartialSuffix = streamed.timeout
545
+ ? '\n[warning] rg timed out; partial results shown. Narrow path/glob/pattern for a complete result.'
546
+ : streamed.rgStderr
547
+ ? `\n[warning] rg exit 2 (partial results): ${String(streamed.rgStderr).trim().slice(0, 300)}`
548
+ : '\n[warning] rg exit 2 (partial results)';
549
+ }
550
+ } else {
551
+ const stdout = await runRg(rgArgs, { cwd: rgSpawnCwd });
552
+ const allLines = String(stdout).split('\n').filter(Boolean);
553
+ windowed = offset > 0 ? allLines.slice(offset) : allLines;
554
+ totalWindowed = windowed.length;
555
+ // runRg boxes stdout + sets .truncated when the 20MB stdout cap
556
+ // tripped (rg-runner). Mark the result incomplete so formatGrepOutput
557
+ // emits the truncation notice instead of presenting it as complete.
558
+ if (typeof stdout === 'object' && stdout.truncated) totalKnown = false;
559
+ if (typeof stdout === 'object' && stdout.partial) {
560
+ totalKnown = false;
561
+ rgPartialSuffix = stdout.timeout
562
+ ? '\n[warning] rg timed out; partial results shown. Narrow path/glob/pattern for a complete result.'
563
+ : stdout.rgStderr
564
+ ? `\n[warning] rg exit 2 (partial results): ${String(stdout.rgStderr).trim().slice(0, 300)}`
565
+ : '\n[warning] rg exit 2 (partial results)';
566
+ }
567
+ }
568
+ let body = formatGrepOutput({
569
+ windowed,
570
+ totalWindowed,
571
+ totalKnown,
572
+ headLimit,
573
+ offset,
574
+ outputMode,
575
+ patterns,
576
+ beforeN,
577
+ afterN,
578
+ contextN,
579
+ searchPath,
580
+ grepResolvedPath,
581
+ workDir,
582
+ globPatterns: normalizedGlobPatterns,
583
+ fileType,
584
+ filenameOmitted,
585
+ });
586
+ if (!body) {
587
+ const pathInfo = grepStat.isDirectory() ? 'path exists (dir)' : 'path exists (file)';
588
+ const patternStr = patterns.length === 1 ? JSON.stringify(patterns[0]) : JSON.stringify(patterns);
589
+ const globStr = normalizedGlobPatterns.length > 0 ? ` glob=${JSON.stringify(normalizedGlobPatterns)}` : '';
590
+ body = `(no matches) pattern=${patternStr} path=${searchPath}${globStr}; ${pathInfo}`;
591
+ // Cased-letter hint: a no-match single-pattern search whose pattern
592
+ // carries cased letters may have failed only on case. Run ONE
593
+ // case-insensitive probe; if it would match, nudge toward `-i`.
594
+ // Skipped for arrays (single-pattern support is enough) and when
595
+ // `-i` is already set or the pattern has no cased letters. Also
596
+ // require a true zero-match search: an empty body with offset>0 (or
597
+ // pre-offset matches) just means the window skipped past real
598
+ // case-sensitive hits, so the hint would be misleading.
599
+ const trueZeroMatch = offset === 0 && totalWindowed === 0;
600
+ if (trueZeroMatch && !caseInsensitive && patterns.length === 1 && /[A-Za-z]/.test(patterns[0])) {
601
+ try {
602
+ const probeArgs = buildGrepRgArgs({
603
+ patterns,
604
+ searchPath,
605
+ globPatterns: normalizedGlobPatterns,
606
+ outputMode: 'files_with_matches',
607
+ caseInsensitive: true,
608
+ showLineNumbers: false,
609
+ beforeN: null,
610
+ afterN: null,
611
+ contextN: null,
612
+ multilineMode,
613
+ fileType,
614
+ onlyMatching: false,
615
+ });
616
+ const probeOut = await runRg(probeArgs, { cwd: rgSpawnCwd });
617
+ if (String(probeOut).split('\n').some(Boolean)) {
618
+ body += ' (case-insensitive would match — try -i)';
619
+ }
620
+ } catch { /* best-effort hint */ }
621
+ }
622
+ }
623
+ // Array-pattern visibility: append a per-pattern file-count summary so
624
+ // zero-hit members of the merged result are not silently hidden.
625
+ let perPatternSummary = '';
626
+ if (patterns.length > 1) {
627
+ perPatternSummary = await _perPatternFileCounts({
628
+ patterns,
629
+ searchPath,
630
+ globPatterns: normalizedGlobPatterns,
631
+ caseInsensitive,
632
+ multilineMode,
633
+ fileType,
634
+ workDir: rgSpawnCwd,
635
+ });
636
+ }
637
+ const out = body + rgPartialSuffix + perPatternSummary;
638
+ const shownLines = headLimit === Infinity ? windowed : windowed.slice(0, headLimit);
639
+ const remaining = Math.max(0, totalWindowed - shownLines.length);
640
+ // Mirrors formatGrepOutput truncation / totalKnown semantics.
641
+ if (options?.scopedCacheOutcome && (!totalKnown || remaining > 0)) {
642
+ markScopedCacheIncomplete(options.scopedCacheOutcome);
643
+ }
644
+ recordGrepReadSnapshot(grepStat);
645
+ if (totalKnown && remaining === 0) {
646
+ cacheSet(cacheKey, out, { scopes: [grepResolvedPath] });
647
+ }
648
+ // ② completion progress (claude "Found N" parity). Best-effort,
649
+ // no-op when onProgress is absent (no progressToken).
650
+ if (typeof options?.onProgress === 'function') {
651
+ try {
652
+ let _n = totalWindowed;
653
+ let _label = 'matches';
654
+ if (outputMode === 'files_with_matches') {
655
+ _label = 'files';
656
+ } else if (outputMode === 'count') {
657
+ _n = 0;
658
+ for (const _line of windowed) { const _c = parseGrepCountLine(_line); if (_c) _n += _c.count; }
659
+ }
660
+ options.onProgress(`found ${_n} ${_label}`);
661
+ } catch { /* best-effort */ }
662
+ }
663
+ return out;
664
+ }
665
+ catch (err) {
666
+ if (isRgRegexParseError(err) && !multilineMode) {
667
+ const fixedPatterns = uniqueStrings(patterns.flatMap(regexPatternToFixedTerms));
668
+ if (fixedPatterns.length > 0) {
669
+ try {
670
+ const fallbackArgs = buildGrepRgArgs({
671
+ patterns: fixedPatterns,
672
+ searchPath,
673
+ globPatterns: normalizedGlobPatterns,
674
+ outputMode,
675
+ caseInsensitive,
676
+ showLineNumbers,
677
+ beforeN,
678
+ afterN,
679
+ contextN,
680
+ multilineMode: false,
681
+ fileType,
682
+ onlyMatching: args['-o'] === true,
683
+ fixedStrings: true,
684
+ });
685
+ const effectiveHeadLimit = headLimit === Infinity
686
+ ? (outputMode === 'content' ? GREP_CONTENT_HARD_CAP : Infinity)
687
+ : headLimit;
688
+ let windowed;
689
+ let totalWindowed = 0;
690
+ let totalKnown = true;
691
+ let rgPartialSuffix = '';
692
+ if (effectiveHeadLimit !== Infinity) {
693
+ const streamed = await runRgWindowedLines(fallbackArgs, { cwd: rgSpawnCwd }, {
694
+ offset,
695
+ limit: effectiveHeadLimit,
696
+ summaryLimit: outputMode === 'content' ? 120 : 0,
697
+ });
698
+ windowed = streamed.lines;
699
+ totalWindowed = streamed.totalSeen;
700
+ totalKnown = streamed.complete;
701
+ if (streamed.partial) {
702
+ totalKnown = false;
703
+ rgPartialSuffix = streamed.timeout
704
+ ? '\n[warning] rg timed out; partial fixed-string fallback results shown.'
705
+ : streamed.rgStderr
706
+ ? `\n[warning] rg exit 2 (partial fixed-string fallback results): ${String(streamed.rgStderr).trim().slice(0, 300)}`
707
+ : '\n[warning] rg exit 2 (partial fixed-string fallback results)';
708
+ }
709
+ } else {
710
+ const stdout = await runRg(fallbackArgs, { cwd: rgSpawnCwd });
711
+ const allLines = String(stdout).split('\n').filter(Boolean);
712
+ windowed = offset > 0 ? allLines.slice(offset) : allLines;
713
+ totalWindowed = windowed.length;
714
+ if (typeof stdout === 'object' && stdout.truncated) totalKnown = false;
715
+ if (typeof stdout === 'object' && stdout.partial) {
716
+ totalKnown = false;
717
+ rgPartialSuffix = stdout.timeout
718
+ ? '\n[warning] rg timed out; partial fixed-string fallback results shown.'
719
+ : stdout.rgStderr
720
+ ? `\n[warning] rg exit 2 (partial fixed-string fallback results): ${String(stdout.rgStderr).trim().slice(0, 300)}`
721
+ : '\n[warning] rg exit 2 (partial fixed-string fallback results)';
722
+ }
723
+ }
724
+ const body = formatGrepOutput({
725
+ windowed,
726
+ totalWindowed,
727
+ totalKnown,
728
+ headLimit,
729
+ offset,
730
+ outputMode,
731
+ patterns: fixedPatterns,
732
+ beforeN,
733
+ afterN,
734
+ contextN,
735
+ searchPath,
736
+ grepResolvedPath,
737
+ workDir,
738
+ globPatterns: normalizedGlobPatterns,
739
+ fileType,
740
+ filenameOmitted,
741
+ prefix: '[regex parse fallback: fixed-string terms]\n',
742
+ }) || `(no matches) fixed_terms=${JSON.stringify(fixedPatterns)} path=${searchPath}`;
743
+ recordGrepReadSnapshot(grepStat);
744
+ return body + rgPartialSuffix;
745
+ } catch { /* fall through to the original rg error */ }
746
+ }
747
+ }
748
+ const stderr = err?.stderr ? String(err.stderr).trim() : '';
749
+ const msg = stderr || err?.message || String(err);
750
+ return `Error: ${msg.slice(0, 500)}`;
751
+ }
752
+ }
753
+
754
+ export async function executeGlobTool(args, workDir, options = {}) {
755
+ args = normalizeGlobArgs(args);
756
+ args.path = Array.isArray(args.path)
757
+ ? args.path.map((p) => normalizeInputPath(p)).filter((p) => typeof p === 'string' && p)
758
+ : normalizeInputPath(args.path);
759
+ if (Array.isArray(args.path) && args.path.length === 0) {
760
+ return 'Error: path array must contain at least one base directory';
761
+ }
762
+ args.pattern = coerceShapeFlex(args.pattern);
763
+ const rawPattern = args.pattern;
764
+ // ripgrep `--glob` matchers use forward slashes on all platforms;
765
+ // canonicalize `\`→`/` (win32 only) so a `**\*.ts` pattern matches
766
+ // instead of being parsed as an escape sequence.
767
+ let patterns = uniqueStrings((Array.isArray(rawPattern)
768
+ ? rawPattern.filter(p => typeof p === 'string' && p)
769
+ : (rawPattern ? [String(rawPattern)] : [])).map(normalizeInputPath).map(canonicalizeGlobSlashes));
770
+ if (patterns.length === 0) {
771
+ if (Array.isArray(args.path)) {
772
+ const pathGlobs = args.path.filter((p) => hasGlobMagic(p));
773
+ if (pathGlobs.length > 0 && pathGlobs.length === args.path.length) {
774
+ patterns = uniqueStrings(pathGlobs.map(normalizeInputPath).map(canonicalizeGlobSlashes));
775
+ args.path = undefined;
776
+ }
777
+ } else if (hasGlobMagic(args.path)) {
778
+ patterns = [canonicalizeGlobSlashes(normalizeInputPath(args.path))];
779
+ args.path = undefined;
780
+ }
781
+ }
782
+ if (patterns.length === 0) {
783
+ return globMissingPatternMessage();
784
+ }
785
+
786
+ const basePaths = (Array.isArray(args.path) && args.path.length > 0)
787
+ ? args.path
788
+ : [args.path || '.'];
789
+ // A base path carrying glob magic (path:'src/**/cache/*') names a SET of
790
+ // directories, not a literal one — resolving it literally ENOENTs. Split
791
+ // it the way grep's path handling does: walk from the static baseDir and
792
+ // fold the magic suffix into each pattern under that root.
793
+ const baseEntries = basePaths.map((basePath) => {
794
+ if (typeof basePath !== 'string' || !hasGlobMagic(basePath)) return { root: basePath, prefix: '' };
795
+ const { baseDir, relativePattern } = extractGlobBaseDirectory(canonicalizeGlobSlashes(basePath));
796
+ // A trailing pure-`*` segment ("cache/*") means "the children" — the
797
+ // pattern itself supplies the leaf match, so nesting it one level
798
+ // deeper ("*/<pat>") would skip files directly under the dir. Drop
799
+ // that segment; `**` and mid-path magic still nest.
800
+ const segs = relativePattern.replace(/^\//, '').split('/').filter(Boolean);
801
+ if (segs[segs.length - 1] === '*') segs.pop();
802
+ return { root: baseDir || '.', prefix: segs.join('/') };
803
+ });
804
+ const resolvedSearchRoots = new Map();
805
+ function resolvedForSearchRoot(root) {
806
+ if (!resolvedSearchRoots.has(root)) {
807
+ resolvedSearchRoots.set(root, resolveSearchScope(root, workDir));
808
+ }
809
+ return resolvedSearchRoots.get(root);
810
+ }
811
+ for (const e of baseEntries) {
812
+ if (isUncOrSmbPath(e.root)) {
813
+ return uncRefusalMessage('glob', e.root, e.root);
814
+ }
815
+ const resolvedBase = resolvedForSearchRoot(e.root);
816
+ if (isUncOrSmbPath(resolvedBase)) {
817
+ return uncRefusalMessage('glob', e.root, resolvedBase);
818
+ }
819
+ }
820
+ for (const p of patterns) {
821
+ if (isAbsolute(p) && isUncOrSmbPath(p)) {
822
+ return uncRefusalMessage('glob', p, p);
823
+ }
824
+ }
825
+ const headLimitRaw = args.head_limit;
826
+ const headLimitCoerced = coerceNonNegInt(headLimitRaw);
827
+ if (Number.isNaN(headLimitCoerced)) {
828
+ return `Error: invalid head_limit ${JSON.stringify(headLimitRaw)}; expected a non-negative integer (0 = unlimited)`;
829
+ }
830
+ const headLimit = headLimitCoerced === null
831
+ ? 100
832
+ : (headLimitCoerced === 0 ? Infinity : headLimitCoerced);
833
+ const offsetCoerced = coerceNonNegInt(args.offset);
834
+ if (Number.isNaN(offsetCoerced)) {
835
+ return `Error: invalid offset ${JSON.stringify(args.offset)}; expected a non-negative integer`;
836
+ }
837
+ const offset = offsetCoerced === null || offsetCoerced === 0 ? 0 : offsetCoerced;
838
+ // Internal-only ignore extension (see normalizeGlobArgs). Caller (e.g.
839
+ // ai-wrapped-dispatch broad-cwd preflight) appends basename ignore globs
840
+ // so head_limit bounds SOURCE entries rather than artifact noise.
841
+ const extraIgnoreGlobs = Array.isArray(args._extraIgnoreDirs)
842
+ ? args._extraIgnoreDirs.map((name) => `!**/${name}/**`)
843
+ : [];
844
+ const groups = new Map();
845
+ function addToGroup(root, rel) {
846
+ if (!groups.has(root)) groups.set(root, []);
847
+ const rels = groups.get(root);
848
+ if (!rels.includes(rel)) rels.push(rel);
849
+ }
850
+ for (const p of patterns) {
851
+ if (isAbsolute(p)) {
852
+ const { baseDir, relativePattern } = extractGlobBaseDirectory(p);
853
+ addToGroup(baseDir || baseEntries[0]?.root || '.', relativePattern);
854
+ } else {
855
+ for (const e of baseEntries) addToGroup(e.root, e.prefix ? `${e.prefix}/${p}` : p);
856
+ }
857
+ }
858
+
859
+ const cacheBasePath = [...groups.keys()]
860
+ .map((root) => normalizeOutputPath(resolvedForSearchRoot(root)))
861
+ .sort()
862
+ .join('\x01');
863
+ const cacheKey = buildGlobCacheKey({ patterns, basePath: cacheBasePath, headLimit, offset, extraIgnore: extraIgnoreGlobs });
864
+ const cached = cacheGet(cacheKey);
865
+ if (cached !== null) return cached;
866
+
867
+ const globGroups = [...groups.entries()];
868
+
869
+ const allFiles = [];
870
+ const rgErrors = [];
871
+ let accumTruncated = false;
872
+ let rgStdoutTruncated = false;
873
+ let rgStdoutPartial = false;
874
+ const accumCap = 50000;
875
+ const groupRuns = await Promise.all(globGroups.map(async ([root, rels]) => {
876
+ const rgArgs = ['--files', '--hidden'];
877
+ for (const ex of DEFAULT_IGNORE_GLOBS) rgArgs.push('--glob', ex);
878
+ for (const ex of extraIgnoreGlobs) rgArgs.push('--glob', ex);
879
+ for (const rel of rels) rgArgs.push('--glob', rel);
880
+ const rgCwd = resolvedForSearchRoot(root);
881
+ rgArgs.push('.');
882
+ try { statSync(rgCwd); }
883
+ catch (err) {
884
+ return {
885
+ error: `path does not exist: ${normalizeOutputPath(rgCwd)} (${err?.code || 'ENOENT'})`,
886
+ paths: [],
887
+ stdoutTruncated: false,
888
+ };
889
+ }
890
+ try {
891
+ const stdout = await runRg(rgArgs, { cwd: rgCwd, timeout: 10000 });
892
+ const stdoutTruncated = Boolean(stdout && typeof stdout === 'object' && stdout.truncated);
893
+ const stdoutPartial = Boolean(stdout && typeof stdout === 'object' && stdout.partial);
894
+ const paths = [];
895
+ for (const line of String(stdout).split('\n')) {
896
+ const trimmed = line.trim();
897
+ if (!trimmed) continue;
898
+ paths.push(isAbsolute(trimmed) ? trimmed : resolveAgainstCwd(trimmed, rgCwd));
899
+ }
900
+ return { error: null, paths, stdoutTruncated, stdoutPartial };
901
+ } catch (err) {
902
+ const stderr = String(err?.stderr || err?.message || err).trim().split('\n').slice(0, 3).join('; ');
903
+ return {
904
+ error: `rg failed for ${normalizeOutputPath(root)}: ${stderr || 'unknown error'}`,
905
+ paths: [],
906
+ stdoutTruncated: false,
907
+ stdoutPartial: false,
908
+ };
909
+ }
910
+ }));
911
+
912
+ outer: for (const run of groupRuns) {
913
+ if (run.error) {
914
+ rgErrors.push(run.error);
915
+ continue;
916
+ }
917
+ if (run.stdoutTruncated) rgStdoutTruncated = true;
918
+ if (run.stdoutPartial) rgStdoutPartial = true;
919
+ for (const p of run.paths) {
920
+ allFiles.push(p);
921
+ if (allFiles.length >= accumCap) {
922
+ accumTruncated = true;
923
+ break outer;
924
+ }
925
+ }
926
+ }
927
+ if (rgErrors.length > 0 && allFiles.length === 0) {
928
+ return `Error: ${rgErrors.join(' | ').slice(0, 500)}`;
929
+ }
930
+
931
+ const unique = Array.from(new Set(allFiles));
932
+ // Bound the post-rg stat phase: a single hung stat (dead mount /
933
+ // unresponsive network path) must not pin glob until the 600s bridge stall
934
+ // watchdog. Per-stat 5s deadline → a hung entry is treated as stat-failed
935
+ // and dropped, while normal local stats (sub-ms) are unaffected.
936
+ const withStatAll = await statPathsForMtime(unique, workDir, 64, { deadlineMs: 5000 });
937
+ const withStat = withStatAll.filter((entry) => entry?.stat != null);
938
+ withStat.sort((a, b) => {
939
+ const dm = b.mtime - a.mtime;
940
+ if (dm !== 0) return dm;
941
+ return globMtimeTiePath(a).localeCompare(globMtimeTiePath(b));
942
+ });
943
+ const totalBeforeOffset = withStat.length;
944
+ const windowed = offset > 0 ? withStat.slice(offset) : withStat;
945
+ const capped = (headLimit === Infinity ? windowed : windowed.slice(0, headLimit)).map((entry) => {
946
+ const abs = entry.full || resolveAgainstCwd(entry.path, workDir);
947
+ return relativeSearchResultPath(abs, workDir);
948
+ });
949
+ const remaining = windowed.length - capped.length;
950
+ const truncSuffix = accumTruncated
951
+ ? '\n... [truncated at accumulation cap (50000)]'
952
+ : (rgStdoutTruncated ? '\n... [truncated at rg stdout cap (20MB); results incomplete]' : '')
953
+ + (rgStdoutPartial ? '\n... [warning] rg exit 2 (partial results); listing may be incomplete' : '');
954
+ const errSuffix = (rgErrors.length > 0 ? `\n... [warning] ${rgErrors.join(' | ')}` : '') + truncSuffix;
955
+ let emptyDiag = '';
956
+ if (capped.length === 0 && rgErrors.length === 0) {
957
+ const patternStr = patterns.length === 1 ? JSON.stringify(patterns[0]) : JSON.stringify(patterns);
958
+ const baseLabel = basePaths.length === 1 ? normalizeOutputPath(basePaths[0]) : `[${basePaths.map(normalizeOutputPath).join(', ')}]`;
959
+ if (totalBeforeOffset > 0 && offset >= totalBeforeOffset) {
960
+ emptyDiag = `(no entries after offset=${offset}; total=${totalBeforeOffset}) pattern=${patternStr} path=${baseLabel}`;
961
+ } else {
962
+ emptyDiag = `(no files found) pattern=${patternStr} path=${baseLabel}; ${basePathDiagnostic(baseEntries.map((e) => e.root), workDir)}`;
963
+ }
964
+ }
965
+ const body = capped.length > 0
966
+ ? `${capped.join('\n')}${remaining > 0 ? `\n... [${remaining} more entries of ${totalBeforeOffset} total — pass offset:${offset + capped.length} to continue]` : ''}${errSuffix}`
967
+ : '';
968
+ const out = body || emptyDiag || '(no files found)';
969
+ if (options?.scopedCacheOutcome && (accumTruncated || rgStdoutTruncated || rgStdoutPartial || remaining > 0)) {
970
+ markScopedCacheIncomplete(options.scopedCacheOutcome);
971
+ }
972
+ const globIncomplete = accumTruncated || rgStdoutTruncated || rgStdoutPartial || remaining > 0;
973
+ if (!globIncomplete) {
974
+ cacheSet(cacheKey, out, { scopes: [...groups.keys()].map((root) => resolvedForSearchRoot(root)) });
975
+ }
976
+ // ② completion progress (claude "Found N" parity). Best-effort, no-op
977
+ // when onProgress is absent (no progressToken).
978
+ if (typeof options?.onProgress === 'function') {
979
+ try { options.onProgress(`found ${totalBeforeOffset} files`); } catch { /* best-effort */ }
980
+ }
981
+ return out;
982
+ }