@sovovs/bycli 1.8.0 → 2.1.0

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 (539) hide show
  1. package/cli-manifest.json +0 -61
  2. package/clis/twitter/search.js +3 -3
  3. package/dist/src/adapter-shadow.js +2 -2
  4. package/dist/src/browser/analyze.d.ts +10 -99
  5. package/dist/src/browser/analyze.js +10 -226
  6. package/dist/src/browser/cdp.js +67 -7
  7. package/dist/src/browser/daemon-client.d.ts +2 -0
  8. package/dist/src/browser/daemon-client.js +1 -1
  9. package/dist/src/browser/extension-capabilities.d.ts +13 -0
  10. package/dist/src/browser/extension-capabilities.js +22 -0
  11. package/dist/src/browser/extension-capabilities.test.d.ts +1 -0
  12. package/dist/src/browser/extension-version-metadata.test.d.ts +1 -0
  13. package/dist/src/browser/navigation-guard.d.ts +78 -0
  14. package/dist/src/browser/navigation-guard.js +142 -0
  15. package/dist/src/browser/navigation-guard.test.d.ts +1 -0
  16. package/dist/src/browser/page.d.ts +1 -0
  17. package/dist/src/browser/page.js +20 -1
  18. package/dist/src/browser/url-policy.d.ts +89 -0
  19. package/dist/src/browser/url-policy.js +311 -0
  20. package/dist/src/browser/url-policy.test.d.ts +1 -0
  21. package/dist/src/browser/verify-fixture.js +2 -2
  22. package/dist/src/build-manifest.js +4 -2
  23. package/dist/src/capabilityRouting.d.ts +3 -2
  24. package/dist/src/capabilityRouting.js +10 -2
  25. package/dist/src/cli.js +11 -14
  26. package/dist/src/commanderAdapter.js +5 -5
  27. package/dist/src/config-paths.d.ts +19 -0
  28. package/dist/src/config-paths.js +31 -0
  29. package/dist/src/daemon.js +256 -0
  30. package/dist/src/discovery.d.ts +10 -3
  31. package/dist/src/discovery.js +20 -10
  32. package/dist/src/discovery.test.d.ts +1 -0
  33. package/dist/src/execution.d.ts +5 -0
  34. package/dist/src/execution.js +272 -48
  35. package/dist/src/help.js +8 -8
  36. package/dist/src/main.js +18 -2
  37. package/dist/src/manifest-schema.d.ts +9 -0
  38. package/dist/src/manifest-schema.js +162 -0
  39. package/dist/src/manifest-schema.test.d.ts +1 -0
  40. package/dist/src/manifest-types.d.ts +1 -1
  41. package/dist/src/observation/redaction.js +10 -4
  42. package/dist/src/plugin.js +11 -8
  43. package/dist/src/recorder/highlevel/analyze.d.ts +29 -0
  44. package/dist/src/recorder/highlevel/analyze.js +91 -0
  45. package/dist/src/recorder/highlevel/init.d.ts +125 -0
  46. package/dist/src/recorder/highlevel/init.js +279 -0
  47. package/dist/src/recorder/highlevel/init.test.d.ts +1 -0
  48. package/dist/src/recorder/highlevel/verify.d.ts +73 -0
  49. package/dist/src/recorder/highlevel/verify.js +74 -0
  50. package/dist/src/recorder/http/analyze-runner.d.ts +28 -0
  51. package/dist/src/recorder/http/analyze-runner.js +78 -0
  52. package/dist/src/recorder/http/analyze-runner.test.d.ts +1 -0
  53. package/dist/src/recorder/http/handlers.d.ts +51 -0
  54. package/dist/src/recorder/http/handlers.js +219 -0
  55. package/dist/src/recorder/http/wrapper-config.d.ts +20 -0
  56. package/dist/src/recorder/http/wrapper-config.js +82 -0
  57. package/dist/src/recorder/http/wrapper-envelope.d.ts +31 -0
  58. package/dist/src/recorder/http/wrapper-envelope.js +51 -0
  59. package/dist/src/recorder/http/wrapper-gates.d.ts +16 -0
  60. package/dist/src/recorder/http/wrapper-gates.js +28 -0
  61. package/dist/src/recorder/http/wrapper-metrics.d.ts +1 -0
  62. package/dist/src/recorder/http/wrapper-metrics.js +5 -0
  63. package/dist/src/recorder/http/wrapper-registry.d.ts +50 -0
  64. package/dist/src/recorder/http/wrapper-registry.js +98 -0
  65. package/dist/src/recorder/http/wrapper-server.d.ts +59 -0
  66. package/dist/src/recorder/http/wrapper-server.js +240 -0
  67. package/dist/src/recorder/http/wrapper.test.d.ts +1 -0
  68. package/dist/src/recorder/observability/logger.d.ts +5 -0
  69. package/dist/src/recorder/observability/logger.js +13 -0
  70. package/dist/src/recorder/runner/config.d.ts +34 -0
  71. package/dist/src/recorder/runner/config.js +84 -0
  72. package/dist/src/recorder/runner/config.test.d.ts +1 -0
  73. package/dist/src/recorder/runner/reap.d.ts +79 -0
  74. package/dist/src/recorder/runner/reap.js +230 -0
  75. package/dist/src/recorder/runner/reap.test.d.ts +1 -0
  76. package/dist/src/recorder/runner/runner-port.d.ts +95 -0
  77. package/dist/src/recorder/runner/runner-port.js +518 -0
  78. package/dist/src/recorder/runner/runner-port.test.d.ts +1 -0
  79. package/dist/src/recorder/runner/session-keys.d.ts +28 -0
  80. package/dist/src/recorder/runner/session-keys.js +72 -0
  81. package/dist/src/recorder/runner/session-keys.test.d.ts +1 -0
  82. package/dist/src/recorder/runner/verify-runner-main.d.ts +96 -0
  83. package/dist/src/recorder/runner/verify-runner-main.js +292 -0
  84. package/dist/src/recorder/runner/verify-runner-main.test.d.ts +1 -0
  85. package/dist/src/registry-api.d.ts +1 -1
  86. package/dist/src/registry-api.types.test.d.ts +1 -0
  87. package/dist/src/registry-transaction.d.ts +42 -0
  88. package/dist/src/registry-transaction.js +194 -0
  89. package/dist/src/registry-transaction.test.d.ts +1 -0
  90. package/dist/src/registry.d.ts +58 -16
  91. package/dist/src/registry.js +131 -15
  92. package/dist/src/serialization.d.ts +1 -1
  93. package/dist/src/serialization.js +3 -3
  94. package/dist/src/types.d.ts +2 -0
  95. package/package.json +8 -5
  96. package/scripts/m1-daemon-navigate-drive.mjs +138 -0
  97. package/scripts/m1-extension-spike.mjs +237 -0
  98. package/scripts/m1-live-spike.mjs +156 -0
  99. package/scripts/m6b-connect-back-spike.sh +31 -0
  100. package/clis/12306/utils.test.js +0 -331
  101. package/clis/1688/assets.test.js +0 -39
  102. package/clis/1688/download.test.js +0 -31
  103. package/clis/1688/item.test.js +0 -67
  104. package/clis/1688/search.test.js +0 -75
  105. package/clis/1688/shared.test.js +0 -57
  106. package/clis/1688/store.test.js +0 -62
  107. package/clis/36kr/article.test.js +0 -46
  108. package/clis/36kr/hot.test.js +0 -15
  109. package/clis/36kr/news.test.js +0 -85
  110. package/clis/51job/utils.test.js +0 -69
  111. package/clis/_atlassian/shared.test.js +0 -170
  112. package/clis/aibase/news.test.js +0 -59
  113. package/clis/amazon/bestsellers.test.js +0 -29
  114. package/clis/amazon/discussion.test.js +0 -124
  115. package/clis/amazon/offer.test.js +0 -29
  116. package/clis/amazon/product.test.js +0 -24
  117. package/clis/amazon/rankings.test.js +0 -41
  118. package/clis/amazon/search.test.js +0 -22
  119. package/clis/amazon/shared.test.js +0 -44
  120. package/clis/apple-podcasts/commands.test.js +0 -119
  121. package/clis/apple-podcasts/utils.test.js +0 -57
  122. package/clis/arxiv/arxiv.test.js +0 -112
  123. package/clis/baidu-scholar/search.test.js +0 -23
  124. package/clis/barchart/greeks.test.js +0 -138
  125. package/clis/bilibili/comment.test.js +0 -153
  126. package/clis/bilibili/comments.test.js +0 -142
  127. package/clis/bilibili/dynamic.test.js +0 -68
  128. package/clis/bilibili/hot.test.js +0 -17
  129. package/clis/bilibili/subtitle.test.js +0 -196
  130. package/clis/bilibili/summary.test.js +0 -210
  131. package/clis/bilibili/utils.test.js +0 -61
  132. package/clis/bilibili/video.test.js +0 -132
  133. package/clis/binance/commands.test.js +0 -70
  134. package/clis/bloomberg/utils.test.js +0 -129
  135. package/clis/booking/booking.test.js +0 -356
  136. package/clis/boss/chatlist.test.js +0 -211
  137. package/clis/boss/chatmsg.test.js +0 -230
  138. package/clis/boss/search.test.js +0 -78
  139. package/clis/boss/utils.test.js +0 -34
  140. package/clis/brave/search.test.js +0 -76
  141. package/clis/chaoxing/utils.test.js +0 -45
  142. package/clis/chatgpt/commands.test.js +0 -45
  143. package/clis/chatgpt/envelope.test.js +0 -108
  144. package/clis/chatgpt/image.test.js +0 -188
  145. package/clis/chatgpt/utils.test.js +0 -330
  146. package/clis/chatgpt-app/ax.test.js +0 -35
  147. package/clis/chatwise/composer.test.js +0 -186
  148. package/clis/chess/analyze.test.js +0 -79
  149. package/clis/chess/game.test.js +0 -178
  150. package/clis/chess/games.test.js +0 -164
  151. package/clis/chess/stats.test.js +0 -79
  152. package/clis/chess/utils.test.js +0 -230
  153. package/clis/claude/ask.test.js +0 -338
  154. package/clis/claude/commands.test.js +0 -118
  155. package/clis/claude/utils.test.js +0 -148
  156. package/clis/cnki/search.test.js +0 -18
  157. package/clis/codex/sidebar.test.js +0 -329
  158. package/clis/coingecko/coingecko.test.js +0 -109
  159. package/clis/confluence/commands.test.js +0 -195
  160. package/clis/coupang/coupang.test.js +0 -159
  161. package/clis/coupang/utils.test.js +0 -62
  162. package/clis/ctrip/ctrip.test.js +0 -719
  163. package/clis/dblp/dblp.test.js +0 -397
  164. package/clis/deepseek/ask.test.js +0 -312
  165. package/clis/deepseek/detail.test.js +0 -81
  166. package/clis/deepseek/send.test.js +0 -107
  167. package/clis/deepseek/utils.test.js +0 -370
  168. package/clis/defillama/defillama.test.js +0 -99
  169. package/clis/devto/devto.test.js +0 -236
  170. package/clis/dianping/dianping.test.js +0 -578
  171. package/clis/douban/download.test.js +0 -170
  172. package/clis/douban/movie-hot.test.js +0 -14
  173. package/clis/douban/search.test.js +0 -11
  174. package/clis/douban/subject.test.js +0 -11
  175. package/clis/douban/utils.test.js +0 -438
  176. package/clis/doubao/detail.test.js +0 -42
  177. package/clis/doubao/history.test.js +0 -37
  178. package/clis/doubao/utils.test.js +0 -344
  179. package/clis/douyin/_shared/browser-fetch.test.js +0 -64
  180. package/clis/douyin/_shared/creation-id.test.js +0 -22
  181. package/clis/douyin/_shared/imagex-upload.test.js +0 -87
  182. package/clis/douyin/_shared/sts2.test.js +0 -27
  183. package/clis/douyin/_shared/text-extra.test.js +0 -37
  184. package/clis/douyin/_shared/timing.test.js +0 -28
  185. package/clis/douyin/_shared/tos-upload-short-read.test.js +0 -83
  186. package/clis/douyin/_shared/tos-upload.test.js +0 -229
  187. package/clis/douyin/_shared/transcode.test.js +0 -91
  188. package/clis/douyin/_shared/vod-upload.test.js +0 -38
  189. package/clis/douyin/activities.test.js +0 -55
  190. package/clis/douyin/collections.test.js +0 -45
  191. package/clis/douyin/delete.test.js +0 -100
  192. package/clis/douyin/draft.test.js +0 -335
  193. package/clis/douyin/drafts.test.js +0 -11
  194. package/clis/douyin/hashtag.test.js +0 -171
  195. package/clis/douyin/location.test.js +0 -23
  196. package/clis/douyin/profile.test.js +0 -46
  197. package/clis/douyin/publish-upload-id.test.js +0 -170
  198. package/clis/douyin/publish.test.js +0 -38
  199. package/clis/douyin/stats.test.js +0 -22
  200. package/clis/douyin/update.test.js +0 -11
  201. package/clis/douyin/user-videos.test.js +0 -151
  202. package/clis/douyin/videos.test.js +0 -54
  203. package/clis/duckduckgo/search.test.js +0 -128
  204. package/clis/duckduckgo/suggest.test.js +0 -66
  205. package/clis/eastmoney/hot-rank.test.js +0 -59
  206. package/clis/endoflife/endoflife.test.js +0 -51
  207. package/clis/facebook/feed.test.js +0 -169
  208. package/clis/facebook/marketplace.test.js +0 -91
  209. package/clis/facebook/notifications.test.js +0 -458
  210. package/clis/facebook/search.test.js +0 -55
  211. package/clis/flathub/flathub.test.js +0 -90
  212. package/clis/flomo/memos.test.js +0 -144
  213. package/clis/gemini/ask.test.js +0 -100
  214. package/clis/gemini/deep-research-result.test.js +0 -155
  215. package/clis/gemini/deep-research.test.js +0 -181
  216. package/clis/gemini/reply-state.test.js +0 -671
  217. package/clis/gemini/utils.test.js +0 -198
  218. package/clis/geogebra/geogebra.test.js +0 -175
  219. package/clis/gitee/search.test.js +0 -65
  220. package/clis/gitee/user.test.js +0 -63
  221. package/clis/google/utils.test.js +0 -75
  222. package/clis/google-scholar/cite.test.js +0 -47
  223. package/clis/google-scholar/profile.test.js +0 -49
  224. package/clis/google-scholar/search.test.js +0 -71
  225. package/clis/goproxy/goproxy.test.js +0 -103
  226. package/clis/gov-law/commands.test.js +0 -39
  227. package/clis/gov-policy/gov-policy.test.js +0 -224
  228. package/clis/grok/ask.test.js +0 -29
  229. package/clis/grok/utils.test.js +0 -103
  230. package/clis/hackernews/hackernews.test.js +0 -132
  231. package/clis/hf/hf.test.js +0 -16
  232. package/clis/hupu/hot.test.js +0 -224
  233. package/clis/imdb/utils.test.js +0 -88
  234. package/clis/indeed/indeed.test.js +0 -375
  235. package/clis/instagram/_shared/private-publish.test.js +0 -705
  236. package/clis/instagram/_shared/protocol-capture.test.js +0 -114
  237. package/clis/instagram/download.test.js +0 -118
  238. package/clis/instagram/note.test.js +0 -53
  239. package/clis/instagram/post.test.js +0 -1647
  240. package/clis/instagram/reel.test.js +0 -167
  241. package/clis/instagram/story.test.js +0 -134
  242. package/clis/jd/commands.test.js +0 -41
  243. package/clis/jd/item.test.js +0 -354
  244. package/clis/jianyu/search.test.js +0 -153
  245. package/clis/jianyu/shared/procurement-contract.test.js +0 -72
  246. package/clis/jianyu/shared/procurement-detail.test.js +0 -84
  247. package/clis/jike/read.test.js +0 -86
  248. package/clis/jira/commands.test.js +0 -287
  249. package/clis/juejin/search.js +0 -123
  250. package/clis/juejin/search.test.js +0 -98
  251. package/clis/lesswrong/frontpage.test.js +0 -37
  252. package/clis/lichess/lichess.test.js +0 -85
  253. package/clis/linkedin/connect.test.js +0 -213
  254. package/clis/linkedin/inbox.test.js +0 -152
  255. package/clis/linkedin/job-detail.test.js +0 -38
  256. package/clis/linkedin/jobs-preferences.test.js +0 -43
  257. package/clis/linkedin/people-search.test.js +0 -216
  258. package/clis/linkedin/post-analytics.test.js +0 -40
  259. package/clis/linkedin/posts.test.js +0 -40
  260. package/clis/linkedin/profile-analytics.test.js +0 -67
  261. package/clis/linkedin/profile-experience.test.js +0 -152
  262. package/clis/linkedin/profile-projects.test.js +0 -111
  263. package/clis/linkedin/profile-read.test.js +0 -77
  264. package/clis/linkedin/safe-send.test.js +0 -204
  265. package/clis/linkedin/salesnav-inbox.test.js +0 -113
  266. package/clis/linkedin/salesnav-message.test.js +0 -172
  267. package/clis/linkedin/salesnav-search.test.js +0 -76
  268. package/clis/linkedin/salesnav-thread.test.js +0 -79
  269. package/clis/linkedin/search.test.js +0 -222
  270. package/clis/linkedin/sent-invitations.test.js +0 -62
  271. package/clis/linkedin/services-read.test.js +0 -105
  272. package/clis/linkedin/thread-snapshot.test.js +0 -89
  273. package/clis/linkedin/timeline.test.js +0 -81
  274. package/clis/linkedin-learning/course.test.js +0 -114
  275. package/clis/linkedin-learning/search.test.js +0 -144
  276. package/clis/linkedin-learning/trending.test.js +0 -123
  277. package/clis/linux-do/feed.test.js +0 -153
  278. package/clis/linux-do/topic-content.test.js +0 -59
  279. package/clis/lobsters/lobsters.test.js +0 -169
  280. package/clis/notebooklm/add-source.test.js +0 -97
  281. package/clis/notebooklm/compat.test.js +0 -16
  282. package/clis/notebooklm/create.test.js +0 -58
  283. package/clis/notebooklm/generate-audio.test.js +0 -63
  284. package/clis/notebooklm/generate-slides.test.js +0 -75
  285. package/clis/notebooklm/history.test.js +0 -58
  286. package/clis/notebooklm/note-list.test.js +0 -56
  287. package/clis/notebooklm/notes-get.test.js +0 -72
  288. package/clis/notebooklm/open.test.js +0 -63
  289. package/clis/notebooklm/rpc.test.js +0 -131
  290. package/clis/notebooklm/source-fulltext.test.js +0 -106
  291. package/clis/notebooklm/source-get.test.js +0 -84
  292. package/clis/notebooklm/source-guide.test.js +0 -104
  293. package/clis/notebooklm/summary.test.js +0 -78
  294. package/clis/notebooklm/utils.test.js +0 -449
  295. package/clis/notebooklm/write-note.test.js +0 -70
  296. package/clis/nuget/nuget.test.js +0 -111
  297. package/clis/oeis/oeis.test.js +0 -88
  298. package/clis/ones/task-helpers.test.js +0 -12
  299. package/clis/ones/worklog.test.js +0 -20
  300. package/clis/openfda/openfda.test.js +0 -114
  301. package/clis/openreview/openreview.test.js +0 -427
  302. package/clis/osv/osv.test.js +0 -97
  303. package/clis/paperreview/commands.test.js +0 -243
  304. package/clis/paperreview/utils.test.js +0 -49
  305. package/clis/pixiv/download.test.js +0 -87
  306. package/clis/pixiv/illusts.test.js +0 -99
  307. package/clis/pixiv/search.test.js +0 -83
  308. package/clis/powerchina/search.test.js +0 -93
  309. package/clis/producthunt/utils.test.js +0 -64
  310. package/clis/pubmed/pubmed.test.js +0 -276
  311. package/clis/quark/utils.test.js +0 -58
  312. package/clis/qwen/utils.test.js +0 -45
  313. package/clis/reddit/extract-media.test.js +0 -149
  314. package/clis/reddit/frontpage.test.js +0 -34
  315. package/clis/reddit/home.test.js +0 -170
  316. package/clis/reddit/hot.test.js +0 -32
  317. package/clis/reddit/popular.test.js +0 -26
  318. package/clis/reddit/read.test.js +0 -335
  319. package/clis/reddit/reply.test.js +0 -89
  320. package/clis/reddit/search.test.js +0 -26
  321. package/clis/reddit/subreddit-info.test.js +0 -163
  322. package/clis/reddit/subreddit.test.js +0 -31
  323. package/clis/reddit/subscribed.test.js +0 -168
  324. package/clis/reddit/whoami.test.js +0 -105
  325. package/clis/rednote/navigation.test.js +0 -26
  326. package/clis/rednote/rednote.test.js +0 -222
  327. package/clis/rest-countries/rest-countries.test.js +0 -83
  328. package/clis/reuters/reuters.test.js +0 -299
  329. package/clis/rfc/rfc.test.js +0 -74
  330. package/clis/sinafinance/stock.test.js +0 -59
  331. package/clis/spotify/utils.test.js +0 -67
  332. package/clis/stackoverflow/stackoverflow.test.js +0 -404
  333. package/clis/steam/steam.test.js +0 -46
  334. package/clis/substack/utils.test.js +0 -44
  335. package/clis/suno/commands.test.js +0 -188
  336. package/clis/suno/download.test.js +0 -151
  337. package/clis/suno/generate.test.js +0 -252
  338. package/clis/suno/utils.test.js +0 -329
  339. package/clis/taobao/commands.test.js +0 -41
  340. package/clis/tdx/hot-rank.test.js +0 -59
  341. package/clis/ths/hot-rank.test.js +0 -64
  342. package/clis/tieba/commands.test.js +0 -79
  343. package/clis/tieba/utils.test.js +0 -290
  344. package/clis/tiktok/creator-videos.test.js +0 -113
  345. package/clis/tiktok/refactor.test.js +0 -389
  346. package/clis/tiktok/write-refactor.test.js +0 -370
  347. package/clis/toutiao/toutiao.test.js +0 -378
  348. package/clis/tvmaze/tvmaze.test.js +0 -93
  349. package/clis/twitter/bookmark-folder.test.js +0 -395
  350. package/clis/twitter/bookmark-folders.test.js +0 -152
  351. package/clis/twitter/bookmark.test.js +0 -74
  352. package/clis/twitter/bookmarks.test.js +0 -205
  353. package/clis/twitter/delete.test.js +0 -85
  354. package/clis/twitter/device-follow.test.js +0 -287
  355. package/clis/twitter/download.test.js +0 -457
  356. package/clis/twitter/followers.test.js +0 -62
  357. package/clis/twitter/following.test.js +0 -338
  358. package/clis/twitter/hide-reply.test.js +0 -76
  359. package/clis/twitter/like.test.js +0 -73
  360. package/clis/twitter/likes.test.js +0 -220
  361. package/clis/twitter/list-add.test.js +0 -133
  362. package/clis/twitter/list-create.test.js +0 -169
  363. package/clis/twitter/list-remove.test.js +0 -110
  364. package/clis/twitter/list-tweets.test.js +0 -196
  365. package/clis/twitter/lists.test.js +0 -253
  366. package/clis/twitter/post.test.js +0 -258
  367. package/clis/twitter/profile.test.js +0 -39
  368. package/clis/twitter/quote.test.js +0 -194
  369. package/clis/twitter/reply.test.js +0 -237
  370. package/clis/twitter/retweet.test.js +0 -73
  371. package/clis/twitter/search.test.js +0 -349
  372. package/clis/twitter/shared.test.js +0 -794
  373. package/clis/twitter/thread.test.js +0 -58
  374. package/clis/twitter/timeline.test.js +0 -104
  375. package/clis/twitter/trending.test.js +0 -15
  376. package/clis/twitter/tweets.test.js +0 -362
  377. package/clis/twitter/unbookmark.test.js +0 -73
  378. package/clis/twitter/unlike.test.js +0 -75
  379. package/clis/twitter/unretweet.test.js +0 -73
  380. package/clis/twitter/utils.test.js +0 -169
  381. package/clis/uisdc/news.test.js +0 -66
  382. package/clis/uiverse/_shared.test.js +0 -62
  383. package/clis/uiverse/navigation.test.js +0 -12
  384. package/clis/upwork/upwork.test.js +0 -566
  385. package/clis/wanfang/search.test.js +0 -23
  386. package/clis/web/read.test.js +0 -392
  387. package/clis/weibo/delete.test.js +0 -94
  388. package/clis/weibo/envelope.test.js +0 -85
  389. package/clis/weibo/favorites.test.js +0 -114
  390. package/clis/weibo/publish.test.js +0 -192
  391. package/clis/weibo/user-posts.test.js +0 -92
  392. package/clis/weibo/utils.test.js +0 -36
  393. package/clis/weixin/drafts.test.js +0 -69
  394. package/clis/weixin/search.test.js +0 -227
  395. package/clis/weread/ai-outline.test.js +0 -83
  396. package/clis/weread/book-search.test.js +0 -242
  397. package/clis/weread/commands.test.js +0 -398
  398. package/clis/weread/private-api-regression.test.js +0 -369
  399. package/clis/weread/search-regression.test.js +0 -494
  400. package/clis/weread/utils.test.js +0 -128
  401. package/clis/weread-official/commands.test.js +0 -385
  402. package/clis/weread-official/utils.test.js +0 -242
  403. package/clis/wikidata/wikidata.test.js +0 -83
  404. package/clis/wikipedia/trending.test.js +0 -57
  405. package/clis/wttr/wttr.test.js +0 -84
  406. package/clis/xianyu/chat.test.js +0 -84
  407. package/clis/xianyu/im.test.js +0 -253
  408. package/clis/xianyu/item.test.js +0 -56
  409. package/clis/xianyu/publish.test.js +0 -220
  410. package/clis/xianyu/search.test.js +0 -17
  411. package/clis/xiaoe/xiaoe.test.js +0 -486
  412. package/clis/xiaohongshu/comments.test.js +0 -258
  413. package/clis/xiaohongshu/creator-note-detail.test.js +0 -451
  414. package/clis/xiaohongshu/creator-notes-summary.test.js +0 -94
  415. package/clis/xiaohongshu/creator-notes.test.js +0 -281
  416. package/clis/xiaohongshu/creator-stats.test.js +0 -24
  417. package/clis/xiaohongshu/delete-note.test.js +0 -172
  418. package/clis/xiaohongshu/download.test.js +0 -316
  419. package/clis/xiaohongshu/navigation.test.js +0 -34
  420. package/clis/xiaohongshu/note.test.js +0 -249
  421. package/clis/xiaohongshu/publish.test.js +0 -608
  422. package/clis/xiaohongshu/search.test.js +0 -325
  423. package/clis/xiaohongshu/user-helpers.test.js +0 -160
  424. package/clis/xiaoyuzhou/auth.test.js +0 -124
  425. package/clis/xiaoyuzhou/download.test.js +0 -135
  426. package/clis/xiaoyuzhou/podcast-episodes.test.js +0 -78
  427. package/clis/xiaoyuzhou/transcript.test.js +0 -195
  428. package/clis/xiaoyuzhou/utils.test.js +0 -39
  429. package/clis/xueqiu/comments.test.js +0 -696
  430. package/clis/xueqiu/danjuan-utils.test.js +0 -41
  431. package/clis/xueqiu/utils.test.js +0 -26
  432. package/clis/yahoo/search.test.js +0 -94
  433. package/clis/youdao/note.test.js +0 -99
  434. package/clis/youtube/channel.test.js +0 -59
  435. package/clis/youtube/feed.test.js +0 -131
  436. package/clis/youtube/transcript-group.test.js +0 -99
  437. package/clis/youtube/transcript.test.js +0 -296
  438. package/clis/youtube/utils.test.js +0 -84
  439. package/clis/yuanbao/ask.test.js +0 -124
  440. package/clis/yuanbao/new.test.js +0 -30
  441. package/clis/yuanbao/shared.test.js +0 -80
  442. package/clis/zhihu/answer-comments.test.js +0 -287
  443. package/clis/zhihu/answer-detail.test.js +0 -338
  444. package/clis/zhihu/answer.test.js +0 -54
  445. package/clis/zhihu/collection.test.js +0 -337
  446. package/clis/zhihu/collections.test.js +0 -182
  447. package/clis/zhihu/comment.test.js +0 -50
  448. package/clis/zhihu/download.test.js +0 -12
  449. package/clis/zhihu/favorite.test.js +0 -59
  450. package/clis/zhihu/follow.test.js +0 -42
  451. package/clis/zhihu/like.test.js +0 -41
  452. package/clis/zhihu/question.test.js +0 -251
  453. package/clis/zhihu/recommend.test.js +0 -143
  454. package/clis/zhihu/search.test.js +0 -198
  455. package/clis/zhihu/target.test.js +0 -77
  456. package/clis/zhihu/text.test.js +0 -24
  457. package/clis/zhihu/write-shared.test.js +0 -176
  458. package/clis/zlibrary/commands.test.js +0 -65
  459. package/clis/zsxq/search.test.js +0 -24
  460. package/clis/zsxq/topic.test.js +0 -30
  461. package/clis/zsxq/topics.test.js +0 -24
  462. package/clis/zsxq/utils.test.js +0 -31
  463. package/dist/src/adapter-shadow.test.js +0 -49
  464. package/dist/src/adapter-source.test.js +0 -29
  465. package/dist/src/browser/analyze.test.js +0 -166
  466. package/dist/src/browser/article-extract.e2e.test.js +0 -105
  467. package/dist/src/browser/article-extract.test.js +0 -94
  468. package/dist/src/browser/ax-snapshot.test.js +0 -91
  469. package/dist/src/browser/base-page.test.js +0 -758
  470. package/dist/src/browser/cdp-click-fixture.test.js +0 -87
  471. package/dist/src/browser/cdp.test.js +0 -79
  472. package/dist/src/browser/compound.test.js +0 -175
  473. package/dist/src/browser/daemon-client.test.js +0 -199
  474. package/dist/src/browser/dom-helpers.test.js +0 -106
  475. package/dist/src/browser/dom-snapshot.test.js +0 -313
  476. package/dist/src/browser/errors.test.js +0 -60
  477. package/dist/src/browser/extract.test.js +0 -129
  478. package/dist/src/browser/find.test.js +0 -180
  479. package/dist/src/browser/html-tree.test.js +0 -181
  480. package/dist/src/browser/network-cache.test.js +0 -58
  481. package/dist/src/browser/network-key.test.js +0 -49
  482. package/dist/src/browser/page.test.js +0 -378
  483. package/dist/src/browser/shape-filter.test.js +0 -101
  484. package/dist/src/browser/shape.test.js +0 -82
  485. package/dist/src/browser/stealth.test.js +0 -134
  486. package/dist/src/browser/target-errors.test.js +0 -94
  487. package/dist/src/browser/target-resolver.test.js +0 -118
  488. package/dist/src/browser/utils.test.js +0 -29
  489. package/dist/src/browser/verify-fixture.test.js +0 -219
  490. package/dist/src/browser.test.js +0 -232
  491. package/dist/src/build-manifest.test.js +0 -341
  492. package/dist/src/capabilityRouting.test.js +0 -63
  493. package/dist/src/cli-argv-preprocess.test.js +0 -209
  494. package/dist/src/cli.test.js +0 -2803
  495. package/dist/src/commanderAdapter.test.js +0 -352
  496. package/dist/src/commands/daemon.test.js +0 -219
  497. package/dist/src/completion.test.js +0 -24
  498. package/dist/src/convention-audit.test.js +0 -247
  499. package/dist/src/daemon.test.js +0 -60
  500. package/dist/src/doctor.test.js +0 -263
  501. package/dist/src/download/article-download.test.js +0 -235
  502. package/dist/src/download/index.test.js +0 -140
  503. package/dist/src/download/media-download.test.js +0 -112
  504. package/dist/src/download/progress.test.js +0 -36
  505. package/dist/src/electron-apps.test.js +0 -49
  506. package/dist/src/engine.test.js +0 -312
  507. package/dist/src/errors.test.js +0 -109
  508. package/dist/src/execution.test.js +0 -623
  509. package/dist/src/extension-manifest-regression.test.js +0 -12
  510. package/dist/src/external.test.js +0 -146
  511. package/dist/src/help.test.js +0 -58
  512. package/dist/src/hooks.test.js +0 -92
  513. package/dist/src/interceptor.test.js +0 -81
  514. package/dist/src/launcher.test.js +0 -138
  515. package/dist/src/node-network.test.js +0 -55
  516. package/dist/src/observation/artifact.test.js +0 -121
  517. package/dist/src/observation/manager.test.js +0 -13
  518. package/dist/src/observation/redaction.test.js +0 -32
  519. package/dist/src/observation/retention.test.js +0 -118
  520. package/dist/src/observation/ring-buffer.test.js +0 -22
  521. package/dist/src/output.test.js +0 -53
  522. package/dist/src/package-exports.test.js +0 -112
  523. package/dist/src/pipeline/executor.test.js +0 -182
  524. package/dist/src/pipeline/steps/download.test.js +0 -102
  525. package/dist/src/pipeline/steps/fetch.test.js +0 -117
  526. package/dist/src/pipeline/template.test.js +0 -175
  527. package/dist/src/pipeline/transform.test.js +0 -133
  528. package/dist/src/plugin-manifest.test.js +0 -179
  529. package/dist/src/plugin-scaffold.test.js +0 -83
  530. package/dist/src/plugin.test.js +0 -1324
  531. package/dist/src/registry.test.js +0 -209
  532. package/dist/src/runtime-detect.test.js +0 -39
  533. package/dist/src/serialization.test.js +0 -78
  534. package/dist/src/snapshotFormatter.test.js +0 -521
  535. package/dist/src/tui.test.js +0 -19
  536. package/dist/src/update-check.test.js +0 -116
  537. package/dist/src/utils.test.js +0 -155
  538. package/dist/src/validate.test.js +0 -90
  539. package/dist/src/weixin-download.test.js +0 -45
@@ -0,0 +1,162 @@
1
+ export class ManifestSchemaError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'ManifestSchemaError';
5
+ }
6
+ }
7
+ function fail(context, path, reason) {
8
+ throw new ManifestSchemaError(`${context} ${path}: ${reason}`);
9
+ }
10
+ function markSeen(value, context, path, seen) {
11
+ if (seen.has(value))
12
+ fail(context, path, 'cyclic or repeated/shared object identities cannot be represented faithfully in JSON');
13
+ seen.add(value);
14
+ }
15
+ function denseArrayValues(value, context, path) {
16
+ if (Object.getPrototypeOf(value) !== Array.prototype) {
17
+ fail(context, path, 'must be a standard JSON array (custom array instances are not supported)');
18
+ }
19
+ if (Object.getOwnPropertySymbols(value).length > 0) {
20
+ fail(context, path, 'symbol-keyed array properties cannot be represented in JSON');
21
+ }
22
+ const propertyNames = Object.getOwnPropertyNames(value);
23
+ const expectedNames = new Set(['length']);
24
+ for (let index = 0; index < value.length; index += 1)
25
+ expectedNames.add(String(index));
26
+ for (const propertyName of propertyNames) {
27
+ if (!expectedNames.has(propertyName)) {
28
+ fail(context, `${path}.${propertyName}`, 'extra array properties cannot be represented in JSON');
29
+ }
30
+ }
31
+ if (propertyNames.length !== expectedNames.size) {
32
+ fail(context, path, 'sparse arrays cannot be represented faithfully in JSON');
33
+ }
34
+ const lengthDescriptor = Object.getOwnPropertyDescriptor(value, 'length');
35
+ if (!lengthDescriptor
36
+ || !('value' in lengthDescriptor)
37
+ || lengthDescriptor.value !== value.length
38
+ || lengthDescriptor.enumerable
39
+ || lengthDescriptor.configurable
40
+ || !lengthDescriptor.writable) {
41
+ fail(context, `${path}.length`, 'non-standard array length descriptors cannot be represented faithfully in JSON');
42
+ }
43
+ const values = [];
44
+ for (let index = 0; index < value.length; index += 1) {
45
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
46
+ if (!descriptor)
47
+ fail(context, `${path}[${index}]`, 'sparse arrays cannot be represented faithfully in JSON');
48
+ if (!('value' in descriptor)
49
+ || !descriptor.enumerable
50
+ || !descriptor.configurable
51
+ || !descriptor.writable) {
52
+ fail(context, `${path}[${index}]`, 'non-standard array item descriptors cannot be represented faithfully in JSON');
53
+ }
54
+ values.push(descriptor.value);
55
+ }
56
+ return values;
57
+ }
58
+ function canonicalJsonValue(value, context, path, seen) {
59
+ if (value === null)
60
+ return 'null';
61
+ if (typeof value === 'string')
62
+ return `string:${JSON.stringify(value)}`;
63
+ if (typeof value === 'boolean')
64
+ return `boolean:${value}`;
65
+ if (typeof value === 'number') {
66
+ if (!Number.isFinite(value))
67
+ fail(context, path, 'must be a finite JSON number');
68
+ if (Object.is(value, -0))
69
+ fail(context, path, 'negative zero cannot be represented faithfully in JSON');
70
+ return `number:${String(value)}`;
71
+ }
72
+ if (value === undefined)
73
+ fail(context, path, 'explicit undefined cannot be represented in JSON');
74
+ if (typeof value === 'function')
75
+ fail(context, path, 'functions cannot be represented in JSON');
76
+ if (typeof value === 'symbol')
77
+ fail(context, path, 'symbols cannot be represented in JSON');
78
+ if (typeof value === 'bigint')
79
+ fail(context, path, 'bigints cannot be represented in JSON');
80
+ markSeen(value, context, path, seen);
81
+ {
82
+ if (Array.isArray(value)) {
83
+ const items = denseArrayValues(value, context, path)
84
+ .map((item, index) => canonicalJsonValue(item, context, `${path}[${index}]`, seen));
85
+ return `array:[${items.join(',')}]`;
86
+ }
87
+ if (Object.getPrototypeOf(value) !== Object.prototype) {
88
+ fail(context, path, 'must be a plain JSON object (Date and custom instances are not supported)');
89
+ }
90
+ if (Object.getOwnPropertySymbols(value).length > 0) {
91
+ fail(context, path, 'symbol-keyed properties cannot be represented in JSON');
92
+ }
93
+ const propertyNames = Object.getOwnPropertyNames(value);
94
+ const entries = [];
95
+ for (const key of propertyNames.sort()) {
96
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
97
+ if (!descriptor?.enumerable
98
+ || !('value' in descriptor)
99
+ || !descriptor.configurable
100
+ || !descriptor.writable) {
101
+ fail(context, `${path}.${key}`, 'only enumerable data properties can be represented faithfully in JSON');
102
+ }
103
+ entries.push(`${JSON.stringify(key)}:${canonicalJsonValue(descriptor.value, context, `${path}.${key}`, seen)}`);
104
+ }
105
+ return `object:{${entries.join(',')}}`;
106
+ }
107
+ }
108
+ function optionalBoolean(value, context, path) {
109
+ if (value === undefined)
110
+ return false;
111
+ if (typeof value !== 'boolean')
112
+ fail(context, path, 'must be a boolean when present');
113
+ return value;
114
+ }
115
+ /**
116
+ * Canonical execution-relevant argument schema used by both manifest build and
117
+ * runtime hydration. Objects are key-order independent; arrays remain ordered.
118
+ */
119
+ export function canonicalizeManifestArgSchema(args, context) {
120
+ if (!Array.isArray(args))
121
+ fail(context, 'args', 'must be a dense array');
122
+ const seen = new Set();
123
+ markSeen(args, context, 'args', seen);
124
+ const argValues = denseArrayValues(args, context, 'args');
125
+ return argValues.map((arg, index) => {
126
+ const argContext = `${context} argument "${String(arg.name)}"`;
127
+ if (typeof arg.name !== 'string' || arg.name.length === 0)
128
+ fail(argContext, 'name', 'must be a non-empty string');
129
+ if (arg.type !== undefined && typeof arg.type !== 'string')
130
+ fail(argContext, 'type', 'must be a string when present');
131
+ if (arg.help !== undefined && typeof arg.help !== 'string')
132
+ fail(argContext, 'help', 'must be a string when present');
133
+ const hasDefault = Object.prototype.hasOwnProperty.call(arg, 'default');
134
+ const defaultValue = hasDefault
135
+ ? canonicalJsonValue(arg.default, argContext, 'default', seen)
136
+ : 'missing';
137
+ const hasChoices = Object.prototype.hasOwnProperty.call(arg, 'choices');
138
+ let choices = 'missing';
139
+ if (hasChoices) {
140
+ if (!Array.isArray(arg.choices))
141
+ fail(argContext, 'choices', 'must be an array of strings when present');
142
+ markSeen(arg.choices, argContext, 'choices', seen);
143
+ choices = `array:[${denseArrayValues(arg.choices, argContext, 'choices').map((choice, choiceIndex) => {
144
+ if (typeof choice !== 'string') {
145
+ fail(argContext, `choices[${choiceIndex}]`, 'choice values must be strings');
146
+ }
147
+ return `string:${JSON.stringify(choice)}`;
148
+ }).join(',')}]`;
149
+ }
150
+ return [
151
+ `arg:${index}`,
152
+ `name:${JSON.stringify(arg.name)}`,
153
+ `type:${JSON.stringify(arg.type ?? 'str')}`,
154
+ `default:${defaultValue}`,
155
+ `required:${optionalBoolean(arg.required, argContext, 'required')}`,
156
+ `valueRequired:${optionalBoolean(arg.valueRequired, argContext, 'valueRequired')}`,
157
+ `positional:${optionalBoolean(arg.positional, argContext, 'positional')}`,
158
+ `help:${JSON.stringify(arg.help ?? '')}`,
159
+ `choices:${choices}`,
160
+ ].join('|');
161
+ }).join('||');
162
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -15,7 +15,7 @@ export interface ManifestEntry {
15
15
  example?: string;
16
16
  domain?: string;
17
17
  strategy: string;
18
- browser: boolean;
18
+ browser: boolean | 'conditional';
19
19
  args: Array<{
20
20
  name: string;
21
21
  type?: string;
@@ -10,7 +10,13 @@ const SENSITIVE_HEADER_NAMES = new Set([
10
10
  'x-xsrf-token',
11
11
  ]);
12
12
  const SENSITIVE_FIELD_PATTERN = /(password|passwd|pwd|token|secret|authorization|cookie|set-cookie|api[_-]?key|access[_-]?token|refresh[_-]?token|session[_-]?id|csrf|xsrf)/i;
13
- const SENSITIVE_URL_PARAMS = /([?&])(token|key|secret|password|auth|access_token|api_key|session_id|csrf|xsrf)=[^&]*/gi;
13
+ const SENSITIVE_URL_PARAMS = /([?&])(token|key|secret|fingerprint|password|auth|access_token|api_key|session_id|csrf|xsrf)=[^&]*/gi;
14
+ function hasFingerprintFieldSegment(name) {
15
+ return name
16
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
17
+ .split(/[-_.\s]+/)
18
+ .some((segment) => segment.toLowerCase() === 'fingerprint');
19
+ }
14
20
  export function redactUrl(url) {
15
21
  return url.replace(SENSITIVE_URL_PARAMS, '$1$2=[REDACTED]');
16
22
  }
@@ -31,8 +37,8 @@ export function redactText(text, opts = {}) {
31
37
  const max = opts.maxStringLength ?? 50_000;
32
38
  let out = text
33
39
  .replace(/Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi, 'Bearer [REDACTED]')
34
- .replace(/(["'])(password|passwd|pwd|token|secret|api_key|apikey|access_token|session_id)\1\s*:\s*(["'])(.*?)\3/gi, '$1$2$1:$3[REDACTED]$3')
35
- .replace(/(token|secret|password|api_key|apikey|access_token|session_id)[=:]\s*['"]?[^'"\s,;}&]+['"]?/gi, '$1=[REDACTED]')
40
+ .replace(/(["'])(password|passwd|pwd|token|secret|fingerprint|api_key|apikey|access_token|session_id)\1\s*:\s*(["'])(.*?)\3/gi, '$1$2$1:$3[REDACTED]$3')
41
+ .replace(/(token|secret|fingerprint|password|api_key|apikey|access_token|session_id)\s*[=:]\s*['"]?[^'"\s,;}&]+['"]?/gi, '$1=[REDACTED]')
36
42
  .replace(/(cookie[=:]\s*)[^\n;]{3,}/gi, '$1[REDACTED]')
37
43
  .replace(/eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g, '[REDACTED_JWT]');
38
44
  if (out.length > max)
@@ -41,7 +47,7 @@ export function redactText(text, opts = {}) {
41
47
  }
42
48
  export function redactValue(value, opts = {}, keyHint, depth = 0) {
43
49
  const allow = new Set((opts.allowlist ?? []).map((key) => key.toLowerCase()));
44
- if (keyHint && SENSITIVE_FIELD_PATTERN.test(keyHint) && !allow.has(keyHint.toLowerCase())) {
50
+ if (keyHint && (SENSITIVE_FIELD_PATTERN.test(keyHint) || hasFingerprintFieldSegment(keyHint)) && !allow.has(keyHint.toLowerCase())) {
45
51
  return DEFAULT_REDACTION;
46
52
  }
47
53
  if (typeof value === 'string') {
@@ -1013,13 +1013,16 @@ function getPluginSource(dir) {
1013
1013
  }
1014
1014
  /** Parse a plugin source string into clone URL, repo name, and optional sub-plugin. */
1015
1015
  function parseSource(source) {
1016
+ // Strip either the legacy `bycli-plugin-` or the current `opencli-plugin-`
1017
+ // repo-name prefix when deriving the local plugin name.
1018
+ const PLUGIN_NAME_PREFIX = /^(?:bycli|opencli)-plugin-/;
1016
1019
  if (source.startsWith('file://')) {
1017
1020
  try {
1018
1021
  const localPath = path.resolve(fileURLToPath(source));
1019
1022
  return {
1020
1023
  type: 'local',
1021
1024
  localPath,
1022
- name: path.basename(localPath).replace(/^bycli-plugin-/, ''),
1025
+ name: path.basename(localPath).replace(PLUGIN_NAME_PREFIX, ''),
1023
1026
  };
1024
1027
  }
1025
1028
  catch {
@@ -1031,14 +1034,14 @@ function parseSource(source) {
1031
1034
  return {
1032
1035
  type: 'local',
1033
1036
  localPath,
1034
- name: path.basename(localPath).replace(/^bycli-plugin-/, ''),
1037
+ name: path.basename(localPath).replace(PLUGIN_NAME_PREFIX, ''),
1035
1038
  };
1036
1039
  }
1037
1040
  // github:user/repo/subplugin (monorepo specific sub-plugin)
1038
1041
  const githubSubMatch = source.match(/^github:([\w.-]+)\/([\w.-]+)\/([\w.-]+)$/);
1039
1042
  if (githubSubMatch) {
1040
1043
  const [, user, repo, sub] = githubSubMatch;
1041
- const name = repo.replace(/^bycli-plugin-/, '');
1044
+ const name = repo.replace(PLUGIN_NAME_PREFIX, '');
1042
1045
  return {
1043
1046
  type: 'git',
1044
1047
  cloneUrl: `https://github.com/${user}/${repo}.git`,
@@ -1050,7 +1053,7 @@ function parseSource(source) {
1050
1053
  const githubMatch = source.match(/^github:([\w.-]+)\/([\w.-]+)$/);
1051
1054
  if (githubMatch) {
1052
1055
  const [, user, repo] = githubMatch;
1053
- const name = repo.replace(/^bycli-plugin-/, '');
1056
+ const name = repo.replace(PLUGIN_NAME_PREFIX, '');
1054
1057
  return {
1055
1058
  type: 'git',
1056
1059
  cloneUrl: `https://github.com/${user}/${repo}.git`,
@@ -1061,7 +1064,7 @@ function parseSource(source) {
1061
1064
  const urlMatch = source.match(/^https?:\/\/github\.com\/([\w.-]+)\/([\w.-]+?)(?:\.git)?$/);
1062
1065
  if (urlMatch) {
1063
1066
  const [, user, repo] = urlMatch;
1064
- const name = repo.replace(/^bycli-plugin-/, '');
1067
+ const name = repo.replace(PLUGIN_NAME_PREFIX, '');
1065
1068
  return {
1066
1069
  type: 'git',
1067
1070
  cloneUrl: `https://github.com/${user}/${repo}.git`,
@@ -1075,7 +1078,7 @@ function parseSource(source) {
1075
1078
  const pathPart = sshUrlMatch[1];
1076
1079
  const segments = pathPart.split('/');
1077
1080
  const repoSegment = segments.pop();
1078
- const name = repoSegment.replace(/^bycli-plugin-/, '');
1081
+ const name = repoSegment.replace(PLUGIN_NAME_PREFIX, '');
1079
1082
  return { type: 'git', cloneUrl: source, name };
1080
1083
  }
1081
1084
  // git@host:user/repo.git (SCP-style)
@@ -1084,7 +1087,7 @@ function parseSource(source) {
1084
1087
  const pathPart = scpMatch[1];
1085
1088
  const segments = pathPart.split('/');
1086
1089
  const repoSegment = segments.pop();
1087
- const name = repoSegment.replace(/^bycli-plugin-/, '');
1090
+ const name = repoSegment.replace(PLUGIN_NAME_PREFIX, '');
1088
1091
  return { type: 'git', cloneUrl: source, name };
1089
1092
  }
1090
1093
  // Generic https/http git URL (non-GitHub hosts)
@@ -1093,7 +1096,7 @@ function parseSource(source) {
1093
1096
  const pathPart = genericHttpMatch[1];
1094
1097
  const segments = pathPart.split('/');
1095
1098
  const repoSegment = segments.pop();
1096
- const name = repoSegment.replace(/^bycli-plugin-/, '');
1099
+ const name = repoSegment.replace(PLUGIN_NAME_PREFIX, '');
1097
1100
  // Ensure clone URL ends with .git
1098
1101
  const cloneUrl = source.endsWith('.git') ? source : `${source}.git`;
1099
1102
  return { type: 'git', cloneUrl, name };
@@ -0,0 +1,29 @@
1
+ /**
2
+ * High-Level analyze module (M5a, 07-high-level-services.md · analyzeBrowser).
3
+ *
4
+ * Module-first (ADR-0004): drives the Page abstraction through the multi-step
5
+ * site probe (goto / wait / network capture / window-global probe / cookies) to
6
+ * assemble PageSignals, then calls the PURE analyzeSite() classifier. In-process
7
+ * async, no child process (07:50). Hosted by the main-repo daemon high-level
8
+ * surface (Codex A' verdict); dashboard-be only forwards.
9
+ *
10
+ * Timeout surfaces as `analyze_timeout` (07:52), never a runner error.
11
+ */
12
+ import type { IPage } from '../../types.js';
13
+ import { type AdapterRef, type AnalyzeReport } from '../../browser/analyze.js';
14
+ export interface AnalyzeInput {
15
+ url: string;
16
+ /** site-level settle window after load (ms); default 2000 (07 input). */
17
+ settleMs?: number;
18
+ }
19
+ export declare class AnalyzeTimeoutError extends Error {
20
+ readonly code = "analyze_timeout";
21
+ constructor(ms: number);
22
+ }
23
+ /**
24
+ * Collect PageSignals by driving the page, then classify with the pure analyzeSite.
25
+ * `registry` is the adapter registry used for nearest-adapter matching.
26
+ */
27
+ export declare function analyzeBrowser(page: IPage, registry: Map<string, AdapterRef>, input: AnalyzeInput): Promise<AnalyzeReport>;
28
+ /** Wrap analyzeBrowser with a deadline → AnalyzeTimeoutError (07:52 analyze_timeout). */
29
+ export declare function analyzeBrowserWithTimeout(page: IPage, registry: Map<string, AdapterRef>, input: AnalyzeInput, timeoutMs: number): Promise<AnalyzeReport>;
@@ -0,0 +1,91 @@
1
+ /**
2
+ * High-Level analyze module (M5a, 07-high-level-services.md · analyzeBrowser).
3
+ *
4
+ * Module-first (ADR-0004): drives the Page abstraction through the multi-step
5
+ * site probe (goto / wait / network capture / window-global probe / cookies) to
6
+ * assemble PageSignals, then calls the PURE analyzeSite() classifier. In-process
7
+ * async, no child process (07:50). Hosted by the main-repo daemon high-level
8
+ * surface (Codex A' verdict); dashboard-be only forwards.
9
+ *
10
+ * Timeout surfaces as `analyze_timeout` (07:52), never a runner error.
11
+ */
12
+ import { analyzeSite } from '../../browser/analyze.js';
13
+ import { generateInterceptorJs } from '../../interceptor.js';
14
+ export class AnalyzeTimeoutError extends Error {
15
+ code = 'analyze_timeout';
16
+ constructor(ms) {
17
+ super(`analyze timed out after ${ms}ms`);
18
+ this.name = 'AnalyzeTimeoutError';
19
+ }
20
+ }
21
+ const DEFAULT_SETTLE_MS = 2000;
22
+ /** Window-global + cookie + finalUrl probe (mirrors the CLI analyze probe). */
23
+ const PROBE_JS = `(function(){
24
+ return {
25
+ cookieNames: (document.cookie || '').split(';').map(function(c){ return c.trim().split('=')[0]; }).filter(Boolean),
26
+ initialState: {
27
+ __INITIAL_STATE__: typeof window.__INITIAL_STATE__ !== 'undefined',
28
+ __NUXT__: typeof window.__NUXT__ !== 'undefined',
29
+ __NEXT_DATA__: typeof window.__NEXT_DATA__ !== 'undefined',
30
+ __APOLLO_STATE__: typeof window.__APOLLO_STATE__ !== 'undefined',
31
+ },
32
+ title: document.title || '',
33
+ finalUrl: location.href,
34
+ };
35
+ })()`;
36
+ /**
37
+ * Collect PageSignals by driving the page, then classify with the pure analyzeSite.
38
+ * `registry` is the adapter registry used for nearest-adapter matching.
39
+ */
40
+ export async function analyzeBrowser(page, registry, input) {
41
+ const settleMs = input.settleMs ?? DEFAULT_SETTLE_MS;
42
+ // Prefer the session-level CDP network capture; fall back to an injected interceptor.
43
+ const hasSessionCapture = (await page.startNetworkCapture?.()) ?? false;
44
+ await page.goto(input.url);
45
+ await page.wait(Math.max(1, Math.round(settleMs / 1000)));
46
+ if (!hasSessionCapture) {
47
+ // match-all: analyze wants every json/text response, not a filtered subset.
48
+ try {
49
+ await page.evaluate(generateInterceptorJs('true'));
50
+ }
51
+ catch { /* non-fatal */ }
52
+ }
53
+ await page.wait(1);
54
+ const rawItems = ((await page.readNetworkCapture?.()) ?? []);
55
+ const networkEntries = rawItems.map((e) => ({
56
+ url: e.url ?? '',
57
+ status: e.status ?? 0,
58
+ contentType: e.ct ?? '',
59
+ bodyPreview: typeof e.body === 'string'
60
+ ? e.body.slice(0, 2000)
61
+ : (e.body ? JSON.stringify(e.body).slice(0, 2000) : null),
62
+ }));
63
+ const probe = await page.evaluate(PROBE_JS);
64
+ const browserCookieNames = (await page.getCookies({ url: probe.finalUrl || input.url }).catch(() => []))
65
+ .map((c) => c.name)
66
+ .filter(Boolean);
67
+ const cookieNames = [...new Set([...probe.cookieNames, ...browserCookieNames])];
68
+ const signals = {
69
+ requestedUrl: input.url,
70
+ finalUrl: probe.finalUrl,
71
+ cookieNames,
72
+ networkEntries,
73
+ initialState: probe.initialState,
74
+ title: probe.title,
75
+ };
76
+ return analyzeSite(signals, registry);
77
+ }
78
+ /** Wrap analyzeBrowser with a deadline → AnalyzeTimeoutError (07:52 analyze_timeout). */
79
+ export async function analyzeBrowserWithTimeout(page, registry, input, timeoutMs) {
80
+ let timer;
81
+ const timeout = new Promise((_, reject) => {
82
+ timer = setTimeout(() => reject(new AnalyzeTimeoutError(timeoutMs)), timeoutMs);
83
+ });
84
+ try {
85
+ return await Promise.race([analyzeBrowser(page, registry, input), timeout]);
86
+ }
87
+ finally {
88
+ if (timer)
89
+ clearTimeout(timer);
90
+ }
91
+ }
@@ -0,0 +1,125 @@
1
+ /**
2
+ * High-Level init module (M5b · createAdapterDraft, 07-high-level-services.md).
3
+ *
4
+ * Hosted main-repo side (Codex A' verdict): FS writes live here, not in dashboard-be.
5
+ * Uses the PURE pieces from @sovovs/bycli-recorder-core (validate/render/provenance/
6
+ * dry-run); this module adds the IO: overwrite/shadow check, write to disk, commit
7
+ * marker, config-snapshot injection.
8
+ *
9
+ * SCOPE (甲 / phase-1): writes report + adapter with an embedded provenance header
10
+ * and a commit marker, so a visible adapter always carries provenance (07 forbids an
11
+ * un-provenanced adapter). The FULL multi-file atomic write transaction (txn manifest
12
+ * + fsync + atomic rename) and the crash-recovery table (07:97-104) are deferred —
13
+ * tracked as M5b follow-up. Until then writes are direct (non-atomic), which is
14
+ * acceptable for a single-user local tool with the provenance+marker guard.
15
+ */
16
+ import { type DryRunDiff } from '@sovovs/bycli-recorder-core';
17
+ /**
18
+ * High-Level init input (be → daemon /v1/init). Per 03:74 these are the DERIVED draft inputs:
19
+ * be derives `domain`/`strategy` from the selected RankCandidate (the UI-facing Recorder
20
+ * InitRequest is select-only and never carries them). `browser` is normally omitted and
21
+ * derived from `strategy` (COOKIE/UI ⇒ true), matching registry normalizeCommand; pass it
22
+ * only to force a value.
23
+ */
24
+ export interface InitInput {
25
+ /** site/command */
26
+ name: string;
27
+ /** derived by be from the candidate endpoint host (03:74). */
28
+ domain?: string;
29
+ /** derived by be from the candidate: authRequired ⇒ COOKIE else PUBLIC (03:74). */
30
+ strategy?: 'PUBLIC' | 'COOKIE' | 'UI';
31
+ /** optional explicit override; default is derived from strategy (COOKIE/UI ⇒ true). */
32
+ browser?: boolean;
33
+ /** ADR-0005: required when writePolicy=write. */
34
+ writePolicy?: 'dry-run' | 'write';
35
+ responsibleUseAcknowledgedAt?: number;
36
+ /** LLM 合成产物(MVP):有则填进 adapter 模板留白(func/columns/...);无则空骨架(行为不变)。 */
37
+ funcBody?: string;
38
+ columns?: Array<{
39
+ name: string;
40
+ }>;
41
+ description?: string;
42
+ access?: 'read' | 'write';
43
+ /** 合成所用模型;标进 provenance(@generated-by adapter-recorder-llm + @model)。 */
44
+ llmModel?: string;
45
+ }
46
+ /** Config snapshot injected into every RecorderReport (09). */
47
+ export interface ConfigSnapshot {
48
+ releaseChannel: 'stable' | 'preview';
49
+ localExperimentProfile: 'off' | 'control' | 'candidate';
50
+ configSnapshotVersion: number;
51
+ }
52
+ export interface RecorderReport {
53
+ adapterPath: string;
54
+ reportPath: string;
55
+ warnings: string[];
56
+ responsibleUseAcknowledgedAt: number;
57
+ releaseChannel: string;
58
+ localExperimentProfile: string;
59
+ configSnapshotVersion: number;
60
+ }
61
+ export type InitResult = {
62
+ ok: true;
63
+ report: RecorderReport;
64
+ dryRun: DryRunDiff;
65
+ generatedSource: string;
66
+ } | {
67
+ ok: false;
68
+ errorCode: 'validation_failed' | 'responsible_use_required';
69
+ reason: string;
70
+ };
71
+ /** Transaction manifest persisted under the recorder `.txn` dir (07:99). The crash-recovery
72
+ * sweep (recoverInitTransactions) reads these to resolve interrupted writes. */
73
+ export interface InitTxnManifest {
74
+ txnId: string;
75
+ adapterPath: string;
76
+ reportPath: string;
77
+ markerPath: string;
78
+ adapterSha256: string;
79
+ reportSha256: string;
80
+ state: 'preparing' | 'committed';
81
+ createdAt: number;
82
+ }
83
+ /**
84
+ * Create an adapter draft. With writePolicy 'dry-run' (default) nothing is written —
85
+ * only the diff + intended report is returned. With 'write' it requires
86
+ * responsibleUseAcknowledgedAt (ADR-0005) and writes report + adapter to disk.
87
+ */
88
+ export declare function createAdapterDraft(input: InitInput, snapshot?: ConfigSnapshot): InitResult;
89
+ export interface SaveAdapterInput {
90
+ /** site/command */
91
+ name: string;
92
+ /** 完整 adapter 源码(已审阅;若无 provenance 头会自动补)。 */
93
+ source: string;
94
+ /** 生成所用模型(标进 provenance)。 */
95
+ llmModel?: string;
96
+ }
97
+ export type SaveAdapterResult = {
98
+ ok: true;
99
+ adapterPath: string;
100
+ reportPath: string;
101
+ } | {
102
+ ok: false;
103
+ errorCode: 'validation_failed';
104
+ reason: string;
105
+ };
106
+ export declare function saveAdapterSource(input: SaveAdapterInput): SaveAdapterResult;
107
+ export interface InitRecoveryResult {
108
+ scanned: number;
109
+ committed: number;
110
+ rolledForward: number;
111
+ rolledBack: number;
112
+ quarantined: number;
113
+ }
114
+ /**
115
+ * Resolve init write transactions interrupted by a crash (07:106-117). Scans every
116
+ * ~/.bycli/sites/<site>/recorder/.txn/*.manifest.json, observes the referenced artifacts, and
117
+ * applies decideInitRecovery: write/refresh the marker for a provenance-complete transaction,
118
+ * quarantine an unprovenanced/corrupt adapter, or roll back an empty one. Only manifest paths
119
+ * (and adapters with the provenance header) are touched — unknown user files are never deleted.
120
+ * Designed to run once at daemon startup (extends the verify reap).
121
+ */
122
+ export declare function recoverInitTransactions(opts?: {
123
+ sitesRoot?: string;
124
+ log?: (msg: string) => void;
125
+ }): InitRecoveryResult;