@jackwener/opencli 1.1.1 → 1.2.1
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/.github/workflows/build-extension.yml +3 -3
- package/.github/workflows/ci.yml +6 -6
- package/.github/workflows/doc-check.yml +3 -3
- package/.github/workflows/e2e-headed.yml +2 -2
- package/.github/workflows/pkg-pr-new.yml +2 -2
- package/.github/workflows/release.yml +3 -3
- package/.github/workflows/security.yml +2 -2
- package/CONTRIBUTING.md +39 -1
- package/README.md +13 -10
- package/README.zh-CN.md +43 -17
- package/SKILL.md +10 -5
- package/dist/browser/cdp.d.ts +4 -4
- package/dist/browser/cdp.js +39 -16
- package/dist/browser/daemon-client.d.ts +4 -2
- package/dist/browser/daemon-client.js +17 -4
- package/dist/browser/dom-helpers.js +38 -7
- package/dist/browser/dom-snapshot.d.ts +86 -0
- package/dist/browser/dom-snapshot.js +729 -0
- package/dist/browser/dom-snapshot.test.d.ts +11 -0
- package/dist/browser/dom-snapshot.test.js +212 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.js +1 -0
- package/dist/browser/mcp.js +3 -1
- package/dist/browser/page.d.ts +14 -24
- package/dist/browser/page.js +46 -6
- package/dist/build-manifest.d.ts +11 -4
- package/dist/build-manifest.js +59 -21
- package/dist/build-manifest.test.js +58 -2
- package/dist/cli-manifest.json +3856 -1509
- package/dist/cli.js +66 -0
- package/dist/clis/barchart/greeks.js +1 -1
- package/dist/clis/barchart/options.js +1 -1
- package/dist/clis/barchart/quote.js +1 -1
- package/dist/clis/bilibili/download.js +1 -1
- package/dist/clis/bilibili/following.js +1 -1
- package/dist/clis/bilibili/subtitle.js +1 -1
- package/dist/clis/bilibili/user-videos.js +1 -1
- package/dist/clis/boss/batchgreet.js +10 -97
- package/dist/clis/boss/chatlist.js +8 -25
- package/dist/clis/boss/chatmsg.js +11 -42
- package/dist/clis/boss/common.d.ts +92 -0
- package/dist/clis/boss/common.js +223 -0
- package/dist/clis/boss/detail.js +7 -49
- package/dist/clis/boss/exchange.js +13 -79
- package/dist/clis/boss/greet.js +18 -145
- package/dist/clis/boss/invite.js +26 -121
- package/dist/clis/boss/joblist.js +6 -31
- package/dist/clis/boss/mark.js +12 -85
- package/dist/clis/boss/recommend.js +10 -49
- package/dist/clis/boss/resume.js +18 -118
- package/dist/clis/boss/search.js +12 -60
- package/dist/clis/boss/send.js +17 -151
- package/dist/clis/boss/stats.js +18 -69
- package/dist/clis/coupang/add-to-cart.js +1 -1
- package/dist/clis/devto/tag.yaml +34 -0
- package/dist/clis/devto/top.yaml +29 -0
- package/dist/clis/devto/user.yaml +33 -0
- package/dist/clis/douban/book-hot.d.ts +1 -0
- package/dist/clis/douban/book-hot.js +14 -0
- package/dist/clis/douban/marks.d.ts +1 -0
- package/dist/clis/douban/marks.js +115 -0
- package/dist/clis/douban/movie-hot.d.ts +1 -0
- package/dist/clis/douban/movie-hot.js +14 -0
- package/dist/clis/douban/reviews.d.ts +1 -0
- package/dist/clis/douban/reviews.js +106 -0
- package/dist/clis/douban/search.d.ts +1 -0
- package/dist/clis/douban/search.js +16 -0
- package/dist/clis/douban/shared.d.ts +4 -0
- package/dist/clis/douban/shared.js +155 -0
- package/dist/clis/douban/subject.yaml +76 -0
- package/dist/clis/douban/top250.yaml +70 -0
- package/dist/clis/douban/utils.d.ts +35 -0
- package/dist/clis/douban/utils.js +48 -0
- package/dist/clis/facebook/add-friend.yaml +43 -0
- package/dist/clis/facebook/events.yaml +44 -0
- package/dist/clis/facebook/feed.yaml +63 -0
- package/dist/clis/facebook/friends.yaml +42 -0
- package/dist/clis/facebook/groups.yaml +50 -0
- package/dist/clis/facebook/join-group.yaml +44 -0
- package/dist/clis/facebook/memories.yaml +39 -0
- package/dist/clis/facebook/notifications.yaml +40 -0
- package/dist/clis/facebook/profile.yaml +37 -0
- package/dist/clis/facebook/search.yaml +46 -0
- package/dist/clis/google/news.d.ts +5 -0
- package/dist/clis/google/news.js +58 -0
- package/dist/clis/google/search.d.ts +10 -0
- package/dist/clis/google/search.js +127 -0
- package/dist/clis/google/suggest.d.ts +5 -0
- package/dist/clis/google/suggest.js +34 -0
- package/dist/clis/google/trends.d.ts +5 -0
- package/dist/clis/google/trends.js +38 -0
- package/dist/clis/google/utils.d.ts +9 -0
- package/dist/clis/google/utils.js +23 -0
- package/dist/clis/google/utils.test.d.ts +1 -0
- package/dist/clis/google/utils.test.js +75 -0
- package/dist/clis/grok/ask.d.ts +14 -0
- package/dist/clis/grok/ask.js +257 -65
- package/dist/clis/grok/ask.test.d.ts +1 -0
- package/dist/clis/grok/ask.test.js +36 -0
- package/dist/clis/instagram/comment.yaml +52 -0
- package/dist/clis/instagram/explore.yaml +43 -0
- package/dist/clis/instagram/follow.yaml +41 -0
- package/dist/clis/instagram/followers.yaml +51 -0
- package/dist/clis/instagram/following.yaml +51 -0
- package/dist/clis/instagram/like.yaml +46 -0
- package/dist/clis/instagram/profile.yaml +42 -0
- package/dist/clis/instagram/save.yaml +46 -0
- package/dist/clis/instagram/saved.yaml +40 -0
- package/dist/clis/instagram/search.yaml +43 -0
- package/dist/clis/instagram/unfollow.yaml +38 -0
- package/dist/clis/instagram/unlike.yaml +46 -0
- package/dist/clis/instagram/unsave.yaml +46 -0
- package/dist/clis/instagram/user.yaml +54 -0
- package/dist/clis/jike/repost.js +1 -1
- package/dist/clis/jimeng/generate.yaml +1 -0
- package/dist/clis/linux-do/category.yaml +1 -0
- package/dist/clis/lobsters/active.yaml +29 -0
- package/dist/clis/lobsters/hot.yaml +29 -0
- package/dist/clis/lobsters/newest.yaml +29 -0
- package/dist/clis/lobsters/tag.yaml +34 -0
- package/dist/clis/medium/feed.d.ts +1 -0
- package/dist/clis/medium/feed.js +15 -0
- package/dist/clis/medium/search.d.ts +1 -0
- package/dist/clis/medium/search.js +15 -0
- package/dist/clis/medium/shared.d.ts +5 -0
- package/dist/clis/medium/shared.js +78 -0
- package/dist/clis/medium/user.d.ts +1 -0
- package/dist/clis/medium/user.js +15 -0
- package/dist/clis/reddit/comment.js +1 -1
- package/dist/clis/reddit/read.js +1 -1
- package/dist/clis/reddit/save.js +1 -1
- package/dist/clis/reddit/subreddit.yaml +1 -0
- package/dist/clis/reddit/subscribe.js +1 -1
- package/dist/clis/reddit/upvote.js +1 -1
- package/dist/clis/sinablog/article.d.ts +1 -0
- package/dist/clis/sinablog/article.js +14 -0
- package/dist/clis/sinablog/hot.d.ts +1 -0
- package/dist/clis/sinablog/hot.js +14 -0
- package/dist/clis/sinablog/search.d.ts +1 -0
- package/dist/clis/sinablog/search.js +51 -0
- package/dist/clis/sinablog/shared.d.ts +7 -0
- package/dist/clis/sinablog/shared.js +187 -0
- package/dist/clis/sinablog/user.d.ts +1 -0
- package/dist/clis/sinablog/user.js +15 -0
- package/dist/clis/substack/feed.d.ts +1 -0
- package/dist/clis/substack/feed.js +15 -0
- package/dist/clis/substack/publication.d.ts +1 -0
- package/dist/clis/substack/publication.js +15 -0
- package/dist/clis/substack/search.d.ts +1 -0
- package/dist/clis/substack/search.js +77 -0
- package/dist/clis/substack/shared.d.ts +4 -0
- package/dist/clis/substack/shared.js +129 -0
- package/dist/clis/tiktok/comment.yaml +66 -0
- package/dist/clis/tiktok/explore.yaml +39 -0
- package/dist/clis/tiktok/follow.yaml +39 -0
- package/dist/clis/tiktok/following.yaml +46 -0
- package/dist/clis/tiktok/friends.yaml +47 -0
- package/dist/clis/tiktok/like.yaml +38 -0
- package/dist/clis/tiktok/live.yaml +51 -0
- package/dist/clis/tiktok/notifications.yaml +52 -0
- package/dist/clis/tiktok/profile.yaml +45 -0
- package/dist/clis/tiktok/save.yaml +34 -0
- package/dist/clis/tiktok/search.yaml +46 -0
- package/dist/clis/tiktok/unfollow.yaml +44 -0
- package/dist/clis/tiktok/unlike.yaml +38 -0
- package/dist/clis/tiktok/unsave.yaml +36 -0
- package/dist/clis/tiktok/user.yaml +44 -0
- package/dist/clis/twitter/download.d.ts +1 -1
- package/dist/clis/twitter/download.js +3 -3
- package/dist/clis/twitter/followers.js +1 -1
- package/dist/clis/twitter/following.js +1 -1
- package/dist/clis/twitter/thread.js +1 -1
- package/dist/clis/twitter/timeline.d.ts +23 -0
- package/dist/clis/twitter/timeline.js +42 -14
- package/dist/clis/twitter/timeline.test.d.ts +1 -0
- package/dist/clis/twitter/timeline.test.js +102 -0
- package/dist/clis/wikipedia/random.d.ts +1 -0
- package/dist/clis/wikipedia/random.js +19 -0
- package/dist/clis/wikipedia/search.js +3 -3
- package/dist/clis/wikipedia/summary.js +4 -9
- package/dist/clis/wikipedia/trending.d.ts +1 -0
- package/dist/clis/wikipedia/trending.js +35 -0
- package/dist/clis/wikipedia/utils.d.ts +28 -0
- package/dist/clis/wikipedia/utils.js +13 -0
- package/dist/clis/xiaohongshu/creator-note-detail.js +1 -1
- package/dist/clis/xiaohongshu/creator-note-detail.test.js +2 -0
- package/dist/clis/xiaohongshu/creator-notes.test.js +2 -0
- package/dist/clis/xiaohongshu/download.js +1 -1
- package/dist/clis/xueqiu/earnings-date.yaml +69 -0
- package/dist/clis/xueqiu/search.yaml +2 -1
- package/dist/clis/xueqiu/stock.yaml +2 -0
- package/dist/clis/yahoo-finance/quote.js +1 -1
- package/dist/commanderAdapter.js +13 -7
- package/dist/daemon.js +21 -0
- package/dist/discovery.d.ts +8 -0
- package/dist/discovery.js +105 -19
- package/dist/doctor.js +3 -1
- package/dist/doctor.test.js +46 -2
- package/dist/engine.test.d.ts +0 -3
- package/dist/engine.test.js +74 -6
- package/dist/execution.d.ts +4 -2
- package/dist/execution.js +31 -7
- package/dist/explore.d.ts +76 -3
- package/dist/explore.js +11 -4
- package/dist/generate.d.ts +41 -2
- package/dist/generate.js +5 -4
- package/dist/main.js +2 -1
- package/dist/pipeline/executor.d.ts +4 -2
- package/dist/pipeline/executor.js +54 -15
- package/dist/pipeline/executor.test.js +33 -6
- package/dist/pipeline/registry.d.ts +1 -1
- package/dist/pipeline/steps/browser.d.ts +7 -7
- package/dist/pipeline/steps/browser.js +15 -7
- package/dist/pipeline/steps/fetch.d.ts +1 -1
- package/dist/pipeline/steps/fetch.js +11 -7
- package/dist/pipeline/steps/transform.d.ts +6 -5
- package/dist/pipeline/steps/transform.js +30 -9
- package/dist/pipeline/template.d.ts +6 -6
- package/dist/pipeline/template.js +43 -5
- package/dist/pipeline/template.test.js +18 -0
- package/dist/pipeline/transform.test.js +11 -0
- package/dist/plugin.d.ts +31 -0
- package/dist/plugin.js +216 -0
- package/dist/plugin.test.d.ts +4 -0
- package/dist/plugin.test.js +76 -0
- package/dist/registry-api.d.ts +11 -0
- package/dist/registry-api.js +9 -0
- package/dist/registry.d.ts +11 -0
- package/dist/registry.js +6 -1
- package/dist/synthesize.d.ts +94 -4
- package/dist/synthesize.js +5 -4
- package/dist/types.d.ts +39 -26
- package/dist/validate.js +8 -2
- package/docs/.vitepress/config.mts +6 -4
- package/docs/adapters/browser/barchart.md +6 -5
- package/docs/adapters/browser/bilibili.md +9 -0
- package/docs/adapters/browser/devto.md +35 -0
- package/docs/adapters/browser/douban.md +38 -0
- package/docs/adapters/browser/facebook.md +36 -0
- package/docs/adapters/browser/google.md +62 -0
- package/docs/adapters/browser/grok.md +26 -8
- package/docs/adapters/browser/instagram.md +46 -0
- package/docs/adapters/browser/lobsters.md +32 -0
- package/docs/adapters/browser/medium.md +32 -0
- package/docs/adapters/browser/reddit.md +9 -0
- package/docs/adapters/browser/sinablog.md +36 -0
- package/docs/adapters/browser/substack.md +38 -0
- package/docs/adapters/browser/tiktok.md +68 -0
- package/docs/adapters/browser/wikipedia.md +11 -2
- package/docs/adapters/browser/xueqiu.md +10 -0
- package/docs/adapters/browser/yahoo-finance.md +6 -5
- package/docs/adapters/desktop/antigravity.md +6 -0
- package/docs/adapters/desktop/chatgpt.md +2 -1
- package/docs/adapters/desktop/codex.md +5 -1
- package/docs/adapters/desktop/cursor.md +4 -0
- package/docs/adapters/desktop/discord.md +7 -7
- package/docs/adapters/index.md +1 -4
- package/docs/guide/getting-started.md +1 -0
- package/docs/guide/plugins.md +153 -0
- package/docs/zh/guide/plugins.md +107 -0
- package/extension/dist/background.js +91 -23
- package/extension/src/background.ts +82 -29
- package/extension/src/cdp.ts +42 -1
- package/package.json +10 -5
- package/scripts/clean-dist.cjs +13 -0
- package/src/browser/cdp.ts +71 -31
- package/src/browser/daemon-client.ts +21 -5
- package/src/browser/dom-helpers.ts +38 -7
- package/src/browser/dom-snapshot.test.ts +249 -0
- package/src/browser/dom-snapshot.ts +770 -0
- package/src/browser/index.ts +2 -0
- package/src/browser/mcp.ts +3 -1
- package/src/browser/page.ts +57 -21
- package/src/build-manifest.test.ts +70 -2
- package/src/build-manifest.ts +94 -26
- package/src/cli.ts +71 -2
- package/src/clis/barchart/greeks.ts +1 -1
- package/src/clis/barchart/options.ts +1 -1
- package/src/clis/barchart/quote.ts +1 -1
- package/src/clis/bilibili/download.ts +1 -1
- package/src/clis/bilibili/following.ts +1 -1
- package/src/clis/bilibili/subtitle.ts +1 -1
- package/src/clis/bilibili/user-videos.ts +1 -1
- package/src/clis/boss/batchgreet.ts +14 -106
- package/src/clis/boss/chatlist.ts +12 -26
- package/src/clis/boss/chatmsg.ts +16 -40
- package/src/clis/boss/common.ts +287 -0
- package/src/clis/boss/detail.ts +8 -54
- package/src/clis/boss/exchange.ts +15 -89
- package/src/clis/boss/greet.ts +23 -160
- package/src/clis/boss/invite.ts +36 -133
- package/src/clis/boss/joblist.ts +7 -36
- package/src/clis/boss/mark.ts +13 -94
- package/src/clis/boss/recommend.ts +12 -57
- package/src/clis/boss/resume.ts +19 -124
- package/src/clis/boss/search.ts +13 -66
- package/src/clis/boss/send.ts +21 -161
- package/src/clis/boss/stats.ts +19 -74
- package/src/clis/coupang/add-to-cart.ts +1 -1
- package/src/clis/devto/tag.yaml +34 -0
- package/src/clis/devto/top.yaml +29 -0
- package/src/clis/devto/user.yaml +33 -0
- package/src/clis/douban/book-hot.ts +15 -0
- package/src/clis/douban/marks.ts +135 -0
- package/src/clis/douban/movie-hot.ts +15 -0
- package/src/clis/douban/reviews.ts +127 -0
- package/src/clis/douban/search.ts +17 -0
- package/src/clis/douban/shared.ts +165 -0
- package/src/clis/douban/subject.yaml +76 -0
- package/src/clis/douban/top250.yaml +70 -0
- package/src/clis/douban/utils.ts +81 -0
- package/src/clis/facebook/add-friend.yaml +43 -0
- package/src/clis/facebook/events.yaml +44 -0
- package/src/clis/facebook/feed.yaml +63 -0
- package/src/clis/facebook/friends.yaml +42 -0
- package/src/clis/facebook/groups.yaml +50 -0
- package/src/clis/facebook/join-group.yaml +44 -0
- package/src/clis/facebook/memories.yaml +39 -0
- package/src/clis/facebook/notifications.yaml +40 -0
- package/src/clis/facebook/profile.yaml +37 -0
- package/src/clis/facebook/search.yaml +46 -0
- package/src/clis/google/news.ts +66 -0
- package/src/clis/google/search.ts +133 -0
- package/src/clis/google/suggest.ts +40 -0
- package/src/clis/google/trends.ts +44 -0
- package/src/clis/google/utils.test.ts +82 -0
- package/src/clis/google/utils.ts +24 -0
- package/src/clis/grok/ask.test.ts +53 -0
- package/src/clis/grok/ask.ts +300 -69
- package/src/clis/instagram/comment.yaml +52 -0
- package/src/clis/instagram/explore.yaml +43 -0
- package/src/clis/instagram/follow.yaml +41 -0
- package/src/clis/instagram/followers.yaml +51 -0
- package/src/clis/instagram/following.yaml +51 -0
- package/src/clis/instagram/like.yaml +46 -0
- package/src/clis/instagram/profile.yaml +42 -0
- package/src/clis/instagram/save.yaml +46 -0
- package/src/clis/instagram/saved.yaml +40 -0
- package/src/clis/instagram/search.yaml +43 -0
- package/src/clis/instagram/unfollow.yaml +38 -0
- package/src/clis/instagram/unlike.yaml +46 -0
- package/src/clis/instagram/unsave.yaml +46 -0
- package/src/clis/instagram/user.yaml +54 -0
- package/src/clis/jike/repost.ts +1 -1
- package/src/clis/jimeng/generate.yaml +1 -0
- package/src/clis/linux-do/category.yaml +1 -0
- package/src/clis/lobsters/active.yaml +29 -0
- package/src/clis/lobsters/hot.yaml +29 -0
- package/src/clis/lobsters/newest.yaml +29 -0
- package/src/clis/lobsters/tag.yaml +34 -0
- package/src/clis/medium/feed.ts +16 -0
- package/src/clis/medium/search.ts +16 -0
- package/src/clis/medium/shared.ts +83 -0
- package/src/clis/medium/user.ts +16 -0
- package/src/clis/reddit/comment.ts +1 -1
- package/src/clis/reddit/read.ts +1 -1
- package/src/clis/reddit/save.ts +1 -1
- package/src/clis/reddit/subreddit.yaml +1 -0
- package/src/clis/reddit/subscribe.ts +1 -1
- package/src/clis/reddit/upvote.ts +1 -1
- package/src/clis/sinablog/article.ts +15 -0
- package/src/clis/sinablog/hot.ts +15 -0
- package/src/clis/sinablog/search.ts +56 -0
- package/src/clis/sinablog/shared.ts +198 -0
- package/src/clis/sinablog/user.ts +16 -0
- package/src/clis/substack/feed.ts +16 -0
- package/src/clis/substack/publication.ts +16 -0
- package/src/clis/substack/search.ts +91 -0
- package/src/clis/substack/shared.ts +132 -0
- package/src/clis/tiktok/comment.yaml +66 -0
- package/src/clis/tiktok/explore.yaml +39 -0
- package/src/clis/tiktok/follow.yaml +39 -0
- package/src/clis/tiktok/following.yaml +46 -0
- package/src/clis/tiktok/friends.yaml +47 -0
- package/src/clis/tiktok/like.yaml +38 -0
- package/src/clis/tiktok/live.yaml +51 -0
- package/src/clis/tiktok/notifications.yaml +52 -0
- package/src/clis/tiktok/profile.yaml +45 -0
- package/src/clis/tiktok/save.yaml +34 -0
- package/src/clis/tiktok/search.yaml +46 -0
- package/src/clis/tiktok/unfollow.yaml +44 -0
- package/src/clis/tiktok/unlike.yaml +38 -0
- package/src/clis/tiktok/unsave.yaml +36 -0
- package/src/clis/tiktok/user.yaml +44 -0
- package/src/clis/twitter/download.ts +3 -3
- package/src/clis/twitter/followers.ts +1 -1
- package/src/clis/twitter/following.ts +1 -1
- package/src/clis/twitter/thread.ts +1 -1
- package/src/clis/twitter/timeline.test.ts +109 -0
- package/src/clis/twitter/timeline.ts +59 -19
- package/src/clis/wikipedia/random.ts +19 -0
- package/src/clis/wikipedia/search.ts +10 -4
- package/src/clis/wikipedia/summary.ts +4 -9
- package/src/clis/wikipedia/trending.ts +41 -0
- package/src/clis/wikipedia/utils.ts +31 -0
- package/src/clis/xiaohongshu/creator-note-detail.test.ts +2 -0
- package/src/clis/xiaohongshu/creator-note-detail.ts +1 -1
- package/src/clis/xiaohongshu/creator-notes.test.ts +2 -0
- package/src/clis/xiaohongshu/download.ts +1 -1
- package/src/clis/xueqiu/earnings-date.yaml +69 -0
- package/src/clis/xueqiu/search.yaml +2 -1
- package/src/clis/xueqiu/stock.yaml +2 -0
- package/src/clis/yahoo-finance/quote.ts +1 -1
- package/src/commanderAdapter.ts +17 -10
- package/src/daemon.ts +23 -0
- package/src/discovery.ts +134 -24
- package/src/doctor.test.ts +59 -2
- package/src/doctor.ts +4 -2
- package/src/engine.test.ts +79 -6
- package/src/execution.ts +42 -16
- package/src/explore.ts +77 -9
- package/src/generate.ts +58 -9
- package/src/main.ts +2 -1
- package/src/pipeline/executor.test.ts +35 -6
- package/src/pipeline/executor.ts +68 -19
- package/src/pipeline/registry.ts +3 -3
- package/src/pipeline/steps/browser.ts +24 -15
- package/src/pipeline/steps/fetch.ts +18 -13
- package/src/pipeline/steps/transform.ts +40 -15
- package/src/pipeline/template.test.ts +18 -0
- package/src/pipeline/template.ts +86 -13
- package/src/pipeline/transform.test.ts +15 -2
- package/src/plugin.test.ts +86 -0
- package/src/plugin.ts +254 -0
- package/src/registry-api.ts +12 -0
- package/src/registry.ts +19 -1
- package/src/synthesize.ts +102 -21
- package/src/types.ts +44 -12
- package/src/validate.ts +19 -4
- package/tests/e2e/browser-public.test.ts +11 -0
- package/tests/e2e/public-commands.test.ts +64 -0
- package/dist/clis/feishu/new.d.ts +0 -1
- package/dist/clis/feishu/new.js +0 -27
- package/dist/clis/feishu/read.d.ts +0 -1
- package/dist/clis/feishu/read.js +0 -40
- package/dist/clis/feishu/search.d.ts +0 -1
- package/dist/clis/feishu/search.js +0 -30
- package/dist/clis/feishu/send.d.ts +0 -1
- package/dist/clis/feishu/send.js +0 -39
- package/dist/clis/feishu/status.d.ts +0 -1
- package/dist/clis/feishu/status.js +0 -28
- package/dist/clis/neteasemusic/like.d.ts +0 -1
- package/dist/clis/neteasemusic/like.js +0 -25
- package/dist/clis/neteasemusic/lyrics.d.ts +0 -1
- package/dist/clis/neteasemusic/lyrics.js +0 -47
- package/dist/clis/neteasemusic/next.d.ts +0 -1
- package/dist/clis/neteasemusic/next.js +0 -26
- package/dist/clis/neteasemusic/play.d.ts +0 -1
- package/dist/clis/neteasemusic/play.js +0 -26
- package/dist/clis/neteasemusic/playing.d.ts +0 -1
- package/dist/clis/neteasemusic/playing.js +0 -59
- package/dist/clis/neteasemusic/playlist.d.ts +0 -1
- package/dist/clis/neteasemusic/playlist.js +0 -46
- package/dist/clis/neteasemusic/prev.d.ts +0 -1
- package/dist/clis/neteasemusic/prev.js +0 -25
- package/dist/clis/neteasemusic/search.d.ts +0 -1
- package/dist/clis/neteasemusic/search.js +0 -52
- package/dist/clis/neteasemusic/status.d.ts +0 -1
- package/dist/clis/neteasemusic/status.js +0 -16
- package/dist/clis/neteasemusic/volume.d.ts +0 -1
- package/dist/clis/neteasemusic/volume.js +0 -54
- package/dist/clis/wechat/chats.d.ts +0 -1
- package/dist/clis/wechat/chats.js +0 -28
- package/dist/clis/wechat/contacts.d.ts +0 -1
- package/dist/clis/wechat/contacts.js +0 -28
- package/dist/clis/wechat/read.d.ts +0 -1
- package/dist/clis/wechat/read.js +0 -58
- package/dist/clis/wechat/search.d.ts +0 -1
- package/dist/clis/wechat/search.js +0 -31
- package/dist/clis/wechat/send.d.ts +0 -1
- package/dist/clis/wechat/send.js +0 -42
- package/dist/clis/wechat/status.d.ts +0 -1
- package/dist/clis/wechat/status.js +0 -29
- package/dist/pipeline.d.ts +0 -7
- package/dist/pipeline.js +0 -7
- package/docs/adapters/browser/github.md +0 -26
- package/docs/adapters/desktop/feishu.md +0 -20
- package/docs/adapters/desktop/neteasemusic.md +0 -31
- package/docs/adapters/desktop/wechat.md +0 -28
- package/src/clis/antigravity/README.md +0 -5
- package/src/clis/antigravity/README.zh-CN.md +0 -51
- package/src/clis/chaoxing/README.md +0 -14
- package/src/clis/chaoxing/README.zh-CN.md +0 -35
- package/src/clis/chatgpt/README.md +0 -5
- package/src/clis/chatgpt/README.zh-CN.md +0 -44
- package/src/clis/chatwise/README.md +0 -5
- package/src/clis/chatwise/README.zh-CN.md +0 -38
- package/src/clis/codex/README.md +0 -5
- package/src/clis/codex/README.zh-CN.md +0 -33
- package/src/clis/cursor/README.md +0 -5
- package/src/clis/cursor/README.zh-CN.md +0 -33
- package/src/clis/discord-app/README.md +0 -5
- package/src/clis/discord-app/README.zh-CN.md +0 -28
- package/src/clis/feishu/README.md +0 -5
- package/src/clis/feishu/README.zh-CN.md +0 -20
- package/src/clis/feishu/new.ts +0 -32
- package/src/clis/feishu/read.ts +0 -48
- package/src/clis/feishu/search.ts +0 -35
- package/src/clis/feishu/send.ts +0 -46
- package/src/clis/feishu/status.ts +0 -34
- package/src/clis/neteasemusic/README.md +0 -5
- package/src/clis/neteasemusic/README.zh-CN.md +0 -31
- package/src/clis/neteasemusic/like.ts +0 -28
- package/src/clis/neteasemusic/lyrics.ts +0 -53
- package/src/clis/neteasemusic/next.ts +0 -30
- package/src/clis/neteasemusic/play.ts +0 -30
- package/src/clis/neteasemusic/playing.ts +0 -62
- package/src/clis/neteasemusic/playlist.ts +0 -51
- package/src/clis/neteasemusic/prev.ts +0 -29
- package/src/clis/neteasemusic/search.ts +0 -58
- package/src/clis/neteasemusic/status.ts +0 -18
- package/src/clis/neteasemusic/volume.ts +0 -61
- package/src/clis/notion/README.md +0 -5
- package/src/clis/notion/README.zh-CN.md +0 -29
- package/src/clis/wechat/README.md +0 -5
- package/src/clis/wechat/README.zh-CN.md +0 -28
- package/src/clis/wechat/chats.ts +0 -33
- package/src/clis/wechat/contacts.ts +0 -33
- package/src/clis/wechat/read.ts +0 -72
- package/src/clis/wechat/search.ts +0 -36
- package/src/clis/wechat/send.ts +0 -49
- package/src/clis/wechat/status.ts +0 -35
- package/src/pipeline.ts +0 -8
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Web Search via browser DOM extraction.
|
|
3
|
+
* Uses browser mode to navigate google.com and extract results from the DOM.
|
|
4
|
+
*
|
|
5
|
+
* Extraction strategy (2026-03): Google no longer uses `.g` class containers.
|
|
6
|
+
* Instead, we find all `a` tags containing `h3` within `#rso`, then walk up
|
|
7
|
+
* to the result container (`div.tF2Cxc` or closest `div[data-hveid]`) to find
|
|
8
|
+
* snippets. This approach is resilient to class name changes.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Web Search via browser DOM extraction.
|
|
3
|
+
* Uses browser mode to navigate google.com and extract results from the DOM.
|
|
4
|
+
*
|
|
5
|
+
* Extraction strategy (2026-03): Google no longer uses `.g` class containers.
|
|
6
|
+
* Instead, we find all `a` tags containing `h3` within `#rso`, then walk up
|
|
7
|
+
* to the result container (`div.tF2Cxc` or closest `div[data-hveid]`) to find
|
|
8
|
+
* snippets. This approach is resilient to class name changes.
|
|
9
|
+
*/
|
|
10
|
+
import { cli, Strategy } from '../../registry.js';
|
|
11
|
+
import { CliError } from '../../errors.js';
|
|
12
|
+
cli({
|
|
13
|
+
site: 'google',
|
|
14
|
+
name: 'search',
|
|
15
|
+
description: 'Search Google',
|
|
16
|
+
domain: 'google.com',
|
|
17
|
+
strategy: Strategy.PUBLIC,
|
|
18
|
+
browser: true,
|
|
19
|
+
args: [
|
|
20
|
+
{ name: 'keyword', positional: true, required: true, help: 'Search query' },
|
|
21
|
+
{ name: 'limit', type: 'int', default: 10, help: 'Number of results (1-100)' },
|
|
22
|
+
{ name: 'lang', default: 'en', help: 'Language short code (e.g. en, zh)' },
|
|
23
|
+
],
|
|
24
|
+
columns: ['type', 'title', 'url', 'snippet'],
|
|
25
|
+
func: async (page, args) => {
|
|
26
|
+
const limit = Math.max(1, Math.min(Number(args.limit), 100));
|
|
27
|
+
const keyword = encodeURIComponent(args.keyword);
|
|
28
|
+
const lang = encodeURIComponent(args.lang);
|
|
29
|
+
const url = `https://www.google.com/search?q=${keyword}&hl=${lang}&num=${limit}`;
|
|
30
|
+
await page.goto(url);
|
|
31
|
+
await page.wait(2);
|
|
32
|
+
const results = await page.evaluate(`
|
|
33
|
+
(function() {
|
|
34
|
+
var results = [];
|
|
35
|
+
var seenUrls = {};
|
|
36
|
+
var rso = document.querySelector('#rso');
|
|
37
|
+
if (!rso) return results;
|
|
38
|
+
|
|
39
|
+
// -- Featured snippet (scoped to #rso to avoid matching unrelated elements) --
|
|
40
|
+
var featuredEl = rso.querySelector('.xpdopen .hgKElc')
|
|
41
|
+
|| rso.querySelector('.IZ6rdc');
|
|
42
|
+
if (featuredEl) {
|
|
43
|
+
var parentBlock = featuredEl.closest('[data-hveid]') || featuredEl.parentElement;
|
|
44
|
+
var fLink = parentBlock ? parentBlock.querySelector('a[href]') : null;
|
|
45
|
+
var fUrl = fLink ? fLink.href : '';
|
|
46
|
+
if (fUrl) seenUrls[fUrl] = true;
|
|
47
|
+
results.push({
|
|
48
|
+
type: 'snippet',
|
|
49
|
+
title: featuredEl.textContent.trim().slice(0, 200),
|
|
50
|
+
url: fUrl,
|
|
51
|
+
snippet: '',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// -- Standard search results --
|
|
56
|
+
// Strategy: find all links containing h3 within #rso
|
|
57
|
+
var allLinks = rso.querySelectorAll('a');
|
|
58
|
+
for (var i = 0; i < allLinks.length; i++) {
|
|
59
|
+
var link = allLinks[i];
|
|
60
|
+
var h3 = link.querySelector('h3');
|
|
61
|
+
if (!h3) continue;
|
|
62
|
+
|
|
63
|
+
var href = link.href || '';
|
|
64
|
+
// Skip non-http, Google internal links, and duplicates
|
|
65
|
+
if (!href.match(/^https?:\\/\\//)) continue;
|
|
66
|
+
if (href.indexOf('google.com/search') !== -1) continue;
|
|
67
|
+
if (seenUrls[href]) continue;
|
|
68
|
+
seenUrls[href] = true;
|
|
69
|
+
|
|
70
|
+
// Walk up to find result container for snippet extraction
|
|
71
|
+
var container = link;
|
|
72
|
+
for (var j = 0; j < 6; j++) {
|
|
73
|
+
if (container.parentElement && container.parentElement !== rso) {
|
|
74
|
+
container = container.parentElement;
|
|
75
|
+
}
|
|
76
|
+
// Stop at a known result boundary
|
|
77
|
+
if (container.getAttribute && container.getAttribute('data-hveid')) break;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Find snippet: look for descriptive text, skip breadcrumbs and metadata
|
|
81
|
+
var snippetText = '';
|
|
82
|
+
var titleText = h3.textContent.trim();
|
|
83
|
+
var candidates = container.querySelectorAll('span, div');
|
|
84
|
+
for (var k = 0; k < candidates.length; k++) {
|
|
85
|
+
var el = candidates[k];
|
|
86
|
+
if (el.querySelector('h3') || el.querySelector('a[href]')) continue;
|
|
87
|
+
var text = el.textContent.trim();
|
|
88
|
+
if (text.length < 40 || text.length > 500) continue;
|
|
89
|
+
if (text === titleText) continue;
|
|
90
|
+
// Skip URL breadcrumbs (e.g. "https://example.com › path..." or "Site Namehttps://...")
|
|
91
|
+
if (text.indexOf('\u203A') !== -1) continue;
|
|
92
|
+
if (new RegExp('https?://').test(text.slice(0, 60))) continue;
|
|
93
|
+
snippetText = text;
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
results.push({
|
|
98
|
+
type: 'result',
|
|
99
|
+
title: h3.textContent.trim(),
|
|
100
|
+
url: href,
|
|
101
|
+
snippet: snippetText.slice(0, 300),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// -- People Also Ask --
|
|
106
|
+
var paaContainers = document.querySelectorAll('[data-sgrd="true"]');
|
|
107
|
+
for (var i = 0; i < paaContainers.length; i++) {
|
|
108
|
+
var questionEl = paaContainers[i].querySelector('span.CSkcDe');
|
|
109
|
+
if (questionEl) {
|
|
110
|
+
results.push({
|
|
111
|
+
type: 'paa',
|
|
112
|
+
title: questionEl.textContent.trim(),
|
|
113
|
+
url: '',
|
|
114
|
+
snippet: '',
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return results;
|
|
120
|
+
})()
|
|
121
|
+
`);
|
|
122
|
+
if (!Array.isArray(results) || results.length === 0) {
|
|
123
|
+
throw new CliError('NOT_FOUND', 'No search results found', 'Try a different keyword or check for CAPTCHA');
|
|
124
|
+
}
|
|
125
|
+
return results;
|
|
126
|
+
},
|
|
127
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Search Suggestions via public JSON API.
|
|
3
|
+
* Uses suggestqueries.google.com with client=firefox for pure JSON (not JSONP).
|
|
4
|
+
*/
|
|
5
|
+
import { cli, Strategy } from '../../registry.js';
|
|
6
|
+
import { CliError } from '../../errors.js';
|
|
7
|
+
cli({
|
|
8
|
+
site: 'google',
|
|
9
|
+
name: 'suggest',
|
|
10
|
+
description: 'Get Google search suggestions',
|
|
11
|
+
strategy: Strategy.PUBLIC,
|
|
12
|
+
browser: false,
|
|
13
|
+
args: [
|
|
14
|
+
{ name: 'keyword', positional: true, required: true, help: 'Search query' },
|
|
15
|
+
{ name: 'lang', default: 'zh-CN', help: 'Language code' },
|
|
16
|
+
],
|
|
17
|
+
columns: ['suggestion'],
|
|
18
|
+
func: async (_page, args) => {
|
|
19
|
+
const keyword = encodeURIComponent(args.keyword);
|
|
20
|
+
const lang = encodeURIComponent(args.lang);
|
|
21
|
+
const url = `https://suggestqueries.google.com/complete/search?client=firefox&q=${keyword}&hl=${lang}`;
|
|
22
|
+
const resp = await fetch(url);
|
|
23
|
+
if (!resp.ok) {
|
|
24
|
+
throw new CliError('FETCH_ERROR', `HTTP ${resp.status}`, 'Check your network connection');
|
|
25
|
+
}
|
|
26
|
+
const data = await resp.json();
|
|
27
|
+
// Response format: ["query", ["suggestion1", "suggestion2", ...]]
|
|
28
|
+
const suggestions = Array.isArray(data) && Array.isArray(data[1]) ? data[1] : [];
|
|
29
|
+
if (!suggestions.length) {
|
|
30
|
+
throw new CliError('NOT_FOUND', 'No suggestions found', 'Try a different keyword');
|
|
31
|
+
}
|
|
32
|
+
return suggestions.map(s => ({ suggestion: s }));
|
|
33
|
+
},
|
|
34
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Trends via public RSS feed.
|
|
3
|
+
* Shows daily trending searches for a given region.
|
|
4
|
+
*/
|
|
5
|
+
import { cli, Strategy } from '../../registry.js';
|
|
6
|
+
import { CliError } from '../../errors.js';
|
|
7
|
+
import { parseRssItems } from './utils.js';
|
|
8
|
+
cli({
|
|
9
|
+
site: 'google',
|
|
10
|
+
name: 'trends',
|
|
11
|
+
description: 'Get Google Trends daily trending searches',
|
|
12
|
+
strategy: Strategy.PUBLIC,
|
|
13
|
+
browser: false,
|
|
14
|
+
args: [
|
|
15
|
+
{ name: 'region', default: 'US', help: 'Region code (e.g. US, CN, JP)' },
|
|
16
|
+
{ name: 'limit', type: 'int', default: 20, help: 'Number of results' },
|
|
17
|
+
],
|
|
18
|
+
columns: ['title', 'traffic', 'date'],
|
|
19
|
+
func: async (_page, args) => {
|
|
20
|
+
const limit = Math.max(1, Math.min(Number(args.limit), 100));
|
|
21
|
+
const region = encodeURIComponent(args.region);
|
|
22
|
+
const url = `https://trends.google.com/trending/rss?geo=${region}`;
|
|
23
|
+
const resp = await fetch(url);
|
|
24
|
+
if (!resp.ok) {
|
|
25
|
+
throw new CliError('FETCH_ERROR', `HTTP ${resp.status}`, 'Check your network connection or region code');
|
|
26
|
+
}
|
|
27
|
+
const xml = await resp.text();
|
|
28
|
+
const items = parseRssItems(xml, ['title', 'pubDate', 'ht:approx_traffic']);
|
|
29
|
+
if (!items.length) {
|
|
30
|
+
throw new CliError('NOT_FOUND', 'No trending data found', 'Try a different region code');
|
|
31
|
+
}
|
|
32
|
+
return items.slice(0, limit).map(item => ({
|
|
33
|
+
title: item['title'],
|
|
34
|
+
traffic: item['ht:approx_traffic'], // raw string e.g. "1,000,000+", no numeric conversion
|
|
35
|
+
date: item['pubDate'],
|
|
36
|
+
}));
|
|
37
|
+
},
|
|
38
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google adapter utilities.
|
|
3
|
+
* Shared RSS parser for news and trends commands.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Parse RSS XML by splitting into <item> blocks, then extracting fields per block.
|
|
7
|
+
* Handles both plain text and CDATA-wrapped content.
|
|
8
|
+
*/
|
|
9
|
+
export declare function parseRssItems(xml: string, fields: string[]): Record<string, string>[];
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google adapter utilities.
|
|
3
|
+
* Shared RSS parser for news and trends commands.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Parse RSS XML by splitting into <item> blocks, then extracting fields per block.
|
|
7
|
+
* Handles both plain text and CDATA-wrapped content.
|
|
8
|
+
*/
|
|
9
|
+
export function parseRssItems(xml, fields) {
|
|
10
|
+
const items = xml.match(/<item>([\s\S]*?)<\/item>/g) || [];
|
|
11
|
+
return items.map(block => {
|
|
12
|
+
const record = {};
|
|
13
|
+
for (const field of fields) {
|
|
14
|
+
// Escape regex special characters in field name (e.g. ht:approx_traffic is safe, but defensive)
|
|
15
|
+
const escaped = field.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
16
|
+
// Handle tags with attributes (e.g. <source url="...">text</source>) and CDATA wrapping
|
|
17
|
+
// (?:\s[^>]*)? ensures we don't match prefix tags (e.g. <sourceUrl> when looking for <source>)
|
|
18
|
+
const match = block.match(new RegExp(`<${escaped}(?:\\s[^>]*)?>(?:<!\\[CDATA\\[)?([\\s\\S]*?)(?:\\]\\]>)?</${escaped}>`));
|
|
19
|
+
record[field] = match ? match[1].trim() : '';
|
|
20
|
+
}
|
|
21
|
+
return record;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { parseRssItems } from './utils.js';
|
|
3
|
+
describe('parseRssItems', () => {
|
|
4
|
+
it('extracts plain text fields', () => {
|
|
5
|
+
const xml = `
|
|
6
|
+
<channel>
|
|
7
|
+
<item><title>Hello</title><link>https://example.com</link></item>
|
|
8
|
+
<item><title>World</title><link>https://test.com</link></item>
|
|
9
|
+
</channel>
|
|
10
|
+
`;
|
|
11
|
+
const items = parseRssItems(xml, ['title', 'link']);
|
|
12
|
+
expect(items).toEqual([
|
|
13
|
+
{ title: 'Hello', link: 'https://example.com' },
|
|
14
|
+
{ title: 'World', link: 'https://test.com' },
|
|
15
|
+
]);
|
|
16
|
+
});
|
|
17
|
+
it('handles CDATA-wrapped content', () => {
|
|
18
|
+
const xml = `
|
|
19
|
+
<item><title><![CDATA[Breaking News]]></title><link>https://news.com</link></item>
|
|
20
|
+
`;
|
|
21
|
+
const items = parseRssItems(xml, ['title', 'link']);
|
|
22
|
+
expect(items).toEqual([
|
|
23
|
+
{ title: 'Breaking News', link: 'https://news.com' },
|
|
24
|
+
]);
|
|
25
|
+
});
|
|
26
|
+
it('handles namespaced fields like ht:approx_traffic', () => {
|
|
27
|
+
const xml = `
|
|
28
|
+
<item>
|
|
29
|
+
<title>AI</title>
|
|
30
|
+
<ht:approx_traffic>500,000+</ht:approx_traffic>
|
|
31
|
+
<pubDate>Mon, 20 Mar 2026</pubDate>
|
|
32
|
+
</item>
|
|
33
|
+
`;
|
|
34
|
+
const items = parseRssItems(xml, ['title', 'ht:approx_traffic', 'pubDate']);
|
|
35
|
+
expect(items).toEqual([
|
|
36
|
+
{ title: 'AI', 'ht:approx_traffic': '500,000+', pubDate: 'Mon, 20 Mar 2026' },
|
|
37
|
+
]);
|
|
38
|
+
});
|
|
39
|
+
it('returns empty string for missing fields', () => {
|
|
40
|
+
const xml = `<item><title>Test</title></item>`;
|
|
41
|
+
const items = parseRssItems(xml, ['title', 'missing']);
|
|
42
|
+
expect(items).toEqual([{ title: 'Test', missing: '' }]);
|
|
43
|
+
});
|
|
44
|
+
it('handles tags with attributes (e.g. <source url="...">)', () => {
|
|
45
|
+
const xml = `
|
|
46
|
+
<item>
|
|
47
|
+
<title><![CDATA[AI reshapes everything - Reuters]]></title>
|
|
48
|
+
<source url="https://reuters.com">Reuters</source>
|
|
49
|
+
<link>https://news.google.com/123</link>
|
|
50
|
+
</item>
|
|
51
|
+
`;
|
|
52
|
+
const items = parseRssItems(xml, ['title', 'source', 'link']);
|
|
53
|
+
expect(items).toEqual([
|
|
54
|
+
{ title: 'AI reshapes everything - Reuters', source: 'Reuters', link: 'https://news.google.com/123' },
|
|
55
|
+
]);
|
|
56
|
+
});
|
|
57
|
+
it('handles mixed CDATA and plain text in the same item', () => {
|
|
58
|
+
const xml = `
|
|
59
|
+
<item>
|
|
60
|
+
<title><![CDATA[Breaking: Major event]]></title>
|
|
61
|
+
<link>https://example.com/article</link>
|
|
62
|
+
<pubDate>Fri, 21 Mar 2026</pubDate>
|
|
63
|
+
</item>
|
|
64
|
+
`;
|
|
65
|
+
const items = parseRssItems(xml, ['title', 'link', 'pubDate']);
|
|
66
|
+
expect(items).toEqual([
|
|
67
|
+
{ title: 'Breaking: Major event', link: 'https://example.com/article', pubDate: 'Fri, 21 Mar 2026' },
|
|
68
|
+
]);
|
|
69
|
+
});
|
|
70
|
+
it('returns empty array for no items', () => {
|
|
71
|
+
const xml = `<channel><title>Empty</title></channel>`;
|
|
72
|
+
const items = parseRssItems(xml, ['title']);
|
|
73
|
+
expect(items).toEqual([]);
|
|
74
|
+
});
|
|
75
|
+
});
|
package/dist/clis/grok/ask.d.ts
CHANGED
|
@@ -1 +1,15 @@
|
|
|
1
|
+
declare function normalizeBubbleText(value: unknown): string;
|
|
2
|
+
declare function normalizeBooleanFlag(value: unknown): boolean;
|
|
3
|
+
declare function pickLatestAssistantCandidate(bubbles: unknown[], baselineCount: number, prompt: string): string;
|
|
4
|
+
declare function updateStableState(previousText: string, stableCount: number, nextText: string): {
|
|
5
|
+
previousText: string;
|
|
6
|
+
stableCount: number;
|
|
7
|
+
};
|
|
1
8
|
export declare const askCommand: import("../../registry.js").CliCommand;
|
|
9
|
+
export declare const __test__: {
|
|
10
|
+
pickLatestAssistantCandidate: typeof pickLatestAssistantCandidate;
|
|
11
|
+
updateStableState: typeof updateStableState;
|
|
12
|
+
normalizeBooleanFlag: typeof normalizeBooleanFlag;
|
|
13
|
+
normalizeBubbleText: typeof normalizeBubbleText;
|
|
14
|
+
};
|
|
15
|
+
export {};
|