@zenalexa/unicli 0.219.0 → 0.220.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +15 -24
- package/README.md +62 -250
- package/README.zh-CN.md +62 -250
- package/dist/adapters/1point3acres/forum.d.ts +58 -0
- package/dist/adapters/1point3acres/forum.d.ts.map +1 -0
- package/dist/adapters/1point3acres/forum.js +708 -0
- package/dist/adapters/1point3acres/forum.js.map +1 -0
- package/dist/adapters/aibase/news.d.ts +21 -0
- package/dist/adapters/aibase/news.d.ts.map +1 -0
- package/dist/adapters/aibase/news.js +96 -0
- package/dist/adapters/aibase/news.js.map +1 -0
- package/dist/adapters/anilist/web.d.ts +11 -0
- package/dist/adapters/anilist/web.d.ts.map +1 -0
- package/dist/adapters/anilist/web.js +284 -0
- package/dist/adapters/anilist/web.js.map +1 -0
- package/dist/adapters/arxiv/papers.d.ts +27 -0
- package/dist/adapters/arxiv/papers.d.ts.map +1 -0
- package/dist/adapters/arxiv/papers.js +193 -0
- package/dist/adapters/arxiv/papers.js.map +1 -0
- package/dist/adapters/bangumi/web.d.ts +14 -0
- package/dist/adapters/bangumi/web.d.ts.map +1 -0
- package/dist/adapters/bangumi/web.js +257 -0
- package/dist/adapters/bangumi/web.js.map +1 -0
- package/dist/adapters/bbc/topic.d.ts +24 -0
- package/dist/adapters/bbc/topic.d.ts.map +1 -0
- package/dist/adapters/bbc/topic.js +122 -0
- package/dist/adapters/bbc/topic.js.map +1 -0
- package/dist/adapters/chatgpt/web.d.ts +24 -0
- package/dist/adapters/chatgpt/web.d.ts.map +1 -0
- package/dist/adapters/chatgpt/web.js +242 -0
- package/dist/adapters/chatgpt/web.js.map +1 -0
- package/dist/adapters/claude/web.d.ts +24 -0
- package/dist/adapters/claude/web.d.ts.map +1 -0
- package/dist/adapters/claude/web.js +575 -0
- package/dist/adapters/claude/web.js.map +1 -0
- package/dist/adapters/codex/projects.d.ts +27 -0
- package/dist/adapters/codex/projects.d.ts.map +1 -0
- package/dist/adapters/codex/projects.js +147 -0
- package/dist/adapters/codex/projects.js.map +1 -0
- package/dist/adapters/coingecko/markets.d.ts +19 -0
- package/dist/adapters/coingecko/markets.d.ts.map +1 -0
- package/dist/adapters/coingecko/markets.js +474 -0
- package/dist/adapters/coingecko/markets.js.map +1 -0
- package/dist/adapters/coupang/product.d.ts +27 -0
- package/dist/adapters/coupang/product.d.ts.map +1 -0
- package/dist/adapters/coupang/product.js +211 -0
- package/dist/adapters/coupang/product.js.map +1 -0
- package/dist/adapters/crates/registry.d.ts +44 -0
- package/dist/adapters/crates/registry.d.ts.map +1 -0
- package/dist/adapters/crates/registry.js +186 -0
- package/dist/adapters/crates/registry.js.map +1 -0
- package/dist/adapters/ctrip/travel.d.ts +83 -0
- package/dist/adapters/ctrip/travel.d.ts.map +1 -0
- package/dist/adapters/ctrip/travel.js +630 -0
- package/dist/adapters/ctrip/travel.js.map +1 -0
- package/dist/adapters/dblp/publications.d.ts +41 -0
- package/dist/adapters/dblp/publications.d.ts.map +1 -0
- package/dist/adapters/dblp/publications.js +409 -0
- package/dist/adapters/dblp/publications.js.map +1 -0
- package/dist/adapters/deepseek/web.d.ts +1 -1
- package/dist/adapters/deepseek/web.d.ts.map +1 -1
- package/dist/adapters/deepseek/web.js +66 -1
- package/dist/adapters/deepseek/web.js.map +1 -1
- package/dist/adapters/defillama/protocols.d.ts +13 -0
- package/dist/adapters/defillama/protocols.d.ts.map +1 -0
- package/dist/adapters/defillama/protocols.js +218 -0
- package/dist/adapters/defillama/protocols.js.map +1 -0
- package/dist/adapters/devto/read.d.ts +26 -0
- package/dist/adapters/devto/read.d.ts.map +1 -0
- package/dist/adapters/devto/read.js +110 -0
- package/dist/adapters/devto/read.js.map +1 -0
- package/dist/adapters/dianping/shop.d.ts +38 -0
- package/dist/adapters/dianping/shop.d.ts.map +1 -0
- package/dist/adapters/dianping/shop.js +194 -0
- package/dist/adapters/dianping/shop.js.map +1 -0
- package/dist/adapters/dlsite/web.d.ts +31 -0
- package/dist/adapters/dlsite/web.d.ts.map +1 -0
- package/dist/adapters/dlsite/web.js +455 -0
- package/dist/adapters/dlsite/web.js.map +1 -0
- package/dist/adapters/dockerhub/registry.d.ts +36 -0
- package/dist/adapters/dockerhub/registry.d.ts.map +1 -0
- package/dist/adapters/dockerhub/registry.js +172 -0
- package/dist/adapters/dockerhub/registry.js.map +1 -0
- package/dist/adapters/ehentai/web.d.ts +66 -0
- package/dist/adapters/ehentai/web.d.ts.map +1 -0
- package/dist/adapters/ehentai/web.js +608 -0
- package/dist/adapters/ehentai/web.js.map +1 -0
- package/dist/adapters/endoflife/product.d.ts +11 -0
- package/dist/adapters/endoflife/product.d.ts.map +1 -0
- package/dist/adapters/endoflife/product.js +113 -0
- package/dist/adapters/endoflife/product.js.map +1 -0
- package/dist/adapters/facebook/marketplace-extra.d.ts +9 -0
- package/dist/adapters/facebook/marketplace-extra.d.ts.map +1 -0
- package/dist/adapters/facebook/marketplace-extra.js +170 -0
- package/dist/adapters/facebook/marketplace-extra.js.map +1 -0
- package/dist/adapters/flathub/apps.d.ts +17 -0
- package/dist/adapters/flathub/apps.d.ts.map +1 -0
- package/dist/adapters/flathub/apps.js +220 -0
- package/dist/adapters/flathub/apps.js.map +1 -0
- package/dist/adapters/goproxy/module.d.ts +24 -0
- package/dist/adapters/goproxy/module.d.ts.map +1 -0
- package/dist/adapters/goproxy/module.js +221 -0
- package/dist/adapters/goproxy/module.js.map +1 -0
- package/dist/adapters/grok/web.d.ts +29 -0
- package/dist/adapters/grok/web.d.ts.map +1 -0
- package/dist/adapters/grok/web.js +553 -0
- package/dist/adapters/grok/web.js.map +1 -0
- package/dist/adapters/hackernews/read.d.ts +31 -0
- package/dist/adapters/hackernews/read.d.ts.map +1 -0
- package/dist/adapters/hackernews/read.js +201 -0
- package/dist/adapters/hackernews/read.js.map +1 -0
- package/dist/adapters/hf/paper.d.ts +22 -0
- package/dist/adapters/hf/paper.d.ts.map +1 -0
- package/dist/adapters/hf/paper.js +112 -0
- package/dist/adapters/hf/paper.js.map +1 -0
- package/dist/adapters/homebrew/packages.d.ts +52 -0
- package/dist/adapters/homebrew/packages.d.ts.map +1 -0
- package/dist/adapters/homebrew/packages.js +240 -0
- package/dist/adapters/homebrew/packages.js.map +1 -0
- package/dist/adapters/indeed/jobs.d.ts +38 -0
- package/dist/adapters/indeed/jobs.d.ts.map +1 -0
- package/dist/adapters/indeed/jobs.js +300 -0
- package/dist/adapters/indeed/jobs.js.map +1 -0
- package/dist/adapters/instagram/collections.d.ts +9 -0
- package/dist/adapters/instagram/collections.d.ts.map +1 -0
- package/dist/adapters/instagram/collections.js +174 -0
- package/dist/adapters/instagram/collections.js.map +1 -0
- package/dist/adapters/jikan/web.d.ts +9 -0
- package/dist/adapters/jikan/web.d.ts.map +1 -0
- package/dist/adapters/jikan/web.js +154 -0
- package/dist/adapters/jikan/web.js.map +1 -0
- package/dist/adapters/kitsu/web.d.ts +9 -0
- package/dist/adapters/kitsu/web.d.ts.map +1 -0
- package/dist/adapters/kitsu/web.js +97 -0
- package/dist/adapters/kitsu/web.js.map +1 -0
- package/dist/adapters/lichess/players.d.ts +46 -0
- package/dist/adapters/lichess/players.d.ts.map +1 -0
- package/dist/adapters/lichess/players.js +221 -0
- package/dist/adapters/lichess/players.js.map +1 -0
- package/dist/adapters/lobsters/read-domain.d.ts +35 -0
- package/dist/adapters/lobsters/read-domain.d.ts.map +1 -0
- package/dist/adapters/lobsters/read-domain.js +306 -0
- package/dist/adapters/lobsters/read-domain.js.map +1 -0
- package/dist/adapters/mangadex/web.d.ts +10 -0
- package/dist/adapters/mangadex/web.d.ts.map +1 -0
- package/dist/adapters/mangadex/web.js +188 -0
- package/dist/adapters/mangadex/web.js.map +1 -0
- package/dist/adapters/maven/artifact.d.ts +30 -0
- package/dist/adapters/maven/artifact.d.ts.map +1 -0
- package/dist/adapters/maven/artifact.js +121 -0
- package/dist/adapters/maven/artifact.js.map +1 -0
- package/dist/adapters/mdn/search.d.ts +11 -0
- package/dist/adapters/mdn/search.d.ts.map +1 -0
- package/dist/adapters/mdn/search.js +115 -0
- package/dist/adapters/mdn/search.js.map +1 -0
- package/dist/adapters/medium/tag.d.ts +15 -0
- package/dist/adapters/medium/tag.d.ts.map +1 -0
- package/dist/adapters/medium/tag.js +148 -0
- package/dist/adapters/medium/tag.js.map +1 -0
- package/dist/adapters/moegirl/web.d.ts +23 -0
- package/dist/adapters/moegirl/web.d.ts.map +1 -0
- package/dist/adapters/moegirl/web.js +269 -0
- package/dist/adapters/moegirl/web.js.map +1 -0
- package/dist/adapters/npm/package.d.ts +32 -0
- package/dist/adapters/npm/package.d.ts.map +1 -0
- package/dist/adapters/npm/package.js +141 -0
- package/dist/adapters/npm/package.js.map +1 -0
- package/dist/adapters/nuget/package.d.ts +34 -0
- package/dist/adapters/nuget/package.d.ts.map +1 -0
- package/dist/adapters/nuget/package.js +135 -0
- package/dist/adapters/nuget/package.js.map +1 -0
- package/dist/adapters/nvd/cve.d.ts +42 -0
- package/dist/adapters/nvd/cve.d.ts.map +1 -0
- package/dist/adapters/nvd/cve.js +132 -0
- package/dist/adapters/nvd/cve.js.map +1 -0
- package/dist/adapters/oeis/sequences.d.ts +14 -0
- package/dist/adapters/oeis/sequences.d.ts.map +1 -0
- package/dist/adapters/oeis/sequences.js +219 -0
- package/dist/adapters/oeis/sequences.js.map +1 -0
- package/dist/adapters/openalex/works.d.ts +43 -0
- package/dist/adapters/openalex/works.d.ts.map +1 -0
- package/dist/adapters/openalex/works.js +267 -0
- package/dist/adapters/openalex/works.js.map +1 -0
- package/dist/adapters/openfda/records.d.ts +18 -0
- package/dist/adapters/openfda/records.d.ts.map +1 -0
- package/dist/adapters/openfda/records.js +209 -0
- package/dist/adapters/openfda/records.js.map +1 -0
- package/dist/adapters/openreview/papers.d.ts +34 -0
- package/dist/adapters/openreview/papers.d.ts.map +1 -0
- package/dist/adapters/openreview/papers.js +463 -0
- package/dist/adapters/openreview/papers.js.map +1 -0
- package/dist/adapters/osv/security.d.ts +36 -0
- package/dist/adapters/osv/security.d.ts.map +1 -0
- package/dist/adapters/osv/security.js +247 -0
- package/dist/adapters/osv/security.js.map +1 -0
- package/dist/adapters/packagist/package.d.ts +31 -0
- package/dist/adapters/packagist/package.d.ts.map +1 -0
- package/dist/adapters/packagist/package.js +108 -0
- package/dist/adapters/packagist/package.js.map +1 -0
- package/dist/adapters/pubmed/articles.d.ts +31 -0
- package/dist/adapters/pubmed/articles.d.ts.map +1 -0
- package/dist/adapters/pubmed/articles.js +385 -0
- package/dist/adapters/pubmed/articles.js.map +1 -0
- package/dist/adapters/pypi/package.d.ts +38 -0
- package/dist/adapters/pypi/package.d.ts.map +1 -0
- package/dist/adapters/pypi/package.js +235 -0
- package/dist/adapters/pypi/package.js.map +1 -0
- package/dist/adapters/qwen/web.d.ts +26 -0
- package/dist/adapters/qwen/web.d.ts.map +1 -0
- package/dist/adapters/qwen/web.js +672 -0
- package/dist/adapters/qwen/web.js.map +1 -0
- package/dist/adapters/reddit/account.d.ts +12 -0
- package/dist/adapters/reddit/account.d.ts.map +1 -0
- package/dist/adapters/reddit/account.js +409 -0
- package/dist/adapters/reddit/account.js.map +1 -0
- package/dist/adapters/rednote/web.d.ts +30 -0
- package/dist/adapters/rednote/web.d.ts.map +1 -0
- package/dist/adapters/rednote/web.js +858 -0
- package/dist/adapters/rednote/web.js.map +1 -0
- package/dist/adapters/rest-countries/countries.d.ts +14 -0
- package/dist/adapters/rest-countries/countries.d.ts.map +1 -0
- package/dist/adapters/rest-countries/countries.js +231 -0
- package/dist/adapters/rest-countries/countries.js.map +1 -0
- package/dist/adapters/reuters/article-detail.d.ts +37 -0
- package/dist/adapters/reuters/article-detail.d.ts.map +1 -0
- package/dist/adapters/reuters/article-detail.js +139 -0
- package/dist/adapters/reuters/article-detail.js.map +1 -0
- package/dist/adapters/rfc/rfc.d.ts +11 -0
- package/dist/adapters/rfc/rfc.d.ts.map +1 -0
- package/dist/adapters/rfc/rfc.js +121 -0
- package/dist/adapters/rfc/rfc.js.map +1 -0
- package/dist/adapters/rubygems/gem.d.ts +26 -0
- package/dist/adapters/rubygems/gem.d.ts.map +1 -0
- package/dist/adapters/rubygems/gem.js +96 -0
- package/dist/adapters/rubygems/gem.js.map +1 -0
- package/dist/adapters/safebooru/web.d.ts +10 -0
- package/dist/adapters/safebooru/web.d.ts.map +1 -0
- package/dist/adapters/safebooru/web.js +120 -0
- package/dist/adapters/safebooru/web.js.map +1 -0
- package/dist/adapters/stackoverflow/questions.d.ts +79 -0
- package/dist/adapters/stackoverflow/questions.d.ts.map +1 -0
- package/dist/adapters/stackoverflow/questions.js +504 -0
- package/dist/adapters/stackoverflow/questions.js.map +1 -0
- package/dist/adapters/steam/app.d.ts +39 -0
- package/dist/adapters/steam/app.d.ts.map +1 -0
- package/dist/adapters/steam/app.js +165 -0
- package/dist/adapters/steam/app.js.map +1 -0
- package/dist/adapters/tiktok/creator-videos.d.ts +52 -0
- package/dist/adapters/tiktok/creator-videos.d.ts.map +1 -0
- package/dist/adapters/tiktok/creator-videos.js +267 -0
- package/dist/adapters/tiktok/creator-videos.js.map +1 -0
- package/dist/adapters/tvmaze/shows.d.ts +13 -0
- package/dist/adapters/tvmaze/shows.d.ts.map +1 -0
- package/dist/adapters/tvmaze/shows.js +240 -0
- package/dist/adapters/tvmaze/shows.js.map +1 -0
- package/dist/adapters/twitter/bookmark-folders.d.ts +33 -0
- package/dist/adapters/twitter/bookmark-folders.d.ts.map +1 -0
- package/dist/adapters/twitter/bookmark-folders.js +290 -0
- package/dist/adapters/twitter/bookmark-folders.js.map +1 -0
- package/dist/adapters/twitter/quote.d.ts +18 -0
- package/dist/adapters/twitter/quote.d.ts.map +1 -0
- package/dist/adapters/twitter/quote.js +285 -0
- package/dist/adapters/twitter/quote.js.map +1 -0
- package/dist/adapters/twitter/tweet-actions.d.ts +12 -0
- package/dist/adapters/twitter/tweet-actions.d.ts.map +1 -0
- package/dist/adapters/twitter/tweet-actions.js +145 -0
- package/dist/adapters/twitter/tweet-actions.js.map +1 -0
- package/dist/adapters/twitter/tweet-url.d.ts +15 -0
- package/dist/adapters/twitter/tweet-url.d.ts.map +1 -0
- package/dist/adapters/twitter/tweet-url.js +57 -0
- package/dist/adapters/twitter/tweet-url.js.map +1 -0
- package/dist/adapters/uisdc/news.d.ts +22 -0
- package/dist/adapters/uisdc/news.d.ts.map +1 -0
- package/dist/adapters/uisdc/news.js +91 -0
- package/dist/adapters/uisdc/news.js.map +1 -0
- package/dist/adapters/vndb/web.d.ts +10 -0
- package/dist/adapters/vndb/web.d.ts.map +1 -0
- package/dist/adapters/vndb/web.js +321 -0
- package/dist/adapters/vndb/web.js.map +1 -0
- package/dist/adapters/weibo/favorites-publish.d.ts +28 -0
- package/dist/adapters/weibo/favorites-publish.d.ts.map +1 -0
- package/dist/adapters/weibo/favorites-publish.js +356 -0
- package/dist/adapters/weibo/favorites-publish.js.map +1 -0
- package/dist/adapters/wikidata/entities.d.ts +15 -0
- package/dist/adapters/wikidata/entities.d.ts.map +1 -0
- package/dist/adapters/wikidata/entities.js +219 -0
- package/dist/adapters/wikidata/entities.js.map +1 -0
- package/dist/adapters/wikipedia/page.d.ts +21 -0
- package/dist/adapters/wikipedia/page.d.ts.map +1 -0
- package/dist/adapters/wikipedia/page.js +116 -0
- package/dist/adapters/wikipedia/page.js.map +1 -0
- package/dist/adapters/wttr/weather.d.ts +12 -0
- package/dist/adapters/wttr/weather.d.ts.map +1 -0
- package/dist/adapters/wttr/weather.js +207 -0
- package/dist/adapters/wttr/weather.js.map +1 -0
- package/dist/adapters/xianyu/publish.d.ts +31 -0
- package/dist/adapters/xianyu/publish.d.ts.map +1 -0
- package/dist/adapters/xianyu/publish.js +349 -0
- package/dist/adapters/xianyu/publish.js.map +1 -0
- package/dist/adapters/xiaohongshu/user-helpers.d.ts +2 -2
- package/dist/adapters/xiaohongshu/user-helpers.d.ts.map +1 -1
- package/dist/adapters/xiaohongshu/user-helpers.js +5 -4
- package/dist/adapters/xiaohongshu/user-helpers.js.map +1 -1
- package/dist/adapters/yuanbao/web.d.ts +27 -0
- package/dist/adapters/yuanbao/web.d.ts.map +1 -0
- package/dist/adapters/yuanbao/web.js +365 -0
- package/dist/adapters/yuanbao/web.js.map +1 -0
- package/dist/adapters/zhihu/collection.d.ts +33 -0
- package/dist/adapters/zhihu/collection.d.ts.map +1 -0
- package/dist/adapters/zhihu/collection.js +185 -0
- package/dist/adapters/zhihu/collection.js.map +1 -0
- package/dist/adapters/zlibrary/web.d.ts +19 -0
- package/dist/adapters/zlibrary/web.d.ts.map +1 -0
- package/dist/adapters/zlibrary/web.js +153 -0
- package/dist/adapters/zlibrary/web.js.map +1 -0
- package/dist/agents/codex-pack.d.ts +62 -0
- package/dist/agents/codex-pack.d.ts.map +1 -0
- package/dist/agents/codex-pack.js +163 -0
- package/dist/agents/codex-pack.js.map +1 -0
- package/dist/browser/daemon-client.js +2 -2
- package/dist/browser/daemon-client.js.map +1 -1
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +6 -43
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/browser/adapter.d.ts.map +1 -1
- package/dist/commands/browser/adapter.js +17 -3
- package/dist/commands/browser/adapter.js.map +1 -1
- package/dist/commands/describe.d.ts.map +1 -1
- package/dist/commands/describe.js +6 -7
- package/dist/commands/describe.js.map +1 -1
- package/dist/commands/dispatch.d.ts +1 -1
- package/dist/commands/dispatch.d.ts.map +1 -1
- package/dist/commands/dispatch.js +4 -2
- package/dist/commands/dispatch.js.map +1 -1
- package/dist/commands/mcp.d.ts +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +10 -5
- package/dist/commands/mcp.js.map +1 -1
- package/dist/core/command-contract-lint.d.ts +10 -0
- package/dist/core/command-contract-lint.d.ts.map +1 -0
- package/dist/core/command-contract-lint.js +41 -0
- package/dist/core/command-contract-lint.js.map +1 -0
- package/dist/core/command-contract.d.ts +100 -0
- package/dist/core/command-contract.d.ts.map +1 -0
- package/dist/core/command-contract.js +174 -0
- package/dist/core/command-contract.js.map +1 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/dist/discovery/aliases.d.ts +2 -2
- package/dist/discovery/aliases.d.ts.map +1 -1
- package/dist/discovery/aliases.js +464 -6
- package/dist/discovery/aliases.js.map +1 -1
- package/dist/discovery/macos-dynamic.d.ts.map +1 -1
- package/dist/discovery/macos-dynamic.js +17 -3
- package/dist/discovery/macos-dynamic.js.map +1 -1
- package/dist/discovery/search.d.ts.map +1 -1
- package/dist/discovery/search.js +147 -2
- package/dist/discovery/search.js.map +1 -1
- package/dist/engine/args.d.ts.map +1 -1
- package/dist/engine/args.js +18 -1
- package/dist/engine/args.js.map +1 -1
- package/dist/engine/artifact-validation.d.ts +29 -0
- package/dist/engine/artifact-validation.d.ts.map +1 -0
- package/dist/engine/artifact-validation.js +211 -0
- package/dist/engine/artifact-validation.js.map +1 -0
- package/dist/engine/browser/diagnostics.d.ts +38 -0
- package/dist/engine/browser/diagnostics.d.ts.map +1 -0
- package/dist/engine/browser/diagnostics.js +40 -0
- package/dist/engine/browser/diagnostics.js.map +1 -0
- package/dist/engine/invoke.d.ts +1 -0
- package/dist/engine/invoke.d.ts.map +1 -1
- package/dist/engine/invoke.js +1 -0
- package/dist/engine/invoke.js.map +1 -1
- package/dist/engine/kernel/errors.d.ts +11 -0
- package/dist/engine/kernel/errors.d.ts.map +1 -0
- package/dist/engine/kernel/errors.js +15 -0
- package/dist/engine/kernel/errors.js.map +1 -0
- package/dist/engine/kernel/execute.d.ts +7 -18
- package/dist/engine/kernel/execute.d.ts.map +1 -1
- package/dist/engine/kernel/execute.js +25 -410
- package/dist/engine/kernel/execute.js.map +1 -1
- package/dist/engine/kernel/stages.d.ts +44 -0
- package/dist/engine/kernel/stages.d.ts.map +1 -0
- package/dist/engine/kernel/stages.js +428 -0
- package/dist/engine/kernel/stages.js.map +1 -0
- package/dist/engine/kernel/types.d.ts +21 -1
- package/dist/engine/kernel/types.d.ts.map +1 -1
- package/dist/engine/steps/download.d.ts +1 -0
- package/dist/engine/steps/download.d.ts.map +1 -1
- package/dist/engine/steps/download.js +10 -6
- package/dist/engine/steps/download.js.map +1 -1
- package/dist/fast-path/render.js +1 -1
- package/dist/fast-path/render.js.map +1 -1
- package/dist/manifest-compact.txt +10 -10
- package/dist/manifest-search.json +1 -1
- package/dist/manifest.json +8421 -332
- package/dist/mcp/handler.d.ts.map +1 -1
- package/dist/mcp/handler.js +11 -1
- package/dist/mcp/handler.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +18 -10
- package/dist/mcp/tools.js.map +1 -1
- package/dist/output/error-map.d.ts.map +1 -1
- package/dist/output/error-map.js +1 -1
- package/dist/output/error-map.js.map +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +2 -1
- package/dist/registry.js.map +1 -1
- package/dist/transport/refs.d.ts +5 -3
- package/dist/transport/refs.d.ts.map +1 -1
- package/dist/transport/refs.js +8 -1
- package/dist/transport/refs.js.map +1 -1
- package/dist/transport/sidecar-binary.d.ts +7 -0
- package/dist/transport/sidecar-binary.d.ts.map +1 -1
- package/dist/transport/sidecar-binary.js +28 -8
- package/dist/transport/sidecar-binary.js.map +1 -1
- package/package.json +4 -3
- package/server.json +3 -3
- package/skills/unicli/SKILL.md +1 -1
- package/skills/unicli-claude-code/SKILL.md +1 -1
- package/skills/unicli-hermes/SKILL.md +1 -1
- package/src/adapters/1point3acres/forum.test.ts +300 -0
- package/src/adapters/1point3acres/forum.ts +852 -0
- package/src/adapters/aibase/news.test.ts +42 -0
- package/src/adapters/aibase/news.ts +118 -0
- package/src/adapters/anilist/web.test.ts +93 -0
- package/src/adapters/anilist/web.ts +341 -0
- package/src/adapters/arxiv/download.yaml +53 -0
- package/src/adapters/arxiv/papers.test.ts +59 -0
- package/src/adapters/arxiv/papers.ts +226 -0
- package/src/adapters/bangumi/web.test.ts +109 -0
- package/src/adapters/bangumi/web.ts +295 -0
- package/src/adapters/bbc/topic.test.ts +52 -0
- package/src/adapters/bbc/topic.ts +149 -0
- package/src/adapters/chatgpt/web.test.ts +121 -0
- package/src/adapters/chatgpt/web.ts +286 -0
- package/src/adapters/claude/web.test.ts +206 -0
- package/src/adapters/claude/web.ts +684 -0
- package/src/adapters/codex/projects.test.ts +77 -0
- package/src/adapters/codex/projects.ts +178 -0
- package/src/adapters/coingecko/markets.test.ts +156 -0
- package/src/adapters/coingecko/markets.ts +574 -0
- package/src/adapters/coupang/product.test.ts +111 -0
- package/src/adapters/coupang/product.ts +256 -0
- package/src/adapters/crates/registry.test.ts +89 -0
- package/src/adapters/crates/registry.ts +247 -0
- package/src/adapters/ctrip/travel.test.ts +359 -0
- package/src/adapters/ctrip/travel.ts +792 -0
- package/src/adapters/danbooru/artists.yaml +44 -0
- package/src/adapters/danbooru/comments.yaml +45 -0
- package/src/adapters/danbooru/detail.yaml +78 -0
- package/src/adapters/danbooru/download.yaml +51 -0
- package/src/adapters/danbooru/pools.yaml +56 -0
- package/src/adapters/danbooru/search.yaml +69 -0
- package/src/adapters/danbooru/tags.yaml +42 -0
- package/src/adapters/danbooru/wiki.yaml +44 -0
- package/src/adapters/dblp/publications.test.ts +123 -0
- package/src/adapters/dblp/publications.ts +494 -0
- package/src/adapters/deepseek/web.test.ts +69 -0
- package/src/adapters/deepseek/web.ts +78 -1
- package/src/adapters/defillama/protocols.test.ts +75 -0
- package/src/adapters/defillama/protocols.ts +253 -0
- package/src/adapters/devto/read.test.ts +49 -0
- package/src/adapters/devto/read.ts +145 -0
- package/src/adapters/dianping/shop.test.ts +134 -0
- package/src/adapters/dianping/shop.ts +261 -0
- package/src/adapters/dlsite/web.test.ts +132 -0
- package/src/adapters/dlsite/web.ts +557 -0
- package/src/adapters/dockerhub/registry.test.ts +97 -0
- package/src/adapters/dockerhub/registry.ts +223 -0
- package/src/adapters/ehentai/web.test.ts +157 -0
- package/src/adapters/ehentai/web.ts +750 -0
- package/src/adapters/endoflife/product.test.ts +50 -0
- package/src/adapters/endoflife/product.ts +128 -0
- package/src/adapters/facebook/marketplace-extra.test.ts +132 -0
- package/src/adapters/facebook/marketplace-extra.ts +213 -0
- package/src/adapters/flathub/apps.test.ts +85 -0
- package/src/adapters/flathub/apps.ts +254 -0
- package/src/adapters/goproxy/module.test.ts +72 -0
- package/src/adapters/goproxy/module.ts +258 -0
- package/src/adapters/grok/web.test.ts +181 -0
- package/src/adapters/grok/web.ts +640 -0
- package/src/adapters/hackernews/read.test.ts +68 -0
- package/src/adapters/hackernews/read.ts +265 -0
- package/src/adapters/hf/paper.test.ts +48 -0
- package/src/adapters/hf/paper.ts +138 -0
- package/src/adapters/homebrew/packages.test.ts +109 -0
- package/src/adapters/homebrew/packages.ts +304 -0
- package/src/adapters/indeed/jobs.test.ts +230 -0
- package/src/adapters/indeed/jobs.ts +375 -0
- package/src/adapters/instagram/collections.test.ts +94 -0
- package/src/adapters/instagram/collections.ts +206 -0
- package/src/adapters/jikan/web.test.ts +50 -0
- package/src/adapters/jikan/web.ts +177 -0
- package/src/adapters/kitsu/web.test.ts +29 -0
- package/src/adapters/kitsu/web.ts +109 -0
- package/src/adapters/konachan/detail.yaml +62 -0
- package/src/adapters/konachan/download.yaml +55 -0
- package/src/adapters/konachan/search.yaml +65 -0
- package/src/adapters/konachan/tags.yaml +40 -0
- package/src/adapters/lichess/players.test.ts +99 -0
- package/src/adapters/lichess/players.ts +277 -0
- package/src/adapters/lobsters/read-domain.test.ts +121 -0
- package/src/adapters/lobsters/read-domain.ts +400 -0
- package/src/adapters/mangadex/web.test.ts +46 -0
- package/src/adapters/mangadex/web.ts +210 -0
- package/src/adapters/maven/artifact.test.ts +67 -0
- package/src/adapters/maven/artifact.ts +155 -0
- package/src/adapters/mdn/search.test.ts +39 -0
- package/src/adapters/mdn/search.ts +133 -0
- package/src/adapters/medium/tag.test.ts +64 -0
- package/src/adapters/medium/tag.ts +164 -0
- package/src/adapters/moegirl/web.test.ts +87 -0
- package/src/adapters/moegirl/web.ts +343 -0
- package/src/adapters/npm/package.test.ts +53 -0
- package/src/adapters/npm/package.ts +177 -0
- package/src/adapters/nuget/package.test.ts +102 -0
- package/src/adapters/nuget/package.ts +193 -0
- package/src/adapters/nvd/cve.test.ts +66 -0
- package/src/adapters/nvd/cve.ts +182 -0
- package/src/adapters/oeis/sequences.test.ts +71 -0
- package/src/adapters/oeis/sequences.ts +234 -0
- package/src/adapters/openalex/works.test.ts +99 -0
- package/src/adapters/openalex/works.ts +319 -0
- package/src/adapters/openfda/records.test.ts +90 -0
- package/src/adapters/openfda/records.ts +239 -0
- package/src/adapters/openreview/papers.test.ts +139 -0
- package/src/adapters/openreview/papers.ts +560 -0
- package/src/adapters/osv/security.test.ts +91 -0
- package/src/adapters/osv/security.ts +298 -0
- package/src/adapters/packagist/package.test.ts +62 -0
- package/src/adapters/packagist/package.ts +146 -0
- package/src/adapters/pdf/read.yaml +49 -0
- package/src/adapters/pixiv/download.yaml +15 -2
- package/src/adapters/pubmed/articles.test.ts +96 -0
- package/src/adapters/pubmed/articles.ts +497 -0
- package/src/adapters/pypi/package.test.ts +131 -0
- package/src/adapters/pypi/package.ts +297 -0
- package/src/adapters/qwen/web.test.ts +176 -0
- package/src/adapters/qwen/web.ts +758 -0
- package/src/adapters/reddit/account.test.ts +56 -0
- package/src/adapters/reddit/account.ts +493 -0
- package/src/adapters/rednote/web.test.ts +354 -0
- package/src/adapters/rednote/web.ts +968 -0
- package/src/adapters/rest-countries/countries.test.ts +80 -0
- package/src/adapters/rest-countries/countries.ts +271 -0
- package/src/adapters/reuters/article-detail.test.ts +65 -0
- package/src/adapters/reuters/article-detail.ts +186 -0
- package/src/adapters/rfc/rfc.test.ts +37 -0
- package/src/adapters/rfc/rfc.ts +133 -0
- package/src/adapters/rubygems/gem.test.ts +43 -0
- package/src/adapters/rubygems/gem.ts +126 -0
- package/src/adapters/safebooru/detail.yaml +63 -0
- package/src/adapters/safebooru/download.yaml +58 -0
- package/src/adapters/safebooru/search.yaml +69 -0
- package/src/adapters/safebooru/web.test.ts +60 -0
- package/src/adapters/safebooru/web.ts +130 -0
- package/src/adapters/stackoverflow/questions.test.ts +207 -0
- package/src/adapters/stackoverflow/questions.ts +765 -0
- package/src/adapters/steam/app.test.ts +68 -0
- package/src/adapters/steam/app.ts +218 -0
- package/src/adapters/tiktok/creator-videos.test.ts +158 -0
- package/src/adapters/tiktok/creator-videos.ts +370 -0
- package/src/adapters/tvmaze/shows.test.ts +93 -0
- package/src/adapters/tvmaze/shows.ts +271 -0
- package/src/adapters/twitter/bookmark-folders.test.ts +164 -0
- package/src/adapters/twitter/bookmark-folders.ts +366 -0
- package/src/adapters/twitter/quote.test.ts +157 -0
- package/src/adapters/twitter/quote.ts +332 -0
- package/src/adapters/twitter/tweet-actions.test.ts +51 -0
- package/src/adapters/twitter/tweet-actions.ts +187 -0
- package/src/adapters/twitter/tweet-url.ts +65 -0
- package/src/adapters/uisdc/news.test.ts +46 -0
- package/src/adapters/uisdc/news.ts +111 -0
- package/src/adapters/vndb/web.test.ts +86 -0
- package/src/adapters/vndb/web.ts +393 -0
- package/src/adapters/weibo/favorites-publish.test.ts +177 -0
- package/src/adapters/weibo/favorites-publish.ts +426 -0
- package/src/adapters/wikidata/entities.test.ts +103 -0
- package/src/adapters/wikidata/entities.ts +253 -0
- package/src/adapters/wikipedia/page.test.ts +49 -0
- package/src/adapters/wikipedia/page.ts +158 -0
- package/src/adapters/wttr/weather.test.ts +99 -0
- package/src/adapters/wttr/weather.ts +239 -0
- package/src/adapters/xianyu/publish.test.ts +210 -0
- package/src/adapters/xianyu/publish.ts +420 -0
- package/src/adapters/xiaohongshu/user-helpers.ts +5 -2
- package/src/adapters/yandere/detail.yaml +61 -0
- package/src/adapters/yandere/download.yaml +56 -0
- package/src/adapters/yandere/search.yaml +67 -0
- package/src/adapters/yandere/tags.yaml +41 -0
- package/src/adapters/yuanbao/web.test.ts +144 -0
- package/src/adapters/yuanbao/web.ts +435 -0
- package/src/adapters/zhihu/collection.test.ts +96 -0
- package/src/adapters/zhihu/collection.ts +239 -0
- package/src/adapters/zlibrary/web.test.ts +104 -0
- package/src/adapters/zlibrary/web.ts +192 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/adapters/twitter/quote.ts
|
|
3
|
+
* @does Register agent-facing Twitter quote-tweet composer automation implemented with site-specific safety checks.
|
|
4
|
+
* @needs Logged-in x.com browser session, exact tweet URL scoping, optional image upload bridge.
|
|
5
|
+
* @feeds surface coverage ledger and Twitter quote workflows with attachment guardrails.
|
|
6
|
+
* @breaks X composer DOM drift or unverified quote-card rendering can post the wrong content.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, mkdtempSync, readFileSync, rmSync, statSync, writeFileSync, } from "node:fs";
|
|
9
|
+
import { homedir, tmpdir } from "node:os";
|
|
10
|
+
import { basename, extname, join, resolve } from "node:path";
|
|
11
|
+
import { cli, Strategy } from "../../registry.js";
|
|
12
|
+
import { buildTwitterArticleScopeSource, parseTwitterTweetUrl, } from "./tweet-url.js";
|
|
13
|
+
const COMPOSER_FILE_INPUT_SELECTOR = 'input[type="file"][data-testid="fileInput"]';
|
|
14
|
+
const SUPPORTED_IMAGE_EXTENSIONS = new Set([
|
|
15
|
+
".jpg",
|
|
16
|
+
".jpeg",
|
|
17
|
+
".png",
|
|
18
|
+
".gif",
|
|
19
|
+
".webp",
|
|
20
|
+
]);
|
|
21
|
+
const MAX_IMAGE_SIZE_BYTES = 20 * 1024 * 1024;
|
|
22
|
+
const CONTENT_TYPE_TO_EXTENSION = {
|
|
23
|
+
"image/jpeg": ".jpg",
|
|
24
|
+
"image/jpg": ".jpg",
|
|
25
|
+
"image/png": ".png",
|
|
26
|
+
"image/gif": ".gif",
|
|
27
|
+
"image/webp": ".webp",
|
|
28
|
+
};
|
|
29
|
+
export function buildQuoteComposerUrl(value) {
|
|
30
|
+
const parsed = parseTwitterTweetUrl(value);
|
|
31
|
+
return `https://x.com/compose/post?url=${encodeURIComponent(parsed.url)}`;
|
|
32
|
+
}
|
|
33
|
+
function normalizeHomePath(value) {
|
|
34
|
+
return value.replace(/^~(?=$|\/)/, homedir());
|
|
35
|
+
}
|
|
36
|
+
export function resolveTwitterImagePath(value) {
|
|
37
|
+
const raw = String(value ?? "").trim();
|
|
38
|
+
if (!raw)
|
|
39
|
+
throw new Error("twitter quote image path cannot be empty.");
|
|
40
|
+
const absPath = resolve(normalizeHomePath(raw));
|
|
41
|
+
if (!existsSync(absPath))
|
|
42
|
+
throw new Error(`Image file not found: ${absPath}.`);
|
|
43
|
+
const ext = extname(absPath).toLowerCase();
|
|
44
|
+
if (!SUPPORTED_IMAGE_EXTENSIONS.has(ext)) {
|
|
45
|
+
throw new Error(`Unsupported image format "${ext}". Supported: jpg, jpeg, png, gif, webp.`);
|
|
46
|
+
}
|
|
47
|
+
const size = statSync(absPath).size;
|
|
48
|
+
if (size > MAX_IMAGE_SIZE_BYTES) {
|
|
49
|
+
throw new Error(`Image too large: ${(size / 1024 / 1024).toFixed(1)} MB (max 20 MB).`);
|
|
50
|
+
}
|
|
51
|
+
return absPath;
|
|
52
|
+
}
|
|
53
|
+
export function resolveRemoteImageExtension(url, contentType) {
|
|
54
|
+
const normalizedContentType = String(contentType ?? "")
|
|
55
|
+
.split(";")[0]
|
|
56
|
+
.trim()
|
|
57
|
+
.toLowerCase();
|
|
58
|
+
const fromContentType = CONTENT_TYPE_TO_EXTENSION[normalizedContentType];
|
|
59
|
+
if (fromContentType)
|
|
60
|
+
return fromContentType;
|
|
61
|
+
const fromPath = extname(new URL(url).pathname).toLowerCase();
|
|
62
|
+
if (SUPPORTED_IMAGE_EXTENSIONS.has(fromPath))
|
|
63
|
+
return fromPath;
|
|
64
|
+
throw new Error(`Unsupported remote image format "${normalizedContentType || "unknown"}". Supported: jpg, jpeg, png, gif, webp.`);
|
|
65
|
+
}
|
|
66
|
+
export async function downloadTwitterImage(value) {
|
|
67
|
+
const raw = String(value ?? "").trim();
|
|
68
|
+
let parsed;
|
|
69
|
+
try {
|
|
70
|
+
parsed = new URL(raw);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
throw new Error(`Invalid image URL: ${raw}.`);
|
|
74
|
+
}
|
|
75
|
+
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
|
|
76
|
+
throw new Error(`Unsupported image URL protocol: ${parsed.protocol}.`);
|
|
77
|
+
}
|
|
78
|
+
const response = await fetch(parsed.toString());
|
|
79
|
+
if (!response.ok)
|
|
80
|
+
throw new Error(`Image download failed: HTTP ${response.status}.`);
|
|
81
|
+
const contentLength = Number(response.headers.get("content-length") || "0");
|
|
82
|
+
if (contentLength > MAX_IMAGE_SIZE_BYTES) {
|
|
83
|
+
throw new Error(`Image too large: ${(contentLength / 1024 / 1024).toFixed(1)} MB (max 20 MB).`);
|
|
84
|
+
}
|
|
85
|
+
const ext = resolveRemoteImageExtension(parsed.toString(), response.headers.get("content-type"));
|
|
86
|
+
const cleanupDir = mkdtempSync(join(tmpdir(), "unicli-twitter-quote-"));
|
|
87
|
+
const absPath = join(cleanupDir, `image${ext}`);
|
|
88
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
89
|
+
if (buffer.byteLength > MAX_IMAGE_SIZE_BYTES) {
|
|
90
|
+
rmSync(cleanupDir, { recursive: true, force: true });
|
|
91
|
+
throw new Error(`Image too large: ${(buffer.byteLength / 1024 / 1024).toFixed(1)} MB (max 20 MB).`);
|
|
92
|
+
}
|
|
93
|
+
writeFileSync(absPath, buffer);
|
|
94
|
+
return { absPath, cleanupDir };
|
|
95
|
+
}
|
|
96
|
+
function mimeTypeForImage(absPath) {
|
|
97
|
+
const ext = extname(absPath).toLowerCase();
|
|
98
|
+
if (ext === ".png")
|
|
99
|
+
return "image/png";
|
|
100
|
+
if (ext === ".gif")
|
|
101
|
+
return "image/gif";
|
|
102
|
+
if (ext === ".webp")
|
|
103
|
+
return "image/webp";
|
|
104
|
+
return "image/jpeg";
|
|
105
|
+
}
|
|
106
|
+
async function attachComposerImage(page, absImagePath) {
|
|
107
|
+
let uploaded = false;
|
|
108
|
+
if (page.setFileInput) {
|
|
109
|
+
try {
|
|
110
|
+
await page.setFileInput(COMPOSER_FILE_INPUT_SELECTOR, [absImagePath]);
|
|
111
|
+
uploaded = true;
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
115
|
+
if (!/unknown action|not supported/i.test(message)) {
|
|
116
|
+
throw new Error(`Image upload failed: ${message}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (!uploaded) {
|
|
121
|
+
const base64 = readFileSync(absImagePath).toString("base64");
|
|
122
|
+
const upload = (await page.evaluate(`
|
|
123
|
+
(() => {
|
|
124
|
+
const input = document.querySelector(${JSON.stringify(COMPOSER_FILE_INPUT_SELECTOR)});
|
|
125
|
+
if (!input) return { ok: false, error: 'No file input found on page' };
|
|
126
|
+
const binary = atob(${JSON.stringify(base64)});
|
|
127
|
+
const bytes = new Uint8Array(binary.length);
|
|
128
|
+
for (let i = 0; i < binary.length; i += 1) bytes[i] = binary.charCodeAt(i);
|
|
129
|
+
const transfer = new DataTransfer();
|
|
130
|
+
const blob = new Blob([bytes], { type: ${JSON.stringify(mimeTypeForImage(absImagePath))} });
|
|
131
|
+
transfer.items.add(new File([blob], ${JSON.stringify(basename(absImagePath))}, { type: ${JSON.stringify(mimeTypeForImage(absImagePath))} }));
|
|
132
|
+
Object.defineProperty(input, 'files', { value: transfer.files, writable: false });
|
|
133
|
+
input.dispatchEvent(new Event('change', { bubbles: true }));
|
|
134
|
+
input.dispatchEvent(new Event('input', { bubbles: true }));
|
|
135
|
+
return { ok: true };
|
|
136
|
+
})()
|
|
137
|
+
`));
|
|
138
|
+
if (!upload?.ok) {
|
|
139
|
+
throw new Error(`Image upload failed: ${upload?.error ?? "unknown error"}.`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
await page.wait(2);
|
|
143
|
+
const uploadState = (await page.evaluate(`
|
|
144
|
+
(() => {
|
|
145
|
+
const previewCount = document.querySelectorAll(
|
|
146
|
+
'[data-testid="attachments"] img, [data-testid="attachments"] video, [data-testid="tweetPhoto"]'
|
|
147
|
+
).length;
|
|
148
|
+
const hasMedia = previewCount > 0
|
|
149
|
+
|| !!document.querySelector('[data-testid="attachments"]')
|
|
150
|
+
|| !!Array.from(document.querySelectorAll('button,[role="button"]')).find((el) =>
|
|
151
|
+
/remove media|remove image|remove/i.test((el.getAttribute('aria-label') || '') + ' ' + (el.textContent || ''))
|
|
152
|
+
);
|
|
153
|
+
return { ok: hasMedia, previewCount };
|
|
154
|
+
})()
|
|
155
|
+
`));
|
|
156
|
+
if (!uploadState?.ok)
|
|
157
|
+
throw new Error("Image upload failed: preview did not appear.");
|
|
158
|
+
}
|
|
159
|
+
export function buildQuoteSubmitScript(text, tweetId) {
|
|
160
|
+
return `(async () => {
|
|
161
|
+
try {
|
|
162
|
+
${buildTwitterArticleScopeSource(tweetId)}
|
|
163
|
+
const visible = (el) => !!el && (el.offsetParent !== null || el.getClientRects().length > 0);
|
|
164
|
+
const boxes = Array.from(document.querySelectorAll('[data-testid="tweetTextarea_0"]'));
|
|
165
|
+
const box = boxes.find(visible) || boxes[0];
|
|
166
|
+
if (!box) return { ok: false, message: 'Could not find the quote composer text area. Are you logged in?' };
|
|
167
|
+
box.focus();
|
|
168
|
+
const textToInsert = ${JSON.stringify(text)};
|
|
169
|
+
if (!document.execCommand('insertText', false, textToInsert)) {
|
|
170
|
+
const transfer = new DataTransfer();
|
|
171
|
+
transfer.setData('text/plain', textToInsert);
|
|
172
|
+
box.dispatchEvent(new ClipboardEvent('paste', { clipboardData: transfer, bubbles: true, cancelable: true }));
|
|
173
|
+
}
|
|
174
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
175
|
+
let hasQuoteCard = false;
|
|
176
|
+
for (let i = 0; i < 20; i += 1) {
|
|
177
|
+
hasQuoteCard = __twHasLinkToTarget(document);
|
|
178
|
+
if (hasQuoteCard) break;
|
|
179
|
+
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
180
|
+
}
|
|
181
|
+
if (!hasQuoteCard) return { ok: false, message: 'Quote target did not render in the composer. The source tweet may be deleted or restricted.' };
|
|
182
|
+
const buttons = Array.from(document.querySelectorAll('[data-testid="tweetButton"], [data-testid="tweetButtonInline"]'));
|
|
183
|
+
const button = buttons.find((el) => visible(el) && !el.disabled && el.getAttribute('aria-disabled') !== 'true');
|
|
184
|
+
if (!button) return { ok: false, message: 'Tweet button is disabled or not found.' };
|
|
185
|
+
button.click();
|
|
186
|
+
const normalize = (value) => String(value || '').replace(/\\u00a0/g, ' ').replace(/\\s+/g, ' ').trim();
|
|
187
|
+
const expectedText = normalize(textToInsert);
|
|
188
|
+
for (let i = 0; i < 30; i += 1) {
|
|
189
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
190
|
+
const alerts = Array.from(document.querySelectorAll('[role="alert"], [data-testid="toast"]')).filter(visible);
|
|
191
|
+
const success = alerts.find((el) => /sent|posted|your post was sent|your tweet was sent/i.test(el.textContent || ''));
|
|
192
|
+
if (success) return { ok: true, message: 'Quote tweet posted successfully.' };
|
|
193
|
+
const failure = alerts.find((el) => /failed|error|try again|not sent|could not/i.test(el.textContent || ''));
|
|
194
|
+
if (failure) return { ok: false, message: (failure.textContent || 'Quote tweet failed to post.').trim() };
|
|
195
|
+
const visibleBoxes = Array.from(document.querySelectorAll('[data-testid="tweetTextarea_0"]')).filter(visible);
|
|
196
|
+
const composerStillHasText = visibleBoxes.some((node) => normalize(node.innerText || node.textContent || '').includes(expectedText));
|
|
197
|
+
if (!composerStillHasText) return { ok: true, message: 'Quote tweet posted successfully.' };
|
|
198
|
+
}
|
|
199
|
+
return { ok: false, message: 'Quote tweet submission did not complete before timeout.' };
|
|
200
|
+
} catch (error) {
|
|
201
|
+
return { ok: false, message: String(error?.message || error) };
|
|
202
|
+
}
|
|
203
|
+
})()`;
|
|
204
|
+
}
|
|
205
|
+
const quoteArgs = [
|
|
206
|
+
{
|
|
207
|
+
name: "url",
|
|
208
|
+
type: "str",
|
|
209
|
+
required: true,
|
|
210
|
+
positional: true,
|
|
211
|
+
description: "Tweet URL to quote",
|
|
212
|
+
format: "uri",
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
name: "text",
|
|
216
|
+
type: "str",
|
|
217
|
+
required: true,
|
|
218
|
+
positional: true,
|
|
219
|
+
description: "Quote text",
|
|
220
|
+
},
|
|
221
|
+
{ name: "image", type: "str", description: "Optional local image path" },
|
|
222
|
+
{ name: "image-url", type: "str", description: "Optional remote image URL" },
|
|
223
|
+
];
|
|
224
|
+
cli({
|
|
225
|
+
site: "twitter",
|
|
226
|
+
name: "quote",
|
|
227
|
+
description: "Quote-tweet a specific tweet with text and optional image",
|
|
228
|
+
domain: "x.com",
|
|
229
|
+
strategy: Strategy.UI,
|
|
230
|
+
browser: true,
|
|
231
|
+
args: quoteArgs,
|
|
232
|
+
columns: ["status", "message", "text"],
|
|
233
|
+
func: async (page, kwargs) => {
|
|
234
|
+
if (!page || typeof page !== "object") {
|
|
235
|
+
throw new Error("Browser session required for twitter quote.");
|
|
236
|
+
}
|
|
237
|
+
if (kwargs.image && kwargs["image-url"]) {
|
|
238
|
+
throw new Error("Use either --image or --image-url, not both.");
|
|
239
|
+
}
|
|
240
|
+
const browserPage = page;
|
|
241
|
+
const target = parseTwitterTweetUrl(kwargs.url);
|
|
242
|
+
const text = String(kwargs.text ?? "").trim();
|
|
243
|
+
if (!text)
|
|
244
|
+
throw new Error("twitter quote text cannot be empty.");
|
|
245
|
+
let localImagePath;
|
|
246
|
+
let cleanupDir;
|
|
247
|
+
try {
|
|
248
|
+
if (kwargs.image) {
|
|
249
|
+
localImagePath = resolveTwitterImagePath(kwargs.image);
|
|
250
|
+
}
|
|
251
|
+
else if (kwargs["image-url"]) {
|
|
252
|
+
const downloaded = await downloadTwitterImage(kwargs["image-url"]);
|
|
253
|
+
localImagePath = downloaded.absPath;
|
|
254
|
+
cleanupDir = downloaded.cleanupDir;
|
|
255
|
+
}
|
|
256
|
+
await browserPage.goto(buildQuoteComposerUrl(target.url), {
|
|
257
|
+
waitUntil: "load",
|
|
258
|
+
settleMs: 2500,
|
|
259
|
+
});
|
|
260
|
+
await browserPage.wait({
|
|
261
|
+
selector: '[data-testid="tweetTextarea_0"]',
|
|
262
|
+
timeout: 15,
|
|
263
|
+
});
|
|
264
|
+
if (localImagePath)
|
|
265
|
+
await attachComposerImage(browserPage, localImagePath);
|
|
266
|
+
const result = (await browserPage.evaluate(buildQuoteSubmitScript(text, target.id)));
|
|
267
|
+
if (result.ok)
|
|
268
|
+
await browserPage.wait(3);
|
|
269
|
+
return [
|
|
270
|
+
{
|
|
271
|
+
status: result.ok ? "success" : "failed",
|
|
272
|
+
message: result.message || "",
|
|
273
|
+
text,
|
|
274
|
+
...(kwargs.image ? { image: kwargs.image } : {}),
|
|
275
|
+
...(kwargs["image-url"] ? { "image-url": kwargs["image-url"] } : {}),
|
|
276
|
+
},
|
|
277
|
+
];
|
|
278
|
+
}
|
|
279
|
+
finally {
|
|
280
|
+
if (cleanupDir)
|
|
281
|
+
rmSync(cleanupDir, { recursive: true, force: true });
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
});
|
|
285
|
+
//# sourceMappingURL=quote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quote.js","sourceRoot":"","sources":["../../../src/adapters/twitter/quote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/adapters/twitter/tweet-actions.ts
|
|
3
|
+
* @does Register agent-facing Twitter unlike, retweet, and unretweet URL actions.
|
|
4
|
+
* @needs Browser session on x.com, exact tweet URL parsing, scoped article action buttons.
|
|
5
|
+
* @feeds surface coverage ledger, Twitter write-action workflows, safe tweet-level UI actions.
|
|
6
|
+
* @breaks X DOM test-id drift or weak tweet scoping can act on the wrong tweet.
|
|
7
|
+
*/
|
|
8
|
+
import { buildTwitterArticleScopeSource, parseTwitterTweetUrl } from "./tweet-url.js";
|
|
9
|
+
export { buildTwitterArticleScopeSource, parseTwitterTweetUrl };
|
|
10
|
+
type ToggleAction = "unlike" | "retweet" | "unretweet";
|
|
11
|
+
export declare function buildTweetToggleScript(action: ToggleAction, tweetId: string): string;
|
|
12
|
+
//# sourceMappingURL=tweet-actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tweet-actions.d.ts","sourceRoot":"","sources":["../../../src/adapters/twitter/tweet-actions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EACL,8BAA8B,EAC9B,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,8BAA8B,EAAE,oBAAoB,EAAE,CAAC;AAEhE,KAAK,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;AAqDvD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,MAAM,GACd,MAAM,CAyCR"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/adapters/twitter/tweet-actions.ts
|
|
3
|
+
* @does Register agent-facing Twitter unlike, retweet, and unretweet URL actions.
|
|
4
|
+
* @needs Browser session on x.com, exact tweet URL parsing, scoped article action buttons.
|
|
5
|
+
* @feeds surface coverage ledger, Twitter write-action workflows, safe tweet-level UI actions.
|
|
6
|
+
* @breaks X DOM test-id drift or weak tweet scoping can act on the wrong tweet.
|
|
7
|
+
*/
|
|
8
|
+
import { cli, Strategy } from "../../registry.js";
|
|
9
|
+
import { buildTwitterArticleScopeSource, parseTwitterTweetUrl, } from "./tweet-url.js";
|
|
10
|
+
export { buildTwitterArticleScopeSource, parseTwitterTweetUrl };
|
|
11
|
+
const ACTIONS = {
|
|
12
|
+
unlike: {
|
|
13
|
+
activeTestId: "unlike",
|
|
14
|
+
inactiveTestId: "like",
|
|
15
|
+
confirmTestId: "",
|
|
16
|
+
alreadyMessage: "Tweet is not liked (already unliked).",
|
|
17
|
+
successMessage: "Tweet successfully unliked.",
|
|
18
|
+
missingMessage: "Could not find the Unlike button on this tweet. Are you logged in?",
|
|
19
|
+
mismatchMessage: "Unlike action was initiated but UI did not update as expected.",
|
|
20
|
+
needsConfirm: false,
|
|
21
|
+
},
|
|
22
|
+
retweet: {
|
|
23
|
+
activeTestId: "retweet",
|
|
24
|
+
inactiveTestId: "unretweet",
|
|
25
|
+
confirmTestId: "retweetConfirm",
|
|
26
|
+
alreadyMessage: "Tweet is already retweeted.",
|
|
27
|
+
successMessage: "Tweet successfully retweeted.",
|
|
28
|
+
missingMessage: "Could not find the Retweet button on this tweet. Are you logged in?",
|
|
29
|
+
mismatchMessage: "Retweet action was initiated but UI did not update as expected.",
|
|
30
|
+
needsConfirm: true,
|
|
31
|
+
},
|
|
32
|
+
unretweet: {
|
|
33
|
+
activeTestId: "unretweet",
|
|
34
|
+
inactiveTestId: "retweet",
|
|
35
|
+
confirmTestId: "unretweetConfirm",
|
|
36
|
+
alreadyMessage: "Tweet is not retweeted (already removed).",
|
|
37
|
+
successMessage: "Tweet successfully unretweeted.",
|
|
38
|
+
missingMessage: "Could not find the Unretweet button on this tweet. Are you logged in?",
|
|
39
|
+
mismatchMessage: "Unretweet action was initiated but UI did not update as expected.",
|
|
40
|
+
needsConfirm: true,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
export function buildTweetToggleScript(action, tweetId) {
|
|
44
|
+
const config = ACTIONS[action];
|
|
45
|
+
return `(async () => {
|
|
46
|
+
try {
|
|
47
|
+
${buildTwitterArticleScopeSource(tweetId)}
|
|
48
|
+
let targetArticle = null;
|
|
49
|
+
let activeButton = null;
|
|
50
|
+
let inactiveButton = null;
|
|
51
|
+
for (let i = 0; i < 20; i++) {
|
|
52
|
+
targetArticle = findTargetArticle();
|
|
53
|
+
activeButton = targetArticle?.querySelector('[data-testid="${config.activeTestId}"]') || null;
|
|
54
|
+
inactiveButton = targetArticle?.querySelector('[data-testid="${config.inactiveTestId}"]') || null;
|
|
55
|
+
if (activeButton || inactiveButton) break;
|
|
56
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
57
|
+
}
|
|
58
|
+
if (inactiveButton) return { ok: true, message: ${JSON.stringify(config.alreadyMessage)} };
|
|
59
|
+
if (!activeButton) return { ok: false, message: ${JSON.stringify(config.missingMessage)} };
|
|
60
|
+
activeButton.click();
|
|
61
|
+
${config.needsConfirm
|
|
62
|
+
? `
|
|
63
|
+
let confirmButton = null;
|
|
64
|
+
for (let i = 0; i < 20; i++) {
|
|
65
|
+
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
66
|
+
confirmButton = document.querySelector('[data-testid="${config.confirmTestId}"]');
|
|
67
|
+
if (confirmButton) break;
|
|
68
|
+
}
|
|
69
|
+
if (!confirmButton) return { ok: false, message: 'Confirmation menu item did not appear.' };
|
|
70
|
+
confirmButton.click();
|
|
71
|
+
`
|
|
72
|
+
: ""}
|
|
73
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
74
|
+
const verifyArticle = findTargetArticle() || targetArticle;
|
|
75
|
+
const verifyButton = verifyArticle?.querySelector('[data-testid="${config.inactiveTestId}"]');
|
|
76
|
+
if (verifyButton) return { ok: true, message: ${JSON.stringify(config.successMessage)} };
|
|
77
|
+
return { ok: false, message: ${JSON.stringify(config.mismatchMessage)} };
|
|
78
|
+
} catch (error) {
|
|
79
|
+
return { ok: false, message: String(error?.message || error) };
|
|
80
|
+
}
|
|
81
|
+
})()`;
|
|
82
|
+
}
|
|
83
|
+
function tweetActionFunc(action) {
|
|
84
|
+
return async (page, kwargs) => {
|
|
85
|
+
if (!page || typeof page !== "object") {
|
|
86
|
+
throw new Error(`Browser session required for twitter ${action}.`);
|
|
87
|
+
}
|
|
88
|
+
const target = parseTwitterTweetUrl(kwargs.url);
|
|
89
|
+
const browserPage = page;
|
|
90
|
+
await browserPage.goto(target.url);
|
|
91
|
+
await browserPage.wait({ selector: '[data-testid="primaryColumn"]' });
|
|
92
|
+
const result = await browserPage.evaluate(buildTweetToggleScript(action, target.id));
|
|
93
|
+
if (result.ok)
|
|
94
|
+
await browserPage.wait(2);
|
|
95
|
+
return [
|
|
96
|
+
{
|
|
97
|
+
status: result.ok ? "success" : "failed",
|
|
98
|
+
message: result.message || "",
|
|
99
|
+
},
|
|
100
|
+
];
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const tweetUrlArg = [
|
|
104
|
+
{
|
|
105
|
+
name: "url",
|
|
106
|
+
type: "str",
|
|
107
|
+
required: true,
|
|
108
|
+
positional: true,
|
|
109
|
+
description: "Tweet URL",
|
|
110
|
+
},
|
|
111
|
+
];
|
|
112
|
+
cli({
|
|
113
|
+
site: "twitter",
|
|
114
|
+
name: "unlike",
|
|
115
|
+
description: "Twitter unlike a specific tweet",
|
|
116
|
+
domain: "x.com",
|
|
117
|
+
strategy: Strategy.UI,
|
|
118
|
+
browser: true,
|
|
119
|
+
args: tweetUrlArg,
|
|
120
|
+
columns: ["status", "message"],
|
|
121
|
+
func: tweetActionFunc("unlike"),
|
|
122
|
+
});
|
|
123
|
+
cli({
|
|
124
|
+
site: "twitter",
|
|
125
|
+
name: "retweet",
|
|
126
|
+
description: "Twitter retweet a specific tweet",
|
|
127
|
+
domain: "x.com",
|
|
128
|
+
strategy: Strategy.UI,
|
|
129
|
+
browser: true,
|
|
130
|
+
args: tweetUrlArg,
|
|
131
|
+
columns: ["status", "message"],
|
|
132
|
+
func: tweetActionFunc("retweet"),
|
|
133
|
+
});
|
|
134
|
+
cli({
|
|
135
|
+
site: "twitter",
|
|
136
|
+
name: "unretweet",
|
|
137
|
+
description: "Twitter unretweet a specific tweet",
|
|
138
|
+
domain: "x.com",
|
|
139
|
+
strategy: Strategy.UI,
|
|
140
|
+
browser: true,
|
|
141
|
+
args: tweetUrlArg,
|
|
142
|
+
columns: ["status", "message"],
|
|
143
|
+
func: tweetActionFunc("unretweet"),
|
|
144
|
+
});
|
|
145
|
+
//# sourceMappingURL=tweet-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tweet-actions.js","sourceRoot":"","sources":["../../../src/adapters/twitter/tweet-actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/adapters/twitter/tweet-url.ts
|
|
3
|
+
* @does Provide exact Twitter/X tweet URL parsing and DOM target scoping helpers implemented with site-specific safety checks.
|
|
4
|
+
* @needs Full https Twitter/X status URLs and browser DOM roots containing status links.
|
|
5
|
+
* @feeds Twitter write-action adapters and agent-facing quote/retweet safety checks.
|
|
6
|
+
* @breaks Twitter URL shape drift or substring matching can target the wrong tweet.
|
|
7
|
+
*/
|
|
8
|
+
interface ParsedTweetUrl {
|
|
9
|
+
id: string;
|
|
10
|
+
url: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function parseTwitterTweetUrl(value: unknown): ParsedTweetUrl;
|
|
13
|
+
export declare function buildTwitterArticleScopeSource(tweetId: string): string;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=tweet-url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tweet-url.d.ts","sourceRoot":"","sources":["../../../src/adapters/twitter/tweet-url.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AAUD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAiBnE;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAqBtE"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/adapters/twitter/tweet-url.ts
|
|
3
|
+
* @does Provide exact Twitter/X tweet URL parsing and DOM target scoping helpers implemented with site-specific safety checks.
|
|
4
|
+
* @needs Full https Twitter/X status URLs and browser DOM roots containing status links.
|
|
5
|
+
* @feeds Twitter write-action adapters and agent-facing quote/retweet safety checks.
|
|
6
|
+
* @breaks Twitter URL shape drift or substring matching can target the wrong tweet.
|
|
7
|
+
*/
|
|
8
|
+
const TWEET_PATH_PATTERN = /^\/(?:[^/]+|i)\/status\/(\d+)\/?$/;
|
|
9
|
+
const TWITTER_HOSTS = new Set(["x.com", "twitter.com"]);
|
|
10
|
+
function isTwitterHost(hostname) {
|
|
11
|
+
return (TWITTER_HOSTS.has(hostname) ||
|
|
12
|
+
hostname.endsWith(".x.com") ||
|
|
13
|
+
hostname.endsWith(".twitter.com"));
|
|
14
|
+
}
|
|
15
|
+
export function parseTwitterTweetUrl(value) {
|
|
16
|
+
const raw = String(value ?? "").trim();
|
|
17
|
+
if (!raw)
|
|
18
|
+
throw new Error("twitter tweet URL cannot be empty.");
|
|
19
|
+
let parsed;
|
|
20
|
+
try {
|
|
21
|
+
parsed = new URL(raw);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
throw new Error(`Invalid tweet URL: ${raw}.`);
|
|
25
|
+
}
|
|
26
|
+
const hostname = parsed.hostname.toLowerCase();
|
|
27
|
+
if (parsed.protocol !== "https:" || !isTwitterHost(hostname)) {
|
|
28
|
+
throw new Error(`Invalid tweet URL host: ${raw}.`);
|
|
29
|
+
}
|
|
30
|
+
const match = parsed.pathname.match(TWEET_PATH_PATTERN);
|
|
31
|
+
if (!match?.[1])
|
|
32
|
+
throw new Error(`Could not extract tweet ID from URL: ${raw}.`);
|
|
33
|
+
return { id: match[1], url: parsed.toString() };
|
|
34
|
+
}
|
|
35
|
+
export function buildTwitterArticleScopeSource(tweetId) {
|
|
36
|
+
return `
|
|
37
|
+
const tweetId = ${JSON.stringify(tweetId)};
|
|
38
|
+
const __twTweetPathRe = /^\\/(?:[^/]+|i)\\/status\\/(\\d+)\\/?$/;
|
|
39
|
+
const __twIsTwitterHost = (hostname) => hostname === 'x.com'
|
|
40
|
+
|| hostname === 'twitter.com'
|
|
41
|
+
|| hostname.endsWith('.x.com')
|
|
42
|
+
|| hostname.endsWith('.twitter.com');
|
|
43
|
+
const __twGetStatusIdFromHref = (href) => {
|
|
44
|
+
try {
|
|
45
|
+
const parsed = new URL(href, window.location.origin);
|
|
46
|
+
if (parsed.protocol !== 'https:' || !__twIsTwitterHost(parsed.hostname.toLowerCase())) return null;
|
|
47
|
+
return parsed.pathname.match(__twTweetPathRe)?.[1] || null;
|
|
48
|
+
} catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const __twHasLinkToTarget = (root) => Array.from(root.querySelectorAll('a[href*="/status/"]'))
|
|
53
|
+
.some((link) => __twGetStatusIdFromHref(link.href) === tweetId);
|
|
54
|
+
const findTargetArticle = () => Array.from(document.querySelectorAll('article')).find(__twHasLinkToTarget);
|
|
55
|
+
`;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=tweet-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tweet-url.js","sourceRoot":"","sources":["../../../src/adapters/twitter/tweet-url.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,kBAAkB,GAAG,mCAAmC,CAAC;AAC/D,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;AAOxD,SAAS,aAAa,CAAC,QAAgB;IACrC,OAAO,CACL,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAChE,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,GAAG,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC/C,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,GAAG,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,wCAAwC,GAAG,GAAG,CAAC,CAAC;IAClE,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,OAAe;IAC5D,OAAO;sBACa,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;GAkB1C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/adapters/uisdc/news.ts
|
|
3
|
+
* @does Register agent-facing UISDC news browser extraction command.
|
|
4
|
+
* @needs Public UISDC news page, browser runtime, selector-drift error reporting.
|
|
5
|
+
* @feeds surface coverage ledger, design/AI news discovery, Chinese design news surface.
|
|
6
|
+
* @breaks UISDC DOM drift or silent empty extraction hides news coverage failures.
|
|
7
|
+
*/
|
|
8
|
+
export declare function requireNewsLimit(value: unknown, fallback?: number): number;
|
|
9
|
+
export declare function buildExtractUisdcNewsJs(): string;
|
|
10
|
+
interface BrowserExtractPayload {
|
|
11
|
+
ok?: unknown;
|
|
12
|
+
reason?: unknown;
|
|
13
|
+
title?: unknown;
|
|
14
|
+
rows?: Array<{
|
|
15
|
+
title?: unknown;
|
|
16
|
+
summary?: unknown;
|
|
17
|
+
url?: unknown;
|
|
18
|
+
}>;
|
|
19
|
+
}
|
|
20
|
+
export declare function mapUisdcNewsPayload(payload: BrowserExtractPayload, limit: number): Array<Record<string, unknown>>;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=news.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"news.d.ts","sourceRoot":"","sources":["../../../src/adapters/uisdc/news.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAaH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAK,GAAG,MAAM,CAOtE;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAyBhD;AAED,UAAU,qBAAqB;IAC7B,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACrE;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE,MAAM,GACZ,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAyBhC"}
|