@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,134 @@
1
+ import type { Locator } from "./selector";
2
+
3
+ export interface AxNode {
4
+ role: string;
5
+ name?: string;
6
+ children?: AxNode[];
7
+ [k: string]: unknown;
8
+ }
9
+
10
+ export class NotFoundError extends Error {
11
+ constructor(message: string) {
12
+ super(message);
13
+ this.name = "NotFoundError";
14
+ }
15
+ }
16
+
17
+ export class AmbiguousError extends Error {
18
+ constructor(message: string) {
19
+ super(message);
20
+ this.name = "AmbiguousError";
21
+ }
22
+ }
23
+
24
+ function norm(s: string): string {
25
+ return s.trim().replace(/\s+/g, " ");
26
+ }
27
+
28
+ function collect(node: AxNode, results: AxNode[]): void {
29
+ results.push(node);
30
+ for (const child of node.children ?? []) {
31
+ collect(child, results);
32
+ }
33
+ }
34
+
35
+ export function matchNode(tree: AxNode, loc: Locator): AxNode {
36
+ if (loc.kind === "css") {
37
+ throw new Error("css locators cannot be resolved against an AX tree — resolve live via CDP");
38
+ }
39
+
40
+ const all: AxNode[] = [];
41
+ collect(tree, all);
42
+
43
+ let matches: AxNode[];
44
+
45
+ if (loc.kind === "roleName") {
46
+ const wantRole = loc.role;
47
+ const wantName = norm(loc.name);
48
+ matches = all.filter(n => {
49
+ if (n.role !== wantRole) return false;
50
+ const nodeName = norm(n.name ?? "");
51
+ // roleName from role:text('X') pattern — text match (includes)
52
+ // roleName from role[name='X'] pattern — exact match
53
+ // We always use exact match for roleName kind (the parser normalises both patterns to roleName)
54
+ return nodeName === wantName;
55
+ });
56
+ } else if (loc.kind === "role") {
57
+ matches = all.filter(n => n.role === loc.role);
58
+ } else {
59
+ // kind === "text"
60
+ const want = norm(loc.text);
61
+ matches = all.filter(n => {
62
+ const nodeName = norm(n.name ?? "");
63
+ return nodeName === want || nodeName.includes(want);
64
+ });
65
+ }
66
+
67
+ if (matches.length === 0) {
68
+ // Collect candidates for helpful error message
69
+ let hint = "";
70
+ if (loc.kind === "roleName" || loc.kind === "role") {
71
+ const sameRole = all.filter(n => n.role === loc.role && n.name).map(n => JSON.stringify(n.name));
72
+ if (sameRole.length > 0) {
73
+ hint = ` (same-role candidates: ${sameRole.slice(0, 5).join(", ")})`;
74
+ }
75
+ } else if (loc.kind === "text") {
76
+ // For text kind, list nearby text candidates (non-empty normalized names)
77
+ const textCandidates: string[] = [];
78
+ const seen = new Set<string>();
79
+ for (const node of all) {
80
+ if (node.name) {
81
+ const normalized = norm(node.name);
82
+ if (normalized.length > 0 && !seen.has(normalized)) {
83
+ seen.add(normalized);
84
+ textCandidates.push(JSON.stringify(normalized));
85
+ if (textCandidates.length >= 5) break;
86
+ }
87
+ }
88
+ }
89
+ if (textCandidates.length > 0) {
90
+ hint = ` (nearby text candidates: ${textCandidates.join(", ")})`;
91
+ }
92
+ }
93
+ throw new NotFoundError(`No AX node found for ${JSON.stringify(loc)}${hint}`);
94
+ }
95
+
96
+ // For text locators, return the first match (presence semantics).
97
+ // For roleName and role, enforce strict 1:1 matching.
98
+ if (loc.kind === "text") {
99
+ return matches[0]!;
100
+ }
101
+
102
+ if (matches.length > 1) {
103
+ const names = matches.map(n => JSON.stringify(n.name ?? n.role));
104
+ throw new AmbiguousError(
105
+ `${matches.length} AX nodes match ${JSON.stringify(loc)}: ${names.slice(0, 5).join(", ")}`,
106
+ );
107
+ }
108
+
109
+ return matches[0]!;
110
+ }
111
+
112
+ export function matchNodes(tree: AxNode, loc: Locator): AxNode[] {
113
+ if (loc.kind === "css") {
114
+ throw new Error("css locators cannot be resolved against an AX tree — resolve live via CDP");
115
+ }
116
+
117
+ const all: AxNode[] = [];
118
+ collect(tree, all);
119
+
120
+ if (loc.kind === "roleName") {
121
+ const wantRole = loc.role;
122
+ const wantName = norm(loc.name);
123
+ return all.filter(n => n.role === wantRole && norm(n.name ?? "") === wantName);
124
+ } else if (loc.kind === "role") {
125
+ return all.filter(n => n.role === loc.role);
126
+ } else {
127
+ // kind === "text"
128
+ const want = norm(loc.text);
129
+ return all.filter(n => {
130
+ const nodeName = norm(n.name ?? "");
131
+ return nodeName === want || nodeName.includes(want);
132
+ });
133
+ }
134
+ }
@@ -0,0 +1,45 @@
1
+ import type { Browser, CDPSession, Page } from "puppeteer";
2
+ import type { AcquireMode } from "./acquire";
3
+
4
+ type Settings = { get(key: string): unknown };
5
+
6
+ export class BrowserSession {
7
+ #browser: Browser | null = null;
8
+ #page: Page | null = null;
9
+ #cdp: CDPSession | null = null;
10
+ #mode: AcquireMode | null = null;
11
+ constructor(private readonly settings: Settings) {}
12
+
13
+ get mode(): AcquireMode | null {
14
+ return this.#mode;
15
+ }
16
+
17
+ async ensurePage(): Promise<Page> {
18
+ if (this.#page && !this.#page.isClosed()) return this.#page;
19
+ const { acquirePage } = await import("./acquire");
20
+ const { browser, page, mode } = await acquirePage({ settings: this.settings });
21
+ this.#browser = browser;
22
+ this.#page = page;
23
+ this.#mode = mode;
24
+ this.#cdp = null;
25
+ return this.#page;
26
+ }
27
+
28
+ async cdp(): Promise<CDPSession> {
29
+ const page = await this.ensurePage();
30
+ if (!this.#cdp) this.#cdp = await page.createCDPSession();
31
+ return this.#cdp;
32
+ }
33
+
34
+ async close(): Promise<void> {
35
+ if (this.#browser) {
36
+ // Never terminate the user's Chrome (attached or launched against their profile);
37
+ // just detach. Puppeteer's disconnect leaves the browser running.
38
+ await this.#browser.disconnect().catch(() => {});
39
+ }
40
+ this.#browser = null;
41
+ this.#page = null;
42
+ this.#cdp = null;
43
+ this.#mode = null;
44
+ }
45
+ }
@@ -0,0 +1,51 @@
1
+ import type { Page } from "puppeteer";
2
+ import * as actions from "./actions";
3
+ import type { PageActions } from "./page-actions";
4
+
5
+ /** CDP-backed `PageActions`: wraps a Puppeteer `Page` and delegates to `actions.ts`. */
6
+ export class CdpPageActions implements PageActions {
7
+ #page: Page;
8
+ constructor(page: Page) {
9
+ this.#page = page;
10
+ }
11
+
12
+ async goto(url: string, opts?: { waitUntil?: string; timeout?: number }): Promise<void> {
13
+ type GotoOptions = NonNullable<Parameters<Page["goto"]>[1]>;
14
+ await this.#page.goto(url, {
15
+ waitUntil: (opts?.waitUntil as GotoOptions["waitUntil"]) ?? "networkidle2",
16
+ timeout: opts?.timeout,
17
+ });
18
+ }
19
+
20
+ async click(selector: string, context?: string): Promise<void> {
21
+ await actions.click(this.#page, selector, context);
22
+ }
23
+
24
+ async fill(selector: string, value: string, context?: string): Promise<void> {
25
+ await actions.fill(this.#page, selector, value, context);
26
+ }
27
+
28
+ async selectOption(selector: string, value: string, context?: string): Promise<void> {
29
+ await actions.selectOption(this.#page, selector, value, context);
30
+ }
31
+
32
+ async scrollIntoView(selector: string, context?: string): Promise<void> {
33
+ await actions.scrollIntoView(this.#page, selector, context);
34
+ }
35
+
36
+ async pressKey(key: string): Promise<void> {
37
+ await actions.pressKey(this.#page, key);
38
+ }
39
+
40
+ async assertText(selector: string, expected: string, context?: string): Promise<void> {
41
+ await actions.assertText(this.#page, selector, expected, context);
42
+ }
43
+
44
+ async waitFor(selector: string, context?: string, timeoutMs?: number): Promise<void> {
45
+ await actions.waitFor(this.#page, selector, context, timeoutMs);
46
+ }
47
+
48
+ async screenshot(file: string): Promise<void> {
49
+ await actions.screenshot(this.#page, file);
50
+ }
51
+ }
@@ -0,0 +1,66 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+
5
+ export interface LocateChromeOpts {
6
+ settings?: { get(key: string): unknown };
7
+ platform?: NodeJS.Platform;
8
+ env?: NodeJS.ProcessEnv;
9
+ exists?: (p: string) => boolean;
10
+ which?: (cmd: string) => string | null;
11
+ }
12
+
13
+ export interface LocatedChrome {
14
+ path: string;
15
+ source: "setting" | "macos" | "path" | "nixos" | "windows";
16
+ }
17
+
18
+ function defaultWhich(cmd: string): string | null {
19
+ try {
20
+ const out = execFileSync("sh", ["-c", `command -v ${cmd}`], { encoding: "utf-8" }).trim();
21
+ return out || null;
22
+ } catch {
23
+ return null;
24
+ }
25
+ }
26
+
27
+ export function locateChrome(opts: LocateChromeOpts = {}): LocatedChrome | null {
28
+ const platform = opts.platform ?? process.platform;
29
+ const env = opts.env ?? process.env;
30
+ const exists = opts.exists ?? ((p: string) => fs.existsSync(p));
31
+ const which = opts.which ?? defaultWhich;
32
+
33
+ const override = opts.settings?.get("browser.chromePath");
34
+ if (typeof override === "string" && override.trim() && exists(override.trim())) {
35
+ return { path: override.trim(), source: "setting" };
36
+ }
37
+
38
+ if (platform === "darwin") {
39
+ const macCandidates = [
40
+ "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
41
+ "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary",
42
+ "/Applications/Chromium.app/Contents/MacOS/Chromium",
43
+ ];
44
+ for (const c of macCandidates) if (exists(c)) return { path: c, source: "macos" };
45
+ return null;
46
+ }
47
+
48
+ if (platform === "win32") {
49
+ const roots = [env.PROGRAMFILES, env["PROGRAMFILES(X86)"], env.LOCALAPPDATA].filter(Boolean) as string[];
50
+ for (const root of roots) {
51
+ const c = path.join(root, "Google", "Chrome", "Application", "chrome.exe");
52
+ if (exists(c)) return { path: c, source: "windows" };
53
+ }
54
+ return null;
55
+ }
56
+
57
+ // linux / other unix
58
+ for (const cmd of ["google-chrome", "google-chrome-stable", "chromium", "chromium-browser"]) {
59
+ const found = which(cmd);
60
+ if (found) return { path: found, source: "path" };
61
+ }
62
+ for (const c of [path.join(env.HOME ?? "", ".nix-profile/bin/chromium"), "/run/current-system/sw/bin/chromium"]) {
63
+ if (c && exists(c)) return { path: c, source: "nixos" };
64
+ }
65
+ return null;
66
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * DOM context scoping for XC component classes.
3
+ * Pure module — no Puppeteer imports. Works under linkedom in tests and
4
+ * the live document in page.evaluate in the resolver (Task 5).
5
+ *
6
+ * We define minimal structural interfaces instead of relying on the DOM lib
7
+ * (the project tsconfig does not include DOM types globally).
8
+ */
9
+
10
+ /** Minimal structural interface matching both linkedom and browser Element. */
11
+ export interface DomElement {
12
+ tagName: string;
13
+ textContent: string | null;
14
+ className: string | { toString(): string };
15
+ parentElement: DomElement | null;
16
+ querySelector(sel: string): DomElement | null;
17
+ querySelectorAll(sel: string): ArrayLike<DomElement>;
18
+ }
19
+
20
+ /** Minimal structural interface matching both linkedom and browser Document. */
21
+ export interface DomDocument {
22
+ body: DomElement | null;
23
+ documentElement: DomElement;
24
+ querySelectorAll(sel: string): ArrayLike<DomElement>;
25
+ }
26
+
27
+ /** Strip a leading asterisk, trim, and collapse internal whitespace. */
28
+ export function normLabel(s: string): string {
29
+ return s.trim().replace(/^\*/, "").trim().replace(/\s+/g, " ");
30
+ }
31
+
32
+ /** Suffixes we strip before matching a label phrase. */
33
+ export const STRIP_SUFFIX = / (?:section|table|table row|selector)$/i;
34
+
35
+ /** CSS selectors that identify XC field/section labels. */
36
+ export const LABEL_SELECTORS = [
37
+ "label.ves-label_level_3_label",
38
+ "label[class*='ves-label_level_3_label']",
39
+ ".datatable-header-cell-label",
40
+ ".tile-header__name",
41
+ "label.form-control-label",
42
+ ];
43
+
44
+ /** CSS that identifies "interactive" controls — presence means the ancestor is the section container. */
45
+ export const CONTROL_SELECTOR = "button, [role='listbox'], .listbox, input";
46
+
47
+ /**
48
+ * Find the nearest ancestor element that:
49
+ * 1. Is an ancestor of the matched label element, AND
50
+ * 2. Contains at least one interactive control (button / listbox / input).
51
+ *
52
+ * Walk up from the label, stopping at `document.body` (or `documentElement`).
53
+ */
54
+ export function findControlBearingAncestor(label: DomElement, doc: DomDocument): DomElement | null {
55
+ const body = doc.body ?? doc.documentElement;
56
+ let current: DomElement | null = label.parentElement;
57
+ while (current && current !== body) {
58
+ if (current.querySelector(CONTROL_SELECTOR)) {
59
+ return current;
60
+ }
61
+ current = current.parentElement;
62
+ }
63
+ return null;
64
+ }
65
+
66
+ /**
67
+ * Given a phrase like "Domains table" or "Origin Pools section",
68
+ * strip the trailing qualifier, find the matching label element in the DOM,
69
+ * then return the nearest ancestor that contains an interactive control.
70
+ *
71
+ * Returns `null` if no label or no control-bearing ancestor is found.
72
+ */
73
+ export function findSectionContainer(doc: DomDocument, phrase: string): DomElement | null {
74
+ const bare = phrase.replace(STRIP_SUFFIX, "").trim();
75
+ const want = normLabel(bare);
76
+
77
+ // Try each label selector in priority order
78
+ for (const sel of LABEL_SELECTORS) {
79
+ const candidates = Array.from(doc.querySelectorAll(sel));
80
+ for (const el of candidates) {
81
+ if (normLabel(el.textContent ?? "") === want) {
82
+ const container = findControlBearingAncestor(el, doc);
83
+ if (container) return container;
84
+ }
85
+ }
86
+ }
87
+
88
+ return null;
89
+ }
@@ -0,0 +1,100 @@
1
+ /**
2
+ * ngx-datatable column-aware cell resolver for XC CDP accessibility.
3
+ * Pure module — no Puppeteer imports. Works under linkedom in tests and
4
+ * in page.evaluateHandle in the resolver (injected as IIFE via .toString()).
5
+ *
6
+ * Structural interfaces match both linkedom and browser DOM without
7
+ * requiring a global DOM lib.
8
+ */
9
+
10
+ /** Minimal structural interface matching both linkedom and browser Element. */
11
+ interface DtElement {
12
+ textContent: string | null;
13
+ querySelectorAll(sel: string): ArrayLike<DtElement>;
14
+ querySelector(sel: string): DtElement | null;
15
+ }
16
+
17
+ /** Minimal structural interface matching both linkedom and browser Document. */
18
+ interface DtDocument {
19
+ querySelectorAll(sel: string): ArrayLike<DtElement>;
20
+ }
21
+
22
+ /**
23
+ * Strip a leading asterisk, trim, and collapse internal whitespace.
24
+ * Self-contained copy so the injection IIFE is standalone (no imports).
25
+ */
26
+ export function normLabel(s: string): string {
27
+ return s.trim().replace(/^\*/, "").trim().replace(/\s+/g, " ");
28
+ }
29
+
30
+ /**
31
+ * Find the input (or textarea / [role=textbox]) in a specific ngx-datatable
32
+ * column cell.
33
+ *
34
+ * Algorithm:
35
+ * 1. Scan every `.datatable-header-cell-label` for one whose normLabel
36
+ * matches the given columnName.
37
+ * 2. Walk up to the enclosing ngx-datatable (the element that owns the
38
+ * header cells array).
39
+ * 3. Determine the column index = position of the matched header cell among
40
+ * all `.datatable-header-cell` elements inside that datatable.
41
+ * 4. Pick the body row: `which === "last"` → last `.datatable-body-row`,
42
+ * else first.
43
+ * 5. Return the first `input`, `textarea`, or `[role=textbox]` inside the
44
+ * `.datatable-body-cell` at the resolved column index.
45
+ *
46
+ * Uses only standard DOM querySelectorAll / textContent APIs so it works
47
+ * under linkedom AND in the live browser page.
48
+ */
49
+ export function findDatatableColumnInput(
50
+ doc: DtDocument,
51
+ columnName: string,
52
+ which: "first" | "last",
53
+ ): DtElement | null {
54
+ const wantName = normLabel(columnName);
55
+
56
+ // Step 1 — find the header label element that matches columnName
57
+ const allLabels = Array.from(doc.querySelectorAll(".datatable-header-cell-label"));
58
+ const matchedLabel = allLabels.find(lbl => normLabel(lbl.textContent ?? "") === wantName);
59
+ if (!matchedLabel) return null;
60
+
61
+ // Step 2 — collect ALL header cells from the entire document and determine
62
+ // which datatable owns the matched label. We do this by finding the header
63
+ // cell that CONTAINS the matched label, then looking at the ordered list of
64
+ // all header cells to derive the index.
65
+ const allHeaderCells = Array.from(doc.querySelectorAll(".datatable-header-cell"));
66
+ const matchedHeaderCell = allHeaderCells.find(cell => {
67
+ const labels = Array.from(cell.querySelectorAll(".datatable-header-cell-label"));
68
+ return labels.some(lbl => normLabel(lbl.textContent ?? "") === wantName);
69
+ });
70
+ if (!matchedHeaderCell) return null;
71
+
72
+ // Step 3 — column index = position of matched header cell within ALL header
73
+ // cells that share the same datatable ancestor. Because ngx-datatable puts
74
+ // all its header cells under a single <datatable-header>, the relative order
75
+ // in document order == the column index.
76
+ //
77
+ // To scope to the correct datatable, we collect only the header cells that
78
+ // appear before the FIRST body row of a different datatable. In the common
79
+ // single-datatable case, the simple index into allHeaderCells works directly.
80
+ const colIndex = allHeaderCells.indexOf(matchedHeaderCell);
81
+ if (colIndex === -1) return null;
82
+
83
+ // Step 4 — pick the body row
84
+ const allBodyRows = Array.from(doc.querySelectorAll(".datatable-body-row"));
85
+ if (allBodyRows.length === 0) return null;
86
+ const row = which === "last" ? allBodyRows[allBodyRows.length - 1]! : allBodyRows[0]!;
87
+
88
+ // Step 5 — get the body cell at the same column index
89
+ const bodyCells = Array.from(row.querySelectorAll(".datatable-body-cell"));
90
+ const targetCell = bodyCells[colIndex];
91
+ if (!targetCell) return null;
92
+
93
+ // Return the first interactive text input inside the cell
94
+ return (
95
+ targetCell.querySelector("input") ??
96
+ targetCell.querySelector("textarea") ??
97
+ targetCell.querySelector("[role=textbox]") ??
98
+ null
99
+ );
100
+ }
@@ -0,0 +1,182 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import * as fs from "node:fs";
3
+ import * as os from "node:os";
4
+ import * as path from "node:path";
5
+ import type { Socket, UnixSocketListener } from "bun";
6
+
7
+ export interface ToolResult {
8
+ content: unknown;
9
+ is_error: boolean;
10
+ }
11
+
12
+ /**
13
+ * Id-correlated pending-request registry. Pure (no socket I/O) so it can be
14
+ * unit-tested directly. Each {@link create} returns a fresh id and a promise
15
+ * that is settled by a later {@link resolve} (matching id) or {@link rejectAll}.
16
+ */
17
+ export class PendingRequests {
18
+ #m = new Map<
19
+ string,
20
+ {
21
+ resolve: (r: ToolResult) => void;
22
+ reject: (e: Error) => void;
23
+ timer: ReturnType<typeof setTimeout>;
24
+ }
25
+ >();
26
+
27
+ create(timeoutMs: number): { id: string; promise: Promise<ToolResult> } {
28
+ const id = randomUUID();
29
+ let resolve!: (r: ToolResult) => void;
30
+ let reject!: (e: Error) => void;
31
+ const promise = new Promise<ToolResult>((res, rej) => {
32
+ resolve = res;
33
+ reject = rej;
34
+ });
35
+ const timer = setTimeout(() => {
36
+ if (this.#m.delete(id)) reject(new Error(`bridge request ${id} timed out`));
37
+ }, timeoutMs);
38
+ this.#m.set(id, { resolve, reject, timer });
39
+ return { id, promise };
40
+ }
41
+
42
+ resolve(id: string, result: ToolResult): boolean {
43
+ const e = this.#m.get(id);
44
+ if (!e) return false;
45
+ clearTimeout(e.timer);
46
+ this.#m.delete(id);
47
+ e.resolve(result);
48
+ return true;
49
+ }
50
+
51
+ rejectAll(err: Error): void {
52
+ for (const e of this.#m.values()) {
53
+ clearTimeout(e.timer);
54
+ e.reject(err);
55
+ }
56
+ this.#m.clear();
57
+ }
58
+ }
59
+
60
+ const DEFAULT_TIMEOUT_MS = 30_000;
61
+
62
+ type BridgeData = { buf: string };
63
+
64
+ /**
65
+ * Unix-socket server bridging xcsh to the Chrome extension's native-messaging
66
+ * host. Speaks newline-delimited JSON: requests `{type:"tool_request",...}`,
67
+ * replies `{type:"tool_result",...}`, plus `{type:"ping"|"pong"}`. Tracks a
68
+ * single connected client and correlates replies via {@link PendingRequests}.
69
+ */
70
+ export class BridgeServer {
71
+ #pending = new PendingRequests();
72
+ #listener: UnixSocketListener<BridgeData> | null = null;
73
+ #client: Socket<BridgeData> | null = null;
74
+ #onConnected: Array<() => void> = [];
75
+ #onDisconnected: Array<() => void> = [];
76
+
77
+ get connected(): boolean {
78
+ return this.#client !== null;
79
+ }
80
+
81
+ onConnected(cb: () => void): void {
82
+ this.#onConnected.push(cb);
83
+ }
84
+
85
+ onDisconnected(cb: () => void): void {
86
+ this.#onDisconnected.push(cb);
87
+ }
88
+
89
+ /** Bind the server to a Unix socket path. Called by {@link startBridgeServer}. */
90
+ listen(socketPath: string): void {
91
+ this.#listener = Bun.listen<BridgeData>({
92
+ unix: socketPath,
93
+ socket: {
94
+ open: socket => {
95
+ socket.data = { buf: "" };
96
+ this.#client = socket;
97
+ for (const cb of this.#onConnected) cb();
98
+ },
99
+ data: (socket, chunk) => {
100
+ this.#onData(socket, chunk);
101
+ },
102
+ close: socket => {
103
+ this.#onClose(socket);
104
+ },
105
+ error: socket => {
106
+ this.#onClose(socket);
107
+ },
108
+ },
109
+ });
110
+ }
111
+
112
+ #onData(socket: Socket<BridgeData>, chunk: Buffer): void {
113
+ socket.data.buf += chunk.toString("utf8");
114
+ let idx = socket.data.buf.indexOf("\n");
115
+ while (idx !== -1) {
116
+ const line = socket.data.buf.slice(0, idx);
117
+ socket.data.buf = socket.data.buf.slice(idx + 1);
118
+ if (line.length > 0) this.#handleLine(socket, line);
119
+ idx = socket.data.buf.indexOf("\n");
120
+ }
121
+ }
122
+
123
+ #handleLine(socket: Socket<BridgeData>, line: string): void {
124
+ let msg: { type?: string; id?: string; content?: unknown; is_error?: boolean };
125
+ try {
126
+ msg = JSON.parse(line);
127
+ } catch {
128
+ return;
129
+ }
130
+ if (msg.type === "tool_result" && typeof msg.id === "string") {
131
+ this.#pending.resolve(msg.id, {
132
+ content: msg.content,
133
+ is_error: msg.is_error === true,
134
+ });
135
+ } else if (msg.type === "ping") {
136
+ this.#write(socket, { type: "pong" });
137
+ }
138
+ }
139
+
140
+ #onClose(socket: Socket<BridgeData>): void {
141
+ if (this.#client !== socket) return;
142
+ this.#client = null;
143
+ this.#pending.rejectAll(new Error("bridge client disconnected"));
144
+ for (const cb of this.#onDisconnected) cb();
145
+ }
146
+
147
+ #write(socket: Socket<BridgeData>, msg: unknown): void {
148
+ socket.write(`${JSON.stringify(msg)}\n`);
149
+ }
150
+
151
+ /** Send a `tool_request` to the connected client and await its `tool_result`. */
152
+ request(tool: string, params: unknown, timeoutMs: number = DEFAULT_TIMEOUT_MS): Promise<ToolResult> {
153
+ const client = this.#client;
154
+ if (!client) return Promise.reject(new Error("bridge: no client connected"));
155
+ const { id, promise } = this.#pending.create(timeoutMs);
156
+ this.#write(client, { type: "tool_request", id, tool, params });
157
+ return promise;
158
+ }
159
+
160
+ async close(): Promise<void> {
161
+ this.#pending.rejectAll(new Error("bridge server closed"));
162
+ this.#client?.end();
163
+ this.#client = null;
164
+ this.#listener?.stop(true);
165
+ this.#listener = null;
166
+ }
167
+ }
168
+
169
+ /**
170
+ * Resolve the default socket path (`~/.xcsh/chrome-bridge.sock`), ensure the
171
+ * directory exists, remove any stale socket, start the {@link BridgeServer},
172
+ * and tighten the socket permissions to owner-only (0600).
173
+ */
174
+ export async function startBridgeServer(socketPath?: string): Promise<BridgeServer> {
175
+ const resolved = socketPath ?? path.join(os.homedir(), ".xcsh", "chrome-bridge.sock");
176
+ fs.mkdirSync(path.dirname(resolved), { recursive: true });
177
+ fs.rmSync(resolved, { force: true });
178
+ const server = new BridgeServer();
179
+ server.listen(resolved);
180
+ fs.chmodSync(resolved, 0o600);
181
+ return server;
182
+ }