@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,114 @@
1
+ import type { AgentToolResult } from "@f5xc-salesdemos/pi-agent-core";
2
+ import type { ExtensionAPI, ExtensionContext } from "../extensibility/extensions";
3
+ import type { TruncationResult } from "../session/streaming-output";
4
+
5
+ export type MetricDirection = "lower" | "higher";
6
+ export type ExperimentStatus = "keep" | "discard" | "crash" | "checks_failed";
7
+ export type ASIValue = string | number | boolean | null | ASIValue[] | { [key: string]: ASIValue };
8
+ export type ASIData = Record<string, ASIValue>;
9
+ export type NumericMetricMap = Record<string, number>;
10
+ export type MetricDef = { name: string; unit: string };
11
+
12
+ export interface AutoresearchContract {
13
+ benchmark: {
14
+ command: string | null;
15
+ primaryMetric: string | null;
16
+ metricUnit: string;
17
+ direction: MetricDirection | null;
18
+ secondaryMetrics: string[];
19
+ };
20
+ scopePaths: string[];
21
+ offLimits: string[];
22
+ constraints: string[];
23
+ }
24
+ export interface ExperimentResult {
25
+ runNumber: number | null;
26
+ commit: string;
27
+ metric: number;
28
+ metrics: NumericMetricMap;
29
+ status: ExperimentStatus;
30
+ description: string;
31
+ timestamp: number;
32
+ segment: number;
33
+ confidence: number | null;
34
+ asi?: ASIData;
35
+ }
36
+ export interface ExperimentState {
37
+ results: ExperimentResult[];
38
+ bestMetric: number | null;
39
+ bestDirection: MetricDirection;
40
+ metricName: string;
41
+ metricUnit: string;
42
+ secondaryMetrics: MetricDef[];
43
+ name: string | null;
44
+ currentSegment: number;
45
+ maxExperiments: number | null;
46
+ confidence: number | null;
47
+ benchmarkCommand: string | null;
48
+ scopePaths: string[];
49
+ offLimits: string[];
50
+ constraints: string[];
51
+ }
52
+ export interface RunExperimentProgressDetails {
53
+ phase: "running";
54
+ elapsed: string;
55
+ truncation?: TruncationResult;
56
+ fullOutputPath?: string;
57
+ runDirectory?: string;
58
+ }
59
+ interface RunDataBase {
60
+ checksPass: boolean | null;
61
+ checksTimedOut: boolean;
62
+ command: string;
63
+ parsedAsi: ASIData | null;
64
+ parsedMetrics: NumericMetricMap | null;
65
+ parsedPrimary: number | null;
66
+ passed: boolean;
67
+ preRunDirtyPaths: string[];
68
+ runDirectory: string;
69
+ runNumber: number;
70
+ }
71
+ export interface RunDetails extends RunDataBase {
72
+ benchmarkLogPath: string;
73
+ checksLogPath?: string;
74
+ exitCode: number | null;
75
+ durationSeconds: number;
76
+ crashed: boolean;
77
+ timedOut: boolean;
78
+ tailOutput: string;
79
+ checksOutput: string;
80
+ checksDuration: number;
81
+ metricName: string;
82
+ metricUnit: string;
83
+ truncation?: TruncationResult;
84
+ fullOutputPath?: string;
85
+ }
86
+ export type LogDetails = { experiment: ExperimentResult; state: ExperimentState; wallClockSeconds: number | null };
87
+ export type PendingRunSummary = RunDataBase & { checksDurationSeconds: number | null; durationSeconds: number | null };
88
+ export interface AutoresearchRuntime {
89
+ autoresearchMode: boolean;
90
+ autoResumeArmed: boolean;
91
+ dashboardExpanded: boolean;
92
+ lastAutoResumePendingRunNumber: number | null;
93
+ lastRunChecks: { pass: boolean; output: string; duration: number } | null;
94
+ lastRunDuration: number | null;
95
+ lastRunAsi: ASIData | null;
96
+ lastRunArtifactDir: string | null;
97
+ lastRunNumber: number | null;
98
+ lastRunSummary: PendingRunSummary | null;
99
+ runningExperiment: { startedAt: number; command: string; runDirectory: string; runNumber: number } | null;
100
+ state: ExperimentState;
101
+ goal: string | null;
102
+ }
103
+ export interface DashboardController {
104
+ clear(ctx: ExtensionContext): void;
105
+ requestRender(): void;
106
+ showOverlay(ctx: ExtensionContext, runtime: AutoresearchRuntime): Promise<void>;
107
+ updateWidget(ctx: ExtensionContext, runtime: AutoresearchRuntime): void;
108
+ }
109
+ export interface AutoresearchToolFactoryOptions {
110
+ dashboard: DashboardController;
111
+ getRuntime(ctx: ExtensionContext): AutoresearchRuntime;
112
+ pi: ExtensionAPI;
113
+ }
114
+ export type AutoresearchToolResult<TDetails> = AgentToolResult<TDetails>;
@@ -0,0 +1,249 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ import type { Browser, Page } from "puppeteer";
5
+ import { assertLoopbackBrowserUrl, pickCoDrivePage, resolveBrowserConnectUrl } from "../tools/browser";
6
+ import { locateChrome } from "./chrome-locate";
7
+
8
+ export type AcquireMode = "attached" | "launched-default" | "launched-dedicated" | "relaunched-default";
9
+
10
+ const DEFAULT_DEBUG_PORT = 9222;
11
+
12
+ export function dedicatedProfileDir(home: string = os.homedir()): string {
13
+ return path.join(home, ".xcsh", "chrome-profile");
14
+ }
15
+
16
+ export function defaultProfileDir(opts?: {
17
+ platform?: NodeJS.Platform;
18
+ env?: NodeJS.ProcessEnv;
19
+ home?: string;
20
+ }): string | null {
21
+ const platform = opts?.platform ?? process.platform;
22
+ const env = opts?.env ?? process.env;
23
+ const home = opts?.home ?? os.homedir();
24
+ switch (platform) {
25
+ case "darwin":
26
+ return path.join(home, "Library", "Application Support", "Google", "Chrome");
27
+ case "linux":
28
+ return path.join(home, ".config", "google-chrome");
29
+ case "win32": {
30
+ const localAppData = env.LOCALAPPDATA;
31
+ if (!localAppData) return null;
32
+ return path.join(localAppData, "Google", "Chrome", "User Data");
33
+ }
34
+ default:
35
+ return null;
36
+ }
37
+ }
38
+
39
+ async function withLaunchTimeout<T>(p: Promise<T>, ms: number): Promise<T> {
40
+ let timer: ReturnType<typeof setTimeout> | undefined;
41
+ const timeout = new Promise<never>((_resolve, reject) => {
42
+ timer = setTimeout(() => reject(new Error("launch timed out")), ms);
43
+ });
44
+ try {
45
+ return await Promise.race([p, timeout]);
46
+ } finally {
47
+ if (timer) clearTimeout(timer);
48
+ }
49
+ }
50
+
51
+ export function buildLaunchArgs(opts: { profileDir?: string; debugPort: number }): string[] {
52
+ const args = [
53
+ `--remote-debugging-port=${opts.debugPort}`,
54
+ "--remote-debugging-address=127.0.0.1",
55
+ "--no-first-run",
56
+ "--no-default-browser-check",
57
+ ];
58
+ if (opts.profileDir) args.push(`--user-data-dir=${opts.profileDir}`);
59
+ return args;
60
+ }
61
+
62
+ export type AcquireAction = "attach" | "launch" | "relaunch" | "dedicated" | "no-chrome";
63
+
64
+ export function decideAcquireAction(state: {
65
+ debuggableNow: boolean;
66
+ chromeRunning: boolean;
67
+ chromeInstalled: boolean;
68
+ allowRelaunch: boolean;
69
+ }): AcquireAction {
70
+ if (!state.chromeInstalled) return "no-chrome";
71
+ if (state.debuggableNow) return "attach";
72
+ if (!state.chromeRunning) return "launch";
73
+ return state.allowRelaunch ? "relaunch" : "dedicated";
74
+ }
75
+
76
+ /** Graceful (never force) quit command for the user's Chrome, per OS. */
77
+ export function quitChromeCommand(
78
+ platform: NodeJS.Platform = process.platform,
79
+ ): { cmd: string; args: string[] } | null {
80
+ switch (platform) {
81
+ case "darwin":
82
+ return { cmd: "osascript", args: ["-e", 'quit app "Google Chrome"'] };
83
+ case "linux":
84
+ return { cmd: "pkill", args: ["-TERM", "-x", "chrome"] };
85
+ case "win32":
86
+ return { cmd: "taskkill", args: ["/IM", "chrome.exe"] };
87
+ default:
88
+ return null;
89
+ }
90
+ }
91
+
92
+ export function isProfileLockError(message: string): boolean {
93
+ // Chrome's own SingletonLock messages, plus Puppeteer's message when an
94
+ // explicit --user-data-dir is already held by a running browser
95
+ // ("The browser is already running for <dir>. Use a different `userDataDir` …").
96
+ return /singletonlock|processsingleton|profile appears to be in use|create a processsingleton|already running for|use a different\s+`?userdatadir/i.test(
97
+ message,
98
+ );
99
+ }
100
+
101
+ function defaultExec(cmd: string, args: string[]): { code: number } {
102
+ try {
103
+ execFileSync(cmd, args, { stdio: "ignore" });
104
+ return { code: 0 };
105
+ } catch (e) {
106
+ const code = (e as { status?: number }).status;
107
+ return { code: typeof code === "number" ? code : 1 };
108
+ }
109
+ }
110
+
111
+ export function isChromeRunning(
112
+ opts: { platform?: NodeJS.Platform; exec?: (cmd: string, args: string[]) => { code: number } } = {},
113
+ ): boolean {
114
+ const platform = opts.platform ?? process.platform;
115
+ const exec = opts.exec ?? defaultExec;
116
+ if (platform === "win32") {
117
+ // tasklist always exits 0; use FILTER so a no-match is a non-zero/empty result.
118
+ return exec("tasklist", ["/FI", "IMAGENAME eq chrome.exe", "/NH"]).code === 0;
119
+ }
120
+ // darwin/linux: pgrep exits 0 when a match exists, 1 otherwise.
121
+ const pattern = platform === "darwin" ? "Google Chrome" : "chrome";
122
+ return exec("pgrep", ["-x", pattern]).code === 0;
123
+ }
124
+
125
+ async function waitForChromeExit(timeoutMs = 8000, pollMs = 300): Promise<boolean> {
126
+ const deadline = Date.now() + timeoutMs;
127
+ while (Date.now() < deadline) {
128
+ if (!isChromeRunning()) return true;
129
+ await new Promise(r => setTimeout(r, pollMs));
130
+ }
131
+ return false;
132
+ }
133
+
134
+ async function tryAttach(browserURL: string): Promise<{ browser: Browser; page: Page } | null> {
135
+ const puppeteer = (await import("puppeteer")).default;
136
+ try {
137
+ const browser = await puppeteer.connect({ browserURL });
138
+ const pages = await browser.pages();
139
+ const page = pages.length ? pages[pickCoDrivePage(pages)]! : await browser.newPage();
140
+ return { browser, page };
141
+ } catch {
142
+ return null;
143
+ }
144
+ }
145
+
146
+ async function launch(executablePath: string, args: string[]): Promise<Browser> {
147
+ const puppeteer = (await import("puppeteer")).default;
148
+ return puppeteer.launch({ headless: false, executablePath, args, defaultViewport: null });
149
+ }
150
+
151
+ export async function acquirePage(opts: {
152
+ settings: { get(key: string): unknown };
153
+ debugPort?: number;
154
+ allowRelaunch?: boolean;
155
+ }): Promise<{ browser: Browser; page: Page; mode: AcquireMode }> {
156
+ const debugPort = opts.debugPort ?? DEFAULT_DEBUG_PORT;
157
+ const configuredUrl = resolveBrowserConnectUrl(opts.settings);
158
+ const attachUrl = configuredUrl ?? `http://127.0.0.1:${debugPort}`;
159
+ assertLoopbackBrowserUrl(attachUrl);
160
+
161
+ // 1) Attach to a Chrome already exposing the debug port.
162
+ const attached = await tryAttach(attachUrl);
163
+ if (attached) return { ...attached, mode: "attached" };
164
+
165
+ // If the user explicitly configured connectUrl but nothing is there, that is an error
166
+ // (do not silently launch a different browser than they asked to attach to).
167
+ if (configuredUrl) {
168
+ throw new Error(
169
+ `Could not attach to Chrome at ${configuredUrl}. Start Chrome with --remote-debugging-port=${debugPort} and retry, or unset browser.connectUrl to let xcsh launch Chrome.`,
170
+ );
171
+ }
172
+
173
+ const located = locateChrome({ settings: opts.settings });
174
+ if (!located) {
175
+ throw new Error(
176
+ "Google Chrome not found. Install Google Chrome, or set the browser.chromePath setting to your Chrome/Chromium executable.",
177
+ );
178
+ }
179
+
180
+ // 2) Launch the user's installed Chrome with their DEFAULT profile + debug port.
181
+ // We pass --user-data-dir EXPLICITLY (Chrome's implicit default profile would hand off
182
+ // to an already-running Chrome and exit, leaving puppeteer.launch hanging on a debug
183
+ // endpoint that never appears). A timeout guards against that handoff case so we can
184
+ // fall through to a dedicated profile instead of hanging.
185
+ const defaultDir = defaultProfileDir();
186
+ if (defaultDir) {
187
+ try {
188
+ const browser = await withLaunchTimeout(
189
+ launch(located.path, buildLaunchArgs({ debugPort, profileDir: defaultDir })),
190
+ 12_000,
191
+ );
192
+ const pages = await browser.pages();
193
+ const page = pages.length ? pages[0]! : await browser.newPage();
194
+ return { browser, page, mode: "launched-default" };
195
+ } catch (err) {
196
+ const msg = err instanceof Error ? err.message : String(err);
197
+ // Profile locked (Chrome already running) or the launch timed out (handoff to a
198
+ // running instance) → fall through to a dedicated, xcsh-owned profile.
199
+ if (!isProfileLockError(msg) && !msg.includes("launch timed out")) throw err;
200
+
201
+ // Resolve relaunch consent: explicit opt, else the setting.
202
+ const allowRelaunch = opts.allowRelaunch ?? opts.settings.get("browser.allowChromeRelaunch") === true;
203
+ // 3) Chrome running without the port → consented quit + relaunch on the real profile.
204
+ if (allowRelaunch) {
205
+ const quit = quitChromeCommand();
206
+ if (quit) {
207
+ try {
208
+ execFileSync(quit.cmd, quit.args, { stdio: "ignore" });
209
+ } catch {
210
+ /* ignore quit errors; verify via waitForChromeExit */
211
+ }
212
+ const exited = await waitForChromeExit();
213
+ if (exited) {
214
+ const browser = await withLaunchTimeout(
215
+ launch(located.path, buildLaunchArgs({ debugPort, profileDir: defaultDir })),
216
+ 12_000,
217
+ );
218
+ const pages = await browser.pages();
219
+ const page = pages.length ? pages[0]! : await browser.newPage();
220
+ return { browser, page, mode: "relaunched-default" };
221
+ }
222
+ // quit timed out → DO NOT relaunch (avoid two instances / data loss); fall through to dedicated.
223
+ }
224
+ }
225
+ }
226
+ }
227
+
228
+ // 4) Default profile unavailable (locked / handoff / unsupported platform) → dedicated
229
+ // xcsh-owned profile. A previous xcsh-launched Chrome on this profile may still be
230
+ // running (close() only disconnects, never terminates), so this launch can hit the
231
+ // same SingletonLock/handoff and hang. Guard it with a timeout; there is no further
232
+ // fallback, so a timeout/lock error is fatal.
233
+ const profileDir = dedicatedProfileDir();
234
+ let browser: Browser;
235
+ try {
236
+ browser = await withLaunchTimeout(launch(located.path, buildLaunchArgs({ debugPort, profileDir })), 12_000);
237
+ } catch (err) {
238
+ const msg = err instanceof Error ? err.message : String(err);
239
+ if (msg.includes("launch timed out") || isProfileLockError(msg)) {
240
+ throw new Error(
241
+ "Could not launch Chrome on the dedicated xcsh profile (it may already be in use); close other xcsh-launched Chrome windows and retry.",
242
+ );
243
+ }
244
+ throw err;
245
+ }
246
+ const pages = await browser.pages();
247
+ const page = pages.length ? pages[0]! : await browser.newPage();
248
+ return { browser, page, mode: "launched-dedicated" };
249
+ }
@@ -0,0 +1,126 @@
1
+ import type { Page } from "puppeteer";
2
+ import { commitInputValue } from "./input-commit";
3
+ import { resolve } from "./resolver";
4
+
5
+ /** Delay after a fill to let blur-triggered framework revalidation complete. */
6
+ const SETTLE_AFTER_FILL_MS = 600;
7
+
8
+ /** Resolve after `ms` milliseconds (a small, explicit settle for SPA timing). */
9
+ function settle(ms: number): Promise<void> {
10
+ return new Promise(resolveSettle => setTimeout(resolveSettle, ms));
11
+ }
12
+
13
+ /** XC-SPA-aware: wait until the console's loading/spinner indicators clear. */
14
+ export async function waitForXcSettled(page: Page, timeoutMs = 15000): Promise<void> {
15
+ const start = Date.now();
16
+ while (Date.now() - start < timeoutMs) {
17
+ const busy = await page
18
+ .evaluate((): boolean => {
19
+ const sel = '[aria-busy="true"], .ant-spin-spinning, [role="progressbar"], .loading-indicator';
20
+ const doc = (globalThis as unknown as { document: { querySelector(s: string): unknown } }).document;
21
+ return doc.querySelector(sel) != null;
22
+ })
23
+ .catch(() => false);
24
+ if (!busy) return;
25
+ await Bun.sleep(150);
26
+ }
27
+ }
28
+
29
+ async function withRetry<T>(fn: () => Promise<T>, timeoutMs = 15000): Promise<T> {
30
+ const start = Date.now();
31
+ let last: unknown;
32
+ while (Date.now() - start < timeoutMs) {
33
+ try {
34
+ return await fn();
35
+ } catch (e) {
36
+ last = e;
37
+ await Bun.sleep(150);
38
+ }
39
+ }
40
+ throw last instanceof Error ? last : new Error(String(last));
41
+ }
42
+
43
+ export async function click(page: Page, selector: string, context?: string): Promise<void> {
44
+ await waitForXcSettled(page);
45
+ await withRetry(async () => {
46
+ const h = await resolve(page, selector, context);
47
+ try {
48
+ await h.scrollIntoView().catch(() => {});
49
+ try {
50
+ await h.click();
51
+ } catch {
52
+ // sticky/offscreen elements: synthetic DOM click fallback
53
+ await h.evaluate(el => (el as unknown as { click(): void }).click());
54
+ }
55
+ } finally {
56
+ await h.dispose().catch(() => {});
57
+ }
58
+ });
59
+ }
60
+
61
+ export async function fill(page: Page, selector: string, value: string, context?: string): Promise<void> {
62
+ await waitForXcSettled(page);
63
+ await withRetry(async () => {
64
+ const h = await resolve(page, selector, context);
65
+ try {
66
+ await h.focus().catch(() => {});
67
+ // Set the value through the native value setter + framework events
68
+ // (input/change/blur/focusout). This replaces any existing value and is
69
+ // the robust path for framework-bound controls — including the console's
70
+ // vsui-input over ngx-datatable, whose patched value descriptor swallows
71
+ // plain keystrokes so they never reach the Angular model. (Use the `type`
72
+ // action for fields that must observe individual keystrokes.)
73
+ await h.evaluate(commitInputValue, value);
74
+ } finally {
75
+ await h.dispose().catch(() => {});
76
+ }
77
+ });
78
+ // Let the framework's blur-triggered revalidation run before the next action
79
+ // (Angular `updateOn: 'blur'` controls update validity asynchronously, so an
80
+ // immediate Save would otherwise still see the field as invalid).
81
+ await settle(SETTLE_AFTER_FILL_MS);
82
+ }
83
+
84
+ export async function selectOption(page: Page, selector: string, value: string, context?: string): Promise<void> {
85
+ await click(page, selector, context); // open the listbox/combobox
86
+ await click(page, `option:text('${value}')`); // pick the option by role+name
87
+ }
88
+
89
+ export async function scrollIntoView(page: Page, selector: string, context?: string): Promise<void> {
90
+ await waitForXcSettled(page);
91
+ const h = await resolve(page, selector, context);
92
+ try {
93
+ await h.scrollIntoView();
94
+ } finally {
95
+ await h.dispose().catch(() => {});
96
+ }
97
+ }
98
+
99
+ export async function pressKey(page: Page, key: string): Promise<void> {
100
+ await page.keyboard.press(key as Parameters<Page["keyboard"]["press"]>[0]);
101
+ }
102
+
103
+ export async function assertText(page: Page, selector: string, expected: string, context?: string): Promise<void> {
104
+ await waitForXcSettled(page);
105
+ const h = await resolve(page, selector, context);
106
+ try {
107
+ const txt = (await h.evaluate(el => (el as unknown as { innerText: string }).innerText)) as string;
108
+ if (!txt.includes(expected)) throw new Error(`assert failed: "${expected}" not in "${txt.slice(0, 200)}"`);
109
+ } finally {
110
+ await h.dispose().catch(() => {});
111
+ }
112
+ }
113
+
114
+ export async function waitFor(page: Page, selector: string, context?: string, timeoutMs = 30000): Promise<void> {
115
+ await withRetry(async () => {
116
+ const h = await resolve(page, selector, context);
117
+ await h.dispose().catch(() => {});
118
+ }, timeoutMs);
119
+ }
120
+
121
+ export async function screenshot(page: Page, file: string): Promise<void> {
122
+ if (!file.endsWith(".png") || file.includes("..") || file.includes("\0")) {
123
+ throw new Error(`Invalid screenshot path: ${file}`);
124
+ }
125
+ await page.screenshot({ path: file as `${string}.png`, type: "png" });
126
+ }
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Auth preflight for the F5 XC console.
3
+ *
4
+ * Pure predicates (`isLoginWall` / `isAuthenticated`) classify a document as a
5
+ * login wall or an authenticated console shell. They work over a minimal
6
+ * structural Document so they run both under linkedom in tests and against the
7
+ * live `document` (via page.evaluate) in the browser. `ensureAuthenticated` is
8
+ * the browser-bound orchestrator: on a login wall it triggers saved-password
9
+ * autofill + submit, then falls back to a co-drive poll until the operator logs
10
+ * in. It is verified at a later live gate (no unit test drives a real browser).
11
+ *
12
+ * No Puppeteer imports leak into the pure predicates; only `ensureAuthenticated`
13
+ * references the `Page` type.
14
+ */
15
+
16
+ import type { Page } from "puppeteer";
17
+
18
+ /** Minimal structural interface matching both linkedom and browser Document. */
19
+ export interface AuthDocument {
20
+ querySelector(sel: string): unknown;
21
+ querySelectorAll(sel: string): ArrayLike<unknown>;
22
+ }
23
+
24
+ /**
25
+ * Selectors that identify a login form. The real XC login wall is a Keycloak
26
+ * page with `#username`, `#password`, and a `#kc-login` submit; the id/name/type
27
+ * alternatives keep this robust across Keycloak theme variations.
28
+ */
29
+ export const LOGIN_SELECTOR = "#username, #password, input[name='username'], input[type='password']";
30
+
31
+ /**
32
+ * Selector that identifies the authenticated console shell. The XC console
33
+ * decorates its chrome with `ves-`-prefixed component classes; the login wall
34
+ * has none (the only `ves-` strings there live in URL query params, not class
35
+ * attributes).
36
+ */
37
+ export const CONSOLE_SHELL_SELECTOR = "[class*='ves-']";
38
+
39
+ /** True when the document presents a login form (Keycloak login wall). */
40
+ export function isLoginWall(doc: AuthDocument): boolean {
41
+ return doc.querySelector(LOGIN_SELECTOR) != null;
42
+ }
43
+
44
+ /**
45
+ * True when the document is the authenticated console shell: it carries
46
+ * `ves-`-classed chrome and is NOT showing a login form.
47
+ */
48
+ export function isAuthenticated(doc: AuthDocument): boolean {
49
+ return doc.querySelector(CONSOLE_SHELL_SELECTOR) != null && !isLoginWall(doc);
50
+ }
51
+
52
+ /**
53
+ * Source for an injected IIFE that nudges the browser's saved-password manager
54
+ * to autofill the login form and then submits it.
55
+ *
56
+ * It focuses the username/password fields and dispatches synthetic input events
57
+ * so Chrome's credential manager offers its saved entry, then clicks the submit
58
+ * control (`#kc-login`) or, failing that, submits the enclosing form. Returns
59
+ * `true` when a form was found and a submit was attempted.
60
+ *
61
+ * Built as a string (rather than a function reference) so the caller can pass it
62
+ * straight to `page.evaluate`.
63
+ */
64
+ export function triggerSavedPasswordExpr(): string {
65
+ return `(() => {
66
+ const username = document.querySelector("#username, input[name='username']");
67
+ const password = document.querySelector("#password, input[type='password']");
68
+ if (!username && !password) return false;
69
+ const nudge = (el) => {
70
+ if (!el) return;
71
+ el.focus();
72
+ el.dispatchEvent(new Event("input", { bubbles: true }));
73
+ el.dispatchEvent(new Event("change", { bubbles: true }));
74
+ };
75
+ nudge(username);
76
+ nudge(password);
77
+ const submit = document.querySelector("#kc-login, button[type='submit'], input[type='submit']");
78
+ if (submit) { submit.click(); return true; }
79
+ const form = (password || username || {}).form;
80
+ if (form && typeof form.requestSubmit === "function") { form.requestSubmit(); return true; }
81
+ if (form && typeof form.submit === "function") { form.submit(); return true; }
82
+ return false;
83
+ })()`;
84
+ }
85
+
86
+ export interface EnsureAuthenticatedOptions {
87
+ /** Co-drive poll interval in ms (default 1000). */
88
+ pollIntervalMs?: number;
89
+ /** Total time to wait for the operator to complete login in ms (default 300000 = 5 min). */
90
+ timeoutMs?: number;
91
+ /** Optional callback invoked once when login is required, so callers can surface a co-drive prompt. */
92
+ onLoginRequired?: () => void;
93
+ }
94
+
95
+ const DEFAULT_POLL_INTERVAL_MS = 1000;
96
+ const DEFAULT_TIMEOUT_MS = 5 * 60 * 1000;
97
+
98
+ function sleep(ms: number): Promise<void> {
99
+ return new Promise(resolve => setTimeout(resolve, ms));
100
+ }
101
+
102
+ /**
103
+ * Compute the auth state against the live document inside the page.
104
+ *
105
+ * Self-contained: the selectors are passed as `page.evaluate` ARGS so nothing
106
+ * relies on closure or sibling-function scope (those identifiers do not exist in
107
+ * the page realm). Mirrors the pure `isLoginWall` / `isAuthenticated` predicates,
108
+ * which remain the documented logic over the same two selector consts.
109
+ */
110
+ async function evalAuthState(page: Page): Promise<{ loginWall: boolean; authed: boolean }> {
111
+ return page.evaluate(
112
+ (loginSel, shellSel) => {
113
+ const doc = (globalThis as unknown as { document: { querySelector(s: string): unknown } }).document;
114
+ const loginWall = doc.querySelector(loginSel) != null;
115
+ const authed = doc.querySelector(shellSel) != null && !loginWall;
116
+ return { loginWall, authed };
117
+ },
118
+ LOGIN_SELECTOR,
119
+ CONSOLE_SHELL_SELECTOR,
120
+ );
121
+ }
122
+
123
+ /**
124
+ * Ensure the console at `consoleUrl` is authenticated.
125
+ *
126
+ * 1. Navigate to `consoleUrl`.
127
+ * 2. If already authenticated, return immediately.
128
+ * 3. If on a login wall, trigger saved-password autofill + submit once.
129
+ * 4. Poll until authenticated (operator co-drive) or the timeout elapses.
130
+ *
131
+ * Throws if the timeout elapses before authentication succeeds.
132
+ */
133
+ export async function ensureAuthenticated(
134
+ page: Page,
135
+ consoleUrl: string,
136
+ opts: EnsureAuthenticatedOptions = {},
137
+ ): Promise<void> {
138
+ const pollIntervalMs = opts.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
139
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
140
+
141
+ await page.goto(consoleUrl, { waitUntil: "domcontentloaded" });
142
+
143
+ {
144
+ const { authed } = await evalAuthState(page);
145
+ if (authed) return;
146
+ }
147
+
148
+ let nudged = false;
149
+ let loginAnnounced = false;
150
+ const deadline = Date.now() + timeoutMs;
151
+
152
+ while (Date.now() < deadline) {
153
+ const { loginWall, authed } = await evalAuthState(page);
154
+ if (authed) return;
155
+
156
+ if (loginWall) {
157
+ if (!loginAnnounced) {
158
+ opts.onLoginRequired?.();
159
+ loginAnnounced = true;
160
+ }
161
+ if (!nudged) {
162
+ // Try saved-password autofill + submit exactly once; subsequent
163
+ // passes fall through to co-drive polling so we don't fight the
164
+ // operator if autofill failed or no credential was saved.
165
+ await page.evaluate(triggerSavedPasswordExpr());
166
+ nudged = true;
167
+ }
168
+ }
169
+
170
+ await sleep(pollIntervalMs);
171
+ }
172
+
173
+ throw new Error(
174
+ `Timed out after ${timeoutMs}ms waiting for authentication at ${consoleUrl}; the console is still showing a login wall.`,
175
+ );
176
+ }