@jackwener/opencli 1.6.9 → 1.7.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.
- package/README.md +128 -59
- package/README.zh-CN.md +134 -78
- package/dist/clis/_shared/common.d.ts +3 -0
- package/dist/clis/_shared/common.js +22 -0
- package/dist/clis/bilibili/hot.js +35 -0
- package/dist/clis/bluesky/feeds.d.ts +1 -0
- package/dist/clis/bluesky/feeds.js +27 -0
- package/dist/clis/bluesky/followers.d.ts +1 -0
- package/dist/clis/bluesky/followers.js +27 -0
- package/dist/clis/bluesky/following.d.ts +1 -0
- package/dist/clis/bluesky/following.js +27 -0
- package/dist/clis/bluesky/profile.d.ts +1 -0
- package/dist/clis/bluesky/profile.js +29 -0
- package/dist/clis/bluesky/search.d.ts +1 -0
- package/dist/clis/bluesky/search.js +28 -0
- package/dist/clis/bluesky/starter-packs.d.ts +1 -0
- package/dist/clis/bluesky/starter-packs.js +28 -0
- package/dist/clis/bluesky/thread.d.ts +1 -0
- package/dist/clis/bluesky/thread.js +30 -0
- package/dist/clis/bluesky/trending.d.ts +1 -0
- package/dist/clis/bluesky/trending.js +19 -0
- package/dist/clis/bluesky/user.d.ts +1 -0
- package/dist/clis/bluesky/user.js +33 -0
- package/dist/clis/cnki/search.d.ts +1 -0
- package/dist/clis/cnki/search.js +60 -0
- package/dist/clis/cnki/search.test.d.ts +1 -0
- package/dist/clis/cnki/search.test.js +18 -0
- package/dist/clis/devto/tag.d.ts +1 -0
- package/dist/clis/devto/tag.js +32 -0
- package/dist/clis/devto/top.d.ts +1 -0
- package/dist/clis/devto/top.js +26 -0
- package/dist/clis/devto/user.d.ts +1 -0
- package/dist/clis/devto/user.js +31 -0
- package/dist/clis/dictionary/examples.d.ts +1 -0
- package/dist/clis/dictionary/examples.js +27 -0
- package/dist/clis/dictionary/search.d.ts +1 -0
- package/dist/clis/dictionary/search.js +29 -0
- package/dist/clis/dictionary/synonyms.d.ts +1 -0
- package/dist/clis/dictionary/synonyms.js +27 -0
- package/dist/clis/douban/subject.d.ts +1 -0
- package/dist/clis/douban/subject.js +118 -0
- package/dist/clis/douban/top250.d.ts +1 -0
- package/dist/clis/douban/top250.js +67 -0
- package/dist/clis/facebook/add-friend.d.ts +1 -0
- package/dist/clis/facebook/add-friend.js +43 -0
- package/dist/clis/facebook/events.d.ts +1 -0
- package/dist/clis/facebook/events.js +40 -0
- package/dist/clis/facebook/feed.d.ts +1 -0
- package/dist/clis/facebook/feed.js +59 -0
- package/dist/clis/facebook/friends.d.ts +1 -0
- package/dist/clis/facebook/friends.js +38 -0
- package/dist/clis/facebook/groups.d.ts +1 -0
- package/dist/clis/facebook/groups.js +46 -0
- package/dist/clis/facebook/join-group.d.ts +1 -0
- package/dist/clis/facebook/join-group.js +44 -0
- package/dist/clis/facebook/memories.d.ts +1 -0
- package/dist/clis/facebook/memories.js +35 -0
- package/dist/clis/facebook/notifications.d.ts +1 -0
- package/dist/clis/facebook/notifications.js +36 -0
- package/dist/clis/facebook/profile.d.ts +1 -0
- package/dist/clis/facebook/profile.js +37 -0
- package/dist/clis/facebook/search.d.ts +1 -0
- package/dist/clis/facebook/search.js +38 -0
- package/dist/clis/facebook/search.test.d.ts +1 -1
- package/dist/clis/facebook/search.test.js +6 -9
- package/dist/clis/gitee/index.d.ts +3 -0
- package/dist/clis/gitee/index.js +3 -0
- package/dist/clis/gitee/search.d.ts +1 -0
- package/dist/clis/gitee/search.js +136 -0
- package/dist/clis/gitee/trending.d.ts +1 -0
- package/dist/clis/gitee/trending.js +567 -0
- package/dist/clis/gitee/user.d.ts +1 -0
- package/dist/clis/gitee/user.js +199 -0
- package/dist/clis/gitee/user.test.d.ts +1 -0
- package/dist/clis/gitee/user.test.js +63 -0
- package/dist/clis/hackernews/ask.d.ts +1 -0
- package/dist/clis/hackernews/ask.js +29 -0
- package/dist/clis/hackernews/best.d.ts +1 -0
- package/dist/clis/hackernews/best.js +29 -0
- package/dist/clis/hackernews/jobs.d.ts +1 -0
- package/dist/clis/hackernews/jobs.js +27 -0
- package/dist/clis/hackernews/new.d.ts +1 -0
- package/dist/clis/hackernews/new.js +29 -0
- package/dist/clis/hackernews/search.d.ts +1 -0
- package/dist/clis/hackernews/search.js +36 -0
- package/dist/clis/hackernews/show.d.ts +1 -0
- package/dist/clis/hackernews/show.js +29 -0
- package/dist/clis/hackernews/top.d.ts +1 -0
- package/dist/clis/hackernews/top.js +29 -0
- package/dist/clis/hackernews/user.d.ts +1 -0
- package/dist/clis/hackernews/user.js +22 -0
- package/dist/clis/hupu/hot.d.ts +1 -0
- package/dist/clis/hupu/hot.js +40 -0
- package/dist/clis/instagram/comment.d.ts +1 -0
- package/dist/clis/instagram/comment.js +47 -0
- package/dist/clis/instagram/explore.d.ts +1 -0
- package/dist/clis/instagram/explore.js +41 -0
- package/dist/clis/instagram/follow.d.ts +1 -0
- package/dist/clis/instagram/follow.js +43 -0
- package/dist/clis/instagram/followers.d.ts +1 -0
- package/dist/clis/instagram/followers.js +45 -0
- package/dist/clis/instagram/following.d.ts +1 -0
- package/dist/clis/instagram/following.js +45 -0
- package/dist/clis/instagram/like.d.ts +1 -0
- package/dist/clis/instagram/like.js +45 -0
- package/dist/clis/instagram/profile.d.ts +1 -0
- package/dist/clis/instagram/profile.js +39 -0
- package/dist/clis/instagram/save.d.ts +1 -0
- package/dist/clis/instagram/save.js +45 -0
- package/dist/clis/instagram/saved.d.ts +1 -0
- package/dist/clis/instagram/saved.js +38 -0
- package/dist/clis/instagram/search.d.ts +1 -0
- package/dist/clis/instagram/search.js +38 -0
- package/dist/clis/instagram/unfollow.d.ts +1 -0
- package/dist/clis/instagram/unfollow.js +40 -0
- package/dist/clis/instagram/unlike.d.ts +1 -0
- package/dist/clis/instagram/unlike.js +45 -0
- package/dist/clis/instagram/unsave.d.ts +1 -0
- package/dist/clis/instagram/unsave.js +45 -0
- package/dist/clis/instagram/user.d.ts +1 -0
- package/dist/clis/instagram/user.js +48 -0
- package/dist/clis/jd/add-cart.d.ts +1 -0
- package/dist/clis/jd/add-cart.js +71 -0
- package/dist/clis/jd/cart.d.ts +1 -0
- package/dist/clis/jd/cart.js +79 -0
- package/dist/clis/jd/commands.test.d.ts +5 -0
- package/dist/clis/jd/commands.test.js +64 -0
- package/dist/clis/jd/detail.d.ts +1 -0
- package/dist/clis/jd/detail.js +62 -0
- package/dist/clis/jd/reviews.d.ts +1 -0
- package/dist/clis/jd/reviews.js +54 -0
- package/dist/clis/jd/search.d.ts +1 -0
- package/dist/clis/jd/search.js +65 -0
- package/dist/clis/jianyu/detail.d.ts +1 -0
- package/dist/clis/jianyu/detail.js +20 -0
- package/dist/clis/jianyu/search.d.ts +41 -4
- package/dist/clis/jianyu/search.js +458 -96
- package/dist/clis/jianyu/search.test.js +105 -0
- package/dist/clis/jianyu/shared/china-bid-search.d.ts +12 -0
- package/dist/clis/jianyu/shared/china-bid-search.js +165 -0
- package/dist/clis/jianyu/shared/procurement-contract.d.ts +68 -0
- package/dist/clis/jianyu/shared/procurement-contract.js +324 -0
- package/dist/clis/jianyu/shared/procurement-contract.test.d.ts +1 -0
- package/dist/clis/jianyu/shared/procurement-contract.test.js +72 -0
- package/dist/clis/jianyu/shared/procurement-detail.d.ts +6 -0
- package/dist/clis/jianyu/shared/procurement-detail.js +92 -0
- package/dist/clis/jianyu/shared/procurement-detail.test.d.ts +1 -0
- package/dist/clis/jianyu/shared/procurement-detail.test.js +72 -0
- package/dist/clis/jike/post.d.ts +1 -0
- package/dist/clis/jike/post.js +61 -0
- package/dist/clis/jike/topic.d.ts +1 -0
- package/dist/clis/jike/topic.js +51 -0
- package/dist/clis/jike/user.d.ts +1 -0
- package/dist/clis/jike/user.js +50 -0
- package/dist/clis/jimeng/generate.d.ts +1 -0
- package/dist/clis/jimeng/generate.js +83 -0
- package/dist/clis/jimeng/history.d.ts +1 -0
- package/dist/clis/jimeng/history.js +47 -0
- package/dist/clis/jimeng/new.d.ts +1 -0
- package/dist/clis/jimeng/new.js +43 -0
- package/dist/clis/jimeng/workspaces.d.ts +1 -0
- package/dist/clis/jimeng/workspaces.js +41 -0
- package/dist/clis/linux-do/categories.d.ts +1 -0
- package/dist/clis/linux-do/categories.js +65 -0
- package/dist/clis/linux-do/search.d.ts +1 -0
- package/dist/clis/linux-do/search.js +41 -0
- package/dist/clis/linux-do/tags.d.ts +1 -0
- package/dist/clis/linux-do/tags.js +39 -0
- package/dist/clis/linux-do/topic-content.test.js +5 -5
- package/dist/clis/linux-do/topic.d.ts +1 -0
- package/dist/clis/linux-do/topic.js +56 -0
- package/dist/clis/linux-do/user-posts.d.ts +1 -0
- package/dist/clis/linux-do/user-posts.js +61 -0
- package/dist/clis/linux-do/user-topics.d.ts +1 -0
- package/dist/clis/linux-do/user-topics.js +48 -0
- package/dist/clis/lobsters/active.d.ts +1 -0
- package/dist/clis/lobsters/active.js +26 -0
- package/dist/clis/lobsters/hot.d.ts +1 -0
- package/dist/clis/lobsters/hot.js +26 -0
- package/dist/clis/lobsters/newest.d.ts +1 -0
- package/dist/clis/lobsters/newest.js +26 -0
- package/dist/clis/lobsters/tag.d.ts +1 -0
- package/dist/clis/lobsters/tag.js +32 -0
- package/dist/clis/pixiv/detail.d.ts +1 -0
- package/dist/clis/pixiv/detail.js +58 -0
- package/dist/clis/pixiv/ranking.d.ts +1 -0
- package/dist/clis/pixiv/ranking.js +59 -0
- package/dist/clis/pixiv/user.d.ts +1 -0
- package/dist/clis/pixiv/user.js +52 -0
- package/dist/clis/reddit/frontpage.d.ts +1 -0
- package/dist/clis/reddit/frontpage.js +31 -0
- package/dist/clis/reddit/hot.d.ts +1 -0
- package/dist/clis/reddit/hot.js +45 -0
- package/dist/clis/reddit/popular.d.ts +1 -0
- package/dist/clis/reddit/popular.js +41 -0
- package/dist/clis/reddit/search.d.ts +1 -0
- package/dist/clis/reddit/search.js +65 -0
- package/dist/clis/reddit/subreddit.d.ts +1 -0
- package/dist/clis/reddit/subreddit.js +52 -0
- package/dist/clis/reddit/user-comments.d.ts +1 -0
- package/dist/clis/reddit/user-comments.js +44 -0
- package/dist/clis/reddit/user-posts.d.ts +1 -0
- package/dist/clis/reddit/user-posts.js +42 -0
- package/dist/clis/reddit/user.d.ts +1 -0
- package/dist/clis/reddit/user.js +37 -0
- package/dist/clis/stackoverflow/bounties.d.ts +1 -0
- package/dist/clis/stackoverflow/bounties.js +27 -0
- package/dist/clis/stackoverflow/hot.d.ts +1 -0
- package/dist/clis/stackoverflow/hot.js +24 -0
- package/dist/clis/stackoverflow/search.d.ts +1 -0
- package/dist/clis/stackoverflow/search.js +27 -0
- package/dist/clis/stackoverflow/unanswered.d.ts +1 -0
- package/dist/clis/stackoverflow/unanswered.js +26 -0
- package/dist/clis/steam/top-sellers.d.ts +1 -0
- package/dist/clis/steam/top-sellers.js +25 -0
- package/dist/clis/taobao/add-cart.d.ts +1 -0
- package/dist/clis/taobao/add-cart.js +149 -0
- package/dist/clis/taobao/cart.d.ts +1 -0
- package/dist/clis/taobao/cart.js +95 -0
- package/dist/clis/taobao/commands.test.d.ts +5 -0
- package/dist/clis/taobao/commands.test.js +64 -0
- package/dist/clis/taobao/detail.d.ts +1 -0
- package/dist/clis/taobao/detail.js +70 -0
- package/dist/clis/taobao/reviews.d.ts +1 -0
- package/dist/clis/taobao/reviews.js +76 -0
- package/dist/clis/taobao/search.d.ts +1 -0
- package/dist/clis/taobao/search.js +96 -0
- package/dist/clis/tiktok/comment.d.ts +1 -0
- package/dist/clis/tiktok/comment.js +57 -0
- package/dist/clis/tiktok/explore.d.ts +1 -0
- package/dist/clis/tiktok/explore.js +35 -0
- package/dist/clis/tiktok/follow.d.ts +1 -0
- package/dist/clis/tiktok/follow.js +39 -0
- package/dist/clis/tiktok/following.d.ts +1 -0
- package/dist/clis/tiktok/following.js +42 -0
- package/dist/clis/tiktok/friends.d.ts +1 -0
- package/dist/clis/tiktok/friends.js +43 -0
- package/dist/clis/tiktok/like.d.ts +1 -0
- package/dist/clis/tiktok/like.js +33 -0
- package/dist/clis/tiktok/live.d.ts +1 -0
- package/dist/clis/tiktok/live.js +47 -0
- package/dist/clis/tiktok/notifications.d.ts +1 -0
- package/dist/clis/tiktok/notifications.js +49 -0
- package/dist/clis/tiktok/profile.d.ts +1 -0
- package/dist/clis/tiktok/profile.js +54 -0
- package/dist/clis/tiktok/save.d.ts +1 -0
- package/dist/clis/tiktok/save.js +29 -0
- package/dist/clis/tiktok/search.d.ts +1 -0
- package/dist/clis/tiktok/search.js +39 -0
- package/dist/clis/tiktok/unfollow.d.ts +1 -0
- package/dist/clis/tiktok/unfollow.js +44 -0
- package/dist/clis/tiktok/unlike.d.ts +1 -0
- package/dist/clis/tiktok/unlike.js +33 -0
- package/dist/clis/tiktok/unsave.d.ts +1 -0
- package/dist/clis/tiktok/unsave.js +31 -0
- package/dist/clis/tiktok/user.d.ts +1 -0
- package/dist/clis/tiktok/user.js +41 -0
- package/dist/clis/v2ex/hot.d.ts +1 -0
- package/dist/clis/v2ex/hot.js +25 -0
- package/dist/clis/v2ex/latest.d.ts +1 -0
- package/dist/clis/v2ex/latest.js +25 -0
- package/dist/clis/v2ex/member.d.ts +1 -0
- package/dist/clis/v2ex/member.js +27 -0
- package/dist/clis/v2ex/node.d.ts +1 -0
- package/dist/clis/v2ex/node.js +38 -0
- package/dist/clis/v2ex/nodes.d.ts +1 -0
- package/dist/clis/v2ex/nodes.js +25 -0
- package/dist/clis/v2ex/replies.d.ts +1 -0
- package/dist/clis/v2ex/replies.js +26 -0
- package/dist/clis/v2ex/topic.d.ts +1 -0
- package/dist/clis/v2ex/topic.js +30 -0
- package/dist/clis/v2ex/user.d.ts +1 -0
- package/dist/clis/v2ex/user.js +33 -0
- package/dist/clis/xiaoe/catalog.d.ts +1 -0
- package/dist/clis/xiaoe/catalog.js +161 -0
- package/dist/clis/xiaoe/content.d.ts +1 -0
- package/dist/clis/xiaoe/content.js +39 -0
- package/dist/clis/xiaoe/courses.d.ts +1 -0
- package/dist/clis/xiaoe/courses.js +69 -0
- package/dist/clis/xiaoe/detail.d.ts +1 -0
- package/dist/clis/xiaoe/detail.js +35 -0
- package/dist/clis/xiaoe/play-url.d.ts +1 -0
- package/dist/clis/xiaoe/play-url.js +120 -0
- package/dist/clis/xiaohongshu/feed.d.ts +1 -0
- package/dist/clis/xiaohongshu/feed.js +32 -0
- package/dist/clis/xiaohongshu/notifications.d.ts +1 -0
- package/dist/clis/xiaohongshu/notifications.js +38 -0
- package/dist/clis/xueqiu/earnings-date.d.ts +1 -0
- package/dist/clis/xueqiu/earnings-date.js +61 -0
- package/dist/clis/xueqiu/feed.d.ts +1 -0
- package/dist/clis/xueqiu/feed.js +48 -0
- package/dist/clis/xueqiu/groups.d.ts +1 -0
- package/dist/clis/xueqiu/groups.js +25 -0
- package/dist/clis/xueqiu/hot-stock.d.ts +1 -0
- package/dist/clis/xueqiu/hot-stock.js +44 -0
- package/dist/clis/xueqiu/hot.d.ts +1 -0
- package/dist/clis/xueqiu/hot.js +44 -0
- package/dist/clis/xueqiu/kline.d.ts +1 -0
- package/dist/clis/xueqiu/kline.js +64 -0
- package/dist/clis/xueqiu/search.d.ts +1 -0
- package/dist/clis/xueqiu/search.js +49 -0
- package/dist/clis/xueqiu/stock.d.ts +1 -0
- package/dist/clis/xueqiu/stock.js +72 -0
- package/dist/clis/xueqiu/watchlist.d.ts +1 -0
- package/dist/clis/xueqiu/watchlist.js +45 -0
- package/dist/clis/zhihu/hot.d.ts +1 -0
- package/dist/clis/zhihu/hot.js +43 -0
- package/dist/clis/zhihu/search.d.ts +1 -0
- package/dist/clis/zhihu/search.js +52 -0
- package/dist/src/browser/bridge.js +1 -1
- package/dist/src/browser/daemon-client.d.ts +16 -4
- package/dist/src/browser/daemon-client.js +33 -15
- package/dist/src/browser/daemon-client.test.js +0 -3
- package/dist/src/browser/dom-helpers.test.js +3 -2
- package/dist/src/browser/errors.d.ts +26 -1
- package/dist/src/browser/errors.js +40 -7
- package/dist/src/browser/errors.test.d.ts +1 -0
- package/dist/src/browser/errors.test.js +51 -0
- package/dist/src/browser/page.d.ts +9 -8
- package/dist/src/browser/page.js +33 -31
- package/dist/src/browser.test.js +25 -6
- package/dist/src/build-manifest.d.ts +5 -11
- package/dist/src/build-manifest.js +6 -75
- package/dist/src/build-manifest.test.js +1 -39
- package/dist/src/cascade.js +3 -2
- package/dist/src/cli.d.ts +3 -3
- package/dist/src/cli.js +71 -71
- package/dist/src/cli.test.js +20 -15
- package/dist/src/clis/binance/asks.d.ts +1 -0
- package/dist/src/clis/binance/asks.js +20 -0
- package/dist/src/clis/binance/commands.test.d.ts +3 -1
- package/dist/src/clis/binance/commands.test.js +10 -6
- package/dist/src/clis/binance/depth.d.ts +1 -0
- package/dist/src/clis/binance/depth.js +20 -0
- package/dist/src/clis/binance/gainers.d.ts +1 -0
- package/dist/src/clis/binance/gainers.js +21 -0
- package/dist/src/clis/binance/klines.d.ts +1 -0
- package/dist/src/clis/binance/klines.js +20 -0
- package/dist/src/clis/binance/losers.d.ts +1 -0
- package/dist/src/clis/binance/losers.js +21 -0
- package/dist/src/clis/binance/pairs.d.ts +1 -0
- package/dist/src/clis/binance/pairs.js +20 -0
- package/dist/src/clis/binance/price.d.ts +1 -0
- package/dist/src/clis/binance/price.js +17 -0
- package/dist/src/clis/binance/prices.d.ts +1 -0
- package/dist/src/clis/binance/prices.js +18 -0
- package/dist/src/clis/binance/ticker.d.ts +1 -0
- package/dist/src/clis/binance/ticker.js +20 -0
- package/dist/src/clis/binance/top.d.ts +1 -0
- package/dist/src/clis/binance/top.js +20 -0
- package/dist/src/clis/binance/trades.d.ts +1 -0
- package/dist/src/clis/binance/trades.js +19 -0
- package/dist/src/commands/daemon.d.ts +2 -6
- package/dist/src/commands/daemon.js +2 -58
- package/dist/src/commands/daemon.test.js +24 -120
- package/dist/src/completion-fast.d.ts +25 -0
- package/dist/src/completion-fast.js +140 -0
- package/dist/src/completion.d.ts +1 -0
- package/dist/src/completion.js +1 -0
- package/dist/src/constants.d.ts +0 -2
- package/dist/src/constants.js +0 -2
- package/dist/src/daemon.d.ts +1 -1
- package/dist/src/daemon.js +2 -15
- package/dist/src/diagnostic.test.js +2 -2
- package/dist/src/discovery.d.ts +3 -3
- package/dist/src/discovery.js +34 -97
- package/dist/src/download/index.d.ts +1 -1
- package/dist/src/engine.test.js +4 -19
- package/dist/src/execution.js +5 -1
- package/dist/src/generate-verified.d.ts +105 -0
- package/dist/src/generate-verified.js +696 -0
- package/dist/src/generate-verified.test.d.ts +1 -0
- package/dist/src/generate-verified.test.js +925 -0
- package/dist/src/generate.d.ts +9 -1
- package/dist/src/generate.js +2 -2
- package/dist/src/main.js +65 -12
- package/dist/src/pipeline/steps/download.d.ts +1 -17
- package/dist/src/pipeline/steps/download.js +20 -31
- package/dist/src/pipeline/steps/intercept.d.ts +1 -1
- package/dist/src/pipeline/steps/intercept.js +1 -1
- package/dist/src/pipeline/steps/tap.d.ts +1 -1
- package/dist/src/pipeline/steps/tap.js +1 -1
- package/dist/src/plugin-scaffold.d.ts +2 -2
- package/dist/src/plugin-scaffold.js +24 -21
- package/dist/src/plugin-scaffold.test.js +1 -1
- package/dist/src/plugin.d.ts +1 -1
- package/dist/src/plugin.js +4 -6
- package/dist/src/plugin.test.js +31 -31
- package/dist/src/record.js +26 -25
- package/dist/src/runtime-detect.js +3 -7
- package/dist/src/scripts/framework.d.ts +3 -0
- package/dist/src/scripts/framework.js +8 -4
- package/dist/src/scripts/store.d.ts +5 -1
- package/dist/src/scripts/store.js +5 -1
- package/dist/src/skill-generate.d.ts +30 -0
- package/dist/src/skill-generate.js +75 -0
- package/dist/src/skill-generate.test.d.ts +1 -0
- package/dist/src/skill-generate.test.js +173 -0
- package/dist/src/synthesize.d.ts +1 -1
- package/dist/src/synthesize.js +7 -8
- package/dist/src/types.d.ts +3 -1
- package/package.json +4 -3
- package/dist/clis/bilibili/hot.yaml +0 -38
- package/dist/clis/bluesky/feeds.yaml +0 -29
- package/dist/clis/bluesky/followers.yaml +0 -33
- package/dist/clis/bluesky/following.yaml +0 -33
- package/dist/clis/bluesky/profile.yaml +0 -27
- package/dist/clis/bluesky/search.yaml +0 -34
- package/dist/clis/bluesky/starter-packs.yaml +0 -34
- package/dist/clis/bluesky/thread.yaml +0 -32
- package/dist/clis/bluesky/trending.yaml +0 -27
- package/dist/clis/bluesky/user.yaml +0 -34
- package/dist/clis/devto/tag.yaml +0 -34
- package/dist/clis/devto/top.yaml +0 -29
- package/dist/clis/devto/user.yaml +0 -33
- package/dist/clis/dictionary/examples.yaml +0 -25
- package/dist/clis/dictionary/search.yaml +0 -27
- package/dist/clis/dictionary/synonyms.yaml +0 -25
- package/dist/clis/douban/subject.yaml +0 -107
- package/dist/clis/douban/top250.yaml +0 -70
- package/dist/clis/facebook/add-friend.yaml +0 -43
- package/dist/clis/facebook/events.yaml +0 -44
- package/dist/clis/facebook/feed.yaml +0 -63
- package/dist/clis/facebook/friends.yaml +0 -42
- package/dist/clis/facebook/groups.yaml +0 -50
- package/dist/clis/facebook/join-group.yaml +0 -44
- package/dist/clis/facebook/memories.yaml +0 -39
- package/dist/clis/facebook/notifications.yaml +0 -40
- package/dist/clis/facebook/profile.yaml +0 -37
- package/dist/clis/facebook/search.yaml +0 -47
- package/dist/clis/hackernews/ask.yaml +0 -38
- package/dist/clis/hackernews/best.yaml +0 -38
- package/dist/clis/hackernews/jobs.yaml +0 -36
- package/dist/clis/hackernews/new.yaml +0 -38
- package/dist/clis/hackernews/search.yaml +0 -44
- package/dist/clis/hackernews/show.yaml +0 -38
- package/dist/clis/hackernews/top.yaml +0 -38
- package/dist/clis/hackernews/user.yaml +0 -25
- package/dist/clis/hupu/hot.yaml +0 -43
- package/dist/clis/instagram/comment.yaml +0 -52
- package/dist/clis/instagram/explore.yaml +0 -43
- package/dist/clis/instagram/follow.yaml +0 -41
- package/dist/clis/instagram/followers.yaml +0 -51
- package/dist/clis/instagram/following.yaml +0 -51
- package/dist/clis/instagram/like.yaml +0 -46
- package/dist/clis/instagram/profile.yaml +0 -42
- package/dist/clis/instagram/save.yaml +0 -46
- package/dist/clis/instagram/saved.yaml +0 -40
- package/dist/clis/instagram/search.yaml +0 -44
- package/dist/clis/instagram/unfollow.yaml +0 -38
- package/dist/clis/instagram/unlike.yaml +0 -46
- package/dist/clis/instagram/unsave.yaml +0 -46
- package/dist/clis/instagram/user.yaml +0 -54
- package/dist/clis/jike/post.yaml +0 -59
- package/dist/clis/jike/topic.yaml +0 -53
- package/dist/clis/jike/user.yaml +0 -52
- package/dist/clis/jimeng/generate.yaml +0 -85
- package/dist/clis/jimeng/history.yaml +0 -46
- package/dist/clis/linux-do/categories.yaml +0 -70
- package/dist/clis/linux-do/search.yaml +0 -48
- package/dist/clis/linux-do/tags.yaml +0 -41
- package/dist/clis/linux-do/topic.yaml +0 -62
- package/dist/clis/linux-do/user-posts.yaml +0 -67
- package/dist/clis/linux-do/user-topics.yaml +0 -54
- package/dist/clis/lobsters/active.yaml +0 -29
- package/dist/clis/lobsters/hot.yaml +0 -29
- package/dist/clis/lobsters/newest.yaml +0 -29
- package/dist/clis/lobsters/tag.yaml +0 -34
- package/dist/clis/pixiv/detail.yaml +0 -49
- package/dist/clis/pixiv/ranking.yaml +0 -53
- package/dist/clis/pixiv/user.yaml +0 -46
- package/dist/clis/reddit/frontpage.yaml +0 -30
- package/dist/clis/reddit/hot.yaml +0 -47
- package/dist/clis/reddit/popular.yaml +0 -40
- package/dist/clis/reddit/search.yaml +0 -61
- package/dist/clis/reddit/subreddit.yaml +0 -50
- package/dist/clis/reddit/user-comments.yaml +0 -46
- package/dist/clis/reddit/user-posts.yaml +0 -44
- package/dist/clis/reddit/user.yaml +0 -40
- package/dist/clis/stackoverflow/bounties.yaml +0 -29
- package/dist/clis/stackoverflow/hot.yaml +0 -28
- package/dist/clis/stackoverflow/search.yaml +0 -33
- package/dist/clis/stackoverflow/unanswered.yaml +0 -28
- package/dist/clis/steam/top-sellers.yaml +0 -29
- package/dist/clis/tiktok/comment.yaml +0 -66
- package/dist/clis/tiktok/explore.yaml +0 -39
- package/dist/clis/tiktok/follow.yaml +0 -39
- package/dist/clis/tiktok/following.yaml +0 -46
- package/dist/clis/tiktok/friends.yaml +0 -47
- package/dist/clis/tiktok/like.yaml +0 -38
- package/dist/clis/tiktok/live.yaml +0 -51
- package/dist/clis/tiktok/notifications.yaml +0 -52
- package/dist/clis/tiktok/profile.yaml +0 -45
- package/dist/clis/tiktok/save.yaml +0 -34
- package/dist/clis/tiktok/search.yaml +0 -47
- package/dist/clis/tiktok/unfollow.yaml +0 -44
- package/dist/clis/tiktok/unlike.yaml +0 -38
- package/dist/clis/tiktok/unsave.yaml +0 -36
- package/dist/clis/tiktok/user.yaml +0 -44
- package/dist/clis/v2ex/hot.yaml +0 -28
- package/dist/clis/v2ex/latest.yaml +0 -28
- package/dist/clis/v2ex/member.yaml +0 -29
- package/dist/clis/v2ex/node.yaml +0 -34
- package/dist/clis/v2ex/nodes.yaml +0 -31
- package/dist/clis/v2ex/replies.yaml +0 -32
- package/dist/clis/v2ex/topic.yaml +0 -33
- package/dist/clis/v2ex/user.yaml +0 -34
- package/dist/clis/xiaoe/catalog.yaml +0 -129
- package/dist/clis/xiaoe/content.yaml +0 -43
- package/dist/clis/xiaoe/courses.yaml +0 -73
- package/dist/clis/xiaoe/detail.yaml +0 -39
- package/dist/clis/xiaoe/play-url.yaml +0 -124
- package/dist/clis/xiaohongshu/feed.yaml +0 -31
- package/dist/clis/xiaohongshu/notifications.yaml +0 -37
- package/dist/clis/xueqiu/earnings-date.yaml +0 -69
- package/dist/clis/xueqiu/feed.yaml +0 -53
- package/dist/clis/xueqiu/groups.yaml +0 -23
- package/dist/clis/xueqiu/hot-stock.yaml +0 -49
- package/dist/clis/xueqiu/hot.yaml +0 -46
- package/dist/clis/xueqiu/kline.yaml +0 -65
- package/dist/clis/xueqiu/search.yaml +0 -55
- package/dist/clis/xueqiu/stock.yaml +0 -69
- package/dist/clis/xueqiu/watchlist.yaml +0 -46
- package/dist/clis/zhihu/hot.yaml +0 -46
- package/dist/clis/zhihu/search.yaml +0 -59
- package/dist/src/daemon.test.js +0 -65
- package/dist/src/idle-manager.d.ts +0 -19
- package/dist/src/idle-manager.js +0 -54
- package/dist/src/yaml-schema.d.ts +0 -29
- package/dist/src/yaml-schema.js +0 -22
- /package/dist/{src/daemon.test.d.ts → clis/bilibili/hot.d.ts} +0 -0
package/dist/src/discovery.js
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CLI discovery: finds
|
|
2
|
+
* CLI discovery: finds TS CLI definitions and registers them.
|
|
3
3
|
*
|
|
4
4
|
* Supports two modes:
|
|
5
5
|
* 1. FAST PATH (manifest): If a pre-compiled cli-manifest.json exists,
|
|
6
|
-
* registers
|
|
7
|
-
*
|
|
6
|
+
* registers commands instantly. TS modules are loaded lazily only
|
|
7
|
+
* when their command is executed.
|
|
8
8
|
* 2. FALLBACK (filesystem scan): Traditional runtime discovery for development.
|
|
9
9
|
*/
|
|
10
10
|
import * as fs from 'node:fs';
|
|
11
11
|
import * as os from 'node:os';
|
|
12
12
|
import * as path from 'node:path';
|
|
13
13
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
14
|
-
import yaml from 'js-yaml';
|
|
15
14
|
import { Strategy, registerCommand } from './registry.js';
|
|
16
15
|
import { getErrorMessage } from './errors.js';
|
|
17
16
|
import { log } from './logger.js';
|
|
@@ -24,14 +23,12 @@ export const USER_CLIS_DIR = path.join(USER_OPENCLI_DIR, 'clis');
|
|
|
24
23
|
export const PLUGINS_DIR = path.join(USER_OPENCLI_DIR, 'plugins');
|
|
25
24
|
/** Matches files that register commands via cli() or lifecycle hooks */
|
|
26
25
|
const PLUGIN_MODULE_PATTERN = /\b(?:cli|onStartup|onBeforeExecute|onAfterExecute)\s*\(/;
|
|
27
|
-
import { parseYamlArgs } from './yaml-schema.js';
|
|
28
26
|
function parseStrategy(rawStrategy, fallback = Strategy.COOKIE) {
|
|
29
27
|
if (!rawStrategy)
|
|
30
28
|
return fallback;
|
|
31
29
|
const key = rawStrategy.toUpperCase();
|
|
32
30
|
return Strategy[key] ?? fallback;
|
|
33
31
|
}
|
|
34
|
-
import { isRecord } from './utils.js';
|
|
35
32
|
const PACKAGE_ROOT = findPackageRoot(fileURLToPath(import.meta.url));
|
|
36
33
|
/**
|
|
37
34
|
* Ensure ~/.opencli/node_modules/@jackwener/opencli symlink exists so that
|
|
@@ -140,7 +137,6 @@ export async function discoverClis(...dirs) {
|
|
|
140
137
|
}
|
|
141
138
|
/**
|
|
142
139
|
* Fast-path: register commands from pre-compiled manifest.
|
|
143
|
-
* YAML pipelines are inlined — zero YAML parsing at runtime.
|
|
144
140
|
* TS modules are deferred — loaded lazily on first execution.
|
|
145
141
|
*/
|
|
146
142
|
async function loadFromManifest(manifestPath, clisDir) {
|
|
@@ -148,53 +144,30 @@ async function loadFromManifest(manifestPath, clisDir) {
|
|
|
148
144
|
const raw = await fs.promises.readFile(manifestPath, 'utf-8');
|
|
149
145
|
const manifest = JSON.parse(raw);
|
|
150
146
|
for (const entry of manifest) {
|
|
151
|
-
if (entry.
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
// The actual module is loaded lazily on first executeCommand().
|
|
176
|
-
const strategy = parseStrategy(entry.strategy ?? 'cookie');
|
|
177
|
-
const modulePath = path.resolve(clisDir, entry.modulePath);
|
|
178
|
-
const cmd = {
|
|
179
|
-
site: entry.site,
|
|
180
|
-
name: entry.name,
|
|
181
|
-
aliases: entry.aliases,
|
|
182
|
-
description: entry.description ?? '',
|
|
183
|
-
domain: entry.domain,
|
|
184
|
-
strategy,
|
|
185
|
-
browser: entry.browser ?? true,
|
|
186
|
-
args: entry.args ?? [],
|
|
187
|
-
columns: entry.columns,
|
|
188
|
-
timeoutSeconds: entry.timeout,
|
|
189
|
-
source: entry.sourceFile ? path.resolve(clisDir, entry.sourceFile) : modulePath,
|
|
190
|
-
deprecated: entry.deprecated,
|
|
191
|
-
replacedBy: entry.replacedBy,
|
|
192
|
-
navigateBefore: entry.navigateBefore,
|
|
193
|
-
_lazy: true,
|
|
194
|
-
_modulePath: modulePath,
|
|
195
|
-
};
|
|
196
|
-
registerCommand(cmd);
|
|
197
|
-
}
|
|
147
|
+
if (!entry.modulePath)
|
|
148
|
+
continue;
|
|
149
|
+
const strategy = parseStrategy(entry.strategy ?? 'cookie');
|
|
150
|
+
const modulePath = path.resolve(clisDir, entry.modulePath);
|
|
151
|
+
const cmd = {
|
|
152
|
+
site: entry.site,
|
|
153
|
+
name: entry.name,
|
|
154
|
+
aliases: entry.aliases,
|
|
155
|
+
description: entry.description ?? '',
|
|
156
|
+
domain: entry.domain,
|
|
157
|
+
strategy,
|
|
158
|
+
browser: entry.browser ?? true,
|
|
159
|
+
args: entry.args ?? [],
|
|
160
|
+
columns: entry.columns,
|
|
161
|
+
pipeline: entry.pipeline,
|
|
162
|
+
timeoutSeconds: entry.timeout,
|
|
163
|
+
source: entry.sourceFile ? path.resolve(clisDir, entry.sourceFile) : modulePath,
|
|
164
|
+
deprecated: entry.deprecated,
|
|
165
|
+
replacedBy: entry.replacedBy,
|
|
166
|
+
navigateBefore: entry.navigateBefore,
|
|
167
|
+
_lazy: true,
|
|
168
|
+
_modulePath: modulePath,
|
|
169
|
+
};
|
|
170
|
+
registerCommand(cmd);
|
|
198
171
|
}
|
|
199
172
|
return true;
|
|
200
173
|
}
|
|
@@ -223,9 +196,10 @@ async function discoverClisFromFs(dir) {
|
|
|
223
196
|
await Promise.all(files.map(async (file) => {
|
|
224
197
|
const filePath = path.join(siteDir, file);
|
|
225
198
|
if (file.endsWith('.yaml') || file.endsWith('.yml')) {
|
|
226
|
-
|
|
199
|
+
log.warn(`Ignoring YAML adapter ${filePath} — YAML format is no longer supported. Convert to TypeScript using cli() from '@jackwener/opencli/registry'.`);
|
|
200
|
+
return;
|
|
227
201
|
}
|
|
228
|
-
|
|
202
|
+
if ((file.endsWith('.js') && !file.endsWith('.d.js')) ||
|
|
229
203
|
(file.endsWith('.ts') && !file.endsWith('.d.ts') && !file.endsWith('.test.ts'))) {
|
|
230
204
|
if (!(await isCliModule(filePath)))
|
|
231
205
|
return;
|
|
@@ -237,44 +211,6 @@ async function discoverClisFromFs(dir) {
|
|
|
237
211
|
});
|
|
238
212
|
await Promise.all(sitePromises);
|
|
239
213
|
}
|
|
240
|
-
async function registerYamlCli(filePath, defaultSite) {
|
|
241
|
-
try {
|
|
242
|
-
const raw = await fs.promises.readFile(filePath, 'utf-8');
|
|
243
|
-
const def = yaml.load(raw);
|
|
244
|
-
if (!isRecord(def))
|
|
245
|
-
return;
|
|
246
|
-
const cliDef = def;
|
|
247
|
-
const site = cliDef.site ?? defaultSite;
|
|
248
|
-
const name = cliDef.name ?? path.basename(filePath, path.extname(filePath));
|
|
249
|
-
const strategyStr = cliDef.strategy ?? (cliDef.browser === false ? 'public' : 'cookie');
|
|
250
|
-
const strategy = parseStrategy(strategyStr);
|
|
251
|
-
const browser = cliDef.browser ?? (strategy !== Strategy.PUBLIC);
|
|
252
|
-
const args = parseYamlArgs(cliDef.args);
|
|
253
|
-
const cmd = {
|
|
254
|
-
site,
|
|
255
|
-
name,
|
|
256
|
-
aliases: isRecord(cliDef) && Array.isArray(cliDef.aliases)
|
|
257
|
-
? cliDef.aliases.filter((value) => typeof value === 'string')
|
|
258
|
-
: undefined,
|
|
259
|
-
description: cliDef.description ?? '',
|
|
260
|
-
domain: cliDef.domain,
|
|
261
|
-
strategy,
|
|
262
|
-
browser,
|
|
263
|
-
args,
|
|
264
|
-
columns: cliDef.columns,
|
|
265
|
-
pipeline: cliDef.pipeline,
|
|
266
|
-
timeoutSeconds: cliDef.timeout,
|
|
267
|
-
source: filePath,
|
|
268
|
-
deprecated: cliDef.deprecated,
|
|
269
|
-
replacedBy: cliDef.replacedBy,
|
|
270
|
-
navigateBefore: cliDef.navigateBefore,
|
|
271
|
-
};
|
|
272
|
-
registerCommand(cmd);
|
|
273
|
-
}
|
|
274
|
-
catch (err) {
|
|
275
|
-
log.warn(`Failed to load ${filePath}: ${getErrorMessage(err)}`);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
214
|
/**
|
|
279
215
|
* Discover and register plugins from ~/.opencli/plugins/.
|
|
280
216
|
* Each subdirectory is treated as a plugin (site = directory name).
|
|
@@ -296,7 +232,7 @@ export async function discoverPlugins() {
|
|
|
296
232
|
}));
|
|
297
233
|
}
|
|
298
234
|
/**
|
|
299
|
-
* Flat scan: read
|
|
235
|
+
* Flat scan: read ts/js files directly in a plugin directory.
|
|
300
236
|
* Unlike discoverClisFromFs, this does NOT expect nested site subdirectories.
|
|
301
237
|
*/
|
|
302
238
|
async function discoverPluginDir(dir, site) {
|
|
@@ -305,9 +241,10 @@ async function discoverPluginDir(dir, site) {
|
|
|
305
241
|
await Promise.all(files.map(async (file) => {
|
|
306
242
|
const filePath = path.join(dir, file);
|
|
307
243
|
if (file.endsWith('.yaml') || file.endsWith('.yml')) {
|
|
308
|
-
|
|
244
|
+
log.warn(`Ignoring YAML plugin ${filePath} — YAML format is no longer supported. Convert to TypeScript using cli() from '@jackwener/opencli/registry'.`);
|
|
245
|
+
return;
|
|
309
246
|
}
|
|
310
|
-
|
|
247
|
+
if (file.endsWith('.js') && !file.endsWith('.d.js')) {
|
|
311
248
|
if (!(await isCliModule(filePath)))
|
|
312
249
|
return;
|
|
313
250
|
await import(pathToFileURL(filePath).href).catch((err) => {
|
|
@@ -52,7 +52,7 @@ export declare function ytdlpDownload(url: string, destPath: string, options?: Y
|
|
|
52
52
|
/**
|
|
53
53
|
* Save document content to file.
|
|
54
54
|
*/
|
|
55
|
-
export declare function saveDocument(content: string, destPath: string, format?: 'json' | 'markdown' | 'html' | 'text', metadata?: Record<string,
|
|
55
|
+
export declare function saveDocument(content: string, destPath: string, format?: 'json' | 'markdown' | 'html' | 'text', metadata?: Record<string, unknown>): Promise<{
|
|
56
56
|
success: boolean;
|
|
57
57
|
size: number;
|
|
58
58
|
error?: string;
|
package/dist/src/engine.test.js
CHANGED
|
@@ -127,8 +127,7 @@ describe('discoverPlugins', () => {
|
|
|
127
127
|
}
|
|
128
128
|
catch { }
|
|
129
129
|
});
|
|
130
|
-
it('
|
|
131
|
-
// Create a simple YAML adapter in the plugins directory
|
|
130
|
+
it('ignores YAML files in plugin directories (YAML format removed)', async () => {
|
|
132
131
|
await fs.promises.mkdir(testPluginDir, { recursive: true });
|
|
133
132
|
await fs.promises.writeFile(yamlPath, `
|
|
134
133
|
site: __test-plugin__
|
|
@@ -136,25 +135,17 @@ name: greeting
|
|
|
136
135
|
description: Test plugin greeting
|
|
137
136
|
strategy: public
|
|
138
137
|
browser: false
|
|
139
|
-
|
|
140
|
-
pipeline:
|
|
141
|
-
- evaluate: "() => [{ message: 'hello from plugin' }]"
|
|
142
|
-
|
|
143
|
-
columns: [message]
|
|
144
138
|
`);
|
|
145
139
|
await discoverPlugins();
|
|
146
140
|
const registry = getRegistry();
|
|
147
141
|
const cmd = registry.get('__test-plugin__/greeting');
|
|
148
|
-
expect(cmd).
|
|
149
|
-
expect(cmd.site).toBe('__test-plugin__');
|
|
150
|
-
expect(cmd.name).toBe('greeting');
|
|
151
|
-
expect(cmd.description).toBe('Test plugin greeting');
|
|
142
|
+
expect(cmd).toBeUndefined();
|
|
152
143
|
});
|
|
153
144
|
it('handles non-existent plugins directory gracefully', async () => {
|
|
154
145
|
// discoverPlugins should not throw if ~/.opencli/plugins/ does not exist
|
|
155
146
|
await expect(discoverPlugins()).resolves.not.toThrow();
|
|
156
147
|
});
|
|
157
|
-
it('
|
|
148
|
+
it('ignores YAML files in symlinked plugin directories (YAML format removed)', async () => {
|
|
158
149
|
await fs.promises.mkdir(PLUGINS_DIR, { recursive: true });
|
|
159
150
|
await fs.promises.mkdir(symlinkTargetDir, { recursive: true });
|
|
160
151
|
await fs.promises.writeFile(path.join(symlinkTargetDir, 'hello.yaml'), `
|
|
@@ -163,17 +154,11 @@ name: hello
|
|
|
163
154
|
description: Test plugin greeting via symlink
|
|
164
155
|
strategy: public
|
|
165
156
|
browser: false
|
|
166
|
-
|
|
167
|
-
pipeline:
|
|
168
|
-
- evaluate: "() => [{ message: 'hello from symlink plugin' }]"
|
|
169
|
-
|
|
170
|
-
columns: [message]
|
|
171
157
|
`);
|
|
172
158
|
await fs.promises.symlink(symlinkTargetDir, symlinkPluginDir, 'dir');
|
|
173
159
|
await discoverPlugins();
|
|
174
160
|
const cmd = getRegistry().get('__test-plugin-symlink__/hello');
|
|
175
|
-
expect(cmd).
|
|
176
|
-
expect(cmd.description).toBe('Test plugin greeting via symlink');
|
|
161
|
+
expect(cmd).toBeUndefined();
|
|
177
162
|
});
|
|
178
163
|
it('skips broken plugin symlinks without throwing', async () => {
|
|
179
164
|
await fs.promises.mkdir(PLUGINS_DIR, { recursive: true });
|
package/dist/src/execution.js
CHANGED
|
@@ -167,10 +167,14 @@ export async function executeCommand(cmd, rawKwargs, debug = false) {
|
|
|
167
167
|
}
|
|
168
168
|
}
|
|
169
169
|
try {
|
|
170
|
-
|
|
170
|
+
const result = await runWithTimeout(runCommand(cmd, page, kwargs, debug), {
|
|
171
171
|
timeout: cmd.timeoutSeconds ?? DEFAULT_BROWSER_COMMAND_TIMEOUT,
|
|
172
172
|
label: fullName(cmd),
|
|
173
173
|
});
|
|
174
|
+
// Adapter commands are one-shot — close the automation window immediately
|
|
175
|
+
// instead of waiting for the 30s idle timeout.
|
|
176
|
+
await page.closeWindow?.().catch(() => { });
|
|
177
|
+
return result;
|
|
174
178
|
}
|
|
175
179
|
catch (err) {
|
|
176
180
|
// Collect diagnostic while page is still alive (before browserSession closes it).
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verified adapter generation:
|
|
3
|
+
* discover → synthesize → candidate-bound probe → single-session verify.
|
|
4
|
+
*
|
|
5
|
+
* v1 contract keeps scope narrow:
|
|
6
|
+
* - PUBLIC + COOKIE only
|
|
7
|
+
* - read-only JSON API surfaces
|
|
8
|
+
* - single best candidate only
|
|
9
|
+
* - bounded repair: select/itemPath replacement once
|
|
10
|
+
*
|
|
11
|
+
* Contract design principles:
|
|
12
|
+
* 1. machine-readable
|
|
13
|
+
* 2. explicit + explainable
|
|
14
|
+
* 3. testable + versioned
|
|
15
|
+
* 4. taxonomy by skill decision needs (not internal error sources)
|
|
16
|
+
* 5. early hint / terminal outcome share consistent decision language
|
|
17
|
+
*/
|
|
18
|
+
import { type IBrowserFactory } from './runtime.js';
|
|
19
|
+
import { Strategy } from './registry.js';
|
|
20
|
+
export type Stage = 'explore' | 'cascade' | 'synthesize' | 'verify' | 'fallback';
|
|
21
|
+
export type Confidence = 'high' | 'medium' | 'low';
|
|
22
|
+
export type StopReason = 'no-viable-api-surface' | 'auth-too-complex' | 'no-viable-candidate' | 'execution-environment-unavailable';
|
|
23
|
+
export type EscalationReason = 'empty-result' | 'sparse-fields' | 'non-array-result' | 'unsupported-required-args' | 'timeout' | 'selector-mismatch' | 'verify-inconclusive';
|
|
24
|
+
export type SuggestedAction = 'stop' | 'inspect-with-browser' | 'ask-for-login' | 'ask-for-sample-arg' | 'manual-review';
|
|
25
|
+
export type Reusability = 'verified-artifact' | 'unverified-candidate' | 'not-reusable';
|
|
26
|
+
export type EarlyHintReason = 'api-surface-looks-viable' | 'candidate-ready-for-verify' | 'no-viable-api-surface' | 'auth-too-complex' | 'no-viable-candidate';
|
|
27
|
+
export interface EarlyHint {
|
|
28
|
+
stage: 'explore' | 'synthesize' | 'cascade';
|
|
29
|
+
continue: boolean;
|
|
30
|
+
reason: EarlyHintReason;
|
|
31
|
+
confidence: Confidence;
|
|
32
|
+
candidate?: {
|
|
33
|
+
name: string;
|
|
34
|
+
command: string;
|
|
35
|
+
path: string | null;
|
|
36
|
+
reusability: 'unverified-candidate' | 'not-reusable';
|
|
37
|
+
};
|
|
38
|
+
message?: string;
|
|
39
|
+
}
|
|
40
|
+
export type EarlyHintHandler = (hint: EarlyHint) => void;
|
|
41
|
+
type SupportedStrategy = Strategy.PUBLIC | Strategy.COOKIE;
|
|
42
|
+
export interface GenerateStats {
|
|
43
|
+
endpoint_count: number;
|
|
44
|
+
api_endpoint_count: number;
|
|
45
|
+
candidate_count: number;
|
|
46
|
+
verified: boolean;
|
|
47
|
+
repair_attempted: boolean;
|
|
48
|
+
explore_dir: string;
|
|
49
|
+
}
|
|
50
|
+
export interface VerifiedAdapter {
|
|
51
|
+
site: string;
|
|
52
|
+
name: string;
|
|
53
|
+
command: string;
|
|
54
|
+
strategy: SupportedStrategy;
|
|
55
|
+
path: string;
|
|
56
|
+
metadata_path?: string;
|
|
57
|
+
reusability: 'verified-artifact';
|
|
58
|
+
}
|
|
59
|
+
export interface EscalationContext {
|
|
60
|
+
stage: Stage;
|
|
61
|
+
reason: EscalationReason;
|
|
62
|
+
confidence: Confidence;
|
|
63
|
+
suggested_action: SuggestedAction;
|
|
64
|
+
candidate: {
|
|
65
|
+
name: string;
|
|
66
|
+
command: string;
|
|
67
|
+
path: string | null;
|
|
68
|
+
reusability: Reusability;
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export type GenerateOutcome = {
|
|
72
|
+
status: 'success' | 'blocked' | 'needs-human-check';
|
|
73
|
+
adapter?: VerifiedAdapter;
|
|
74
|
+
reason?: StopReason;
|
|
75
|
+
stage?: Stage;
|
|
76
|
+
confidence?: Confidence;
|
|
77
|
+
escalation?: EscalationContext;
|
|
78
|
+
reusability?: Reusability;
|
|
79
|
+
message?: string;
|
|
80
|
+
stats: GenerateStats;
|
|
81
|
+
};
|
|
82
|
+
export interface GenerateVerifiedOptions {
|
|
83
|
+
url: string;
|
|
84
|
+
BrowserFactory: new () => IBrowserFactory;
|
|
85
|
+
goal?: string | null;
|
|
86
|
+
site?: string;
|
|
87
|
+
waitSeconds?: number;
|
|
88
|
+
top?: number;
|
|
89
|
+
workspace?: string;
|
|
90
|
+
noRegister?: boolean;
|
|
91
|
+
onEarlyHint?: EarlyHintHandler;
|
|
92
|
+
}
|
|
93
|
+
export interface VerifiedArtifactMetadata {
|
|
94
|
+
artifact_kind: 'verified';
|
|
95
|
+
schema_version: 1;
|
|
96
|
+
source_url: string;
|
|
97
|
+
goal: string | null;
|
|
98
|
+
strategy: SupportedStrategy;
|
|
99
|
+
verified: true;
|
|
100
|
+
reusable: true;
|
|
101
|
+
reusability_reason: 'verified-artifact';
|
|
102
|
+
}
|
|
103
|
+
export declare function generateVerifiedFromUrl(opts: GenerateVerifiedOptions): Promise<GenerateOutcome>;
|
|
104
|
+
export declare function renderGenerateVerifiedSummary(result: GenerateOutcome): string;
|
|
105
|
+
export {};
|