@f5-sales-demo/xcsh 19.51.2

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 (899) hide show
  1. package/CHANGELOG.md +7073 -0
  2. package/README.md +14 -0
  3. package/examples/README.md +21 -0
  4. package/examples/custom-tools/README.md +109 -0
  5. package/examples/custom-tools/hello/index.ts +20 -0
  6. package/examples/custom-tools/todo/index.ts +206 -0
  7. package/examples/extensions/README.md +143 -0
  8. package/examples/extensions/api-demo.ts +89 -0
  9. package/examples/extensions/chalk-logger.ts +25 -0
  10. package/examples/extensions/hello.ts +32 -0
  11. package/examples/extensions/pirate.ts +43 -0
  12. package/examples/extensions/plan-mode.ts +551 -0
  13. package/examples/extensions/reload-runtime.ts +37 -0
  14. package/examples/extensions/todo.ts +296 -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 +16 -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 +43 -0
  34. package/examples/sdk/04-skills.ts +43 -0
  35. package/examples/sdk/06-extensions.ts +80 -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/README.md +172 -0
  43. package/package.json +539 -0
  44. package/scripts/build-info/resolvers.ts +51 -0
  45. package/scripts/capture-ax-fixture.ts +84 -0
  46. package/scripts/capture-login-fixture.ts +30 -0
  47. package/scripts/check-workflow-field-coverage.ts +101 -0
  48. package/scripts/extension-uat-harness.ts +340 -0
  49. package/scripts/format-prompts.ts +68 -0
  50. package/scripts/generate-api-spec-index.ts +580 -0
  51. package/scripts/generate-branding-index.ts +81 -0
  52. package/scripts/generate-build-info.ts +106 -0
  53. package/scripts/generate-console-catalog.ts +88 -0
  54. package/scripts/generate-console-field-metadata.ts +74 -0
  55. package/scripts/generate-docs-index.ts +40 -0
  56. package/scripts/generate-template.ts +32 -0
  57. package/scripts/generate-terraform-index.ts +81 -0
  58. package/scripts/mermaid-gallery.ts +132 -0
  59. package/scripts/uat-matrix-modalities.ts +451 -0
  60. package/scripts/uat-matrix-report.ts +175 -0
  61. package/scripts/uat-matrix.ts +353 -0
  62. package/src/async/index.ts +2 -0
  63. package/src/async/job-manager.ts +416 -0
  64. package/src/async/support.ts +5 -0
  65. package/src/autoresearch/apply-contract-to-state.ts +1 -0
  66. package/src/autoresearch/command-resume.md +17 -0
  67. package/src/autoresearch/contract.ts +205 -0
  68. package/src/autoresearch/dashboard.ts +374 -0
  69. package/src/autoresearch/git.ts +191 -0
  70. package/src/autoresearch/helpers.ts +328 -0
  71. package/src/autoresearch/index.ts +402 -0
  72. package/src/autoresearch/prompt.md +236 -0
  73. package/src/autoresearch/resume-message.md +16 -0
  74. package/src/autoresearch/state.ts +303 -0
  75. package/src/autoresearch/tools/init-experiment.ts +400 -0
  76. package/src/autoresearch/tools/log-experiment.ts +793 -0
  77. package/src/autoresearch/tools/run-experiment.ts +679 -0
  78. package/src/autoresearch/types.ts +114 -0
  79. package/src/browser/acquire.ts +249 -0
  80. package/src/browser/actions.ts +126 -0
  81. package/src/browser/auth.ts +176 -0
  82. package/src/browser/ax.ts +134 -0
  83. package/src/browser/cdp-core.ts +45 -0
  84. package/src/browser/cdp-page-actions.ts +51 -0
  85. package/src/browser/chrome-locate.ts +66 -0
  86. package/src/browser/dom-context.ts +89 -0
  87. package/src/browser/dt-context.ts +100 -0
  88. package/src/browser/extension-bridge.ts +182 -0
  89. package/src/browser/extension-page-actions.ts +397 -0
  90. package/src/browser/extension-provider.ts +373 -0
  91. package/src/browser/index.ts +17 -0
  92. package/src/browser/input-commit.ts +74 -0
  93. package/src/browser/native-messaging.ts +20 -0
  94. package/src/browser/page-actions.ts +18 -0
  95. package/src/browser/provider.ts +155 -0
  96. package/src/browser/resolver.ts +126 -0
  97. package/src/browser/selector.ts +40 -0
  98. package/src/bun-imports.d.ts +22 -0
  99. package/src/capability/context-file.ts +43 -0
  100. package/src/capability/extension-module.ts +34 -0
  101. package/src/capability/extension.ts +47 -0
  102. package/src/capability/fs.ts +107 -0
  103. package/src/capability/hook.ts +40 -0
  104. package/src/capability/index.ts +438 -0
  105. package/src/capability/instruction.ts +37 -0
  106. package/src/capability/mcp.ts +74 -0
  107. package/src/capability/prompt.ts +35 -0
  108. package/src/capability/rule.ts +224 -0
  109. package/src/capability/settings.ts +34 -0
  110. package/src/capability/skill.ts +50 -0
  111. package/src/capability/slash-command.ts +40 -0
  112. package/src/capability/ssh.ts +41 -0
  113. package/src/capability/system-prompt.ts +34 -0
  114. package/src/capability/tool.ts +38 -0
  115. package/src/capability/types.ts +168 -0
  116. package/src/cli/agents-cli.ts +138 -0
  117. package/src/cli/args.ts +286 -0
  118. package/src/cli/chrome-cli.ts +88 -0
  119. package/src/cli/classify-install-target.ts +50 -0
  120. package/src/cli/commands/init-xdg.ts +27 -0
  121. package/src/cli/config-cli.ts +418 -0
  122. package/src/cli/file-processor.ts +121 -0
  123. package/src/cli/grep-cli.ts +160 -0
  124. package/src/cli/grievances-cli.ts +78 -0
  125. package/src/cli/initial-message.ts +58 -0
  126. package/src/cli/jupyter-cli.ts +106 -0
  127. package/src/cli/list-models.ts +128 -0
  128. package/src/cli/plugin-cli.ts +964 -0
  129. package/src/cli/read-cli.ts +68 -0
  130. package/src/cli/session-picker.ts +52 -0
  131. package/src/cli/setup-cli.ts +479 -0
  132. package/src/cli/shell-cli.ts +174 -0
  133. package/src/cli/ssh-cli.ts +179 -0
  134. package/src/cli/stats-cli.ts +182 -0
  135. package/src/cli/update-cli.ts +446 -0
  136. package/src/cli/web-search-cli.ts +203 -0
  137. package/src/cli.ts +123 -0
  138. package/src/commands/agents.ts +57 -0
  139. package/src/commands/chrome-host.ts +71 -0
  140. package/src/commands/chrome.ts +28 -0
  141. package/src/commands/commit.ts +36 -0
  142. package/src/commands/config.ts +51 -0
  143. package/src/commands/grep.ts +48 -0
  144. package/src/commands/grievances.ts +20 -0
  145. package/src/commands/jupyter.ts +32 -0
  146. package/src/commands/launch.ts +144 -0
  147. package/src/commands/plugin.ts +78 -0
  148. package/src/commands/read.ts +33 -0
  149. package/src/commands/setup.ts +42 -0
  150. package/src/commands/shell.ts +29 -0
  151. package/src/commands/ssh.ts +60 -0
  152. package/src/commands/stats.ts +29 -0
  153. package/src/commands/update.ts +21 -0
  154. package/src/commands/web-search.ts +46 -0
  155. package/src/commit/agentic/agent.ts +314 -0
  156. package/src/commit/agentic/fallback.ts +96 -0
  157. package/src/commit/agentic/index.ts +354 -0
  158. package/src/commit/agentic/prompts/analyze-file.md +22 -0
  159. package/src/commit/agentic/prompts/session-user.md +25 -0
  160. package/src/commit/agentic/prompts/split-confirm.md +1 -0
  161. package/src/commit/agentic/prompts/system.md +38 -0
  162. package/src/commit/agentic/state.ts +60 -0
  163. package/src/commit/agentic/tools/analyze-file.ts +127 -0
  164. package/src/commit/agentic/tools/git-file-diff.ts +191 -0
  165. package/src/commit/agentic/tools/git-hunk.ts +50 -0
  166. package/src/commit/agentic/tools/git-overview.ts +81 -0
  167. package/src/commit/agentic/tools/index.ts +54 -0
  168. package/src/commit/agentic/tools/propose-changelog.ts +139 -0
  169. package/src/commit/agentic/tools/propose-commit.ts +122 -0
  170. package/src/commit/agentic/tools/recent-commits.ts +81 -0
  171. package/src/commit/agentic/tools/schemas.ts +31 -0
  172. package/src/commit/agentic/tools/split-commit.ts +251 -0
  173. package/src/commit/agentic/topo-sort.ts +44 -0
  174. package/src/commit/agentic/trivial.ts +51 -0
  175. package/src/commit/agentic/validation.ts +183 -0
  176. package/src/commit/analysis/conventional.ts +122 -0
  177. package/src/commit/analysis/index.ts +4 -0
  178. package/src/commit/analysis/scope.ts +242 -0
  179. package/src/commit/analysis/summary.ts +105 -0
  180. package/src/commit/analysis/validation.ts +66 -0
  181. package/src/commit/changelog/detect.ts +40 -0
  182. package/src/commit/changelog/generate.ts +101 -0
  183. package/src/commit/changelog/index.ts +234 -0
  184. package/src/commit/changelog/parse.ts +44 -0
  185. package/src/commit/cli.ts +85 -0
  186. package/src/commit/git/diff.ts +148 -0
  187. package/src/commit/index.ts +5 -0
  188. package/src/commit/map-reduce/index.ts +69 -0
  189. package/src/commit/map-reduce/map-phase.ts +193 -0
  190. package/src/commit/map-reduce/reduce-phase.ts +108 -0
  191. package/src/commit/map-reduce/utils.ts +9 -0
  192. package/src/commit/message.ts +11 -0
  193. package/src/commit/model-selection.ts +66 -0
  194. package/src/commit/pipeline.ts +242 -0
  195. package/src/commit/prompts/analysis-system.md +148 -0
  196. package/src/commit/prompts/analysis-user.md +38 -0
  197. package/src/commit/prompts/changelog-system.md +50 -0
  198. package/src/commit/prompts/changelog-user.md +18 -0
  199. package/src/commit/prompts/file-observer-system.md +24 -0
  200. package/src/commit/prompts/file-observer-user.md +8 -0
  201. package/src/commit/prompts/reduce-system.md +50 -0
  202. package/src/commit/prompts/reduce-user.md +17 -0
  203. package/src/commit/prompts/summary-retry.md +3 -0
  204. package/src/commit/prompts/summary-system.md +38 -0
  205. package/src/commit/prompts/summary-user.md +13 -0
  206. package/src/commit/prompts/types-description.md +2 -0
  207. package/src/commit/types.ts +118 -0
  208. package/src/commit/utils/exclusions.ts +42 -0
  209. package/src/commit/utils.ts +44 -0
  210. package/src/config/auto-config.ts +698 -0
  211. package/src/config/context-schema.json +115 -0
  212. package/src/config/file-lock.ts +121 -0
  213. package/src/config/keybindings.ts +493 -0
  214. package/src/config/mcp-schema.json +230 -0
  215. package/src/config/model-equivalence.ts +675 -0
  216. package/src/config/model-registry.ts +2265 -0
  217. package/src/config/model-resolver.ts +1289 -0
  218. package/src/config/prompt-templates.ts +271 -0
  219. package/src/config/resolve-config-value.ts +110 -0
  220. package/src/config/settings-schema.ts +2155 -0
  221. package/src/config/settings.ts +730 -0
  222. package/src/config.ts +418 -0
  223. package/src/cursor.ts +323 -0
  224. package/src/dap/client.ts +674 -0
  225. package/src/dap/config.ts +150 -0
  226. package/src/dap/defaults.json +211 -0
  227. package/src/dap/index.ts +4 -0
  228. package/src/dap/session.ts +1255 -0
  229. package/src/dap/types.ts +600 -0
  230. package/src/debug/index.ts +440 -0
  231. package/src/debug/log-formatting.ts +58 -0
  232. package/src/debug/log-viewer.ts +908 -0
  233. package/src/debug/profiler.ts +158 -0
  234. package/src/debug/report-bundle.ts +365 -0
  235. package/src/debug/system-info.ts +107 -0
  236. package/src/discovery/agents-md.ts +67 -0
  237. package/src/discovery/agents.ts +219 -0
  238. package/src/discovery/builtin.ts +851 -0
  239. package/src/discovery/claude-plugins.ts +297 -0
  240. package/src/discovery/claude.ts +543 -0
  241. package/src/discovery/cline.ts +83 -0
  242. package/src/discovery/codex.ts +535 -0
  243. package/src/discovery/cursor.ts +220 -0
  244. package/src/discovery/gemini.ts +396 -0
  245. package/src/discovery/github.ts +118 -0
  246. package/src/discovery/helpers.ts +934 -0
  247. package/src/discovery/index.ts +79 -0
  248. package/src/discovery/language.ts +46 -0
  249. package/src/discovery/mcp-json.ts +171 -0
  250. package/src/discovery/opencode.ts +393 -0
  251. package/src/discovery/plugin-dir-roots.ts +28 -0
  252. package/src/discovery/ssh.ts +153 -0
  253. package/src/discovery/substitute-plugin-root.ts +29 -0
  254. package/src/discovery/vscode.ts +105 -0
  255. package/src/discovery/windsurf.ts +147 -0
  256. package/src/edit/diff.ts +818 -0
  257. package/src/edit/index.ts +481 -0
  258. package/src/edit/line-hash.ts +67 -0
  259. package/src/edit/modes/chunk.ts +762 -0
  260. package/src/edit/modes/hashline.ts +1366 -0
  261. package/src/edit/modes/patch.ts +1791 -0
  262. package/src/edit/modes/replace.ts +1115 -0
  263. package/src/edit/normalize.ts +375 -0
  264. package/src/edit/renderer.ts +627 -0
  265. package/src/exa/factory.ts +61 -0
  266. package/src/exa/index.ts +27 -0
  267. package/src/exa/mcp-client.ts +293 -0
  268. package/src/exa/render.ts +232 -0
  269. package/src/exa/researcher.ts +47 -0
  270. package/src/exa/search.ts +86 -0
  271. package/src/exa/types.ts +166 -0
  272. package/src/exa/websets.ts +247 -0
  273. package/src/exec/bash-executor.ts +332 -0
  274. package/src/exec/exec.ts +53 -0
  275. package/src/exec/idle-timeout-watchdog.ts +126 -0
  276. package/src/exec/non-interactive-env.ts +48 -0
  277. package/src/export/custom-share.ts +65 -0
  278. package/src/export/html/index.ts +161 -0
  279. package/src/export/html/template.css +1001 -0
  280. package/src/export/html/template.generated.ts +2 -0
  281. package/src/export/html/template.html +46 -0
  282. package/src/export/html/template.js +1950 -0
  283. package/src/export/html/template.macro.ts +24 -0
  284. package/src/export/html/vendor/highlight.min.js +1213 -0
  285. package/src/export/html/vendor/marked.min.js +6 -0
  286. package/src/export/ttsr.ts +434 -0
  287. package/src/extensibility/custom-commands/bundled/ci-green/index.ts +25 -0
  288. package/src/extensibility/custom-commands/bundled/review/index.ts +456 -0
  289. package/src/extensibility/custom-commands/index.ts +2 -0
  290. package/src/extensibility/custom-commands/loader.ts +236 -0
  291. package/src/extensibility/custom-commands/types.ts +111 -0
  292. package/src/extensibility/custom-tools/index.ts +7 -0
  293. package/src/extensibility/custom-tools/loader.ts +238 -0
  294. package/src/extensibility/custom-tools/types.ts +251 -0
  295. package/src/extensibility/custom-tools/wrapper.ts +47 -0
  296. package/src/extensibility/extensions/index.ts +15 -0
  297. package/src/extensibility/extensions/loader.ts +572 -0
  298. package/src/extensibility/extensions/runner.ts +848 -0
  299. package/src/extensibility/extensions/types.ts +1394 -0
  300. package/src/extensibility/extensions/wrapper.ts +191 -0
  301. package/src/extensibility/hooks/index.ts +5 -0
  302. package/src/extensibility/hooks/loader.ts +255 -0
  303. package/src/extensibility/hooks/runner.ts +425 -0
  304. package/src/extensibility/hooks/tool-wrapper.ts +108 -0
  305. package/src/extensibility/hooks/types.ts +826 -0
  306. package/src/extensibility/plugins/doctor.ts +66 -0
  307. package/src/extensibility/plugins/git-url.ts +281 -0
  308. package/src/extensibility/plugins/index.ts +9 -0
  309. package/src/extensibility/plugins/installer.ts +192 -0
  310. package/src/extensibility/plugins/loader.ts +267 -0
  311. package/src/extensibility/plugins/manager.ts +731 -0
  312. package/src/extensibility/plugins/marketplace/cache.ts +136 -0
  313. package/src/extensibility/plugins/marketplace/fetcher.ts +318 -0
  314. package/src/extensibility/plugins/marketplace/index.ts +6 -0
  315. package/src/extensibility/plugins/marketplace/manager.ts +781 -0
  316. package/src/extensibility/plugins/marketplace/prerequisites.ts +255 -0
  317. package/src/extensibility/plugins/marketplace/registry.ts +196 -0
  318. package/src/extensibility/plugins/marketplace/source-resolver.ts +147 -0
  319. package/src/extensibility/plugins/marketplace/types.ts +201 -0
  320. package/src/extensibility/plugins/parser.ts +105 -0
  321. package/src/extensibility/plugins/types.ts +194 -0
  322. package/src/extensibility/skills.ts +269 -0
  323. package/src/extensibility/slash-commands.ts +246 -0
  324. package/src/extensibility/tool-proxy.ts +25 -0
  325. package/src/extensibility/utils.ts +38 -0
  326. package/src/index.ts +61 -0
  327. package/src/internal-urls/agent-protocol.ts +136 -0
  328. package/src/internal-urls/api-catalog-resolve.ts +495 -0
  329. package/src/internal-urls/api-catalog-types.ts +94 -0
  330. package/src/internal-urls/api-spec-resolve.ts +1036 -0
  331. package/src/internal-urls/api-spec-types.ts +239 -0
  332. package/src/internal-urls/artifact-protocol.ts +97 -0
  333. package/src/internal-urls/branding-index.generated.ts +88 -0
  334. package/src/internal-urls/build-info-runtime.ts +302 -0
  335. package/src/internal-urls/build-info.generated.ts +33 -0
  336. package/src/internal-urls/computer-profile.ts +692 -0
  337. package/src/internal-urls/console-catalog-types.ts +21 -0
  338. package/src/internal-urls/console-catalog.generated.ts +532 -0
  339. package/src/internal-urls/console-field-metadata-types.ts +59 -0
  340. package/src/internal-urls/console-field-metadata.generated.ts +4841 -0
  341. package/src/internal-urls/console-resolve.ts +178 -0
  342. package/src/internal-urls/docs-index.generated.ts +698 -0
  343. package/src/internal-urls/extension-api.md +147 -0
  344. package/src/internal-urls/index.ts +46 -0
  345. package/src/internal-urls/jobs-protocol.ts +119 -0
  346. package/src/internal-urls/json-query.ts +126 -0
  347. package/src/internal-urls/local-protocol.ts +206 -0
  348. package/src/internal-urls/mcp-protocol.ts +156 -0
  349. package/src/internal-urls/memory-protocol.ts +133 -0
  350. package/src/internal-urls/parse.ts +72 -0
  351. package/src/internal-urls/profile-collectors.ts +106 -0
  352. package/src/internal-urls/router.ts +55 -0
  353. package/src/internal-urls/rule-protocol.ts +55 -0
  354. package/src/internal-urls/skill-protocol.ts +111 -0
  355. package/src/internal-urls/terraform-index.generated.ts +1852 -0
  356. package/src/internal-urls/terraform-resolve.ts +184 -0
  357. package/src/internal-urls/terraform-types.ts +45 -0
  358. package/src/internal-urls/types.ts +52 -0
  359. package/src/internal-urls/user-profile.ts +363 -0
  360. package/src/internal-urls/xcsh-protocol.ts +644 -0
  361. package/src/ipy/cancellation.ts +28 -0
  362. package/src/ipy/executor.ts +1155 -0
  363. package/src/ipy/gateway-coordinator.ts +424 -0
  364. package/src/ipy/kernel.ts +1091 -0
  365. package/src/ipy/modules.ts +144 -0
  366. package/src/ipy/prelude.py +849 -0
  367. package/src/ipy/prelude.ts +3 -0
  368. package/src/ipy/runtime.ts +221 -0
  369. package/src/locales/ar.json +512 -0
  370. package/src/locales/de.json +512 -0
  371. package/src/locales/en.json +549 -0
  372. package/src/locales/es.json +512 -0
  373. package/src/locales/fr.json +512 -0
  374. package/src/locales/hi.json +512 -0
  375. package/src/locales/index.ts +29 -0
  376. package/src/locales/it.json +512 -0
  377. package/src/locales/ja.json +512 -0
  378. package/src/locales/ko.json +512 -0
  379. package/src/locales/pt-br.json +512 -0
  380. package/src/locales/th.json +512 -0
  381. package/src/locales/zh-cn.json +512 -0
  382. package/src/locales/zh-tw.json +512 -0
  383. package/src/lsp/client.ts +941 -0
  384. package/src/lsp/clients/biome-client.ts +202 -0
  385. package/src/lsp/clients/index.ts +50 -0
  386. package/src/lsp/clients/lsp-linter-client.ts +93 -0
  387. package/src/lsp/clients/swiftlint-client.ts +120 -0
  388. package/src/lsp/config.ts +418 -0
  389. package/src/lsp/defaults.json +999 -0
  390. package/src/lsp/edits.ts +109 -0
  391. package/src/lsp/index.ts +1746 -0
  392. package/src/lsp/lspmux.ts +233 -0
  393. package/src/lsp/render.ts +692 -0
  394. package/src/lsp/startup-events.ts +13 -0
  395. package/src/lsp/types.ts +444 -0
  396. package/src/lsp/utils.ts +691 -0
  397. package/src/main.ts +944 -0
  398. package/src/mcp/client.ts +482 -0
  399. package/src/mcp/config-writer.ts +225 -0
  400. package/src/mcp/config.ts +365 -0
  401. package/src/mcp/discoverable-tool-metadata.ts +202 -0
  402. package/src/mcp/index.ts +29 -0
  403. package/src/mcp/json-rpc.ts +84 -0
  404. package/src/mcp/loader.ts +124 -0
  405. package/src/mcp/manager.ts +1152 -0
  406. package/src/mcp/oauth-discovery.ts +349 -0
  407. package/src/mcp/oauth-flow.ts +387 -0
  408. package/src/mcp/render.ts +157 -0
  409. package/src/mcp/smithery-auth.ts +104 -0
  410. package/src/mcp/smithery-connect.ts +145 -0
  411. package/src/mcp/smithery-registry.ts +477 -0
  412. package/src/mcp/tool-bridge.ts +417 -0
  413. package/src/mcp/tool-cache.ts +117 -0
  414. package/src/mcp/transports/http.ts +475 -0
  415. package/src/mcp/transports/index.ts +6 -0
  416. package/src/mcp/transports/stdio.ts +325 -0
  417. package/src/mcp/types.ts +423 -0
  418. package/src/memories/index.ts +1115 -0
  419. package/src/memories/storage.ts +577 -0
  420. package/src/modes/acp/acp-agent.ts +1361 -0
  421. package/src/modes/acp/acp-event-mapper.ts +538 -0
  422. package/src/modes/acp/acp-mode.ts +15 -0
  423. package/src/modes/acp/index.ts +2 -0
  424. package/src/modes/components/agent-dashboard.ts +1124 -0
  425. package/src/modes/components/assistant-message.ts +213 -0
  426. package/src/modes/components/bash-execution.ts +345 -0
  427. package/src/modes/components/bordered-loader.ts +41 -0
  428. package/src/modes/components/branch-summary-message.ts +45 -0
  429. package/src/modes/components/btw-panel.ts +103 -0
  430. package/src/modes/components/compaction-summary-message.ts +51 -0
  431. package/src/modes/components/context-add-wizard.ts +534 -0
  432. package/src/modes/components/countdown-timer.ts +75 -0
  433. package/src/modes/components/custom-editor.ts +238 -0
  434. package/src/modes/components/custom-message.ts +91 -0
  435. package/src/modes/components/diff.ts +210 -0
  436. package/src/modes/components/dynamic-border.ts +25 -0
  437. package/src/modes/components/extensions/extension-dashboard.ts +326 -0
  438. package/src/modes/components/extensions/extension-list.ts +492 -0
  439. package/src/modes/components/extensions/index.ts +9 -0
  440. package/src/modes/components/extensions/inspector-panel.ts +317 -0
  441. package/src/modes/components/extensions/state-manager.ts +587 -0
  442. package/src/modes/components/extensions/types.ts +191 -0
  443. package/src/modes/components/footer.ts +262 -0
  444. package/src/modes/components/gutter-block.ts +315 -0
  445. package/src/modes/components/history-search.ts +158 -0
  446. package/src/modes/components/hook-editor.ts +151 -0
  447. package/src/modes/components/hook-input.ts +81 -0
  448. package/src/modes/components/hook-message.ts +100 -0
  449. package/src/modes/components/hook-selector.ts +192 -0
  450. package/src/modes/components/index.ts +36 -0
  451. package/src/modes/components/keybinding-hints.ts +65 -0
  452. package/src/modes/components/login-dialog.ts +164 -0
  453. package/src/modes/components/mcp-add-wizard.ts +1314 -0
  454. package/src/modes/components/model-selector.ts +946 -0
  455. package/src/modes/components/oauth-selector.ts +211 -0
  456. package/src/modes/components/plugin-selector.ts +95 -0
  457. package/src/modes/components/plugin-settings.ts +477 -0
  458. package/src/modes/components/plugins/index.ts +5 -0
  459. package/src/modes/components/plugins/plugin-dashboard.ts +523 -0
  460. package/src/modes/components/plugins/plugin-inspector-pane.ts +84 -0
  461. package/src/modes/components/plugins/plugin-list-pane.ts +109 -0
  462. package/src/modes/components/plugins/state-manager.ts +229 -0
  463. package/src/modes/components/plugins/types.ts +51 -0
  464. package/src/modes/components/plugins/utils.ts +6 -0
  465. package/src/modes/components/python-execution.ts +244 -0
  466. package/src/modes/components/queue-mode-selector.ts +56 -0
  467. package/src/modes/components/read-tool-group.ts +137 -0
  468. package/src/modes/components/session-observer-overlay.ts +483 -0
  469. package/src/modes/components/session-selector.ts +343 -0
  470. package/src/modes/components/settings-defs.ts +568 -0
  471. package/src/modes/components/settings-selector.ts +641 -0
  472. package/src/modes/components/show-images-selector.ts +45 -0
  473. package/src/modes/components/skill-message.ts +90 -0
  474. package/src/modes/components/status-line/context-gradient.ts +64 -0
  475. package/src/modes/components/status-line/git-utils.ts +42 -0
  476. package/src/modes/components/status-line/hex-ansi.ts +29 -0
  477. package/src/modes/components/status-line/index.ts +4 -0
  478. package/src/modes/components/status-line/presets.ts +174 -0
  479. package/src/modes/components/status-line/segments.ts +494 -0
  480. package/src/modes/components/status-line/separators.ts +55 -0
  481. package/src/modes/components/status-line/token-rate.ts +66 -0
  482. package/src/modes/components/status-line/types.ts +96 -0
  483. package/src/modes/components/status-line-segment-editor.ts +361 -0
  484. package/src/modes/components/status-line.ts +729 -0
  485. package/src/modes/components/theme-selector.ts +63 -0
  486. package/src/modes/components/thinking-selector.ts +52 -0
  487. package/src/modes/components/todo-reminder.ts +54 -0
  488. package/src/modes/components/tool-execution.ts +781 -0
  489. package/src/modes/components/tree-selector.ts +908 -0
  490. package/src/modes/components/ttsr-notification.ts +80 -0
  491. package/src/modes/components/user-message-selector.ts +141 -0
  492. package/src/modes/components/user-message.ts +100 -0
  493. package/src/modes/components/visual-truncate.ts +63 -0
  494. package/src/modes/components/welcome-checks.ts +313 -0
  495. package/src/modes/components/welcome.ts +270 -0
  496. package/src/modes/controllers/btw-controller.ts +193 -0
  497. package/src/modes/controllers/chord-routing.ts +37 -0
  498. package/src/modes/controllers/command-controller.ts +1293 -0
  499. package/src/modes/controllers/context-command-controller.ts +61 -0
  500. package/src/modes/controllers/event-controller.ts +743 -0
  501. package/src/modes/controllers/extension-ui-controller.ts +983 -0
  502. package/src/modes/controllers/input-controller.ts +877 -0
  503. package/src/modes/controllers/mcp-command-controller.ts +1940 -0
  504. package/src/modes/controllers/selector-controller.ts +1292 -0
  505. package/src/modes/controllers/ssh-command-controller.ts +421 -0
  506. package/src/modes/index.ts +34 -0
  507. package/src/modes/interactive-mode.ts +1781 -0
  508. package/src/modes/oauth-manual-input.ts +42 -0
  509. package/src/modes/print-mode.ts +196 -0
  510. package/src/modes/prompt-action-autocomplete.ts +231 -0
  511. package/src/modes/rpc/host-tools.ts +186 -0
  512. package/src/modes/rpc/rpc-client.ts +762 -0
  513. package/src/modes/rpc/rpc-mode.ts +877 -0
  514. package/src/modes/rpc/rpc-types.ts +322 -0
  515. package/src/modes/session-observer-registry.ts +146 -0
  516. package/src/modes/shared.ts +30 -0
  517. package/src/modes/theme/defaults/index.ts +7 -0
  518. package/src/modes/theme/defaults/xcsh-dark.json +113 -0
  519. package/src/modes/theme/defaults/xcsh-light.json +115 -0
  520. package/src/modes/theme/mermaid-cache.ts +151 -0
  521. package/src/modes/theme/mermaid-palette.ts +39 -0
  522. package/src/modes/theme/theme-schema.json +553 -0
  523. package/src/modes/theme/theme.ts +2563 -0
  524. package/src/modes/types.ts +273 -0
  525. package/src/modes/utils/hotkeys-markdown.ts +60 -0
  526. package/src/modes/utils/keybinding-matchers.ts +30 -0
  527. package/src/modes/utils/read-group-outcome-aggregator.ts +55 -0
  528. package/src/modes/utils/sanitize-error-message.ts +60 -0
  529. package/src/modes/utils/tools-markdown.ts +28 -0
  530. package/src/modes/utils/ui-helpers.ts +734 -0
  531. package/src/plan-mode/approved-plan.ts +55 -0
  532. package/src/plan-mode/state.ts +6 -0
  533. package/src/priority.json +37 -0
  534. package/src/prompts/agents/designer.md +67 -0
  535. package/src/prompts/agents/explore.md +61 -0
  536. package/src/prompts/agents/frontmatter.md +10 -0
  537. package/src/prompts/agents/init.md +36 -0
  538. package/src/prompts/agents/librarian.md +121 -0
  539. package/src/prompts/agents/plan.md +49 -0
  540. package/src/prompts/agents/reviewer.md +127 -0
  541. package/src/prompts/agents/task.md +16 -0
  542. package/src/prompts/ci-green-request.md +35 -0
  543. package/src/prompts/compaction/branch-summary-context.md +5 -0
  544. package/src/prompts/compaction/branch-summary-preamble.md +2 -0
  545. package/src/prompts/compaction/branch-summary.md +30 -0
  546. package/src/prompts/compaction/compaction-short-summary.md +9 -0
  547. package/src/prompts/compaction/compaction-summary-context.md +5 -0
  548. package/src/prompts/compaction/compaction-summary.md +38 -0
  549. package/src/prompts/compaction/compaction-turn-prefix.md +17 -0
  550. package/src/prompts/compaction/compaction-update-summary.md +45 -0
  551. package/src/prompts/memories/consolidation.md +30 -0
  552. package/src/prompts/memories/read-path.md +11 -0
  553. package/src/prompts/memories/stage_one_input.md +6 -0
  554. package/src/prompts/memories/stage_one_system.md +21 -0
  555. package/src/prompts/review-request.md +70 -0
  556. package/src/prompts/system/agent-creation-architect.md +65 -0
  557. package/src/prompts/system/agent-creation-user.md +6 -0
  558. package/src/prompts/system/auto-handoff-threshold-focus.md +1 -0
  559. package/src/prompts/system/btw-user.md +8 -0
  560. package/src/prompts/system/commit-message-system.md +2 -0
  561. package/src/prompts/system/custom-system-prompt.md +82 -0
  562. package/src/prompts/system/eager-todo.md +13 -0
  563. package/src/prompts/system/file-operations.md +10 -0
  564. package/src/prompts/system/handoff-document.md +48 -0
  565. package/src/prompts/system/plan-mode-active.md +114 -0
  566. package/src/prompts/system/plan-mode-approved.md +23 -0
  567. package/src/prompts/system/plan-mode-reference.md +14 -0
  568. package/src/prompts/system/plan-mode-subagent.md +34 -0
  569. package/src/prompts/system/plan-mode-tool-decision-reminder.md +9 -0
  570. package/src/prompts/system/subagent-submit-reminder.md +7 -0
  571. package/src/prompts/system/subagent-system-prompt.md +36 -0
  572. package/src/prompts/system/subagent-user-prompt.md +12 -0
  573. package/src/prompts/system/summarization-system.md +3 -0
  574. package/src/prompts/system/system-prompt.md +698 -0
  575. package/src/prompts/system/title-system.md +2 -0
  576. package/src/prompts/system/ttsr-interrupt.md +7 -0
  577. package/src/prompts/system/web-search.md +28 -0
  578. package/src/prompts/tools/ask.md +28 -0
  579. package/src/prompts/tools/ast-edit.md +48 -0
  580. package/src/prompts/tools/ast-grep.md +54 -0
  581. package/src/prompts/tools/async-result.md +5 -0
  582. package/src/prompts/tools/bash.md +67 -0
  583. package/src/prompts/tools/browser.md +26 -0
  584. package/src/prompts/tools/calculator.md +10 -0
  585. package/src/prompts/tools/cancel-job.md +5 -0
  586. package/src/prompts/tools/catalog-workflow-runner.md +13 -0
  587. package/src/prompts/tools/checkpoint.md +16 -0
  588. package/src/prompts/tools/chunk-edit.md +279 -0
  589. package/src/prompts/tools/debug.md +43 -0
  590. package/src/prompts/tools/display-image.md +23 -0
  591. package/src/prompts/tools/exit-plan-mode.md +41 -0
  592. package/src/prompts/tools/find.md +26 -0
  593. package/src/prompts/tools/gemini-image.md +7 -0
  594. package/src/prompts/tools/grep.md +29 -0
  595. package/src/prompts/tools/hashline.md +131 -0
  596. package/src/prompts/tools/inspect-image-system.md +20 -0
  597. package/src/prompts/tools/inspect-image.md +32 -0
  598. package/src/prompts/tools/lsp.md +33 -0
  599. package/src/prompts/tools/patch.md +77 -0
  600. package/src/prompts/tools/poll.md +5 -0
  601. package/src/prompts/tools/python.md +60 -0
  602. package/src/prompts/tools/read-chunk.md +35 -0
  603. package/src/prompts/tools/read.md +63 -0
  604. package/src/prompts/tools/render-mermaid.md +9 -0
  605. package/src/prompts/tools/replace.md +36 -0
  606. package/src/prompts/tools/resolve.md +8 -0
  607. package/src/prompts/tools/rewind.md +13 -0
  608. package/src/prompts/tools/search-tool-bm25.md +34 -0
  609. package/src/prompts/tools/ssh.md +44 -0
  610. package/src/prompts/tools/task-summary.md +28 -0
  611. package/src/prompts/tools/task.md +131 -0
  612. package/src/prompts/tools/todo-write.md +89 -0
  613. package/src/prompts/tools/vim.md +98 -0
  614. package/src/prompts/tools/web-search.md +10 -0
  615. package/src/prompts/tools/write.md +14 -0
  616. package/src/prompts/tools/xcsh-api.md +283 -0
  617. package/src/resource-management/index.ts +42 -0
  618. package/src/sdk.ts +2123 -0
  619. package/src/secrets/index.ts +146 -0
  620. package/src/secrets/obfuscator.ts +290 -0
  621. package/src/secrets/regex.ts +21 -0
  622. package/src/services/context-env.ts +102 -0
  623. package/src/services/xcsh-api-client.ts +230 -0
  624. package/src/services/xcsh-context-command.ts +803 -0
  625. package/src/services/xcsh-context-display.ts +49 -0
  626. package/src/services/xcsh-context-indicators.ts +17 -0
  627. package/src/services/xcsh-context-segment.ts +39 -0
  628. package/src/services/xcsh-context.ts +1410 -0
  629. package/src/services/xcsh-env.ts +107 -0
  630. package/src/services/xcsh-knowledge.ts +177 -0
  631. package/src/services/xcsh-table.ts +164 -0
  632. package/src/session/agent-session.ts +6690 -0
  633. package/src/session/agent-storage.ts +451 -0
  634. package/src/session/artifacts.ts +132 -0
  635. package/src/session/auth-storage.ts +17 -0
  636. package/src/session/blob-store.ts +135 -0
  637. package/src/session/compaction/branch-summarization.ts +322 -0
  638. package/src/session/compaction/compaction.ts +1388 -0
  639. package/src/session/compaction/index.ts +7 -0
  640. package/src/session/compaction/pruning.ts +91 -0
  641. package/src/session/compaction/utils.ts +184 -0
  642. package/src/session/history-storage.ts +253 -0
  643. package/src/session/messages.ts +597 -0
  644. package/src/session/session-dump-format.ts +203 -0
  645. package/src/session/session-manager.ts +2816 -0
  646. package/src/session/session-storage.ts +370 -0
  647. package/src/session/streaming-output.ts +770 -0
  648. package/src/session/tool-choice-queue.ts +213 -0
  649. package/src/slash-commands/builtin-registry.ts +1614 -0
  650. package/src/slash-commands/export-command.ts +178 -0
  651. package/src/slash-commands/marketplace-install-parser.ts +99 -0
  652. package/src/slash-commands/resource-commands.ts +250 -0
  653. package/src/ssh/config-writer.ts +183 -0
  654. package/src/ssh/connection-manager.ts +445 -0
  655. package/src/ssh/ssh-executor.ts +131 -0
  656. package/src/ssh/sshfs-mount.ts +137 -0
  657. package/src/ssh/utils.ts +8 -0
  658. package/src/stt/downloader.ts +71 -0
  659. package/src/stt/index.ts +3 -0
  660. package/src/stt/recorder.ts +351 -0
  661. package/src/stt/setup.ts +52 -0
  662. package/src/stt/stt-controller.ts +160 -0
  663. package/src/stt/transcribe.py +70 -0
  664. package/src/stt/transcriber.ts +91 -0
  665. package/src/system-prompt.ts +688 -0
  666. package/src/task/agents.ts +166 -0
  667. package/src/task/commands.ts +131 -0
  668. package/src/task/discovery.ts +126 -0
  669. package/src/task/executor.ts +1324 -0
  670. package/src/task/index.ts +1197 -0
  671. package/src/task/isolation-backend.ts +72 -0
  672. package/src/task/name-generator.ts +1577 -0
  673. package/src/task/output-manager.ts +107 -0
  674. package/src/task/parallel.ts +116 -0
  675. package/src/task/render.ts +1035 -0
  676. package/src/task/subprocess-tool-registry.ts +88 -0
  677. package/src/task/template.ts +33 -0
  678. package/src/task/types.ts +230 -0
  679. package/src/task/worktree.ts +580 -0
  680. package/src/task/xcsh-command.ts +26 -0
  681. package/src/thinking.ts +87 -0
  682. package/src/tools/action-renderer.ts +198 -0
  683. package/src/tools/archive-reader.ts +315 -0
  684. package/src/tools/ask.ts +791 -0
  685. package/src/tools/ast-edit.ts +492 -0
  686. package/src/tools/ast-grep.ts +453 -0
  687. package/src/tools/auto-generated-guard.ts +305 -0
  688. package/src/tools/bash-interactive.ts +383 -0
  689. package/src/tools/bash-interceptor.ts +67 -0
  690. package/src/tools/bash-normalize.ts +107 -0
  691. package/src/tools/bash-skill-urls.ts +246 -0
  692. package/src/tools/bash.ts +878 -0
  693. package/src/tools/browser-renderer.ts +129 -0
  694. package/src/tools/browser.ts +1366 -0
  695. package/src/tools/calculator.ts +543 -0
  696. package/src/tools/cancel-job.ts +100 -0
  697. package/src/tools/catalog-workflow-runner.ts +718 -0
  698. package/src/tools/checkpoint.ts +133 -0
  699. package/src/tools/context.ts +39 -0
  700. package/src/tools/debug.ts +1004 -0
  701. package/src/tools/display-image-renderer.ts +96 -0
  702. package/src/tools/display-image.ts +109 -0
  703. package/src/tools/exit-plan-mode.ts +101 -0
  704. package/src/tools/fetch.ts +1462 -0
  705. package/src/tools/find.ts +437 -0
  706. package/src/tools/fs-cache-invalidation.ts +33 -0
  707. package/src/tools/gemini-image.ts +1004 -0
  708. package/src/tools/grep.ts +705 -0
  709. package/src/tools/index.ts +442 -0
  710. package/src/tools/inspect-image-renderer.ts +101 -0
  711. package/src/tools/inspect-image.ts +176 -0
  712. package/src/tools/json-tree.ts +266 -0
  713. package/src/tools/jtd-to-json-schema.ts +199 -0
  714. package/src/tools/jtd-to-typescript.ts +136 -0
  715. package/src/tools/jtd-utils.ts +102 -0
  716. package/src/tools/list-limit.ts +40 -0
  717. package/src/tools/mermaid-renderer.ts +127 -0
  718. package/src/tools/notebook.ts +288 -0
  719. package/src/tools/output-meta.ts +588 -0
  720. package/src/tools/path-utils.ts +560 -0
  721. package/src/tools/plan-mode-guard.ts +41 -0
  722. package/src/tools/poll-tool.ts +177 -0
  723. package/src/tools/puppeteer/00_stealth_tampering.txt +63 -0
  724. package/src/tools/puppeteer/01_stealth_activity.txt +20 -0
  725. package/src/tools/puppeteer/02_stealth_hairline.txt +11 -0
  726. package/src/tools/puppeteer/03_stealth_botd.txt +384 -0
  727. package/src/tools/puppeteer/04_stealth_iframe.txt +81 -0
  728. package/src/tools/puppeteer/05_stealth_webgl.txt +75 -0
  729. package/src/tools/puppeteer/06_stealth_screen.txt +72 -0
  730. package/src/tools/puppeteer/07_stealth_fonts.txt +97 -0
  731. package/src/tools/puppeteer/08_stealth_audio.txt +51 -0
  732. package/src/tools/puppeteer/09_stealth_locale.txt +46 -0
  733. package/src/tools/puppeteer/10_stealth_plugins.txt +206 -0
  734. package/src/tools/puppeteer/11_stealth_hardware.txt +8 -0
  735. package/src/tools/puppeteer/12_stealth_codecs.txt +40 -0
  736. package/src/tools/puppeteer/13_stealth_worker.txt +74 -0
  737. package/src/tools/python.ts +1184 -0
  738. package/src/tools/read.ts +1591 -0
  739. package/src/tools/render-mermaid.ts +93 -0
  740. package/src/tools/render-utils.ts +677 -0
  741. package/src/tools/renderers.ts +82 -0
  742. package/src/tools/report-tool-issue.ts +80 -0
  743. package/src/tools/resolve.ts +196 -0
  744. package/src/tools/review.ts +238 -0
  745. package/src/tools/search-tool-bm25.ts +288 -0
  746. package/src/tools/sqlite-reader.ts +623 -0
  747. package/src/tools/ssh.ts +322 -0
  748. package/src/tools/submit-result.ts +229 -0
  749. package/src/tools/todo-render.ts +33 -0
  750. package/src/tools/todo-write.ts +440 -0
  751. package/src/tools/tool-errors.ts +62 -0
  752. package/src/tools/tool-result.ts +93 -0
  753. package/src/tools/tool-timeouts.ts +30 -0
  754. package/src/tools/vim.ts +981 -0
  755. package/src/tools/write.ts +671 -0
  756. package/src/tools/xcsh-api-renderer.ts +402 -0
  757. package/src/tools/xcsh-api.ts +887 -0
  758. package/src/tui/code-cell.ts +101 -0
  759. package/src/tui/file-list.ts +47 -0
  760. package/src/tui/index.ts +11 -0
  761. package/src/tui/output-block.ts +175 -0
  762. package/src/tui/status-line.ts +39 -0
  763. package/src/tui/tree-list.ts +84 -0
  764. package/src/tui/types.ts +15 -0
  765. package/src/tui/utils.ts +103 -0
  766. package/src/utils/changelog.ts +98 -0
  767. package/src/utils/clipboard.ts +80 -0
  768. package/src/utils/command-args.ts +76 -0
  769. package/src/utils/commit-message-generator.ts +137 -0
  770. package/src/utils/edit-mode.ts +50 -0
  771. package/src/utils/event-bus.ts +33 -0
  772. package/src/utils/external-editor.ts +65 -0
  773. package/src/utils/file-display-mode.ts +37 -0
  774. package/src/utils/file-mentions.ts +376 -0
  775. package/src/utils/fuzzy.ts +108 -0
  776. package/src/utils/git.ts +1495 -0
  777. package/src/utils/gitstatus.ts +140 -0
  778. package/src/utils/image-convert.ts +27 -0
  779. package/src/utils/image-loading.ts +98 -0
  780. package/src/utils/image-passthrough.ts +118 -0
  781. package/src/utils/image-resize.ts +272 -0
  782. package/src/utils/image-viewer.ts +17 -0
  783. package/src/utils/lang-from-path.ts +239 -0
  784. package/src/utils/markit.ts +81 -0
  785. package/src/utils/open.ts +20 -0
  786. package/src/utils/session-color.ts +55 -0
  787. package/src/utils/shell-snapshot.ts +188 -0
  788. package/src/utils/title-generator.ts +193 -0
  789. package/src/utils/tool-choice.ts +28 -0
  790. package/src/utils/tools-manager.ts +356 -0
  791. package/src/vim/buffer.ts +309 -0
  792. package/src/vim/commands.ts +382 -0
  793. package/src/vim/engine.ts +2426 -0
  794. package/src/vim/parser.ts +151 -0
  795. package/src/vim/render.ts +252 -0
  796. package/src/vim/types.ts +197 -0
  797. package/src/web/kagi.ts +174 -0
  798. package/src/web/parallel.ts +346 -0
  799. package/src/web/scrapers/artifacthub.ts +207 -0
  800. package/src/web/scrapers/arxiv.ts +83 -0
  801. package/src/web/scrapers/aur.ts +162 -0
  802. package/src/web/scrapers/biorxiv.ts +133 -0
  803. package/src/web/scrapers/bluesky.ts +262 -0
  804. package/src/web/scrapers/brew.ts +172 -0
  805. package/src/web/scrapers/cheatsh.ts +68 -0
  806. package/src/web/scrapers/chocolatey.ts +196 -0
  807. package/src/web/scrapers/choosealicense.ts +95 -0
  808. package/src/web/scrapers/cisa-kev.ts +87 -0
  809. package/src/web/scrapers/clojars.ts +154 -0
  810. package/src/web/scrapers/coingecko.ts +177 -0
  811. package/src/web/scrapers/crates-io.ts +110 -0
  812. package/src/web/scrapers/crossref.ts +136 -0
  813. package/src/web/scrapers/devto.ts +147 -0
  814. package/src/web/scrapers/discogs.ts +306 -0
  815. package/src/web/scrapers/discourse.ts +197 -0
  816. package/src/web/scrapers/dockerhub.ts +138 -0
  817. package/src/web/scrapers/docs-rs.ts +653 -0
  818. package/src/web/scrapers/fdroid.ts +134 -0
  819. package/src/web/scrapers/firefox-addons.ts +191 -0
  820. package/src/web/scrapers/flathub.ts +223 -0
  821. package/src/web/scrapers/github-gist.ts +58 -0
  822. package/src/web/scrapers/github.ts +452 -0
  823. package/src/web/scrapers/gitlab.ts +401 -0
  824. package/src/web/scrapers/go-pkg.ts +266 -0
  825. package/src/web/scrapers/hackage.ts +140 -0
  826. package/src/web/scrapers/hackernews.ts +189 -0
  827. package/src/web/scrapers/hex.ts +105 -0
  828. package/src/web/scrapers/huggingface.ts +321 -0
  829. package/src/web/scrapers/iacr.ts +89 -0
  830. package/src/web/scrapers/index.ts +252 -0
  831. package/src/web/scrapers/jetbrains-marketplace.ts +159 -0
  832. package/src/web/scrapers/lemmy.ts +203 -0
  833. package/src/web/scrapers/lobsters.ts +175 -0
  834. package/src/web/scrapers/mastodon.ts +292 -0
  835. package/src/web/scrapers/maven.ts +138 -0
  836. package/src/web/scrapers/mdn.ts +169 -0
  837. package/src/web/scrapers/metacpan.ts +222 -0
  838. package/src/web/scrapers/musicbrainz.ts +250 -0
  839. package/src/web/scrapers/npm.ts +98 -0
  840. package/src/web/scrapers/nuget.ts +183 -0
  841. package/src/web/scrapers/nvd.ts +222 -0
  842. package/src/web/scrapers/ollama.ts +239 -0
  843. package/src/web/scrapers/open-vsx.ts +106 -0
  844. package/src/web/scrapers/opencorporates.ts +292 -0
  845. package/src/web/scrapers/openlibrary.ts +336 -0
  846. package/src/web/scrapers/orcid.ts +286 -0
  847. package/src/web/scrapers/osv.ts +176 -0
  848. package/src/web/scrapers/packagist.ts +160 -0
  849. package/src/web/scrapers/pub-dev.ts +143 -0
  850. package/src/web/scrapers/pubmed.ts +211 -0
  851. package/src/web/scrapers/pypi.ts +112 -0
  852. package/src/web/scrapers/rawg.ts +110 -0
  853. package/src/web/scrapers/readthedocs.ts +120 -0
  854. package/src/web/scrapers/reddit.ts +95 -0
  855. package/src/web/scrapers/repology.ts +251 -0
  856. package/src/web/scrapers/rfc.ts +201 -0
  857. package/src/web/scrapers/rubygems.ts +103 -0
  858. package/src/web/scrapers/searchcode.ts +190 -0
  859. package/src/web/scrapers/sec-edgar.ts +261 -0
  860. package/src/web/scrapers/semantic-scholar.ts +171 -0
  861. package/src/web/scrapers/snapcraft.ts +187 -0
  862. package/src/web/scrapers/sourcegraph.ts +336 -0
  863. package/src/web/scrapers/spdx.ts +108 -0
  864. package/src/web/scrapers/spotify.ts +198 -0
  865. package/src/web/scrapers/stackoverflow.ts +120 -0
  866. package/src/web/scrapers/terraform.ts +277 -0
  867. package/src/web/scrapers/tldr.ts +47 -0
  868. package/src/web/scrapers/twitter.ts +93 -0
  869. package/src/web/scrapers/types.ts +267 -0
  870. package/src/web/scrapers/utils.ts +109 -0
  871. package/src/web/scrapers/vimeo.ts +133 -0
  872. package/src/web/scrapers/vscode-marketplace.ts +187 -0
  873. package/src/web/scrapers/w3c.ts +156 -0
  874. package/src/web/scrapers/wikidata.ts +344 -0
  875. package/src/web/scrapers/wikipedia.ts +84 -0
  876. package/src/web/scrapers/youtube.ts +313 -0
  877. package/src/web/search/errors.ts +120 -0
  878. package/src/web/search/index.ts +346 -0
  879. package/src/web/search/params.ts +129 -0
  880. package/src/web/search/provider.ts +97 -0
  881. package/src/web/search/providers/anthropic.ts +339 -0
  882. package/src/web/search/providers/base.ts +35 -0
  883. package/src/web/search/providers/brave.ts +150 -0
  884. package/src/web/search/providers/codex.ts +402 -0
  885. package/src/web/search/providers/exa.ts +264 -0
  886. package/src/web/search/providers/firecrawl.ts +115 -0
  887. package/src/web/search/providers/gemini.ts +566 -0
  888. package/src/web/search/providers/jina.ts +99 -0
  889. package/src/web/search/providers/kagi.ts +70 -0
  890. package/src/web/search/providers/kimi.ts +157 -0
  891. package/src/web/search/providers/parallel.ts +63 -0
  892. package/src/web/search/providers/perplexity.ts +546 -0
  893. package/src/web/search/providers/synthetic.ts +113 -0
  894. package/src/web/search/providers/tavily.ts +162 -0
  895. package/src/web/search/providers/utils.ts +36 -0
  896. package/src/web/search/providers/zai.ts +311 -0
  897. package/src/web/search/render.ts +348 -0
  898. package/src/web/search/types.ts +438 -0
  899. package/src/web/search/utils.ts +17 -0
@@ -0,0 +1,456 @@
1
+ /**
2
+ * /review command - Interactive code review launcher
3
+ *
4
+ * Provides a menu to select review mode:
5
+ * 1. Review against a base branch (PR style)
6
+ * 2. Review uncommitted changes
7
+ * 3. Review a specific commit
8
+ * 4. Custom review instructions
9
+ *
10
+ * Runs git diff upfront, parses results, filters noise, and provides
11
+ * rich context for the orchestrating agent to distribute work across
12
+ * multiple reviewer agents based on diff weight and locality.
13
+ */
14
+ import { prompt } from "@f5xc-salesdemos/pi-utils";
15
+ import type { CustomCommand, CustomCommandAPI } from "../../../../extensibility/custom-commands/types";
16
+ import type { HookCommandContext } from "../../../../extensibility/hooks/types";
17
+ import reviewRequestTemplate from "../../../../prompts/review-request.md" with { type: "text" };
18
+ import * as git from "../../../../utils/git";
19
+
20
+ // ─────────────────────────────────────────────────────────────────────────────
21
+ // Types
22
+ // ─────────────────────────────────────────────────────────────────────────────
23
+
24
+ interface FileDiff {
25
+ path: string;
26
+ linesAdded: number;
27
+ linesRemoved: number;
28
+ hunks: string;
29
+ }
30
+
31
+ interface DiffStats {
32
+ files: FileDiff[];
33
+ totalAdded: number;
34
+ totalRemoved: number;
35
+ excluded: { path: string; reason: string; linesAdded: number; linesRemoved: number }[];
36
+ }
37
+
38
+ // ─────────────────────────────────────────────────────────────────────────────
39
+ // Exclusion patterns for noise files
40
+ // ─────────────────────────────────────────────────────────────────────────────
41
+
42
+ const EXCLUDED_PATTERNS: { pattern: RegExp; reason: string }[] = [
43
+ // Lock files
44
+ { pattern: /\.lock$/, reason: "lock file" },
45
+ { pattern: /-lock\.(json|yaml|yml)$/, reason: "lock file" },
46
+ { pattern: /package-lock\.json$/, reason: "lock file" },
47
+ { pattern: /yarn\.lock$/, reason: "lock file" },
48
+ { pattern: /pnpm-lock\.yaml$/, reason: "lock file" },
49
+ { pattern: /Cargo\.lock$/, reason: "lock file" },
50
+ { pattern: /Gemfile\.lock$/, reason: "lock file" },
51
+ { pattern: /poetry\.lock$/, reason: "lock file" },
52
+ { pattern: /composer\.lock$/, reason: "lock file" },
53
+ { pattern: /flake\.lock$/, reason: "lock file" },
54
+
55
+ // Generated/build artifacts
56
+ { pattern: /\.min\.(js|css)$/, reason: "minified" },
57
+ { pattern: /\.generated\./, reason: "generated" },
58
+ { pattern: /\.snap$/, reason: "snapshot" },
59
+ { pattern: /\.map$/, reason: "source map" },
60
+ { pattern: /^dist\//, reason: "build output" },
61
+ { pattern: /^build\//, reason: "build output" },
62
+ { pattern: /^out\//, reason: "build output" },
63
+ { pattern: /node_modules\//, reason: "vendor" },
64
+ { pattern: /vendor\//, reason: "vendor" },
65
+
66
+ // Binary/assets (usually shown as binary in diff anyway)
67
+ { pattern: /\.(png|jpg|jpeg|gif|ico|webp|avif)$/i, reason: "image" },
68
+ { pattern: /\.(woff|woff2|ttf|eot|otf)$/i, reason: "font" },
69
+ { pattern: /\.(pdf|zip|tar|gz|rar|7z)$/i, reason: "binary" },
70
+ ];
71
+
72
+ // ─────────────────────────────────────────────────────────────────────────────
73
+ // Diff parsing
74
+ // ─────────────────────────────────────────────────────────────────────────────
75
+
76
+ /**
77
+ * Check if a file path should be excluded from review.
78
+ * Returns the exclusion reason if excluded, undefined otherwise.
79
+ */
80
+ function getExclusionReason(path: string): string | undefined {
81
+ for (const { pattern, reason } of EXCLUDED_PATTERNS) {
82
+ if (pattern.test(path)) return reason;
83
+ }
84
+ return undefined;
85
+ }
86
+
87
+ /**
88
+ * Parse unified diff output into per-file stats.
89
+ * Splits on file boundaries, counts +/- lines, and filters excluded files.
90
+ */
91
+ function parseDiff(diffOutput: string): DiffStats {
92
+ const files: FileDiff[] = [];
93
+ const excluded: DiffStats["excluded"] = [];
94
+ let totalAdded = 0;
95
+ let totalRemoved = 0;
96
+
97
+ // Split by file boundary: "diff --git a/... b/..."
98
+ const fileChunks = diffOutput.split(/^diff --git /m).filter(Boolean);
99
+
100
+ for (const chunk of fileChunks) {
101
+ // Extract file path from "a/path b/path" line
102
+ const headerMatch = chunk.match(/^a\/(.+?) b\/(.+)/);
103
+ if (!headerMatch) continue;
104
+
105
+ const path = headerMatch[2];
106
+
107
+ // Count added/removed lines (lines starting with + or - but not ++ or --)
108
+ let linesAdded = 0;
109
+ let linesRemoved = 0;
110
+
111
+ const lines = chunk.split("\n");
112
+ for (const line of lines) {
113
+ if (line.startsWith("+") && !line.startsWith("+++")) {
114
+ linesAdded++;
115
+ } else if (line.startsWith("-") && !line.startsWith("---")) {
116
+ linesRemoved++;
117
+ }
118
+ }
119
+
120
+ const exclusionReason = getExclusionReason(path);
121
+ if (exclusionReason) {
122
+ excluded.push({ path, reason: exclusionReason, linesAdded, linesRemoved });
123
+ } else {
124
+ files.push({
125
+ path,
126
+ linesAdded,
127
+ linesRemoved,
128
+ hunks: `diff --git ${chunk}`,
129
+ });
130
+ totalAdded += linesAdded;
131
+ totalRemoved += linesRemoved;
132
+ }
133
+ }
134
+
135
+ return { files, totalAdded, totalRemoved, excluded };
136
+ }
137
+
138
+ /**
139
+ * Get file extension for display purposes.
140
+ */
141
+ function getFileExt(path: string): string {
142
+ const match = path.match(/\.([^.]+)$/);
143
+ return match ? match[1] : "";
144
+ }
145
+
146
+ /**
147
+ * Determine recommended number of reviewer agents based on diff weight.
148
+ * Uses total lines changed as the primary metric.
149
+ */
150
+ function getRecommendedAgentCount(stats: DiffStats): number {
151
+ const totalLines = stats.totalAdded + stats.totalRemoved;
152
+ const fileCount = stats.files.length;
153
+
154
+ // Heuristics:
155
+ // - Tiny (<100 lines or 1-2 files): 1 agent
156
+ // - Small (<500 lines): 1-2 agents
157
+ // - Medium (<2000 lines): 2-4 agents
158
+ // - Large (<5000 lines): 4-8 agents
159
+ // - Huge (>5000 lines): 8-16 agents
160
+
161
+ if (totalLines < 100 || fileCount <= 2) return 1;
162
+ if (totalLines < 500) return Math.min(2, fileCount);
163
+ if (totalLines < 2000) return Math.min(4, Math.ceil(fileCount / 3));
164
+ if (totalLines < 5000) return Math.min(8, Math.ceil(fileCount / 2));
165
+ return Math.min(16, fileCount);
166
+ }
167
+
168
+ /**
169
+ * Extract first N lines of actual diff content (excluding headers) for preview.
170
+ */
171
+ function getDiffPreview(hunks: string, maxLines: number): string {
172
+ const lines = hunks.split("\n");
173
+ const contentLines: string[] = [];
174
+
175
+ for (const line of lines) {
176
+ // Skip diff headers, keep actual content
177
+ if (
178
+ line.startsWith("diff --git") ||
179
+ line.startsWith("index ") ||
180
+ line.startsWith("---") ||
181
+ line.startsWith("+++") ||
182
+ line.startsWith("@@")
183
+ ) {
184
+ continue;
185
+ }
186
+ contentLines.push(line);
187
+ if (contentLines.length >= maxLines) break;
188
+ }
189
+
190
+ return contentLines.join("\n");
191
+ }
192
+
193
+ // Thresholds for diff inclusion
194
+ const MAX_DIFF_CHARS = 50_000; // Don't include diff above this
195
+ const MAX_FILES_FOR_INLINE_DIFF = 20; // Don't include diff if more files than this
196
+
197
+ /**
198
+ * Build the full review prompt with diff stats and distribution guidance.
199
+ */
200
+ function buildReviewPrompt(mode: string, stats: DiffStats, rawDiff: string, additionalInstructions?: string): string {
201
+ const agentCount = getRecommendedAgentCount(stats);
202
+ const skipDiff = rawDiff.length > MAX_DIFF_CHARS || stats.files.length > MAX_FILES_FOR_INLINE_DIFF;
203
+ const totalLines = stats.totalAdded + stats.totalRemoved;
204
+ const linesPerFile = skipDiff ? Math.max(5, Math.floor(100 / stats.files.length)) : 0;
205
+
206
+ const filesWithExt = stats.files.map(f => ({
207
+ ...f,
208
+ ext: getFileExt(f.path),
209
+ hunksPreview: skipDiff ? getDiffPreview(f.hunks, linesPerFile) : "",
210
+ }));
211
+
212
+ return prompt.render(reviewRequestTemplate, {
213
+ mode,
214
+ files: filesWithExt,
215
+ excluded: stats.excluded,
216
+ totalAdded: stats.totalAdded,
217
+ totalRemoved: stats.totalRemoved,
218
+ totalLines,
219
+ agentCount,
220
+ multiAgent: agentCount > 1,
221
+ skipDiff,
222
+ rawDiff: rawDiff.trim(),
223
+ linesPerFile,
224
+ additionalInstructions,
225
+ });
226
+ }
227
+
228
+ export class ReviewCommand implements CustomCommand {
229
+ name = "review";
230
+ description = "Launch interactive code review";
231
+
232
+ constructor(private api: CustomCommandAPI) {}
233
+
234
+ async execute(args: string[], ctx: HookCommandContext): Promise<string | undefined> {
235
+ if (!ctx.hasUI) {
236
+ const base = "Use the Task tool to run the 'reviewer' agent to review recent code changes.";
237
+ return args.length > 0 ? `${base} Focus: ${args.join(" ")}` : base;
238
+ }
239
+
240
+ // Inline args act as additional instructions appended to the generated prompt.
241
+ // When present, skip option 4 (editor) — the args already provide the instructions.
242
+ const extraInstructions = args.length > 0 ? args.join(" ") : undefined;
243
+
244
+ const menuItems = extraInstructions
245
+ ? [
246
+ "1. Review against a base branch (PR Style)",
247
+ "2. Review uncommitted changes",
248
+ "3. Review a specific commit",
249
+ ]
250
+ : [
251
+ "1. Review against a base branch (PR Style)",
252
+ "2. Review uncommitted changes",
253
+ "3. Review a specific commit",
254
+ "4. Custom review instructions",
255
+ ];
256
+
257
+ const mode = await ctx.ui.select("Review Mode", menuItems);
258
+
259
+ if (!mode) return undefined;
260
+
261
+ const modeNum = parseInt(mode[0], 10);
262
+
263
+ switch (modeNum) {
264
+ case 1: {
265
+ // PR-style review against base branch
266
+ const branches = await getGitBranches(this.api);
267
+ if (branches.length === 0) {
268
+ ctx.ui.notify("No git branches found", "error");
269
+ return undefined;
270
+ }
271
+
272
+ const baseBranch = await ctx.ui.select("Select base branch to compare against", branches);
273
+ if (!baseBranch) return undefined;
274
+
275
+ const currentBranch = await getCurrentBranch(this.api);
276
+ let diffText: string;
277
+ try {
278
+ diffText = await git.diff(this.api.cwd, { base: `${baseBranch}...${currentBranch}` });
279
+ } catch (err) {
280
+ ctx.ui.notify(`Failed to get diff: ${err instanceof Error ? err.message : String(err)}`, "error");
281
+ return undefined;
282
+ }
283
+
284
+ if (!diffText.trim()) {
285
+ ctx.ui.notify(`No changes between ${baseBranch} and ${currentBranch}`, "warning");
286
+ return undefined;
287
+ }
288
+
289
+ const stats = parseDiff(diffText);
290
+ if (stats.files.length === 0) {
291
+ ctx.ui.notify("No reviewable files (all changes filtered out)", "warning");
292
+ return undefined;
293
+ }
294
+
295
+ return buildReviewPrompt(
296
+ `Reviewing changes between \`${baseBranch}\` and \`${currentBranch}\` (PR-style)`,
297
+ stats,
298
+ diffText,
299
+ extraInstructions,
300
+ );
301
+ }
302
+
303
+ case 2: {
304
+ // Uncommitted changes - combine staged and unstaged
305
+ const status = await getGitStatus(this.api);
306
+ if (!status.trim()) {
307
+ ctx.ui.notify("No uncommitted changes found", "warning");
308
+ return undefined;
309
+ }
310
+
311
+ let unstagedDiff: string;
312
+ let stagedDiff: string;
313
+ try {
314
+ [unstagedDiff, stagedDiff] = await Promise.all([
315
+ git.diff(this.api.cwd),
316
+ git.diff(this.api.cwd, { cached: true }),
317
+ ]);
318
+ } catch (err) {
319
+ ctx.ui.notify(`Failed to get diff: ${err instanceof Error ? err.message : String(err)}`, "error");
320
+ return undefined;
321
+ }
322
+
323
+ const combinedDiff = [unstagedDiff, stagedDiff].filter(Boolean).join("\n");
324
+
325
+ if (!combinedDiff.trim()) {
326
+ ctx.ui.notify("No diff content found", "warning");
327
+ return undefined;
328
+ }
329
+
330
+ const stats = parseDiff(combinedDiff);
331
+ if (stats.files.length === 0) {
332
+ ctx.ui.notify("No reviewable files (all changes filtered out)", "warning");
333
+ return undefined;
334
+ }
335
+
336
+ return buildReviewPrompt(
337
+ "Reviewing uncommitted changes (staged + unstaged)",
338
+ stats,
339
+ combinedDiff,
340
+ extraInstructions,
341
+ );
342
+ }
343
+
344
+ case 3: {
345
+ // Specific commit
346
+ const commits = await getRecentCommits(this.api, 20);
347
+ if (commits.length === 0) {
348
+ ctx.ui.notify("No commits found", "error");
349
+ return undefined;
350
+ }
351
+
352
+ const selected = await ctx.ui.select("Select commit to review", commits);
353
+ if (!selected) return undefined;
354
+
355
+ // Extract commit hash from selection (format: "abc1234 message")
356
+ const hash = selected.split(" ")[0];
357
+
358
+ let diffText: string;
359
+ try {
360
+ diffText = await git.show(this.api.cwd, hash, { format: "" });
361
+ } catch (err) {
362
+ ctx.ui.notify(`Failed to get commit: ${err instanceof Error ? err.message : String(err)}`, "error");
363
+ return undefined;
364
+ }
365
+
366
+ if (!diffText.trim()) {
367
+ ctx.ui.notify("Commit has no diff content", "warning");
368
+ return undefined;
369
+ }
370
+
371
+ const stats = parseDiff(diffText);
372
+ if (stats.files.length === 0) {
373
+ ctx.ui.notify("No reviewable files in commit (all changes filtered out)", "warning");
374
+ return undefined;
375
+ }
376
+
377
+ return buildReviewPrompt(`Reviewing commit \`${hash}\``, stats, diffText, extraInstructions);
378
+ }
379
+
380
+ case 4: {
381
+ // Custom instructions - still uses the old approach since user provides context
382
+ const instructions = await ctx.ui.editor("Enter custom review instructions", "Review the following:\n\n");
383
+ if (!instructions?.trim()) return undefined;
384
+
385
+ // For custom, we still try to get current diff for context
386
+ let diffText: string | undefined;
387
+ try {
388
+ diffText = await git.diff(this.api.cwd, { base: "HEAD" });
389
+ } catch {
390
+ diffText = undefined;
391
+ }
392
+ const reviewDiff = diffText?.trim();
393
+
394
+ if (reviewDiff) {
395
+ const stats = parseDiff(reviewDiff);
396
+ // Even if all files filtered, include the custom instructions
397
+ return buildReviewPrompt(
398
+ `Custom review: ${instructions.split("\n")[0].slice(0, 60)}…`,
399
+ stats,
400
+ reviewDiff,
401
+ instructions,
402
+ );
403
+ }
404
+
405
+ // No diff available, just pass instructions
406
+ return `## Code Review Request
407
+
408
+ ### Mode
409
+ Custom review instructions
410
+
411
+ ### Instructions
412
+
413
+ ${instructions}
414
+
415
+ Use the Task tool with \`agent: "reviewer"\` to execute this review.`;
416
+ }
417
+
418
+ default:
419
+ return undefined;
420
+ }
421
+ }
422
+ }
423
+
424
+ async function getGitBranches(api: CustomCommandAPI): Promise<string[]> {
425
+ try {
426
+ return await git.branch.list(api.cwd, { all: true });
427
+ } catch {
428
+ return [];
429
+ }
430
+ }
431
+
432
+ async function getCurrentBranch(api: CustomCommandAPI): Promise<string> {
433
+ try {
434
+ return (await git.branch.current(api.cwd)) ?? "HEAD";
435
+ } catch {
436
+ return "HEAD";
437
+ }
438
+ }
439
+
440
+ async function getGitStatus(api: CustomCommandAPI): Promise<string> {
441
+ try {
442
+ return await git.status(api.cwd);
443
+ } catch {
444
+ return "";
445
+ }
446
+ }
447
+
448
+ async function getRecentCommits(api: CustomCommandAPI, count: number): Promise<string[]> {
449
+ try {
450
+ return await git.log.onelines(api.cwd, count);
451
+ } catch {
452
+ return [];
453
+ }
454
+ }
455
+
456
+ export default ReviewCommand;
@@ -0,0 +1,2 @@
1
+ export * from "./loader";
2
+ export type * from "./types";
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Custom command loader - loads TypeScript command modules using native Bun import.
3
+ *
4
+ * Dependencies (@sinclair/typebox and pi-coding-agent) are injected via the CustomCommandAPI
5
+ * to avoid import resolution issues with custom commands loaded from user directories.
6
+ */
7
+ import * as fs from "node:fs";
8
+ import * as path from "node:path";
9
+ import { getAgentDir, getProjectDir, isEnoent, logger } from "@f5xc-salesdemos/pi-utils";
10
+ import * as typebox from "@sinclair/typebox";
11
+ import { getConfigDirs } from "../../config";
12
+ import { execCommand } from "../../exec/exec";
13
+ import { GreenCommand } from "./bundled/ci-green";
14
+ import { ReviewCommand } from "./bundled/review";
15
+ import type {
16
+ CustomCommand,
17
+ CustomCommandAPI,
18
+ CustomCommandFactory,
19
+ CustomCommandSource,
20
+ CustomCommandsLoadResult,
21
+ LoadedCustomCommand,
22
+ } from "./types";
23
+
24
+ /**
25
+ * Load a single command module using native Bun import.
26
+ */
27
+ async function loadCommandModule(
28
+ commandPath: string,
29
+ _cwd: string,
30
+ sharedApi: CustomCommandAPI,
31
+ ): Promise<{ commands: CustomCommand[] | null; error: string | null }> {
32
+ try {
33
+ const module = await import(commandPath);
34
+ const factory = (module.default ?? module) as CustomCommandFactory;
35
+
36
+ if (typeof factory !== "function") {
37
+ return { commands: null, error: "Command must export a default function" };
38
+ }
39
+
40
+ const result = await factory(sharedApi);
41
+ const commands = Array.isArray(result) ? result : [result];
42
+
43
+ // Validate commands
44
+ for (const cmd of commands) {
45
+ if (!cmd.name || typeof cmd.name !== "string") {
46
+ return { commands: null, error: "Command must have a name" };
47
+ }
48
+ if (!cmd.description || typeof cmd.description !== "string") {
49
+ return { commands: null, error: `Command "${cmd.name}" must have a description` };
50
+ }
51
+ if (typeof cmd.execute !== "function") {
52
+ return { commands: null, error: `Command "${cmd.name}" must have an execute function` };
53
+ }
54
+ }
55
+
56
+ return { commands, error: null };
57
+ } catch (err) {
58
+ const message = err instanceof Error ? err.message : String(err);
59
+ return { commands: null, error: `Failed to load command: ${message}` };
60
+ }
61
+ }
62
+
63
+ export interface DiscoverCustomCommandsOptions {
64
+ /** Current working directory. Default: getProjectDir() */
65
+ cwd?: string;
66
+ /** Agent config directory. Default: from getAgentDir() */
67
+ agentDir?: string;
68
+ }
69
+
70
+ export interface DiscoverCustomCommandsResult {
71
+ /** Paths to command modules */
72
+ paths: Array<{ path: string; source: CustomCommandSource }>;
73
+ }
74
+
75
+ /**
76
+ * Discover custom command modules (TypeScript slash commands).
77
+ * Markdown slash commands are handled by core/slash-commands.ts.
78
+ */
79
+ export async function discoverCustomCommands(
80
+ options: DiscoverCustomCommandsOptions = {},
81
+ ): Promise<DiscoverCustomCommandsResult> {
82
+ const cwd = options.cwd ?? getProjectDir();
83
+ const agentDir = options.agentDir ?? getAgentDir();
84
+ const paths: Array<{ path: string; source: CustomCommandSource }> = [];
85
+ const seen = new Set<string>();
86
+
87
+ const addPath = (commandPath: string, source: CustomCommandSource): void => {
88
+ const resolved = path.resolve(commandPath);
89
+ if (seen.has(resolved)) return;
90
+ seen.add(resolved);
91
+ paths.push({ path: resolved, source });
92
+ };
93
+
94
+ const commandDirs: Array<{ path: string; source: CustomCommandSource }> = [];
95
+ if (agentDir) {
96
+ const userCommandsDir = path.join(agentDir, "commands");
97
+ if (fs.existsSync(userCommandsDir)) {
98
+ commandDirs.push({ path: userCommandsDir, source: "user" });
99
+ }
100
+ }
101
+
102
+ for (const entry of getConfigDirs("commands", { cwd, existingOnly: true })) {
103
+ const source = entry.level === "user" ? "user" : "project";
104
+ if (!commandDirs.some(d => d.path === entry.path)) {
105
+ commandDirs.push({ path: entry.path, source });
106
+ }
107
+ }
108
+
109
+ const indexCandidates = ["index.ts", "index.js", "index.mjs", "index.cjs"];
110
+ for (const { path: commandsDir, source } of commandDirs) {
111
+ let entries: fs.Dirent[];
112
+ try {
113
+ entries = await fs.promises.readdir(commandsDir, { withFileTypes: true });
114
+ } catch (error) {
115
+ if (!isEnoent(error)) {
116
+ logger.warn("Failed to read custom commands directory", { path: commandsDir, error: String(error) });
117
+ }
118
+ continue;
119
+ }
120
+ for (const entry of entries) {
121
+ if (!entry.isDirectory() || entry.name.startsWith(".")) continue;
122
+ const commandDir = path.join(commandsDir, entry.name);
123
+
124
+ for (const filename of indexCandidates) {
125
+ const candidate = path.join(commandDir, filename);
126
+ if (fs.existsSync(candidate)) {
127
+ addPath(candidate, source);
128
+ break;
129
+ }
130
+ }
131
+ }
132
+ }
133
+
134
+ return { paths };
135
+ }
136
+
137
+ export interface LoadCustomCommandsOptions {
138
+ /** Current working directory. Default: getProjectDir() */
139
+ cwd?: string;
140
+ /** Agent config directory. Default: from getAgentDir() */
141
+ agentDir?: string;
142
+ }
143
+
144
+ /**
145
+ * Load bundled commands (shipped with pi-coding-agent).
146
+ */
147
+ function loadBundledCommands(sharedApi: CustomCommandAPI): LoadedCustomCommand[] {
148
+ const bundled: LoadedCustomCommand[] = [];
149
+
150
+ // Add bundled commands here
151
+ bundled.push({
152
+ path: "bundled:green",
153
+ resolvedPath: "bundled:green",
154
+ command: new GreenCommand(sharedApi),
155
+ source: "bundled",
156
+ });
157
+ bundled.push({
158
+ path: "bundled:review",
159
+ resolvedPath: "bundled:review",
160
+ command: new ReviewCommand(sharedApi),
161
+ source: "bundled",
162
+ });
163
+
164
+ return bundled;
165
+ }
166
+
167
+ /**
168
+ * Discover and load custom commands from standard locations.
169
+ */
170
+ export async function loadCustomCommands(options: LoadCustomCommandsOptions = {}): Promise<CustomCommandsLoadResult> {
171
+ const cwd = options.cwd ?? getProjectDir();
172
+ const agentDir = options.agentDir ?? getAgentDir();
173
+
174
+ const { paths } = await discoverCustomCommands({ cwd, agentDir });
175
+
176
+ const commands: LoadedCustomCommand[] = [];
177
+ const errors: Array<{ path: string; error: string }> = [];
178
+ const seenNames = new Set<string>();
179
+
180
+ // Shared API object - all commands get the same instance
181
+ const sharedApi: CustomCommandAPI = {
182
+ cwd,
183
+ exec: (command: string, args: string[], execOptions) =>
184
+ execCommand(command, args, execOptions?.cwd ?? cwd, execOptions),
185
+ typebox,
186
+ pi: await import("@f5xc-salesdemos/xcsh"),
187
+ };
188
+
189
+ // 1. Load bundled commands first (lowest priority - can be overridden)
190
+ for (const loaded of loadBundledCommands(sharedApi)) {
191
+ seenNames.add(loaded.command.name);
192
+ commands.push(loaded);
193
+ }
194
+
195
+ // 2. Load user/project commands (can override bundled)
196
+ for (const { path: commandPath, source } of paths) {
197
+ const { commands: loadedCommands, error } = await loadCommandModule(commandPath, cwd, sharedApi);
198
+
199
+ if (error) {
200
+ errors.push({ path: commandPath, error });
201
+ continue;
202
+ }
203
+
204
+ if (loadedCommands) {
205
+ for (const command of loadedCommands) {
206
+ // Allow overriding bundled commands, but not user/project conflicts
207
+ const existingIdx = commands.findIndex(c => c.command.name === command.name);
208
+ if (existingIdx !== -1) {
209
+ const existing = commands[existingIdx];
210
+ if (existing.source === "bundled") {
211
+ // Override bundled command
212
+ commands.splice(existingIdx, 1);
213
+ seenNames.delete(command.name);
214
+ } else {
215
+ // Conflict between user/project commands
216
+ errors.push({
217
+ path: commandPath,
218
+ error: `Command name "${command.name}" conflicts with existing command`,
219
+ });
220
+ continue;
221
+ }
222
+ }
223
+
224
+ seenNames.add(command.name);
225
+ commands.push({
226
+ path: commandPath,
227
+ resolvedPath: path.resolve(commandPath),
228
+ command,
229
+ source,
230
+ });
231
+ }
232
+ }
233
+ }
234
+
235
+ return { commands, errors };
236
+ }