@agentrhq/webcmd 0.1.1 → 0.1.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 (415) hide show
  1. package/README.md +317 -24
  2. package/dist/src/adapter-shadow.d.ts +11 -0
  3. package/dist/src/adapter-shadow.js +72 -0
  4. package/dist/src/adapter-shadow.test.d.ts +1 -0
  5. package/dist/src/adapter-shadow.test.js +49 -0
  6. package/dist/src/adapter-source.d.ts +11 -0
  7. package/dist/src/adapter-source.js +24 -0
  8. package/dist/src/adapter-source.test.d.ts +1 -0
  9. package/dist/src/adapter-source.test.js +29 -0
  10. package/dist/src/brand.d.ts +9 -0
  11. package/dist/src/brand.js +9 -0
  12. package/dist/src/brand.test.d.ts +1 -0
  13. package/dist/src/brand.test.js +15 -0
  14. package/dist/src/browser/analyze.d.ts +118 -0
  15. package/dist/src/browser/analyze.js +405 -0
  16. package/dist/src/browser/analyze.test.d.ts +1 -0
  17. package/dist/src/browser/analyze.test.js +209 -0
  18. package/dist/src/browser/article-extract.d.ts +57 -0
  19. package/dist/src/browser/article-extract.e2e.test.d.ts +1 -0
  20. package/dist/src/browser/article-extract.e2e.test.js +105 -0
  21. package/dist/src/browser/article-extract.js +169 -0
  22. package/dist/src/browser/article-extract.test.d.ts +1 -0
  23. package/dist/src/browser/article-extract.test.js +94 -0
  24. package/dist/src/browser/ax-snapshot.d.ts +37 -0
  25. package/dist/src/browser/ax-snapshot.js +217 -0
  26. package/dist/src/browser/ax-snapshot.test.d.ts +1 -0
  27. package/dist/src/browser/ax-snapshot.test.js +91 -0
  28. package/dist/src/browser/base-page.d.ts +151 -0
  29. package/dist/src/browser/base-page.js +1060 -0
  30. package/dist/src/browser/base-page.test.d.ts +1 -0
  31. package/dist/src/browser/base-page.test.js +803 -0
  32. package/dist/src/browser/bridge-readiness.d.ts +14 -0
  33. package/dist/src/browser/bridge-readiness.js +24 -0
  34. package/dist/src/browser/bridge-readiness.test.d.ts +1 -0
  35. package/dist/src/browser/bridge-readiness.test.js +58 -0
  36. package/dist/src/browser/bridge.d.ts +26 -0
  37. package/dist/src/browser/bridge.js +58 -0
  38. package/dist/src/browser/cdp-click-fixture.test.d.ts +1 -0
  39. package/dist/src/browser/cdp-click-fixture.test.js +87 -0
  40. package/dist/src/browser/cdp.d.ts +46 -0
  41. package/dist/src/browser/cdp.js +536 -0
  42. package/dist/src/browser/cdp.test.d.ts +1 -0
  43. package/dist/src/browser/cdp.test.js +79 -0
  44. package/dist/src/browser/compound.d.ts +59 -0
  45. package/dist/src/browser/compound.js +112 -0
  46. package/dist/src/browser/compound.test.d.ts +1 -0
  47. package/dist/src/browser/compound.test.js +175 -0
  48. package/dist/src/browser/config.d.ts +2 -0
  49. package/dist/src/browser/config.js +14 -0
  50. package/dist/src/browser/daemon-client.d.ts +32 -0
  51. package/dist/src/browser/daemon-client.js +135 -0
  52. package/dist/src/browser/daemon-client.test.d.ts +1 -0
  53. package/dist/src/browser/daemon-client.test.js +326 -0
  54. package/dist/src/browser/daemon-lifecycle.d.ts +37 -0
  55. package/dist/src/browser/daemon-lifecycle.js +147 -0
  56. package/dist/src/browser/daemon-transport.d.ts +54 -0
  57. package/dist/src/browser/daemon-transport.js +68 -0
  58. package/dist/src/browser/daemon-version.d.ts +4 -0
  59. package/dist/src/browser/daemon-version.js +12 -0
  60. package/dist/src/browser/dom-helpers.d.ts +41 -0
  61. package/dist/src/browser/dom-helpers.js +239 -0
  62. package/dist/src/browser/dom-helpers.test.d.ts +1 -0
  63. package/dist/src/browser/dom-helpers.test.js +106 -0
  64. package/dist/src/browser/dom-snapshot.d.ts +93 -0
  65. package/dist/src/browser/dom-snapshot.js +894 -0
  66. package/dist/src/browser/dom-snapshot.test.d.ts +11 -0
  67. package/dist/src/browser/dom-snapshot.test.js +313 -0
  68. package/dist/src/browser/errors.d.ts +38 -0
  69. package/dist/src/browser/errors.js +79 -0
  70. package/dist/src/browser/errors.test.d.ts +1 -0
  71. package/dist/src/browser/errors.test.js +60 -0
  72. package/dist/src/browser/extract.d.ts +69 -0
  73. package/dist/src/browser/extract.js +132 -0
  74. package/dist/src/browser/extract.test.d.ts +1 -0
  75. package/dist/src/browser/extract.test.js +129 -0
  76. package/dist/src/browser/find.d.ts +84 -0
  77. package/dist/src/browser/find.js +398 -0
  78. package/dist/src/browser/find.test.d.ts +1 -0
  79. package/dist/src/browser/find.test.js +180 -0
  80. package/dist/src/browser/html-tree.d.ts +75 -0
  81. package/dist/src/browser/html-tree.js +112 -0
  82. package/dist/src/browser/html-tree.test.d.ts +1 -0
  83. package/dist/src/browser/html-tree.test.js +181 -0
  84. package/dist/src/browser/index.d.ts +14 -0
  85. package/dist/src/browser/index.js +12 -0
  86. package/dist/src/browser/network-cache.d.ts +49 -0
  87. package/dist/src/browser/network-cache.js +78 -0
  88. package/dist/src/browser/network-cache.test.d.ts +1 -0
  89. package/dist/src/browser/network-cache.test.js +75 -0
  90. package/dist/src/browser/network-interceptor.d.ts +11 -0
  91. package/dist/src/browser/network-interceptor.js +11 -0
  92. package/dist/src/browser/network-key.d.ts +22 -0
  93. package/dist/src/browser/network-key.js +66 -0
  94. package/dist/src/browser/network-key.test.d.ts +1 -0
  95. package/dist/src/browser/network-key.test.js +49 -0
  96. package/dist/src/browser/page.d.ts +83 -0
  97. package/dist/src/browser/page.js +453 -0
  98. package/dist/src/browser/page.test.d.ts +1 -0
  99. package/dist/src/browser/page.test.js +406 -0
  100. package/dist/src/browser/profile.d.ts +14 -0
  101. package/dist/src/browser/profile.js +86 -0
  102. package/dist/src/browser/protocol.d.ts +63 -0
  103. package/dist/src/browser/protocol.js +1 -0
  104. package/dist/src/browser/runtime/local-cloak/actions.d.ts +3 -0
  105. package/dist/src/browser/runtime/local-cloak/actions.js +240 -0
  106. package/dist/src/browser/runtime/local-cloak/downloads.d.ts +3 -0
  107. package/dist/src/browser/runtime/local-cloak/downloads.js +28 -0
  108. package/dist/src/browser/runtime/local-cloak/network.d.ts +28 -0
  109. package/dist/src/browser/runtime/local-cloak/network.js +120 -0
  110. package/dist/src/browser/runtime/local-cloak/network.test.d.ts +1 -0
  111. package/dist/src/browser/runtime/local-cloak/network.test.js +124 -0
  112. package/dist/src/browser/runtime/local-cloak/profiles.d.ts +6 -0
  113. package/dist/src/browser/runtime/local-cloak/profiles.js +17 -0
  114. package/dist/src/browser/runtime/local-cloak/profiles.test.d.ts +1 -0
  115. package/dist/src/browser/runtime/local-cloak/profiles.test.js +19 -0
  116. package/dist/src/browser/runtime/local-cloak/provider.d.ts +15 -0
  117. package/dist/src/browser/runtime/local-cloak/provider.js +27 -0
  118. package/dist/src/browser/runtime/local-cloak/provider.test.d.ts +1 -0
  119. package/dist/src/browser/runtime/local-cloak/provider.test.js +244 -0
  120. package/dist/src/browser/runtime/local-cloak/session-manager.d.ts +77 -0
  121. package/dist/src/browser/runtime/local-cloak/session-manager.js +280 -0
  122. package/dist/src/browser/runtime/local-cloak/session-manager.test.d.ts +1 -0
  123. package/dist/src/browser/runtime/local-cloak/session-manager.test.js +92 -0
  124. package/dist/src/browser/runtime/provider.d.ts +9 -0
  125. package/dist/src/browser/runtime/provider.js +1 -0
  126. package/dist/src/browser/runtime/provider.test.d.ts +2 -0
  127. package/dist/src/browser/runtime/provider.test.js +49 -0
  128. package/dist/src/browser/shape-filter.d.ts +52 -0
  129. package/dist/src/browser/shape-filter.js +101 -0
  130. package/dist/src/browser/shape-filter.test.d.ts +1 -0
  131. package/dist/src/browser/shape-filter.test.js +101 -0
  132. package/dist/src/browser/shape.d.ts +23 -0
  133. package/dist/src/browser/shape.js +95 -0
  134. package/dist/src/browser/shape.test.d.ts +1 -0
  135. package/dist/src/browser/shape.test.js +82 -0
  136. package/dist/src/browser/stealth.d.ts +11 -0
  137. package/dist/src/browser/stealth.js +359 -0
  138. package/dist/src/browser/stealth.test.d.ts +1 -0
  139. package/dist/src/browser/stealth.test.js +134 -0
  140. package/dist/src/browser/tabs.d.ts +13 -0
  141. package/dist/src/browser/tabs.js +70 -0
  142. package/dist/src/browser/target-errors.d.ts +39 -0
  143. package/dist/src/browser/target-errors.js +45 -0
  144. package/dist/src/browser/target-errors.test.d.ts +1 -0
  145. package/dist/src/browser/target-errors.test.js +94 -0
  146. package/dist/src/browser/target-resolver.d.ts +158 -0
  147. package/dist/src/browser/target-resolver.js +570 -0
  148. package/dist/src/browser/target-resolver.test.d.ts +1 -0
  149. package/dist/src/browser/target-resolver.test.js +118 -0
  150. package/dist/src/browser/utils.d.ts +20 -0
  151. package/dist/src/browser/utils.js +64 -0
  152. package/dist/src/browser/utils.test.d.ts +1 -0
  153. package/dist/src/browser/utils.test.js +29 -0
  154. package/dist/src/browser/verify-fixture.d.ts +65 -0
  155. package/dist/src/browser/verify-fixture.js +318 -0
  156. package/dist/src/browser/verify-fixture.test.d.ts +1 -0
  157. package/dist/src/browser/verify-fixture.test.js +219 -0
  158. package/dist/src/browser/visual-refs.d.ts +11 -0
  159. package/dist/src/browser/visual-refs.js +108 -0
  160. package/dist/src/browser.test.d.ts +1 -0
  161. package/dist/src/browser.test.js +297 -0
  162. package/dist/src/build-manifest.d.ts +103 -0
  163. package/dist/src/build-manifest.js +363 -0
  164. package/dist/src/build-manifest.test.d.ts +1 -0
  165. package/dist/src/build-manifest.test.js +341 -0
  166. package/dist/src/capabilityRouting.d.ts +19 -0
  167. package/dist/src/capabilityRouting.js +56 -0
  168. package/dist/src/capabilityRouting.test.d.ts +1 -0
  169. package/dist/src/capabilityRouting.test.js +63 -0
  170. package/dist/src/cli-argv-preprocess.d.ts +63 -0
  171. package/dist/src/cli-argv-preprocess.js +303 -0
  172. package/dist/src/cli-argv-preprocess.test.d.ts +1 -0
  173. package/dist/src/cli-argv-preprocess.test.js +304 -0
  174. package/dist/src/cli.d.ts +79 -0
  175. package/dist/src/cli.js +3350 -0
  176. package/dist/src/cli.test.d.ts +1 -0
  177. package/dist/src/cli.test.js +3041 -0
  178. package/dist/src/commanderAdapter.d.ts +21 -0
  179. package/dist/src/commanderAdapter.js +208 -0
  180. package/dist/src/commanderAdapter.test.d.ts +1 -0
  181. package/dist/src/commanderAdapter.test.js +352 -0
  182. package/dist/src/commands/auth.d.ts +40 -0
  183. package/dist/src/commands/auth.js +434 -0
  184. package/dist/src/commands/auth.test.d.ts +1 -0
  185. package/dist/src/commands/auth.test.js +252 -0
  186. package/dist/src/commands/daemon.d.ts +9 -0
  187. package/dist/src/commands/daemon.js +91 -0
  188. package/dist/src/commands/daemon.test.d.ts +1 -0
  189. package/dist/src/commands/daemon.test.js +293 -0
  190. package/dist/src/completion-fast.d.ts +22 -0
  191. package/dist/src/completion-fast.js +88 -0
  192. package/dist/src/completion-shared.d.ts +13 -0
  193. package/dist/src/completion-shared.js +61 -0
  194. package/dist/src/completion.d.ts +21 -0
  195. package/dist/src/completion.js +68 -0
  196. package/dist/src/completion.test.d.ts +1 -0
  197. package/dist/src/completion.test.js +24 -0
  198. package/dist/src/constants.d.ts +18 -0
  199. package/dist/src/constants.js +41 -0
  200. package/dist/src/convention-audit.d.ts +50 -0
  201. package/dist/src/convention-audit.js +553 -0
  202. package/dist/src/convention-audit.test.d.ts +1 -0
  203. package/dist/src/convention-audit.test.js +255 -0
  204. package/dist/src/daemon/server.d.ts +13 -0
  205. package/dist/src/daemon/server.js +185 -0
  206. package/dist/src/daemon/server.test.d.ts +1 -0
  207. package/dist/src/daemon/server.test.js +132 -0
  208. package/dist/src/daemon-utils.d.ts +18 -0
  209. package/dist/src/daemon-utils.js +37 -0
  210. package/dist/src/daemon.d.ts +1 -0
  211. package/dist/src/daemon.js +27 -0
  212. package/dist/src/daemon.test.d.ts +1 -0
  213. package/dist/src/daemon.test.js +60 -0
  214. package/dist/src/discovery.d.ts +46 -0
  215. package/dist/src/discovery.js +341 -0
  216. package/dist/src/doctor.d.ts +39 -0
  217. package/dist/src/doctor.js +168 -0
  218. package/dist/src/doctor.test.d.ts +1 -0
  219. package/dist/src/doctor.test.js +302 -0
  220. package/dist/src/download/article-download.d.ts +72 -0
  221. package/dist/src/download/article-download.js +305 -0
  222. package/dist/src/download/article-download.test.d.ts +1 -0
  223. package/dist/src/download/article-download.test.js +235 -0
  224. package/dist/src/download/index.d.ts +71 -0
  225. package/dist/src/download/index.js +363 -0
  226. package/dist/src/download/index.test.d.ts +1 -0
  227. package/dist/src/download/index.test.js +174 -0
  228. package/dist/src/download/media-download.d.ts +49 -0
  229. package/dist/src/download/media-download.js +127 -0
  230. package/dist/src/download/media-download.test.d.ts +1 -0
  231. package/dist/src/download/media-download.test.js +112 -0
  232. package/dist/src/download/progress.d.ts +36 -0
  233. package/dist/src/download/progress.js +120 -0
  234. package/dist/src/download/progress.test.d.ts +1 -0
  235. package/dist/src/download/progress.test.js +36 -0
  236. package/dist/src/electron-apps.d.ts +31 -0
  237. package/dist/src/electron-apps.js +91 -0
  238. package/dist/src/electron-apps.test.d.ts +1 -0
  239. package/dist/src/electron-apps.test.js +76 -0
  240. package/dist/src/engine.test.d.ts +1 -0
  241. package/dist/src/engine.test.js +312 -0
  242. package/dist/src/errors.d.ts +114 -0
  243. package/dist/src/errors.js +174 -0
  244. package/dist/src/errors.test.d.ts +1 -0
  245. package/dist/src/errors.test.js +109 -0
  246. package/dist/src/execution.d.ts +24 -0
  247. package/dist/src/execution.js +509 -0
  248. package/dist/src/execution.test.d.ts +1 -0
  249. package/dist/src/execution.test.js +645 -0
  250. package/dist/src/external.d.ts +49 -0
  251. package/dist/src/external.js +211 -0
  252. package/dist/src/external.test.d.ts +1 -0
  253. package/dist/src/external.test.js +110 -0
  254. package/dist/src/help.d.ts +88 -0
  255. package/dist/src/help.js +556 -0
  256. package/dist/src/help.test.d.ts +1 -0
  257. package/dist/src/help.test.js +58 -0
  258. package/dist/src/hooks.d.ts +46 -0
  259. package/dist/src/hooks.js +58 -0
  260. package/dist/src/hooks.test.d.ts +4 -0
  261. package/dist/src/hooks.test.js +92 -0
  262. package/dist/src/interceptor.d.ts +44 -0
  263. package/dist/src/interceptor.js +183 -0
  264. package/dist/src/interceptor.test.d.ts +4 -0
  265. package/dist/src/interceptor.test.js +81 -0
  266. package/dist/src/launcher.d.ts +41 -0
  267. package/dist/src/launcher.js +226 -0
  268. package/dist/src/launcher.test.d.ts +1 -0
  269. package/dist/src/launcher.test.js +153 -0
  270. package/dist/src/logger.d.ts +26 -0
  271. package/dist/src/logger.js +49 -0
  272. package/dist/src/main.d.ts +5 -0
  273. package/dist/src/main.js +177 -0
  274. package/dist/src/manifest-types.d.ts +43 -0
  275. package/dist/src/manifest-types.js +9 -0
  276. package/dist/src/node-network.d.ts +10 -0
  277. package/dist/src/node-network.js +174 -0
  278. package/dist/src/node-network.test.d.ts +1 -0
  279. package/dist/src/node-network.test.js +55 -0
  280. package/dist/src/observation/artifact.d.ts +16 -0
  281. package/dist/src/observation/artifact.js +260 -0
  282. package/dist/src/observation/artifact.test.d.ts +1 -0
  283. package/dist/src/observation/artifact.test.js +121 -0
  284. package/dist/src/observation/events.d.ts +89 -0
  285. package/dist/src/observation/events.js +1 -0
  286. package/dist/src/observation/index.d.ts +7 -0
  287. package/dist/src/observation/index.js +7 -0
  288. package/dist/src/observation/manager.d.ts +9 -0
  289. package/dist/src/observation/manager.js +27 -0
  290. package/dist/src/observation/manager.test.d.ts +1 -0
  291. package/dist/src/observation/manager.test.js +13 -0
  292. package/dist/src/observation/redaction.d.ts +11 -0
  293. package/dist/src/observation/redaction.js +81 -0
  294. package/dist/src/observation/redaction.test.d.ts +1 -0
  295. package/dist/src/observation/redaction.test.js +32 -0
  296. package/dist/src/observation/retention.d.ts +32 -0
  297. package/dist/src/observation/retention.js +160 -0
  298. package/dist/src/observation/retention.test.d.ts +1 -0
  299. package/dist/src/observation/retention.test.js +118 -0
  300. package/dist/src/observation/ring-buffer.d.ts +22 -0
  301. package/dist/src/observation/ring-buffer.js +45 -0
  302. package/dist/src/observation/ring-buffer.test.d.ts +1 -0
  303. package/dist/src/observation/ring-buffer.test.js +22 -0
  304. package/dist/src/observation/session.d.ts +25 -0
  305. package/dist/src/observation/session.js +50 -0
  306. package/dist/src/output.d.ts +14 -0
  307. package/dist/src/output.js +152 -0
  308. package/dist/src/output.test.d.ts +1 -0
  309. package/dist/src/output.test.js +53 -0
  310. package/dist/src/package-exports.test.d.ts +1 -0
  311. package/dist/src/package-exports.test.js +112 -0
  312. package/dist/src/package-paths.d.ts +8 -0
  313. package/dist/src/package-paths.js +41 -0
  314. package/dist/src/pipeline/executor.d.ts +11 -0
  315. package/dist/src/pipeline/executor.js +93 -0
  316. package/dist/src/pipeline/executor.test.d.ts +4 -0
  317. package/dist/src/pipeline/executor.test.js +182 -0
  318. package/dist/src/pipeline/index.d.ts +5 -0
  319. package/dist/src/pipeline/index.js +5 -0
  320. package/dist/src/pipeline/registry.d.ts +28 -0
  321. package/dist/src/pipeline/registry.js +55 -0
  322. package/dist/src/pipeline/steps/browser.d.ts +13 -0
  323. package/dist/src/pipeline/steps/browser.js +86 -0
  324. package/dist/src/pipeline/steps/download.d.ts +18 -0
  325. package/dist/src/pipeline/steps/download.js +252 -0
  326. package/dist/src/pipeline/steps/download.test.d.ts +1 -0
  327. package/dist/src/pipeline/steps/download.test.js +102 -0
  328. package/dist/src/pipeline/steps/fetch.d.ts +5 -0
  329. package/dist/src/pipeline/steps/fetch.js +122 -0
  330. package/dist/src/pipeline/steps/fetch.test.d.ts +1 -0
  331. package/dist/src/pipeline/steps/fetch.test.js +117 -0
  332. package/dist/src/pipeline/steps/intercept.d.ts +5 -0
  333. package/dist/src/pipeline/steps/intercept.js +50 -0
  334. package/dist/src/pipeline/steps/tap.d.ts +12 -0
  335. package/dist/src/pipeline/steps/tap.js +93 -0
  336. package/dist/src/pipeline/steps/transform.d.ts +9 -0
  337. package/dist/src/pipeline/steps/transform.js +70 -0
  338. package/dist/src/pipeline/template.d.ts +17 -0
  339. package/dist/src/pipeline/template.js +344 -0
  340. package/dist/src/pipeline/template.test.d.ts +4 -0
  341. package/dist/src/pipeline/template.test.js +197 -0
  342. package/dist/src/pipeline/transform.test.d.ts +4 -0
  343. package/dist/src/pipeline/transform.test.js +133 -0
  344. package/dist/src/plugin-manifest.d.ts +70 -0
  345. package/dist/src/plugin-manifest.js +160 -0
  346. package/dist/src/plugin-manifest.test.d.ts +4 -0
  347. package/dist/src/plugin-manifest.test.js +179 -0
  348. package/dist/src/plugin-scaffold.d.ts +28 -0
  349. package/dist/src/plugin-scaffold.js +143 -0
  350. package/dist/src/plugin-scaffold.test.d.ts +4 -0
  351. package/dist/src/plugin-scaffold.test.js +83 -0
  352. package/dist/src/plugin.d.ts +146 -0
  353. package/dist/src/plugin.js +1303 -0
  354. package/dist/src/plugin.test.d.ts +4 -0
  355. package/dist/src/plugin.test.js +1363 -0
  356. package/dist/src/registry-api.d.ts +13 -0
  357. package/dist/src/registry-api.js +10 -0
  358. package/dist/src/registry.d.ts +123 -0
  359. package/dist/src/registry.js +125 -0
  360. package/dist/src/registry.test.d.ts +4 -0
  361. package/dist/src/registry.test.js +209 -0
  362. package/dist/src/runtime-copy.test.d.ts +1 -0
  363. package/dist/src/runtime-copy.test.js +29 -0
  364. package/dist/src/runtime-detect.d.ts +31 -0
  365. package/dist/src/runtime-detect.js +47 -0
  366. package/dist/src/runtime-detect.test.d.ts +1 -0
  367. package/dist/src/runtime-detect.test.js +39 -0
  368. package/dist/src/runtime-identity.test.d.ts +1 -0
  369. package/dist/src/runtime-identity.test.js +18 -0
  370. package/dist/src/runtime.d.ts +47 -0
  371. package/dist/src/runtime.js +54 -0
  372. package/dist/src/scripts/framework.d.ts +7 -0
  373. package/dist/src/scripts/framework.js +25 -0
  374. package/dist/src/scripts/interact.d.ts +4 -0
  375. package/dist/src/scripts/interact.js +20 -0
  376. package/dist/src/scripts/store.d.ts +13 -0
  377. package/dist/src/scripts/store.js +48 -0
  378. package/dist/src/serialization.d.ts +42 -0
  379. package/dist/src/serialization.js +103 -0
  380. package/dist/src/serialization.test.d.ts +1 -0
  381. package/dist/src/serialization.test.js +78 -0
  382. package/dist/src/skills.d.ts +14 -0
  383. package/dist/src/skills.js +127 -0
  384. package/dist/src/skills.test.d.ts +1 -0
  385. package/dist/src/skills.test.js +71 -0
  386. package/dist/src/snapshotFormatter.d.ts +11 -0
  387. package/dist/src/snapshotFormatter.js +338 -0
  388. package/dist/src/snapshotFormatter.test.d.ts +7 -0
  389. package/dist/src/snapshotFormatter.test.js +521 -0
  390. package/dist/src/tui.d.ts +28 -0
  391. package/dist/src/tui.js +179 -0
  392. package/dist/src/tui.test.d.ts +1 -0
  393. package/dist/src/tui.test.js +19 -0
  394. package/dist/src/types.d.ts +236 -0
  395. package/dist/src/types.js +7 -0
  396. package/dist/src/update-check.d.ts +66 -0
  397. package/dist/src/update-check.js +206 -0
  398. package/dist/src/update-check.test.d.ts +1 -0
  399. package/dist/src/update-check.test.js +117 -0
  400. package/dist/src/utils.d.ts +57 -0
  401. package/dist/src/utils.js +152 -0
  402. package/dist/src/utils.test.d.ts +1 -0
  403. package/dist/src/utils.test.js +155 -0
  404. package/dist/src/validate.d.ts +21 -0
  405. package/dist/src/validate.js +130 -0
  406. package/dist/src/validate.test.d.ts +9 -0
  407. package/dist/src/validate.test.js +90 -0
  408. package/dist/src/verify.d.ts +26 -0
  409. package/dist/src/verify.js +67 -0
  410. package/dist/src/version.d.ts +4 -0
  411. package/dist/src/version.js +22 -0
  412. package/dist/src/weixin-download.test.d.ts +1 -0
  413. package/dist/src/weixin-download.test.js +45 -0
  414. package/package.json +4 -3
  415. package/scripts/check-package-bin.mjs +95 -0
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Public API for webcmd plugins.
3
+ *
4
+ * TS plugins should import from '@agentrhq/webcmd/registry' which resolves to
5
+ * this file. It re-exports ONLY the core registration API — no serialization,
6
+ * no transitive side-effects — to avoid circular dependency deadlocks when
7
+ * plugins are dynamically imported during discoverPlugins().
8
+ */
9
+ export { cli, Strategy, getRegistry, fullName, registerCommand } from './registry.js';
10
+ export type { CliCommand, Arg, CliOptions, CommandArgs, SiteSessionMode } from './registry.js';
11
+ export type { IPage } from './types.js';
12
+ export { onStartup, onBeforeExecute, onAfterExecute } from './hooks.js';
13
+ export type { HookFn, HookContext, HookName } from './hooks.js';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Public API for webcmd plugins.
3
+ *
4
+ * TS plugins should import from '@agentrhq/webcmd/registry' which resolves to
5
+ * this file. It re-exports ONLY the core registration API — no serialization,
6
+ * no transitive side-effects — to avoid circular dependency deadlocks when
7
+ * plugins are dynamically imported during discoverPlugins().
8
+ */
9
+ export { cli, Strategy, getRegistry, fullName, registerCommand } from './registry.js';
10
+ export { onStartup, onBeforeExecute, onAfterExecute } from './hooks.js';
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Core registry: Strategy enum, Arg/CliCommand interfaces, cli() registration.
3
+ */
4
+ import type { IPage } from './types.js';
5
+ export declare enum Strategy {
6
+ PUBLIC = "public",
7
+ LOCAL = "local",
8
+ COOKIE = "cookie",
9
+ INTERCEPT = "intercept",
10
+ UI = "ui"
11
+ }
12
+ export interface Arg {
13
+ name: string;
14
+ type?: string;
15
+ default?: unknown;
16
+ required?: boolean;
17
+ valueRequired?: boolean;
18
+ positional?: boolean;
19
+ help?: string;
20
+ choices?: string[];
21
+ }
22
+ export type CommandArgs = Record<string, any>;
23
+ export type BrowserCommandFunc = (page: IPage, kwargs: CommandArgs, debug?: boolean) => Promise<unknown>;
24
+ export type NonBrowserCommandFunc = (kwargs: CommandArgs, debug?: boolean) => Promise<unknown>;
25
+ export type CommandAccess = 'read' | 'write';
26
+ export type SiteSessionMode = 'ephemeral' | 'persistent';
27
+ export interface AuthStatusMetadata {
28
+ quickCheck?: BrowserCommandFunc;
29
+ refresh?: BrowserCommandFunc;
30
+ }
31
+ interface BaseCliCommand {
32
+ site: string;
33
+ name: string;
34
+ aliases?: string[];
35
+ description: string;
36
+ access: CommandAccess;
37
+ /** Canonical invocation shown in agent-facing help. Generated when omitted. */
38
+ example?: string;
39
+ domain?: string;
40
+ strategy?: Strategy;
41
+ args: Arg[];
42
+ columns?: string[];
43
+ pipeline?: Record<string, unknown>[];
44
+ /** Origin of this command: 'yaml', 'ts', or plugin name. */
45
+ source?: string;
46
+ footerExtra?: (kwargs: CommandArgs) => string | undefined;
47
+ validateArgs?: (kwargs: CommandArgs) => void;
48
+ /**
49
+ * Control pre-navigation and browser-session requirement.
50
+ *
51
+ * After normalizeCommand() expands strategy, this field carries the
52
+ * resolved runtime intent:
53
+ *
54
+ * - `undefined`: no pre-navigation, browser session decided by pipeline steps
55
+ * - `false`: explicitly skip pre-navigation (adapter handles its own navigation)
56
+ * - `true`: needs authenticated browser context but no specific pre-nav URL
57
+ * (e.g. INTERCEPT/UI adapters, or COOKIE without domain)
58
+ * - `string`: pre-navigate to this URL before running the adapter
59
+ * (e.g. `'https://x.com'` for COOKIE strategy with domain)
60
+ *
61
+ * Adapter authors can set this explicitly to override the strategy-based default.
62
+ */
63
+ navigateBefore?: boolean | string;
64
+ /** Site session lifecycle for adapter commands. */
65
+ siteSession?: SiteSessionMode;
66
+ /** Default browser window mode for commands whose UX requires visibility. */
67
+ defaultWindowMode?: 'foreground' | 'background';
68
+ /** Override the default CLI output format when the user does not pass -f/--format. */
69
+ defaultFormat?: 'table' | 'plain' | 'json' | 'yaml' | 'yml' | 'md' | 'markdown' | 'csv';
70
+ /** Optional auth-status metadata attached by shared auth adapters. */
71
+ authStatus?: AuthStatusMetadata;
72
+ }
73
+ export interface BrowserCliCommand extends BaseCliCommand {
74
+ /** Browser commands receive an IPage. Omitted means true after normalization. */
75
+ browser?: true;
76
+ func?: BrowserCommandFunc;
77
+ }
78
+ export interface NonBrowserCliCommand extends BaseCliCommand {
79
+ /** Non-browser commands do not receive a page argument. */
80
+ browser: false;
81
+ func?: NonBrowserCommandFunc;
82
+ }
83
+ export type CliCommand = BrowserCliCommand | NonBrowserCliCommand;
84
+ type RawCliCommand = BaseCliCommand & {
85
+ browser?: boolean;
86
+ func?: BrowserCommandFunc | NonBrowserCommandFunc;
87
+ };
88
+ /** Internal extension for lazy-loaded TS modules (not exposed in public API) */
89
+ export type InternalCliCommand = CliCommand & {
90
+ _lazy?: boolean;
91
+ _modulePath?: string;
92
+ };
93
+ type RequiredCliOptions = {
94
+ site: string;
95
+ name: string;
96
+ access: CommandAccess;
97
+ description?: string;
98
+ args?: Arg[];
99
+ };
100
+ type BrowserStrategy = Exclude<Strategy, Strategy.PUBLIC | Strategy.LOCAL>;
101
+ type BrowserCliOptions = Partial<Omit<BrowserCliCommand, 'args' | 'description' | 'browser' | 'strategy'>> & RequiredCliOptions & ({
102
+ browser: true;
103
+ strategy?: Strategy;
104
+ } | {
105
+ browser?: true;
106
+ strategy?: BrowserStrategy;
107
+ });
108
+ type NonBrowserCliOptions = Partial<Omit<NonBrowserCliCommand, 'args' | 'description'>> & RequiredCliOptions & ({
109
+ browser: false;
110
+ } | {
111
+ strategy: Strategy.PUBLIC | Strategy.LOCAL;
112
+ browser?: false;
113
+ });
114
+ export type CliOptions = BrowserCliOptions | NonBrowserCliOptions;
115
+ declare global {
116
+ var __webcmd_registry__: Map<string, CliCommand> | undefined;
117
+ }
118
+ export declare function cli(opts: CliOptions): CliCommand;
119
+ export declare function getRegistry(): Map<string, CliCommand>;
120
+ export declare function fullName(cmd: Pick<BaseCliCommand, 'site' | 'name'>): string;
121
+ export declare function strategyLabel(cmd: CliCommand): string;
122
+ export declare function registerCommand(cmd: RawCliCommand): void;
123
+ export {};
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Core registry: Strategy enum, Arg/CliCommand interfaces, cli() registration.
3
+ */
4
+ export var Strategy;
5
+ (function (Strategy) {
6
+ Strategy["PUBLIC"] = "public";
7
+ Strategy["LOCAL"] = "local";
8
+ Strategy["COOKIE"] = "cookie";
9
+ Strategy["INTERCEPT"] = "intercept";
10
+ Strategy["UI"] = "ui";
11
+ })(Strategy || (Strategy = {}));
12
+ const _registry = globalThis.__webcmd_registry__ ??= new Map();
13
+ export function cli(opts) {
14
+ const cmd = {
15
+ site: opts.site,
16
+ name: opts.name,
17
+ aliases: opts.aliases,
18
+ description: opts.description ?? '',
19
+ access: opts.access,
20
+ example: opts.example,
21
+ domain: opts.domain,
22
+ strategy: opts.strategy,
23
+ browser: opts.browser,
24
+ args: opts.args ?? [],
25
+ columns: opts.columns,
26
+ func: opts.func,
27
+ pipeline: opts.pipeline,
28
+ footerExtra: opts.footerExtra,
29
+ validateArgs: opts.validateArgs,
30
+ navigateBefore: opts.navigateBefore,
31
+ siteSession: opts.siteSession,
32
+ defaultWindowMode: opts.defaultWindowMode,
33
+ defaultFormat: opts.defaultFormat,
34
+ authStatus: opts.authStatus,
35
+ };
36
+ registerCommand(cmd);
37
+ return _registry.get(fullName(cmd));
38
+ }
39
+ export function getRegistry() {
40
+ return _registry;
41
+ }
42
+ export function fullName(cmd) {
43
+ return `${cmd.site}/${cmd.name}`;
44
+ }
45
+ export function strategyLabel(cmd) {
46
+ return cmd.strategy ?? Strategy.PUBLIC;
47
+ }
48
+ /**
49
+ * Normalize a command's runtime fields. This is the single place where
50
+ * `strategy` is decoded into the concrete fields that the execution path
51
+ * reads (`browser`, `navigateBefore`). After normalization, execution code
52
+ * (resolvePreNav, shouldUseBrowserSession) never reads `cmd.strategy`.
53
+ *
54
+ * `strategy` itself is preserved as metadata for `webcmd list`, cascade
55
+ * probe, adapter generation, and human documentation.
56
+ *
57
+ * Override priority (highest wins):
58
+ * 1. Explicit field on the command (`browser: false`, `navigateBefore: false`)
59
+ * 2. Derived from strategy + domain (the defaults below)
60
+ */
61
+ function normalizeCommand(cmd) {
62
+ assertCommandAccess(cmd);
63
+ assertSiteSession(cmd);
64
+ const strategy = cmd.strategy ?? (cmd.browser === false ? Strategy.PUBLIC : Strategy.COOKIE);
65
+ const browser = cmd.browser ?? (strategy !== Strategy.PUBLIC && strategy !== Strategy.LOCAL);
66
+ let navigateBefore = cmd.navigateBefore;
67
+ if (navigateBefore === undefined) {
68
+ if (strategy === Strategy.COOKIE && cmd.domain) {
69
+ navigateBefore = `https://${cmd.domain}`;
70
+ }
71
+ else if (strategy !== Strategy.PUBLIC && strategy !== Strategy.LOCAL) {
72
+ // Non-PUBLIC without domain: needs authenticated browser context
73
+ // but no specific pre-navigation URL. `true` signals this to
74
+ // shouldUseBrowserSession without triggering resolvePreNav.
75
+ navigateBefore = true;
76
+ }
77
+ }
78
+ return browser
79
+ ? { ...cmd, strategy, browser: true, navigateBefore }
80
+ : { ...cmd, strategy, browser: false, navigateBefore };
81
+ }
82
+ function assertCommandAccess(cmd) {
83
+ if (cmd.access === 'read' || cmd.access === 'write')
84
+ return;
85
+ const key = `${cmd.site}/${cmd.name}`;
86
+ throw new Error(`Command ${key} must declare access: 'read' | 'write'`);
87
+ }
88
+ function assertSiteSession(cmd) {
89
+ if (cmd.siteSession === undefined)
90
+ return;
91
+ const key = `${cmd.site}/${cmd.name}`;
92
+ if (cmd.siteSession !== 'ephemeral' && cmd.siteSession !== 'persistent') {
93
+ throw new Error(`Command ${key} siteSession must be one of: ephemeral, persistent`);
94
+ }
95
+ }
96
+ export function registerCommand(cmd) {
97
+ const normalized = normalizeCommand(cmd);
98
+ const canonicalKey = fullName(normalized);
99
+ const existing = _registry.get(canonicalKey);
100
+ if (existing?.aliases) {
101
+ for (const alias of existing.aliases) {
102
+ _registry.delete(`${existing.site}/${alias}`);
103
+ }
104
+ }
105
+ const aliases = normalizeAliases(normalized.aliases, normalized.name);
106
+ normalized.aliases = aliases.length > 0 ? aliases : undefined;
107
+ _registry.set(canonicalKey, normalized);
108
+ for (const alias of aliases) {
109
+ _registry.set(`${normalized.site}/${alias}`, normalized);
110
+ }
111
+ }
112
+ function normalizeAliases(aliases, commandName) {
113
+ if (!Array.isArray(aliases) || aliases.length === 0)
114
+ return [];
115
+ const seen = new Set();
116
+ const normalized = [];
117
+ for (const alias of aliases) {
118
+ const value = typeof alias === 'string' ? alias.trim() : '';
119
+ if (!value || value === commandName || seen.has(value))
120
+ continue;
121
+ seen.add(value);
122
+ normalized.push(value);
123
+ }
124
+ return normalized;
125
+ }
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Tests for registry.ts: Strategy enum, cli() registration, helpers.
3
+ */
4
+ export {};
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Tests for registry.ts: Strategy enum, cli() registration, helpers.
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { cli, getRegistry, fullName, strategyLabel, registerCommand, Strategy } from './registry.js';
6
+ describe('cli() registration', () => {
7
+ it('registers a command and returns it', () => {
8
+ const cmd = cli({
9
+ site: 'test-registry',
10
+ name: 'hello', access: 'read',
11
+ description: 'A test command',
12
+ strategy: Strategy.PUBLIC,
13
+ browser: false,
14
+ });
15
+ expect(cmd.site).toBe('test-registry');
16
+ expect(cmd.name).toBe('hello');
17
+ expect(cmd.access).toBe('read');
18
+ expect(cmd.strategy).toBe(Strategy.PUBLIC);
19
+ expect(cmd.browser).toBe(false);
20
+ expect(cmd.args).toEqual([]);
21
+ });
22
+ it('puts registered command in the registry', () => {
23
+ cli({
24
+ site: 'test-registry',
25
+ name: 'registered', access: 'read',
26
+ description: 'test',
27
+ });
28
+ const registry = getRegistry();
29
+ expect(registry.has('test-registry/registered')).toBe(true);
30
+ });
31
+ it('defaults strategy to COOKIE when browser is true', () => {
32
+ const cmd = cli({
33
+ site: 'test-registry',
34
+ name: 'default-strategy', access: 'read',
35
+ });
36
+ expect(cmd.strategy).toBe(Strategy.COOKIE);
37
+ expect(cmd.browser).toBe(true);
38
+ });
39
+ it('defaults strategy to PUBLIC when browser is false', () => {
40
+ const cmd = cli({
41
+ site: 'test-registry',
42
+ name: 'no-browser', access: 'read',
43
+ browser: false,
44
+ });
45
+ expect(cmd.strategy).toBe(Strategy.PUBLIC);
46
+ });
47
+ it('preserves LOCAL strategy on registration', () => {
48
+ const cmd = cli({
49
+ site: 'test-registry',
50
+ name: 'local-strategy', access: 'read',
51
+ description: 'reads local credentials',
52
+ strategy: Strategy.LOCAL,
53
+ browser: false,
54
+ });
55
+ expect(cmd.strategy).toBe(Strategy.LOCAL);
56
+ expect(cmd.browser).toBe(false);
57
+ });
58
+ it('overwrites existing command on re-registration', () => {
59
+ cli({ site: 'test-registry', name: 'overwrite', access: 'read', description: 'v1' });
60
+ cli({ site: 'test-registry', name: 'overwrite', access: 'read', description: 'v2' });
61
+ const reg = getRegistry();
62
+ expect(reg.get('test-registry/overwrite')?.description).toBe('v2');
63
+ });
64
+ it('registers aliases as alternate registry keys for the same command', () => {
65
+ const cmd = cli({
66
+ site: 'test-registry',
67
+ name: 'canonical', access: 'read',
68
+ description: 'test aliases',
69
+ aliases: ['compat', 'legacy-name'],
70
+ });
71
+ const registry = getRegistry();
72
+ expect(cmd.aliases).toEqual(['compat', 'legacy-name']);
73
+ expect(registry.get('test-registry/canonical')).toBe(cmd);
74
+ expect(registry.get('test-registry/compat')).toBe(cmd);
75
+ expect(registry.get('test-registry/legacy-name')).toBe(cmd);
76
+ });
77
+ it('preserves defaultFormat on the registered command', () => {
78
+ const cmd = cli({
79
+ site: 'test-registry',
80
+ name: 'plain-default', access: 'read',
81
+ description: 'prefers plain output',
82
+ defaultFormat: 'plain',
83
+ });
84
+ expect(cmd.defaultFormat).toBe('plain');
85
+ expect(getRegistry().get('test-registry/plain-default')?.defaultFormat).toBe('plain');
86
+ });
87
+ it('preserves validateArgs on the registered command', () => {
88
+ const validateArgs = () => undefined;
89
+ const cmd = cli({
90
+ site: 'test-registry',
91
+ name: 'validated', access: 'read',
92
+ description: 'validates args before execution',
93
+ validateArgs,
94
+ });
95
+ expect(cmd.validateArgs).toBe(validateArgs);
96
+ expect(getRegistry().get('test-registry/validated')?.validateArgs).toBe(validateArgs);
97
+ });
98
+ it('rejects commands without explicit access metadata', () => {
99
+ expect(() => cli({
100
+ site: 'test-registry',
101
+ name: 'missing-access',
102
+ })).toThrow("Command test-registry/missing-access must declare access: 'read' | 'write'");
103
+ });
104
+ });
105
+ describe('fullName', () => {
106
+ it('returns site/name', () => {
107
+ const cmd = {
108
+ site: 'bilibili', name: 'hot', access: 'read', description: '', args: [],
109
+ };
110
+ expect(fullName(cmd)).toBe('bilibili/hot');
111
+ });
112
+ });
113
+ describe('strategyLabel', () => {
114
+ it('returns strategy string', () => {
115
+ const cmd = {
116
+ site: 'test', name: 'test', access: 'read', description: '', args: [],
117
+ strategy: Strategy.INTERCEPT,
118
+ };
119
+ expect(strategyLabel(cmd)).toBe('intercept');
120
+ });
121
+ it('returns public when no strategy set', () => {
122
+ const cmd = {
123
+ site: 'test', name: 'test', access: 'read', description: '', args: [],
124
+ };
125
+ expect(strategyLabel(cmd)).toBe('public');
126
+ });
127
+ });
128
+ describe('registerCommand', () => {
129
+ it('registers a pre-built command', () => {
130
+ const cmd = {
131
+ site: 'test-registry',
132
+ name: 'direct-reg', access: 'read',
133
+ description: 'directly registered',
134
+ args: [],
135
+ strategy: Strategy.COOKIE,
136
+ browser: true,
137
+ };
138
+ registerCommand(cmd);
139
+ const reg = getRegistry();
140
+ expect(reg.get('test-registry/direct-reg')?.strategy).toBe(Strategy.COOKIE);
141
+ });
142
+ });
143
+ describe('normalizeCommand (via registerCommand)', () => {
144
+ it('COOKIE + domain → navigateBefore is the domain URL', () => {
145
+ registerCommand({
146
+ site: 'test-norm', name: 'cookie-domain', access: 'read', description: '', args: [],
147
+ strategy: Strategy.COOKIE, domain: 'x.com',
148
+ });
149
+ const cmd = getRegistry().get('test-norm/cookie-domain');
150
+ expect(cmd.browser).toBe(true);
151
+ expect(cmd.navigateBefore).toBe('https://x.com');
152
+ });
153
+ it('COOKIE without domain → navigateBefore is true (auth context, no URL)', () => {
154
+ registerCommand({
155
+ site: 'test-norm', name: 'cookie-nodomain', access: 'read', description: '', args: [],
156
+ strategy: Strategy.COOKIE,
157
+ });
158
+ const cmd = getRegistry().get('test-norm/cookie-nodomain');
159
+ expect(cmd.browser).toBe(true);
160
+ expect(cmd.navigateBefore).toBe(true);
161
+ });
162
+ it('INTERCEPT → navigateBefore is true (auth context)', () => {
163
+ registerCommand({
164
+ site: 'test-norm', name: 'intercept', access: 'read', description: '', args: [],
165
+ strategy: Strategy.INTERCEPT, domain: 'example.com',
166
+ });
167
+ const cmd = getRegistry().get('test-norm/intercept');
168
+ expect(cmd.browser).toBe(true);
169
+ expect(cmd.navigateBefore).toBe(true);
170
+ });
171
+ it('PUBLIC → browser false, navigateBefore undefined', () => {
172
+ registerCommand({
173
+ site: 'test-norm', name: 'public', access: 'read', description: '', args: [],
174
+ strategy: Strategy.PUBLIC,
175
+ });
176
+ const cmd = getRegistry().get('test-norm/public');
177
+ expect(cmd.browser).toBe(false);
178
+ expect(cmd.navigateBefore).toBeUndefined();
179
+ });
180
+ it('LOCAL → browser false, navigateBefore undefined', () => {
181
+ registerCommand({
182
+ site: 'test-norm', name: 'local', access: 'read', description: '', args: [],
183
+ strategy: Strategy.LOCAL,
184
+ });
185
+ const cmd = getRegistry().get('test-norm/local');
186
+ expect(cmd.strategy).toBe(Strategy.LOCAL);
187
+ expect(strategyLabel(cmd)).toBe('local');
188
+ expect(cmd.browser).toBe(false);
189
+ expect(cmd.navigateBefore).toBeUndefined();
190
+ });
191
+ it('explicit navigateBefore: false overrides COOKIE + domain', () => {
192
+ registerCommand({
193
+ site: 'test-norm', name: 'cookie-override', access: 'read', description: '', args: [],
194
+ strategy: Strategy.COOKIE, domain: 'amazon.com', navigateBefore: false,
195
+ });
196
+ const cmd = getRegistry().get('test-norm/cookie-override');
197
+ expect(cmd.browser).toBe(true);
198
+ expect(cmd.navigateBefore).toBe(false);
199
+ });
200
+ it('explicit navigateBefore URL overrides strategy default', () => {
201
+ registerCommand({
202
+ site: 'test-norm', name: 'explicit-url', access: 'read', description: '', args: [],
203
+ strategy: Strategy.COOKIE, domain: 'x.com',
204
+ navigateBefore: 'https://x.com/explore',
205
+ });
206
+ const cmd = getRegistry().get('test-norm/explicit-url');
207
+ expect(cmd.navigateBefore).toBe('https://x.com/explore');
208
+ });
209
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ describe('runtime copy', () => {
5
+ it('does not keep legacy browser runtime setup copy in runtime source', () => {
6
+ const files = [
7
+ 'src/browser/errors.ts',
8
+ 'src/browser/daemon-lifecycle.ts',
9
+ 'src/commands/daemon.ts',
10
+ 'src/cli.ts',
11
+ 'README.md',
12
+ ];
13
+ const phrase = (...parts) => parts.join('');
14
+ const forbiddenUserFacingCopy = [
15
+ phrase('Browser ', 'Bridge'),
16
+ phrase('chrome://', 'extensions'),
17
+ phrase('Load ', 'unpacked'),
18
+ phrase('extension', 'Connected'),
19
+ phrase('extension', 'Version'),
20
+ phrase('extension', 'CompatRange'),
21
+ ];
22
+ const offenders = files.flatMap((file) => {
23
+ const text = fs.readFileSync(path.join(process.cwd(), file), 'utf-8');
24
+ const matches = forbiddenUserFacingCopy.filter((phrase) => text.includes(phrase));
25
+ return matches.length > 0 ? [{ file, matches }] : [];
26
+ });
27
+ expect(offenders).toEqual([]);
28
+ });
29
+ });
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Runtime detection — identify whether webcmd is running under Node.js or Bun.
3
+ *
4
+ * Bun injects `globalThis.Bun` at startup, making detection trivial.
5
+ * This module centralises the check so other code can adapt behaviour
6
+ * (e.g. logging, diagnostics) without littering runtime sniffing everywhere.
7
+ */
8
+ export type Runtime = 'bun' | 'node';
9
+ export declare const MIN_SUPPORTED_NODE_MAJOR = 20;
10
+ /**
11
+ * Detect the current JavaScript runtime.
12
+ */
13
+ export declare function detectRuntime(): Runtime;
14
+ /**
15
+ * Return a human-readable version string for the current runtime.
16
+ * Examples: "v22.13.0" (Node), "1.1.42" (Bun)
17
+ */
18
+ export declare function getRuntimeVersion(): string;
19
+ /**
20
+ * Return a combined label like "node v22.13.0" or "bun 1.1.42".
21
+ */
22
+ export declare function getRuntimeLabel(): string;
23
+ /**
24
+ * Parse a Node.js version string like "v22.13.0" and return its major version.
25
+ * Returns null for non-Node or malformed inputs.
26
+ */
27
+ export declare function parseNodeMajor(version: string): number | null;
28
+ /**
29
+ * Whether the given Node.js version satisfies the current minimum support policy.
30
+ */
31
+ export declare function isSupportedNodeVersion(version?: string): boolean;
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Runtime detection — identify whether webcmd is running under Node.js or Bun.
3
+ *
4
+ * Bun injects `globalThis.Bun` at startup, making detection trivial.
5
+ * This module centralises the check so other code can adapt behaviour
6
+ * (e.g. logging, diagnostics) without littering runtime sniffing everywhere.
7
+ */
8
+ export const MIN_SUPPORTED_NODE_MAJOR = 20;
9
+ /**
10
+ * Detect the current JavaScript runtime.
11
+ */
12
+ export function detectRuntime() {
13
+ // Bun always exposes globalThis.Bun (including Bun.version)
14
+ return globalThis.Bun !== undefined ? 'bun' : 'node';
15
+ }
16
+ /**
17
+ * Return a human-readable version string for the current runtime.
18
+ * Examples: "v22.13.0" (Node), "1.1.42" (Bun)
19
+ */
20
+ export function getRuntimeVersion() {
21
+ const bun = globalThis.Bun;
22
+ return bun ? bun.version : process.version;
23
+ }
24
+ /**
25
+ * Return a combined label like "node v22.13.0" or "bun 1.1.42".
26
+ */
27
+ export function getRuntimeLabel() {
28
+ return `${detectRuntime()} ${getRuntimeVersion()}`;
29
+ }
30
+ /**
31
+ * Parse a Node.js version string like "v22.13.0" and return its major version.
32
+ * Returns null for non-Node or malformed inputs.
33
+ */
34
+ export function parseNodeMajor(version) {
35
+ const match = /^v?(\d+)\./.exec(String(version).trim());
36
+ if (!match)
37
+ return null;
38
+ const major = Number(match[1]);
39
+ return Number.isInteger(major) ? major : null;
40
+ }
41
+ /**
42
+ * Whether the given Node.js version satisfies the current minimum support policy.
43
+ */
44
+ export function isSupportedNodeVersion(version = process.version) {
45
+ const major = parseNodeMajor(version);
46
+ return major !== null && major >= MIN_SUPPORTED_NODE_MAJOR;
47
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,39 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { detectRuntime, getRuntimeVersion, getRuntimeLabel, parseNodeMajor, isSupportedNodeVersion, MIN_SUPPORTED_NODE_MAJOR } from './runtime-detect.js';
3
+ describe('runtime-detect', () => {
4
+ it('detectRuntime returns a valid runtime string', () => {
5
+ const rt = detectRuntime();
6
+ expect(['bun', 'node']).toContain(rt);
7
+ });
8
+ it('getRuntimeVersion returns a non-empty version string', () => {
9
+ const ver = getRuntimeVersion();
10
+ expect(typeof ver).toBe('string');
11
+ expect(ver.length).toBeGreaterThan(0);
12
+ });
13
+ it('getRuntimeLabel returns "<runtime> <version>" format', () => {
14
+ const label = getRuntimeLabel();
15
+ expect(label).toMatch(/^(bun|node) .+$/);
16
+ });
17
+ it('detects the current environment correctly', () => {
18
+ const isBun = typeof globalThis.Bun !== 'undefined';
19
+ const rt = detectRuntime();
20
+ if (isBun) {
21
+ expect(rt).toBe('bun');
22
+ }
23
+ else {
24
+ expect(rt).toBe('node');
25
+ }
26
+ });
27
+ it('parses Node major versions from standard version strings', () => {
28
+ expect(parseNodeMajor('v21.0.0')).toBe(21);
29
+ expect(parseNodeMajor('22.13.1')).toBe(22);
30
+ expect(parseNodeMajor('bun-1.2.0')).toBeNull();
31
+ });
32
+ it('checks the current minimum supported Node major version', () => {
33
+ expect(MIN_SUPPORTED_NODE_MAJOR).toBe(20);
34
+ expect(isSupportedNodeVersion('v19.9.0')).toBe(false);
35
+ expect(isSupportedNodeVersion('v20.0.0')).toBe(true);
36
+ expect(isSupportedNodeVersion('v21.0.0')).toBe(true);
37
+ expect(isSupportedNodeVersion('v25.0.0')).toBe(true);
38
+ });
39
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,18 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import * as path from 'node:path';
3
+ import { unsupportedDaemonPortEnvMessage } from './constants.js';
4
+ import { getUserWebcmdDir, getUserClisDir, getPluginsDir } from './discovery.js';
5
+ describe('webcmd runtime identity', () => {
6
+ it('uses webcmd runtime directories', async () => {
7
+ expect(getUserWebcmdDir('/home/tester')).toBe(path.join('/home/tester', '.webcmd'));
8
+ expect(getUserClisDir('/home/tester')).toBe(path.join('/home/tester', '.webcmd', 'clis'));
9
+ expect(getPluginsDir('/home/tester')).toBe(path.join('/home/tester', '.webcmd', 'plugins'));
10
+ });
11
+ it('reports unsupported daemon port with WEBCMD env names', () => {
12
+ const legacyEnvName = ['OPEN', 'CLI_DAEMON_PORT'].join('');
13
+ expect(unsupportedDaemonPortEnvMessage('1234')).toContain('WEBCMD_DAEMON_PORT');
14
+ expect(unsupportedDaemonPortEnvMessage('1234')).toContain('Webcmd');
15
+ expect(unsupportedDaemonPortEnvMessage('1234')).toContain('rerun webcmd');
16
+ expect(unsupportedDaemonPortEnvMessage('1234')).not.toContain(legacyEnvName);
17
+ });
18
+ });