@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,718 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import type { AgentTool, AgentToolResult } from "@f5xc-salesdemos/pi-agent-core";
4
+ import { logger, prompt, untilAborted } from "@f5xc-salesdemos/pi-utils";
5
+ import { type Static, Type } from "@sinclair/typebox";
6
+ import { parse as parseYaml } from "yaml";
7
+ import { selectProvider } from "../browser";
8
+ import type { PageActions } from "../browser/page-actions";
9
+ import { CONSOLE_CATALOG_DATA } from "../internal-urls/console-catalog.generated";
10
+ import catalogWorkflowRunnerDescription from "../prompts/tools/catalog-workflow-runner.md" with { type: "text" };
11
+ import { ContextService } from "../services/xcsh-context";
12
+ import type { ToolSession } from ".";
13
+ import type { OutputMeta } from "./output-meta";
14
+ import { ToolError, throwIfAborted } from "./tool-errors";
15
+ import { toolResult } from "./tool-result";
16
+
17
+ // =============================================================================
18
+ // Schema
19
+ // =============================================================================
20
+
21
+ const catalogWorkflowRunnerSchema = Type.Object({
22
+ catalog_path: Type.Optional(
23
+ Type.String({ description: "Path to a console catalog root. Omit to use the catalogue embedded in xcsh." }),
24
+ ),
25
+ resource: Type.String({ description: 'Resource identifier, e.g. "http-load-balancer"' }),
26
+ operation: Type.String({ description: 'Workflow operation, e.g. "create", "delete", "view"' }),
27
+ params: Type.Optional(
28
+ Type.Record(Type.String(), Type.Unknown(), {
29
+ description: "Workflow parameters (name, namespace, etc.) for {placeholder} resolution",
30
+ }),
31
+ ),
32
+ observable: Type.Optional(Type.Boolean({ description: "Enable slow execution with screenshots after each step" })),
33
+ observable_delay_ms: Type.Optional(
34
+ Type.Number({ description: "Delay between steps in observable mode (default 1500)" }),
35
+ ),
36
+ screenshot_dir: Type.Optional(Type.String({ description: "Directory to save screenshots" })),
37
+ base_url: Type.Optional(Type.String({ description: "XCSH console base URL; falls back to XCSH_API_URL env var" })),
38
+ });
39
+
40
+ type CatalogWorkflowRunnerParams = Static<typeof catalogWorkflowRunnerSchema>;
41
+
42
+ // =============================================================================
43
+ // Workflow YAML Types
44
+ // =============================================================================
45
+
46
+ interface WorkflowDefinition {
47
+ schema: string;
48
+ id: string;
49
+ name: string;
50
+ description?: string;
51
+ resource: string;
52
+ operation: string;
53
+ // Catalogue `params` is a map keyed by the parameter name (see
54
+ // urn:xcsh:console:workflow:v1), not a list.
55
+ params?: Record<string, WorkflowParamDef>;
56
+ steps: WorkflowStep[];
57
+ }
58
+
59
+ interface WorkflowParamDef {
60
+ required?: boolean;
61
+ default?: unknown;
62
+ description?: string;
63
+ type?: string;
64
+ example?: unknown;
65
+ }
66
+
67
+ interface WorkflowStep {
68
+ id: string;
69
+ action: string;
70
+ description?: string;
71
+ url?: string;
72
+ selector?: string;
73
+ value?: string;
74
+ values?: string[];
75
+ key?: string;
76
+ expected_text?: string;
77
+ wait_for?: string;
78
+ condition?: string;
79
+ context?: string;
80
+ then?: WorkflowStep[];
81
+ timeout?: number;
82
+ workflow?: string;
83
+ with?: Record<string, string>;
84
+ }
85
+
86
+ // =============================================================================
87
+ // Details Types
88
+ // =============================================================================
89
+
90
+ export interface StepResult {
91
+ stepId: string;
92
+ action: string;
93
+ description?: string;
94
+ status: "pass" | "fail" | "skipped";
95
+ durationMs: number;
96
+ error?: string;
97
+ screenshotPath?: string;
98
+ }
99
+
100
+ export interface CatalogWorkflowRunnerDetails {
101
+ workflowId: string;
102
+ resource: string;
103
+ operation: string;
104
+ status: "pass" | "fail";
105
+ totalDurationMs: number;
106
+ steps: StepResult[];
107
+ failedAtStep?: string;
108
+ meta?: OutputMeta;
109
+ }
110
+
111
+ // =============================================================================
112
+ // Constants
113
+ // =============================================================================
114
+
115
+ const EXPECTED_SCHEMA = "urn:xcsh:console:workflow:v1";
116
+ const DEFAULT_OBSERVABLE_DELAY_MS = 1500;
117
+ const MAX_WORKFLOW_DEPTH = 10;
118
+
119
+ // =============================================================================
120
+ // Helpers
121
+ // =============================================================================
122
+
123
+ /**
124
+ * Load the raw YAML text for a workflow. When `catalog_path` is provided the
125
+ * file is read from disk; otherwise the embedded catalogue is used.
126
+ */
127
+ export function loadWorkflowYaml(params: { catalog_path?: string; resource: string; operation: string }): string {
128
+ const SAFE = /^[a-z0-9][a-z0-9-]*$/;
129
+ if (!SAFE.test(params.resource) || !SAFE.test(params.operation)) {
130
+ throw new ToolError(
131
+ `Invalid resource or operation name: must be lowercase alphanumeric/hyphen only (got resource="${params.resource}", operation="${params.operation}")`,
132
+ );
133
+ }
134
+
135
+ if (params.catalog_path) {
136
+ let base: string;
137
+ try {
138
+ base = fs.realpathSync(path.resolve(params.catalog_path, "catalog/workflows"));
139
+ } catch {
140
+ throw new ToolError(`Catalog workflows directory not found under: ${params.catalog_path}`);
141
+ }
142
+ const candidate = path.resolve(base, params.resource, `${params.operation}.yaml`);
143
+ if (!fs.existsSync(candidate)) {
144
+ throw new ToolError(`Workflow not found: ${params.resource}/${params.operation}`);
145
+ }
146
+ const file = fs.realpathSync(candidate); // resolves symlinks before containment check
147
+ if (file !== base && !file.startsWith(base + path.sep)) {
148
+ throw new ToolError(`Path traversal detected in catalog_path`);
149
+ }
150
+ return fs.readFileSync(file, "utf-8");
151
+ }
152
+ const key = `${params.resource}/${params.operation}`;
153
+ const text = CONSOLE_CATALOG_DATA.workflows[key];
154
+ if (!text) {
155
+ const available = Object.keys(CONSOLE_CATALOG_DATA.workflows).slice(0, 20).join(", ");
156
+ throw new Error(
157
+ `No embedded console workflow for "${key}". Available: ${available || "(none — catalogue not embedded)"}`,
158
+ );
159
+ }
160
+ return text;
161
+ }
162
+
163
+ /**
164
+ * Resolve `{placeholder}` references in a string using the provided params map.
165
+ * Supports dotted paths: `{params.name}` resolves to the `name` key in params.
166
+ */
167
+ function resolvePlaceholders(template: string, params: Record<string, unknown>): string {
168
+ return template.replace(/\{([^}]+)\}/g, (_match, key: string) => {
169
+ // Support "params.X" → look up X in params
170
+ const resolved = key.startsWith("params.") ? params[key.slice("params.".length)] : params[key];
171
+ return resolved !== undefined ? String(resolved) : `{${key}}`;
172
+ });
173
+ }
174
+
175
+ /**
176
+ * Evaluate a simple condition string.
177
+ * Supports patterns:
178
+ * - "params.X is set" → truthy check
179
+ * - "params.X is not set" → falsy check
180
+ * - "params.X == value" → equality check
181
+ */
182
+ function evaluateCondition(condition: string, params: Record<string, unknown>): boolean {
183
+ const isSetMatch = condition.match(/^params\.(\w+)\s+is\s+set$/);
184
+ if (isSetMatch) {
185
+ const key = isSetMatch[1]!;
186
+ return params[key] !== undefined && params[key] !== null && params[key] !== "";
187
+ }
188
+
189
+ const isNotSetMatch = condition.match(/^params\.(\w+)\s+is\s+not\s+set$/);
190
+ if (isNotSetMatch) {
191
+ const key = isNotSetMatch[1]!;
192
+ return params[key] === undefined || params[key] === null || params[key] === "";
193
+ }
194
+
195
+ const eqMatch = condition.match(/^params\.(\w+)\s*==\s*(.+)$/);
196
+ if (eqMatch) {
197
+ const key = eqMatch[1]!;
198
+ const expected = eqMatch[2]!.trim();
199
+ return String(params[key] ?? "") === expected;
200
+ }
201
+
202
+ logger.warn("catalog-workflow-runner: unrecognized condition, treating as false", { condition });
203
+ return false;
204
+ }
205
+
206
+ /**
207
+ * Format duration in seconds with one decimal place.
208
+ */
209
+ function formatDuration(ms: number): string {
210
+ return `${(ms / 1000).toFixed(1)}s`;
211
+ }
212
+
213
+ /**
214
+ * Parse a workflow reference of the form "resource/operation".
215
+ * Both segments must be non-empty and match ^[a-z0-9][a-z0-9-]*$.
216
+ * Throws ToolError for malformed refs.
217
+ */
218
+ export function parseWorkflowRef(ref: string): { resource: string; operation: string } {
219
+ const SAFE = /^[a-z0-9][a-z0-9-]*$/;
220
+ const parts = ref.split("/");
221
+ if (parts.length !== 2) {
222
+ throw new ToolError(`Invalid workflow ref "${ref}": must be "resource/operation" with exactly one slash`);
223
+ }
224
+ const [resource, operation] = parts as [string, string];
225
+ if (!resource || !operation) {
226
+ throw new ToolError(`Invalid workflow ref "${ref}": both resource and operation must be non-empty`);
227
+ }
228
+ if (!SAFE.test(resource) || !SAFE.test(operation)) {
229
+ throw new ToolError(
230
+ `Invalid workflow ref "${ref}": segments must be lowercase alphanumeric/hyphen only (no uppercase, underscores, or leading hyphens)`,
231
+ );
232
+ }
233
+ return { resource, operation };
234
+ }
235
+
236
+ // =============================================================================
237
+ // Tool Class
238
+ // =============================================================================
239
+
240
+ export class CatalogWorkflowRunnerTool
241
+ implements AgentTool<typeof catalogWorkflowRunnerSchema, CatalogWorkflowRunnerDetails>
242
+ {
243
+ readonly name = "catalog_workflow_runner";
244
+ readonly label = "Catalog Workflow";
245
+ readonly description: string;
246
+ readonly parameters = catalogWorkflowRunnerSchema;
247
+ readonly strict = true;
248
+
249
+ readonly #toolSession: ToolSession;
250
+
251
+ constructor(session: ToolSession) {
252
+ this.#toolSession = session;
253
+ this.description = prompt.render(catalogWorkflowRunnerDescription);
254
+ }
255
+
256
+ // -------------------------------------------------------------------------
257
+ // YAML loading & validation
258
+ // -------------------------------------------------------------------------
259
+
260
+ #loadWorkflow(params: { catalog_path?: string; resource: string; operation: string }): WorkflowDefinition {
261
+ const raw = loadWorkflowYaml(params);
262
+ const workflow = parseYaml(raw) as WorkflowDefinition;
263
+
264
+ if (workflow.schema !== EXPECTED_SCHEMA) {
265
+ throw new ToolError(`Invalid workflow schema: expected "${EXPECTED_SCHEMA}", got "${workflow.schema}"`);
266
+ }
267
+ if (!workflow.steps || !Array.isArray(workflow.steps)) {
268
+ throw new ToolError("Workflow has no steps array");
269
+ }
270
+ return workflow;
271
+ }
272
+
273
+ #validateParams(workflow: WorkflowDefinition, params: Record<string, unknown>): void {
274
+ if (!workflow.params) return;
275
+ const missing: string[] = [];
276
+ for (const [name, paramDef] of Object.entries(workflow.params)) {
277
+ if (paramDef.required && !(name in params)) {
278
+ if (paramDef.default !== undefined) continue;
279
+ missing.push(name);
280
+ }
281
+ }
282
+ if (missing.length > 0) {
283
+ throw new ToolError(`Missing required workflow params: ${missing.join(", ")}`);
284
+ }
285
+ }
286
+
287
+ // -------------------------------------------------------------------------
288
+ // Step execution
289
+ // -------------------------------------------------------------------------
290
+
291
+ async #executeStep(
292
+ step: WorkflowStep,
293
+ params: Record<string, unknown>,
294
+ baseUrl: string,
295
+ page: PageActions,
296
+ options: {
297
+ observable: boolean;
298
+ observableDelayMs: number;
299
+ screenshotDir?: string;
300
+ stepIndex: number;
301
+ catalogPath?: string;
302
+ depth: number;
303
+ },
304
+ signal?: AbortSignal,
305
+ ): Promise<StepResult> {
306
+ const start = performance.now();
307
+ const result: StepResult = {
308
+ stepId: step.id,
309
+ action: step.action,
310
+ description: step.description,
311
+ status: "pass",
312
+ durationMs: 0,
313
+ };
314
+
315
+ try {
316
+ throwIfAborted(signal);
317
+
318
+ // Condition gating
319
+ if (step.condition) {
320
+ const conditionMet = evaluateCondition(step.condition, params);
321
+ if (!conditionMet) {
322
+ result.status = "skipped";
323
+ result.durationMs = performance.now() - start;
324
+ return result;
325
+ }
326
+ }
327
+
328
+ // Resolve placeholders in relevant fields
329
+ const resolvedUrl = step.url ? resolvePlaceholders(step.url, params) : undefined;
330
+ const resolvedSelector = step.selector ? resolvePlaceholders(step.selector, params) : undefined;
331
+ const resolvedValue = step.value ? resolvePlaceholders(step.value, params) : undefined;
332
+ const resolvedValues = step.values?.map(v => resolvePlaceholders(v, params));
333
+ const resolvedExpected = step.expected_text ? resolvePlaceholders(step.expected_text, params) : undefined;
334
+ const resolvedWaitFor = step.wait_for ? resolvePlaceholders(step.wait_for, params) : undefined;
335
+ const resolvedContext = step.context ? resolvePlaceholders(step.context, params) : undefined;
336
+
337
+ switch (step.action) {
338
+ case "navigate": {
339
+ if (!resolvedUrl) throw new ToolError(`Step "${step.id}": navigate requires url`);
340
+ const fullUrl = resolvedUrl.startsWith("http") ? resolvedUrl : `${baseUrl}${resolvedUrl}`;
341
+ await page.goto(fullUrl, { waitUntil: "networkidle2" });
342
+ // The post-navigate wait_for is a readiness gate, not the goal — the
343
+ // navigation already completed. Treat it as best-effort: a slow or
344
+ // absent heading must not fail the navigate step (the next step
345
+ // resolves its own element and is itself retried). This avoids a 30s
346
+ // wait_for timeout wedging an otherwise-successful navigation.
347
+ if (resolvedWaitFor) {
348
+ await page.waitFor(resolvedWaitFor, resolvedContext, 12_000).catch(() => {});
349
+ }
350
+ break;
351
+ }
352
+ case "click": {
353
+ if (!resolvedSelector) throw new ToolError(`Step "${step.id}": click requires selector`);
354
+ await page.click(resolvedSelector, resolvedContext);
355
+ break;
356
+ }
357
+ case "fill": {
358
+ if (!resolvedSelector) throw new ToolError(`Step "${step.id}": fill requires selector`);
359
+ if (resolvedValue === undefined) throw new ToolError(`Step "${step.id}": fill requires value`);
360
+ await page.fill(resolvedSelector, resolvedValue, resolvedContext);
361
+ break;
362
+ }
363
+ case "fill-list": {
364
+ if (!resolvedSelector) throw new ToolError(`Step "${step.id}": fill-list requires selector`);
365
+ if (!resolvedValues?.length) throw new ToolError(`Step "${step.id}": fill-list requires values`);
366
+ for (const val of resolvedValues) {
367
+ await page.fill(resolvedSelector, val, resolvedContext);
368
+ await page.pressKey("Enter");
369
+ }
370
+ break;
371
+ }
372
+ case "select": {
373
+ if (!resolvedSelector) throw new ToolError(`Step "${step.id}": select requires selector`);
374
+ await page.selectOption(resolvedSelector, resolvedValue ?? "", resolvedContext);
375
+ break;
376
+ }
377
+ case "selectLabel": {
378
+ if (!resolvedSelector) throw new ToolError(`Step "${step.id}": selectLabel requires selector`);
379
+ await (page as any).selectLabel(resolvedSelector, resolvedValue ?? "", resolvedContext);
380
+ break;
381
+ }
382
+ case "assert": {
383
+ if (!resolvedSelector) throw new ToolError(`Step "${step.id}": assert requires selector`);
384
+ if (!resolvedExpected) throw new ToolError(`Step "${step.id}": assert requires expected_text`);
385
+ await page.assertText(resolvedSelector, resolvedExpected, resolvedContext);
386
+ break;
387
+ }
388
+ case "screenshot": {
389
+ if (options.screenshotDir) {
390
+ const safeId = step.id.replace(/[^a-z0-9-]/gi, "-");
391
+ const p = path.resolve(options.screenshotDir, `${safeId}.png`);
392
+ if (!p.startsWith(path.resolve(options.screenshotDir) + path.sep)) {
393
+ throw new ToolError(`Screenshot path escapes screenshotDir for step "${step.id}"`);
394
+ }
395
+ await page.screenshot(p);
396
+ result.screenshotPath = p;
397
+ }
398
+ break;
399
+ }
400
+ case "key-press": {
401
+ if (!step.key) throw new ToolError(`Step "${step.id}": key-press requires key`);
402
+ await page.pressKey(step.key);
403
+ break;
404
+ }
405
+ case "wait": {
406
+ if (!resolvedSelector) throw new ToolError(`Step "${step.id}": wait requires selector`);
407
+ await page.waitFor(resolvedSelector, resolvedContext);
408
+ break;
409
+ }
410
+ case "scroll": {
411
+ if (!resolvedSelector) throw new ToolError(`Step "${step.id}": scroll requires selector`);
412
+ await page.scrollIntoView(resolvedSelector, resolvedContext);
413
+ break;
414
+ }
415
+ case "run-workflow": {
416
+ if (!step.workflow) throw new ToolError(`Step "${step.id}": run-workflow requires workflow`);
417
+ if (options.depth >= MAX_WORKFLOW_DEPTH) {
418
+ throw new ToolError(`run-workflow nesting too deep (possible cycle) at step ${step.id}`);
419
+ }
420
+ const { resource, operation } = parseWorkflowRef(step.workflow);
421
+ const childParams: Record<string, unknown> = {};
422
+ for (const [k, v] of Object.entries(step.with ?? {})) {
423
+ childParams[k] = resolvePlaceholders(v, params);
424
+ }
425
+ const childYaml = loadWorkflowYaml({
426
+ catalog_path: options.catalogPath,
427
+ resource,
428
+ operation,
429
+ });
430
+ const childWorkflow = parseYaml(childYaml) as WorkflowDefinition;
431
+ if (childWorkflow.schema !== EXPECTED_SCHEMA) {
432
+ throw new ToolError(
433
+ `Child workflow "${step.workflow}" has invalid schema: expected "${EXPECTED_SCHEMA}", got "${childWorkflow.schema}"`,
434
+ );
435
+ }
436
+ if (!childWorkflow.steps || !Array.isArray(childWorkflow.steps)) {
437
+ throw new ToolError(`Child workflow "${step.workflow}" has no steps array`);
438
+ }
439
+ // Apply defaults from child workflow param definitions
440
+ if (childWorkflow.params) {
441
+ for (const [name, paramDef] of Object.entries(childWorkflow.params)) {
442
+ if (!(name in childParams) && paramDef.default !== undefined) {
443
+ childParams[name] = paramDef.default;
444
+ }
445
+ }
446
+ }
447
+ this.#validateParams(childWorkflow, childParams);
448
+ for (const childStep of childWorkflow.steps) {
449
+ const r = await this.#executeStep(
450
+ childStep,
451
+ childParams,
452
+ baseUrl,
453
+ page,
454
+ { ...options, depth: options.depth + 1 },
455
+ signal,
456
+ );
457
+ if (r.status === "fail") {
458
+ throw new ToolError(
459
+ `run-workflow "${step.workflow}" failed at child step "${childStep.id}": ${r.error}`,
460
+ );
461
+ }
462
+ }
463
+ break;
464
+ }
465
+ default:
466
+ throw new ToolError(`Unknown workflow action "${step.action}" at step "${step.id}"`);
467
+ }
468
+
469
+ // Post-action wait_for
470
+ if (resolvedWaitFor && step.action !== "navigate") {
471
+ await page.waitFor(resolvedWaitFor, resolvedContext);
472
+ }
473
+
474
+ // Post-save self-analysis: after a save click, read the page for
475
+ // console validation errors ("We found N error", "Field X is required",
476
+ // "server error"). The automation must detect its own errors and report
477
+ // them as structured failure reasons — so the workflow definition or
478
+ // field metadata can be corrected for deterministic next iterations.
479
+ if (step.id === "save" || (step.action === "click" && resolvedSelector?.includes("save-bt"))) {
480
+ await new Promise(r => setTimeout(r, 1500)); // let validation errors render
481
+ try {
482
+ // Read ALL error text from the page (the "We found N error" banner + field-level errors)
483
+ const errorScan = await page
484
+ .waitFor("text('We found')", undefined, 3000)
485
+ .then(async () => {
486
+ // Errors detected — extract the details via javascript_tool
487
+ try {
488
+ const errResult: unknown = await (page as any).javascriptTool?.(
489
+ `JSON.stringify([...document.querySelectorAll('*')].filter(e=>e.children.length===0&&/required|error|invalid/i.test(e.textContent||'')&&(e.textContent||'').length<80).map(e=>e.textContent.trim()).filter(Boolean).slice(0,5))`,
490
+ );
491
+ return typeof errResult === "string" ? errResult : JSON.stringify(errResult);
492
+ } catch {
493
+ return "console validation error (could not extract details)";
494
+ }
495
+ })
496
+ .catch(() => null);
497
+
498
+ if (errorScan) {
499
+ result.status = "fail";
500
+ result.error = `Console form validation failed after save: ${errorScan}. The workflow did not fill all required fields. Consult xcsh://console/<resource> for the required-field registry and update the workflow definition or contribute to api-specs-enriched.`;
501
+ logger.warn("catalog-workflow-runner: post-save validation error detected", {
502
+ step: step.id,
503
+ errors: errorScan,
504
+ });
505
+ }
506
+ } catch {
507
+ // No "We found" text → no validation error → save succeeded
508
+ }
509
+ }
510
+
511
+ // Execute sub-steps (then)
512
+ if (step.then) {
513
+ for (let i = 0; i < step.then.length; i++) {
514
+ const subStep = step.then[i]!;
515
+ const subResult = await this.#executeStep(subStep, params, baseUrl, page, options, signal);
516
+ if (subResult.status === "fail") {
517
+ result.status = "fail";
518
+ result.error = `Sub-step "${subStep.id}" failed: ${subResult.error}`;
519
+ break;
520
+ }
521
+ }
522
+ }
523
+
524
+ // Observable mode: delay + screenshot
525
+ if (options.observable && result.status !== "fail") {
526
+ await new Promise(resolve => setTimeout(resolve, options.observableDelayMs));
527
+ if (options.screenshotDir) {
528
+ const safeId = step.id.replace(/[^a-z0-9-]/gi, "-");
529
+ const obsPath = path.resolve(options.screenshotDir, `step-${options.stepIndex}-${safeId}.png`);
530
+ if (obsPath.startsWith(path.resolve(options.screenshotDir) + path.sep)) {
531
+ try {
532
+ await page.screenshot(obsPath);
533
+ result.screenshotPath = obsPath;
534
+ } catch (e) {
535
+ logger.warn("catalog-workflow-runner: observable screenshot failed", {
536
+ step: step.id,
537
+ error: e instanceof Error ? e.message : String(e),
538
+ });
539
+ }
540
+ }
541
+ }
542
+ }
543
+ } catch (e) {
544
+ result.status = "fail";
545
+ result.error = e instanceof Error ? e.message : String(e);
546
+
547
+ // Capture failure screenshot
548
+ if (options.screenshotDir) {
549
+ try {
550
+ const safeId = step.id.replace(/[^a-z0-9-]/gi, "-");
551
+ const failPath = path.resolve(options.screenshotDir, `fail-${safeId}.png`);
552
+ if (failPath.startsWith(path.resolve(options.screenshotDir) + path.sep)) {
553
+ await page.screenshot(failPath);
554
+ result.screenshotPath = failPath;
555
+ }
556
+ } catch {
557
+ // Best-effort screenshot on failure
558
+ }
559
+ }
560
+ }
561
+
562
+ result.durationMs = performance.now() - start;
563
+ return result;
564
+ }
565
+
566
+ // -------------------------------------------------------------------------
567
+ // Main execute
568
+ // -------------------------------------------------------------------------
569
+
570
+ async execute(
571
+ _toolCallId: string,
572
+ inputParams: CatalogWorkflowRunnerParams,
573
+ signal?: AbortSignal,
574
+ ): Promise<AgentToolResult<CatalogWorkflowRunnerDetails>> {
575
+ return untilAborted(signal, async () => {
576
+ const totalStart = performance.now();
577
+
578
+ // Load & validate
579
+ const workflow = this.#loadWorkflow({
580
+ catalog_path: inputParams.catalog_path,
581
+ resource: inputParams.resource,
582
+ operation: inputParams.operation,
583
+ });
584
+ const params: Record<string, unknown> = { ...inputParams.params };
585
+
586
+ // Apply defaults from workflow param definitions
587
+ if (workflow.params) {
588
+ for (const [name, paramDef] of Object.entries(workflow.params)) {
589
+ if (!(name in params) && paramDef.default !== undefined) {
590
+ params[name] = paramDef.default;
591
+ }
592
+ }
593
+ }
594
+
595
+ // Default the namespace param from the active context when absent.
596
+ if (params.namespace === undefined) {
597
+ try {
598
+ const ns = ContextService.instance.activeNamespace;
599
+ if (ns) params.namespace = ns;
600
+ } catch {
601
+ /* no active context; validateParams will report if required */
602
+ }
603
+ }
604
+
605
+ this.#validateParams(workflow, params);
606
+
607
+ // Resolve base URL: explicit param > env > active context.
608
+ let activeApiUrl: string | null = null;
609
+ try {
610
+ activeApiUrl = ContextService.instance.activeApiUrl;
611
+ } catch {
612
+ activeApiUrl = null; // ContextService not initialized (e.g. unit context)
613
+ }
614
+ const baseUrl = inputParams.base_url ?? process.env.XCSH_API_URL ?? activeApiUrl ?? "";
615
+ if (!baseUrl) {
616
+ throw new ToolError(
617
+ "No base_url provided, XCSH_API_URL is not set, and no active tenant context. Run `/context use <name>` or pass base_url.",
618
+ );
619
+ }
620
+
621
+ // Options
622
+ const observable = inputParams.observable ?? false;
623
+ const observableDelayMs = inputParams.observable_delay_ms ?? DEFAULT_OBSERVABLE_DELAY_MS;
624
+ const screenshotDir = inputParams.screenshot_dir;
625
+
626
+ // Ensure screenshot directory exists
627
+ if (screenshotDir && !fs.existsSync(screenshotDir)) {
628
+ fs.mkdirSync(screenshotDir, { recursive: true });
629
+ }
630
+
631
+ // Open browser session — auto-selects the extension (if connected) or falls back to CDP.
632
+ const provider = await selectProvider(this.#toolSession.settings);
633
+ const acquired = await provider.acquire(baseUrl);
634
+ const page = acquired.page;
635
+
636
+ // Execute steps
637
+ const stepResults: StepResult[] = [];
638
+ let failedAtStep: string | undefined;
639
+
640
+ try {
641
+ for (let i = 0; i < workflow.steps.length; i++) {
642
+ throwIfAborted(signal);
643
+ const step = workflow.steps[i]!;
644
+ // Step-level retry: browser automation against a heavy SPA is
645
+ // transiently flaky (an element mid-animation, a debugger context
646
+ // settling, a one-off evaluate timeout). Each underlying op is
647
+ // already time-bounded, so a transient failure surfaces as a failed
648
+ // step within seconds — retrying it once or twice absorbs the
649
+ // flakiness without re-running the whole workflow (or re-acquiring
650
+ // the browser). Non-idempotent steps are safe to retry here because
651
+ // they failed (the action did not take effect).
652
+ const opts = {
653
+ observable,
654
+ observableDelayMs,
655
+ screenshotDir,
656
+ stepIndex: i,
657
+ catalogPath: inputParams.catalog_path,
658
+ depth: 0,
659
+ };
660
+ let stepResult = await this.#executeStep(step, params, baseUrl, page, opts, signal);
661
+ for (let attempt = 1; attempt <= 2 && stepResult.status === "fail"; attempt++) {
662
+ throwIfAborted(signal);
663
+ logger.warn("catalog-workflow-runner: retrying failed step", {
664
+ step: step.id,
665
+ attempt,
666
+ error: stepResult.error,
667
+ });
668
+ await new Promise(r => setTimeout(r, 1000 * attempt));
669
+ stepResult = await this.#executeStep(step, params, baseUrl, page, opts, signal);
670
+ }
671
+ stepResults.push(stepResult);
672
+
673
+ if (stepResult.status === "fail") {
674
+ failedAtStep = step.id;
675
+ break;
676
+ }
677
+ }
678
+ } finally {
679
+ await acquired.release();
680
+ }
681
+
682
+ const totalDurationMs = performance.now() - totalStart;
683
+ const overallStatus = failedAtStep ? "fail" : "pass";
684
+ const workflowId = `${inputParams.resource}-${inputParams.operation}`;
685
+
686
+ const details: CatalogWorkflowRunnerDetails = {
687
+ workflowId,
688
+ resource: inputParams.resource,
689
+ operation: inputParams.operation,
690
+ status: overallStatus,
691
+ totalDurationMs,
692
+ steps: stepResults,
693
+ failedAtStep,
694
+ };
695
+
696
+ // Format text report
697
+ const statusLabel = overallStatus === "pass" ? "PASS" : "FAIL";
698
+ const header = [
699
+ `Workflow: ${workflow.name} (${workflowId})`,
700
+ `Status: ${statusLabel}`,
701
+ `Duration: ${formatDuration(totalDurationMs)}`,
702
+ "",
703
+ "Steps:",
704
+ ];
705
+
706
+ const stepLines = stepResults.map(sr => {
707
+ const tag = sr.status === "pass" ? "PASS" : sr.status === "fail" ? "FAIL" : "SKIPPED";
708
+ const desc = sr.description ?? sr.error ?? "";
709
+ const dur = formatDuration(sr.durationMs);
710
+ return ` [${tag.padEnd(7)}] ${sr.stepId.padEnd(24)} ${desc.padEnd(40).slice(0, 40)} (${dur})`;
711
+ });
712
+
713
+ const text = [...header, ...stepLines].join("\n");
714
+
715
+ return toolResult(details).text(text).done();
716
+ });
717
+ }
718
+ }