publishport-opencli 1.0.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/LICENSE +214 -0
- package/README.md +299 -0
- package/README.zh-CN.md +341 -0
- package/cli-manifest.json +51513 -0
- package/clis/12306/auth.js +25 -0
- package/clis/12306/me.js +9 -0
- package/clis/12306/orders.js +13 -0
- package/clis/12306/passengers.js +14 -0
- package/clis/12306/price.js +1 -0
- package/clis/12306/stations.js +1 -0
- package/clis/12306/train.js +1 -0
- package/clis/12306/trains.js +1 -0
- package/clis/12306/utils.js +1 -0
- package/clis/1688/assets.js +127 -0
- package/clis/1688/auth.js +1 -0
- package/clis/1688/download.js +1 -0
- package/clis/1688/item.js +21 -0
- package/clis/1688/search.js +129 -0
- package/clis/1688/shared.js +11 -0
- package/clis/1688/store.js +26 -0
- package/clis/1point3acres/auth.js +18 -0
- package/clis/1point3acres/digest.js +1 -0
- package/clis/1point3acres/forum.js +1 -0
- package/clis/1point3acres/forums.js +1 -0
- package/clis/1point3acres/hot.js +1 -0
- package/clis/1point3acres/latest.js +1 -0
- package/clis/1point3acres/notifications.js +1 -0
- package/clis/1point3acres/search.js +1 -0
- package/clis/1point3acres/thread.js +2 -0
- package/clis/1point3acres/user.js +1 -0
- package/clis/1point3acres/utils.js +6 -0
- package/clis/36kr/article.js +20 -0
- package/clis/36kr/hot.js +16 -0
- package/clis/36kr/news.js +1 -0
- package/clis/36kr/search.js +36 -0
- package/clis/51job/company.js +36 -0
- package/clis/51job/detail.js +35 -0
- package/clis/51job/hot.js +1 -0
- package/clis/51job/search.js +1 -0
- package/clis/51job/utils.js +21 -0
- package/clis/_atlassian/shared.js +21 -0
- package/clis/_shared/article/auth.js +16 -0
- package/clis/_shared/article/douban-md2draft.js +4 -0
- package/clis/_shared/article/format.js +1 -0
- package/clis/_shared/article/images.js +95 -0
- package/clis/_shared/article/login.js +1 -0
- package/clis/_shared/article/page-runtime.js +745 -0
- package/clis/_shared/article/publish.js +34 -0
- package/clis/_shared/common.js +1 -0
- package/clis/_shared/content-guard.js +1 -0
- package/clis/_shared/desktop-commands.js +1 -0
- package/clis/_shared/search-adapter.js +1 -0
- package/clis/_shared/site-auth.js +1 -0
- package/clis/_shared/token-auth.js +2 -0
- package/clis/_shared/video-publish.js +62 -0
- package/clis/aibase/news.js +31 -0
- package/clis/amazon/auth.js +19 -0
- package/clis/amazon/bestsellers.js +1 -0
- package/clis/amazon/discussion.js +20 -0
- package/clis/amazon/movers-shakers.js +1 -0
- package/clis/amazon/new-releases.js +1 -0
- package/clis/amazon/offer.js +29 -0
- package/clis/amazon/product.js +25 -0
- package/clis/amazon/rankings.js +68 -0
- package/clis/amazon/search.js +16 -0
- package/clis/amazon/shared.js +11 -0
- package/clis/antigravity/SKILL.md +38 -0
- package/clis/antigravity/_actions.js +201 -0
- package/clis/antigravity/audit-extras.js +78 -0
- package/clis/antigravity/delete.js +1 -0
- package/clis/antigravity/dump.js +1 -0
- package/clis/antigravity/extract-code.js +18 -0
- package/clis/antigravity/history.js +1 -0
- package/clis/antigravity/mark-read.js +1 -0
- package/clis/antigravity/model.js +90 -0
- package/clis/antigravity/new.js +9 -0
- package/clis/antigravity/read.js +10 -0
- package/clis/antigravity/rename.js +1 -0
- package/clis/antigravity/send.js +11 -0
- package/clis/antigravity/serve.js +97 -0
- package/clis/antigravity/status.js +1 -0
- package/clis/antigravity/storage.js +12 -0
- package/clis/antigravity/watch.js +6 -0
- package/clis/apple-podcasts/episodes.js +1 -0
- package/clis/apple-podcasts/search.js +1 -0
- package/clis/apple-podcasts/top.js +1 -0
- package/clis/apple-podcasts/utils.js +1 -0
- package/clis/archive/item.js +1 -0
- package/clis/archive/search.js +1 -0
- package/clis/archive/snapshots.js +1 -0
- package/clis/archive/wayback.js +1 -0
- package/clis/arxiv/author.js +1 -0
- package/clis/arxiv/paper.js +1 -0
- package/clis/arxiv/recent.js +1 -0
- package/clis/arxiv/search.js +1 -0
- package/clis/arxiv/utils.js +1 -0
- package/clis/autohome/__fixtures__/catalog.html +11 -0
- package/clis/autohome/__fixtures__/koubei.json +116 -0
- package/clis/autohome/brand.js +1 -0
- package/clis/autohome/score.js +1 -0
- package/clis/autohome/utils.js +1 -0
- package/clis/baidu-scholar/search.js +63 -0
- package/clis/baijiahao/article.js +1 -0
- package/clis/baijiahao/lists.js +1 -0
- package/clis/baijiahao/login.js +1 -0
- package/clis/baijiahao/publish.js +57 -0
- package/clis/baijiahao/stats.js +1 -0
- package/clis/baijiahao/whoami.js +1 -0
- package/clis/band/auth.js +29 -0
- package/clis/band/bands.js +37 -0
- package/clis/band/mentions.js +6 -0
- package/clis/band/post.js +76 -0
- package/clis/band/posts.js +50 -0
- package/clis/barchart/flow.js +70 -0
- package/clis/barchart/greeks.js +88 -0
- package/clis/barchart/options.js +61 -0
- package/clis/barchart/quote.js +87 -0
- package/clis/bbc/news.js +1 -0
- package/clis/bbc/topic.js +1 -0
- package/clis/bbc/utils.js +1 -0
- package/clis/bilibili/article.js +1 -0
- package/clis/bilibili/auth.js +1 -0
- package/clis/bilibili/categories.js +1 -0
- package/clis/bilibili/coin.js +1 -0
- package/clis/bilibili/comment-del.js +1 -0
- package/clis/bilibili/comment-like.js +1 -0
- package/clis/bilibili/comment.js +1 -0
- package/clis/bilibili/comments.js +1 -0
- package/clis/bilibili/dm-list.js +1 -0
- package/clis/bilibili/dm-read.js +1 -0
- package/clis/bilibili/dm-send.js +1 -0
- package/clis/bilibili/download.js +7 -0
- package/clis/bilibili/drafts.js +1 -0
- package/clis/bilibili/dynamic-post.js +24 -0
- package/clis/bilibili/dynamic.js +1 -0
- package/clis/bilibili/favorite-add.js +1 -0
- package/clis/bilibili/favorite.js +1 -0
- package/clis/bilibili/feed.js +2 -0
- package/clis/bilibili/follow.js +1 -0
- package/clis/bilibili/following.js +1 -0
- package/clis/bilibili/history.js +1 -0
- package/clis/bilibili/hot.js +15 -0
- package/clis/bilibili/like.js +1 -0
- package/clis/bilibili/me.js +1 -0
- package/clis/bilibili/partitions.js +1 -0
- package/clis/bilibili/ranking.js +1 -0
- package/clis/bilibili/search.js +1 -0
- package/clis/bilibili/stats.js +1 -0
- package/clis/bilibili/subtitle.js +21 -0
- package/clis/bilibili/summary.js +1 -0
- package/clis/bilibili/topics.js +1 -0
- package/clis/bilibili/unfollow.js +1 -0
- package/clis/bilibili/upload.js +1 -0
- package/clis/bilibili/user-videos.js +1 -0
- package/clis/bilibili/utils.js +50 -0
- package/clis/bilibili/video-drafts.js +1 -0
- package/clis/bilibili/video.js +1 -0
- package/clis/binance/asks.js +1 -0
- package/clis/binance/depth.js +1 -0
- package/clis/binance/gainers.js +1 -0
- package/clis/binance/klines.js +1 -0
- package/clis/binance/losers.js +1 -0
- package/clis/binance/pairs.js +1 -0
- package/clis/binance/price.js +1 -0
- package/clis/binance/prices.js +1 -0
- package/clis/binance/ticker.js +1 -0
- package/clis/binance/top.js +1 -0
- package/clis/binance/trades.js +1 -0
- package/clis/bloomberg/businessweek.js +12 -0
- package/clis/bloomberg/crypto.js +1 -0
- package/clis/bloomberg/economics.js +1 -0
- package/clis/bloomberg/feeds.js +1 -0
- package/clis/bloomberg/green.js +1 -0
- package/clis/bloomberg/industries.js +1 -0
- package/clis/bloomberg/main.js +1 -0
- package/clis/bloomberg/markets.js +1 -0
- package/clis/bloomberg/news.js +57 -0
- package/clis/bloomberg/opinions.js +1 -0
- package/clis/bloomberg/politics.js +1 -0
- package/clis/bloomberg/pursuits.js +1 -0
- package/clis/bloomberg/tech.js +1 -0
- package/clis/bloomberg/utils.js +17 -0
- package/clis/bluesky/post.js +1 -0
- package/clis/bluesky/shared.js +56 -0
- package/clis/bluesky/whoami.js +1 -0
- package/clis/booking/search.js +93 -0
- package/clis/boss/auth.js +13 -0
- package/clis/boss/batchgreet.js +1 -0
- package/clis/boss/chatlist.js +1 -0
- package/clis/boss/chatmsg.js +1 -0
- package/clis/boss/detail.js +1 -0
- package/clis/boss/exchange.js +1 -0
- package/clis/boss/greet.js +1 -0
- package/clis/boss/invite.js +4 -0
- package/clis/boss/joblist.js +1 -0
- package/clis/boss/mark.js +1 -0
- package/clis/boss/recommend.js +1 -0
- package/clis/boss/resume.js +90 -0
- package/clis/boss/search.js +1 -0
- package/clis/boss/send.js +1 -0
- package/clis/boss/stats.js +1 -0
- package/clis/boss/utils.js +161 -0
- package/clis/brave/search.js +23 -0
- package/clis/chaoxing/assignments.js +1 -0
- package/clis/chaoxing/auth.js +21 -0
- package/clis/chaoxing/exams.js +1 -0
- package/clis/chaoxing/utils.js +58 -0
- package/clis/chatgpt/ask.js +1 -0
- package/clis/chatgpt/auth.js +17 -0
- package/clis/chatgpt/detail.js +1 -0
- package/clis/chatgpt/history.js +1 -0
- package/clis/chatgpt/image.js +1 -0
- package/clis/chatgpt/model.js +1 -0
- package/clis/chatgpt/new.js +1 -0
- package/clis/chatgpt/project-file-add.js +1 -0
- package/clis/chatgpt/project-list.js +1 -0
- package/clis/chatgpt/read.js +1 -0
- package/clis/chatgpt/send.js +1 -0
- package/clis/chatgpt/status.js +1 -0
- package/clis/chatgpt/utils.js +1092 -0
- package/clis/chatgpt-app/ask.js +1 -0
- package/clis/chatgpt-app/ax.js +512 -0
- package/clis/chatgpt-app/model.js +1 -0
- package/clis/chatgpt-app/new.js +1 -0
- package/clis/chatgpt-app/read.js +1 -0
- package/clis/chatgpt-app/send.js +1 -0
- package/clis/chatgpt-app/status.js +1 -0
- package/clis/chatwise/ask.js +1 -0
- package/clis/chatwise/export.js +21 -0
- package/clis/chatwise/history.js +26 -0
- package/clis/chatwise/model.js +48 -0
- package/clis/chatwise/new.js +1 -0
- package/clis/chatwise/read.js +25 -0
- package/clis/chatwise/screenshot.js +1 -0
- package/clis/chatwise/send.js +1 -0
- package/clis/chatwise/status.js +1 -0
- package/clis/chatwise/utils.js +75 -0
- package/clis/chess/analyze.js +1 -0
- package/clis/chess/game.js +1 -0
- package/clis/chess/games.js +1 -0
- package/clis/chess/stats.js +1 -0
- package/clis/chess/utils.js +1 -0
- package/clis/claude/ask.js +4 -0
- package/clis/claude/auth.js +19 -0
- package/clis/claude/detail.js +1 -0
- package/clis/claude/history.js +1 -0
- package/clis/claude/new.js +1 -0
- package/clis/claude/read.js +1 -0
- package/clis/claude/send.js +1 -0
- package/clis/claude/status.js +1 -0
- package/clis/claude/utils.js +179 -0
- package/clis/cnblogs/article.js +1 -0
- package/clis/cnblogs/login.js +1 -0
- package/clis/cnblogs/stats.js +37 -0
- package/clis/cnblogs/whoami.js +1 -0
- package/clis/cnki/search.js +38 -0
- package/clis/codex/_actions.js +72 -0
- package/clis/codex/archive.js +1 -0
- package/clis/codex/ask.js +23 -0
- package/clis/codex/dump.js +1 -0
- package/clis/codex/export.js +12 -0
- package/clis/codex/extract-diff.js +28 -0
- package/clis/codex/history.js +1 -0
- package/clis/codex/model.js +118 -0
- package/clis/codex/new.js +1 -0
- package/clis/codex/pin.js +1 -0
- package/clis/codex/projects.js +1 -0
- package/clis/codex/read.js +16 -0
- package/clis/codex/rename.js +34 -0
- package/clis/codex/screenshot.js +1 -0
- package/clis/codex/send.js +16 -0
- package/clis/codex/sidebar.js +1 -0
- package/clis/codex/status.js +1 -0
- package/clis/coingecko/categories.js +1 -0
- package/clis/coingecko/coin.js +1 -0
- package/clis/coingecko/derivatives.js +1 -0
- package/clis/coingecko/exchanges.js +1 -0
- package/clis/coingecko/global.js +1 -0
- package/clis/coingecko/top.js +1 -0
- package/clis/coingecko/trending.js +1 -0
- package/clis/confluence/create.js +1 -0
- package/clis/confluence/page.js +1 -0
- package/clis/confluence/search.js +1 -0
- package/clis/confluence/shared.js +1 -0
- package/clis/confluence/update.js +1 -0
- package/clis/coupang/add-to-cart.js +86 -0
- package/clis/coupang/auth.js +16 -0
- package/clis/coupang/product.js +161 -0
- package/clis/coupang/search.js +385 -0
- package/clis/coupang/utils.js +1 -0
- package/clis/crates/crate.js +1 -0
- package/clis/crates/search.js +1 -0
- package/clis/crates/utils.js +1 -0
- package/clis/csdn/article.js +29 -0
- package/clis/csdn/columns.js +1 -0
- package/clis/csdn/login.js +1 -0
- package/clis/csdn/stats.js +71 -0
- package/clis/csdn/whoami.js +1 -0
- package/clis/cto51/article.js +1 -0
- package/clis/cto51/whoami.js +1 -0
- package/clis/ctrip/auth.js +1 -0
- package/clis/ctrip/flight.js +17 -0
- package/clis/ctrip/hotel-search.js +24 -0
- package/clis/ctrip/hotel-suggest.js +1 -0
- package/clis/ctrip/search.js +1 -0
- package/clis/ctrip/utils.js +119 -0
- package/clis/cursor/ask.js +22 -0
- package/clis/cursor/composer.js +12 -0
- package/clis/cursor/dump.js +1 -0
- package/clis/cursor/export.js +23 -0
- package/clis/cursor/extract-code.js +18 -0
- package/clis/cursor/history.js +26 -0
- package/clis/cursor/model.js +18 -0
- package/clis/cursor/new.js +1 -0
- package/clis/cursor/read.js +27 -0
- package/clis/cursor/screenshot.js +1 -0
- package/clis/cursor/send.js +12 -0
- package/clis/cursor/status.js +1 -0
- package/clis/dblp/author.js +1 -0
- package/clis/dblp/paper.js +1 -0
- package/clis/dblp/search.js +1 -0
- package/clis/dblp/utils.js +1 -0
- package/clis/dblp/venue.js +1 -0
- package/clis/deepseek/ask.js +1 -0
- package/clis/deepseek/auth.js +22 -0
- package/clis/deepseek/detail.js +1 -0
- package/clis/deepseek/history.js +1 -0
- package/clis/deepseek/new.js +1 -0
- package/clis/deepseek/read.js +1 -0
- package/clis/deepseek/send.js +50 -0
- package/clis/deepseek/status.js +1 -0
- package/clis/deepseek/utils.js +202 -0
- package/clis/defillama/protocol.js +1 -0
- package/clis/defillama/protocols.js +1 -0
- package/clis/defillama/utils.js +1 -0
- package/clis/devto/auth.js +9 -0
- package/clis/devto/latest.js +1 -0
- package/clis/devto/publish.js +17 -0
- package/clis/devto/read.js +3 -0
- package/clis/devto/stats.js +27 -0
- package/clis/devto/tag.js +1 -0
- package/clis/devto/top.js +1 -0
- package/clis/devto/user.js +1 -0
- package/clis/dianping/__fixtures__/search.html +168 -0
- package/clis/dianping/__fixtures__/shop.html +6 -0
- package/clis/dianping/auth.js +10 -0
- package/clis/dianping/cityResolver.js +4 -0
- package/clis/dianping/search.js +1 -0
- package/clis/dianping/shop.js +1 -0
- package/clis/dianping/utils.js +1 -0
- package/clis/dictionary/examples.js +1 -0
- package/clis/dictionary/search.js +1 -0
- package/clis/dictionary/synonyms.js +1 -0
- package/clis/discord-app/channels.js +1 -0
- package/clis/discord-app/delete.js +66 -0
- package/clis/discord-app/goto.js +1 -0
- package/clis/discord-app/members.js +21 -0
- package/clis/discord-app/read.js +1 -0
- package/clis/discord-app/search.js +29 -0
- package/clis/discord-app/send.js +10 -0
- package/clis/discord-app/servers.js +1 -0
- package/clis/discord-app/status.js +1 -0
- package/clis/discord-app/thread-read.js +1 -0
- package/clis/discord-app/threads.js +1 -0
- package/clis/discord-app/utils.js +226 -0
- package/clis/discord-web/auth.js +10 -0
- package/clis/discord-web/send.js +13 -0
- package/clis/dockerhub/image.js +1 -0
- package/clis/dockerhub/search.js +1 -0
- package/clis/dockerhub/utils.js +1 -0
- package/clis/dongchedi/__fixtures__/search.json +60 -0
- package/clis/dongchedi/__fixtures__/series-detail.json +911 -0
- package/clis/dongchedi/__fixtures__/series-score.json +1396 -0
- package/clis/dongchedi/koubei.js +1 -0
- package/clis/dongchedi/models.js +1 -0
- package/clis/dongchedi/score.js +1 -0
- package/clis/dongchedi/search.js +1 -0
- package/clis/dongchedi/series.js +1 -0
- package/clis/dongchedi/specs.js +1 -0
- package/clis/dongchedi/utils.js +1 -0
- package/clis/douban/article.js +53 -0
- package/clis/douban/auth.js +21 -0
- package/clis/douban/book-hot.js +1 -0
- package/clis/douban/download.js +1 -0
- package/clis/douban/marks.js +59 -0
- package/clis/douban/movie-hot.js +1 -0
- package/clis/douban/photos.js +1 -0
- package/clis/douban/reviews.js +53 -0
- package/clis/douban/search.js +1 -0
- package/clis/douban/subject.js +1 -0
- package/clis/douban/top250.js +50 -0
- package/clis/douban/utils.js +344 -0
- package/clis/doubao/ask.js +1 -0
- package/clis/doubao/auth.js +28 -0
- package/clis/doubao/detail.js +1 -0
- package/clis/doubao/history.js +1 -0
- package/clis/doubao/meeting-summary.js +1 -0
- package/clis/doubao/meeting-transcript.js +1 -0
- package/clis/doubao/new.js +1 -0
- package/clis/doubao/read.js +1 -0
- package/clis/doubao/send.js +1 -0
- package/clis/doubao/status.js +1 -0
- package/clis/doubao/utils.js +704 -0
- package/clis/doubao-app/ask.js +1 -0
- package/clis/doubao-app/dump.js +1 -0
- package/clis/doubao-app/new.js +1 -0
- package/clis/doubao-app/read.js +1 -0
- package/clis/doubao-app/screenshot.js +1 -0
- package/clis/doubao-app/send.js +1 -0
- package/clis/doubao-app/status.js +1 -0
- package/clis/doubao-app/utils.js +64 -0
- package/clis/douyin/_shared/browser-fetch.js +28 -0
- package/clis/douyin/_shared/creation-id.js +1 -0
- package/clis/douyin/_shared/evaluate-result.js +1 -0
- package/clis/douyin/_shared/imagex-upload.js +1 -0
- package/clis/douyin/_shared/public-api.js +1 -0
- package/clis/douyin/_shared/sts2.js +1 -0
- package/clis/douyin/_shared/text-extra.js +1 -0
- package/clis/douyin/_shared/timing.js +1 -0
- package/clis/douyin/_shared/tos-upload.js +5 -0
- package/clis/douyin/_shared/transcode.js +1 -0
- package/clis/douyin/_shared/types.js +1 -0
- package/clis/douyin/_shared/vod-upload.js +5 -0
- package/clis/douyin/activities.js +1 -0
- package/clis/douyin/auth.js +1 -0
- package/clis/douyin/collections.js +1 -0
- package/clis/douyin/delete.js +76 -0
- package/clis/douyin/draft.js +166 -0
- package/clis/douyin/drafts.js +1 -0
- package/clis/douyin/hashtag.js +1 -0
- package/clis/douyin/location.js +1 -0
- package/clis/douyin/profile.js +1 -0
- package/clis/douyin/publish-image.js +64 -0
- package/clis/douyin/publish.js +14 -0
- package/clis/douyin/search.js +51 -0
- package/clis/douyin/stats.js +1 -0
- package/clis/douyin/update.js +1 -0
- package/clis/douyin/user-videos.js +1 -0
- package/clis/douyin/videos.js +1 -0
- package/clis/duckduckgo/search.js +1 -0
- package/clis/duckduckgo/suggest.js +1 -0
- package/clis/eastmoney/_secid.js +1 -0
- package/clis/eastmoney/announcement.js +1 -0
- package/clis/eastmoney/article.js +1 -0
- package/clis/eastmoney/convertible.js +1 -0
- package/clis/eastmoney/etf.js +1 -0
- package/clis/eastmoney/holders.js +1 -0
- package/clis/eastmoney/hot-rank.js +30 -0
- package/clis/eastmoney/index-board.js +1 -0
- package/clis/eastmoney/kline.js +1 -0
- package/clis/eastmoney/kuaixun.js +1 -0
- package/clis/eastmoney/longhu.js +1 -0
- package/clis/eastmoney/money-flow.js +1 -0
- package/clis/eastmoney/northbound.js +1 -0
- package/clis/eastmoney/quote.js +1 -0
- package/clis/eastmoney/rank.js +1 -0
- package/clis/eastmoney/sectors.js +1 -0
- package/clis/eastmoney/whoami.js +1 -0
- package/clis/endoflife/product.js +1 -0
- package/clis/endoflife/utils.js +1 -0
- package/clis/facebook/__fixtures__/notifications-page.html +13 -0
- package/clis/facebook/add-friend.js +24 -0
- package/clis/facebook/auth.js +1 -0
- package/clis/facebook/comment.js +18 -0
- package/clis/facebook/events.js +26 -0
- package/clis/facebook/feed.js +209 -0
- package/clis/facebook/friends.js +24 -0
- package/clis/facebook/groups.js +32 -0
- package/clis/facebook/join-group.js +25 -0
- package/clis/facebook/like.js +29 -0
- package/clis/facebook/marketplace-inbox.js +34 -0
- package/clis/facebook/marketplace-listings.js +33 -0
- package/clis/facebook/memories.js +21 -0
- package/clis/facebook/notifications.js +31 -0
- package/clis/facebook/post.js +88 -0
- package/clis/facebook/profile.js +18 -0
- package/clis/facebook/search.js +22 -0
- package/clis/flathub/app.js +1 -0
- package/clis/flathub/search.js +1 -0
- package/clis/flathub/utils.js +1 -0
- package/clis/flomo/auth.js +22 -0
- package/clis/flomo/memos.js +13 -0
- package/clis/gemini/ask.js +1 -0
- package/clis/gemini/auth.js +14 -0
- package/clis/gemini/deep-research-result.js +4 -0
- package/clis/gemini/deep-research.js +1 -0
- package/clis/gemini/detail.js +1 -0
- package/clis/gemini/history.js +1 -0
- package/clis/gemini/image.js +3 -0
- package/clis/gemini/new.js +1 -0
- package/clis/gemini/read.js +1 -0
- package/clis/gemini/status.js +1 -0
- package/clis/gemini/utils.js +1234 -0
- package/clis/geogebra/add-circle.js +1 -0
- package/clis/geogebra/add-line.js +1 -0
- package/clis/geogebra/add-point.js +1 -0
- package/clis/geogebra/add-polygon.js +1 -0
- package/clis/geogebra/eval.js +1 -0
- package/clis/geogebra/hexagon.js +1 -0
- package/clis/geogebra/info.js +13 -0
- package/clis/geogebra/list.js +1 -0
- package/clis/geogebra/triangle.js +1 -0
- package/clis/geogebra/utils.js +99 -0
- package/clis/ghost/publish.js +1 -0
- package/clis/ghost/shared.js +1 -0
- package/clis/ghost/whoami.js +1 -0
- package/clis/gitee/auth.js +12 -0
- package/clis/gitee/index.js +1 -0
- package/clis/gitee/search.js +1 -0
- package/clis/gitee/trending.js +240 -0
- package/clis/gitee/user.js +71 -0
- package/clis/github/auth.js +7 -0
- package/clis/github-trending/repos.js +1 -0
- package/clis/google/news.js +1 -0
- package/clis/google/search.js +90 -0
- package/clis/google/suggest.js +1 -0
- package/clis/google/trends.js +1 -0
- package/clis/google/utils.js +1 -0
- package/clis/google-scholar/cite.js +20 -0
- package/clis/google-scholar/profile.js +36 -0
- package/clis/google-scholar/search.js +35 -0
- package/clis/goproxy/module.js +1 -0
- package/clis/goproxy/utils.js +1 -0
- package/clis/goproxy/versions.js +1 -0
- package/clis/gov-law/recent.js +1 -0
- package/clis/gov-law/search.js +14 -0
- package/clis/gov-law/shared.js +29 -0
- package/clis/gov-policy/__fixtures__/recent.html +16 -0
- package/clis/gov-policy/__fixtures__/search.html +41 -0
- package/clis/gov-policy/recent.js +8 -0
- package/clis/gov-policy/search.js +8 -0
- package/clis/gov-policy/utils.js +1 -0
- package/clis/grok/ask.js +1 -0
- package/clis/grok/auth.js +17 -0
- package/clis/grok/delete.js +1 -0
- package/clis/grok/detail.js +1 -0
- package/clis/grok/export-all.js +170 -0
- package/clis/grok/export-utils.js +1 -0
- package/clis/grok/export.js +106 -0
- package/clis/grok/history.js +1 -0
- package/clis/grok/image.js +119 -0
- package/clis/grok/image.test.ts +127 -0
- package/clis/grok/new.js +1 -0
- package/clis/grok/pin.js +1 -0
- package/clis/grok/read.js +1 -0
- package/clis/grok/send.js +1 -0
- package/clis/grok/status.js +1 -0
- package/clis/grok/utils.js +337 -0
- package/clis/guazi/__fixtures__/detail.html +7 -0
- package/clis/guazi/__fixtures__/list.html +5 -0
- package/clis/guazi/browse.js +1 -0
- package/clis/guazi/car.js +1 -0
- package/clis/guazi/utils.js +1 -0
- package/clis/hackernews/ask.js +1 -0
- package/clis/hackernews/auth.js +9 -0
- package/clis/hackernews/best.js +1 -0
- package/clis/hackernews/comment.js +61 -0
- package/clis/hackernews/jobs.js +1 -0
- package/clis/hackernews/new.js +1 -0
- package/clis/hackernews/read.js +11 -0
- package/clis/hackernews/search.js +1 -0
- package/clis/hackernews/show.js +1 -0
- package/clis/hackernews/submit.js +65 -0
- package/clis/hackernews/top.js +1 -0
- package/clis/hackernews/user.js +1 -0
- package/clis/hashnode/auth.js +11 -0
- package/clis/hashnode/publish.js +92 -0
- package/clis/hf/auth.js +12 -0
- package/clis/hf/datasets.js +1 -0
- package/clis/hf/models.js +1 -0
- package/clis/hf/paper.js +1 -0
- package/clis/hf/spaces.js +1 -0
- package/clis/hf/top.js +1 -0
- package/clis/homebrew/cask.js +1 -0
- package/clis/homebrew/formula.js +1 -0
- package/clis/homebrew/popular.js +1 -0
- package/clis/homebrew/utils.js +1 -0
- package/clis/huodongxing/events.js +1 -0
- package/clis/hupu/__fixtures__/hot-home.html +64 -0
- package/clis/hupu/auth.js +14 -0
- package/clis/hupu/detail.js +7 -0
- package/clis/hupu/hot.js +14 -0
- package/clis/hupu/like.js +1 -0
- package/clis/hupu/mentions.js +91 -0
- package/clis/hupu/reply.js +1 -0
- package/clis/hupu/search.js +1 -0
- package/clis/hupu/unlike.js +1 -0
- package/clis/hupu/utils.js +243 -0
- package/clis/imdb/person.js +140 -0
- package/clis/imdb/reviews.js +40 -0
- package/clis/imdb/search.js +113 -0
- package/clis/imdb/title.js +1 -0
- package/clis/imdb/top.js +1 -0
- package/clis/imdb/trending.js +1 -0
- package/clis/imdb/utils.js +162 -0
- package/clis/imooc/article.js +59 -0
- package/clis/imooc/login.js +1 -0
- package/clis/imooc/whoami.js +1 -0
- package/clis/indeed/job.js +20 -0
- package/clis/indeed/search.js +37 -0
- package/clis/indeed/utils.js +1 -0
- package/clis/infoq/article.js +19 -0
- package/clis/infoq/login.js +1 -0
- package/clis/infoq/whoami.js +1 -0
- package/clis/instagram/_shared/private-publish.js +75 -0
- package/clis/instagram/_shared/protocol-capture.js +180 -0
- package/clis/instagram/_shared/runtime-info.js +33 -0
- package/clis/instagram/auth.js +22 -0
- package/clis/instagram/collection-create.js +38 -0
- package/clis/instagram/collection-delete.js +72 -0
- package/clis/instagram/comment.js +26 -0
- package/clis/instagram/detail.js +2 -0
- package/clis/instagram/download.js +83 -0
- package/clis/instagram/explore.js +27 -0
- package/clis/instagram/follow.js +24 -0
- package/clis/instagram/followers.js +30 -0
- package/clis/instagram/following.js +74 -0
- package/clis/instagram/like.js +25 -0
- package/clis/instagram/note.js +162 -0
- package/clis/instagram/post.js +718 -0
- package/clis/instagram/profile.js +25 -0
- package/clis/instagram/reel.js +452 -0
- package/clis/instagram/save.js +25 -0
- package/clis/instagram/saved.js +37 -0
- package/clis/instagram/search.js +23 -0
- package/clis/instagram/story.js +21 -0
- package/clis/instagram/unfollow.js +21 -0
- package/clis/instagram/unlike.js +25 -0
- package/clis/instagram/unsave.js +25 -0
- package/clis/instagram/user.js +1 -0
- package/clis/jd/add-cart.js +22 -0
- package/clis/jd/auth.js +12 -0
- package/clis/jd/cart.js +59 -0
- package/clis/jd/detail.js +42 -0
- package/clis/jd/item.js +98 -0
- package/clis/jd/item.test.ts +517 -0
- package/clis/jd/reviews.js +31 -0
- package/clis/jd/search.js +42 -0
- package/clis/jianshu/article.js +1 -0
- package/clis/jianshu/login.js +1 -0
- package/clis/jianshu/notebooks.js +1 -0
- package/clis/jianshu/whoami.js +1 -0
- package/clis/jianyu/auth.js +28 -0
- package/clis/jianyu/detail.js +1 -0
- package/clis/jianyu/search.js +73 -0
- package/clis/jianyu/shared/china-bid-search.js +86 -0
- package/clis/jianyu/shared/procurement-contract.js +1 -0
- package/clis/jianyu/shared/procurement-detail.js +18 -0
- package/clis/jike/auth.js +19 -0
- package/clis/jike/comment.js +82 -0
- package/clis/jike/create.js +83 -0
- package/clis/jike/feed.js +32 -0
- package/clis/jike/like.js +38 -0
- package/clis/jike/notifications.js +115 -0
- package/clis/jike/post.js +33 -0
- package/clis/jike/repost.js +67 -0
- package/clis/jike/search.js +29 -0
- package/clis/jike/topic.js +20 -0
- package/clis/jike/user.js +19 -0
- package/clis/jike/utils.js +15 -0
- package/clis/jimeng/auth.js +13 -0
- package/clis/jimeng/generate.js +60 -0
- package/clis/jimeng/history.js +32 -0
- package/clis/jimeng/new.js +26 -0
- package/clis/jimeng/workspaces.js +22 -0
- package/clis/jira/attachments.js +1 -0
- package/clis/jira/comments.js +1 -0
- package/clis/jira/issue.js +1 -0
- package/clis/jira/links.js +1 -0
- package/clis/jira/search.js +1 -0
- package/clis/jira/shared.js +1 -0
- package/clis/juejin/article.js +5 -0
- package/clis/juejin/categories.js +1 -0
- package/clis/juejin/hot.js +1 -0
- package/clis/juejin/login.js +1 -0
- package/clis/juejin/recommend.js +1 -0
- package/clis/juejin/stats.js +53 -0
- package/clis/juejin/tags.js +1 -0
- package/clis/juejin/utils.js +1 -0
- package/clis/juejin/whoami.js +1 -0
- package/clis/ke/auth.js +14 -0
- package/clis/ke/chengjiao.js +45 -0
- package/clis/ke/ershoufang.js +50 -0
- package/clis/ke/utils.js +21 -0
- package/clis/ke/xiaoqu.js +45 -0
- package/clis/ke/zufang.js +50 -0
- package/clis/kimi/_utils.js +38 -0
- package/clis/kimi/audit-extras.js +64 -0
- package/clis/kimi/auth.js +17 -0
- package/clis/kimi/chat.js +77 -0
- package/clis/kimi/storage.js +14 -0
- package/clis/kimi/ui.js +89 -0
- package/clis/kimi/usage.js +51 -0
- package/clis/kuaishou/auth.js +1 -0
- package/clis/kuaishou/publish.js +53 -0
- package/clis/lesswrong/_helpers.js +9 -0
- package/clis/lesswrong/comments.js +9 -0
- package/clis/lesswrong/curated.js +5 -0
- package/clis/lesswrong/frontpage.js +5 -0
- package/clis/lesswrong/new.js +5 -0
- package/clis/lesswrong/read.js +5 -0
- package/clis/lesswrong/sequences.js +5 -0
- package/clis/lesswrong/shortform.js +5 -0
- package/clis/lesswrong/tag.js +5 -0
- package/clis/lesswrong/tags.js +5 -0
- package/clis/lesswrong/top-month.js +5 -0
- package/clis/lesswrong/top-week.js +5 -0
- package/clis/lesswrong/top-year.js +5 -0
- package/clis/lesswrong/top.js +5 -0
- package/clis/lesswrong/user-posts.js +5 -0
- package/clis/lesswrong/user.js +5 -0
- package/clis/lichess/top.js +1 -0
- package/clis/lichess/user.js +1 -0
- package/clis/lichess/utils.js +1 -0
- package/clis/linkedin/auth.js +27 -0
- package/clis/linkedin/comment.js +1 -0
- package/clis/linkedin/connect.js +244 -0
- package/clis/linkedin/create.js +113 -0
- package/clis/linkedin/follow.js +1 -0
- package/clis/linkedin/inbox.js +1 -0
- package/clis/linkedin/job-detail.js +40 -0
- package/clis/linkedin/jobs-preferences.js +34 -0
- package/clis/linkedin/like.js +1 -0
- package/clis/linkedin/notifications.js +1 -0
- package/clis/linkedin/people-search.js +1 -0
- package/clis/linkedin/post-analytics.js +1 -0
- package/clis/linkedin/post-comments.js +1 -0
- package/clis/linkedin/post-detail.js +1 -0
- package/clis/linkedin/posts-core.js +138 -0
- package/clis/linkedin/posts.js +1 -0
- package/clis/linkedin/profile-analytics.js +1 -0
- package/clis/linkedin/profile-api.js +218 -0
- package/clis/linkedin/profile-experience.js +1 -0
- package/clis/linkedin/profile-projects.js +1 -0
- package/clis/linkedin/profile-read.js +3 -0
- package/clis/linkedin/reply.js +1 -0
- package/clis/linkedin/repost.js +1 -0
- package/clis/linkedin/safe-send.js +155 -0
- package/clis/linkedin/salesnav-inbox.js +21 -0
- package/clis/linkedin/salesnav-message.js +33 -0
- package/clis/linkedin/salesnav-search.js +15 -0
- package/clis/linkedin/salesnav-thread.js +1 -0
- package/clis/linkedin/search-api.js +42 -0
- package/clis/linkedin/search.js +50 -0
- package/clis/linkedin/sent-invitations.js +46 -0
- package/clis/linkedin/services-read.js +57 -0
- package/clis/linkedin/shared.js +10 -0
- package/clis/linkedin/social-api.js +260 -0
- package/clis/linkedin/thread-snapshot.js +81 -0
- package/clis/linkedin/timeline.js +37 -0
- package/clis/linkedin-learning/auth.js +27 -0
- package/clis/linkedin-learning/course.js +17 -0
- package/clis/linkedin-learning/search.js +17 -0
- package/clis/linkedin-learning/trending.js +17 -0
- package/clis/linux-do/auth.js +20 -0
- package/clis/linux-do/categories.js +1 -0
- package/clis/linux-do/feed.js +19 -0
- package/clis/linux-do/search.js +1 -0
- package/clis/linux-do/tags.js +1 -0
- package/clis/linux-do/topic-content.js +28 -0
- package/clis/linux-do/topic.js +1 -0
- package/clis/linux-do/user-posts.js +1 -0
- package/clis/linux-do/user-topics.js +1 -0
- package/clis/lobsters/active.js +1 -0
- package/clis/lobsters/domain.js +1 -0
- package/clis/lobsters/hot.js +1 -0
- package/clis/lobsters/newest.js +1 -0
- package/clis/lobsters/read.js +11 -0
- package/clis/lobsters/tag.js +1 -0
- package/clis/maimai/auth.js +19 -0
- package/clis/maimai/search-talents.js +37 -0
- package/clis/manus/_utils.js +28 -0
- package/clis/manus/auth.js +20 -0
- package/clis/manus/connectors.js +4 -0
- package/clis/manus/credits.js +4 -0
- package/clis/manus/list.js +7 -0
- package/clis/manus/read.js +7 -0
- package/clis/manus/skills.js +4 -0
- package/clis/manus/status.js +8 -0
- package/clis/mastodon/post.js +1 -0
- package/clis/mastodon/shared.js +48 -0
- package/clis/mastodon/whoami.js +1 -0
- package/clis/maven/artifact.js +1 -0
- package/clis/maven/search.js +1 -0
- package/clis/maven/utils.js +1 -0
- package/clis/mdn/search.js +1 -0
- package/clis/medium/article.js +12 -0
- package/clis/medium/feed.js +1 -0
- package/clis/medium/login.js +1 -0
- package/clis/medium/search.js +1 -0
- package/clis/medium/stats.js +56 -0
- package/clis/medium/tag.js +1 -0
- package/clis/medium/user.js +1 -0
- package/clis/medium/utils.js +62 -0
- package/clis/medium/whoami.js +1 -0
- package/clis/mubu/doc.js +1 -0
- package/clis/mubu/docs.js +1 -0
- package/clis/mubu/notes.js +1 -0
- package/clis/mubu/recent.js +1 -0
- package/clis/mubu/search.js +1 -0
- package/clis/mubu/utils.js +31 -0
- package/clis/note/auth.js +12 -0
- package/clis/note/note-utils.js +2 -0
- package/clis/note/publish.js +17 -0
- package/clis/notebooklm/add-source.js +46 -0
- package/clis/notebooklm/auth.js +21 -0
- package/clis/notebooklm/create.js +1 -0
- package/clis/notebooklm/current.js +1 -0
- package/clis/notebooklm/generate-audio.js +1 -0
- package/clis/notebooklm/generate-slides.js +1 -0
- package/clis/notebooklm/get.js +1 -0
- package/clis/notebooklm/history.js +1 -0
- package/clis/notebooklm/list.js +1 -0
- package/clis/notebooklm/note-list.js +1 -0
- package/clis/notebooklm/notes-get.js +1 -0
- package/clis/notebooklm/open.js +1 -0
- package/clis/notebooklm/rpc.js +36 -0
- package/clis/notebooklm/shared.js +1 -0
- package/clis/notebooklm/source-fulltext.js +1 -0
- package/clis/notebooklm/source-get.js +1 -0
- package/clis/notebooklm/source-guide.js +1 -0
- package/clis/notebooklm/source-list.js +1 -0
- package/clis/notebooklm/status.js +1 -0
- package/clis/notebooklm/summary.js +1 -0
- package/clis/notebooklm/utils.js +172 -0
- package/clis/notebooklm/write-note.js +1 -0
- package/clis/nowcoder/auth.js +24 -0
- package/clis/nowcoder/comment.js +1 -0
- package/clis/nowcoder/comments.js +1 -0
- package/clis/nowcoder/companies.js +1 -0
- package/clis/nowcoder/creators.js +1 -0
- package/clis/nowcoder/delete.js +1 -0
- package/clis/nowcoder/detail.js +46 -0
- package/clis/nowcoder/dm-list.js +1 -0
- package/clis/nowcoder/dm-read.js +1 -0
- package/clis/nowcoder/dm-send.js +1 -0
- package/clis/nowcoder/drafts.js +1 -0
- package/clis/nowcoder/experience.js +20 -0
- package/clis/nowcoder/hot.js +1 -0
- package/clis/nowcoder/inbox.js +1 -0
- package/clis/nowcoder/jobs.js +1 -0
- package/clis/nowcoder/like.js +1 -0
- package/clis/nowcoder/my.js +1 -0
- package/clis/nowcoder/notifications.js +16 -0
- package/clis/nowcoder/papers.js +22 -0
- package/clis/nowcoder/post.js +1 -0
- package/clis/nowcoder/practice.js +21 -0
- package/clis/nowcoder/recommend.js +1 -0
- package/clis/nowcoder/referral.js +21 -0
- package/clis/nowcoder/salary.js +22 -0
- package/clis/nowcoder/search.js +31 -0
- package/clis/nowcoder/suggest.js +17 -0
- package/clis/nowcoder/topics.js +1 -0
- package/clis/nowcoder/trending.js +1 -0
- package/clis/nowcoder/utils.js +68 -0
- package/clis/npm/downloads.js +1 -0
- package/clis/npm/package.js +1 -0
- package/clis/npm/search.js +1 -0
- package/clis/npm/utils.js +1 -0
- package/clis/nuget/package.js +1 -0
- package/clis/nuget/search.js +1 -0
- package/clis/nuget/utils.js +1 -0
- package/clis/nvd/cve.js +1 -0
- package/clis/oeis/search.js +1 -0
- package/clis/oeis/sequence.js +1 -0
- package/clis/oeis/utils.js +1 -0
- package/clis/ones/common.js +23 -0
- package/clis/ones/enrich-tasks.js +1 -0
- package/clis/ones/login.js +2 -0
- package/clis/ones/logout.js +1 -0
- package/clis/ones/me.js +1 -0
- package/clis/ones/my-tasks.js +1 -0
- package/clis/ones/resolve-labels.js +1 -0
- package/clis/ones/task-helpers.js +1 -0
- package/clis/ones/task.js +1 -0
- package/clis/ones/tasks.js +1 -0
- package/clis/ones/token-info.js +1 -0
- package/clis/ones/worklog.js +14 -0
- package/clis/openalex/search.js +1 -0
- package/clis/openalex/utils.js +1 -0
- package/clis/openalex/work.js +1 -0
- package/clis/openfda/drug-label.js +1 -0
- package/clis/openfda/food-recall.js +1 -0
- package/clis/openfda/utils.js +1 -0
- package/clis/openreview/author.js +1 -0
- package/clis/openreview/paper.js +1 -0
- package/clis/openreview/reviews.js +4 -0
- package/clis/openreview/search.js +1 -0
- package/clis/openreview/utils.js +1 -0
- package/clis/openreview/venue.js +1 -0
- package/clis/oschina/article.js +1 -0
- package/clis/oschina/catalogs.js +1 -0
- package/clis/oschina/login.js +1 -0
- package/clis/oschina/stats.js +54 -0
- package/clis/oschina/whoami.js +1 -0
- package/clis/osv/query.js +1 -0
- package/clis/osv/utils.js +1 -0
- package/clis/osv/vulnerability.js +1 -0
- package/clis/packagist/package.js +1 -0
- package/clis/packagist/search.js +1 -0
- package/clis/packagist/utils.js +1 -0
- package/clis/paperreview/feedback.js +1 -0
- package/clis/paperreview/review.js +1 -0
- package/clis/paperreview/submit.js +1 -0
- package/clis/paperreview/utils.js +1 -0
- package/clis/pinterest/api.js +1 -0
- package/clis/pinterest/auth.js +1 -0
- package/clis/pinterest/boards.js +1 -0
- package/clis/pinterest/client.js +20 -0
- package/clis/pinterest/publish.js +13 -0
- package/clis/pixiv/auth.js +17 -0
- package/clis/pixiv/detail.js +1 -0
- package/clis/pixiv/download.js +1 -0
- package/clis/pixiv/illusts.js +1 -0
- package/clis/pixiv/ranking.js +26 -0
- package/clis/pixiv/search.js +1 -0
- package/clis/pixiv/user.js +1 -0
- package/clis/pixiv/utils.js +18 -0
- package/clis/powerchina/auth.js +17 -0
- package/clis/powerchina/search.js +1 -0
- package/clis/producthunt/browse.js +54 -0
- package/clis/producthunt/hot.js +64 -0
- package/clis/producthunt/posts.js +1 -0
- package/clis/producthunt/today.js +1 -0
- package/clis/producthunt/utils.js +1 -0
- package/clis/pubmed/article.js +1 -0
- package/clis/pubmed/author.js +1 -0
- package/clis/pubmed/citations.js +1 -0
- package/clis/pubmed/clinical-trial.js +1 -0
- package/clis/pubmed/journal.js +1 -0
- package/clis/pubmed/mesh.js +1 -0
- package/clis/pubmed/related.js +1 -0
- package/clis/pubmed/review.js +1 -0
- package/clis/pubmed/search.js +1 -0
- package/clis/pubmed/utils.js +1 -0
- package/clis/pypi/downloads.js +1 -0
- package/clis/pypi/package.js +1 -0
- package/clis/pypi/utils.js +1 -0
- package/clis/qiita/auth.js +1 -0
- package/clis/qiita/gql.js +32 -0
- package/clis/qiita/publish.js +7 -0
- package/clis/qiita/stats.js +37 -0
- package/clis/qoder/_utils.js +113 -0
- package/clis/qoder/composer.js +1 -0
- package/clis/qoder/history.js +25 -0
- package/clis/qoder/quest.js +1 -0
- package/clis/qoder/read.js +1 -0
- package/clis/qoder/status.js +1 -0
- package/clis/qoder/ui.js +59 -0
- package/clis/quark/auth.js +16 -0
- package/clis/quark/ls.js +1 -0
- package/clis/quark/mkdir.js +1 -0
- package/clis/quark/mv.js +1 -0
- package/clis/quark/rename.js +1 -0
- package/clis/quark/rm.js +1 -0
- package/clis/quark/save.js +1 -0
- package/clis/quark/share-tree.js +1 -0
- package/clis/quark/utils.js +13 -0
- package/clis/quora/create-answer.js +22 -0
- package/clis/quora/create-question.js +24 -0
- package/clis/quora/shared.js +43 -0
- package/clis/quora/whoami.js +1 -0
- package/clis/qwen/ask.js +1 -0
- package/clis/qwen/auth.js +17 -0
- package/clis/qwen/detail.js +1 -0
- package/clis/qwen/history.js +1 -0
- package/clis/qwen/image.js +31 -0
- package/clis/qwen/new.js +1 -0
- package/clis/qwen/read.js +1 -0
- package/clis/qwen/send.js +1 -0
- package/clis/qwen/status.js +1 -0
- package/clis/qwen/utils.js +185 -0
- package/clis/reddit/auth.js +17 -0
- package/clis/reddit/comment.js +36 -0
- package/clis/reddit/frontpage.js +40 -0
- package/clis/reddit/home.js +32 -0
- package/clis/reddit/hot.js +46 -0
- package/clis/reddit/popular.js +46 -0
- package/clis/reddit/read.js +398 -0
- package/clis/reddit/reply.js +56 -0
- package/clis/reddit/save.js +30 -0
- package/clis/reddit/saved.js +24 -0
- package/clis/reddit/search.js +51 -0
- package/clis/reddit/submit.js +42 -0
- package/clis/reddit/subreddit-info.js +29 -0
- package/clis/reddit/subreddit.js +52 -0
- package/clis/reddit/subscribe.js +29 -0
- package/clis/reddit/subscribed.js +68 -0
- package/clis/reddit/upvote.js +43 -0
- package/clis/reddit/upvoted.js +24 -0
- package/clis/reddit/user-comments.js +20 -0
- package/clis/reddit/user-posts.js +17 -0
- package/clis/reddit/user.js +20 -0
- package/clis/reddit/whoami.js +19 -0
- package/clis/rednote/auth.js +19 -0
- package/clis/rednote/comments.js +1 -0
- package/clis/rednote/download.js +1 -0
- package/clis/rednote/feed.js +1 -0
- package/clis/rednote/note.js +1 -0
- package/clis/rednote/notifications.js +67 -0
- package/clis/rednote/search.js +32 -0
- package/clis/rednote/user.js +1 -0
- package/clis/rest-countries/country.js +1 -0
- package/clis/rest-countries/region.js +1 -0
- package/clis/rest-countries/utils.js +1 -0
- package/clis/reuters/article-detail.js +1 -0
- package/clis/reuters/auth.js +39 -0
- package/clis/reuters/search.js +1 -0
- package/clis/reuters/utils.js +50 -0
- package/clis/rfc/rfc.js +1 -0
- package/clis/rfc/utils.js +1 -0
- package/clis/rubygems/gem.js +1 -0
- package/clis/rubygems/search.js +1 -0
- package/clis/rubygems/utils.js +1 -0
- package/clis/segmentfault/_signed-request.js +43 -0
- package/clis/segmentfault/article.js +3 -0
- package/clis/segmentfault/channels.js +1 -0
- package/clis/segmentfault/login.js +1 -0
- package/clis/segmentfault/stats.js +82 -0
- package/clis/segmentfault/tags.js +1 -0
- package/clis/segmentfault/whoami.js +1 -0
- package/clis/semanticscholar/citations.js +1 -0
- package/clis/semanticscholar/paper.js +1 -0
- package/clis/semanticscholar/recommendations.js +1 -0
- package/clis/semanticscholar/search.js +1 -0
- package/clis/semanticscholar/utils.js +1 -0
- package/clis/sinablog/article.js +1 -0
- package/clis/sinablog/hot.js +1 -0
- package/clis/sinablog/search.js +1 -0
- package/clis/sinablog/user.js +1 -0
- package/clis/sinablog/utils.js +153 -0
- package/clis/sinafinance/news.js +1 -0
- package/clis/sinafinance/rolling-news.js +20 -0
- package/clis/sinafinance/stock-rank.js +41 -0
- package/clis/sinafinance/stock.js +1 -0
- package/clis/slock/attachment-download.js +1 -0
- package/clis/slock/attachment-upload.js +34 -0
- package/clis/slock/attachment-url.js +1 -0
- package/clis/slock/auth-verify.js +1 -0
- package/clis/slock/bookmark-add.js +11 -0
- package/clis/slock/bookmark-list.js +10 -0
- package/clis/slock/bookmark-remove.js +7 -0
- package/clis/slock/channel-action.js +1 -0
- package/clis/slock/channel-archive.js +1 -0
- package/clis/slock/channel-create.js +1 -0
- package/clis/slock/channel-files.js +1 -0
- package/clis/slock/channel-info.js +1 -0
- package/clis/slock/channel-join.js +1 -0
- package/clis/slock/channel-leave.js +1 -0
- package/clis/slock/channel-list.js +1 -0
- package/clis/slock/channel-mark.js +1 -0
- package/clis/slock/channel-members.js +1 -0
- package/clis/slock/channel-unarchive.js +1 -0
- package/clis/slock/dm-list.js +1 -0
- package/clis/slock/errors.js +1 -0
- package/clis/slock/in-page.js +113 -0
- package/clis/slock/inbox-done.js +9 -0
- package/clis/slock/inbox-read-all.js +1 -0
- package/clis/slock/inbox.js +1 -0
- package/clis/slock/login.js +1 -0
- package/clis/slock/message-read.js +61 -0
- package/clis/slock/message-search.js +24 -0
- package/clis/slock/message-send.js +55 -0
- package/clis/slock/reaction-add.js +1 -0
- package/clis/slock/reaction-remove.js +1 -0
- package/clis/slock/resolve.js +1 -0
- package/clis/slock/server-list.js +9 -0
- package/clis/slock/server-use.js +18 -0
- package/clis/slock/shared.js +1 -0
- package/clis/slock/task-claim.js +14 -0
- package/clis/slock/task-convert.js +35 -0
- package/clis/slock/task-create.js +24 -0
- package/clis/slock/task-delete.js +9 -0
- package/clis/slock/task-get.js +11 -0
- package/clis/slock/task-list-server.js +12 -0
- package/clis/slock/task-list.js +14 -0
- package/clis/slock/task-status.js +19 -0
- package/clis/slock/task-unclaim.js +13 -0
- package/clis/slock/thread-done.js +1 -0
- package/clis/slock/thread-follow.js +1 -0
- package/clis/slock/thread-list.js +1 -0
- package/clis/slock/thread-state.js +1 -0
- package/clis/slock/thread-undone.js +1 -0
- package/clis/slock/thread-unfollow.js +1 -0
- package/clis/slock/unread-summary.js +18 -0
- package/clis/slock/whoami.js +1 -0
- package/clis/smzdm/search.js +71 -0
- package/clis/sohu/article.js +1 -0
- package/clis/sohu/attributes.js +1 -0
- package/clis/sohu/categories.js +1 -0
- package/clis/sohu/channels.js +1 -0
- package/clis/sohu/columns.js +1 -0
- package/clis/sohu/login.js +1 -0
- package/clis/sohu/mpbp.js +1 -0
- package/clis/sohu/stats.js +95 -0
- package/clis/sohu/topics.js +1 -0
- package/clis/sohu/whoami.js +1 -0
- package/clis/spotify/spotify.js +1 -0
- package/clis/spotify/utils.js +8 -0
- package/clis/stackoverflow/bounties.js +1 -0
- package/clis/stackoverflow/hot.js +1 -0
- package/clis/stackoverflow/read.js +13 -0
- package/clis/stackoverflow/related.js +1 -0
- package/clis/stackoverflow/search.js +1 -0
- package/clis/stackoverflow/tag.js +1 -0
- package/clis/stackoverflow/unanswered.js +1 -0
- package/clis/stackoverflow/user.js +1 -0
- package/clis/stackoverflow/utils.js +1 -0
- package/clis/steam/app.js +1 -0
- package/clis/steam/search.js +1 -0
- package/clis/steam/top-sellers.js +1 -0
- package/clis/steam/utils.js +1 -0
- package/clis/substack/auth.js +11 -0
- package/clis/substack/feed.js +1 -0
- package/clis/substack/post-utils.js +2 -0
- package/clis/substack/publication.js +1 -0
- package/clis/substack/publish.js +10 -0
- package/clis/substack/search.js +1 -0
- package/clis/substack/utils.js +108 -0
- package/clis/suno/auth.js +21 -0
- package/clis/suno/download.js +17 -0
- package/clis/suno/generate.js +4 -0
- package/clis/suno/list.js +14 -0
- package/clis/suno/status.js +1 -0
- package/clis/suno/utils.js +102 -0
- package/clis/taobao/add-cart.js +93 -0
- package/clis/taobao/auth.js +8 -0
- package/clis/taobao/cart.js +68 -0
- package/clis/taobao/detail.js +48 -0
- package/clis/taobao/reviews.js +52 -0
- package/clis/taobao/search.js +64 -0
- package/clis/tdx/hot-rank.js +25 -0
- package/clis/telegram/send.js +18 -0
- package/clis/telegram/shared.js +21 -0
- package/clis/telegram/whoami.js +1 -0
- package/clis/test-utils.js +1 -0
- package/clis/threads/post.js +152 -0
- package/clis/threads/shared.js +27 -0
- package/clis/threads/whoami.js +1 -0
- package/clis/ths/hot-rank.js +27 -0
- package/clis/tieba/hot.js +16 -0
- package/clis/tieba/posts.js +1 -0
- package/clis/tieba/read.js +84 -0
- package/clis/tieba/search.js +54 -0
- package/clis/tieba/utils.js +1 -0
- package/clis/tiktok/auth.js +30 -0
- package/clis/tiktok/comment.js +69 -0
- package/clis/tiktok/creator-videos.js +45 -0
- package/clis/tiktok/explore.js +76 -0
- package/clis/tiktok/follow.js +49 -0
- package/clis/tiktok/following.js +103 -0
- package/clis/tiktok/friends.js +79 -0
- package/clis/tiktok/like.js +19 -0
- package/clis/tiktok/live.js +79 -0
- package/clis/tiktok/notifications.js +77 -0
- package/clis/tiktok/profile.js +26 -0
- package/clis/tiktok/publish.js +82 -0
- package/clis/tiktok/save.js +15 -0
- package/clis/tiktok/search.js +24 -0
- package/clis/tiktok/unfollow.js +59 -0
- package/clis/tiktok/unlike.js +19 -0
- package/clis/tiktok/unsave.js +17 -0
- package/clis/tiktok/user.js +143 -0
- package/clis/tiktok/utils.js +272 -0
- package/clis/toutiao/article.js +1 -0
- package/clis/toutiao/articles.js +6 -0
- package/clis/toutiao/auth.js +50 -0
- package/clis/toutiao/hot.js +1 -0
- package/clis/toutiao/utils.js +2 -0
- package/clis/trae-cn/activity.js +1 -0
- package/clis/trae-cn/approve.js +1 -0
- package/clis/trae-cn/ask.js +1 -0
- package/clis/trae-cn/dump.js +1 -0
- package/clis/trae-cn/export.js +3 -0
- package/clis/trae-cn/model.js +1 -0
- package/clis/trae-cn/new.js +1 -0
- package/clis/trae-cn/read.js +1 -0
- package/clis/trae-cn/screenshot.js +1 -0
- package/clis/trae-cn/select-model.js +1 -0
- package/clis/trae-cn/send.js +1 -0
- package/clis/trae-cn/setup.js +1 -0
- package/clis/trae-cn/status.js +1 -0
- package/clis/trae-cn/targets.js +1 -0
- package/clis/trae-cn/utils.js +456 -0
- package/clis/trae-cn/watch.js +3 -0
- package/clis/trae-solo/_actions.js +41 -0
- package/clis/trae-solo/_fs.js +6 -0
- package/clis/trae-solo/_state.js +2 -0
- package/clis/trae-solo/automation.js +43 -0
- package/clis/trae-solo/history.js +15 -0
- package/clis/trae-solo/mode.js +31 -0
- package/clis/trae-solo/model.js +50 -0
- package/clis/trae-solo/renderer-storage.js +11 -0
- package/clis/trae-solo/settings.js +1 -0
- package/clis/trae-solo/skill-fs.js +1 -0
- package/clis/trae-solo/skill.js +81 -0
- package/clis/trae-solo/state-fs.js +2 -0
- package/clis/trae-solo/status.js +1 -0
- package/clis/trae-solo/task-fs.js +5 -0
- package/clis/trae-solo/user-rules.js +1 -0
- package/clis/trae-solo/workspaces-fs.js +1 -0
- package/clis/tumblr/auth.js +24 -0
- package/clis/tumblr/publish.js +14 -0
- package/clis/tvmaze/search.js +1 -0
- package/clis/tvmaze/show.js +1 -0
- package/clis/tvmaze/utils.js +1 -0
- package/clis/twitter/accept.js +116 -0
- package/clis/twitter/article.js +116 -0
- package/clis/twitter/auth.js +4 -0
- package/clis/twitter/block.js +62 -0
- package/clis/twitter/bookmark-folder.js +4 -0
- package/clis/twitter/bookmark-folders.js +4 -0
- package/clis/twitter/bookmark.js +44 -0
- package/clis/twitter/bookmarks.js +27 -0
- package/clis/twitter/delete.js +36 -0
- package/clis/twitter/device-follow.js +13 -0
- package/clis/twitter/dm-list.js +1 -0
- package/clis/twitter/dm-read.js +1 -0
- package/clis/twitter/dm-send.js +13 -0
- package/clis/twitter/dm-shared.js +6 -0
- package/clis/twitter/download.js +38 -0
- package/clis/twitter/follow-batch.js +43 -0
- package/clis/twitter/follow.js +39 -0
- package/clis/twitter/followers.js +59 -0
- package/clis/twitter/following.js +4 -0
- package/clis/twitter/hide-reply.js +57 -0
- package/clis/twitter/like.js +48 -0
- package/clis/twitter/likes.js +14 -0
- package/clis/twitter/list-add-batch.js +1 -0
- package/clis/twitter/list-add-core.js +35 -0
- package/clis/twitter/list-add.js +1 -0
- package/clis/twitter/list-batch-utils.js +1 -0
- package/clis/twitter/list-create.js +12 -0
- package/clis/twitter/list-delete.js +36 -0
- package/clis/twitter/list-remove-batch.js +1 -0
- package/clis/twitter/list-remove-core.js +127 -0
- package/clis/twitter/list-remove.js +1 -0
- package/clis/twitter/list-tweets.js +27 -0
- package/clis/twitter/lists.js +27 -0
- package/clis/twitter/notifications.js +4 -0
- package/clis/twitter/post.js +158 -0
- package/clis/twitter/profile.js +66 -0
- package/clis/twitter/quote.js +123 -0
- package/clis/twitter/reply-dm.js +112 -0
- package/clis/twitter/reply.js +97 -0
- package/clis/twitter/retweet.js +62 -0
- package/clis/twitter/schedule.js +96 -0
- package/clis/twitter/scheduled-delete.js +60 -0
- package/clis/twitter/scheduled-list.js +15 -0
- package/clis/twitter/scheduled-utils.js +18 -0
- package/clis/twitter/search.js +12 -0
- package/clis/twitter/shared.js +76 -0
- package/clis/twitter/thread.js +4 -0
- package/clis/twitter/timeline.js +4 -0
- package/clis/twitter/trending.js +18 -0
- package/clis/twitter/tweets.js +12 -0
- package/clis/twitter/unblock.js +45 -0
- package/clis/twitter/unbookmark.js +41 -0
- package/clis/twitter/unfollow.js +45 -0
- package/clis/twitter/unlike.js +48 -0
- package/clis/twitter/unretweet.js +62 -0
- package/clis/twitter/utils.js +55 -0
- package/clis/uisdc/news.js +25 -0
- package/clis/uiverse/_shared.js +257 -0
- package/clis/uiverse/code.js +1 -0
- package/clis/uiverse/preview.js +1 -0
- package/clis/upwork/auth.js +19 -0
- package/clis/upwork/detail.js +22 -0
- package/clis/upwork/feed.js +21 -0
- package/clis/upwork/search.js +21 -0
- package/clis/upwork/utils.js +1 -0
- package/clis/v2ex/auth.js +10 -0
- package/clis/v2ex/daily.js +41 -0
- package/clis/v2ex/hot.js +1 -0
- package/clis/v2ex/latest.js +1 -0
- package/clis/v2ex/me.js +58 -0
- package/clis/v2ex/member.js +1 -0
- package/clis/v2ex/node.js +1 -0
- package/clis/v2ex/nodes.js +1 -0
- package/clis/v2ex/notifications.js +40 -0
- package/clis/v2ex/replies.js +1 -0
- package/clis/v2ex/topic.js +1 -0
- package/clis/v2ex/user.js +1 -0
- package/clis/vk/post.js +1 -0
- package/clis/vk/shared.js +8 -0
- package/clis/vk/whoami.js +1 -0
- package/clis/wanfang/search.js +42 -0
- package/clis/web/read.js +260 -0
- package/clis/wechat-channels/auth.js +31 -0
- package/clis/wechat-channels/publish.js +298 -0
- package/clis/weibo/article.js +1 -0
- package/clis/weibo/auth.js +17 -0
- package/clis/weibo/comments.js +28 -0
- package/clis/weibo/delete.js +84 -0
- package/clis/weibo/favorites.js +27 -0
- package/clis/weibo/feed.js +33 -0
- package/clis/weibo/hot.js +17 -0
- package/clis/weibo/me.js +51 -0
- package/clis/weibo/post.js +46 -0
- package/clis/weibo/publish.js +98 -0
- package/clis/weibo/search.js +47 -0
- package/clis/weibo/user-posts.js +92 -0
- package/clis/weibo/user.js +37 -0
- package/clis/weibo/utils.js +16 -0
- package/clis/weixin/article.js +1 -0
- package/clis/weixin/create-draft.js +152 -0
- package/clis/weixin/download.js +100 -0
- package/clis/weixin/drafts.js +27 -0
- package/clis/weixin/login.js +1 -0
- package/clis/weixin/search.js +44 -0
- package/clis/weixin/stats.js +43 -0
- package/clis/weixin/whoami.js +1 -0
- package/clis/weread/ai-outline.js +2 -0
- package/clis/weread/auth.js +24 -0
- package/clis/weread/book-search.js +2 -0
- package/clis/weread/book.js +3 -0
- package/clis/weread/highlights.js +1 -0
- package/clis/weread/notebooks.js +1 -0
- package/clis/weread/notes.js +1 -0
- package/clis/weread/ranking.js +1 -0
- package/clis/weread/search.js +1 -0
- package/clis/weread/shelf.js +1 -0
- package/clis/weread/utils.js +67 -0
- package/clis/weread-official/book.js +1 -0
- package/clis/weread-official/discover.js +1 -0
- package/clis/weread-official/list-apis.js +1 -0
- package/clis/weread-official/notes.js +1 -0
- package/clis/weread-official/readdata.js +1 -0
- package/clis/weread-official/review.js +1 -0
- package/clis/weread-official/search.js +1 -0
- package/clis/weread-official/shelf.js +1 -0
- package/clis/weread-official/utils.js +1 -0
- package/clis/wikidata/entity.js +1 -0
- package/clis/wikidata/search.js +1 -0
- package/clis/wikidata/utils.js +1 -0
- package/clis/wikipedia/page.js +3 -0
- package/clis/wikipedia/random.js +1 -0
- package/clis/wikipedia/search.js +1 -0
- package/clis/wikipedia/summary.js +1 -0
- package/clis/wikipedia/trending.js +1 -0
- package/clis/wikipedia/utils.js +1 -0
- package/clis/wordpress/login.js +1 -0
- package/clis/wordpress/publish.js +1 -0
- package/clis/wordpress/shared.js +54 -0
- package/clis/wordpress/whoami.js +1 -0
- package/clis/woshipm/article.js +1 -0
- package/clis/woshipm/login.js +1 -0
- package/clis/woshipm/stats.js +52 -0
- package/clis/woshipm/whoami.js +1 -0
- package/clis/wttr/current.js +1 -0
- package/clis/wttr/forecast.js +1 -0
- package/clis/wttr/utils.js +1 -0
- package/clis/xianyu/auth.js +11 -0
- package/clis/xianyu/chat.js +1 -0
- package/clis/xianyu/im.js +240 -0
- package/clis/xianyu/inbox.js +1 -0
- package/clis/xianyu/item.js +97 -0
- package/clis/xianyu/messages.js +1 -0
- package/clis/xianyu/publish.js +245 -0
- package/clis/xianyu/reply.js +1 -0
- package/clis/xianyu/search.js +141 -0
- package/clis/xianyu/utils.js +1 -0
- package/clis/xiaoe/auth.js +10 -0
- package/clis/xiaoe/catalog.js +134 -0
- package/clis/xiaoe/content.js +16 -0
- package/clis/xiaoe/courses.js +43 -0
- package/clis/xiaoe/detail.js +19 -0
- package/clis/xiaoe/play-url.js +97 -0
- package/clis/xiaohongshu/ask.js +130 -0
- package/clis/xiaohongshu/auth.js +13 -0
- package/clis/xiaohongshu/collection-helpers.js +64 -0
- package/clis/xiaohongshu/comments.js +89 -0
- package/clis/xiaohongshu/creator-note-detail.js +80 -0
- package/clis/xiaohongshu/creator-notes-summary.js +1 -0
- package/clis/xiaohongshu/creator-notes.js +107 -0
- package/clis/xiaohongshu/creator-profile.js +13 -0
- package/clis/xiaohongshu/creator-stats.js +13 -0
- package/clis/xiaohongshu/delete-note.js +69 -0
- package/clis/xiaohongshu/download.js +200 -0
- package/clis/xiaohongshu/draft-clear.js +44 -0
- package/clis/xiaohongshu/draft-delete.js +37 -0
- package/clis/xiaohongshu/draft-open.js +1 -0
- package/clis/xiaohongshu/draft-utils.js +36 -0
- package/clis/xiaohongshu/drafts.js +1 -0
- package/clis/xiaohongshu/feed.js +38 -0
- package/clis/xiaohongshu/follow.js +75 -0
- package/clis/xiaohongshu/liked.js +1 -0
- package/clis/xiaohongshu/note-helpers.js +1 -0
- package/clis/xiaohongshu/note.js +32 -0
- package/clis/xiaohongshu/notifications.js +1 -0
- package/clis/xiaohongshu/publish-video.js +87 -0
- package/clis/xiaohongshu/publish.js +637 -0
- package/clis/xiaohongshu/saved.js +1 -0
- package/clis/xiaohongshu/search.js +194 -0
- package/clis/xiaohongshu/unfollow.js +98 -0
- package/clis/xiaohongshu/user-helpers.js +1 -0
- package/clis/xiaohongshu/user.js +30 -0
- package/clis/xiaoyuzhou/auth.js +3 -0
- package/clis/xiaoyuzhou/download.js +1 -0
- package/clis/xiaoyuzhou/episode.js +1 -0
- package/clis/xiaoyuzhou/podcast-episodes.js +1 -0
- package/clis/xiaoyuzhou/podcast.js +1 -0
- package/clis/xiaoyuzhou/transcript.js +1 -0
- package/clis/xiaoyuzhou/utils.js +1 -0
- package/clis/xueqiu/article.js +4 -0
- package/clis/xueqiu/auth.js +27 -0
- package/clis/xueqiu/comments.js +38 -0
- package/clis/xueqiu/danjuan-utils.js +84 -0
- package/clis/xueqiu/earnings-date.js +1 -0
- package/clis/xueqiu/events.js +17 -0
- package/clis/xueqiu/feed.js +1 -0
- package/clis/xueqiu/fund-holdings.js +1 -0
- package/clis/xueqiu/fund-snapshot.js +1 -0
- package/clis/xueqiu/groups.js +1 -0
- package/clis/xueqiu/hashtags.js +26 -0
- package/clis/xueqiu/hot-stock.js +1 -0
- package/clis/xueqiu/hot.js +1 -0
- package/clis/xueqiu/kline.js +1 -0
- package/clis/xueqiu/search.js +1 -0
- package/clis/xueqiu/stock.js +1 -0
- package/clis/xueqiu/stocks.js +13 -0
- package/clis/xueqiu/users.js +12 -0
- package/clis/xueqiu/utils.js +9 -0
- package/clis/xueqiu/watchlist.js +1 -0
- package/clis/yahoo/search.js +21 -0
- package/clis/yahoo-finance/quote.js +50 -0
- package/clis/yollomi/background.js +1 -0
- package/clis/yollomi/edit.js +1 -0
- package/clis/yollomi/face-swap.js +1 -0
- package/clis/yollomi/generate.js +1 -0
- package/clis/yollomi/models.js +1 -0
- package/clis/yollomi/object-remover.js +1 -0
- package/clis/yollomi/remove-bg.js +1 -0
- package/clis/yollomi/restore.js +1 -0
- package/clis/yollomi/try-on.js +1 -0
- package/clis/yollomi/upload.js +17 -0
- package/clis/yollomi/upscale.js +1 -0
- package/clis/yollomi/utils.js +16 -0
- package/clis/yollomi/video.js +1 -0
- package/clis/youdao/note.js +113 -0
- package/clis/youtube/auth.js +20 -0
- package/clis/youtube/channel.js +118 -0
- package/clis/youtube/comments.js +64 -0
- package/clis/youtube/feed.js +89 -0
- package/clis/youtube/history.js +87 -0
- package/clis/youtube/like.js +33 -0
- package/clis/youtube/playlist.js +47 -0
- package/clis/youtube/publish.js +56 -0
- package/clis/youtube/search.js +39 -0
- package/clis/youtube/subscribe.js +42 -0
- package/clis/youtube/subscriptions.js +26 -0
- package/clis/youtube/transcript-group.js +2 -0
- package/clis/youtube/transcript.js +417 -0
- package/clis/youtube/unlike.js +33 -0
- package/clis/youtube/unsubscribe.js +42 -0
- package/clis/youtube/utils.js +34 -0
- package/clis/youtube/video.js +96 -0
- package/clis/youtube/watch-later.js +41 -0
- package/clis/yuanbao/ask.js +145 -0
- package/clis/yuanbao/auth.js +23 -0
- package/clis/yuanbao/detail.js +1 -0
- package/clis/yuanbao/history.js +1 -0
- package/clis/yuanbao/new.js +16 -0
- package/clis/yuanbao/read.js +1 -0
- package/clis/yuanbao/send.js +1 -0
- package/clis/yuanbao/shared.js +127 -0
- package/clis/yuanbao/status.js +1 -0
- package/clis/yuque/article.js +1 -0
- package/clis/yuque/whoami.js +1 -0
- package/clis/zhihu/answer-comments.js +11 -0
- package/clis/zhihu/answer-detail.js +11 -0
- package/clis/zhihu/answer.js +15 -0
- package/clis/zhihu/article-transform.js +1 -0
- package/clis/zhihu/article.js +7 -0
- package/clis/zhihu/auth.js +11 -0
- package/clis/zhihu/collection.js +7 -0
- package/clis/zhihu/collections.js +7 -0
- package/clis/zhihu/comment.js +17 -0
- package/clis/zhihu/download.js +39 -0
- package/clis/zhihu/favorite.js +39 -0
- package/clis/zhihu/follow.js +19 -0
- package/clis/zhihu/followers.js +1 -0
- package/clis/zhihu/following.js +1 -0
- package/clis/zhihu/hot.js +21 -0
- package/clis/zhihu/like.js +16 -0
- package/clis/zhihu/paginate.js +11 -0
- package/clis/zhihu/pin.js +24 -0
- package/clis/zhihu/pins.js +1 -0
- package/clis/zhihu/question.js +7 -0
- package/clis/zhihu/recommend.js +7 -0
- package/clis/zhihu/search.js +11 -0
- package/clis/zhihu/stats.js +41 -0
- package/clis/zhihu/target.js +1 -0
- package/clis/zhihu/text.js +6 -0
- package/clis/zhihu/user-answers.js +1 -0
- package/clis/zhihu/user-arg.js +1 -0
- package/clis/zhihu/user-articles.js +1 -0
- package/clis/zhihu/user.js +11 -0
- package/clis/zhihu/write-shared.js +71 -0
- package/clis/zlibrary/info.js +1 -0
- package/clis/zlibrary/search.js +1 -0
- package/clis/zlibrary/utils.js +48 -0
- package/clis/zsxq/auth.js +33 -0
- package/clis/zsxq/dynamics.js +1 -0
- package/clis/zsxq/groups.js +1 -0
- package/clis/zsxq/search.js +1 -0
- package/clis/zsxq/topic.js +1 -0
- package/clis/zsxq/topics.js +1 -0
- package/clis/zsxq/utils.js +72 -0
- package/dist/src/adapter-shadow.d.ts +11 -0
- package/dist/src/adapter-shadow.js +2 -0
- package/dist/src/adapter-shadow.test.d.ts +1 -0
- package/dist/src/adapter-source.d.ts +11 -0
- package/dist/src/adapter-source.js +1 -0
- package/dist/src/adapter-source.test.d.ts +1 -0
- package/dist/src/browser/analyze.d.ts +118 -0
- package/dist/src/browser/analyze.js +1 -0
- package/dist/src/browser/analyze.test.d.ts +1 -0
- package/dist/src/browser/article-extract.d.ts +57 -0
- package/dist/src/browser/article-extract.e2e.test.d.ts +1 -0
- package/dist/src/browser/article-extract.js +2 -0
- package/dist/src/browser/article-extract.test.d.ts +1 -0
- package/dist/src/browser/ax-snapshot.d.ts +37 -0
- package/dist/src/browser/ax-snapshot.js +2 -0
- package/dist/src/browser/ax-snapshot.test.d.ts +1 -0
- package/dist/src/browser/base-page.d.ts +151 -0
- package/dist/src/browser/base-page.js +225 -0
- package/dist/src/browser/base-page.test.d.ts +1 -0
- package/dist/src/browser/bridge-readiness.d.ts +14 -0
- package/dist/src/browser/bridge-readiness.js +1 -0
- package/dist/src/browser/bridge-readiness.test.d.ts +1 -0
- package/dist/src/browser/bridge.d.ts +26 -0
- package/dist/src/browser/bridge.js +1 -0
- package/dist/src/browser/cdp-click-fixture.test.d.ts +1 -0
- package/dist/src/browser/cdp.d.ts +51 -0
- package/dist/src/browser/cdp.js +1 -0
- package/dist/src/browser/cdp.test.d.ts +1 -0
- package/dist/src/browser/compound.d.ts +59 -0
- package/dist/src/browser/compound.js +82 -0
- package/dist/src/browser/compound.test.d.ts +1 -0
- package/dist/src/browser/config.d.ts +2 -0
- package/dist/src/browser/config.js +1 -0
- package/dist/src/browser/daemon-client.d.ts +79 -0
- package/dist/src/browser/daemon-client.js +1 -0
- package/dist/src/browser/daemon-client.test.d.ts +1 -0
- package/dist/src/browser/daemon-lifecycle.d.ts +37 -0
- package/dist/src/browser/daemon-lifecycle.js +12 -0
- package/dist/src/browser/daemon-transport.d.ts +55 -0
- package/dist/src/browser/daemon-transport.js +1 -0
- package/dist/src/browser/daemon-version.d.ts +4 -0
- package/dist/src/browser/daemon-version.js +2 -0
- package/dist/src/browser/dom-helpers.d.ts +41 -0
- package/dist/src/browser/dom-helpers.js +166 -0
- package/dist/src/browser/dom-helpers.test.d.ts +1 -0
- package/dist/src/browser/dom-snapshot.d.ts +93 -0
- package/dist/src/browser/dom-snapshot.js +809 -0
- package/dist/src/browser/dom-snapshot.test.d.ts +11 -0
- package/dist/src/browser/errors.d.ts +38 -0
- package/dist/src/browser/errors.js +5 -0
- package/dist/src/browser/errors.test.d.ts +1 -0
- package/dist/src/browser/extract.d.ts +69 -0
- package/dist/src/browser/extract.js +42 -0
- package/dist/src/browser/extract.test.d.ts +1 -0
- package/dist/src/browser/find.d.ts +84 -0
- package/dist/src/browser/find.js +328 -0
- package/dist/src/browser/find.test.d.ts +1 -0
- package/dist/src/browser/fingerprint.d.ts +44 -0
- package/dist/src/browser/fingerprint.js +82 -0
- package/dist/src/browser/html-tree.d.ts +75 -0
- package/dist/src/browser/html-tree.js +61 -0
- package/dist/src/browser/html-tree.test.d.ts +1 -0
- package/dist/src/browser/index.d.ts +14 -0
- package/dist/src/browser/index.js +1 -0
- package/dist/src/browser/managed-chrome.d.ts +89 -0
- package/dist/src/browser/managed-chrome.js +1 -0
- package/dist/src/browser/network-cache.d.ts +49 -0
- package/dist/src/browser/network-cache.js +1 -0
- package/dist/src/browser/network-cache.test.d.ts +1 -0
- package/dist/src/browser/network-key.d.ts +22 -0
- package/dist/src/browser/network-key.js +1 -0
- package/dist/src/browser/network-key.test.d.ts +1 -0
- package/dist/src/browser/page.d.ts +83 -0
- package/dist/src/browser/page.js +15 -0
- package/dist/src/browser/page.test.d.ts +1 -0
- package/dist/src/browser/profile.d.ts +96 -0
- package/dist/src/browser/profile.js +2 -0
- package/dist/src/browser/proxy-test.d.ts +28 -0
- package/dist/src/browser/proxy-test.js +12 -0
- package/dist/src/browser/shape-filter.d.ts +52 -0
- package/dist/src/browser/shape-filter.js +1 -0
- package/dist/src/browser/shape-filter.test.d.ts +1 -0
- package/dist/src/browser/shape.d.ts +23 -0
- package/dist/src/browser/shape.js +1 -0
- package/dist/src/browser/shape.test.d.ts +1 -0
- package/dist/src/browser/stealth.d.ts +18 -0
- package/dist/src/browser/stealth.js +391 -0
- package/dist/src/browser/stealth.test.d.ts +1 -0
- package/dist/src/browser/tabs.d.ts +13 -0
- package/dist/src/browser/tabs.js +2 -0
- package/dist/src/browser/target-errors.d.ts +39 -0
- package/dist/src/browser/target-errors.js +1 -0
- package/dist/src/browser/target-errors.test.d.ts +1 -0
- package/dist/src/browser/target-resolver.d.ts +158 -0
- package/dist/src/browser/target-resolver.js +423 -0
- package/dist/src/browser/target-resolver.test.d.ts +1 -0
- package/dist/src/browser/trace.d.ts +21 -0
- package/dist/src/browser/trace.js +2 -0
- package/dist/src/browser/utils.d.ts +20 -0
- package/dist/src/browser/utils.js +1 -0
- package/dist/src/browser/utils.test.d.ts +1 -0
- package/dist/src/browser/verify-fixture.d.ts +65 -0
- package/dist/src/browser/verify-fixture.js +2 -0
- package/dist/src/browser/verify-fixture.test.d.ts +1 -0
- package/dist/src/browser/visual-refs.d.ts +11 -0
- package/dist/src/browser/visual-refs.js +94 -0
- package/dist/src/browser-session-lock.d.ts +13 -0
- package/dist/src/browser-session-lock.js +1 -0
- package/dist/src/browser-session-lock.test.d.ts +1 -0
- package/dist/src/browser.test.d.ts +1 -0
- package/dist/src/build-manifest.d.ts +103 -0
- package/dist/src/build-manifest.js +16 -0
- package/dist/src/build-manifest.test.d.ts +1 -0
- package/dist/src/capabilityRouting.d.ts +19 -0
- package/dist/src/capabilityRouting.js +1 -0
- package/dist/src/capabilityRouting.test.d.ts +1 -0
- package/dist/src/cli-argv-preprocess.d.ts +63 -0
- package/dist/src/cli-argv-preprocess.js +1 -0
- package/dist/src/cli-argv-preprocess.test.d.ts +1 -0
- package/dist/src/cli.d.ts +79 -0
- package/dist/src/cli.js +132 -0
- package/dist/src/cli.test.d.ts +1 -0
- package/dist/src/commanderAdapter.d.ts +21 -0
- package/dist/src/commanderAdapter.js +3 -0
- package/dist/src/commanderAdapter.test.d.ts +1 -0
- package/dist/src/commands/auth.d.ts +40 -0
- package/dist/src/commands/auth.js +2 -0
- package/dist/src/commands/auth.test.d.ts +1 -0
- package/dist/src/commands/daemon.d.ts +25 -0
- package/dist/src/commands/daemon.js +1 -0
- package/dist/src/commands/daemon.test.d.ts +1 -0
- package/dist/src/completion-fast.d.ts +22 -0
- package/dist/src/completion-fast.js +1 -0
- package/dist/src/completion-shared.d.ts +13 -0
- package/dist/src/completion-shared.js +30 -0
- package/dist/src/completion.d.ts +21 -0
- package/dist/src/completion.js +1 -0
- package/dist/src/completion.test.d.ts +1 -0
- package/dist/src/constants.d.ts +22 -0
- package/dist/src/constants.js +1 -0
- package/dist/src/convention-audit.d.ts +50 -0
- package/dist/src/convention-audit.js +2 -0
- package/dist/src/convention-audit.test.d.ts +1 -0
- package/dist/src/daemon-utils.d.ts +18 -0
- package/dist/src/daemon-utils.js +1 -0
- package/dist/src/daemon.d.ts +22 -0
- package/dist/src/daemon.js +1 -0
- package/dist/src/daemon.test.d.ts +1 -0
- package/dist/src/discovery.d.ts +43 -0
- package/dist/src/discovery.js +2 -0
- package/dist/src/doctor.d.ts +38 -0
- package/dist/src/doctor.js +13 -0
- package/dist/src/doctor.test.d.ts +1 -0
- package/dist/src/download/article-download.d.ts +72 -0
- package/dist/src/download/article-download.js +21 -0
- package/dist/src/download/article-download.test.d.ts +1 -0
- package/dist/src/download/index.d.ts +71 -0
- package/dist/src/download/index.js +7 -0
- package/dist/src/download/index.test.d.ts +1 -0
- package/dist/src/download/media-download.d.ts +49 -0
- package/dist/src/download/media-download.js +1 -0
- package/dist/src/download/media-download.test.d.ts +1 -0
- package/dist/src/download/progress.d.ts +36 -0
- package/dist/src/download/progress.js +5 -0
- package/dist/src/download/progress.test.d.ts +1 -0
- package/dist/src/electron-apps.d.ts +31 -0
- package/dist/src/electron-apps.js +1 -0
- package/dist/src/electron-apps.test.d.ts +1 -0
- package/dist/src/engine.test.d.ts +1 -0
- package/dist/src/errors.d.ts +117 -0
- package/dist/src/errors.js +2 -0
- package/dist/src/errors.test.d.ts +1 -0
- package/dist/src/execution.d.ts +24 -0
- package/dist/src/execution.js +2 -0
- package/dist/src/execution.test.d.ts +1 -0
- package/dist/src/extension-manifest-regression.test.d.ts +1 -0
- package/dist/src/external-clis.yaml +109 -0
- package/dist/src/external.d.ts +49 -0
- package/dist/src/external.js +1 -0
- package/dist/src/external.test.d.ts +1 -0
- package/dist/src/help.d.ts +88 -0
- package/dist/src/help.js +8 -0
- package/dist/src/help.test.d.ts +1 -0
- package/dist/src/hooks.d.ts +46 -0
- package/dist/src/hooks.js +1 -0
- package/dist/src/hooks.test.d.ts +4 -0
- package/dist/src/interceptor.d.ts +44 -0
- package/dist/src/interceptor.js +123 -0
- package/dist/src/interceptor.test.d.ts +4 -0
- package/dist/src/launcher.d.ts +41 -0
- package/dist/src/launcher.js +7 -0
- package/dist/src/launcher.test.d.ts +1 -0
- package/dist/src/logger.d.ts +26 -0
- package/dist/src/logger.js +9 -0
- package/dist/src/main.d.ts +5 -0
- package/dist/src/main.js +10 -0
- package/dist/src/manifest-types.d.ts +43 -0
- package/dist/src/manifest-types.js +1 -0
- package/dist/src/node-network.d.ts +10 -0
- package/dist/src/node-network.js +1 -0
- package/dist/src/node-network.test.d.ts +1 -0
- package/dist/src/observation/artifact.d.ts +16 -0
- package/dist/src/observation/artifact.js +8 -0
- package/dist/src/observation/artifact.test.d.ts +1 -0
- package/dist/src/observation/events.d.ts +89 -0
- package/dist/src/observation/events.js +1 -0
- package/dist/src/observation/index.d.ts +7 -0
- package/dist/src/observation/index.js +1 -0
- package/dist/src/observation/manager.d.ts +9 -0
- package/dist/src/observation/manager.js +1 -0
- package/dist/src/observation/manager.test.d.ts +1 -0
- package/dist/src/observation/redaction.d.ts +11 -0
- package/dist/src/observation/redaction.js +2 -0
- package/dist/src/observation/redaction.test.d.ts +1 -0
- package/dist/src/observation/retention.d.ts +32 -0
- package/dist/src/observation/retention.js +1 -0
- package/dist/src/observation/retention.test.d.ts +1 -0
- package/dist/src/observation/ring-buffer.d.ts +22 -0
- package/dist/src/observation/ring-buffer.js +1 -0
- package/dist/src/observation/ring-buffer.test.d.ts +1 -0
- package/dist/src/observation/session.d.ts +25 -0
- package/dist/src/observation/session.js +1 -0
- package/dist/src/output.d.ts +14 -0
- package/dist/src/output.js +2 -0
- package/dist/src/output.test.d.ts +1 -0
- package/dist/src/package-exports.test.d.ts +1 -0
- package/dist/src/package-paths.d.ts +8 -0
- package/dist/src/package-paths.js +1 -0
- package/dist/src/pipeline/executor.d.ts +11 -0
- package/dist/src/pipeline/executor.js +1 -0
- package/dist/src/pipeline/executor.test.d.ts +4 -0
- package/dist/src/pipeline/index.d.ts +5 -0
- package/dist/src/pipeline/index.js +1 -0
- package/dist/src/pipeline/registry.d.ts +28 -0
- package/dist/src/pipeline/registry.js +1 -0
- package/dist/src/pipeline/steps/browser.d.ts +13 -0
- package/dist/src/pipeline/steps/browser.js +1 -0
- package/dist/src/pipeline/steps/download.d.ts +18 -0
- package/dist/src/pipeline/steps/download.js +1 -0
- package/dist/src/pipeline/steps/download.test.d.ts +1 -0
- package/dist/src/pipeline/steps/fetch.d.ts +5 -0
- package/dist/src/pipeline/steps/fetch.js +31 -0
- package/dist/src/pipeline/steps/fetch.test.d.ts +1 -0
- package/dist/src/pipeline/steps/intercept.d.ts +5 -0
- package/dist/src/pipeline/steps/intercept.js +1 -0
- package/dist/src/pipeline/steps/tap.d.ts +12 -0
- package/dist/src/pipeline/steps/tap.js +53 -0
- package/dist/src/pipeline/steps/transform.d.ts +9 -0
- package/dist/src/pipeline/steps/transform.js +1 -0
- package/dist/src/pipeline/template.d.ts +17 -0
- package/dist/src/pipeline/template.js +1 -0
- package/dist/src/pipeline/template.test.d.ts +4 -0
- package/dist/src/pipeline/transform.test.d.ts +4 -0
- package/dist/src/plugin-manifest.d.ts +70 -0
- package/dist/src/plugin-manifest.js +1 -0
- package/dist/src/plugin-manifest.test.d.ts +4 -0
- package/dist/src/plugin-scaffold.d.ts +28 -0
- package/dist/src/plugin-scaffold.js +75 -0
- package/dist/src/plugin-scaffold.test.d.ts +4 -0
- package/dist/src/plugin.d.ts +145 -0
- package/dist/src/plugin.js +20 -0
- package/dist/src/plugin.test.d.ts +4 -0
- package/dist/src/rate-limit.d.ts +15 -0
- package/dist/src/rate-limit.js +2 -0
- package/dist/src/rate-limit.test.d.ts +1 -0
- package/dist/src/registry-api.d.ts +13 -0
- package/dist/src/registry-api.js +1 -0
- package/dist/src/registry.d.ts +130 -0
- package/dist/src/registry.js +1 -0
- package/dist/src/registry.test.d.ts +4 -0
- package/dist/src/runtime-detect.d.ts +31 -0
- package/dist/src/runtime-detect.js +1 -0
- package/dist/src/runtime-detect.test.d.ts +1 -0
- package/dist/src/runtime.d.ts +57 -0
- package/dist/src/runtime.js +1 -0
- package/dist/src/scripts/framework.d.ts +7 -0
- package/dist/src/scripts/framework.js +1 -0
- package/dist/src/scripts/interact.d.ts +4 -0
- package/dist/src/scripts/interact.js +1 -0
- package/dist/src/scripts/store.d.ts +13 -0
- package/dist/src/scripts/store.js +1 -0
- package/dist/src/serialization.d.ts +42 -0
- package/dist/src/serialization.js +4 -0
- package/dist/src/serialization.test.d.ts +1 -0
- package/dist/src/skills.d.ts +14 -0
- package/dist/src/skills.js +6 -0
- package/dist/src/skills.test.d.ts +1 -0
- package/dist/src/snapshotFormatter.d.ts +11 -0
- package/dist/src/snapshotFormatter.js +3 -0
- package/dist/src/snapshotFormatter.test.d.ts +7 -0
- package/dist/src/tui.d.ts +28 -0
- package/dist/src/tui.js +16 -0
- package/dist/src/tui.test.d.ts +1 -0
- package/dist/src/types.d.ts +236 -0
- package/dist/src/types.js +1 -0
- package/dist/src/utils.d.ts +57 -0
- package/dist/src/utils.js +38 -0
- package/dist/src/utils.test.d.ts +1 -0
- package/dist/src/validate.d.ts +21 -0
- package/dist/src/validate.js +3 -0
- package/dist/src/validate.test.d.ts +9 -0
- package/dist/src/verify.d.ts +27 -0
- package/dist/src/verify.js +2 -0
- package/dist/src/verify.test.d.ts +8 -0
- package/dist/src/version.d.ts +4 -0
- package/dist/src/version.js +1 -0
- package/dist/src/weixin-download.test.d.ts +1 -0
- package/docs/guide/browser-bridge.md +94 -0
- package/docs/guide/electron-app-cli.md +199 -0
- package/docs/guide/exit-codes.md +24 -0
- package/docs/guide/extending-opencli.md +134 -0
- package/docs/guide/getting-started.md +81 -0
- package/docs/guide/installation.md +52 -0
- package/docs/guide/plugins.md +226 -0
- package/docs/guide/remote-orchestration.md +116 -0
- package/docs/guide/troubleshooting.md +69 -0
- package/package.json +116 -0
- package/scripts/check-doc-coverage.sh +81 -0
- package/scripts/check-listing-id-pairing.mjs +193 -0
- package/scripts/check-silent-column-drop.mjs +105 -0
- package/scripts/check-typed-error-lint.mjs +118 -0
- package/scripts/clean-dist.cjs +13 -0
- package/scripts/copy-yaml.cjs +12 -0
- package/scripts/fetch-adapters.js +293 -0
- package/scripts/minify-release.mjs +115 -0
- package/scripts/postinstall.js +174 -0
- package/scripts/silent-column-drop-baseline.json +910 -0
- package/scripts/typed-error-lint-baseline.json +1098 -0
- package/skills/opencli-adapter-author/SKILL.md +256 -0
- package/skills/opencli-adapter-author/references/adapter-template.md +471 -0
- package/skills/opencli-adapter-author/references/api-discovery.md +295 -0
- package/skills/opencli-adapter-author/references/coverage-matrix.md +81 -0
- package/skills/opencli-adapter-author/references/field-conventions.md +172 -0
- package/skills/opencli-adapter-author/references/field-decode-playbook.md +181 -0
- package/skills/opencli-adapter-author/references/jsdom-fixture-pattern.md +196 -0
- package/skills/opencli-adapter-author/references/output-design.md +149 -0
- package/skills/opencli-adapter-author/references/site-memory/bilibili.md +70 -0
- package/skills/opencli-adapter-author/references/site-memory/eastmoney.md +70 -0
- package/skills/opencli-adapter-author/references/site-memory/tonghuashun.md +51 -0
- package/skills/opencli-adapter-author/references/site-memory/xueqiu.md +58 -0
- package/skills/opencli-adapter-author/references/site-memory.md +231 -0
- package/skills/opencli-adapter-author/references/site-recon.md +134 -0
- package/skills/opencli-adapter-author/references/strategy-selection.md +169 -0
- package/skills/opencli-adapter-author/references/success-rate-pitfalls.md +162 -0
- package/skills/opencli-adapter-author/references/typed-errors.md +234 -0
- package/skills/opencli-autofix/SKILL.md +297 -0
- package/skills/opencli-browser/SKILL.md +468 -0
- package/skills/opencli-browser-sitemap/SKILL.md +96 -0
- package/skills/opencli-sitemap-author/SKILL.md +161 -0
- package/skills/opencli-sitemap-author/references/sitemap-schema.md +660 -0
- package/skills/opencli-usage/SKILL.md +168 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import{CommandExecutionError as V,selectorError as W}from"@jackwener/opencli/errors";const H="convo-pill-";export function unwrapEvaluateResult(q){if(q&&typeof q==="object"&&Object.prototype.hasOwnProperty.call(q,"data")&&Object.prototype.hasOwnProperty.call(q,"session"))return q.data;return q}export function buildPillTestId(q){return`${H}${String(q).toLowerCase()}`}export async function listConversations(q){const x=unwrapEvaluateResult(await q.evaluate(`(function() {
|
|
2
|
+
return Array.from(document.querySelectorAll('[data-testid^="${H}"]'))
|
|
3
|
+
.filter((el) => el.offsetParent)
|
|
4
|
+
.map((el, idx) => ({
|
|
5
|
+
index: idx + 1,
|
|
6
|
+
id: el.getAttribute('data-testid').slice(${H.length}),
|
|
7
|
+
title: (el.textContent || '').trim().slice(0, 200),
|
|
8
|
+
}));
|
|
9
|
+
})()`));return Array.isArray(x)?x:[]}export async function conversationVisible(q,x){const z=buildPillTestId(x);return!!unwrapEvaluateResult(await q.evaluate(`(() => {
|
|
10
|
+
const el = document.querySelector(${JSON.stringify(`[data-testid="${z}"]`)});
|
|
11
|
+
return !!(el && el.offsetParent);
|
|
12
|
+
})()`))}export async function getConversationMenuLabels(q,x){const z=buildPillTestId(x);return unwrapEvaluateResult(await q.evaluate(`(async () => {
|
|
13
|
+
const wait = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
14
|
+
const pill = document.querySelector(${JSON.stringify(`[data-testid="${z}"]`)});
|
|
15
|
+
if (!pill) return { ok: false, reason: 'Conversation pill not found.', detail: 'testid=${z}' };
|
|
16
|
+
let row = pill;
|
|
17
|
+
for (let i = 0; i < 3; i++) row = row.parentElement || row;
|
|
18
|
+
row.scrollIntoView({ block: 'center' });
|
|
19
|
+
row.dispatchEvent(new MouseEvent('mouseenter', { bubbles: true }));
|
|
20
|
+
row.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
|
21
|
+
let dotBtn = null;
|
|
22
|
+
for (let attempt = 0; attempt < 12; attempt += 1) {
|
|
23
|
+
await wait(80);
|
|
24
|
+
const btns = Array.from(row.querySelectorAll('button')).filter((b) => b.offsetParent);
|
|
25
|
+
if (btns.length >= 1) { dotBtn = btns[0]; break; }
|
|
26
|
+
}
|
|
27
|
+
if (!dotBtn) return { ok: false, reason: 'Per-row 3-dot trigger never mounted after hover.' };
|
|
28
|
+
const r = dotBtn.getBoundingClientRect();
|
|
29
|
+
const init = {
|
|
30
|
+
bubbles: true, cancelable: true, button: 0, buttons: 1,
|
|
31
|
+
clientX: Math.round(r.left + r.width / 2),
|
|
32
|
+
clientY: Math.round(r.top + r.height / 2),
|
|
33
|
+
};
|
|
34
|
+
dotBtn.dispatchEvent(new PointerEvent('pointerdown', { ...init, pointerType: 'mouse' }));
|
|
35
|
+
dotBtn.dispatchEvent(new MouseEvent('mousedown', init));
|
|
36
|
+
dotBtn.dispatchEvent(new PointerEvent('pointerup', { ...init, pointerType: 'mouse' }));
|
|
37
|
+
dotBtn.dispatchEvent(new MouseEvent('mouseup', init));
|
|
38
|
+
dotBtn.dispatchEvent(new MouseEvent('click', init));
|
|
39
|
+
let menuItems = [];
|
|
40
|
+
for (let attempt = 0; attempt < 20; attempt += 1) {
|
|
41
|
+
await wait(80);
|
|
42
|
+
menuItems = Array.from(document.querySelectorAll('[role="menuitem"], [role="option"]'))
|
|
43
|
+
.filter((it) => it instanceof HTMLElement && it.offsetParent);
|
|
44
|
+
if (menuItems.length) break;
|
|
45
|
+
}
|
|
46
|
+
const labels = menuItems.map((it) => {
|
|
47
|
+
const clone = it.cloneNode(true);
|
|
48
|
+
clone.querySelectorAll('kbd').forEach((k) => k.remove());
|
|
49
|
+
return (clone.textContent || '').trim();
|
|
50
|
+
}).filter(Boolean);
|
|
51
|
+
document.body.click();
|
|
52
|
+
return { ok: true, labels };
|
|
53
|
+
})()`))||{ok:!1,reason:"Empty result from page.evaluate."}}export async function clickConversationMenuItem(q,x,z){const B=buildPillTestId(x),M=JSON.stringify(B),N=JSON.stringify(z);let K;try{K=unwrapEvaluateResult(await q.evaluate(`(async () => {
|
|
54
|
+
const wait = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
55
|
+
const testId = ${M};
|
|
56
|
+
const labels = ${N};
|
|
57
|
+
|
|
58
|
+
const pill = document.querySelector(\`[data-testid="\${testId}"]\`);
|
|
59
|
+
if (!pill) {
|
|
60
|
+
return { ok: false, reason: 'Conversation pill not found.', detail: 'testid=' + testId };
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Walk up to the row container — depth 3 holds the role="button" row
|
|
64
|
+
// with the per-row action buttons.
|
|
65
|
+
let row = pill;
|
|
66
|
+
for (let i = 0; i < 3; i++) row = row.parentElement || row;
|
|
67
|
+
if (!row) {
|
|
68
|
+
return { ok: false, reason: 'Could not locate the row container above the pill.' };
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
row.scrollIntoView({ block: 'center' });
|
|
72
|
+
|
|
73
|
+
// React synthetic hover mounts the per-row buttons. Visibility-state
|
|
74
|
+
// doesn't appear to gate Antigravity's overlay (unlike Codex), but
|
|
75
|
+
// we still dispatch the full set for safety.
|
|
76
|
+
row.dispatchEvent(new MouseEvent('mouseenter', { bubbles: true }));
|
|
77
|
+
row.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
|
78
|
+
|
|
79
|
+
// Wait for the row's 3-dot trigger to mount.
|
|
80
|
+
let dotBtn = null;
|
|
81
|
+
for (let attempt = 0; attempt < 12; attempt += 1) {
|
|
82
|
+
await wait(80);
|
|
83
|
+
const btns = Array.from(row.querySelectorAll('button')).filter((b) => b.offsetParent);
|
|
84
|
+
if (btns.length >= 1) { dotBtn = btns[0]; break; } // First button == more-options
|
|
85
|
+
}
|
|
86
|
+
if (!dotBtn) {
|
|
87
|
+
return { ok: false, reason: 'Per-row 3-dot trigger never mounted after hover.' };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Open the menu via full pointer chain.
|
|
91
|
+
const r = dotBtn.getBoundingClientRect();
|
|
92
|
+
const init = {
|
|
93
|
+
bubbles: true, cancelable: true, button: 0, buttons: 1,
|
|
94
|
+
clientX: Math.round(r.left + r.width / 2),
|
|
95
|
+
clientY: Math.round(r.top + r.height / 2),
|
|
96
|
+
};
|
|
97
|
+
dotBtn.dispatchEvent(new PointerEvent('pointerdown', { ...init, pointerType: 'mouse' }));
|
|
98
|
+
dotBtn.dispatchEvent(new MouseEvent('mousedown', init));
|
|
99
|
+
dotBtn.dispatchEvent(new PointerEvent('pointerup', { ...init, pointerType: 'mouse' }));
|
|
100
|
+
dotBtn.dispatchEvent(new MouseEvent('mouseup', init));
|
|
101
|
+
dotBtn.dispatchEvent(new MouseEvent('click', init));
|
|
102
|
+
|
|
103
|
+
// Wait for menu items to mount.
|
|
104
|
+
let menuItems = [];
|
|
105
|
+
for (let attempt = 0; attempt < 20; attempt += 1) {
|
|
106
|
+
await wait(80);
|
|
107
|
+
menuItems = Array.from(document.querySelectorAll('[role="menuitem"], [role="option"]'))
|
|
108
|
+
.filter((it) => it instanceof HTMLElement && it.offsetParent);
|
|
109
|
+
if (menuItems.length) break;
|
|
110
|
+
}
|
|
111
|
+
if (!menuItems.length) {
|
|
112
|
+
return { ok: false, reason: 'Conversation 3-dot menu did not open after click.' };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function leadingText(el) {
|
|
116
|
+
const clone = el.cloneNode(true);
|
|
117
|
+
clone.querySelectorAll('kbd').forEach((k) => k.remove());
|
|
118
|
+
return (clone.textContent || '').trim();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
let target = null;
|
|
122
|
+
for (const item of menuItems) {
|
|
123
|
+
const text = leadingText(item);
|
|
124
|
+
for (const label of labels) {
|
|
125
|
+
if (text === label || text.startsWith(label)) {
|
|
126
|
+
target = item;
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (target) break;
|
|
131
|
+
}
|
|
132
|
+
if (!target) {
|
|
133
|
+
const visible = menuItems.map(leadingText);
|
|
134
|
+
document.body.click(); // close menu
|
|
135
|
+
return {
|
|
136
|
+
ok: false,
|
|
137
|
+
reason: 'No menu item matched the requested label.',
|
|
138
|
+
detail: 'wanted=' + JSON.stringify(labels) + ' visible=' + JSON.stringify(visible),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Click via pointer chain too — radix is picky.
|
|
143
|
+
const tr = target.getBoundingClientRect();
|
|
144
|
+
const tinit = {
|
|
145
|
+
bubbles: true, cancelable: true, button: 0, buttons: 1,
|
|
146
|
+
clientX: Math.round(tr.left + tr.width / 2),
|
|
147
|
+
clientY: Math.round(tr.top + tr.height / 2),
|
|
148
|
+
};
|
|
149
|
+
const matchedLabel = leadingText(target);
|
|
150
|
+
// Defer to next microtask so the eval reply returns before any re-render.
|
|
151
|
+
Promise.resolve().then(() => {
|
|
152
|
+
try {
|
|
153
|
+
target.dispatchEvent(new PointerEvent('pointerdown', { ...tinit, pointerType: 'mouse' }));
|
|
154
|
+
target.dispatchEvent(new MouseEvent('mousedown', tinit));
|
|
155
|
+
target.dispatchEvent(new PointerEvent('pointerup', { ...tinit, pointerType: 'mouse' }));
|
|
156
|
+
target.dispatchEvent(new MouseEvent('mouseup', tinit));
|
|
157
|
+
target.dispatchEvent(new MouseEvent('click', tinit));
|
|
158
|
+
} catch {}
|
|
159
|
+
});
|
|
160
|
+
return { ok: true, clicked: matchedLabel };
|
|
161
|
+
})()`))}catch(G){const Q=String(G?.message||G);if(/Promise was collected|timed out after \d+s|Runtime\.evaluate/i.test(Q))return{ok:!0,clicked:z[0],note:"eval reply destroyed by post-click re-render; click likely fired"};throw G}return K||{ok:!1,reason:"Empty result from page.evaluate."}}export async function confirmDeleteDialog(q,x){const z=JSON.stringify(x);return unwrapEvaluateResult(await q.evaluate(`(async () => {
|
|
162
|
+
const wait = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
163
|
+
let dialog = null;
|
|
164
|
+
for (let attempt = 0; attempt < 15; attempt += 1) {
|
|
165
|
+
await wait(120);
|
|
166
|
+
dialog = document.querySelector('[role="alertdialog"], [role="dialog"]');
|
|
167
|
+
if (dialog && dialog.offsetParent) break;
|
|
168
|
+
}
|
|
169
|
+
if (!dialog) {
|
|
170
|
+
return { ok: false, reason: 'Delete confirm dialog did not appear.' };
|
|
171
|
+
}
|
|
172
|
+
const buttons = Array.from(dialog.querySelectorAll('button'));
|
|
173
|
+
const labels = ${z};
|
|
174
|
+
const confirmBtn = buttons.find((b) => {
|
|
175
|
+
const t = (b.textContent || '').trim();
|
|
176
|
+
return labels.some((l) => t === l || t.toLowerCase() === l.toLowerCase());
|
|
177
|
+
});
|
|
178
|
+
if (!confirmBtn) {
|
|
179
|
+
return {
|
|
180
|
+
ok: false,
|
|
181
|
+
reason: 'Confirm button not found in dialog.',
|
|
182
|
+
detail: 'present=' + JSON.stringify(buttons.map((b) => (b.textContent || '').trim())),
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
const r = confirmBtn.getBoundingClientRect();
|
|
186
|
+
const init = {
|
|
187
|
+
bubbles: true, button: 0, buttons: 1, cancelable: true,
|
|
188
|
+
clientX: Math.round(r.left + r.width / 2),
|
|
189
|
+
clientY: Math.round(r.top + r.height / 2),
|
|
190
|
+
};
|
|
191
|
+
Promise.resolve().then(() => {
|
|
192
|
+
try {
|
|
193
|
+
confirmBtn.dispatchEvent(new PointerEvent('pointerdown', { ...init, pointerType: 'mouse' }));
|
|
194
|
+
confirmBtn.dispatchEvent(new MouseEvent('mousedown', init));
|
|
195
|
+
confirmBtn.dispatchEvent(new PointerEvent('pointerup', { ...init, pointerType: 'mouse' }));
|
|
196
|
+
confirmBtn.dispatchEvent(new MouseEvent('mouseup', init));
|
|
197
|
+
confirmBtn.dispatchEvent(new MouseEvent('click', init));
|
|
198
|
+
} catch {}
|
|
199
|
+
});
|
|
200
|
+
return { ok: true, confirmed: (confirmBtn.textContent || '').trim() };
|
|
201
|
+
})()`))||{ok:!1,reason:"Empty result."}}export const conversationTargetArgs=[{name:"id",positional:!0,type:"string",required:!0,help:'Conversation UUID (the part after "convo-pill-" in the sidebar testid)'}];
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import{cli as D,Strategy as G}from"@jackwener/opencli/registry";import{ArgumentError as M,CommandExecutionError as H,EmptyResultError as K}from"@jackwener/opencli/errors";import{unwrapEvaluateResult as B}from"./_actions.js";function J(h){return`(() => {
|
|
2
|
+
const isVis = (el) => { const r = el.getBoundingClientRect(); return r.width > 1 && r.height > 1; };
|
|
3
|
+
for (const sel of ${JSON.stringify(h)}) {
|
|
4
|
+
const t = Array.from(document.querySelectorAll(sel)).filter(isVis)[0];
|
|
5
|
+
if (t) {
|
|
6
|
+
const r = t.getBoundingClientRect();
|
|
7
|
+
const opts = { bubbles: true, cancelable: true, clientX: r.x + r.width/2, clientY: r.y + r.height/2 };
|
|
8
|
+
t.dispatchEvent(new PointerEvent('pointerdown', opts));
|
|
9
|
+
t.dispatchEvent(new MouseEvent('mousedown', opts));
|
|
10
|
+
t.dispatchEvent(new PointerEvent('pointerup', opts));
|
|
11
|
+
t.dispatchEvent(new MouseEvent('mouseup', opts));
|
|
12
|
+
t.click();
|
|
13
|
+
return { ok: true, sel };
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return { ok: false, reason: 'No matching visible element.' };
|
|
17
|
+
})()`}function N(h){return`(() => {
|
|
18
|
+
const isVis = (el) => { const r = el.getBoundingClientRect(); return r.width > 1 && r.height > 1; };
|
|
19
|
+
for (const sel of ${JSON.stringify(h)}) {
|
|
20
|
+
const found = Array.from(document.querySelectorAll(sel)).filter(isVis);
|
|
21
|
+
if (found.length) {
|
|
22
|
+
const t = found[found.length - 1];
|
|
23
|
+
const r = t.getBoundingClientRect();
|
|
24
|
+
const opts = { bubbles: true, cancelable: true, clientX: r.x + r.width/2, clientY: r.y + r.height/2 };
|
|
25
|
+
t.dispatchEvent(new PointerEvent('pointerdown', opts));
|
|
26
|
+
t.dispatchEvent(new MouseEvent('mousedown', opts));
|
|
27
|
+
t.dispatchEvent(new PointerEvent('pointerup', opts));
|
|
28
|
+
t.dispatchEvent(new MouseEvent('mouseup', opts));
|
|
29
|
+
t.click();
|
|
30
|
+
return { ok: true, sel };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return { ok: false, reason: 'No matching visible element.' };
|
|
34
|
+
})()`}D({site:"antigravity",name:"react",access:"write",description:'Click "Good response" or "Bad response" on the LAST assistant message.',domain:"127.0.0.1",strategy:G.UI,browser:!0,args:[{name:"kind",positional:!0,required:!0,help:"good or bad"}],columns:["Status","Reaction"],func:async(h,f)=>{const q=String(f?.kind||"").trim().toLowerCase();if(q!=="good"&&q!=="bad")throw new M("kind",'must be "good" or "bad"');const z=q==="good"?"Good response":"Bad response",I=B(await h.evaluate(N([`button[aria-label="${z}"]`])));if(!I?.ok)throw new H(I?.reason||`${z} click failed`,"");return[{Status:"clicked",Reaction:q}]}});D({site:"antigravity",name:"copy-message",access:"write",description:"Return the text of the last assistant message (best-effort: walks up from the last visible Copy button).",domain:"127.0.0.1",strategy:G.UI,browser:!0,args:[{name:"click-button",type:"boolean",default:!1,help:"Also click the in-UI Copy button"}],columns:["Field","Value"],func:async(h,f)=>{const q=B(await h.evaluate(`(() => {
|
|
35
|
+
const isVis = (el) => { const r = el.getBoundingClientRect(); return r.width > 1 && r.height > 1; };
|
|
36
|
+
// Antigravity has both "Copy" (message) and "Copy code" (code block) buttons.
|
|
37
|
+
// We want the bottom-of-message Copy, not the code-block Copy.
|
|
38
|
+
const copies = Array.from(document.querySelectorAll('button[aria-label="Copy"]')).filter(isVis);
|
|
39
|
+
if (!copies.length) return null;
|
|
40
|
+
const lastCopy = copies[copies.length - 1];
|
|
41
|
+
let container = lastCopy;
|
|
42
|
+
let best = '';
|
|
43
|
+
for (let i = 0; i < 8 && container.parentElement; i++) {
|
|
44
|
+
container = container.parentElement;
|
|
45
|
+
const txt = (container.innerText || '').trim();
|
|
46
|
+
if (txt.length > best.length) best = txt;
|
|
47
|
+
if (best.length > 200) break;
|
|
48
|
+
}
|
|
49
|
+
return { text: best };
|
|
50
|
+
})()`));if(!q)throw new K("antigravity copy-message","No Copy buttons visible — make sure an assistant reply is on screen.");if(f?.["click-button"]===!0||f?.["click-button"]==="true"){const z=B(await h.evaluate(N(['button[aria-label="Copy"]'])));if(!z?.ok)throw new H(z?.reason||"Copy button click failed","")}return[{Field:"Length",Value:String((q.text||"").length)+" chars"},{Field:"ClipboardClicked",Value:f?.["click-button"]===!0||f?.["click-button"]==="true"?"yes":"no"},{Field:"Text",Value:q.text||""}]}});D({site:"antigravity",name:"copy-code",access:"read",description:"Return the text of a code block in the current conversation. Default: last code block; pass --index N (1-based from top) to pick a specific one.",domain:"127.0.0.1",strategy:G.UI,browser:!0,args:[{name:"index",type:"int",required:!1,help:"1-based index of code block (default: last)"}],columns:["Field","Value"],func:async(h,f)=>{const q=Number.isInteger(f?.index)?f.index:null,z=B(await h.evaluate(`(() => {
|
|
51
|
+
const isVis = (el) => { const r = el.getBoundingClientRect(); return r.width > 1 && r.height > 1; };
|
|
52
|
+
const btns = Array.from(document.querySelectorAll('button[aria-label="Copy code"]')).filter(isVis);
|
|
53
|
+
if (!btns.length) return null;
|
|
54
|
+
const idx = ${q===null?"btns.length - 1":q-1};
|
|
55
|
+
const btn = btns[idx];
|
|
56
|
+
if (!btn) return { err: 'index ' + (${q} ?? 'last') + ' out of range. Have ' + btns.length + ' code blocks.' };
|
|
57
|
+
// Find the <code> or <pre> element inside the parent block.
|
|
58
|
+
let container = btn;
|
|
59
|
+
for (let i = 0; i < 6 && container.parentElement; i++) container = container.parentElement;
|
|
60
|
+
const code = container.querySelector('pre, code');
|
|
61
|
+
return { text: code ? (code.innerText || '').trim() : (container.innerText || '').trim(), total: btns.length };
|
|
62
|
+
})()`));if(!z)throw new K("antigravity copy-code","No code blocks visible.");if(z.err)throw new H(z.err,"");return[{Field:"TotalCodeBlocks",Value:String(z.total)},{Field:"PickedIndex",Value:String(q===null?z.total:q)},{Field:"Length",Value:String((z.text||"").length)+" chars"},{Field:"Code",Value:z.text||""}]}});D({site:"antigravity",name:"settings",access:"write",description:'Click the Antigravity settings button (matched by data-testid="settings-button").',domain:"127.0.0.1",strategy:G.UI,browser:!0,args:[],columns:["Status"],func:async(h)=>{const f=B(await h.evaluate(J(['[data-testid="settings-button"]','button[aria-label="Settings"]'])));if(!f?.ok)throw new H(f?.reason||"settings click failed","");await h.wait(0.6);return[{Status:`clicked via ${f.sel}`}]}});D({site:"antigravity",name:"sidebar-toggle",access:"write",description:"Click Toggle Sidebar (collapses/expands the Antigravity sidebar).",domain:"127.0.0.1",strategy:G.UI,browser:!0,args:[],columns:["Status"],func:async(h)=>{const f=B(await h.evaluate(J(['button[aria-label="Toggle Sidebar"]'])));if(!f?.ok)throw new H(f?.reason||"sidebar-toggle failed","");return[{Status:"toggled"}]}});D({site:"antigravity",name:"nav",access:"write",description:"Click Go Back or Go Forward (Antigravity in-app history).",domain:"127.0.0.1",strategy:G.UI,browser:!0,args:[{name:"direction",positional:!0,required:!0,help:"back or forward"}],columns:["Status"],func:async(h,f)=>{const q=String(f?.direction||"").trim().toLowerCase();if(q!=="back"&&q!=="forward")throw new M("direction",'must be "back" or "forward"');const z=q==="back"?"Go Back":"Go Forward",I=B(await h.evaluate(J([`button[aria-label="${z}"]`])));if(!I?.ok)throw new H(I?.reason||`${z} click failed`,"");return[{Status:`${q} clicked`}]}});D({site:"antigravity",name:"toggle-aux",access:"write",description:"Toggle the Auxiliary Pane (Antigravity's secondary panel for code/preview).",domain:"127.0.0.1",strategy:G.UI,browser:!0,args:[],columns:["Status"],func:async(h)=>{const f=B(await h.evaluate(J(['button[aria-label="Toggle Auxiliary Pane"]'])));if(!f?.ok)throw new H(f?.reason||"toggle-aux failed","");return[{Status:"toggled"}]}});D({site:"antigravity",name:"display-options",access:"read",description:"Open the Display Options menu and list its items.",domain:"127.0.0.1",strategy:G.UI,browser:!0,args:[],columns:["Index","Item"],func:async(h)=>{const f=B(await h.evaluate(J(['button[aria-label="Display Options"]'])));if(!f?.ok)throw new H(f?.reason||"display-options click failed","");await h.wait(0.4);const q=B(await h.evaluate(`(() => {
|
|
63
|
+
const isVis = (el) => { const r = el.getBoundingClientRect(); return r.width > 1 && r.height > 1; };
|
|
64
|
+
const candidates = Array.from(document.querySelectorAll('[role="menu"], [role="dialog"], [class*="popover"i]'))
|
|
65
|
+
.filter(isVis)
|
|
66
|
+
// Filter out app-shell dialogs (huge ones); prefer small popovers (<600px wide).
|
|
67
|
+
.filter((el) => {
|
|
68
|
+
const r = el.getBoundingClientRect();
|
|
69
|
+
return r.width < 600 && r.height < 600;
|
|
70
|
+
});
|
|
71
|
+
if (!candidates.length) return [];
|
|
72
|
+
// The popover is usually the LAST one mounted (highest in DOM order).
|
|
73
|
+
const menu = candidates[candidates.length - 1];
|
|
74
|
+
return Array.from(menu.querySelectorAll('[role="menuitem"], [role="menuitemcheckbox"], [role="menuitemradio"], button'))
|
|
75
|
+
.filter(isVis)
|
|
76
|
+
.map((it) => (it.innerText || '').trim().replace(/\\s+/g, ' '))
|
|
77
|
+
.filter(Boolean);
|
|
78
|
+
})()`));try{await h.evaluate("document.body.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));")}catch{}if(!q.length)throw new K("antigravity display-options","Menu opened but no items detected.");return q.map((z,I)=>({Index:I+1,Item:z}))}});D({site:"antigravity",name:"add-context",access:"write",description:"Click the Add context button in the composer (opens file/URL picker for context attachment).",domain:"127.0.0.1",strategy:G.UI,browser:!0,args:[],columns:["Status"],func:async(h)=>{const f=B(await h.evaluate(J(['button[aria-label="Add context"]'])));if(!f?.ok)throw new H(f?.reason||"add-context click failed","");await h.wait(0.4);return[{Status:"clicked — picker should be open"}]}});D({site:"antigravity",name:"revert",access:"write",description:"Click the revert button (per-message revert for agent changes). Requires --yes (this modifies your workspace).",domain:"127.0.0.1",strategy:G.UI,browser:!0,args:[{name:"yes",type:"boolean",default:!1,help:"Actually revert (default: dry-run)"}],columns:["Status"],func:async(h,f)=>{if(!(f?.yes===!0||f?.yes==="true"||f?.yes==="1"))return[{Status:"dry-run — pass --yes to revert (modifies workspace)"}];const z=B(await h.evaluate(J(['[data-testid="revert-button"]','button[aria-label="Revert"]'])));if(!z?.ok)throw new H(z?.reason||"revert click failed","");await h.wait(1);return[{Status:"reverted"}]}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as K,Strategy as L}from"@jackwener/opencli/registry";import{CommandExecutionError as H}from"@jackwener/opencli/errors";import{clickConversationMenuItem as N,confirmDeleteDialog as O,conversationVisible as P,conversationTargetArgs as Q}from"./_actions.js";K({site:"antigravity",name:"delete",access:"write",description:"Delete an Antigravity conversation by ID. Antigravity asks for confirmation; we click through it. Require --yes to actually delete.",domain:"127.0.0.1",strategy:L.UI,browser:!0,args:[...Q,{name:"yes",type:"boolean",default:!1,help:"Actually delete (default: dry-run preview)"}],columns:["status","id"],func:async(q,B)=>{const z=String(B.id);if(!(B.yes===!0||B.yes==="true"||B.yes==="1"))return[{status:"dry-run (pass --yes to actually delete)",id:z}];const F=await N(q,z,["Delete Conversation","Delete"]);if(!F.ok)throw new H(`${F.reason}${F.detail?" "+F.detail:""}`,"Make sure Antigravity is in the foreground and the sidebar is open.");const G=await O(q,["Delete","Delete Conversation","Confirm","OK"]);if(!G.ok)throw new H(`${G.reason}${G.detail?" "+G.detail:""}`,"Delete menu fired but the confirm dialog did not show / its button was not found.");await q.wait(1);for(let J=0;J<10;J+=1){if(!await P(q,z))return[{status:"deleted",id:z}];await q.wait(0.5)}throw new H(`Delete did not remove conversation ${z} from the visible sidebar.`,"The delete click/confirmation may have failed or the selector contract drifted.")}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as r,Strategy as s}from"@jackwener/opencli/registry";import*as n from"node:fs";export const dumpCommand=r({site:"antigravity",name:"dump",access:"read",description:"Dump the DOM to help AI understand the UI",domain:"localhost",strategy:s.UI,browser:!0,args:[],columns:["htmlFile","snapFile"],func:async(a)=>{const i=await a.evaluate("document.body.innerHTML");n.writeFileSync("/tmp/antigravity-dom.html",i);let t="";try{const e=await a.snapshot({raw:!0});t="/tmp/antigravity-snapshot.json";n.writeFileSync(t,JSON.stringify(e,null,2))}catch(e){t="Failed"}return[{htmlFile:"/tmp/antigravity-dom.html",snapFile:t}]}});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import{cli as r,Strategy as n}from"@jackwener/opencli/registry";export const extractCodeCommand=r({site:"antigravity",name:"extract-code",access:"read",description:"Extract multi-line code blocks from the current Antigravity conversation",domain:"localhost",strategy:n.UI,browser:!0,args:[],columns:["code"],func:async(e)=>{return(await e.evaluate(`
|
|
2
|
+
async () => {
|
|
3
|
+
// Find standard pre/code blocks
|
|
4
|
+
let elements = Array.from(document.querySelectorAll('pre code'));
|
|
5
|
+
|
|
6
|
+
// Fallback to Monaco editor content inside the UI
|
|
7
|
+
if (elements.length === 0) {
|
|
8
|
+
elements = Array.from(document.querySelectorAll('.monaco-editor'));
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// Generic fallback to any code tag that spans multiple lines
|
|
12
|
+
if (elements.length === 0) {
|
|
13
|
+
elements = Array.from(document.querySelectorAll('code')).filter(c => c.innerText.includes('\\n'));
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return elements.map(el => el.innerText).filter(text => text.trim().length > 0);
|
|
17
|
+
}
|
|
18
|
+
`)).map((t)=>({code:t}))}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as a,Strategy as o}from"@jackwener/opencli/registry";import{EmptyResultError as l}from"@jackwener/opencli/errors";import{listConversations as m}from"./_actions.js";a({site:"antigravity",name:"history",access:"read",description:"List visible Antigravity conversations from the sidebar",domain:"127.0.0.1",strategy:o.UI,browser:!0,args:[{name:"limit",type:"int",required:!1,default:50,help:"Max conversations to return"}],columns:["Index","Id","Title"],func:async(r,i)=>{const n=await m(r),s=Number.isInteger(i.limit)&&i.limit>0?i.limit:50,e=n.slice(0,s);if(!e.length)throw new l("antigravity history","No conversations are visible in the sidebar. Open the sidebar and retry.");return e.map((t)=>({Index:t.index,Id:t.id,Title:t.title}))}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as d,Strategy as l}from"@jackwener/opencli/registry";import{CommandExecutionError as t}from"@jackwener/opencli/errors";import{clickConversationMenuItem as c,conversationTargetArgs as u,getConversationMenuLabels as s}from"./_actions.js";d({site:"antigravity",name:"mark-read",access:"write",description:"Mark an unread Antigravity conversation as read. Fails if the row is already read or the postcondition cannot be verified.",domain:"127.0.0.1",strategy:l.UI,browser:!0,args:[...u],columns:["status","id","clicked"],func:async(i,o)=>{const e=String(o.id),a=await s(i,e);if(!a.ok)throw new t(`${a.reason}${a.detail?" "+a.detail:""}`,"Make sure Antigravity is in the foreground and the sidebar is open.");if(!a.labels?.includes("Mark as Read"))throw new t(`Conversation ${e} is not currently markable as read.`,`Visible menu labels: ${JSON.stringify(a.labels||[])}`);const r=await c(i,e,["Mark as Read"]);if(!r.ok)throw new t(`${r.reason}${r.detail?" "+r.detail:""}`,"Make sure Antigravity is in the foreground and the sidebar is open.");await i.wait(0.6);const n=await s(i,e);if(!n.ok||!n.labels?.includes("Mark as Unread"))throw new t(`Could not verify conversation ${e} was marked read.`,`Visible menu labels after click: ${JSON.stringify(n.labels||[])}`);return[{status:"marked-read",id:e,clicked:r.clicked}]}});
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import{cli as N,Strategy as P}from"@jackwener/opencli/registry";import{ArgumentError as Q,CommandExecutionError as L,selectorError as T}from"@jackwener/opencli/errors";import{unwrapEvaluateResult as J}from"./_actions.js";N({site:"antigravity",name:"model",access:"write",description:"Read or switch the active model in Antigravity. Without arguments, reports the current model. With <name> (substring, case-insensitive), switches.",domain:"127.0.0.1",strategy:P.UI,browser:!0,args:[{name:"name",required:!1,positional:!0,help:"Substring (case-insensitive) of target model name. Omit to read current."},{name:"list",type:"boolean",default:!1,help:"List models in the picker (does not switch)"}],columns:["Status","Model"],func:async(F,G)=>{const K=String(G.name||"").trim().toLowerCase(),H=G.list===!0||G.list==="true",B=(D)=>String(D||"").trim().replace(/\s+/g," ").toLowerCase(),I=J(await F.evaluate(`(function() {
|
|
2
|
+
const btn = document.querySelector('button[aria-label^="Select model, current:"]');
|
|
3
|
+
if (!btn) return '';
|
|
4
|
+
const aria = btn.getAttribute('aria-label') || '';
|
|
5
|
+
const m = aria.match(/current:\\s*(.*)$/i);
|
|
6
|
+
return m ? m[1].trim() : (btn.textContent || '').trim();
|
|
7
|
+
})()`));if(!I)throw T('Antigravity model button (button[aria-label^="Select model, current:"]). Make sure a chat is open in the foreground.');if(!K&&!H)return[{Status:"Active",Model:I}];const M=JSON.stringify(K),h=J(await F.evaluate(`(async () => {
|
|
8
|
+
const wait = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
9
|
+
const trigger = document.querySelector('button[aria-label^="Select model, current:"]');
|
|
10
|
+
if (!trigger) return { ok: false, reason: 'trigger missing' };
|
|
11
|
+
|
|
12
|
+
// Open the picker dialog (full pointer chain — radix uses pointer events).
|
|
13
|
+
const r = trigger.getBoundingClientRect();
|
|
14
|
+
const init = {
|
|
15
|
+
bubbles: true, cancelable: true, button: 0, buttons: 1,
|
|
16
|
+
clientX: Math.round(r.left + r.width / 2),
|
|
17
|
+
clientY: Math.round(r.top + r.height / 2),
|
|
18
|
+
};
|
|
19
|
+
trigger.dispatchEvent(new PointerEvent('pointerdown', { ...init, pointerType: 'mouse' }));
|
|
20
|
+
trigger.dispatchEvent(new MouseEvent('mousedown', init));
|
|
21
|
+
trigger.dispatchEvent(new PointerEvent('pointerup', { ...init, pointerType: 'mouse' }));
|
|
22
|
+
trigger.dispatchEvent(new MouseEvent('mouseup', init));
|
|
23
|
+
trigger.dispatchEvent(new MouseEvent('click', init));
|
|
24
|
+
|
|
25
|
+
// Wait for the picker dialog to open. Antigravity renders it as a
|
|
26
|
+
// [role="dialog"] or a div with selectable rows (cursor-pointer).
|
|
27
|
+
let rows = [];
|
|
28
|
+
for (let attempt = 0; attempt < 18; attempt += 1) {
|
|
29
|
+
await wait(80);
|
|
30
|
+
rows = Array.from(document.querySelectorAll('[role="dialog"] .cursor-pointer, [role="dialog"] [role="option"], [role="dialog"] li, .cursor-pointer'))
|
|
31
|
+
.filter((el) => el instanceof HTMLElement && el.offsetParent);
|
|
32
|
+
// Filter out rows clearly outside the dialog (e.g. global cursor-pointer in sidebar)
|
|
33
|
+
const dialog = document.querySelector('[role="dialog"]');
|
|
34
|
+
if (dialog) {
|
|
35
|
+
rows = rows.filter((r) => dialog.contains(r));
|
|
36
|
+
}
|
|
37
|
+
if (rows.length) break;
|
|
38
|
+
}
|
|
39
|
+
if (!rows.length) {
|
|
40
|
+
return { ok: false, reason: 'Model picker dialog did not surface any rows.' };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const labels = rows.map((r) => (r.innerText || r.textContent || '').trim().slice(0, 80));
|
|
44
|
+
const target = ${M};
|
|
45
|
+
const listOnly = ${H?"true":"false"};
|
|
46
|
+
if (!target || listOnly) {
|
|
47
|
+
// Close picker (Esc) and return list.
|
|
48
|
+
document.dispatchEvent(new KeyboardEvent('keydown', { bubbles: true, key: 'Escape' }));
|
|
49
|
+
return { ok: true, labels };
|
|
50
|
+
}
|
|
51
|
+
const exactMatches = labels
|
|
52
|
+
.map((label, index) => ({ label, index }))
|
|
53
|
+
.filter((entry) => entry.label.toLowerCase() === target);
|
|
54
|
+
const matches = exactMatches.length ? exactMatches : labels
|
|
55
|
+
.map((label, index) => ({ label, index }))
|
|
56
|
+
.filter((entry) => entry.label.toLowerCase().includes(target));
|
|
57
|
+
if (!matches.length) {
|
|
58
|
+
document.dispatchEvent(new KeyboardEvent('keydown', { bubbles: true, key: 'Escape' }));
|
|
59
|
+
return { ok: false, reason: 'No model matched.', detail: 'wanted=' + target + ' visible=' + JSON.stringify(labels) };
|
|
60
|
+
}
|
|
61
|
+
if (matches.length > 1) {
|
|
62
|
+
document.dispatchEvent(new KeyboardEvent('keydown', { bubbles: true, key: 'Escape' }));
|
|
63
|
+
return { ok: false, reason: 'Ambiguous model match.', detail: 'wanted=' + target + ' matches=' + JSON.stringify(matches.map((m) => m.label)) };
|
|
64
|
+
}
|
|
65
|
+
const chosen = rows[matches[0].index];
|
|
66
|
+
const chosenLabel = matches[0].label;
|
|
67
|
+
|
|
68
|
+
const cr = chosen.getBoundingClientRect();
|
|
69
|
+
const cinit = {
|
|
70
|
+
bubbles: true, cancelable: true, button: 0, buttons: 1,
|
|
71
|
+
clientX: Math.round(cr.left + cr.width / 2),
|
|
72
|
+
clientY: Math.round(cr.top + cr.height / 2),
|
|
73
|
+
};
|
|
74
|
+
Promise.resolve().then(() => {
|
|
75
|
+
try {
|
|
76
|
+
chosen.dispatchEvent(new PointerEvent('pointerdown', { ...cinit, pointerType: 'mouse' }));
|
|
77
|
+
chosen.dispatchEvent(new MouseEvent('mousedown', cinit));
|
|
78
|
+
chosen.dispatchEvent(new PointerEvent('pointerup', { ...cinit, pointerType: 'mouse' }));
|
|
79
|
+
chosen.dispatchEvent(new MouseEvent('mouseup', cinit));
|
|
80
|
+
chosen.dispatchEvent(new MouseEvent('click', cinit));
|
|
81
|
+
} catch {}
|
|
82
|
+
});
|
|
83
|
+
return { ok: true, switched: true, chosen: chosenLabel, labels };
|
|
84
|
+
})()`));if(!h.ok){if(h.reason==="Ambiguous model match.")throw new Q(h.detail||"Ambiguous model match.");throw new L(h.reason,h.detail||"")}if(H)return h.labels.map((D)=>({Status:D.startsWith(I.slice(0,20))?"Active":"Available",Model:D}));await F.wait(0.8);let q="";for(let D=0;D<8;D+=1){q=J(await F.evaluate(`(function() {
|
|
85
|
+
const btn = document.querySelector('button[aria-label^="Select model, current:"]');
|
|
86
|
+
if (!btn) return '';
|
|
87
|
+
const aria = btn.getAttribute('aria-label') || '';
|
|
88
|
+
const m = aria.match(/current:\\s*(.*)$/i);
|
|
89
|
+
return m ? m[1].trim() : (btn.textContent || '').trim();
|
|
90
|
+
})()`));if(B(q)&&(B(h.chosen).includes(B(q))||B(q).includes(B(h.chosen))))return[{Status:"switched",Model:q}];if(B(q)===B(h.chosen))return[{Status:"switched",Model:q}];await F.wait(0.4)}throw new L(`Could not verify Antigravity model switched to ${h.chosen}.`,`Read back current model: ${q||"(empty)"}`)}});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{cli as d,Strategy as f}from"@jackwener/opencli/registry";export const newCommand=d({site:"antigravity",name:"new",access:"read",description:"Start a new conversation / clear context in Antigravity",domain:"localhost",strategy:f.UI,browser:!0,args:[],columns:["status"],func:async(b)=>{await b.evaluate(`
|
|
2
|
+
async () => {
|
|
3
|
+
const btn = document.querySelector('[data-tooltip-id="new-conversation-tooltip"]');
|
|
4
|
+
if (!btn) throw new Error('Could not find New Conversation button');
|
|
5
|
+
|
|
6
|
+
// In case it's disabled, we must check, but we'll try to click it anyway
|
|
7
|
+
btn.click();
|
|
8
|
+
}
|
|
9
|
+
`);await b.wait(0.5);return[{status:"Successfully started a new conversation"}]}});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{cli as q,Strategy as v}from"@jackwener/opencli/registry";export const readCommand=q({site:"antigravity",name:"read",access:"read",description:"Read the latest chat messages from Antigravity AI",domain:"localhost",strategy:v.UI,browser:!0,args:[{name:"last",help:"Number of recent messages to read (not fully implemented due to generic structure, currently returns full history text or latest chunk)"}],columns:["role","content"],func:async(d,z)=>{const m=await d.evaluate(`
|
|
2
|
+
async () => {
|
|
3
|
+
const container = document.getElementById('conversation');
|
|
4
|
+
if (!container) throw new Error('Could not find conversation container');
|
|
5
|
+
|
|
6
|
+
// Extract the full visible text of the conversation
|
|
7
|
+
// In Electron/Chromium, innerText preserves basic visual line breaks nicely
|
|
8
|
+
return container.innerText;
|
|
9
|
+
}
|
|
10
|
+
`);return[{role:"history",content:String(m).trim()}]}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as b,Strategy as q}from"@jackwener/opencli/registry";import{CommandExecutionError as z}from"@jackwener/opencli/errors";import{conversationTargetArgs as B}from"./_actions.js";b({site:"antigravity",name:"rename",access:"write",description:"Rename an Antigravity conversation by ID (NOT YET IMPLEMENTED — see source comment).",domain:"127.0.0.1",strategy:q.UI,browser:!0,args:[...B,{name:"title",positional:!0,type:"string",required:!0,help:"New title"}],columns:["status"],func:async()=>{throw new z("antigravity rename is not yet implemented — first attempt caused the conversation to be removed from the sidebar instead of renamed. Use the Antigravity UI to rename until this is fixed.","")}});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{cli as v,Strategy as z}from"@jackwener/opencli/registry";export const sendCommand=v({site:"antigravity",name:"send",access:"write",description:"Send a message to Antigravity AI via the internal Lexical editor",domain:"localhost",strategy:z.UI,browser:!0,args:[{name:"message",help:"The message text to send",required:!0,positional:!0}],columns:["Status","Message"],func:async(d,q)=>{const f=q.message;await d.evaluate(`
|
|
2
|
+
async () => {
|
|
3
|
+
const container = document.getElementById('antigravity.agentSidePanelInputBox');
|
|
4
|
+
if (!container) throw new Error('Could not find antigravity.agentSidePanelInputBox');
|
|
5
|
+
const editor = container.querySelector('[data-lexical-editor="true"]');
|
|
6
|
+
if (!editor) throw new Error('Could not find Antigravity input box');
|
|
7
|
+
|
|
8
|
+
editor.focus();
|
|
9
|
+
document.execCommand('insertText', false, ${JSON.stringify(f)});
|
|
10
|
+
}
|
|
11
|
+
`);await d.wait(0.5);await d.pressKey("Enter");return[{Status:"Sent successfully",Message:f}]}});
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import{createServer as E}from"node:http";import{CDPBridge as R}from"@jackwener/opencli/browser/cdp";import{resolveElectronEndpoint as w}from"@jackwener/opencli/launcher";import{EXIT_CODES as j,getErrorMessage as M}from"@jackwener/opencli/errors";function k(){const J="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";let Q="msg_";for(let W=0;W<24;W++)Q+=J[Math.floor(Math.random()*J.length)];return Q}function H(J){return Math.max(1,Math.ceil(J.length/3))}function C(J){if(typeof J==="string")return J;return J.filter((Q)=>Q.type==="text"&&Q.text).map((Q)=>Q.text).join(`
|
|
2
|
+
`)}function q(J){return new Promise((Q,W)=>{const Y=[];J.on("data",(K)=>Y.push(K));J.on("end",()=>Q(Buffer.concat(Y).toString("utf-8")));J.on("error",W)})}function F(J,Q,W){const Y=JSON.stringify(W);J.writeHead(Q,{"Content-Type":"application/json","Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, x-api-key, anthropic-version, Authorization"});J.end(Y)}function D(J){return new Promise((Q)=>setTimeout(Q,J))}function S(J,Q,W){if(J===void 0)return W;const Y=typeof J==="number"?J:parseInt(String(J),10);if(Number.isNaN(Y)||Y<=0){console.error(`[serve] Invalid ${Q}="${J}", using default ${W}s`);return W}return Y}function f(J,Q){return S(process.env[J],J,Q)}async function v(J){await J.evaluate(`
|
|
3
|
+
(() => {
|
|
4
|
+
const btn = document.querySelector('[data-tooltip-id="new-conversation-tooltip"]');
|
|
5
|
+
if (btn) btn.click();
|
|
6
|
+
})()
|
|
7
|
+
`);await D(1000)}async function h(J,Q){let W="claude sonnet 4.6";const Y=Q.toLowerCase();if(Y.includes("sonnet"))W="claude sonnet 4.6";else if(Y.includes("opus"))W="claude opus 4.6";else if(Y.includes("gemini")&&Y.includes("pro"))W="gemini 3.1 pro (high)";else if(Y.includes("gemini")&&Y.includes("flash"))W="gemini 3 flash";else if(Y.includes("gpt"))W="gpt-oss 120b";try{await J.evaluate(`
|
|
8
|
+
async () => {
|
|
9
|
+
const targetModelName = ${JSON.stringify(W)};
|
|
10
|
+
const trigger = document.querySelector('div[aria-haspopup="dialog"] > div[tabindex="0"]');
|
|
11
|
+
if (!trigger) return; // Silent fail if UI changed
|
|
12
|
+
|
|
13
|
+
// Open dropdown only if not already selected
|
|
14
|
+
if (trigger.innerText.toLowerCase().includes(targetModelName)) return;
|
|
15
|
+
|
|
16
|
+
trigger.click();
|
|
17
|
+
await new Promise(r => setTimeout(r, 200));
|
|
18
|
+
|
|
19
|
+
const spans = Array.from(document.querySelectorAll('[role="dialog"] span'));
|
|
20
|
+
const target = spans.find(s => s.innerText.toLowerCase().includes(targetModelName));
|
|
21
|
+
if (target) {
|
|
22
|
+
const optionNode = target.closest('.cursor-pointer') || target;
|
|
23
|
+
optionNode.click();
|
|
24
|
+
} else {
|
|
25
|
+
// Close if not found
|
|
26
|
+
trigger.click();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
`);await D(500)}catch(K){console.error(`[serve] Warning: Could not switch to model ${W}:`,K)}}async function m(J){const Q=await J.evaluate(`
|
|
30
|
+
(() => {
|
|
31
|
+
// Look for a cancel/stop button in the UI
|
|
32
|
+
const cancelBtn = document.querySelector('button[aria-label*="cancel" i], button[aria-label*="stop" i], button[title*="cancel" i], button[title*="stop" i]');
|
|
33
|
+
return !!cancelBtn;
|
|
34
|
+
})()
|
|
35
|
+
`);return Boolean(Q)}function y(J,Q=0){if(!J||Q>12)return null;const W=Array.from(J.children).filter((Y)=>Y.innerText?.trim().length>5);if(W.length>=2)return J;if(W.length===1)return y(W[0],Q+1);return J}async function V(J){const Q=await J.evaluate(`
|
|
36
|
+
(() => {
|
|
37
|
+
const container = document.getElementById('conversation');
|
|
38
|
+
if (!container) return '';
|
|
39
|
+
// Read only the first child div (actual chat content),
|
|
40
|
+
// skipping UI chrome like file change panels, model selectors, etc.
|
|
41
|
+
const chatContent = container.children[0];
|
|
42
|
+
return chatContent ? chatContent.innerText : container.innerText;
|
|
43
|
+
})()
|
|
44
|
+
`);return String(Q??"")}async function x(J,Q){const W=await J.evaluate(`
|
|
45
|
+
(() => {
|
|
46
|
+
const conv = document.getElementById('conversation')?.children[0];
|
|
47
|
+
const scroll = conv?.querySelector('.overflow-y-auto');
|
|
48
|
+
|
|
49
|
+
// Walk down until we find a container with multiple message siblings
|
|
50
|
+
function findMsgContainer(el, depth) {
|
|
51
|
+
if (!el || depth > 12) return null;
|
|
52
|
+
const nonEmpty = Array.from(el.children).filter(c => c.innerText && c.innerText.trim().length > 5);
|
|
53
|
+
if (nonEmpty.length >= 2) return el;
|
|
54
|
+
if (nonEmpty.length === 1) return findMsgContainer(nonEmpty[0], depth + 1);
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const container = findMsgContainer(scroll || conv, 0);
|
|
59
|
+
if (!container) return '';
|
|
60
|
+
|
|
61
|
+
// Get all non-empty children (skip trailing empty UI divs)
|
|
62
|
+
const msgs = Array.from(container.children).filter(
|
|
63
|
+
c => c.innerText && c.innerText.trim().length > 5
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
if (msgs.length === 0) return '';
|
|
67
|
+
|
|
68
|
+
// The last element is the last assistant reply
|
|
69
|
+
const last = msgs[msgs.length - 1];
|
|
70
|
+
return last.innerText || '';
|
|
71
|
+
})()
|
|
72
|
+
`);let Y=String(W??"").trim();if(Q&&Y.startsWith(Q))Y=Y.slice(Q.length).trim();Y=Y.replace(/^Thought for[^\n]*\n+/i,"").trim();Y=Y.replace(/\s*\bCopy\b\s*$/m,"").trim();const K=Math.floor(Y.length/2),$=Y.slice(0,K).trim(),A=Y.slice(K).trim();if($&&$===A)Y=$;return Y}async function T(J,Q,W){if(!W){await J.evaluate(`
|
|
73
|
+
(() => {
|
|
74
|
+
const container = document.getElementById('antigravity.agentSidePanelInputBox');
|
|
75
|
+
const editor = container?.querySelector('[data-lexical-editor="true"]');
|
|
76
|
+
if (!editor) throw new Error('Could not find input box');
|
|
77
|
+
editor.focus();
|
|
78
|
+
document.execCommand('insertText', false, ${JSON.stringify(Q)});
|
|
79
|
+
})()
|
|
80
|
+
`);await D(500);await J.pressKey("Enter");return}const Y=await J.evaluate(`
|
|
81
|
+
(() => {
|
|
82
|
+
const container = document.getElementById('antigravity.agentSidePanelInputBox');
|
|
83
|
+
if (!container) throw new Error('Could not find antigravity.agentSidePanelInputBox');
|
|
84
|
+
const editor = container.querySelector('[data-lexical-editor="true"]');
|
|
85
|
+
if (!editor) throw new Error('Could not find Antigravity input box');
|
|
86
|
+
const r = editor.getBoundingClientRect();
|
|
87
|
+
return JSON.stringify({ x: r.left + r.width / 2, y: r.top + r.height / 2 });
|
|
88
|
+
})()
|
|
89
|
+
`),{x:K,y:$}=JSON.parse(String(Y));await W.send("Input.dispatchMouseEvent",{type:"mousePressed",x:K,y:$,button:"left",clickCount:1});await D(50);await W.send("Input.dispatchMouseEvent",{type:"mouseReleased",x:K,y:$,button:"left",clickCount:1});await D(200);await W.send("Input.insertText",{text:Q});await D(300);await W.send("Input.dispatchKeyEvent",{type:"keyDown",key:"Enter",code:"Enter",windowsVirtualKeyCode:13,nativeVirtualKeyCode:13});await D(50);await W.send("Input.dispatchKeyEvent",{type:"keyUp",key:"Enter",code:"Enter",windowsVirtualKeyCode:13,nativeVirtualKeyCode:13})}async function u(J,Q,W={}){const Y=W.timeout??120000,K=W.pollInterval??500,$=Date.now()+Y;await D(1000);let A=!1,P=Q,O=0;const G=4;let U=0;while(Date.now()<$){try{const Z=await m(J),z=await V(J),B=z!==Q&&z.length>0;if(Z){A=!0;O=0}else{if(A){await D(500);return J}if(B)if(z===P){O++;if(O>=G)return J}else{O=0;P=z}}}catch(Z){const z=Z.message||String(Z),B=/closed|lost|not open|websocket/i.test(z);if(W.reconnect&&B&&U<2){U++;console.error(`[serve] CDP session loss detected (${z}), attempting to reconnect (${U}/2)...`);try{J=await W.reconnect();O=0;P=Q;continue}catch(X){console.error(`[serve] Reconnection failed: ${X.message}`);throw Z}}throw Z}await D(K)}throw Error(`Timeout waiting for Antigravity reply after ${Y/1000}s`)}async function b(J,Q,W={}){const{bridge:Y,timeout:K,reconnect:$}=W,A=J.messages.filter((Z)=>Z.role==="user");if(A.length===0)throw Error("No user message found in request");const P=A[A.length-1],O=C(P.content);if(!O.trim())throw Error("Empty user message");if(J.messages.length===1){console.error("[serve] New session detected (1 message). Starting new conversation in UI.");await v(Q)}if(J.model)await h(Q,J.model);const G=await V(Q);console.error(`[serve] Sending: "${O.slice(0,80)}${O.length>80?"...":""}"`);await T(Q,O,Y);console.error("[serve] Waiting for reply...");Q=await u(Q,G,{timeout:K,reconnect:$});const U=await x(Q,O);console.error(`[serve] Got reply: "${U.slice(0,80)}${U.length>80?"...":""}"`);return{id:k(),type:"message",role:"assistant",content:[{type:"text",text:U}],model:J.model??"antigravity",stop_reason:"end_turn",stop_sequence:null,usage:{input_tokens:H(O),output_tokens:H(U)}}}export async function startServe(J={}){const Q=J.port??8082,W=f("OPENCLI_ANTIGRAVITY_TIMEOUT",120),K=S(J.timeout,"--timeout",W)*1000;console.error(`[serve] Starting Antigravity API proxy on port ${Q} (timeout: ${K/1000}s)`);let $=null,A=null,P=!1;async function O(){if(A)try{await A.evaluate("1+1");return A}catch{console.error("[serve] CDP connection lost, reconnecting...");$?.close().catch(()=>{});$=null;A=null}const Z=await w("antigravity");if(process.env.OPENCLI_CDP_TARGET)console.error(`[serve] Using OPENCLI_CDP_TARGET=${process.env.OPENCLI_CDP_TARGET}`);try{const _=(await(await fetch(`${Z.replace(/\/$/,"")}/json`)).json()).filter((L)=>L.type==="page");console.error(`[serve] Available targets: ${_.map((L)=>`"${L.title}"`).join(", ")}`)}catch{}console.error(`[serve] Connecting via CDP (target pattern: "${process.env.OPENCLI_CDP_TARGET}")...`);$=new R;try{A=await $.connect({timeout:15000,cdpEndpoint:Z})}catch(B){$=null;const X=M(B),L=(B instanceof Error?B.cause:void 0)?.code==="ECONNREFUSED"||X.includes("ECONNREFUSED");throw Error(L?`Cannot connect to Antigravity at ${Z}.
|
|
90
|
+
1. Make sure Antigravity is running
|
|
91
|
+
2. Launch with: --remote-debugging-port=9234`:`CDP connection failed: ${X}`)}console.error("[serve] ✅ CDP connected.");if(!await A.evaluate(`
|
|
92
|
+
(() => !!document.getElementById('conversation') || !!document.getElementById('antigravity.agentSidePanelInputBox'))()
|
|
93
|
+
`))console.error("[serve] ⚠️ Warning: chat UI elements not found in this target. Try setting OPENCLI_CDP_TARGET to the correct window title.");return A}const G=E(async(Z,z)=>{if(Z.method==="OPTIONS"){z.writeHead(204,{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, x-api-key, anthropic-version, Authorization"});z.end();return}const X=(Z.url??"/").split("?")[0];try{if(Z.method==="GET"&&X==="/v1/models"){F(z,200,{data:[{id:"antigravity",object:"model",created:Math.floor(Date.now()/1000),owned_by:"antigravity"}]});return}if(Z.method==="POST"&&X==="/v1/messages"){if(P){F(z,429,{type:"error",error:{type:"rate_limit_error",message:"Another request is currently being processed. Antigravity can only handle one request at a time."}});return}P=!0;try{const _=await q(Z),L=JSON.parse(_);if(L.stream){F(z,400,{type:"error",error:{type:"invalid_request_error",message:'Streaming is not supported. Set "stream": false.'}});return}const I=await O(),N=await b(L,I,{bridge:$,timeout:K,reconnect:O});F(z,200,N)}finally{P=!1}return}if(Z.method==="GET"&&(X==="/"||X==="/health")){F(z,200,{ok:!0,cdpConnected:A!==null});return}F(z,404,{type:"error",error:{type:"not_found_error",message:`Not found: ${X}`}})}catch(_){console.error("[serve] Error:",_ instanceof Error?_.message:_);F(z,500,{type:"error",error:{type:"api_error",message:_ instanceof Error?_.message:"Internal server error"}})}});G.listen(Q,"127.0.0.1",()=>{console.error(`
|
|
94
|
+
[serve] ✅ Antigravity API proxy running at http://127.0.0.1:${Q}`);console.error("[serve] Compatible with Anthropic /v1/messages API");console.error("[serve] CDP connection will be established on first request.");console.error(`
|
|
95
|
+
[serve] Usage with Claude Code:`);console.error(` ANTHROPIC_BASE_URL=http://localhost:${Q} claude
|
|
96
|
+
`)});const U=()=>{console.error(`
|
|
97
|
+
[serve] Shutting down...`);$?.close().catch(()=>{});G.close();process.exit(j.SUCCESS)};process.on("SIGTERM",U);process.on("SIGINT",U);await new Promise(()=>{})}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as a,Strategy as e}from"@jackwener/opencli/registry";export const statusCommand=a({site:"antigravity",name:"status",access:"read",description:"Check Antigravity CDP connection and get current page state",domain:"localhost",strategy:e.UI,browser:!0,args:[],columns:["status","url","title"],func:async(t)=>{return{status:"Connected",url:await t.evaluate("window.location.href"),title:await t.evaluate("document.title")}}});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import*as J from"node:fs";import*as q from"node:path";import*as b from"node:os";import{execFileSync as f}from"node:child_process";import{cli as B,Strategy as I}from"@jackwener/opencli/registry";import{ArgumentError as h,CommandExecutionError as D,EmptyResultError as K}from"@jackwener/opencli/errors";import{unwrapEvaluateResult as P}from"./_actions.js";const W=["Index","Key","Bytes","Name","Preview","Database","Version","Kind","Path","Workspace Id","Folder","Modified","Field","Value"],y=q.join(b.homedir(),"Library/Application Support/Antigravity"),L=q.join(y,"User"),x=q.join(L,"globalStorage/state.vscdb"),M=q.join(L,"workspaceStorage"),U=q.join(L,"settings.json");function v(H,z){if(!J.existsSync(H))throw new D(`state.vscdb not found: ${H}`,"Has Antigravity been run at least once?");try{return f("/usr/bin/sqlite3",[H,z],{encoding:"utf-8",maxBuffer:67108864})}catch(Z){throw new D(`sqlite3 failed on ${q.basename(H)}: ${Z.message}`,"The DB may be locked by a running Antigravity instance. Try closing it or wait a few seconds.")}}function G(H){return v(H,"SELECT key FROM ItemTable ORDER BY key;").split(`
|
|
2
|
+
`).map((Z)=>Z.trim()).filter(Boolean)}function C(H,z){const Z=z.replace(/'/g,"''"),Y=v(H,`SELECT value FROM ItemTable WHERE key = '${Z}';`).trim();if(!Y)return null;try{return JSON.parse(Y)}catch{return Y}}function T(H){const z=H?.workspace?String(H.workspace).trim():"";if(!z)return x;const Z=q.join(M,z,"state.vscdb");if(!J.existsSync(Z))throw new D(`Workspace state.vscdb not found: ${Z}`,"List workspace ids with `opencli antigravity workspaces-list`.");return Z}B({site:"antigravity",name:"storage-keys",access:"read",description:"List localStorage / sessionStorage keys on the Antigravity renderer (CDP).",domain:"127.0.0.1",strategy:I.UI,browser:!0,args:[{name:"storage",required:!1,default:"local",help:'"local" or "session"'},{name:"filter",required:!1,help:"Case-insensitive substring filter"},{name:"limit",type:"int",required:!1,default:100,help:"Max rows to return"}],columns:W,func:async(H,z)=>{const Z=String(z?.storage||"local").trim().toLowerCase();if(Z!=="local"&&Z!=="session")throw new h("storage",'must be "local" or "session"');const Y=Z==="session"?"sessionStorage":"localStorage",X=P(await H.evaluate(`(() => {
|
|
3
|
+
const s = ${Y};
|
|
4
|
+
const out = [];
|
|
5
|
+
for (let i = 0; i < s.length; i++) {
|
|
6
|
+
const k = s.key(i); const v = s.getItem(k) || '';
|
|
7
|
+
out.push({ k, bytes: v.length });
|
|
8
|
+
}
|
|
9
|
+
return out;
|
|
10
|
+
})()`)),$=z?.filter?String(z.filter).toLowerCase():null,F=$?X.filter((V)=>V.k.toLowerCase().includes($)):X;if(!F.length)throw new K("antigravity storage-keys",$?`No keys match "${$}".`:`${Y} is empty.`);F.sort((V,j)=>V.k.localeCompare(j.k));const Q=Number.isInteger(z?.limit)&&z.limit>0?z.limit:100;return F.slice(0,Q).map((V,j)=>({Index:j+1,Key:V.k,Bytes:V.bytes}))}});B({site:"antigravity",name:"storage-get",access:"read",description:"Read a single localStorage / sessionStorage value on the Antigravity renderer.",domain:"127.0.0.1",strategy:I.UI,browser:!0,args:[{name:"key",positional:!0,required:!0,help:"Storage key name"},{name:"storage",required:!1,default:"local",help:'"local" or "session"'},{name:"max-bytes",type:"int",required:!1,default:4000,help:"Truncate value to this many chars"}],columns:W,func:async(H,z)=>{const Z=String(z?.key||"").trim();if(!Z)throw new h("key","is required");const X=String(z?.storage||"local").trim().toLowerCase()==="session"?"sessionStorage":"localStorage",$=P(await H.evaluate(`${X}.getItem(${JSON.stringify(Z)})`));if($===null)throw new D(`Key not found in ${X}: ${Z}`,"");const F=Number.isInteger(z["max-bytes"])&&z["max-bytes"]>0?z["max-bytes"]:4000;let Q=$,V="string";try{Q=JSON.parse($);V=Array.isArray(Q)?"array":typeof Q}catch{}const j=V==="string"?Q:JSON.stringify(Q,null,2),N=j.length>F;return[{Field:"Key",Value:Z},{Field:"Store",Value:X},{Field:"Type",Value:V},{Field:"Size",Value:`${j.length} chars${N?" (truncated)":""}`},{Field:"Value",Value:N?j.slice(0,F)+`
|
|
11
|
+
...(truncated)`:j}]}});B({site:"antigravity",name:"cookies",access:"read",description:"List cookies on the Antigravity renderer (JS-visible via document.cookie).",domain:"127.0.0.1",strategy:I.UI,browser:!0,args:[],columns:W,func:async(H)=>{const z=P(await H.evaluate("document.cookie"));if(!z)throw new K("antigravity cookies","document.cookie is empty.");return z.split("; ").map((Y)=>{const X=Y.indexOf("=");if(X<0)return{name:Y,value:""};return{name:Y.slice(0,X),value:Y.slice(X+1)}}).map((Y,X)=>({Index:X+1,Name:Y.name,Bytes:Y.value.length,Preview:Y.value.slice(0,40)+(Y.value.length>40?"…":"")}))}});B({site:"antigravity",name:"idb-list",access:"read",description:"List IndexedDB databases on the Antigravity renderer.",domain:"127.0.0.1",strategy:I.UI,browser:!0,args:[],columns:W,func:async(H)=>{const z=P(await H.evaluate("(async () => indexedDB.databases ? await indexedDB.databases() : [])()"));if(!Array.isArray(z)||!z.length)throw new K("antigravity idb-list","No IndexedDB databases.");return z.map((Z,Y)=>({Index:Y+1,Database:Z.name||"(unnamed)",Version:String(Z.version||"")}))}});B({site:"antigravity",name:"state-keys",access:"read",description:"List keys in Antigravity's globalStorage state.vscdb (VSCode-style). Pass --workspace <id> to query a per-workspace DB. Works while Antigravity is closed.",domain:"localhost",strategy:I.LOCAL,browser:!1,args:[{name:"filter",required:!1,help:"Case-insensitive substring filter over keys"},{name:"workspace",required:!1,help:"Workspace id (from workspaces-list) to query per-workspace DB"},{name:"limit",type:"int",required:!1,default:200,help:"Max rows to return"}],columns:W,func:async(H)=>{const z=T(H),Z=G(z),Y=H?.filter?String(H.filter).toLowerCase():null,X=Y?Z.filter((F)=>F.toLowerCase().includes(Y)):Z;if(!X.length)throw new K("antigravity state-keys",Y?`No keys match "${Y}".`:"No keys.");const $=Number.isInteger(H?.limit)&&H.limit>0?H.limit:200;return X.slice(0,$).map((F,Q)=>({Index:Q+1,Key:F}))}});B({site:"antigravity",name:"state-get",access:"read",description:"Read one value from Antigravity's state.vscdb. Pass --workspace <id> for per-workspace.",domain:"localhost",strategy:I.LOCAL,browser:!1,args:[{name:"key",positional:!0,required:!0,help:"Storage key name"},{name:"workspace",required:!1,help:"Workspace id (from workspaces-list) to query per-workspace DB"},{name:"max-bytes",type:"int",required:!1,default:8000,help:"Truncate value to this many chars"}],columns:W,func:async(H)=>{const z=String(H?.key||"").trim();if(!z)throw new h("key","is required");const Z=T(H),Y=C(Z,z);if(Y===null)throw new D(`Key not found: ${z}`,"");const X=Number.isInteger(H["max-bytes"])&&H["max-bytes"]>0?H["max-bytes"]:8000,$=typeof Y==="string"?Y:JSON.stringify(Y,null,2),F=$.length>X;return[{Field:"Key",Value:z},{Field:"Type",Value:typeof Y==="string"?"string":Array.isArray(Y)?"array":typeof Y},{Field:"Size",Value:`${$.length} chars${F?" (truncated)":""}`},{Field:"Value",Value:F?$.slice(0,X)+`
|
|
12
|
+
...(truncated)`:$}]}});B({site:"antigravity",name:"recent-paths",access:"read",description:"Show Antigravity's recently-opened folders/files (history.recentlyOpenedPathsList).",domain:"localhost",strategy:I.LOCAL,browser:!1,args:[{name:"limit",type:"int",required:!1,default:20,help:"Max rows to return"}],columns:W,func:async(H)=>{const z=C(x,"history.recentlyOpenedPathsList");if(!z)throw new K("antigravity recent-paths","No recent paths recorded.");const Z=z.entries||[];if(!Z.length)throw new K("antigravity recent-paths","Recent paths list is empty.");const Y=Number.isInteger(H?.limit)&&H.limit>0?H.limit:20;return Z.slice(0,Y).map((X,$)=>{let F="other",Q=JSON.stringify(X).slice(0,200);if(X.folderUri){F="folder";Q=decodeURI(String(X.folderUri).replace(/^file:\/\//,""))}else if(X.fileUri){F="file";Q=decodeURI(String(X.fileUri).replace(/^file:\/\//,""))}else if(X.workspace?.configPath){F="workspace";Q=decodeURI(String(X.workspace.configPath).replace(/^file:\/\//,""))}return{Index:$+1,Kind:F,Path:Q}})}});B({site:"antigravity",name:"workspaces-list",access:"read",description:"List Antigravity workspaceStorage entries (each represents a previously-opened folder).",domain:"localhost",strategy:I.LOCAL,browser:!1,args:[{name:"limit",type:"int",required:!1,default:50,help:"Max rows to return"}],columns:W,func:async(H)=>{if(!J.existsSync(M))throw new D(`workspaceStorage not found: ${M}`,"");const z=J.readdirSync(M).filter((X)=>{const $=q.join(M,X);return J.statSync($).isDirectory()});if(!z.length)throw new K("antigravity workspaces-list","No workspace storage.");const Z=z.map((X)=>{const $=q.join(M,X),F=q.join($,"workspace.json");let Q="(no workspace.json)";if(J.existsSync(F))try{const V=JSON.parse(J.readFileSync(F,"utf-8"));if(V.folder)Q=decodeURI(V.folder.replace(/^file:\/\//,""));else if(V.workspace)Q="(multi-folder) "+decodeURI(V.workspace.replace(/^file:\/\//,""))}catch{Q="(invalid workspace.json)"}return{id:X,folder:Q,mtime:J.statSync($).mtimeMs}}).sort((X,$)=>$.mtime-X.mtime),Y=Number.isInteger(H?.limit)&&H.limit>0?H.limit:50;return Z.slice(0,Y).map((X,$)=>({Index:$+1,"Workspace Id":X.id,Folder:X.folder.slice(0,120),Modified:new Date(X.mtime).toISOString().replace("T"," ").slice(0,19)}))}});B({site:"antigravity",name:"settings-read",access:"read",description:"Read Antigravity's user settings.json (theme, proxy, agCockpit, tfa.system.autoAccept, etc.).",domain:"localhost",strategy:I.LOCAL,browser:!1,args:[],columns:W,func:async()=>{if(!J.existsSync(U))throw new D(`settings.json not found: ${U}`,"");const z=J.readFileSync(U,"utf-8").replace(/\/\*[\s\S]*?\*\//g,"").replace(/^\s*\/\/.*$/gm,"").replace(/([^:"])\/\/.*$/gm,"$1").replace(/,(\s*[}\]])/g,"$1");let Z;try{Z=JSON.parse(z)}catch(X){throw new D(`Failed to parse settings.json: ${X.message}`,"")}const Y=[];for(const[X,$]of Object.entries(Z))Y.push({Field:X,Value:typeof $==="object"?JSON.stringify($):String($)});return Y}});
|