oma-coding-agent 1.1.4

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 (1298) hide show
  1. package/CHANGELOG.md +12164 -0
  2. package/README.md +35 -0
  3. package/dist/cli.js +18266 -0
  4. package/examples/README.md +21 -0
  5. package/examples/custom-tools/README.md +104 -0
  6. package/examples/custom-tools/hello/index.ts +20 -0
  7. package/examples/extensions/README.md +142 -0
  8. package/examples/extensions/api-demo.ts +79 -0
  9. package/examples/extensions/chalk-logger.ts +25 -0
  10. package/examples/extensions/hello.ts +31 -0
  11. package/examples/extensions/pirate.ts +43 -0
  12. package/examples/extensions/plan-mode.ts +549 -0
  13. package/examples/extensions/reload-runtime.ts +38 -0
  14. package/examples/extensions/thinking-note.ts +13 -0
  15. package/examples/extensions/tools.ts +145 -0
  16. package/examples/extensions/with-deps/index.ts +36 -0
  17. package/examples/extensions/with-deps/package-lock.json +31 -0
  18. package/examples/extensions/with-deps/package.json +17 -0
  19. package/examples/hooks/README.md +56 -0
  20. package/examples/hooks/auto-commit-on-exit.ts +48 -0
  21. package/examples/hooks/confirm-destructive.ts +58 -0
  22. package/examples/hooks/custom-compaction.ts +115 -0
  23. package/examples/hooks/dirty-repo-guard.ts +51 -0
  24. package/examples/hooks/file-trigger.ts +40 -0
  25. package/examples/hooks/git-checkpoint.ts +52 -0
  26. package/examples/hooks/handoff.ts +149 -0
  27. package/examples/hooks/permission-gate.ts +33 -0
  28. package/examples/hooks/protected-paths.ts +29 -0
  29. package/examples/hooks/qna.ts +118 -0
  30. package/examples/hooks/status-line.ts +39 -0
  31. package/examples/sdk/01-minimal.ts +21 -0
  32. package/examples/sdk/02-custom-model.ts +49 -0
  33. package/examples/sdk/03-custom-prompt.ts +46 -0
  34. package/examples/sdk/04-skills.ts +43 -0
  35. package/examples/sdk/06-extensions.ts +82 -0
  36. package/examples/sdk/06-hooks.ts +61 -0
  37. package/examples/sdk/07-context-files.ts +35 -0
  38. package/examples/sdk/08-prompt-templates.ts +41 -0
  39. package/examples/sdk/08-slash-commands.ts +46 -0
  40. package/examples/sdk/09-api-keys-and-oauth.ts +54 -0
  41. package/examples/sdk/11-sessions.ts +47 -0
  42. package/examples/sdk/12-redis-sessions.ts +54 -0
  43. package/examples/sdk/13-sql-sessions.ts +61 -0
  44. package/examples/sdk/README.md +172 -0
  45. package/package.json +573 -0
  46. package/scripts/bench-guard.ts +71 -0
  47. package/scripts/build-binary.ts +108 -0
  48. package/scripts/bundle-dist.ts +110 -0
  49. package/scripts/embed-mupdf-wasm.ts +67 -0
  50. package/scripts/format-prompts.ts +68 -0
  51. package/scripts/generate-docs-index.ts +56 -0
  52. package/scripts/generate-share-viewer.ts +34 -0
  53. package/scripts/measure-prompt-tokens.ts +63 -0
  54. package/scripts/omp +42 -0
  55. package/scripts/omp.ts +19 -0
  56. package/src/advisor/__tests__/advisor.test.ts +915 -0
  57. package/src/advisor/advise-tool.ts +165 -0
  58. package/src/advisor/index.ts +4 -0
  59. package/src/advisor/runtime.ts +270 -0
  60. package/src/advisor/transcript-recorder.ts +136 -0
  61. package/src/advisor/watchdog.ts +83 -0
  62. package/src/async/index.ts +1 -0
  63. package/src/async/job-manager.ts +674 -0
  64. package/src/auto-thinking/classifier.ts +190 -0
  65. package/src/autolearn/controller.ts +139 -0
  66. package/src/autolearn/managed-skills.ts +255 -0
  67. package/src/autoresearch/command-resume.md +14 -0
  68. package/src/autoresearch/dashboard.ts +436 -0
  69. package/src/autoresearch/git.ts +319 -0
  70. package/src/autoresearch/helpers.ts +218 -0
  71. package/src/autoresearch/index.ts +536 -0
  72. package/src/autoresearch/prompt-setup.md +43 -0
  73. package/src/autoresearch/prompt.md +103 -0
  74. package/src/autoresearch/resume-message.md +10 -0
  75. package/src/autoresearch/state.ts +273 -0
  76. package/src/autoresearch/storage.ts +700 -0
  77. package/src/autoresearch/tools/init-experiment.ts +269 -0
  78. package/src/autoresearch/tools/log-experiment.ts +521 -0
  79. package/src/autoresearch/tools/run-experiment.ts +407 -0
  80. package/src/autoresearch/tools/update-notes.ts +109 -0
  81. package/src/autoresearch/types.ts +168 -0
  82. package/src/capability/context-file.ts +44 -0
  83. package/src/capability/extension-module.ts +34 -0
  84. package/src/capability/extension.ts +47 -0
  85. package/src/capability/fs.ts +117 -0
  86. package/src/capability/hook.ts +40 -0
  87. package/src/capability/index.ts +436 -0
  88. package/src/capability/instruction.ts +37 -0
  89. package/src/capability/mcp.ts +76 -0
  90. package/src/capability/prompt.ts +35 -0
  91. package/src/capability/rule-buckets.ts +66 -0
  92. package/src/capability/rule.ts +261 -0
  93. package/src/capability/settings.ts +34 -0
  94. package/src/capability/skill.ts +63 -0
  95. package/src/capability/slash-command.ts +40 -0
  96. package/src/capability/ssh.ts +41 -0
  97. package/src/capability/system-prompt.ts +34 -0
  98. package/src/capability/tool.ts +38 -0
  99. package/src/capability/types.ts +168 -0
  100. package/src/cli/agents-cli.ts +138 -0
  101. package/src/cli/args.ts +361 -0
  102. package/src/cli/auth-broker-cli.ts +893 -0
  103. package/src/cli/auth-gateway-cli.ts +608 -0
  104. package/src/cli/bench-cli.ts +552 -0
  105. package/src/cli/classify-install-target.ts +76 -0
  106. package/src/cli/claude-trace-cli.ts +795 -0
  107. package/src/cli/commands/init-xdg.ts +27 -0
  108. package/src/cli/completion-gen.ts +550 -0
  109. package/src/cli/config-cli.ts +418 -0
  110. package/src/cli/dry-balance-cli.ts +858 -0
  111. package/src/cli/extension-flags.ts +48 -0
  112. package/src/cli/file-processor.ts +133 -0
  113. package/src/cli/flag-tables.ts +280 -0
  114. package/src/cli/gallery-cli.ts +231 -0
  115. package/src/cli/gallery-fixtures/agentic.ts +407 -0
  116. package/src/cli/gallery-fixtures/codeintel.ts +187 -0
  117. package/src/cli/gallery-fixtures/edit.ts +194 -0
  118. package/src/cli/gallery-fixtures/fs.ts +220 -0
  119. package/src/cli/gallery-fixtures/index.ts +40 -0
  120. package/src/cli/gallery-fixtures/interaction.ts +49 -0
  121. package/src/cli/gallery-fixtures/memory.ts +81 -0
  122. package/src/cli/gallery-fixtures/misc.ts +250 -0
  123. package/src/cli/gallery-fixtures/search.ts +213 -0
  124. package/src/cli/gallery-fixtures/shell.ts +167 -0
  125. package/src/cli/gallery-fixtures/types.ts +57 -0
  126. package/src/cli/gallery-fixtures/web.ts +158 -0
  127. package/src/cli/gallery-screenshot.ts +279 -0
  128. package/src/cli/grep-cli.ts +160 -0
  129. package/src/cli/grievances-cli.ts +256 -0
  130. package/src/cli/initial-message.ts +58 -0
  131. package/src/cli/models-cli.ts +427 -0
  132. package/src/cli/plugin-cli.ts +996 -0
  133. package/src/cli/profile-alias.ts +338 -0
  134. package/src/cli/profile-bootstrap.ts +243 -0
  135. package/src/cli/read-cli.ts +57 -0
  136. package/src/cli/session-picker.ts +80 -0
  137. package/src/cli/setup-cli.ts +332 -0
  138. package/src/cli/setup-model-picker.ts +43 -0
  139. package/src/cli/shell-cli.ts +176 -0
  140. package/src/cli/ssh-cli.ts +179 -0
  141. package/src/cli/startup-cwd.ts +58 -0
  142. package/src/cli/stats-cli.ts +229 -0
  143. package/src/cli/tiny-models-cli.ts +127 -0
  144. package/src/cli/ttsr-cli.ts +995 -0
  145. package/src/cli/update-cli.ts +671 -0
  146. package/src/cli/usage-cli.ts +774 -0
  147. package/src/cli/web-search-cli.ts +132 -0
  148. package/src/cli/worktree-cli.ts +291 -0
  149. package/src/cli-commands.ts +85 -0
  150. package/src/cli.ts +326 -0
  151. package/src/collab/crypto.ts +63 -0
  152. package/src/collab/guest.ts +450 -0
  153. package/src/collab/host.ts +577 -0
  154. package/src/collab/protocol.ts +274 -0
  155. package/src/collab/relay-client.ts +216 -0
  156. package/src/commands/acp.ts +24 -0
  157. package/src/commands/agents.ts +57 -0
  158. package/src/commands/auth-broker.ts +99 -0
  159. package/src/commands/auth-gateway.ts +69 -0
  160. package/src/commands/bench.ts +42 -0
  161. package/src/commands/commit.ts +46 -0
  162. package/src/commands/complete.ts +66 -0
  163. package/src/commands/completions.ts +60 -0
  164. package/src/commands/config.ts +51 -0
  165. package/src/commands/dry-balance.ts +43 -0
  166. package/src/commands/gallery.ts +52 -0
  167. package/src/commands/grep.ts +48 -0
  168. package/src/commands/grievances.ts +51 -0
  169. package/src/commands/install.ts +107 -0
  170. package/src/commands/join.ts +39 -0
  171. package/src/commands/launch.ts +182 -0
  172. package/src/commands/models.ts +61 -0
  173. package/src/commands/plugin.ts +78 -0
  174. package/src/commands/read.ts +38 -0
  175. package/src/commands/say.ts +102 -0
  176. package/src/commands/setup.ts +67 -0
  177. package/src/commands/shell.ts +29 -0
  178. package/src/commands/ssh.ts +60 -0
  179. package/src/commands/stats.ts +29 -0
  180. package/src/commands/tiny-models.ts +36 -0
  181. package/src/commands/token.ts +108 -0
  182. package/src/commands/ttsr.ts +125 -0
  183. package/src/commands/update.ts +21 -0
  184. package/src/commands/usage.ts +43 -0
  185. package/src/commands/web-search.ts +42 -0
  186. package/src/commands/worktree.ts +56 -0
  187. package/src/commit/agentic/agent.ts +318 -0
  188. package/src/commit/agentic/fallback.ts +96 -0
  189. package/src/commit/agentic/index.ts +355 -0
  190. package/src/commit/agentic/prompts/analyze-file.md +22 -0
  191. package/src/commit/agentic/prompts/session-user.md +25 -0
  192. package/src/commit/agentic/prompts/split-confirm.md +1 -0
  193. package/src/commit/agentic/prompts/system.md +38 -0
  194. package/src/commit/agentic/state.ts +60 -0
  195. package/src/commit/agentic/tools/analyze-file.ts +149 -0
  196. package/src/commit/agentic/tools/git-file-diff.ts +191 -0
  197. package/src/commit/agentic/tools/git-hunk.ts +52 -0
  198. package/src/commit/agentic/tools/git-overview.ts +81 -0
  199. package/src/commit/agentic/tools/index.ts +54 -0
  200. package/src/commit/agentic/tools/propose-changelog.ts +147 -0
  201. package/src/commit/agentic/tools/propose-commit.ts +109 -0
  202. package/src/commit/agentic/tools/recent-commits.ts +81 -0
  203. package/src/commit/agentic/tools/schemas.ts +11 -0
  204. package/src/commit/agentic/tools/split-commit.ts +241 -0
  205. package/src/commit/agentic/topo-sort.ts +44 -0
  206. package/src/commit/agentic/trivial.ts +51 -0
  207. package/src/commit/agentic/validation.ts +183 -0
  208. package/src/commit/analysis/conventional.ts +64 -0
  209. package/src/commit/analysis/index.ts +4 -0
  210. package/src/commit/analysis/scope.ts +242 -0
  211. package/src/commit/analysis/summary.ts +107 -0
  212. package/src/commit/analysis/validation.ts +66 -0
  213. package/src/commit/changelog/detect.ts +40 -0
  214. package/src/commit/changelog/generate.ts +101 -0
  215. package/src/commit/changelog/index.ts +234 -0
  216. package/src/commit/changelog/parse.ts +44 -0
  217. package/src/commit/cli.ts +85 -0
  218. package/src/commit/git/diff.ts +148 -0
  219. package/src/commit/index.ts +5 -0
  220. package/src/commit/map-reduce/index.ts +69 -0
  221. package/src/commit/map-reduce/map-phase.ts +193 -0
  222. package/src/commit/map-reduce/reduce-phase.ts +49 -0
  223. package/src/commit/map-reduce/utils.ts +9 -0
  224. package/src/commit/message.ts +11 -0
  225. package/src/commit/model-selection.ts +89 -0
  226. package/src/commit/pipeline.ts +243 -0
  227. package/src/commit/prompts/analysis-system.md +148 -0
  228. package/src/commit/prompts/analysis-user.md +38 -0
  229. package/src/commit/prompts/changelog-system.md +50 -0
  230. package/src/commit/prompts/changelog-user.md +18 -0
  231. package/src/commit/prompts/file-observer-system.md +24 -0
  232. package/src/commit/prompts/file-observer-user.md +8 -0
  233. package/src/commit/prompts/reduce-system.md +50 -0
  234. package/src/commit/prompts/reduce-user.md +17 -0
  235. package/src/commit/prompts/summary-retry.md +3 -0
  236. package/src/commit/prompts/summary-system.md +38 -0
  237. package/src/commit/prompts/summary-user.md +13 -0
  238. package/src/commit/prompts/types-description.md +2 -0
  239. package/src/commit/shared-llm.ts +70 -0
  240. package/src/commit/types.ts +118 -0
  241. package/src/commit/utils/exclusions.ts +42 -0
  242. package/src/commit/utils.ts +58 -0
  243. package/src/config/api-key-resolver.ts +67 -0
  244. package/src/config/append-only-context-mode.ts +76 -0
  245. package/src/config/config-file.ts +315 -0
  246. package/src/config/file-lock.ts +164 -0
  247. package/src/config/keybindings.ts +634 -0
  248. package/src/config/mcp-schema.json +238 -0
  249. package/src/config/model-discovery.ts +589 -0
  250. package/src/config/model-registry.ts +2260 -0
  251. package/src/config/model-resolver.ts +1819 -0
  252. package/src/config/model-roles.ts +99 -0
  253. package/src/config/models-config-schema.ts +266 -0
  254. package/src/config/models-config.ts +131 -0
  255. package/src/config/prompt-templates.ts +185 -0
  256. package/src/config/resolve-config-value.ts +94 -0
  257. package/src/config/settings-schema.ts +4740 -0
  258. package/src/config/settings.ts +1243 -0
  259. package/src/config.ts +242 -0
  260. package/src/cursor.ts +340 -0
  261. package/src/dap/client.ts +760 -0
  262. package/src/dap/config.ts +189 -0
  263. package/src/dap/defaults.json +212 -0
  264. package/src/dap/index.ts +4 -0
  265. package/src/dap/session.ts +1441 -0
  266. package/src/dap/types.ts +610 -0
  267. package/src/debug/index.ts +559 -0
  268. package/src/debug/log-formatting.ts +58 -0
  269. package/src/debug/log-viewer.ts +908 -0
  270. package/src/debug/profiler.ts +162 -0
  271. package/src/debug/protocol-probe.ts +267 -0
  272. package/src/debug/raw-sse-buffer.ts +294 -0
  273. package/src/debug/raw-sse.ts +292 -0
  274. package/src/debug/remote-debugger.ts +151 -0
  275. package/src/debug/report-bundle.ts +375 -0
  276. package/src/debug/system-info.ts +111 -0
  277. package/src/debug/terminal-info.ts +124 -0
  278. package/src/discovery/agents-md.ts +67 -0
  279. package/src/discovery/agents.ts +230 -0
  280. package/src/discovery/at-imports.ts +273 -0
  281. package/src/discovery/builtin-defaults.ts +39 -0
  282. package/src/discovery/builtin-rules/index.ts +63 -0
  283. package/src/discovery/builtin-rules/low-end/no-hallucinated-apis.md +14 -0
  284. package/src/discovery/builtin-rules/low-end/no-hallucinated-paths.md +14 -0
  285. package/src/discovery/builtin-rules/low-end/no-premature-completion.md +14 -0
  286. package/src/discovery/builtin-rules/rs-box-leak.md +48 -0
  287. package/src/discovery/builtin-rules/rs-future-prelude.md +23 -0
  288. package/src/discovery/builtin-rules/rs-lazylock.md +51 -0
  289. package/src/discovery/builtin-rules/rs-match-ergonomics.md +67 -0
  290. package/src/discovery/builtin-rules/rs-parking-lot.md +44 -0
  291. package/src/discovery/builtin-rules/rs-result-type.md +19 -0
  292. package/src/discovery/builtin-rules/ts-bare-catch.md +38 -0
  293. package/src/discovery/builtin-rules/ts-import-type.md +42 -0
  294. package/src/discovery/builtin-rules/ts-no-any.md +65 -0
  295. package/src/discovery/builtin-rules/ts-no-deprecated-leftovers.md +44 -0
  296. package/src/discovery/builtin-rules/ts-no-dynamic-import.md +39 -0
  297. package/src/discovery/builtin-rules/ts-no-inline-cast-access.md +55 -0
  298. package/src/discovery/builtin-rules/ts-no-return-type.md +44 -0
  299. package/src/discovery/builtin-rules/ts-no-test-timers.md +55 -0
  300. package/src/discovery/builtin-rules/ts-no-tiny-functions.md +51 -0
  301. package/src/discovery/builtin-rules/ts-promise-with-resolvers.md +65 -0
  302. package/src/discovery/builtin-rules/ts-redundant-clear-guard.md +75 -0
  303. package/src/discovery/builtin-rules/ts-set-map.md +28 -0
  304. package/src/discovery/builtin.ts +934 -0
  305. package/src/discovery/claude-plugins.ts +386 -0
  306. package/src/discovery/claude.ts +584 -0
  307. package/src/discovery/cline.ts +83 -0
  308. package/src/discovery/codex.ts +522 -0
  309. package/src/discovery/cursor.ts +220 -0
  310. package/src/discovery/gemini.ts +383 -0
  311. package/src/discovery/github.ts +337 -0
  312. package/src/discovery/helpers.ts +1092 -0
  313. package/src/discovery/index.ts +81 -0
  314. package/src/discovery/mcp-json.ts +172 -0
  315. package/src/discovery/omp-extension-roots.ts +190 -0
  316. package/src/discovery/omp-plugins.ts +383 -0
  317. package/src/discovery/opencode.ts +398 -0
  318. package/src/discovery/plugin-dir-roots.ts +28 -0
  319. package/src/discovery/ssh.ts +153 -0
  320. package/src/discovery/substitute-plugin-root.ts +29 -0
  321. package/src/discovery/vscode.ts +105 -0
  322. package/src/discovery/windsurf.ts +147 -0
  323. package/src/edit/apply-patch/index.ts +87 -0
  324. package/src/edit/apply-patch/parser.ts +174 -0
  325. package/src/edit/diff.ts +999 -0
  326. package/src/edit/file-snapshot-store.ts +143 -0
  327. package/src/edit/hashline/block-resolver.ts +33 -0
  328. package/src/edit/hashline/diff.ts +290 -0
  329. package/src/edit/hashline/execute.ts +237 -0
  330. package/src/edit/hashline/filesystem.ts +130 -0
  331. package/src/edit/hashline/index.ts +5 -0
  332. package/src/edit/hashline/noop-loop-guard.ts +99 -0
  333. package/src/edit/hashline/params.ts +19 -0
  334. package/src/edit/index.ts +620 -0
  335. package/src/edit/modes/apply-patch.lark +19 -0
  336. package/src/edit/modes/apply-patch.ts +53 -0
  337. package/src/edit/modes/patch.ts +1888 -0
  338. package/src/edit/modes/replace.ts +1133 -0
  339. package/src/edit/normalize.ts +345 -0
  340. package/src/edit/notebook.ts +242 -0
  341. package/src/edit/read-file.ts +25 -0
  342. package/src/edit/renderer.ts +823 -0
  343. package/src/edit/streaming.ts +517 -0
  344. package/src/eval/__tests__/agent-bridge.test.ts +769 -0
  345. package/src/eval/__tests__/bridge-timeout.test.ts +64 -0
  346. package/src/eval/__tests__/budget-bridge.test.ts +69 -0
  347. package/src/eval/__tests__/completion-bridge.test.ts +412 -0
  348. package/src/eval/__tests__/helpers-local-roots.test.ts +58 -0
  349. package/src/eval/__tests__/idle-timeout.test.ts +80 -0
  350. package/src/eval/__tests__/js-context-manager.test.ts +291 -0
  351. package/src/eval/__tests__/kernel-spawn.test.ts +103 -0
  352. package/src/eval/__tests__/prelude-agent.test.ts +73 -0
  353. package/src/eval/agent-bridge.ts +319 -0
  354. package/src/eval/backend.ts +71 -0
  355. package/src/eval/bridge-timeout.ts +44 -0
  356. package/src/eval/budget-bridge.ts +48 -0
  357. package/src/eval/completion-bridge.ts +211 -0
  358. package/src/eval/concurrency-bridge.ts +34 -0
  359. package/src/eval/idle-timeout.ts +91 -0
  360. package/src/eval/index.ts +4 -0
  361. package/src/eval/js/context-manager.ts +621 -0
  362. package/src/eval/js/executor.ts +173 -0
  363. package/src/eval/js/index.ts +51 -0
  364. package/src/eval/js/shared/helpers.ts +283 -0
  365. package/src/eval/js/shared/indirect-eval.ts +30 -0
  366. package/src/eval/js/shared/local-module-loader.ts +342 -0
  367. package/src/eval/js/shared/prelude.ts +2 -0
  368. package/src/eval/js/shared/prelude.txt +307 -0
  369. package/src/eval/js/shared/rewrite-imports.ts +532 -0
  370. package/src/eval/js/shared/runtime.ts +580 -0
  371. package/src/eval/js/shared/types.ts +18 -0
  372. package/src/eval/js/tool-bridge.ts +163 -0
  373. package/src/eval/js/worker-core.ts +151 -0
  374. package/src/eval/js/worker-entry.ts +37 -0
  375. package/src/eval/js/worker-protocol.ts +47 -0
  376. package/src/eval/py/__tests__/prelude.test.ts +19 -0
  377. package/src/eval/py/display.ts +71 -0
  378. package/src/eval/py/executor.ts +742 -0
  379. package/src/eval/py/index.ts +68 -0
  380. package/src/eval/py/kernel.ts +748 -0
  381. package/src/eval/py/prelude.py +683 -0
  382. package/src/eval/py/prelude.ts +3 -0
  383. package/src/eval/py/runner.py +1177 -0
  384. package/src/eval/py/runtime.ts +276 -0
  385. package/src/eval/py/spawn-options.ts +126 -0
  386. package/src/eval/py/tool-bridge.ts +182 -0
  387. package/src/eval/session-id.ts +8 -0
  388. package/src/eval/types.ts +48 -0
  389. package/src/exa/index.ts +2 -0
  390. package/src/exa/mcp-client.ts +370 -0
  391. package/src/exa/types.ts +69 -0
  392. package/src/exec/bash-executor.ts +434 -0
  393. package/src/exec/exec.ts +53 -0
  394. package/src/exec/non-interactive-env.ts +119 -0
  395. package/src/export/custom-share.ts +65 -0
  396. package/src/export/html/index.ts +266 -0
  397. package/src/export/html/share-loader.js +102 -0
  398. package/src/export/html/template.css +1337 -0
  399. package/src/export/html/template.html +49 -0
  400. package/src/export/html/template.js +1626 -0
  401. package/src/export/html/tool-views.generated.js +37 -0
  402. package/src/export/html/vendor/highlight.min.js +1213 -0
  403. package/src/export/html/vendor/marked.min.js +6 -0
  404. package/src/export/share.ts +268 -0
  405. package/src/export/ttsr.ts +583 -0
  406. package/src/extensibility/custom-commands/bundled/ci-green/index.ts +54 -0
  407. package/src/extensibility/custom-commands/bundled/review/index.ts +698 -0
  408. package/src/extensibility/custom-commands/index.ts +2 -0
  409. package/src/extensibility/custom-commands/loader.ts +242 -0
  410. package/src/extensibility/custom-commands/types.ts +119 -0
  411. package/src/extensibility/custom-tools/index.ts +7 -0
  412. package/src/extensibility/custom-tools/loader.ts +268 -0
  413. package/src/extensibility/custom-tools/types.ts +277 -0
  414. package/src/extensibility/custom-tools/wrapper.ts +47 -0
  415. package/src/extensibility/extensions/compact-handler.ts +40 -0
  416. package/src/extensibility/extensions/get-commands-handler.ts +78 -0
  417. package/src/extensibility/extensions/index.ts +16 -0
  418. package/src/extensibility/extensions/loader.ts +587 -0
  419. package/src/extensibility/extensions/model-api.ts +41 -0
  420. package/src/extensibility/extensions/runner.ts +989 -0
  421. package/src/extensibility/extensions/types.ts +1394 -0
  422. package/src/extensibility/extensions/wrapper.ts +259 -0
  423. package/src/extensibility/hooks/index.ts +6 -0
  424. package/src/extensibility/hooks/loader.ts +262 -0
  425. package/src/extensibility/hooks/runner.ts +425 -0
  426. package/src/extensibility/hooks/tool-wrapper.ts +107 -0
  427. package/src/extensibility/hooks/types.ts +613 -0
  428. package/src/extensibility/legacy-pi-ai-shim.ts +61 -0
  429. package/src/extensibility/legacy-pi-coding-agent-shim.ts +128 -0
  430. package/src/extensibility/plugins/doctor.ts +65 -0
  431. package/src/extensibility/plugins/git-url.ts +367 -0
  432. package/src/extensibility/plugins/index.ts +9 -0
  433. package/src/extensibility/plugins/installer.ts +192 -0
  434. package/src/extensibility/plugins/legacy-pi-compat.ts +712 -0
  435. package/src/extensibility/plugins/loader.ts +458 -0
  436. package/src/extensibility/plugins/manager.ts +1026 -0
  437. package/src/extensibility/plugins/marketplace/cache.ts +136 -0
  438. package/src/extensibility/plugins/marketplace/fetcher.ts +315 -0
  439. package/src/extensibility/plugins/marketplace/index.ts +6 -0
  440. package/src/extensibility/plugins/marketplace/manager.ts +770 -0
  441. package/src/extensibility/plugins/marketplace/registry.ts +196 -0
  442. package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
  443. package/src/extensibility/plugins/marketplace/types.ts +191 -0
  444. package/src/extensibility/plugins/marketplace-auto-update.ts +49 -0
  445. package/src/extensibility/plugins/parser.ts +105 -0
  446. package/src/extensibility/plugins/runtime-config.ts +9 -0
  447. package/src/extensibility/plugins/types.ts +194 -0
  448. package/src/extensibility/shared-events.ts +367 -0
  449. package/src/extensibility/skills.ts +408 -0
  450. package/src/extensibility/slash-commands.ts +131 -0
  451. package/src/extensibility/tool-proxy.ts +28 -0
  452. package/src/extensibility/typebox.ts +945 -0
  453. package/src/extensibility/utils.ts +44 -0
  454. package/src/goals/guided-setup.ts +142 -0
  455. package/src/goals/index.ts +3 -0
  456. package/src/goals/runtime.ts +521 -0
  457. package/src/goals/state.ts +37 -0
  458. package/src/goals/tools/goal-tool.ts +251 -0
  459. package/src/hindsight/backend.ts +354 -0
  460. package/src/hindsight/bank.ts +156 -0
  461. package/src/hindsight/client.ts +623 -0
  462. package/src/hindsight/config.ts +175 -0
  463. package/src/hindsight/content.ts +210 -0
  464. package/src/hindsight/index.ts +8 -0
  465. package/src/hindsight/mental-models.ts +429 -0
  466. package/src/hindsight/seeds.json +32 -0
  467. package/src/hindsight/state.ts +492 -0
  468. package/src/hindsight/transcript.ts +71 -0
  469. package/src/index.ts +66 -0
  470. package/src/internal-urls/agent-protocol.ts +146 -0
  471. package/src/internal-urls/artifact-protocol.ts +107 -0
  472. package/src/internal-urls/docs-index.generated.txt +2 -0
  473. package/src/internal-urls/docs-index.ts +102 -0
  474. package/src/internal-urls/history-protocol.ts +118 -0
  475. package/src/internal-urls/index.ts +25 -0
  476. package/src/internal-urls/issue-pr-protocol.ts +594 -0
  477. package/src/internal-urls/json-query.ts +126 -0
  478. package/src/internal-urls/local-protocol.ts +309 -0
  479. package/src/internal-urls/mcp-protocol.ts +151 -0
  480. package/src/internal-urls/memory-protocol.ts +169 -0
  481. package/src/internal-urls/omp-protocol.ts +94 -0
  482. package/src/internal-urls/parse.ts +72 -0
  483. package/src/internal-urls/registry-helpers.ts +25 -0
  484. package/src/internal-urls/router.ts +105 -0
  485. package/src/internal-urls/rule-protocol.ts +45 -0
  486. package/src/internal-urls/skill-protocol.ts +96 -0
  487. package/src/internal-urls/types.ts +152 -0
  488. package/src/internal-urls/vault-protocol.ts +936 -0
  489. package/src/irc/bus.ts +311 -0
  490. package/src/lib/xai-http.ts +124 -0
  491. package/src/lsp/client.ts +1217 -0
  492. package/src/lsp/clients/biome-client.ts +264 -0
  493. package/src/lsp/clients/index.ts +50 -0
  494. package/src/lsp/clients/lsp-linter-client.ts +85 -0
  495. package/src/lsp/clients/swiftlint-client.ts +120 -0
  496. package/src/lsp/config.ts +502 -0
  497. package/src/lsp/defaults.json +499 -0
  498. package/src/lsp/diagnostics-ledger.ts +51 -0
  499. package/src/lsp/edits.ts +267 -0
  500. package/src/lsp/format-options.ts +119 -0
  501. package/src/lsp/index.ts +2480 -0
  502. package/src/lsp/lspmux.ts +233 -0
  503. package/src/lsp/render.ts +668 -0
  504. package/src/lsp/startup-events.ts +13 -0
  505. package/src/lsp/types.ts +444 -0
  506. package/src/lsp/utils.ts +718 -0
  507. package/src/main.ts +1421 -0
  508. package/src/markit/NOTICE +32 -0
  509. package/src/markit/converters/docx.ts +56 -0
  510. package/src/markit/converters/epub.ts +136 -0
  511. package/src/markit/converters/mammoth.d.ts +24 -0
  512. package/src/markit/converters/pdf/columns.ts +103 -0
  513. package/src/markit/converters/pdf/extract.ts +574 -0
  514. package/src/markit/converters/pdf/grid.ts +780 -0
  515. package/src/markit/converters/pdf/headers.ts +106 -0
  516. package/src/markit/converters/pdf/index.ts +146 -0
  517. package/src/markit/converters/pdf/render.ts +501 -0
  518. package/src/markit/converters/pdf/types.ts +84 -0
  519. package/src/markit/converters/pptx.ts +325 -0
  520. package/src/markit/converters/xlsx.ts +173 -0
  521. package/src/markit/index.ts +2 -0
  522. package/src/markit/registry.ts +59 -0
  523. package/src/markit/types.ts +35 -0
  524. package/src/mcp/client.ts +509 -0
  525. package/src/mcp/config-writer.ts +229 -0
  526. package/src/mcp/config.ts +365 -0
  527. package/src/mcp/index.ts +29 -0
  528. package/src/mcp/json-rpc.ts +122 -0
  529. package/src/mcp/loader.ts +124 -0
  530. package/src/mcp/manager.ts +1326 -0
  531. package/src/mcp/oauth-credentials.ts +104 -0
  532. package/src/mcp/oauth-discovery.ts +467 -0
  533. package/src/mcp/oauth-flow.ts +555 -0
  534. package/src/mcp/render.ts +155 -0
  535. package/src/mcp/smithery-auth.ts +104 -0
  536. package/src/mcp/smithery-connect.ts +145 -0
  537. package/src/mcp/smithery-registry.ts +477 -0
  538. package/src/mcp/startup-events.ts +21 -0
  539. package/src/mcp/timeout.ts +59 -0
  540. package/src/mcp/tool-bridge.ts +429 -0
  541. package/src/mcp/tool-cache.ts +117 -0
  542. package/src/mcp/transports/http.ts +519 -0
  543. package/src/mcp/transports/index.ts +6 -0
  544. package/src/mcp/transports/stdio.ts +606 -0
  545. package/src/mcp/types.ts +427 -0
  546. package/src/memories/index.ts +1281 -0
  547. package/src/memories/storage.ts +578 -0
  548. package/src/memory-backend/index.ts +18 -0
  549. package/src/memory-backend/local-backend.ts +45 -0
  550. package/src/memory-backend/off-backend.ts +25 -0
  551. package/src/memory-backend/resolve.ts +25 -0
  552. package/src/memory-backend/runtime.ts +66 -0
  553. package/src/memory-backend/types.ts +166 -0
  554. package/src/mnemopi/backend.ts +612 -0
  555. package/src/mnemopi/config.ts +265 -0
  556. package/src/mnemopi/embed-client.ts +401 -0
  557. package/src/mnemopi/embed-protocol.ts +35 -0
  558. package/src/mnemopi/embed-worker.ts +113 -0
  559. package/src/mnemopi/index.ts +3 -0
  560. package/src/mnemopi/state.ts +657 -0
  561. package/src/modes/acp/acp-agent.ts +2362 -0
  562. package/src/modes/acp/acp-client-bridge.ts +154 -0
  563. package/src/modes/acp/acp-event-mapper.ts +933 -0
  564. package/src/modes/acp/acp-mode.ts +23 -0
  565. package/src/modes/acp/index.ts +2 -0
  566. package/src/modes/acp/terminal-auth.ts +37 -0
  567. package/src/modes/components/__tests__/skill-message.test.ts +92 -0
  568. package/src/modes/components/advisor-message.ts +99 -0
  569. package/src/modes/components/agent-dashboard.ts +1206 -0
  570. package/src/modes/components/agent-hub.ts +566 -0
  571. package/src/modes/components/agent-transcript-viewer.ts +461 -0
  572. package/src/modes/components/assistant-message.ts +612 -0
  573. package/src/modes/components/background-tan-message.ts +36 -0
  574. package/src/modes/components/bash-execution.ts +220 -0
  575. package/src/modes/components/bordered-loader.ts +41 -0
  576. package/src/modes/components/btw-panel.ts +112 -0
  577. package/src/modes/components/cache-invalidation-marker.ts +110 -0
  578. package/src/modes/components/chat-block.ts +111 -0
  579. package/src/modes/components/chat-transcript-builder.ts +476 -0
  580. package/src/modes/components/collab-prompt-message.ts +32 -0
  581. package/src/modes/components/compaction-summary-message.ts +215 -0
  582. package/src/modes/components/copy-selector.ts +206 -0
  583. package/src/modes/components/countdown-timer.ts +75 -0
  584. package/src/modes/components/custom-editor.test.ts +142 -0
  585. package/src/modes/components/custom-editor.ts +620 -0
  586. package/src/modes/components/custom-message.ts +67 -0
  587. package/src/modes/components/diff.ts +254 -0
  588. package/src/modes/components/dynamic-border.ts +34 -0
  589. package/src/modes/components/error-banner.ts +33 -0
  590. package/src/modes/components/eval-execution.ts +158 -0
  591. package/src/modes/components/execution-shared.ts +101 -0
  592. package/src/modes/components/extensions/extension-dashboard.ts +399 -0
  593. package/src/modes/components/extensions/extension-list.ts +502 -0
  594. package/src/modes/components/extensions/index.ts +9 -0
  595. package/src/modes/components/extensions/inspector-panel.ts +321 -0
  596. package/src/modes/components/extensions/state-manager.ts +627 -0
  597. package/src/modes/components/extensions/types.ts +186 -0
  598. package/src/modes/components/footer.ts +275 -0
  599. package/src/modes/components/history-search.ts +280 -0
  600. package/src/modes/components/hook-editor.ts +167 -0
  601. package/src/modes/components/hook-input.ts +87 -0
  602. package/src/modes/components/hook-message.ts +67 -0
  603. package/src/modes/components/hook-selector.ts +659 -0
  604. package/src/modes/components/index.ts +38 -0
  605. package/src/modes/components/keybinding-hints.ts +65 -0
  606. package/src/modes/components/late-diagnostics-message.ts +60 -0
  607. package/src/modes/components/login-dialog.ts +164 -0
  608. package/src/modes/components/logout-account-selector.ts +130 -0
  609. package/src/modes/components/mcp-add-wizard.ts +1360 -0
  610. package/src/modes/components/message-frame.ts +92 -0
  611. package/src/modes/components/model-selector.ts +1315 -0
  612. package/src/modes/components/oauth-selector.ts +457 -0
  613. package/src/modes/components/omfg-panel.ts +141 -0
  614. package/src/modes/components/overlay-box.ts +109 -0
  615. package/src/modes/components/plan-review-overlay.ts +847 -0
  616. package/src/modes/components/plan-toc.ts +138 -0
  617. package/src/modes/components/plugin-selector.ts +95 -0
  618. package/src/modes/components/plugin-settings.ts +739 -0
  619. package/src/modes/components/queue-mode-selector.ts +56 -0
  620. package/src/modes/components/read-tool-group.ts +676 -0
  621. package/src/modes/components/reset-usage-selector.ts +161 -0
  622. package/src/modes/components/segment-track.ts +89 -0
  623. package/src/modes/components/session-selector.ts +631 -0
  624. package/src/modes/components/settings-defs.ts +225 -0
  625. package/src/modes/components/settings-selector.ts +1095 -0
  626. package/src/modes/components/show-images-selector.ts +45 -0
  627. package/src/modes/components/skill-message.ts +110 -0
  628. package/src/modes/components/snapcompact-shape-preview-doc.md +18 -0
  629. package/src/modes/components/snapcompact-shape-preview.ts +192 -0
  630. package/src/modes/components/status-line/component.ts +1001 -0
  631. package/src/modes/components/status-line/context-thresholds.ts +78 -0
  632. package/src/modes/components/status-line/git-utils.ts +42 -0
  633. package/src/modes/components/status-line/index.ts +5 -0
  634. package/src/modes/components/status-line/presets.ts +106 -0
  635. package/src/modes/components/status-line/segments.ts +616 -0
  636. package/src/modes/components/status-line/separators.ts +55 -0
  637. package/src/modes/components/status-line/token-rate.ts +66 -0
  638. package/src/modes/components/status-line/types.ts +124 -0
  639. package/src/modes/components/theme-selector.ts +63 -0
  640. package/src/modes/components/thinking-selector.ts +52 -0
  641. package/src/modes/components/tiny-title-download-progress.ts +90 -0
  642. package/src/modes/components/tips.txt +24 -0
  643. package/src/modes/components/todo-reminder.ts +39 -0
  644. package/src/modes/components/tool-execution.ts +1165 -0
  645. package/src/modes/components/transcript-container.ts +806 -0
  646. package/src/modes/components/tree-selector.ts +994 -0
  647. package/src/modes/components/ttsr-notification.ts +123 -0
  648. package/src/modes/components/usage-row.ts +18 -0
  649. package/src/modes/components/user-message-selector.ts +227 -0
  650. package/src/modes/components/user-message.ts +68 -0
  651. package/src/modes/components/visual-truncate.ts +63 -0
  652. package/src/modes/components/welcome.ts +581 -0
  653. package/src/modes/controllers/btw-controller.ts +173 -0
  654. package/src/modes/controllers/command-controller-shared.ts +109 -0
  655. package/src/modes/controllers/command-controller.ts +1653 -0
  656. package/src/modes/controllers/event-controller.ts +1153 -0
  657. package/src/modes/controllers/extension-ui-controller.ts +893 -0
  658. package/src/modes/controllers/input-controller.ts +1627 -0
  659. package/src/modes/controllers/mcp-command-controller.ts +2162 -0
  660. package/src/modes/controllers/omfg-controller.ts +283 -0
  661. package/src/modes/controllers/omfg-rule.ts +647 -0
  662. package/src/modes/controllers/selector-controller.ts +1285 -0
  663. package/src/modes/controllers/session-focus-controller.ts +112 -0
  664. package/src/modes/controllers/ssh-command-controller.ts +384 -0
  665. package/src/modes/controllers/streaming-reveal.ts +295 -0
  666. package/src/modes/controllers/tan-command-controller.ts +190 -0
  667. package/src/modes/controllers/todo-command-controller.ts +485 -0
  668. package/src/modes/controllers/tool-args-reveal.ts +174 -0
  669. package/src/modes/data/emojis.json +1 -0
  670. package/src/modes/emoji-autocomplete.ts +285 -0
  671. package/src/modes/gradient-highlight.ts +99 -0
  672. package/src/modes/image-references.ts +137 -0
  673. package/src/modes/index.ts +17 -0
  674. package/src/modes/interactive-mode.ts +3940 -0
  675. package/src/modes/internal-url-autocomplete.ts +143 -0
  676. package/src/modes/loop-limit.ts +192 -0
  677. package/src/modes/magic-keywords.ts +42 -0
  678. package/src/modes/markdown-prose.ts +247 -0
  679. package/src/modes/oauth-manual-input.ts +69 -0
  680. package/src/modes/orchestrate.ts +42 -0
  681. package/src/modes/print-mode.ts +130 -0
  682. package/src/modes/prompt-action-autocomplete.ts +260 -0
  683. package/src/modes/rpc/host-tools.ts +186 -0
  684. package/src/modes/rpc/host-uris.ts +235 -0
  685. package/src/modes/rpc/rpc-client.ts +995 -0
  686. package/src/modes/rpc/rpc-mode.ts +1156 -0
  687. package/src/modes/rpc/rpc-subagents.ts +265 -0
  688. package/src/modes/rpc/rpc-types.ts +487 -0
  689. package/src/modes/runtime-init.ts +142 -0
  690. package/src/modes/session-observer-registry.ts +215 -0
  691. package/src/modes/setup-version.ts +11 -0
  692. package/src/modes/setup-wizard/index.ts +101 -0
  693. package/src/modes/setup-wizard/lazy.ts +16 -0
  694. package/src/modes/setup-wizard/scenes/glyph.ts +114 -0
  695. package/src/modes/setup-wizard/scenes/outro.ts +35 -0
  696. package/src/modes/setup-wizard/scenes/providers.ts +103 -0
  697. package/src/modes/setup-wizard/scenes/sign-in.ts +286 -0
  698. package/src/modes/setup-wizard/scenes/splash.ts +201 -0
  699. package/src/modes/setup-wizard/scenes/theme.ts +326 -0
  700. package/src/modes/setup-wizard/scenes/types.ts +57 -0
  701. package/src/modes/setup-wizard/scenes/web-search.ts +145 -0
  702. package/src/modes/setup-wizard/startup-splash.ts +107 -0
  703. package/src/modes/setup-wizard/wizard-overlay.ts +334 -0
  704. package/src/modes/shared.ts +49 -0
  705. package/src/modes/theme/dark.json +95 -0
  706. package/src/modes/theme/defaults/alabaster.json +93 -0
  707. package/src/modes/theme/defaults/amethyst.json +96 -0
  708. package/src/modes/theme/defaults/anthracite.json +93 -0
  709. package/src/modes/theme/defaults/basalt.json +91 -0
  710. package/src/modes/theme/defaults/birch.json +95 -0
  711. package/src/modes/theme/defaults/dark-abyss.json +91 -0
  712. package/src/modes/theme/defaults/dark-arctic.json +104 -0
  713. package/src/modes/theme/defaults/dark-aurora.json +95 -0
  714. package/src/modes/theme/defaults/dark-catppuccin.json +107 -0
  715. package/src/modes/theme/defaults/dark-cavern.json +91 -0
  716. package/src/modes/theme/defaults/dark-copper.json +95 -0
  717. package/src/modes/theme/defaults/dark-cosmos.json +90 -0
  718. package/src/modes/theme/defaults/dark-cyberpunk.json +102 -0
  719. package/src/modes/theme/defaults/dark-dracula.json +98 -0
  720. package/src/modes/theme/defaults/dark-eclipse.json +91 -0
  721. package/src/modes/theme/defaults/dark-ember.json +95 -0
  722. package/src/modes/theme/defaults/dark-equinox.json +90 -0
  723. package/src/modes/theme/defaults/dark-forest.json +96 -0
  724. package/src/modes/theme/defaults/dark-github.json +105 -0
  725. package/src/modes/theme/defaults/dark-gruvbox.json +112 -0
  726. package/src/modes/theme/defaults/dark-lavender.json +95 -0
  727. package/src/modes/theme/defaults/dark-lunar.json +89 -0
  728. package/src/modes/theme/defaults/dark-midnight.json +95 -0
  729. package/src/modes/theme/defaults/dark-monochrome.json +94 -0
  730. package/src/modes/theme/defaults/dark-monokai.json +98 -0
  731. package/src/modes/theme/defaults/dark-nebula.json +90 -0
  732. package/src/modes/theme/defaults/dark-nord.json +97 -0
  733. package/src/modes/theme/defaults/dark-ocean.json +101 -0
  734. package/src/modes/theme/defaults/dark-one.json +100 -0
  735. package/src/modes/theme/defaults/dark-poimandres.json +142 -0
  736. package/src/modes/theme/defaults/dark-rainforest.json +91 -0
  737. package/src/modes/theme/defaults/dark-reef.json +91 -0
  738. package/src/modes/theme/defaults/dark-retro.json +92 -0
  739. package/src/modes/theme/defaults/dark-rose-pine.json +96 -0
  740. package/src/modes/theme/defaults/dark-sakura.json +95 -0
  741. package/src/modes/theme/defaults/dark-slate.json +95 -0
  742. package/src/modes/theme/defaults/dark-solarized.json +97 -0
  743. package/src/modes/theme/defaults/dark-solstice.json +90 -0
  744. package/src/modes/theme/defaults/dark-starfall.json +91 -0
  745. package/src/modes/theme/defaults/dark-sunset.json +99 -0
  746. package/src/modes/theme/defaults/dark-swamp.json +90 -0
  747. package/src/modes/theme/defaults/dark-synthwave.json +103 -0
  748. package/src/modes/theme/defaults/dark-taiga.json +91 -0
  749. package/src/modes/theme/defaults/dark-terminal.json +95 -0
  750. package/src/modes/theme/defaults/dark-tokyo-night.json +101 -0
  751. package/src/modes/theme/defaults/dark-tundra.json +91 -0
  752. package/src/modes/theme/defaults/dark-twilight.json +91 -0
  753. package/src/modes/theme/defaults/dark-volcanic.json +91 -0
  754. package/src/modes/theme/defaults/graphite.json +92 -0
  755. package/src/modes/theme/defaults/index.ts +199 -0
  756. package/src/modes/theme/defaults/light-arctic.json +107 -0
  757. package/src/modes/theme/defaults/light-aurora-day.json +91 -0
  758. package/src/modes/theme/defaults/light-canyon.json +91 -0
  759. package/src/modes/theme/defaults/light-catppuccin.json +106 -0
  760. package/src/modes/theme/defaults/light-cirrus.json +90 -0
  761. package/src/modes/theme/defaults/light-coral.json +95 -0
  762. package/src/modes/theme/defaults/light-cyberpunk.json +96 -0
  763. package/src/modes/theme/defaults/light-dawn.json +90 -0
  764. package/src/modes/theme/defaults/light-dunes.json +91 -0
  765. package/src/modes/theme/defaults/light-eucalyptus.json +95 -0
  766. package/src/modes/theme/defaults/light-forest.json +100 -0
  767. package/src/modes/theme/defaults/light-frost.json +95 -0
  768. package/src/modes/theme/defaults/light-github.json +115 -0
  769. package/src/modes/theme/defaults/light-glacier.json +91 -0
  770. package/src/modes/theme/defaults/light-gruvbox.json +108 -0
  771. package/src/modes/theme/defaults/light-haze.json +90 -0
  772. package/src/modes/theme/defaults/light-honeycomb.json +95 -0
  773. package/src/modes/theme/defaults/light-lagoon.json +91 -0
  774. package/src/modes/theme/defaults/light-lavender.json +95 -0
  775. package/src/modes/theme/defaults/light-meadow.json +91 -0
  776. package/src/modes/theme/defaults/light-mint.json +95 -0
  777. package/src/modes/theme/defaults/light-monochrome.json +101 -0
  778. package/src/modes/theme/defaults/light-ocean.json +99 -0
  779. package/src/modes/theme/defaults/light-one.json +99 -0
  780. package/src/modes/theme/defaults/light-opal.json +91 -0
  781. package/src/modes/theme/defaults/light-orchard.json +91 -0
  782. package/src/modes/theme/defaults/light-paper.json +95 -0
  783. package/src/modes/theme/defaults/light-poimandres.json +142 -0
  784. package/src/modes/theme/defaults/light-prism.json +90 -0
  785. package/src/modes/theme/defaults/light-retro.json +98 -0
  786. package/src/modes/theme/defaults/light-sand.json +95 -0
  787. package/src/modes/theme/defaults/light-savanna.json +91 -0
  788. package/src/modes/theme/defaults/light-solarized.json +102 -0
  789. package/src/modes/theme/defaults/light-soleil.json +90 -0
  790. package/src/modes/theme/defaults/light-sunset.json +99 -0
  791. package/src/modes/theme/defaults/light-synthwave.json +98 -0
  792. package/src/modes/theme/defaults/light-tokyo-night.json +111 -0
  793. package/src/modes/theme/defaults/light-wetland.json +91 -0
  794. package/src/modes/theme/defaults/light-zenith.json +89 -0
  795. package/src/modes/theme/defaults/limestone.json +94 -0
  796. package/src/modes/theme/defaults/mahogany.json +97 -0
  797. package/src/modes/theme/defaults/marble.json +93 -0
  798. package/src/modes/theme/defaults/obsidian.json +91 -0
  799. package/src/modes/theme/defaults/onyx.json +91 -0
  800. package/src/modes/theme/defaults/pearl.json +93 -0
  801. package/src/modes/theme/defaults/porcelain.json +91 -0
  802. package/src/modes/theme/defaults/quartz.json +96 -0
  803. package/src/modes/theme/defaults/sandstone.json +95 -0
  804. package/src/modes/theme/defaults/titanium.json +90 -0
  805. package/src/modes/theme/light.json +93 -0
  806. package/src/modes/theme/mermaid-cache.ts +92 -0
  807. package/src/modes/theme/shimmer.ts +235 -0
  808. package/src/modes/theme/theme-schema.json +459 -0
  809. package/src/modes/theme/theme.ts +2915 -0
  810. package/src/modes/turn-budget.ts +31 -0
  811. package/src/modes/types.ts +406 -0
  812. package/src/modes/ultrathink.ts +41 -0
  813. package/src/modes/utils/context-usage.ts +432 -0
  814. package/src/modes/utils/copy-targets.ts +360 -0
  815. package/src/modes/utils/hotkeys-markdown.ts +62 -0
  816. package/src/modes/utils/keybinding-matchers.ts +51 -0
  817. package/src/modes/utils/tools-markdown.ts +27 -0
  818. package/src/modes/utils/ui-helpers.ts +886 -0
  819. package/src/modes/workflow.ts +42 -0
  820. package/src/plan-mode/approved-plan.ts +186 -0
  821. package/src/plan-mode/plan-handoff.ts +37 -0
  822. package/src/plan-mode/plan-protection.ts +31 -0
  823. package/src/plan-mode/state.ts +6 -0
  824. package/src/priority.json +45 -0
  825. package/src/prompts/advisor/advise-tool.md +3 -0
  826. package/src/prompts/advisor/system.md +113 -0
  827. package/src/prompts/agents/designer.md +74 -0
  828. package/src/prompts/agents/explore.md +58 -0
  829. package/src/prompts/agents/frontmatter.md +11 -0
  830. package/src/prompts/agents/init.md +33 -0
  831. package/src/prompts/agents/librarian.md +119 -0
  832. package/src/prompts/agents/oracle.md +54 -0
  833. package/src/prompts/agents/plan.md +48 -0
  834. package/src/prompts/agents/reviewer.md +139 -0
  835. package/src/prompts/agents/task.md +17 -0
  836. package/src/prompts/bench.md +12 -0
  837. package/src/prompts/ci-green-request.md +36 -0
  838. package/src/prompts/dry-balance-bench.md +8 -0
  839. package/src/prompts/goals/goal-budget-limit.md +16 -0
  840. package/src/prompts/goals/goal-continuation.md +28 -0
  841. package/src/prompts/goals/goal-mode-active.md +23 -0
  842. package/src/prompts/goals/guided-goal-interview.md +8 -0
  843. package/src/prompts/goals/guided-goal-system.md +12 -0
  844. package/src/prompts/low-end/system.md +47 -0
  845. package/src/prompts/memories/consolidation.md +30 -0
  846. package/src/prompts/memories/consolidation_system.md +4 -0
  847. package/src/prompts/memories/read-path.md +17 -0
  848. package/src/prompts/memories/stage_one_input.md +6 -0
  849. package/src/prompts/memories/stage_one_system.md +21 -0
  850. package/src/prompts/review-custom-request.md +22 -0
  851. package/src/prompts/review-headless-request.md +16 -0
  852. package/src/prompts/review-request.md +69 -0
  853. package/src/prompts/steering/user-interjection.md +9 -0
  854. package/src/prompts/system/agent-creation-architect.md +50 -0
  855. package/src/prompts/system/agent-creation-user.md +6 -0
  856. package/src/prompts/system/auto-continue.md +1 -0
  857. package/src/prompts/system/auto-thinking-difficulty-local.md +14 -0
  858. package/src/prompts/system/auto-thinking-difficulty.md +12 -0
  859. package/src/prompts/system/autolearn-guidance-learn.md +1 -0
  860. package/src/prompts/system/autolearn-guidance.md +7 -0
  861. package/src/prompts/system/autolearn-nudge.md +3 -0
  862. package/src/prompts/system/background-tan-dispatch.md +8 -0
  863. package/src/prompts/system/btw-user.md +8 -0
  864. package/src/prompts/system/commit-message-system.md +14 -0
  865. package/src/prompts/system/custom-system-prompt.md +64 -0
  866. package/src/prompts/system/eager-task.md +7 -0
  867. package/src/prompts/system/eager-todo.md +18 -0
  868. package/src/prompts/system/empty-stop-retry.md +4 -0
  869. package/src/prompts/system/irc-autoreply.md +6 -0
  870. package/src/prompts/system/irc-incoming.md +7 -0
  871. package/src/prompts/system/manual-continue.md +7 -0
  872. package/src/prompts/system/memory-consolidation-system.md +8 -0
  873. package/src/prompts/system/memory-extraction-system.md +26 -0
  874. package/src/prompts/system/omfg-user.md +50 -0
  875. package/src/prompts/system/orchestrate-notice.md +40 -0
  876. package/src/prompts/system/personalities/default.md +18 -0
  877. package/src/prompts/system/personalities/friendly.md +17 -0
  878. package/src/prompts/system/personalities/pragmatic.md +15 -0
  879. package/src/prompts/system/plan-mode-active.md +109 -0
  880. package/src/prompts/system/plan-mode-approved.md +25 -0
  881. package/src/prompts/system/plan-mode-compact-instructions.md +16 -0
  882. package/src/prompts/system/plan-mode-reference.md +11 -0
  883. package/src/prompts/system/plan-mode-subagent.md +33 -0
  884. package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
  885. package/src/prompts/system/project-prompt.md +52 -0
  886. package/src/prompts/system/snapcompact-context-frames-note.md +1 -0
  887. package/src/prompts/system/snapcompact-context-stub.md +1 -0
  888. package/src/prompts/system/snapcompact-system-frames-note.md +1 -0
  889. package/src/prompts/system/snapcompact-system-stub.md +1 -0
  890. package/src/prompts/system/snapcompact-toolresult-note.md +1 -0
  891. package/src/prompts/system/subagent-system-prompt.md +71 -0
  892. package/src/prompts/system/subagent-user-prompt.md +3 -0
  893. package/src/prompts/system/subagent-yield-reminder.md +12 -0
  894. package/src/prompts/system/system-prompt.md +251 -0
  895. package/src/prompts/system/tiny-title-system.md +8 -0
  896. package/src/prompts/system/title-marker-instruction.md +1 -0
  897. package/src/prompts/system/title-system-marker.md +16 -0
  898. package/src/prompts/system/title-system.md +16 -0
  899. package/src/prompts/system/ttsr-interrupt.md +7 -0
  900. package/src/prompts/system/ttsr-tool-reminder.md +5 -0
  901. package/src/prompts/system/ultrathink-notice.md +3 -0
  902. package/src/prompts/system/unexpected-stop-classifier.md +17 -0
  903. package/src/prompts/system/unexpected-stop-retry.md +4 -0
  904. package/src/prompts/system/web-search.md +25 -0
  905. package/src/prompts/system/workflow-notice.md +70 -0
  906. package/src/prompts/tools/apply-patch.md +65 -0
  907. package/src/prompts/tools/ask.md +22 -0
  908. package/src/prompts/tools/ast-edit.md +22 -0
  909. package/src/prompts/tools/ast-grep.md +25 -0
  910. package/src/prompts/tools/async-result.md +8 -0
  911. package/src/prompts/tools/bash.md +45 -0
  912. package/src/prompts/tools/browser.md +42 -0
  913. package/src/prompts/tools/checkpoint.md +15 -0
  914. package/src/prompts/tools/debug.md +17 -0
  915. package/src/prompts/tools/eval.md +70 -0
  916. package/src/prompts/tools/find.md +19 -0
  917. package/src/prompts/tools/github.md +17 -0
  918. package/src/prompts/tools/goal.md +11 -0
  919. package/src/prompts/tools/image-attachment-describe-system.md +8 -0
  920. package/src/prompts/tools/image-attachment-describe.md +10 -0
  921. package/src/prompts/tools/image-gen.md +7 -0
  922. package/src/prompts/tools/inspect-image-system.md +20 -0
  923. package/src/prompts/tools/inspect-image.md +22 -0
  924. package/src/prompts/tools/irc.md +33 -0
  925. package/src/prompts/tools/job.md +17 -0
  926. package/src/prompts/tools/learn.md +7 -0
  927. package/src/prompts/tools/lsp-late-diagnostic.md +8 -0
  928. package/src/prompts/tools/lsp.md +39 -0
  929. package/src/prompts/tools/manage-skill.md +9 -0
  930. package/src/prompts/tools/memory-edit.md +8 -0
  931. package/src/prompts/tools/patch.md +57 -0
  932. package/src/prompts/tools/read.md +76 -0
  933. package/src/prompts/tools/recall.md +5 -0
  934. package/src/prompts/tools/reflect.md +5 -0
  935. package/src/prompts/tools/replace.md +29 -0
  936. package/src/prompts/tools/resolve.md +4 -0
  937. package/src/prompts/tools/retain.md +6 -0
  938. package/src/prompts/tools/rewind.md +13 -0
  939. package/src/prompts/tools/search-tool-bm25.md +32 -0
  940. package/src/prompts/tools/search.md +22 -0
  941. package/src/prompts/tools/ssh.md +22 -0
  942. package/src/prompts/tools/task-summary.md +17 -0
  943. package/src/prompts/tools/task.md +91 -0
  944. package/src/prompts/tools/todo.md +39 -0
  945. package/src/prompts/tools/web-search.md +6 -0
  946. package/src/prompts/tools/write.md +14 -0
  947. package/src/registry/agent-lifecycle.ts +270 -0
  948. package/src/registry/agent-registry.ts +190 -0
  949. package/src/sdk.ts +2919 -0
  950. package/src/secrets/index.ts +123 -0
  951. package/src/secrets/obfuscator.ts +298 -0
  952. package/src/secrets/regex.ts +21 -0
  953. package/src/session/agent-session.ts +12539 -0
  954. package/src/session/agent-storage.ts +478 -0
  955. package/src/session/artifacts.ts +153 -0
  956. package/src/session/auth-broker-config.ts +92 -0
  957. package/src/session/auth-storage.ts +24 -0
  958. package/src/session/blob-store.ts +255 -0
  959. package/src/session/client-bridge.ts +85 -0
  960. package/src/session/codex-auto-reset.ts +202 -0
  961. package/src/session/compact-modes.ts +105 -0
  962. package/src/session/history-storage.ts +361 -0
  963. package/src/session/indexed-session-storage.ts +427 -0
  964. package/src/session/messages.ts +546 -0
  965. package/src/session/redis-session-storage.ts +170 -0
  966. package/src/session/session-context.ts +399 -0
  967. package/src/session/session-dump-format.ts +216 -0
  968. package/src/session/session-entries.ts +198 -0
  969. package/src/session/session-history-format.ts +308 -0
  970. package/src/session/session-listing.ts +588 -0
  971. package/src/session/session-loader.ts +93 -0
  972. package/src/session/session-manager.ts +1748 -0
  973. package/src/session/session-migrations.ts +78 -0
  974. package/src/session/session-paths.ts +193 -0
  975. package/src/session/session-persistence.ts +147 -0
  976. package/src/session/session-storage.ts +590 -0
  977. package/src/session/shake-types.ts +43 -0
  978. package/src/session/snapcompact-inline.ts +542 -0
  979. package/src/session/snapcompact-savings-journal.ts +113 -0
  980. package/src/session/sql-session-storage.ts +314 -0
  981. package/src/session/streaming-output.ts +1330 -0
  982. package/src/session/tool-choice-queue.ts +290 -0
  983. package/src/session/unexpected-stop-classifier.ts +129 -0
  984. package/src/session/yield-queue.ts +183 -0
  985. package/src/slash-commands/acp-builtins.ts +70 -0
  986. package/src/slash-commands/available-commands.ts +105 -0
  987. package/src/slash-commands/builtin-registry.ts +2332 -0
  988. package/src/slash-commands/helpers/active-oauth-account.ts +44 -0
  989. package/src/slash-commands/helpers/collab-qrcode.ts +28 -0
  990. package/src/slash-commands/helpers/context-report.ts +66 -0
  991. package/src/slash-commands/helpers/format.ts +46 -0
  992. package/src/slash-commands/helpers/logout.ts +88 -0
  993. package/src/slash-commands/helpers/marketplace-manager.ts +25 -0
  994. package/src/slash-commands/helpers/mcp.ts +532 -0
  995. package/src/slash-commands/helpers/parse.ts +85 -0
  996. package/src/slash-commands/helpers/reset-usage.ts +66 -0
  997. package/src/slash-commands/helpers/ssh.ts +195 -0
  998. package/src/slash-commands/helpers/stats-dashboard.ts +85 -0
  999. package/src/slash-commands/helpers/todo.ts +279 -0
  1000. package/src/slash-commands/helpers/usage-report.ts +128 -0
  1001. package/src/slash-commands/marketplace-install-parser.ts +99 -0
  1002. package/src/slash-commands/types.ts +135 -0
  1003. package/src/ssh/config-writer.ts +183 -0
  1004. package/src/ssh/connection-manager.ts +510 -0
  1005. package/src/ssh/ssh-executor.ts +189 -0
  1006. package/src/ssh/sshfs-mount.ts +140 -0
  1007. package/src/ssh/utils.ts +8 -0
  1008. package/src/startup-splash.ts +19 -0
  1009. package/src/stt/asr-client.ts +521 -0
  1010. package/src/stt/asr-protocol.ts +65 -0
  1011. package/src/stt/asr-worker.ts +790 -0
  1012. package/src/stt/downloader.ts +138 -0
  1013. package/src/stt/endpointer.ts +259 -0
  1014. package/src/stt/index.ts +7 -0
  1015. package/src/stt/models.ts +150 -0
  1016. package/src/stt/recorder.ts +538 -0
  1017. package/src/stt/stt-controller.ts +380 -0
  1018. package/src/stt/transcriber.ts +60 -0
  1019. package/src/stt/wav.ts +173 -0
  1020. package/src/system-prompt.ts +709 -0
  1021. package/src/task/agents.ts +166 -0
  1022. package/src/task/commands.ts +132 -0
  1023. package/src/task/discovery.ts +122 -0
  1024. package/src/task/executor.ts +2356 -0
  1025. package/src/task/index.ts +1580 -0
  1026. package/src/task/name-generator.ts +1577 -0
  1027. package/src/task/omp-command.ts +26 -0
  1028. package/src/task/output-manager.ts +93 -0
  1029. package/src/task/parallel.ts +116 -0
  1030. package/src/task/persisted-revive.ts +128 -0
  1031. package/src/task/render.ts +1558 -0
  1032. package/src/task/repair-args.ts +129 -0
  1033. package/src/task/subprocess-tool-registry.ts +88 -0
  1034. package/src/task/types.ts +401 -0
  1035. package/src/task/worktree.ts +514 -0
  1036. package/src/telemetry-export.ts +144 -0
  1037. package/src/thinking.ts +187 -0
  1038. package/src/tiny/device.ts +111 -0
  1039. package/src/tiny/dtype.ts +101 -0
  1040. package/src/tiny/models.ts +252 -0
  1041. package/src/tiny/text.ts +169 -0
  1042. package/src/tiny/title-client.ts +538 -0
  1043. package/src/tiny/title-protocol.ts +56 -0
  1044. package/src/tiny/worker.ts +491 -0
  1045. package/src/tool-discovery/mode.ts +24 -0
  1046. package/src/tool-discovery/tool-index.ts +271 -0
  1047. package/src/tools/__tests__/json-tree.test.ts +35 -0
  1048. package/src/tools/approval.ts +189 -0
  1049. package/src/tools/ask.ts +977 -0
  1050. package/src/tools/ast-edit.ts +700 -0
  1051. package/src/tools/ast-grep.ts +483 -0
  1052. package/src/tools/auto-generated-guard.ts +322 -0
  1053. package/src/tools/bash-command-fixup.ts +37 -0
  1054. package/src/tools/bash-interactive.ts +408 -0
  1055. package/src/tools/bash-interceptor.ts +67 -0
  1056. package/src/tools/bash-pty-selection.ts +14 -0
  1057. package/src/tools/bash-skill-urls.ts +248 -0
  1058. package/src/tools/bash.ts +1405 -0
  1059. package/src/tools/browser/attach.ts +194 -0
  1060. package/src/tools/browser/cmux/cmux-tab.ts +1264 -0
  1061. package/src/tools/browser/cmux/rpc.ts +156 -0
  1062. package/src/tools/browser/cmux/socket-client.ts +309 -0
  1063. package/src/tools/browser/launch.ts +673 -0
  1064. package/src/tools/browser/readable.ts +112 -0
  1065. package/src/tools/browser/registry.ts +241 -0
  1066. package/src/tools/browser/render.ts +221 -0
  1067. package/src/tools/browser/tab-protocol.ts +107 -0
  1068. package/src/tools/browser/tab-supervisor.ts +799 -0
  1069. package/src/tools/browser/tab-worker-entry.ts +29 -0
  1070. package/src/tools/browser/tab-worker.ts +1226 -0
  1071. package/src/tools/browser.ts +403 -0
  1072. package/src/tools/builtin-names.ts +34 -0
  1073. package/src/tools/checkpoint.ts +136 -0
  1074. package/src/tools/conflict-detect.ts +718 -0
  1075. package/src/tools/context.ts +39 -0
  1076. package/src/tools/debug.ts +1087 -0
  1077. package/src/tools/eval-backends.ts +27 -0
  1078. package/src/tools/eval-render.ts +762 -0
  1079. package/src/tools/eval.ts +600 -0
  1080. package/src/tools/fetch.ts +1902 -0
  1081. package/src/tools/file-recorder.ts +35 -0
  1082. package/src/tools/find.ts +629 -0
  1083. package/src/tools/fs-cache-invalidation.ts +28 -0
  1084. package/src/tools/gh-cache-invalidation.ts +255 -0
  1085. package/src/tools/gh-format.ts +12 -0
  1086. package/src/tools/gh-renderer.ts +481 -0
  1087. package/src/tools/gh.ts +3752 -0
  1088. package/src/tools/github-cache.ts +663 -0
  1089. package/src/tools/grouped-file-output.ts +210 -0
  1090. package/src/tools/image-gen.ts +1586 -0
  1091. package/src/tools/index.ts +649 -0
  1092. package/src/tools/inspect-image-renderer.ts +132 -0
  1093. package/src/tools/inspect-image.ts +260 -0
  1094. package/src/tools/irc.ts +788 -0
  1095. package/src/tools/job.ts +612 -0
  1096. package/src/tools/json-tree.ts +260 -0
  1097. package/src/tools/jtd-to-json-schema.ts +219 -0
  1098. package/src/tools/jtd-to-typescript.ts +136 -0
  1099. package/src/tools/jtd-utils.ts +102 -0
  1100. package/src/tools/learn.ts +141 -0
  1101. package/src/tools/list-limit.ts +40 -0
  1102. package/src/tools/manage-skill.ts +100 -0
  1103. package/src/tools/match-line-format.ts +20 -0
  1104. package/src/tools/memory-edit.ts +59 -0
  1105. package/src/tools/memory-recall.ts +102 -0
  1106. package/src/tools/memory-reflect.ts +88 -0
  1107. package/src/tools/memory-render.ts +202 -0
  1108. package/src/tools/memory-retain.ts +89 -0
  1109. package/src/tools/output-meta.ts +768 -0
  1110. package/src/tools/output-schema-validator.ts +132 -0
  1111. package/src/tools/path-utils.ts +1116 -0
  1112. package/src/tools/plan-mode-guard.ts +142 -0
  1113. package/src/tools/puppeteer/00_stealth_tampering.txt +63 -0
  1114. package/src/tools/puppeteer/01_stealth_activity.txt +20 -0
  1115. package/src/tools/puppeteer/02_stealth_hairline.txt +11 -0
  1116. package/src/tools/puppeteer/03_stealth_botd.txt +384 -0
  1117. package/src/tools/puppeteer/04_stealth_iframe.txt +81 -0
  1118. package/src/tools/puppeteer/05_stealth_webgl.txt +75 -0
  1119. package/src/tools/puppeteer/06_stealth_screen.txt +72 -0
  1120. package/src/tools/puppeteer/07_stealth_fonts.txt +97 -0
  1121. package/src/tools/puppeteer/08_stealth_audio.txt +51 -0
  1122. package/src/tools/puppeteer/09_stealth_locale.txt +46 -0
  1123. package/src/tools/puppeteer/10_stealth_plugins.txt +208 -0
  1124. package/src/tools/puppeteer/11_stealth_hardware.txt +8 -0
  1125. package/src/tools/puppeteer/12_stealth_codecs.txt +40 -0
  1126. package/src/tools/puppeteer/13_stealth_worker.txt +74 -0
  1127. package/src/tools/read.ts +3124 -0
  1128. package/src/tools/render-utils.ts +895 -0
  1129. package/src/tools/renderers.ts +86 -0
  1130. package/src/tools/report-tool-issue.ts +530 -0
  1131. package/src/tools/resolve.ts +302 -0
  1132. package/src/tools/review.ts +251 -0
  1133. package/src/tools/search-tool-bm25.ts +351 -0
  1134. package/src/tools/search.ts +1583 -0
  1135. package/src/tools/sqlite-reader.ts +828 -0
  1136. package/src/tools/ssh.ts +369 -0
  1137. package/src/tools/todo.ts +938 -0
  1138. package/src/tools/tool-errors.ts +62 -0
  1139. package/src/tools/tool-result.ts +102 -0
  1140. package/src/tools/tool-timeouts.ts +30 -0
  1141. package/src/tools/tts.ts +265 -0
  1142. package/src/tools/write.ts +1182 -0
  1143. package/src/tools/yield.ts +269 -0
  1144. package/src/tts/downloader.ts +64 -0
  1145. package/src/tts/index.ts +8 -0
  1146. package/src/tts/models.ts +137 -0
  1147. package/src/tts/player.ts +137 -0
  1148. package/src/tts/runtime.ts +21 -0
  1149. package/src/tts/streaming-player.ts +266 -0
  1150. package/src/tts/tts-client.ts +642 -0
  1151. package/src/tts/tts-protocol.ts +60 -0
  1152. package/src/tts/tts-worker.ts +505 -0
  1153. package/src/tts/vocalizer.ts +162 -0
  1154. package/src/tts/wav.ts +58 -0
  1155. package/src/tui/code-cell.ts +257 -0
  1156. package/src/tui/file-list.ts +55 -0
  1157. package/src/tui/hyperlink.ts +178 -0
  1158. package/src/tui/index.ts +13 -0
  1159. package/src/tui/output-block.ts +240 -0
  1160. package/src/tui/status-line.ts +54 -0
  1161. package/src/tui/tree-list.ts +133 -0
  1162. package/src/tui/types.ts +15 -0
  1163. package/src/tui/utils.ts +103 -0
  1164. package/src/tui/width-aware-text.ts +58 -0
  1165. package/src/utils/block-context.ts +312 -0
  1166. package/src/utils/changelog.ts +132 -0
  1167. package/src/utils/clipboard.ts +262 -0
  1168. package/src/utils/command-args.ts +76 -0
  1169. package/src/utils/commit-message-generator.ts +147 -0
  1170. package/src/utils/edit-mode.ts +41 -0
  1171. package/src/utils/enhanced-paste.ts +230 -0
  1172. package/src/utils/event-bus.ts +33 -0
  1173. package/src/utils/external-editor.ts +78 -0
  1174. package/src/utils/file-display-mode.ts +45 -0
  1175. package/src/utils/file-mentions.ts +284 -0
  1176. package/src/utils/git.ts +1838 -0
  1177. package/src/utils/image-loading.ts +231 -0
  1178. package/src/utils/image-resize.ts +309 -0
  1179. package/src/utils/image-vision-fallback.ts +197 -0
  1180. package/src/utils/ipc.ts +38 -0
  1181. package/src/utils/jj.ts +248 -0
  1182. package/src/utils/lang-from-path.ts +244 -0
  1183. package/src/utils/markit.ts +143 -0
  1184. package/src/utils/mupdf-wasm-embed.ts +12 -0
  1185. package/src/utils/open.ts +55 -0
  1186. package/src/utils/qrcode.ts +535 -0
  1187. package/src/utils/session-color.ts +142 -0
  1188. package/src/utils/shell-snapshot.ts +187 -0
  1189. package/src/utils/sixel.ts +69 -0
  1190. package/src/utils/thinking-display.ts +11 -0
  1191. package/src/utils/title-generator.ts +416 -0
  1192. package/src/utils/tool-choice.ts +49 -0
  1193. package/src/utils/tools-manager.ts +372 -0
  1194. package/src/utils/turndown.ts +83 -0
  1195. package/src/utils/zip.ts +1091 -0
  1196. package/src/web/kagi.ts +304 -0
  1197. package/src/web/parallel.ts +353 -0
  1198. package/src/web/scrapers/artifacthub.ts +207 -0
  1199. package/src/web/scrapers/arxiv.ts +83 -0
  1200. package/src/web/scrapers/aur.ts +162 -0
  1201. package/src/web/scrapers/biorxiv.ts +133 -0
  1202. package/src/web/scrapers/bluesky.ts +262 -0
  1203. package/src/web/scrapers/brew.ts +172 -0
  1204. package/src/web/scrapers/cheatsh.ts +68 -0
  1205. package/src/web/scrapers/chocolatey.ts +196 -0
  1206. package/src/web/scrapers/choosealicense.ts +95 -0
  1207. package/src/web/scrapers/cisa-kev.ts +87 -0
  1208. package/src/web/scrapers/clojars.ts +154 -0
  1209. package/src/web/scrapers/coingecko.ts +177 -0
  1210. package/src/web/scrapers/crates-io.ts +97 -0
  1211. package/src/web/scrapers/crossref.ts +136 -0
  1212. package/src/web/scrapers/devto.ts +147 -0
  1213. package/src/web/scrapers/discogs.ts +306 -0
  1214. package/src/web/scrapers/discourse.ts +197 -0
  1215. package/src/web/scrapers/dockerhub.ts +138 -0
  1216. package/src/web/scrapers/docs-rs.ts +652 -0
  1217. package/src/web/scrapers/fdroid.ts +134 -0
  1218. package/src/web/scrapers/firefox-addons.ts +191 -0
  1219. package/src/web/scrapers/flathub.ts +223 -0
  1220. package/src/web/scrapers/github-gist.ts +58 -0
  1221. package/src/web/scrapers/github.ts +800 -0
  1222. package/src/web/scrapers/gitlab.ts +401 -0
  1223. package/src/web/scrapers/go-pkg.ts +266 -0
  1224. package/src/web/scrapers/hackage.ts +140 -0
  1225. package/src/web/scrapers/hackernews.ts +189 -0
  1226. package/src/web/scrapers/hex.ts +105 -0
  1227. package/src/web/scrapers/huggingface.ts +321 -0
  1228. package/src/web/scrapers/iacr.ts +89 -0
  1229. package/src/web/scrapers/index.ts +252 -0
  1230. package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
  1231. package/src/web/scrapers/lemmy.ts +203 -0
  1232. package/src/web/scrapers/lobsters.ts +175 -0
  1233. package/src/web/scrapers/mastodon.ts +292 -0
  1234. package/src/web/scrapers/maven.ts +138 -0
  1235. package/src/web/scrapers/mdn.ts +173 -0
  1236. package/src/web/scrapers/metacpan.ts +222 -0
  1237. package/src/web/scrapers/musicbrainz.ts +250 -0
  1238. package/src/web/scrapers/npm.ts +98 -0
  1239. package/src/web/scrapers/nuget.ts +183 -0
  1240. package/src/web/scrapers/nvd.ts +222 -0
  1241. package/src/web/scrapers/ollama.ts +239 -0
  1242. package/src/web/scrapers/open-vsx.ts +106 -0
  1243. package/src/web/scrapers/opencorporates.ts +292 -0
  1244. package/src/web/scrapers/openlibrary.ts +336 -0
  1245. package/src/web/scrapers/orcid.ts +286 -0
  1246. package/src/web/scrapers/osv.ts +176 -0
  1247. package/src/web/scrapers/packagist.ts +160 -0
  1248. package/src/web/scrapers/pub-dev.ts +143 -0
  1249. package/src/web/scrapers/pubmed.ts +211 -0
  1250. package/src/web/scrapers/pypi.ts +112 -0
  1251. package/src/web/scrapers/rawg.ts +110 -0
  1252. package/src/web/scrapers/readthedocs.ts +120 -0
  1253. package/src/web/scrapers/reddit.ts +95 -0
  1254. package/src/web/scrapers/repology.ts +251 -0
  1255. package/src/web/scrapers/rfc.ts +201 -0
  1256. package/src/web/scrapers/rubygems.ts +103 -0
  1257. package/src/web/scrapers/searchcode.ts +189 -0
  1258. package/src/web/scrapers/sec-edgar.ts +261 -0
  1259. package/src/web/scrapers/semantic-scholar.ts +171 -0
  1260. package/src/web/scrapers/snapcraft.ts +187 -0
  1261. package/src/web/scrapers/sourcegraph.ts +336 -0
  1262. package/src/web/scrapers/spdx.ts +108 -0
  1263. package/src/web/scrapers/spotify.ts +198 -0
  1264. package/src/web/scrapers/stackoverflow.ts +120 -0
  1265. package/src/web/scrapers/terraform.ts +277 -0
  1266. package/src/web/scrapers/tldr.ts +47 -0
  1267. package/src/web/scrapers/twitter.ts +94 -0
  1268. package/src/web/scrapers/types.ts +354 -0
  1269. package/src/web/scrapers/utils.ts +109 -0
  1270. package/src/web/scrapers/vimeo.ts +133 -0
  1271. package/src/web/scrapers/vscode-marketplace.ts +187 -0
  1272. package/src/web/scrapers/w3c.ts +156 -0
  1273. package/src/web/scrapers/wikidata.ts +344 -0
  1274. package/src/web/scrapers/wikipedia.ts +84 -0
  1275. package/src/web/scrapers/youtube.ts +325 -0
  1276. package/src/web/search/index.ts +317 -0
  1277. package/src/web/search/provider.ts +169 -0
  1278. package/src/web/search/providers/anthropic.ts +343 -0
  1279. package/src/web/search/providers/base.ts +90 -0
  1280. package/src/web/search/providers/brave.ts +152 -0
  1281. package/src/web/search/providers/codex.ts +593 -0
  1282. package/src/web/search/providers/exa.ts +400 -0
  1283. package/src/web/search/providers/gemini.ts +518 -0
  1284. package/src/web/search/providers/jina.ts +111 -0
  1285. package/src/web/search/providers/kagi.ts +86 -0
  1286. package/src/web/search/providers/kimi.ts +196 -0
  1287. package/src/web/search/providers/parallel.ts +225 -0
  1288. package/src/web/search/providers/perplexity-auth.ts +133 -0
  1289. package/src/web/search/providers/perplexity.ts +866 -0
  1290. package/src/web/search/providers/searxng.ts +325 -0
  1291. package/src/web/search/providers/synthetic.ts +114 -0
  1292. package/src/web/search/providers/tavily.ts +176 -0
  1293. package/src/web/search/providers/utils.ts +128 -0
  1294. package/src/web/search/providers/zai.ts +333 -0
  1295. package/src/web/search/render.ts +262 -0
  1296. package/src/web/search/types.ts +462 -0
  1297. package/src/web/search/utils.ts +17 -0
  1298. package/src/workspace-tree.ts +326 -0
@@ -0,0 +1,1116 @@
1
+ import * as fs from "node:fs";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ import * as url from "node:url";
5
+ import { isEnoent } from "@oh-my-pi/pi-utils";
6
+ import { InternalUrlRouter, type LocalProtocolOptions } from "../internal-urls";
7
+ import { ToolError } from "./tool-errors";
8
+
9
+ const UNICODE_SPACES = /[\u00A0\u2000-\u200A\u202F\u205F\u3000]/g;
10
+ // A single line-range chunk: `N`, `N-M`, `N+K`, or open-ended `N-`. `..` is
11
+ // accepted everywhere `-` is, as a forgiving alias for Rust/Python-style ranges
12
+ // (e.g. `2724..2727` == `2724-2727`, `2724..` == `2724-`); it is normalized to
13
+ // `-` in parseLineRangeChunk. Keep this fragment and LINE_RANGE_CHUNK_RE in sync.
14
+ const RANGE_CHUNK_SRC = String.raw`L?\d+(?:(?:[-+]|\.\.)L?\d+|-|\.\.)?`;
15
+ const RANGE_LIST_SRC = `${RANGE_CHUNK_SRC}(?:,${RANGE_CHUNK_SRC})*`;
16
+ const FILE_LINE_RANGE_RE = new RegExp(`^(?:${RANGE_LIST_SRC}|raw|conflicts)$`, "i");
17
+ const FILE_LINE_RANGE_ONLY_RE = new RegExp(`^${RANGE_LIST_SRC}$`, "i");
18
+ const FILE_RAW_ONLY_RE = /^raw$/i;
19
+ // Permissive selector chunk for internal URLs — accepts well-formed selectors
20
+ // plus common malformed shapes (e.g. `:-N`) so the read tool peels the entire
21
+ // selector chain off before dispatching to a protocol handler.
22
+ const INTERNAL_URL_SELECTOR_PART_RE = new RegExp(
23
+ String.raw`^(?:raw|conflicts|${RANGE_LIST_SRC}|-\d+(?:[-+]\d+)?)$`,
24
+ "i",
25
+ );
26
+ // Schemes whose host grammar is identifier-shaped, so any trailing
27
+ // `:<selector-chunk>` is unambiguously a read-tool selector. `mcp://` is
28
+ // excluded because mcp resource URIs may legitimately contain colons.
29
+ const INTERNAL_SCHEMES_WITH_SELECTORS: Record<string, true> = {
30
+ agent: true,
31
+ artifact: true,
32
+ issue: true,
33
+ local: true,
34
+ memory: true,
35
+ omp: true,
36
+ pr: true,
37
+ rule: true,
38
+ skill: true,
39
+ vault: true,
40
+ };
41
+ // Schemes whose resource URIs are server-defined and may legitimately end
42
+ // with selector-shaped tails (e.g. `:raw`, `:conflicts`, `:1-50`, `/:raw`).
43
+ // `McpProtocolHandler` resolves by exact URI match (`r.uri === uri`), so
44
+ // peeling syntactically can make valid resources unreachable. Keep these
45
+ // schemes opaque; selector support for them needs a resolver-aware path that
46
+ // tries the exact URI before interpreting any suffix as a read selector.
47
+ const OPAQUE_RESOURCE_SCHEMES: ReadonlySet<string> = new Set(["mcp"]);
48
+ const INTERNAL_URL_SCHEME_RE = /^([a-z][a-z0-9+.-]*):\/\//i;
49
+ const NARROW_NO_BREAK_SPACE = "\u202F";
50
+ const TOP_LEVEL_INTERNAL_URL_PREFIXES = [
51
+ "agent://",
52
+ "artifact://",
53
+ "skill://",
54
+ "rule://",
55
+ "local://",
56
+ "mcp://",
57
+ "vault://",
58
+ ] as const;
59
+
60
+ function normalizeUnicodeSpaces(str: string): string {
61
+ return str.replace(UNICODE_SPACES, " ");
62
+ }
63
+
64
+ function tryMacOSScreenshotPath(filePath: string): string {
65
+ return filePath.replace(/ (AM|PM)\./g, `${NARROW_NO_BREAK_SPACE}$1.`);
66
+ }
67
+
68
+ function tryNFDVariant(filePath: string): string {
69
+ // macOS stores filenames in NFD (decomposed) form, try converting user input to NFD
70
+ return filePath.normalize("NFD");
71
+ }
72
+
73
+ function tryCurlyQuoteVariant(filePath: string): string {
74
+ // macOS uses U+2019 (right single quotation mark) in screenshot names like "Capture d'écran"
75
+ // Users typically type U+0027 (straight apostrophe)
76
+ return filePath.replace(/'/g, "\u2019");
77
+ }
78
+
79
+ function tryShellEscapedPath(filePath: string): string {
80
+ if (!filePath.includes("\\") || !filePath.includes("/")) return filePath;
81
+ return filePath.replace(/\\([ \t"'(){}[\]])/g, "$1");
82
+ }
83
+
84
+ function fileExists(filePath: string): boolean {
85
+ try {
86
+ fs.accessSync(filePath, fs.constants.F_OK);
87
+ return true;
88
+ } catch {
89
+ return false;
90
+ }
91
+ }
92
+
93
+ function normalizeAtPrefix(filePath: string): string {
94
+ if (!filePath.startsWith("@")) return filePath;
95
+
96
+ const withoutAt = filePath.slice(1);
97
+
98
+ // We only treat a leading "@" as a shorthand for a small set of well-known
99
+ // syntaxes. This avoids mangling literal paths like "@my-file.txt".
100
+ if (
101
+ withoutAt.startsWith("/") ||
102
+ withoutAt === "~" ||
103
+ withoutAt.startsWith("~/") ||
104
+ // Windows absolute paths (drive letters / UNC / root-relative)
105
+ path.win32.isAbsolute(withoutAt) ||
106
+ // Internal URL shorthands
107
+ withoutAt.startsWith("agent://") ||
108
+ withoutAt.startsWith("artifact://") ||
109
+ withoutAt.startsWith("skill://") ||
110
+ withoutAt.startsWith("rule://") ||
111
+ withoutAt.startsWith("local:") ||
112
+ withoutAt.startsWith("mcp://")
113
+ ) {
114
+ return withoutAt;
115
+ }
116
+
117
+ return filePath;
118
+ }
119
+
120
+ function stripFileUrl(filePath: string): string {
121
+ if (!filePath.toLowerCase().startsWith("file://")) return filePath;
122
+
123
+ try {
124
+ return url.fileURLToPath(filePath);
125
+ } catch {
126
+ return filePath;
127
+ }
128
+ }
129
+
130
+ export function expandTilde(filePath: string, home?: string): string {
131
+ const h = home ?? os.homedir();
132
+ if (filePath === "~") return h;
133
+ if (filePath.startsWith("~/") || filePath.startsWith("~\\")) {
134
+ return h + filePath.slice(1);
135
+ }
136
+ if (filePath.startsWith("~")) {
137
+ return path.join(h, filePath.slice(1));
138
+ }
139
+ return filePath;
140
+ }
141
+
142
+ export function expandPath(filePath: string): string {
143
+ const normalized = stripFileUrl(normalizeUnicodeSpaces(normalizeAtPrefix(filePath)));
144
+ return expandTilde(normalized);
145
+ }
146
+
147
+ function isAsciiDriveLetter(value: string): boolean {
148
+ if (value.length !== 1) return false;
149
+ const code = value.charCodeAt(0);
150
+ return (code >= 65 && code <= 90) || (code >= 97 && code <= 122);
151
+ }
152
+
153
+ function windowsDriveAliasPath(filePath: string): string | undefined {
154
+ if (!filePath.startsWith("/")) return undefined;
155
+ const parts = filePath.split("/");
156
+ if (parts[0] !== "") return undefined;
157
+
158
+ let drive: string | undefined;
159
+ let tailStart = 2;
160
+ if (parts.length >= 2 && isAsciiDriveLetter(parts[1] ?? "")) {
161
+ drive = parts[1]!.toUpperCase();
162
+ } else if (parts.length >= 3 && (parts[1] ?? "").toLowerCase() === "mnt" && isAsciiDriveLetter(parts[2] ?? "")) {
163
+ drive = parts[2]!.toUpperCase();
164
+ tailStart = 3;
165
+ }
166
+ if (!drive) return undefined;
167
+
168
+ const tail = parts.slice(tailStart).filter(Boolean).join("\\");
169
+ return tail ? `${drive}:\\${tail}` : `${drive}:\\`;
170
+ }
171
+
172
+ export function normalizeWindowsDriveAliasPath(filePath: string, platform: NodeJS.Platform = process.platform): string {
173
+ if (platform !== "win32") return filePath;
174
+ return windowsDriveAliasPath(filePath) ?? filePath;
175
+ }
176
+
177
+ /**
178
+ * Inclusive line range describing one selector segment (e.g. `50-100`,
179
+ * `301-`, or `50+10`). `endLine` is `undefined` for open-ended ranges.
180
+ */
181
+ export interface LineRange {
182
+ startLine: number;
183
+ endLine: number | undefined;
184
+ }
185
+
186
+ const LINE_RANGE_CHUNK_RE = /^L?(\d+)(?:(\.\.|[-+])L?(\d+)?)?$/i;
187
+
188
+ /** Parse a single `N`, `N-M`, `N-`, `N+K`, or `..`-aliased (`N..M`, `N..`) chunk. Throws via {@link ToolError} on invalid bounds. */
189
+ export function parseLineRangeChunk(sel: string): LineRange | null {
190
+ const lineMatch = LINE_RANGE_CHUNK_RE.exec(sel);
191
+ if (!lineMatch) return null;
192
+ const rawStart = Number.parseInt(lineMatch[1]!, 10);
193
+ if (rawStart < 1) {
194
+ throw new ToolError("Line selector 0 is invalid; lines are 1-indexed. Use :1.");
195
+ }
196
+ // `..` is a forgiving alias for `-` (e.g. `2724..2727` == `2724-2727`).
197
+ const sep = lineMatch[2] === ".." ? "-" : lineMatch[2];
198
+ const rhs = lineMatch[3] ? Number.parseInt(lineMatch[3], 10) : undefined;
199
+ let rawEnd: number | undefined;
200
+ if (sep === "+") {
201
+ if (rhs === undefined || rhs < 1) {
202
+ throw new ToolError(`Invalid range ${rawStart}+${rhs ?? 0}: count must be >= 1.`);
203
+ }
204
+ rawEnd = rawStart + rhs - 1;
205
+ } else if (sep === "-") {
206
+ // `301-` is shorthand for "from 301 onward" — equivalent to bare `301`.
207
+ if (rhs !== undefined) {
208
+ if (rhs < rawStart) {
209
+ throw new ToolError(`Invalid range ${rawStart}-${rhs}: end must be >= start.`);
210
+ }
211
+ rawEnd = rhs;
212
+ }
213
+ }
214
+ return { startLine: rawStart, endLine: rawEnd };
215
+ }
216
+
217
+ /**
218
+ * Parse a comma-separated list of line ranges (e.g. `5-16,960-973`). Returns
219
+ * the ranges in ascending order with overlapping/adjacent ranges merged so
220
+ * downstream consumers can stream the file in a single forward pass per range.
221
+ */
222
+ export function parseLineRanges(sel: string): [LineRange, ...LineRange[]] | null {
223
+ const chunks = sel.split(",");
224
+ const parsed: LineRange[] = [];
225
+ for (const chunk of chunks) {
226
+ const range = parseLineRangeChunk(chunk);
227
+ if (!range) return null;
228
+ parsed.push(range);
229
+ }
230
+ if (parsed.length === 0) return null;
231
+ parsed.sort((a, b) => a.startLine - b.startLine);
232
+
233
+ const merged: LineRange[] = [parsed[0]];
234
+ for (let i = 1; i < parsed.length; i++) {
235
+ const current = parsed[i];
236
+ const last = merged[merged.length - 1];
237
+ // Open-ended (endLine undefined) means "to EOF" — any later range is absorbed.
238
+ if (last.endLine === undefined) continue;
239
+ // Merge when current starts within (or immediately after) the last range.
240
+ if (current.startLine <= last.endLine + 1) {
241
+ if (current.endLine === undefined || current.endLine > last.endLine) {
242
+ merged[merged.length - 1] = { startLine: last.startLine, endLine: current.endLine };
243
+ }
244
+ continue;
245
+ }
246
+ merged.push(current);
247
+ }
248
+ return merged as [LineRange, ...LineRange[]];
249
+ }
250
+
251
+ /**
252
+ * Extract the line-range component from a read-tool selector that may also
253
+ * carry a verbatim/index display mode (`raw`, `conflicts`) — alone or compounded
254
+ * with a range (`raw:50-100`, `50-100:raw`). Returns the parsed ranges when the
255
+ * selector names any, otherwise `undefined` (pure `raw`/`conflicts`/none).
256
+ *
257
+ * Used by content search, which honors line ranges as a match filter but has no
258
+ * use for verbatim/conflict display modes — so those selectors are accepted and
259
+ * treated as an unfiltered, whole-resource search rather than rejected.
260
+ */
261
+ export function selectorLineRanges(sel: string | undefined): [LineRange, ...LineRange[]] | undefined {
262
+ if (!sel) return undefined;
263
+ for (const chunk of sel.split(":")) {
264
+ const lower = chunk.toLowerCase();
265
+ if (lower === "raw" || lower === "conflicts") continue;
266
+ const ranges = parseLineRanges(chunk);
267
+ if (ranges) return ranges;
268
+ }
269
+ return undefined;
270
+ }
271
+
272
+ /** Return `true` when `lineNumber` (1-indexed) falls in any of the supplied ranges. */
273
+ export function isLineInRanges(lineNumber: number, ranges: readonly LineRange[]): boolean {
274
+ for (const range of ranges) {
275
+ if (lineNumber < range.startLine) continue;
276
+ if (range.endLine === undefined || lineNumber <= range.endLine) return true;
277
+ }
278
+ return false;
279
+ }
280
+
281
+ export function splitPathAndSel(rawPath: string): { path: string; sel?: string } {
282
+ const colon = rawPath.lastIndexOf(":");
283
+ if (colon <= 0) return { path: rawPath };
284
+
285
+ const candidate = rawPath.slice(colon + 1);
286
+ if (!FILE_LINE_RANGE_RE.test(candidate)) return { path: rawPath };
287
+
288
+ let basePath = rawPath.slice(0, colon);
289
+ let sel = candidate;
290
+
291
+ // Allow a compound trailing selector: `path:1-50:raw` or `path:raw:1-50`.
292
+ // The two chunks must be one line-range plus one `raw`, in either order.
293
+ const innerColon = basePath.lastIndexOf(":");
294
+ if (innerColon > 0) {
295
+ const innerCandidate = basePath.slice(innerColon + 1);
296
+ const innerIsRaw = FILE_RAW_ONLY_RE.test(innerCandidate);
297
+ const outerIsRaw = FILE_RAW_ONLY_RE.test(candidate);
298
+ const innerIsRange = FILE_LINE_RANGE_ONLY_RE.test(innerCandidate);
299
+ const outerIsRange = FILE_LINE_RANGE_ONLY_RE.test(candidate);
300
+ if ((innerIsRaw && outerIsRange) || (innerIsRange && outerIsRaw)) {
301
+ sel = `${innerCandidate}:${candidate}`;
302
+ basePath = basePath.slice(0, innerColon);
303
+ }
304
+ }
305
+
306
+ return { path: basePath, sel };
307
+ }
308
+
309
+ /**
310
+ * Variant of {@link splitPathAndSel} for internal URLs (`scheme://...`).
311
+ *
312
+ * The filesystem-path splitter is intentionally conservative: it refuses to
313
+ * peel a trailing `:<chunk>` unless that chunk matches the strict selector
314
+ * grammar. That rule is right for filesystem paths (a file named `a:1-50` is
315
+ * legal) but wrong for internal URLs, where any trailing `:<chunk>` after the
316
+ * scheme is unambiguously a read-tool selector — even if malformed (e.g.
317
+ * `artifact://3:raw:-100`).
318
+ *
319
+ * This function iteratively peels selector-shaped chunks (well-formed plus
320
+ * common malformed shapes like `:-N`) so the rest of the read tool can pass a
321
+ * clean URL to the protocol handler and surface selector errors via parseSel
322
+ * instead of as misleading "host invalid" errors from the handler. Schemes
323
+ * whose resource URIs may legitimately contain colons (`mcp://`) are skipped.
324
+ *
325
+ * Falls back to the input unchanged when nothing matches.
326
+ */
327
+
328
+ export function splitInternalUrlSel(rawPath: string): { path: string; sel?: string } {
329
+ const schemeMatch = rawPath.match(INTERNAL_URL_SCHEME_RE);
330
+ if (!schemeMatch) return { path: rawPath };
331
+ const scheme = schemeMatch[1].toLowerCase();
332
+ // Opaque schemes (mcp://, etc.) carry server-defined resource URIs that may
333
+ // legitimately end in selector-shaped tails. Forward verbatim — see
334
+ // OPAQUE_RESOURCE_SCHEMES.
335
+ if (OPAQUE_RESOURCE_SCHEMES.has(scheme)) return { path: rawPath };
336
+ if (!INTERNAL_SCHEMES_WITH_SELECTORS[scheme]) return { path: rawPath };
337
+
338
+ const schemeEnd = schemeMatch[0].length;
339
+ let path = rawPath;
340
+ const chunks: string[] = [];
341
+ while (true) {
342
+ const colon = path.lastIndexOf(":");
343
+ // Stop before crossing into the scheme separator `://`.
344
+ if (colon < schemeEnd) break;
345
+ const tail = path.slice(colon + 1);
346
+ if (!INTERNAL_URL_SELECTOR_PART_RE.test(tail)) break;
347
+ chunks.unshift(tail);
348
+ path = path.slice(0, colon);
349
+ }
350
+ if (chunks.length === 0) return { path: rawPath };
351
+ return { path, sel: chunks.join(":") };
352
+ }
353
+
354
+ function assertNotInternalUrl(expanded: string, original: string): void {
355
+ for (const prefix of TOP_LEVEL_INTERNAL_URL_PREFIXES) {
356
+ if (expanded.startsWith(prefix)) {
357
+ throw new Error(
358
+ `Path "${original}" uses internal scheme "${prefix}" and must be resolved through the proper protocol handler, not as a filesystem path.`,
359
+ );
360
+ }
361
+ }
362
+ }
363
+
364
+ export function normalizeLocalScheme(filePath: string): string {
365
+ return filePath.replace(/^(local:)\/(?!\/)/, "$1//");
366
+ }
367
+
368
+ export function isInternalUrlPath(filePath: string): boolean {
369
+ const normalized = normalizeLocalScheme(filePath);
370
+ const expandedAndNormalized = normalizeLocalScheme(expandPath(normalized));
371
+ for (const prefix of TOP_LEVEL_INTERNAL_URL_PREFIXES) {
372
+ if (expandedAndNormalized.startsWith(prefix)) return true;
373
+ }
374
+ return false;
375
+ }
376
+
377
+ /**
378
+ * Resolve a path relative to the given cwd.
379
+ * Handles ~ expansion and absolute paths.
380
+ *
381
+ * A bare root slash is treated as a workspace-root alias for tool inputs. Users
382
+ * often pass `/` to mean “search from here”, and letting tools escape to the
383
+ * filesystem root is almost never what they intended.
384
+ */
385
+ export function resolveToCwd(filePath: string, cwd: string): string {
386
+ const normalized = normalizeLocalScheme(filePath);
387
+ const expanded = normalizeWindowsDriveAliasPath(expandPath(normalized));
388
+ const expandedAndNormalized = normalizeLocalScheme(expanded);
389
+
390
+ assertNotInternalUrl(expandedAndNormalized, normalized);
391
+
392
+ if (/^\/+$/.test(expanded)) {
393
+ return cwd;
394
+ }
395
+ if (path.isAbsolute(expanded)) {
396
+ return expanded;
397
+ }
398
+ return path.resolve(cwd, expanded);
399
+ }
400
+
401
+ export function formatPathRelativeToCwd(
402
+ filePath: string,
403
+ cwd: string,
404
+ options: { trailingSlash?: boolean } = {},
405
+ ): string {
406
+ const resolvedCwd = path.resolve(cwd);
407
+ const normalized = normalizeLocalScheme(filePath);
408
+ if (isInternalUrlPath(normalized)) {
409
+ return normalized;
410
+ }
411
+ const expanded = expandPath(normalized);
412
+ const resolvedPath = path.isAbsolute(expanded) ? path.resolve(expanded) : path.resolve(cwd, expanded);
413
+ const relative = path.relative(resolvedCwd, resolvedPath);
414
+ const isWithinCwd = relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
415
+ let displayPath = normalizePosixPath(isWithinCwd ? relative || "." : resolvedPath);
416
+ if (options.trailingSlash && displayPath !== "." && !displayPath.endsWith("/")) {
417
+ displayPath += "/";
418
+ }
419
+ return displayPath;
420
+ }
421
+
422
+ /**
423
+ * Strip matching surrounding double quotes from a path string.
424
+ * Common when users paste quoted paths from Windows Explorer or shell copy-paste.
425
+ * Only double quotes — single quotes are valid POSIX filename characters.
426
+ * Tradeoff: a POSIX path literally starting AND ending with " would also be unquoted.
427
+ * Accepted because such names are virtually nonexistent in practice.
428
+ */
429
+ export function stripOuterDoubleQuotes(input: string): string {
430
+ return input.startsWith('"') && input.endsWith('"') && input.length > 1 ? input.slice(1, -1) : input;
431
+ }
432
+ function normalizePathSeparators(input: string): string {
433
+ if (isInternalUrlPath(input)) return input;
434
+ if (!input.includes("\\")) return input;
435
+ return input.replace(/\\/g, "/");
436
+ }
437
+
438
+ export function normalizePathLikeInput(input: string): string {
439
+ return stripOuterDoubleQuotes(input.trim());
440
+ }
441
+
442
+ const GLOB_PATH_CHARS = ["*", "?", "[", "{"] as const;
443
+
444
+ export function hasGlobPathChars(filePath: string): boolean {
445
+ return GLOB_PATH_CHARS.some(char => filePath.includes(char));
446
+ }
447
+
448
+ type PathEntrySplitter = (item: string) => { basePath: string };
449
+
450
+ const TOP_LEVEL_WHITESPACE_RE = /\s/;
451
+
452
+ type DelimitedPathSplitMode = "comma" | "semicolon" | "whitespace" | "mixed";
453
+
454
+ function isDelimitedPathSeparator(ch: string, mode: DelimitedPathSplitMode): boolean {
455
+ if (mode === "comma") return ch === ",";
456
+ if (mode === "semicolon") return ch === ";";
457
+ if (mode === "whitespace") return TOP_LEVEL_WHITESPACE_RE.test(ch);
458
+ return ch === "," || ch === ";" || TOP_LEVEL_WHITESPACE_RE.test(ch);
459
+ }
460
+
461
+ function hasTopLevelPathDelimiter(entry: string): boolean {
462
+ let braceDepth = 0;
463
+ for (let i = 0; i < entry.length; i++) {
464
+ const ch = entry[i];
465
+ if (ch === "\\" && i + 1 < entry.length) {
466
+ i++;
467
+ continue;
468
+ }
469
+ if (ch === "{") {
470
+ braceDepth++;
471
+ continue;
472
+ }
473
+ if (ch === "}") {
474
+ if (braceDepth > 0) braceDepth--;
475
+ continue;
476
+ }
477
+ if (braceDepth === 0 && (ch === "," || ch === ";" || TOP_LEVEL_WHITESPACE_RE.test(ch))) {
478
+ return true;
479
+ }
480
+ }
481
+ return false;
482
+ }
483
+
484
+ function splitTopLevelDelimitedPath(entry: string, mode: DelimitedPathSplitMode): string[] {
485
+ const parts: string[] = [];
486
+ let braceDepth = 0;
487
+ let start = 0;
488
+ for (let i = 0; i < entry.length; i++) {
489
+ const ch = entry[i];
490
+ if (ch === "\\" && i + 1 < entry.length) {
491
+ i++;
492
+ continue;
493
+ }
494
+ if (ch === "{") {
495
+ braceDepth++;
496
+ continue;
497
+ }
498
+ if (ch === "}") {
499
+ if (braceDepth > 0) braceDepth--;
500
+ continue;
501
+ }
502
+ if (braceDepth !== 0 || !isDelimitedPathSeparator(ch, mode)) continue;
503
+ parts.push(entry.slice(start, i));
504
+ start = i + 1;
505
+ }
506
+ parts.push(entry.slice(start));
507
+ return parts;
508
+ }
509
+
510
+ async function delimitedPathPartResolves(entry: string, cwd: string, splitter: PathEntrySplitter): Promise<boolean> {
511
+ if (isInternalUrlPath(entry)) return true;
512
+ const peeled = splitPathAndSel(entry).path;
513
+ const { basePath } = splitter(peeled);
514
+ const absoluteBasePath = resolveToCwd(basePath, cwd);
515
+ try {
516
+ await fs.promises.stat(absoluteBasePath);
517
+ return true;
518
+ } catch (err) {
519
+ if (isEnoent(err)) return false;
520
+ throw err;
521
+ }
522
+ }
523
+
524
+ async function tryDelimitedPathSplit(
525
+ entry: string,
526
+ cwd: string,
527
+ splitter: PathEntrySplitter,
528
+ mode: DelimitedPathSplitMode,
529
+ requireAllParts: boolean,
530
+ ): Promise<string[] | null> {
531
+ const rawParts = splitTopLevelDelimitedPath(entry, mode);
532
+ if (rawParts.length < 2) return null;
533
+
534
+ const parts = rawParts.map(normalizePathLikeInput).filter(part => part.length > 0);
535
+ if (parts.length === 0) return null;
536
+ if (parts.length < 2 && rawParts.length === parts.length) return null;
537
+
538
+ const resolved = await Promise.all(parts.map(part => delimitedPathPartResolves(part, cwd, splitter)));
539
+ const valid = requireAllParts ? resolved.every(Boolean) : resolved.some(Boolean);
540
+ return valid ? parts : null;
541
+ }
542
+
543
+ /**
544
+ * Split one path-like entry whose multiple targets were flattened into one
545
+ * string. Existing paths are kept intact, so real filenames containing spaces,
546
+ * commas, or semicolons win over delimiter recovery.
547
+ */
548
+ export async function splitDelimitedPathEntry(
549
+ entry: string,
550
+ cwd: string,
551
+ options: { splitter?: PathEntrySplitter } = {},
552
+ ): Promise<string[] | null> {
553
+ const normalizedEntry = normalizePathLikeInput(entry);
554
+ if (!hasTopLevelPathDelimiter(normalizedEntry)) return null;
555
+ if (isInternalUrlPath(normalizedEntry)) return null;
556
+
557
+ const splitter = options.splitter ?? parseSearchPath;
558
+ const peeledEntry = splitPathAndSel(normalizedEntry).path;
559
+ if (!hasGlobPathChars(peeledEntry) && (await delimitedPathPartResolves(normalizedEntry, cwd, splitter))) {
560
+ return null;
561
+ }
562
+
563
+ return (
564
+ (await tryDelimitedPathSplit(normalizedEntry, cwd, splitter, "semicolon", false)) ??
565
+ (await tryDelimitedPathSplit(normalizedEntry, cwd, splitter, "comma", false)) ??
566
+ (await tryDelimitedPathSplit(normalizedEntry, cwd, splitter, "whitespace", true)) ??
567
+ (await tryDelimitedPathSplit(normalizedEntry, cwd, splitter, "mixed", true))
568
+ );
569
+ }
570
+
571
+ /** Expand delimited entries in-place while preserving unsplit entries. */
572
+ export async function expandDelimitedPathEntries(
573
+ entries: readonly string[],
574
+ cwd: string,
575
+ options: { splitter?: PathEntrySplitter } = {},
576
+ ): Promise<string[]> {
577
+ const expanded: string[] = [];
578
+ for (const entry of entries) {
579
+ const normalizedEntry = normalizePathLikeInput(entry);
580
+ const split = await splitDelimitedPathEntry(normalizedEntry, cwd, options);
581
+ if (split) expanded.push(...split);
582
+ else expanded.push(normalizedEntry);
583
+ }
584
+ return expanded;
585
+ }
586
+
587
+ export interface ParsedSearchPath {
588
+ basePath: string;
589
+ glob?: string;
590
+ }
591
+
592
+ export interface ParsedFindPattern {
593
+ basePath: string;
594
+ globPattern: string;
595
+ hasGlob: boolean;
596
+ }
597
+
598
+ export interface ResolvedSearchTarget {
599
+ basePath: string;
600
+ glob?: string;
601
+ }
602
+
603
+ export interface ResolvedMultiSearchPath {
604
+ basePath: string;
605
+ glob?: string;
606
+ scopePath: string;
607
+ exactFilePaths?: string[];
608
+ targets?: ResolvedSearchTarget[];
609
+ }
610
+
611
+ export interface ResolvedFindTarget {
612
+ basePath: string;
613
+ globPattern: string;
614
+ hasGlob: boolean;
615
+ }
616
+
617
+ export interface ResolvedMultiFindPattern {
618
+ targets: ResolvedFindTarget[];
619
+ scopePath: string;
620
+ }
621
+ export function parseSearchPath(filePath: string): ParsedSearchPath {
622
+ const normalizedPath = normalizePathSeparators(filePath);
623
+ const segments = normalizedPath.split("/");
624
+ let firstGlobIndex = -1;
625
+ for (let i = 0; i < segments.length; i++) {
626
+ if (hasGlobPathChars(segments[i])) {
627
+ firstGlobIndex = i;
628
+ break;
629
+ }
630
+ }
631
+
632
+ if (firstGlobIndex === -1) {
633
+ return { basePath: normalizedPath };
634
+ }
635
+
636
+ if (firstGlobIndex <= 0) {
637
+ return { basePath: ".", glob: normalizedPath };
638
+ }
639
+
640
+ return {
641
+ basePath: segments.slice(0, firstGlobIndex).join("/"),
642
+ glob: segments.slice(firstGlobIndex).join("/"),
643
+ };
644
+ }
645
+
646
+ /**
647
+ * Async sibling of {@link parseSearchPath} that prefers literal interpretation
648
+ * when a path containing glob metacharacters resolves to an existing entry on
649
+ * disk. Disambiguates Next.js/SvelteKit routes like `apps/[id]/page.tsx` —
650
+ * without this, `[id]` is parsed as a glob character class and silently
651
+ * matches nothing.
652
+ */
653
+ export async function parseSearchPathPreferringLiteral(filePath: string, cwd: string): Promise<ParsedSearchPath> {
654
+ if (!hasGlobPathChars(filePath) || isInternalUrlPath(filePath)) return parseSearchPath(filePath);
655
+ try {
656
+ await fs.promises.stat(resolveToCwd(filePath, cwd));
657
+ return { basePath: normalizePathSeparators(filePath) };
658
+ } catch {
659
+ return parseSearchPath(filePath);
660
+ }
661
+ }
662
+
663
+ // Parse a find pattern into a base directory path and a glob pattern.
664
+ // Examples:
665
+ // src/app/**/\*.tsx -> { basePath: "src/app", globPattern: "**/*.tsx", hasGlob: true }
666
+ // src/app/\*.tsx -> { basePath: "src/app", globPattern: "*.tsx", hasGlob: true }
667
+ // \*.ts -> { basePath: ".", globPattern: "**/*.ts", hasGlob: true }
668
+ // **/\*.json -> { basePath: ".", globPattern: "**/*.json", hasGlob: true }
669
+ // /abs/path/**/\*.ts -> { basePath: "/abs/path", globPattern: "**/*.ts", hasGlob: true }
670
+ // src/app -> { basePath: "src/app", globPattern: "**/*", hasGlob: false }
671
+ export function parseFindPattern(pattern: string): ParsedFindPattern {
672
+ const normalizedPattern = normalizePathSeparators(pattern);
673
+ const segments = normalizedPattern.split("/");
674
+ let firstGlobIndex = -1;
675
+ for (let i = 0; i < segments.length; i++) {
676
+ if (hasGlobPathChars(segments[i])) {
677
+ firstGlobIndex = i;
678
+ break;
679
+ }
680
+ }
681
+
682
+ if (firstGlobIndex === -1) {
683
+ return { basePath: normalizedPattern, globPattern: "**/*", hasGlob: false };
684
+ }
685
+
686
+ if (firstGlobIndex === 0) {
687
+ const needsRecursive = !normalizedPattern.startsWith("**/");
688
+ return {
689
+ basePath: ".",
690
+ globPattern: needsRecursive ? `**/${normalizedPattern}` : normalizedPattern,
691
+ hasGlob: true,
692
+ };
693
+ }
694
+
695
+ return {
696
+ basePath: segments.slice(0, firstGlobIndex).join("/"),
697
+ globPattern: segments.slice(firstGlobIndex).join("/"),
698
+ hasGlob: true,
699
+ };
700
+ }
701
+
702
+ export function combineSearchGlobs(prefixGlob?: string, suffixGlob?: string): string | undefined {
703
+ if (!prefixGlob) return suffixGlob;
704
+ if (!suffixGlob) return prefixGlob;
705
+
706
+ const normalizedPrefix = prefixGlob.replace(/\/+$/, "");
707
+ const normalizedSuffix = suffixGlob.replace(/^\/+/, "");
708
+
709
+ return `${normalizedPrefix}/${normalizedSuffix}`;
710
+ }
711
+
712
+ function normalizePosixPath(filePath: string): string {
713
+ return filePath.replace(/\\/g, "/");
714
+ }
715
+
716
+ function joinRelativeGlob(basePath: string | undefined, globPattern: string): string {
717
+ if (!basePath || basePath === ".") return normalizePosixPath(globPattern).replace(/^\/+/, "");
718
+ const normalizedBase = normalizePosixPath(basePath).replace(/\/+$/, "");
719
+ const normalizedGlob = normalizePosixPath(globPattern).replace(/^\/+/, "");
720
+ return `${normalizedBase}/${normalizedGlob}`;
721
+ }
722
+
723
+ function buildBraceUnion(patterns: string[]): string | undefined {
724
+ const uniquePatterns = [...new Set(patterns.map(pattern => normalizePosixPath(pattern).trim()).filter(Boolean))];
725
+ if (uniquePatterns.length === 0) return undefined;
726
+ if (uniquePatterns.length === 1) return uniquePatterns[0];
727
+ return `{${uniquePatterns.join(",")}}`;
728
+ }
729
+
730
+ function findCommonBasePath(paths: string[]): string {
731
+ if (paths.length === 0) return ".";
732
+ let commonParts = path.resolve(paths[0]).split(path.sep);
733
+ for (const candidatePath of paths.slice(1)) {
734
+ const candidateParts = path.resolve(candidatePath).split(path.sep);
735
+ let sharedCount = 0;
736
+ const maxShared = Math.min(commonParts.length, candidateParts.length);
737
+ while (sharedCount < maxShared && commonParts[sharedCount] === candidateParts[sharedCount]) {
738
+ sharedCount += 1;
739
+ }
740
+ commonParts = commonParts.slice(0, sharedCount);
741
+ }
742
+ if (commonParts.length === 0) {
743
+ return path.parse(path.resolve(paths[0])).root;
744
+ }
745
+ const joined = commonParts.join(path.sep);
746
+ return joined || path.parse(path.resolve(paths[0])).root;
747
+ }
748
+
749
+ function toScopeDisplay(items: string[], cwd: string): string {
750
+ return items
751
+ .map(item =>
752
+ formatPathRelativeToCwd(item, cwd, {
753
+ trailingSlash: item.endsWith("/") || item.endsWith("\\"),
754
+ }),
755
+ )
756
+ .join(", ");
757
+ }
758
+
759
+ async function resolveSearchPathItems(
760
+ pathItems: string[],
761
+ cwd: string,
762
+ suffixGlob?: string,
763
+ fanOutFileItems = false,
764
+ ): Promise<ResolvedMultiSearchPath | undefined> {
765
+ if (pathItems.length < 1) {
766
+ return undefined;
767
+ }
768
+
769
+ const parsedItems = await Promise.all(
770
+ pathItems.map(async item => {
771
+ const parsedPath = await parseSearchPathPreferringLiteral(item, cwd);
772
+ const absoluteBasePath = resolveToCwd(parsedPath.basePath, cwd);
773
+ const stat = await fs.promises.stat(absoluteBasePath);
774
+ return { raw: item, parsedPath, absoluteBasePath, stat };
775
+ }),
776
+ );
777
+
778
+ const allExactFiles = !suffixGlob && parsedItems.every(item => !item.parsedPath.glob && item.stat.isFile());
779
+ const commonBasePath = findCommonBasePath(parsedItems.map(item => item.absoluteBasePath));
780
+ const combinedPatterns = parsedItems.map(item => {
781
+ const relativeBasePath = normalizePosixPath(path.relative(commonBasePath, item.absoluteBasePath)) || ".";
782
+ if (item.parsedPath.glob) {
783
+ const pathGlob = joinRelativeGlob(relativeBasePath, item.parsedPath.glob);
784
+ return combineSearchGlobs(pathGlob, suffixGlob) ?? pathGlob;
785
+ }
786
+ if (suffixGlob) {
787
+ const pathPrefix = relativeBasePath === "." ? undefined : relativeBasePath;
788
+ return combineSearchGlobs(pathPrefix, suffixGlob) ?? suffixGlob;
789
+ }
790
+ if (item.stat.isDirectory()) {
791
+ return joinRelativeGlob(relativeBasePath, "**/*");
792
+ }
793
+ return relativeBasePath === "." ? path.basename(item.absoluteBasePath) : relativeBasePath;
794
+ });
795
+ // A single walk rooted at the common ancestor is only safe when that
796
+ // ancestor is itself one of the requested scopes (e.g. `.` + `src/foo.ts`):
797
+ // the walk then covers exactly what the caller asked for. When the common
798
+ // ancestor is an unrequested parent (`.` + `~/.gitconfig` → `$HOME`, or
799
+ // disjoint trees → `/`), a collapsed walk traverses every unrelated sibling
800
+ // under it — fan out into per-item targets so each scan stays bounded to a
801
+ // requested path.
802
+ const commonIsRequestedScope = parsedItems.some(item => item.absoluteBasePath === commonBasePath);
803
+ // Walkers prune `.git` unconditionally and honor gitignore, so a plain-file
804
+ // item folded into a directory walk's glob union (`.` + `.git/config`) can
805
+ // silently never match. Callers that dedupe overlapping results opt in via
806
+ // `fanOutFileItems` to get explicit file targets, which bypass the walker.
807
+ const demotesFileItem =
808
+ fanOutFileItems && !allExactFiles && parsedItems.some(item => !item.parsedPath.glob && item.stat.isFile());
809
+ const targets =
810
+ parsedItems.length > 1 && (!commonIsRequestedScope || demotesFileItem)
811
+ ? parsedItems.map(item => ({
812
+ basePath: item.absoluteBasePath,
813
+ glob: item.parsedPath.glob ? combineSearchGlobs(item.parsedPath.glob, suffixGlob) : suffixGlob,
814
+ }))
815
+ : undefined;
816
+
817
+ return {
818
+ basePath: commonBasePath,
819
+ glob: buildBraceUnion(combinedPatterns),
820
+ scopePath: toScopeDisplay(pathItems, cwd),
821
+ exactFilePaths: allExactFiles ? parsedItems.map(item => item.absoluteBasePath) : undefined,
822
+ targets,
823
+ };
824
+ }
825
+
826
+ export async function resolveExplicitSearchPaths(
827
+ pathItems: string[],
828
+ cwd: string,
829
+ suffixGlob?: string,
830
+ fanOutFileItems = false,
831
+ ): Promise<ResolvedMultiSearchPath | undefined> {
832
+ return resolveSearchPathItems([...new Set(pathItems)], cwd, suffixGlob, fanOutFileItems);
833
+ }
834
+
835
+ async function resolveFindPatternItems(
836
+ patternItems: string[],
837
+ cwd: string,
838
+ ): Promise<ResolvedMultiFindPattern | undefined> {
839
+ if (patternItems.length <= 1) {
840
+ return undefined;
841
+ }
842
+
843
+ // Each path becomes its own walk root. Collapsing to a shared common ancestor
844
+ // (and filtering with a brace-union glob) would force the walker to traverse
845
+ // and stat every unrelated sibling under that ancestor — two paths under
846
+ // $HOME would scan all of $HOME. The find tool fans these targets out in
847
+ // parallel instead, so every scan stays bounded to exactly one requested path.
848
+ const targets = patternItems.map(item => {
849
+ const parsedPattern = parseFindPattern(item);
850
+ return {
851
+ basePath: resolveToCwd(parsedPattern.basePath, cwd),
852
+ globPattern: parsedPattern.globPattern,
853
+ hasGlob: parsedPattern.hasGlob,
854
+ };
855
+ });
856
+
857
+ return {
858
+ targets,
859
+ scopePath: toScopeDisplay(patternItems, cwd),
860
+ };
861
+ }
862
+
863
+ export async function resolveExplicitFindPatterns(
864
+ patternItems: string[],
865
+ cwd: string,
866
+ ): Promise<ResolvedMultiFindPattern | undefined> {
867
+ return resolveFindPatternItems([...new Set(patternItems)], cwd);
868
+ }
869
+
870
+ /**
871
+ * Result of partitioning a list of user-supplied paths/globs into entries whose
872
+ * base directory currently exists on disk versus those that do not.
873
+ *
874
+ * Used by multi-path tools (search, find, ast_grep, ast_edit) to tolerate one
875
+ * or more missing entries in a multi-path call: the surviving entries should
876
+ * still be searched, with the missing entries surfaced as a non-fatal warning.
877
+ */
878
+ export interface PartitionedPaths {
879
+ /** Raw input strings whose resolved base path exists. */
880
+ valid: string[];
881
+ /** Raw input strings whose resolved base path is missing (ENOENT). */
882
+ missing: string[];
883
+ }
884
+
885
+ /**
886
+ * Stat each input's base path concurrently; return entries split by existence.
887
+ *
888
+ * `splitter` is expected to be {@link parseFindPattern} or
889
+ * {@link parseSearchPath}: both return a `basePath` field that this helper
890
+ * resolves against `cwd` and stats. ENOENT is the only swallowed error — every
891
+ * other stat failure (permission, IO, etc.) propagates so callers do not silently
892
+ * skip paths that exist but are unreadable.
893
+ *
894
+ * Order of `valid` and `missing` follows the input order, so callers can rely
895
+ * on `valid[0]` matching the first surviving user-supplied entry.
896
+ */
897
+ export async function partitionExistingPaths(
898
+ items: string[],
899
+ cwd: string,
900
+ splitter: (item: string) => { basePath: string },
901
+ ): Promise<PartitionedPaths> {
902
+ const settled = await Promise.all(
903
+ items.map(async item => {
904
+ const { basePath } = splitter(item);
905
+ const absoluteBasePath = resolveToCwd(basePath, cwd);
906
+ try {
907
+ await fs.promises.stat(absoluteBasePath);
908
+ return { item, exists: true } as const;
909
+ } catch (err) {
910
+ if (isEnoent(err)) return { item, exists: false } as const;
911
+ throw err;
912
+ }
913
+ }),
914
+ );
915
+ const valid: string[] = [];
916
+ const missing: string[] = [];
917
+ for (const entry of settled) {
918
+ if (entry.exists) valid.push(entry.item);
919
+ else missing.push(entry.item);
920
+ }
921
+ return { valid, missing };
922
+ }
923
+
924
+ export function resolveReadPath(filePath: string, cwd: string): string {
925
+ const resolved = resolveToCwd(filePath, cwd);
926
+ const shellEscapedVariant = tryShellEscapedPath(resolved);
927
+ const baseCandidates = shellEscapedVariant !== resolved ? [resolved, shellEscapedVariant] : [resolved];
928
+
929
+ for (const baseCandidate of baseCandidates) {
930
+ if (fileExists(baseCandidate)) {
931
+ return baseCandidate;
932
+ }
933
+ }
934
+
935
+ for (const baseCandidate of baseCandidates) {
936
+ // Try macOS AM/PM variant (narrow no-break space before AM/PM)
937
+ const amPmVariant = tryMacOSScreenshotPath(baseCandidate);
938
+ if (amPmVariant !== baseCandidate && fileExists(amPmVariant)) {
939
+ return amPmVariant;
940
+ }
941
+
942
+ // Try NFD variant (macOS stores filenames in NFD form)
943
+ const nfdVariant = tryNFDVariant(baseCandidate);
944
+ if (nfdVariant !== baseCandidate && fileExists(nfdVariant)) {
945
+ return nfdVariant;
946
+ }
947
+
948
+ // Try curly quote variant (macOS uses U+2019 in screenshot names)
949
+ const curlyVariant = tryCurlyQuoteVariant(baseCandidate);
950
+ if (curlyVariant !== baseCandidate && fileExists(curlyVariant)) {
951
+ return curlyVariant;
952
+ }
953
+
954
+ // Try combined NFD + curly quote (for French macOS screenshots like "Capture d'écran")
955
+ const nfdCurlyVariant = tryCurlyQuoteVariant(nfdVariant);
956
+ if (nfdCurlyVariant !== baseCandidate && fileExists(nfdCurlyVariant)) {
957
+ return nfdCurlyVariant;
958
+ }
959
+ }
960
+
961
+ return resolved;
962
+ }
963
+
964
+ // =============================================================================
965
+ // Tool-scope resolution (search/ast tools)
966
+ // =============================================================================
967
+
968
+ export interface ToolScopeOptions {
969
+ rawPaths: string[];
970
+ cwd: string;
971
+ /** Verb used in the "Cannot {action} internal URL without a backing file: …" message. */
972
+ internalUrlAction: string;
973
+ /** Collect absolute paths flagged immutable by their internal-URL handler. */
974
+ trackImmutableSources?: boolean;
975
+ /** Honor `exactFilePaths` from {@link resolveExplicitSearchPaths} (search-only). */
976
+ surfaceExactFilePaths?: boolean;
977
+ /** Fan plain-file entries out into per-target scans instead of folding them
978
+ * into a directory walk's glob union (search-only: the caller must dedupe
979
+ * matches from overlapping targets). */
980
+ fanOutFileTargets?: boolean;
981
+ /** Extra hint appended to "Path not found" when stat fails and the user supplied multiple paths. */
982
+ multipathStatHint?: string;
983
+ /** Calling session's settings — forwarded to the internal-URL router so caller-aware handlers (issue://, pr://) honor it. */
984
+ settings?: unknown;
985
+ /** Caller's abort signal — forwarded to the internal-URL router. */
986
+ signal?: AbortSignal;
987
+ /** Calling session's `local://` root mapping — pins resolutions to the calling session. */
988
+ localProtocolOptions?: LocalProtocolOptions;
989
+ }
990
+
991
+ export interface ToolScopeResolution {
992
+ searchPath: string;
993
+ scopePath: string;
994
+ globFilter: string | undefined;
995
+ isDirectory: boolean;
996
+ multiTargets?: ResolvedSearchTarget[];
997
+ exactFilePaths?: string[];
998
+ missingPaths: string[];
999
+ immutableSourcePaths: Set<string>;
1000
+ }
1001
+
1002
+ /**
1003
+ * Shared path-input pipeline for `search`, `ast_grep`, and `ast_edit`:
1004
+ * 1. normalize + reject empty paths,
1005
+ * 2. resolve internal URLs through {@link InternalUrlRouter} to backing files,
1006
+ * 3. partition existing vs missing when multiple paths are supplied,
1007
+ * 4. derive a single search base path / glob, or a multi-target list,
1008
+ * 5. stat the resolved base path so callers can branch on directory vs file scope.
1009
+ */
1010
+ export async function resolveToolSearchScope(opts: ToolScopeOptions): Promise<ToolScopeResolution> {
1011
+ const { rawPaths: inputs, cwd, internalUrlAction } = opts;
1012
+ const normalizedRawPaths = inputs.map(normalizePathLikeInput);
1013
+ if (normalizedRawPaths.some(rawPath => rawPath.length === 0)) {
1014
+ throw new ToolError("`paths` must contain non-empty paths or globs");
1015
+ }
1016
+ const rawPaths = await expandDelimitedPathEntries(normalizedRawPaths, cwd);
1017
+ if (rawPaths.some(rawPath => rawPath.length === 0)) {
1018
+ throw new ToolError("`paths` must contain non-empty paths or globs");
1019
+ }
1020
+ // External (http/https/ftp/file) URLs are not searchable; route the caller
1021
+ // to `read` instead of letting the path-resolver surface a confusing
1022
+ // "Path not found" for a slash-stripped URL.
1023
+ const externalUrl = rawPaths.find(rawPath => /^(?:https?|ftp|file|ws|wss):\/\//i.test(rawPath));
1024
+ if (externalUrl) {
1025
+ throw new ToolError(
1026
+ `Cannot ${internalUrlAction} external URL: ${externalUrl}. Use \`read\` to fetch web content, then search the returned text.`,
1027
+ );
1028
+ }
1029
+ const internalRouter = InternalUrlRouter.instance();
1030
+ const resolvedPathInputs: string[] = [];
1031
+ const immutableSourcePaths = new Set<string>();
1032
+ for (const rawPath of rawPaths) {
1033
+ if (!internalRouter.canHandle(rawPath)) {
1034
+ resolvedPathInputs.push(rawPath);
1035
+ continue;
1036
+ }
1037
+ if (hasGlobPathChars(rawPath)) {
1038
+ throw new ToolError(`Glob patterns are not supported for internal URLs: ${rawPath}`);
1039
+ }
1040
+ const resource = await internalRouter.resolve(rawPath, {
1041
+ cwd,
1042
+ settings: opts.settings,
1043
+ signal: opts.signal,
1044
+ localProtocolOptions: opts.localProtocolOptions,
1045
+ });
1046
+ if (!resource.sourcePath) {
1047
+ throw new ToolError(`Cannot ${internalUrlAction} internal URL without a backing file: ${rawPath}`);
1048
+ }
1049
+ if (opts.trackImmutableSources && resource.immutable) {
1050
+ immutableSourcePaths.add(path.resolve(resource.sourcePath));
1051
+ }
1052
+ resolvedPathInputs.push(resource.sourcePath);
1053
+ }
1054
+
1055
+ let missingPaths: string[] = [];
1056
+ let effectivePaths = resolvedPathInputs;
1057
+ if (resolvedPathInputs.length > 1) {
1058
+ const partition = await partitionExistingPaths(resolvedPathInputs, cwd, parseSearchPath);
1059
+ if (partition.valid.length === 0) {
1060
+ throw new ToolError(`Path not found: ${partition.missing.join(", ")}`);
1061
+ }
1062
+ effectivePaths = partition.valid;
1063
+ missingPaths = partition.missing;
1064
+ }
1065
+
1066
+ let searchPath: string;
1067
+ let scopePath: string;
1068
+ let globFilter: string | undefined;
1069
+ let multiTargets: ResolvedSearchTarget[] | undefined;
1070
+ let exactFilePaths: string[] | undefined;
1071
+ if (effectivePaths.length === 1) {
1072
+ const parsedPath = await parseSearchPathPreferringLiteral(effectivePaths[0] ?? ".", cwd);
1073
+ searchPath = resolveToCwd(parsedPath.basePath, cwd);
1074
+ globFilter = parsedPath.glob;
1075
+ scopePath = formatPathRelativeToCwd(searchPath, cwd);
1076
+ } else {
1077
+ const multiSearchPath = await resolveExplicitSearchPaths(
1078
+ effectivePaths,
1079
+ cwd,
1080
+ undefined,
1081
+ opts.fanOutFileTargets === true,
1082
+ );
1083
+ if (!multiSearchPath) {
1084
+ throw new ToolError("`paths` must contain at least one path or glob");
1085
+ }
1086
+ searchPath = multiSearchPath.basePath;
1087
+ multiTargets = multiSearchPath.targets;
1088
+ if (opts.surfaceExactFilePaths) {
1089
+ exactFilePaths = multiSearchPath.exactFilePaths;
1090
+ globFilter = exactFilePaths || multiTargets ? undefined : multiSearchPath.glob;
1091
+ } else {
1092
+ globFilter = multiTargets ? undefined : multiSearchPath.glob;
1093
+ }
1094
+ scopePath = multiSearchPath.scopePath;
1095
+ }
1096
+
1097
+ let isDirectory: boolean;
1098
+ try {
1099
+ const stat = await Bun.file(searchPath).stat();
1100
+ isDirectory = stat.isDirectory();
1101
+ } catch {
1102
+ const hint = opts.multipathStatHint && rawPaths.length > 1 ? opts.multipathStatHint : "";
1103
+ throw new ToolError(`Path not found: ${scopePath}${hint}`);
1104
+ }
1105
+
1106
+ return {
1107
+ searchPath,
1108
+ scopePath,
1109
+ globFilter,
1110
+ isDirectory,
1111
+ multiTargets,
1112
+ exactFilePaths,
1113
+ missingPaths,
1114
+ immutableSourcePaths,
1115
+ };
1116
+ }