@zenalexa/unicli 0.220.1 → 0.221.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 +35 -13
- package/README.md +18 -16
- package/README.zh-CN.md +18 -16
- package/dist/adapters/acl-anthology/papers.d.ts +16 -0
- package/dist/adapters/acl-anthology/papers.d.ts.map +1 -0
- package/dist/adapters/acl-anthology/papers.js +135 -0
- package/dist/adapters/acl-anthology/papers.js.map +1 -0
- package/dist/adapters/arxiv/papers.js +2 -0
- package/dist/adapters/arxiv/papers.js.map +1 -1
- package/dist/adapters/baidu-scholar/search.js +5 -0
- package/dist/adapters/baidu-scholar/search.js.map +1 -1
- package/dist/adapters/bilibili/comments.js +66 -4
- package/dist/adapters/bilibili/comments.js.map +1 -1
- package/dist/adapters/bilibili/compat.js +2 -2
- package/dist/adapters/bilibili/compat.js.map +1 -1
- package/dist/adapters/bilibili/download.js +4 -4
- package/dist/adapters/bilibili/download.js.map +1 -1
- package/dist/adapters/bilibili/wbi.d.ts.map +1 -1
- package/dist/adapters/bilibili/wbi.js +3 -3
- package/dist/adapters/bilibili/wbi.js.map +1 -1
- package/dist/adapters/cipo/_shared.d.ts +21 -0
- package/dist/adapters/cipo/_shared.d.ts.map +1 -0
- package/dist/adapters/cipo/_shared.js +67 -0
- package/dist/adapters/cipo/_shared.js.map +1 -0
- package/dist/adapters/cipo/get.d.ts +19 -0
- package/dist/adapters/cipo/get.d.ts.map +1 -0
- package/dist/adapters/cipo/get.js +140 -0
- package/dist/adapters/cipo/get.js.map +1 -0
- package/dist/adapters/cipo/legal-status.d.ts +19 -0
- package/dist/adapters/cipo/legal-status.d.ts.map +1 -0
- package/dist/adapters/cipo/legal-status.js +111 -0
- package/dist/adapters/cipo/legal-status.js.map +1 -0
- package/dist/adapters/cipo/search.d.ts +20 -0
- package/dist/adapters/cipo/search.d.ts.map +1 -0
- package/dist/adapters/cipo/search.js +148 -0
- package/dist/adapters/cipo/search.js.map +1 -0
- package/dist/adapters/cnipa/_shared.d.ts +47 -0
- package/dist/adapters/cnipa/_shared.d.ts.map +1 -0
- package/dist/adapters/cnipa/_shared.js +97 -0
- package/dist/adapters/cnipa/_shared.js.map +1 -0
- package/dist/adapters/cnipa/get.d.ts +19 -0
- package/dist/adapters/cnipa/get.d.ts.map +1 -0
- package/dist/adapters/cnipa/get.js +149 -0
- package/dist/adapters/cnipa/get.js.map +1 -0
- package/dist/adapters/cnipa/legal-status.d.ts +19 -0
- package/dist/adapters/cnipa/legal-status.d.ts.map +1 -0
- package/dist/adapters/cnipa/legal-status.js +119 -0
- package/dist/adapters/cnipa/legal-status.js.map +1 -0
- package/dist/adapters/cnipa/search.d.ts +21 -0
- package/dist/adapters/cnipa/search.d.ts.map +1 -0
- package/dist/adapters/cnipa/search.js +170 -0
- package/dist/adapters/cnipa/search.js.map +1 -0
- package/dist/adapters/crossref/works.d.ts +42 -0
- package/dist/adapters/crossref/works.d.ts.map +1 -0
- package/dist/adapters/crossref/works.js +157 -0
- package/dist/adapters/crossref/works.js.map +1 -0
- package/dist/adapters/cvf/papers.d.ts +17 -0
- package/dist/adapters/cvf/papers.d.ts.map +1 -0
- package/dist/adapters/cvf/papers.js +124 -0
- package/dist/adapters/cvf/papers.js.map +1 -0
- package/dist/adapters/dblp/publications.js +4 -0
- package/dist/adapters/dblp/publications.js.map +1 -1
- package/dist/adapters/espacenet/_shared.d.ts +21 -0
- package/dist/adapters/espacenet/_shared.d.ts.map +1 -0
- package/dist/adapters/espacenet/_shared.js +67 -0
- package/dist/adapters/espacenet/_shared.js.map +1 -0
- package/dist/adapters/espacenet/family.d.ts +19 -0
- package/dist/adapters/espacenet/family.d.ts.map +1 -0
- package/dist/adapters/espacenet/family.js +118 -0
- package/dist/adapters/espacenet/family.js.map +1 -0
- package/dist/adapters/espacenet/get.d.ts +19 -0
- package/dist/adapters/espacenet/get.d.ts.map +1 -0
- package/dist/adapters/espacenet/get.js +130 -0
- package/dist/adapters/espacenet/get.js.map +1 -0
- package/dist/adapters/espacenet/legal-status.d.ts +19 -0
- package/dist/adapters/espacenet/legal-status.d.ts.map +1 -0
- package/dist/adapters/espacenet/legal-status.js +110 -0
- package/dist/adapters/espacenet/legal-status.js.map +1 -0
- package/dist/adapters/espacenet/search.d.ts +20 -0
- package/dist/adapters/espacenet/search.d.ts.map +1 -0
- package/dist/adapters/espacenet/search.js +165 -0
- package/dist/adapters/espacenet/search.js.map +1 -0
- package/dist/adapters/facebook/subtitles.d.ts +9 -0
- package/dist/adapters/facebook/subtitles.d.ts.map +1 -0
- package/dist/adapters/facebook/subtitles.js +42 -0
- package/dist/adapters/facebook/subtitles.js.map +1 -0
- package/dist/adapters/fips/_shared.d.ts +21 -0
- package/dist/adapters/fips/_shared.d.ts.map +1 -0
- package/dist/adapters/fips/_shared.js +77 -0
- package/dist/adapters/fips/_shared.js.map +1 -0
- package/dist/adapters/fips/get.d.ts +19 -0
- package/dist/adapters/fips/get.d.ts.map +1 -0
- package/dist/adapters/fips/get.js +139 -0
- package/dist/adapters/fips/get.js.map +1 -0
- package/dist/adapters/fips/search.d.ts +20 -0
- package/dist/adapters/fips/search.d.ts.map +1 -0
- package/dist/adapters/fips/search.js +148 -0
- package/dist/adapters/fips/search.js.map +1 -0
- package/dist/adapters/freepatentsonline-web/_shared.d.ts +72 -0
- package/dist/adapters/freepatentsonline-web/_shared.d.ts.map +1 -0
- package/dist/adapters/freepatentsonline-web/_shared.js +216 -0
- package/dist/adapters/freepatentsonline-web/_shared.js.map +1 -0
- package/dist/adapters/freepatentsonline-web/get.d.ts +21 -0
- package/dist/adapters/freepatentsonline-web/get.d.ts.map +1 -0
- package/dist/adapters/freepatentsonline-web/get.js +127 -0
- package/dist/adapters/freepatentsonline-web/get.js.map +1 -0
- package/dist/adapters/freepatentsonline-web/search.d.ts +22 -0
- package/dist/adapters/freepatentsonline-web/search.d.ts.map +1 -0
- package/dist/adapters/freepatentsonline-web/search.js +149 -0
- package/dist/adapters/freepatentsonline-web/search.js.map +1 -0
- package/dist/adapters/google-patents-web/_shared.d.ts +110 -0
- package/dist/adapters/google-patents-web/_shared.d.ts.map +1 -0
- package/dist/adapters/google-patents-web/_shared.js +164 -0
- package/dist/adapters/google-patents-web/_shared.js.map +1 -0
- package/dist/adapters/google-patents-web/get.d.ts +36 -0
- package/dist/adapters/google-patents-web/get.d.ts.map +1 -0
- package/dist/adapters/google-patents-web/get.js +187 -0
- package/dist/adapters/google-patents-web/get.js.map +1 -0
- package/dist/adapters/google-patents-web/search.d.ts +23 -0
- package/dist/adapters/google-patents-web/search.d.ts.map +1 -0
- package/dist/adapters/google-patents-web/search.js +169 -0
- package/dist/adapters/google-patents-web/search.js.map +1 -0
- package/dist/adapters/google-scholar/cite.js +1 -0
- package/dist/adapters/google-scholar/cite.js.map +1 -1
- package/dist/adapters/google-scholar/profile.js +5 -0
- package/dist/adapters/google-scholar/profile.js.map +1 -1
- package/dist/adapters/google-scholar/search.js +5 -0
- package/dist/adapters/google-scholar/search.js.map +1 -1
- package/dist/adapters/hf/paper.js +1 -0
- package/dist/adapters/hf/paper.js.map +1 -1
- package/dist/adapters/inpi-br/_shared.d.ts +21 -0
- package/dist/adapters/inpi-br/_shared.d.ts.map +1 -0
- package/dist/adapters/inpi-br/_shared.js +67 -0
- package/dist/adapters/inpi-br/_shared.js.map +1 -0
- package/dist/adapters/inpi-br/get.d.ts +19 -0
- package/dist/adapters/inpi-br/get.d.ts.map +1 -0
- package/dist/adapters/inpi-br/get.js +142 -0
- package/dist/adapters/inpi-br/get.js.map +1 -0
- package/dist/adapters/inpi-br/search.d.ts +20 -0
- package/dist/adapters/inpi-br/search.d.ts.map +1 -0
- package/dist/adapters/inpi-br/search.js +154 -0
- package/dist/adapters/inpi-br/search.js.map +1 -0
- package/dist/adapters/instagram/subtitles.d.ts +9 -0
- package/dist/adapters/instagram/subtitles.d.ts.map +1 -0
- package/dist/adapters/instagram/subtitles.js +42 -0
- package/dist/adapters/instagram/subtitles.js.map +1 -0
- package/dist/adapters/mastodon/statuses.d.ts +40 -0
- package/dist/adapters/mastodon/statuses.d.ts.map +1 -0
- package/dist/adapters/mastodon/statuses.js +153 -0
- package/dist/adapters/mastodon/statuses.js.map +1 -0
- package/dist/adapters/neurips/proceedings.d.ts +17 -0
- package/dist/adapters/neurips/proceedings.d.ts.map +1 -0
- package/dist/adapters/neurips/proceedings.js +112 -0
- package/dist/adapters/neurips/proceedings.js.map +1 -0
- package/dist/adapters/openalex/works.d.ts.map +1 -1
- package/dist/adapters/openalex/works.js +32 -0
- package/dist/adapters/openalex/works.js.map +1 -1
- package/dist/adapters/openreview/papers.js +5 -0
- package/dist/adapters/openreview/papers.js.map +1 -1
- package/dist/adapters/pmlr/proceedings.d.ts +35 -0
- package/dist/adapters/pmlr/proceedings.d.ts.map +1 -0
- package/dist/adapters/pmlr/proceedings.js +139 -0
- package/dist/adapters/pmlr/proceedings.js.map +1 -0
- package/dist/adapters/pubmed/articles.js +5 -0
- package/dist/adapters/pubmed/articles.js.map +1 -1
- package/dist/adapters/reddit/comments.d.ts +9 -0
- package/dist/adapters/reddit/comments.d.ts.map +1 -0
- package/dist/adapters/reddit/comments.js +124 -0
- package/dist/adapters/reddit/comments.js.map +1 -0
- package/dist/adapters/semantic-scholar/papers.d.ts +36 -0
- package/dist/adapters/semantic-scholar/papers.d.ts.map +1 -0
- package/dist/adapters/semantic-scholar/papers.js +214 -0
- package/dist/adapters/semantic-scholar/papers.js.map +1 -0
- package/dist/adapters/threads/post.d.ts +32 -0
- package/dist/adapters/threads/post.d.ts.map +1 -0
- package/dist/adapters/threads/post.js +287 -0
- package/dist/adapters/threads/post.js.map +1 -0
- package/dist/adapters/tiktok/subtitles.d.ts +9 -0
- package/dist/adapters/tiktok/subtitles.d.ts.map +1 -0
- package/dist/adapters/tiktok/subtitles.js +42 -0
- package/dist/adapters/tiktok/subtitles.js.map +1 -0
- package/dist/adapters/twitter/accept.js +2 -2
- package/dist/adapters/twitter/accept.js.map +1 -1
- package/dist/adapters/twitter/browser-fallback.d.ts +26 -0
- package/dist/adapters/twitter/browser-fallback.d.ts.map +1 -0
- package/dist/adapters/twitter/browser-fallback.js +93 -0
- package/dist/adapters/twitter/browser-fallback.js.map +1 -0
- package/dist/adapters/twitter/browser-state.d.ts +11 -0
- package/dist/adapters/twitter/browser-state.d.ts.map +1 -0
- package/dist/adapters/twitter/browser-state.js +46 -0
- package/dist/adapters/twitter/browser-state.js.map +1 -0
- package/dist/adapters/twitter/client.d.ts.map +1 -1
- package/dist/adapters/twitter/client.js +36 -13
- package/dist/adapters/twitter/client.js.map +1 -1
- package/dist/adapters/twitter/reply-dm.js +2 -2
- package/dist/adapters/twitter/reply-dm.js.map +1 -1
- package/dist/adapters/twitter/reply.js +1 -0
- package/dist/adapters/twitter/reply.js.map +1 -1
- package/dist/adapters/twitter/search.js +11 -18
- package/dist/adapters/twitter/search.js.map +1 -1
- package/dist/adapters/twitter/thread.d.ts +14 -0
- package/dist/adapters/twitter/thread.d.ts.map +1 -1
- package/dist/adapters/twitter/thread.js +28 -2
- package/dist/adapters/twitter/thread.js.map +1 -1
- package/dist/adapters/twitter/trending.js +13 -59
- package/dist/adapters/twitter/trending.js.map +1 -1
- package/dist/adapters/unpaywall/works.d.ts +33 -0
- package/dist/adapters/unpaywall/works.d.ts.map +1 -0
- package/dist/adapters/unpaywall/works.js +101 -0
- package/dist/adapters/unpaywall/works.js.map +1 -0
- package/dist/adapters/xiaohongshu/browser-state.d.ts +19 -0
- package/dist/adapters/xiaohongshu/browser-state.d.ts.map +1 -0
- package/dist/adapters/xiaohongshu/browser-state.js +67 -0
- package/dist/adapters/xiaohongshu/browser-state.js.map +1 -0
- package/dist/adapters/xiaohongshu/comments.js +28 -5
- package/dist/adapters/xiaohongshu/comments.js.map +1 -1
- package/dist/adapters/xiaohongshu/download.js +49 -11
- package/dist/adapters/xiaohongshu/download.js.map +1 -1
- package/dist/adapters/xiaohongshu/search.d.ts.map +1 -1
- package/dist/adapters/xiaohongshu/search.js +11 -5
- package/dist/adapters/xiaohongshu/search.js.map +1 -1
- package/dist/adapters/xiaohongshu/trending.d.ts +9 -0
- package/dist/adapters/xiaohongshu/trending.d.ts.map +1 -0
- package/dist/adapters/xiaohongshu/trending.js +94 -0
- package/dist/adapters/xiaohongshu/trending.js.map +1 -0
- package/dist/adapters/youtube/comments.d.ts +80 -0
- package/dist/adapters/youtube/comments.d.ts.map +1 -1
- package/dist/adapters/youtube/comments.js +108 -12
- package/dist/adapters/youtube/comments.js.map +1 -1
- package/dist/adapters/youtube/subtitles.d.ts +9 -0
- package/dist/adapters/youtube/subtitles.d.ts.map +1 -0
- package/dist/adapters/youtube/subtitles.js +42 -0
- package/dist/adapters/youtube/subtitles.js.map +1 -0
- package/dist/adapters/yt-dlp/subtitles.d.ts +9 -0
- package/dist/adapters/yt-dlp/subtitles.d.ts.map +1 -0
- package/dist/adapters/yt-dlp/subtitles.js +41 -0
- package/dist/adapters/yt-dlp/subtitles.js.map +1 -0
- package/dist/adapters/zhihu/answer-detail.d.ts +39 -0
- package/dist/adapters/zhihu/answer-detail.d.ts.map +1 -0
- package/dist/adapters/zhihu/answer-detail.js +204 -0
- package/dist/adapters/zhihu/answer-detail.js.map +1 -0
- package/dist/adapters/zhihu/comment.d.ts +9 -0
- package/dist/adapters/zhihu/comment.d.ts.map +1 -0
- package/dist/adapters/zhihu/comment.js +149 -0
- package/dist/adapters/zhihu/comment.js.map +1 -0
- package/dist/adapters/zhihu/recommend.d.ts +36 -0
- package/dist/adapters/zhihu/recommend.d.ts.map +1 -0
- package/dist/adapters/zhihu/recommend.js +151 -0
- package/dist/adapters/zhihu/recommend.js.map +1 -0
- package/dist/browser/bridge.d.ts.map +1 -1
- package/dist/browser/bridge.js +14 -3
- package/dist/browser/bridge.js.map +1 -1
- package/dist/browser/daemon-client.d.ts +6 -0
- package/dist/browser/daemon-client.d.ts.map +1 -1
- package/dist/browser/daemon-client.js +75 -15
- package/dist/browser/daemon-client.js.map +1 -1
- package/dist/browser/daemon.js +39 -15
- package/dist/browser/daemon.js.map +1 -1
- package/dist/browser/protocol.d.ts +1 -0
- package/dist/browser/protocol.d.ts.map +1 -1
- package/dist/browser/protocol.js +1 -0
- package/dist/browser/protocol.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +21 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/approvals.d.ts.map +1 -1
- package/dist/commands/approvals.js +1 -37
- package/dist/commands/approvals.js.map +1 -1
- package/dist/commands/browser/index.d.ts.map +1 -1
- package/dist/commands/browser/index.js +7 -2
- package/dist/commands/browser/index.js.map +1 -1
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +7 -3
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/dispatch.d.ts.map +1 -1
- package/dist/commands/dispatch.js +27 -3
- package/dist/commands/dispatch.js.map +1 -1
- package/dist/commands/do.d.ts +30 -0
- package/dist/commands/do.d.ts.map +1 -0
- package/dist/commands/do.js +248 -0
- package/dist/commands/do.js.map +1 -0
- package/dist/commands/extract.d.ts +34 -0
- package/dist/commands/extract.d.ts.map +1 -0
- package/dist/commands/extract.js +316 -0
- package/dist/commands/extract.js.map +1 -0
- package/dist/commands/patent-doctor.d.ts +48 -0
- package/dist/commands/patent-doctor.d.ts.map +1 -0
- package/dist/commands/patent-doctor.js +109 -0
- package/dist/commands/patent-doctor.js.map +1 -0
- package/dist/commands/patent.d.ts +78 -0
- package/dist/commands/patent.d.ts.map +1 -0
- package/dist/commands/patent.js +919 -0
- package/dist/commands/patent.js.map +1 -0
- package/dist/commands/scholar.d.ts +33 -0
- package/dist/commands/scholar.d.ts.map +1 -0
- package/dist/commands/scholar.js +494 -0
- package/dist/commands/scholar.js.map +1 -0
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +2 -5
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/social.d.ts +19 -0
- package/dist/commands/social.d.ts.map +1 -0
- package/dist/commands/social.js +236 -0
- package/dist/commands/social.js.map +1 -0
- package/dist/core/registry.d.ts +1 -1
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +11 -2
- package/dist/core/registry.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 +182 -11
- package/dist/discovery/aliases.js.map +1 -1
- package/dist/discovery/intents.d.ts +10 -0
- package/dist/discovery/intents.d.ts.map +1 -0
- package/dist/discovery/intents.js +255 -0
- package/dist/discovery/intents.js.map +1 -0
- package/dist/discovery/loader.d.ts.map +1 -1
- package/dist/discovery/loader.js +4 -0
- package/dist/discovery/loader.js.map +1 -1
- package/dist/discovery/search.d.ts +4 -1
- package/dist/discovery/search.d.ts.map +1 -1
- package/dist/discovery/search.js +28 -140
- package/dist/discovery/search.js.map +1 -1
- package/dist/engine/approval-presenter.d.ts +10 -0
- package/dist/engine/approval-presenter.d.ts.map +1 -0
- package/dist/engine/approval-presenter.js +45 -0
- package/dist/engine/approval-presenter.js.map +1 -0
- package/dist/engine/approval-store.d.ts +4 -0
- package/dist/engine/approval-store.d.ts.map +1 -1
- package/dist/engine/approval-store.js +85 -11
- package/dist/engine/approval-store.js.map +1 -1
- package/dist/engine/auth/oauth2-cc.d.ts +67 -0
- package/dist/engine/auth/oauth2-cc.d.ts.map +1 -0
- package/dist/engine/auth/oauth2-cc.js +120 -0
- package/dist/engine/auth/oauth2-cc.js.map +1 -0
- package/dist/engine/cookies.d.ts +10 -0
- package/dist/engine/cookies.d.ts.map +1 -1
- package/dist/engine/cookies.js +64 -0
- package/dist/engine/cookies.js.map +1 -1
- package/dist/engine/download.d.ts +5 -0
- package/dist/engine/download.d.ts.map +1 -1
- package/dist/engine/download.js +11 -4
- package/dist/engine/download.js.map +1 -1
- package/dist/engine/executor.d.ts +1 -0
- package/dist/engine/executor.d.ts.map +1 -1
- package/dist/engine/executor.js +25 -0
- package/dist/engine/executor.js.map +1 -1
- package/dist/engine/framework.d.ts +5 -5
- package/dist/engine/framework.js +5 -5
- package/dist/engine/harden.d.ts +1 -1
- package/dist/engine/harden.js +1 -1
- package/dist/engine/kernel/stages.d.ts.map +1 -1
- package/dist/engine/kernel/stages.js +2 -1
- package/dist/engine/kernel/stages.js.map +1 -1
- package/dist/engine/normalizer/patent-envelope.d.ts +61 -0
- package/dist/engine/normalizer/patent-envelope.d.ts.map +1 -0
- package/dist/engine/normalizer/patent-envelope.js +132 -0
- package/dist/engine/normalizer/patent-envelope.js.map +1 -0
- package/dist/engine/research.d.ts +5 -7
- package/dist/engine/research.d.ts.map +1 -1
- package/dist/engine/research.js +6 -9
- package/dist/engine/research.js.map +1 -1
- package/dist/engine/steps/browser-helpers.d.ts +2 -2
- package/dist/engine/steps/browser-helpers.d.ts.map +1 -1
- package/dist/engine/steps/browser-helpers.js +39 -16
- package/dist/engine/steps/browser-helpers.js.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 +3 -1
- package/dist/engine/steps/download.js.map +1 -1
- package/dist/engine/steps/index.d.ts +2 -0
- package/dist/engine/steps/index.d.ts.map +1 -1
- package/dist/engine/steps/index.js +2 -0
- package/dist/engine/steps/index.js.map +1 -1
- package/dist/engine/steps/oauth2-token.d.ts +41 -0
- package/dist/engine/steps/oauth2-token.d.ts.map +1 -0
- package/dist/engine/steps/oauth2-token.js +115 -0
- package/dist/engine/steps/oauth2-token.js.map +1 -0
- package/dist/engine/steps/select-xml.d.ts +34 -0
- package/dist/engine/steps/select-xml.d.ts.map +1 -0
- package/dist/engine/steps/select-xml.js +222 -0
- package/dist/engine/steps/select-xml.js.map +1 -0
- package/dist/engine/template.d.ts.map +1 -1
- package/dist/engine/template.js +7 -0
- package/dist/engine/template.js.map +1 -1
- package/dist/engine/transport/mcp-browser.d.ts +128 -0
- package/dist/engine/transport/mcp-browser.d.ts.map +1 -0
- package/dist/engine/transport/mcp-browser.js +120 -0
- package/dist/engine/transport/mcp-browser.js.map +1 -0
- package/dist/fast-path/handlers/approvals.d.ts +11 -0
- package/dist/fast-path/handlers/approvals.d.ts.map +1 -0
- package/dist/fast-path/handlers/approvals.js +136 -0
- package/dist/fast-path/handlers/approvals.js.map +1 -0
- package/dist/fast-path/handlers/discovery.d.ts.map +1 -1
- package/dist/fast-path/handlers/discovery.js +17 -3
- package/dist/fast-path/handlers/discovery.js.map +1 -1
- package/dist/fast-path/manifest.d.ts +1 -0
- package/dist/fast-path/manifest.d.ts.map +1 -1
- package/dist/fast-path/manifest.js.map +1 -1
- package/dist/fast-path.d.ts.map +1 -1
- package/dist/fast-path.js +3 -0
- package/dist/fast-path.js.map +1 -1
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest-compact.txt +13 -11
- package/dist/manifest-search.json +1 -1
- package/dist/manifest.json +2560 -103
- package/dist/mcp/handler.d.ts.map +1 -1
- package/dist/mcp/handler.js +14 -2
- package/dist/mcp/handler.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +11 -3
- package/dist/mcp/tools.js.map +1 -1
- package/dist/output/auth-guidance.d.ts +14 -0
- package/dist/output/auth-guidance.d.ts.map +1 -0
- package/dist/output/auth-guidance.js +50 -0
- package/dist/output/auth-guidance.js.map +1 -0
- package/dist/output/error-map.d.ts +1 -1
- package/dist/output/error-map.d.ts.map +1 -1
- package/dist/output/error-map.js +28 -4
- package/dist/output/error-map.js.map +1 -1
- package/dist/output/next-actions.d.ts.map +1 -1
- package/dist/output/next-actions.js +19 -3
- package/dist/output/next-actions.js.map +1 -1
- package/dist/registry.d.ts +19 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +10 -0
- package/dist/registry.js.map +1 -1
- package/dist/social/browser-errors.d.ts +13 -0
- package/dist/social/browser-errors.d.ts.map +1 -0
- package/dist/social/browser-errors.js +36 -0
- package/dist/social/browser-errors.js.map +1 -0
- package/dist/social/capabilities.d.ts +29 -0
- package/dist/social/capabilities.d.ts.map +1 -0
- package/dist/social/capabilities.js +448 -0
- package/dist/social/capabilities.js.map +1 -0
- package/dist/social/comments.d.ts +26 -0
- package/dist/social/comments.d.ts.map +1 -0
- package/dist/social/comments.js +97 -0
- package/dist/social/comments.js.map +1 -0
- package/dist/social/video-text.d.ts +27 -0
- package/dist/social/video-text.d.ts.map +1 -0
- package/dist/social/video-text.js +140 -0
- package/dist/social/video-text.js.map +1 -0
- package/dist/types/patent.d.ts +160 -0
- package/dist/types/patent.d.ts.map +1 -0
- package/dist/types/patent.js +16 -0
- package/dist/types/patent.js.map +1 -0
- package/dist/types/scholarly.d.ts +49 -0
- package/dist/types/scholarly.d.ts.map +1 -0
- package/dist/types/scholarly.js +16 -0
- package/dist/types/scholarly.js.map +1 -0
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +9 -4
- 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/acl-anthology/papers.ts +157 -0
- package/src/adapters/arxiv/download.yaml +1 -1
- package/src/adapters/arxiv/paper.yaml +1 -1
- package/src/adapters/arxiv/papers.ts +2 -0
- package/src/adapters/arxiv/search.yaml +1 -1
- package/src/adapters/arxiv/trending.yaml +1 -1
- package/src/adapters/baidu-scholar/search.ts +5 -0
- package/src/adapters/bilibili/comments-tree.test.ts +41 -0
- package/src/adapters/bilibili/comments.ts +78 -4
- package/src/adapters/bilibili/compat.ts +5 -2
- package/src/adapters/bilibili/download.ts +7 -4
- package/src/adapters/bilibili/wbi.ts +6 -3
- package/src/adapters/brave/search.yaml +53 -0
- package/src/adapters/cipo/_shared.ts +98 -0
- package/src/adapters/cipo/get.ts +188 -0
- package/src/adapters/cipo/legal-status.ts +148 -0
- package/src/adapters/cipo/search.ts +195 -0
- package/src/adapters/cnipa/_shared.ts +138 -0
- package/src/adapters/cnipa/get.ts +199 -0
- package/src/adapters/cnipa/legal-status.ts +162 -0
- package/src/adapters/cnipa/search.ts +229 -0
- package/src/adapters/crossref/works.ts +209 -0
- package/src/adapters/cvf/papers.ts +136 -0
- package/src/adapters/dblp/publications.ts +4 -0
- package/src/adapters/dpma/get.yaml +67 -0
- package/src/adapters/dpma/search.yaml +77 -0
- package/src/adapters/duckduckgo/search.yaml +54 -0
- package/src/adapters/duckduckgo/suggest.yaml +52 -0
- package/src/adapters/epo/family.yaml +69 -0
- package/src/adapters/epo/get.yaml +74 -0
- package/src/adapters/epo/legal-status.yaml +63 -0
- package/src/adapters/epo/search.yaml +84 -0
- package/src/adapters/espacenet/_shared.ts +98 -0
- package/src/adapters/espacenet/family.ts +161 -0
- package/src/adapters/espacenet/get.ts +185 -0
- package/src/adapters/espacenet/legal-status.ts +151 -0
- package/src/adapters/espacenet/search.ts +229 -0
- package/src/adapters/facebook/subtitles.ts +44 -0
- package/src/adapters/fips/_shared.ts +109 -0
- package/src/adapters/fips/get.ts +186 -0
- package/src/adapters/fips/search.ts +195 -0
- package/src/adapters/freepatentsonline-web/_shared.ts +273 -0
- package/src/adapters/freepatentsonline-web/get.ts +144 -0
- package/src/adapters/freepatentsonline-web/search.ts +170 -0
- package/src/adapters/google-patents-bq/prior-art.yaml +80 -0
- package/src/adapters/google-patents-bq/search.yaml +97 -0
- package/src/adapters/google-patents-web/_shared.ts +242 -0
- package/src/adapters/google-patents-web/get.ts +224 -0
- package/src/adapters/google-patents-web/search.ts +196 -0
- package/src/adapters/google-scholar/cite.ts +1 -0
- package/src/adapters/google-scholar/profile.ts +5 -0
- package/src/adapters/google-scholar/search.ts +5 -0
- package/src/adapters/hf/paper.test.ts +10 -0
- package/src/adapters/hf/paper.ts +1 -0
- package/src/adapters/hf/top.yaml +1 -1
- package/src/adapters/huggingface-papers/daily.yaml +1 -1
- package/src/adapters/huggingface-papers/search.yaml +1 -1
- package/src/adapters/inpi-br/_shared.ts +98 -0
- package/src/adapters/inpi-br/get.ts +193 -0
- package/src/adapters/inpi-br/search.ts +206 -0
- package/src/adapters/inpi-fr/get.yaml +62 -0
- package/src/adapters/inpi-fr/search.yaml +74 -0
- package/src/adapters/instagram/subtitles.ts +44 -0
- package/src/adapters/ipaustralia/get.yaml +67 -0
- package/src/adapters/ipaustralia/search.yaml +74 -0
- package/src/adapters/jpo/get.yaml +63 -0
- package/src/adapters/jpo/search.yaml +76 -0
- package/src/adapters/kipris/get.yaml +69 -0
- package/src/adapters/kipris/legal-status.yaml +58 -0
- package/src/adapters/kipris/search.yaml +79 -0
- package/src/adapters/lens/get.yaml +64 -0
- package/src/adapters/lens/search.yaml +82 -0
- package/src/adapters/mastodon/statuses.test.ts +82 -0
- package/src/adapters/mastodon/statuses.ts +208 -0
- package/src/adapters/neurips/proceedings.ts +126 -0
- package/src/adapters/openalex/works.ts +33 -0
- package/src/adapters/openreview/papers.ts +5 -0
- package/src/adapters/patsnap/get.yaml +65 -0
- package/src/adapters/patsnap/search.yaml +77 -0
- package/src/adapters/pmlr/proceedings.ts +167 -0
- package/src/adapters/pqai/prior-art.yaml +59 -0
- package/src/adapters/pqai/search.yaml +60 -0
- package/src/adapters/pubmed/articles.ts +5 -0
- package/src/adapters/reddit/comments-tree.test.ts +79 -0
- package/src/adapters/reddit/comments.ts +159 -0
- package/src/adapters/semantic-scholar/papers.ts +268 -0
- package/src/adapters/threads/post.test.ts +64 -0
- package/src/adapters/threads/post.ts +366 -0
- package/src/adapters/threads/user.yaml +73 -0
- package/src/adapters/tiktok/subtitles.ts +44 -0
- package/src/adapters/twitter/accept.ts +5 -2
- package/src/adapters/twitter/browser-fallback.ts +138 -0
- package/src/adapters/twitter/browser-state.ts +74 -0
- package/src/adapters/twitter/client.ts +51 -21
- package/src/adapters/twitter/reply-dm.ts +5 -2
- package/src/adapters/twitter/reply.ts +1 -0
- package/src/adapters/twitter/search.ts +12 -38
- package/src/adapters/twitter/thread.test.ts +43 -0
- package/src/adapters/twitter/thread.ts +44 -2
- package/src/adapters/twitter/trending.ts +14 -95
- package/src/adapters/ukipo/info.yaml +43 -0
- package/src/adapters/unpaywall/works.ts +138 -0
- package/src/adapters/uspto/get.yaml +67 -0
- package/src/adapters/uspto/legal-status.yaml +58 -0
- package/src/adapters/uspto/search.yaml +88 -0
- package/src/adapters/wipo-patentscope/info.yaml +43 -0
- package/src/adapters/xiaohongshu/browser-state.ts +95 -0
- package/src/adapters/xiaohongshu/comments.ts +29 -6
- package/src/adapters/xiaohongshu/download.ts +60 -11
- package/src/adapters/xiaohongshu/search.ts +18 -6
- package/src/adapters/xiaohongshu/trending.ts +112 -0
- package/src/adapters/yahoo/search.yaml +52 -0
- package/src/adapters/youtube/comments-microformat.test.ts +35 -0
- package/src/adapters/youtube/comments-tree.test.ts +74 -0
- package/src/adapters/youtube/comments.ts +166 -12
- package/src/adapters/youtube/subtitles.ts +44 -0
- package/src/adapters/yt-dlp/subtitles.ts +43 -0
- package/src/adapters/zhihu/answer-detail.test.ts +83 -0
- package/src/adapters/zhihu/answer-detail.ts +275 -0
- package/src/adapters/zhihu/comment-tree.test.ts +57 -0
- package/src/adapters/zhihu/comment.ts +186 -0
- package/src/adapters/zhihu/recommend.test.ts +65 -0
- package/src/adapters/zhihu/recommend.ts +207 -0
- package/src/adapters/zotero/search.yaml +1 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::cnipa::legal-status
|
|
3
|
+
* @does Browser-driven CNIPA legal-status lookup — scrapes the prosecution timeline + grant status from the 公众查询 detail page; emits structured envelopes for captcha / not-found / MCP-bus gaps.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/cnipa/_shared.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.legal-status)
|
|
6
|
+
* @breaks emits PATENT_INVALID_NUMBER, PATENT_BROWSER_CAPTCHA, PATENT_API_DEPRECATED (with MCP_BUS_MISSING context); never synthesizes a status
|
|
7
|
+
* @invariants output row carries `legal_status` exactly as scraped; no normalization beyond trim
|
|
8
|
+
* @side-effects controls Chrome via MCP
|
|
9
|
+
* @perf single navigate + evaluate
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/cnipa/search.test.ts (shared transport-error path)
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification browser-only
|
|
15
|
+
*/
|
|
16
|
+
export declare function runCnipaLegalStatus(kwargs: {
|
|
17
|
+
publication_number: string;
|
|
18
|
+
}): Promise<unknown[]>;
|
|
19
|
+
//# sourceMappingURL=legal-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legal-status.d.ts","sourceRoot":"","sources":["../../../src/adapters/cnipa/legal-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAsCH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,kBAAkB,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAgFrB"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::cnipa::legal-status
|
|
3
|
+
* @does Browser-driven CNIPA legal-status lookup — scrapes the prosecution timeline + grant status from the 公众查询 detail page; emits structured envelopes for captcha / not-found / MCP-bus gaps.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/cnipa/_shared.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.legal-status)
|
|
6
|
+
* @breaks emits PATENT_INVALID_NUMBER, PATENT_BROWSER_CAPTCHA, PATENT_API_DEPRECATED (with MCP_BUS_MISSING context); never synthesizes a status
|
|
7
|
+
* @invariants output row carries `legal_status` exactly as scraped; no normalization beyond trim
|
|
8
|
+
* @side-effects controls Chrome via MCP
|
|
9
|
+
* @perf single navigate + evaluate
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/cnipa/search.test.ts (shared transport-error path)
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification browser-only
|
|
15
|
+
*/
|
|
16
|
+
import { cli, Strategy } from "../../registry.js";
|
|
17
|
+
import { TransportError } from "../../engine/transport/mcp-browser.js";
|
|
18
|
+
import { cnipaEnvelope, looksLikeCaptcha, navigateAndExtract, transportErrorToEnvelope, } from "./_shared.js";
|
|
19
|
+
const ADAPTER_PATH = "src/adapters/cnipa/legal-status.ts";
|
|
20
|
+
const CNIPA_LEGAL_URL = "https://pss-system.cponline.cnipa.gov.cn/legalStatus";
|
|
21
|
+
const EXTRACTOR = `(() => {
|
|
22
|
+
const text = (sel) => {
|
|
23
|
+
const node = document.querySelector(sel);
|
|
24
|
+
return node ? (node.textContent || '').trim() : '';
|
|
25
|
+
};
|
|
26
|
+
return {
|
|
27
|
+
publication_number: text('[data-field="pubNo"], .publication-number'),
|
|
28
|
+
legal_status: text('[data-field="legalStatus"], .legal-status'),
|
|
29
|
+
status_date: text('[data-field="statusDate"], .status-date'),
|
|
30
|
+
source_url: location.href,
|
|
31
|
+
html_marker: document.body && document.body.innerText
|
|
32
|
+
? document.body.innerText.slice(0, 200)
|
|
33
|
+
: '',
|
|
34
|
+
};
|
|
35
|
+
})()`;
|
|
36
|
+
export async function runCnipaLegalStatus(kwargs) {
|
|
37
|
+
const pubNo = String(kwargs.publication_number ?? "").trim();
|
|
38
|
+
if (pubNo.length === 0) {
|
|
39
|
+
return [
|
|
40
|
+
{
|
|
41
|
+
envelope: cnipaEnvelope("PATENT_INVALID_NUMBER", ADAPTER_PATH, "validate", "cnipa legal-status requires a non-empty publication_number"),
|
|
42
|
+
},
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
const url = `${CNIPA_LEGAL_URL}?pubNo=${encodeURIComponent(pubNo)}`;
|
|
46
|
+
let detail;
|
|
47
|
+
try {
|
|
48
|
+
const result = await navigateAndExtract(url, EXTRACTOR);
|
|
49
|
+
if (!result.data) {
|
|
50
|
+
return [
|
|
51
|
+
{
|
|
52
|
+
envelope: cnipaEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "mcp-browser evaluate returned no data"),
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
}
|
|
56
|
+
detail = result.data;
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
if (err instanceof TransportError) {
|
|
60
|
+
return [
|
|
61
|
+
{
|
|
62
|
+
envelope: transportErrorToEnvelope(err, ADAPTER_PATH, "navigate"),
|
|
63
|
+
},
|
|
64
|
+
];
|
|
65
|
+
}
|
|
66
|
+
throw err;
|
|
67
|
+
}
|
|
68
|
+
const fieldCount = [detail.publication_number, detail.legal_status].filter(Boolean).length;
|
|
69
|
+
if (looksLikeCaptcha(fieldCount, detail.html_marker)) {
|
|
70
|
+
return [
|
|
71
|
+
{
|
|
72
|
+
envelope: cnipaEnvelope("PATENT_BROWSER_CAPTCHA", ADAPTER_PATH, "evaluate", "CNIPA legal-status page returned no fields; solve the 验证码 and re-run", ["espacenet"]),
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
}
|
|
76
|
+
if (!detail.legal_status) {
|
|
77
|
+
return [
|
|
78
|
+
{
|
|
79
|
+
envelope: cnipaEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "normalize", `cnipa returned no legal_status for "${pubNo}"`, ["espacenet"]),
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
}
|
|
83
|
+
return [
|
|
84
|
+
{
|
|
85
|
+
publication_number: detail.publication_number || pubNo,
|
|
86
|
+
legal_status: detail.legal_status,
|
|
87
|
+
status_date: detail.status_date,
|
|
88
|
+
source_adapter: "cnipa",
|
|
89
|
+
source_url: detail.source_url || url,
|
|
90
|
+
retrieved_at: new Date().toISOString(),
|
|
91
|
+
},
|
|
92
|
+
];
|
|
93
|
+
}
|
|
94
|
+
cli({
|
|
95
|
+
site: "cnipa",
|
|
96
|
+
name: "legal-status",
|
|
97
|
+
description: "CNIPA legal-status / prosecution timeline lookup (browser)",
|
|
98
|
+
domain: "pss-system.cponline.cnipa.gov.cn",
|
|
99
|
+
strategy: Strategy.PUBLIC,
|
|
100
|
+
adapter_path: ADAPTER_PATH,
|
|
101
|
+
args: [
|
|
102
|
+
{
|
|
103
|
+
name: "publication_number",
|
|
104
|
+
type: "str",
|
|
105
|
+
required: true,
|
|
106
|
+
positional: true,
|
|
107
|
+
description: "ST.16 publication number",
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
columns: ["publication_number", "legal_status", "status_date", "source_url"],
|
|
111
|
+
capabilities: [
|
|
112
|
+
"mcp-browser.navigate",
|
|
113
|
+
"mcp-browser.evaluate",
|
|
114
|
+
"patent.legal-status",
|
|
115
|
+
],
|
|
116
|
+
minimum_capability: "mcp-browser.evaluate",
|
|
117
|
+
func: async (_page, kwargs) => runCnipaLegalStatus(kwargs),
|
|
118
|
+
});
|
|
119
|
+
//# sourceMappingURL=legal-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legal-status.js","sourceRoot":"","sources":["../../../src/adapters/cnipa/legal-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::cnipa::search
|
|
3
|
+
* @does Browser-driven search of CNIPA 公众查询 system at pss-system.cponline.cnipa.gov.cn — the only programmatic route for CN patents (CNIPA has no open API today). Drives a real Chrome session via the mcp-browser transport, extracts result rows, normalizes through assemblePatentRecord.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/types/patent.ts, src/adapters/cnipa/_shared.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (meta-command discovers via patent.search capability tag)
|
|
6
|
+
* @breaks emits PATENT_BROWSER_CAPTCHA envelope when zero rows return from a navigation that did not error (CNIPA almost always shows a captcha gate); emits PATENT_API_DEPRECATED with MCP_BUS_MISSING context when no outbound MCP transport is registered
|
|
7
|
+
* @invariants result rows always include source_adapter='cnipa'; publication_number canonicalized via assemblePatentRecord; never returns a synthetic row when extraction fails
|
|
8
|
+
* @side-effects controls the user's Chrome browser via MCP; reads no env vars
|
|
9
|
+
* @perf single navigation + one evaluate; ~2-5 s wall-clock when active
|
|
10
|
+
* @concurrency safe — every call opens a fresh tab via mcpBrowserNavigate
|
|
11
|
+
* @test tests/unit/adapters/cnipa/search.test.ts
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification browser-only — no upstream API; gated on a live mcp-browser transport
|
|
15
|
+
*/
|
|
16
|
+
export declare function runCnipaSearch(kwargs: {
|
|
17
|
+
query: string;
|
|
18
|
+
limit?: number;
|
|
19
|
+
offset?: number;
|
|
20
|
+
}): Promise<unknown[]>;
|
|
21
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/adapters/cnipa/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAsEH,wBAAsB,cAAc,CAAC,MAAM,EAAE;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAkGrB"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::cnipa::search
|
|
3
|
+
* @does Browser-driven search of CNIPA 公众查询 system at pss-system.cponline.cnipa.gov.cn — the only programmatic route for CN patents (CNIPA has no open API today). Drives a real Chrome session via the mcp-browser transport, extracts result rows, normalizes through assemblePatentRecord.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/types/patent.ts, src/adapters/cnipa/_shared.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (meta-command discovers via patent.search capability tag)
|
|
6
|
+
* @breaks emits PATENT_BROWSER_CAPTCHA envelope when zero rows return from a navigation that did not error (CNIPA almost always shows a captcha gate); emits PATENT_API_DEPRECATED with MCP_BUS_MISSING context when no outbound MCP transport is registered
|
|
7
|
+
* @invariants result rows always include source_adapter='cnipa'; publication_number canonicalized via assemblePatentRecord; never returns a synthetic row when extraction fails
|
|
8
|
+
* @side-effects controls the user's Chrome browser via MCP; reads no env vars
|
|
9
|
+
* @perf single navigation + one evaluate; ~2-5 s wall-clock when active
|
|
10
|
+
* @concurrency safe — every call opens a fresh tab via mcpBrowserNavigate
|
|
11
|
+
* @test tests/unit/adapters/cnipa/search.test.ts
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification browser-only — no upstream API; gated on a live mcp-browser transport
|
|
15
|
+
*/
|
|
16
|
+
import { cli, Strategy } from "../../registry.js";
|
|
17
|
+
import { TransportError } from "../../engine/transport/mcp-browser.js";
|
|
18
|
+
import { assemblePatentRecord } from "../../engine/normalizer/patent-envelope.js";
|
|
19
|
+
import { cnipaEnvelope, looksLikeCaptcha, navigateAndExtract, transportErrorToEnvelope, } from "./_shared.js";
|
|
20
|
+
const ADAPTER_PATH = "src/adapters/cnipa/search.ts";
|
|
21
|
+
const CNIPA_SEARCH_URL = "https://pss-system.cponline.cnipa.gov.cn/conventionalSearch";
|
|
22
|
+
/**
|
|
23
|
+
* DOM extractor executed inside the page via mcp-browser. The selectors are
|
|
24
|
+
* the documented ones for the CNIPA 公众查询 result table; when CNIPA
|
|
25
|
+
* changes the markup an agent reads the failure envelope and updates the
|
|
26
|
+
* selector here (rule 02 self-repair).
|
|
27
|
+
*/
|
|
28
|
+
const EXTRACTOR = `(() => {
|
|
29
|
+
const rows = Array.from(
|
|
30
|
+
document.querySelectorAll('table.result-table tbody tr, .result-list .result-item')
|
|
31
|
+
).map((el) => {
|
|
32
|
+
const text = (sel) => {
|
|
33
|
+
const node = el.querySelector(sel);
|
|
34
|
+
return node ? (node.textContent || '').trim() : '';
|
|
35
|
+
};
|
|
36
|
+
return {
|
|
37
|
+
publication_number: text('.publication-number, [data-field="pubNo"]'),
|
|
38
|
+
application_number: text('.application-number, [data-field="appNo"]'),
|
|
39
|
+
title: text('.title, [data-field="title"]'),
|
|
40
|
+
applicant: text('.applicant, [data-field="applicant"]'),
|
|
41
|
+
publication_date: text('.publication-date, [data-field="pubDate"]'),
|
|
42
|
+
filing_date: text('.filing-date, [data-field="appDate"]'),
|
|
43
|
+
source_url: (el.querySelector('a[href]') || {}).href || '',
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
const html_marker = (document.body && document.body.innerText
|
|
47
|
+
? document.body.innerText.slice(0, 200)
|
|
48
|
+
: '');
|
|
49
|
+
return { rows, html_marker };
|
|
50
|
+
})()`;
|
|
51
|
+
function buildSearchUrl(query, limit, offset) {
|
|
52
|
+
const params = new URLSearchParams({
|
|
53
|
+
q: query,
|
|
54
|
+
pageSize: String(limit),
|
|
55
|
+
pageNo: String(Math.floor(offset / Math.max(1, limit)) + 1),
|
|
56
|
+
});
|
|
57
|
+
return `${CNIPA_SEARCH_URL}?${params.toString()}`;
|
|
58
|
+
}
|
|
59
|
+
export async function runCnipaSearch(kwargs) {
|
|
60
|
+
const limit = typeof kwargs.limit === "number" && Number.isFinite(kwargs.limit)
|
|
61
|
+
? Math.max(1, Math.min(100, Math.floor(kwargs.limit)))
|
|
62
|
+
: 25;
|
|
63
|
+
const offset = typeof kwargs.offset === "number" && Number.isFinite(kwargs.offset)
|
|
64
|
+
? Math.max(0, Math.floor(kwargs.offset))
|
|
65
|
+
: 0;
|
|
66
|
+
const query = String(kwargs.query ?? "").trim();
|
|
67
|
+
if (query.length === 0) {
|
|
68
|
+
return [
|
|
69
|
+
{
|
|
70
|
+
envelope: cnipaEnvelope("PATENT_UNSUPPORTED_QUERY", ADAPTER_PATH, "validate", "cnipa search requires a non-empty query string"),
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
}
|
|
74
|
+
const url = buildSearchUrl(query, limit, offset);
|
|
75
|
+
let extract;
|
|
76
|
+
try {
|
|
77
|
+
const result = await navigateAndExtract(url, EXTRACTOR);
|
|
78
|
+
if (!result.data) {
|
|
79
|
+
return [
|
|
80
|
+
{
|
|
81
|
+
envelope: cnipaEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "mcp-browser evaluate returned no data; check selector schema in src/adapters/cnipa/search.ts"),
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
extract = result.data;
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
if (err instanceof TransportError) {
|
|
89
|
+
return [
|
|
90
|
+
{
|
|
91
|
+
envelope: transportErrorToEnvelope(err, ADAPTER_PATH, "navigate"),
|
|
92
|
+
},
|
|
93
|
+
];
|
|
94
|
+
}
|
|
95
|
+
throw err;
|
|
96
|
+
}
|
|
97
|
+
if (looksLikeCaptcha(extract.rows.length, extract.html_marker)) {
|
|
98
|
+
return [
|
|
99
|
+
{
|
|
100
|
+
envelope: cnipaEnvelope("PATENT_BROWSER_CAPTCHA", ADAPTER_PATH, "evaluate", "CNIPA returned no rows for a non-empty query; solve the 验证码 in the open browser tab and re-run", ["espacenet", "lens"]),
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
}
|
|
104
|
+
const out = [];
|
|
105
|
+
for (const row of extract.rows.slice(0, limit)) {
|
|
106
|
+
if (!row.publication_number)
|
|
107
|
+
continue;
|
|
108
|
+
try {
|
|
109
|
+
out.push(assemblePatentRecord({
|
|
110
|
+
publication_number: row.publication_number,
|
|
111
|
+
application_number: row.application_number || undefined,
|
|
112
|
+
title: row.title || undefined,
|
|
113
|
+
assignees: row.applicant
|
|
114
|
+
? [{ name: row.applicant, country: "CN" }]
|
|
115
|
+
: undefined,
|
|
116
|
+
publication_date: row.publication_date || undefined,
|
|
117
|
+
filing_date: row.filing_date || undefined,
|
|
118
|
+
source_adapter: "cnipa",
|
|
119
|
+
source_url: row.source_url || url,
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// Skip malformed row rather than synthesize — rule 02.
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (out.length === 0) {
|
|
127
|
+
out.push({
|
|
128
|
+
envelope: cnipaEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "normalize", "cnipa returned rows but none carried a publication_number; report as schema drift", ["espacenet"]),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
return out;
|
|
132
|
+
}
|
|
133
|
+
cli({
|
|
134
|
+
site: "cnipa",
|
|
135
|
+
name: "search",
|
|
136
|
+
description: "Search CNIPA via the public 公众查询 browser interface (no API)",
|
|
137
|
+
domain: "pss-system.cponline.cnipa.gov.cn",
|
|
138
|
+
strategy: Strategy.PUBLIC,
|
|
139
|
+
adapter_path: ADAPTER_PATH,
|
|
140
|
+
args: [
|
|
141
|
+
{
|
|
142
|
+
name: "query",
|
|
143
|
+
type: "str",
|
|
144
|
+
required: true,
|
|
145
|
+
positional: true,
|
|
146
|
+
description: "Free-text query — matched against title/abstract/claims",
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
name: "limit",
|
|
150
|
+
type: "int",
|
|
151
|
+
default: 25,
|
|
152
|
+
description: "Maximum results to return (1-100)",
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
name: "offset",
|
|
156
|
+
type: "int",
|
|
157
|
+
default: 0,
|
|
158
|
+
description: "Result offset for pagination",
|
|
159
|
+
},
|
|
160
|
+
],
|
|
161
|
+
columns: ["publication_number", "title", "publication_date", "source_url"],
|
|
162
|
+
capabilities: [
|
|
163
|
+
"mcp-browser.navigate",
|
|
164
|
+
"mcp-browser.evaluate",
|
|
165
|
+
"patent.search",
|
|
166
|
+
],
|
|
167
|
+
minimum_capability: "mcp-browser.evaluate",
|
|
168
|
+
func: async (_page, kwargs) => runCnipaSearch(kwargs),
|
|
169
|
+
});
|
|
170
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/adapters/cnipa/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,cAAc,CAAC;AAEtB,MAAM,YAAY,GAAG,8BAA8B,CAAC;AACpD,MAAM,gBAAgB,GACpB,6DAA6D,CAAC;AAiBhE;;;;;GAKG;AACH,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;KAsBb,CAAC;AAEN,SAAS,cAAc,CAAC,KAAa,EAAE,KAAa,EAAE,MAAc;IAClE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,CAAC,EAAE,KAAK;QACR,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;KAC5D,CAAC,CAAC;IACH,OAAO,GAAG,gBAAgB,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAIpC;IACC,MAAM,KAAK,GACT,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;QAC/D,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,MAAM,GACV,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;QACjE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC,CAAC;IACR,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL;gBACE,QAAQ,EAAE,aAAa,CACrB,0BAA0B,EAC1B,YAAY,EACZ,UAAU,EACV,gDAAgD,CACjD;aACF;SACF,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACjD,IAAI,OAA2B,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAqB,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5E,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO;gBACL;oBACE,QAAQ,EAAE,aAAa,CACrB,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,8FAA8F,CAC/F;iBACF;aACF,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;YAClC,OAAO;gBACL;oBACE,QAAQ,EAAE,wBAAwB,CAAC,GAAG,EAAE,YAAY,EAAE,UAAU,CAAC;iBAClE;aACF,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,IAAI,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/D,OAAO;YACL;gBACE,QAAQ,EAAE,aAAa,CACrB,wBAAwB,EACxB,YAAY,EACZ,UAAU,EACV,gGAAgG,EAChG,CAAC,WAAW,EAAE,MAAM,CAAC,CACtB;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,kBAAkB;YAAE,SAAS;QACtC,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CACN,oBAAoB,CAAC;gBACnB,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;gBAC1C,kBAAkB,EAAE,GAAG,CAAC,kBAAkB,IAAI,SAAS;gBACvD,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,SAAS;gBAC7B,SAAS,EAAE,GAAG,CAAC,SAAS;oBACtB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBAC1C,CAAC,CAAC,SAAS;gBACb,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,IAAI,SAAS;gBACnD,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS;gBACzC,cAAc,EAAE,OAAO;gBACvB,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,GAAG;aACY,CAAC,CACjD,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,uDAAuD;QACzD,CAAC;IACH,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,GAAG,CAAC,IAAI,CAAC;YACP,QAAQ,EAAE,aAAa,CACrB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,mFAAmF,EACnF,CAAC,WAAW,CAAC,CACd;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,GAAG,CAAC;IACF,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,QAAQ;IACd,WAAW,EACT,6DAA6D;IAC/D,MAAM,EAAE,kCAAkC;IAC1C,QAAQ,EAAE,QAAQ,CAAC,MAAM;IACzB,YAAY,EAAE,YAAY;IAC1B,IAAI,EAAE;QACJ;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,yDAAyD;SACvE;QACD;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,mCAAmC;SACjD;QACD;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,CAAC;YACV,WAAW,EAAE,8BAA8B;SAC5C;KACF;IACD,OAAO,EAAE,CAAC,oBAAoB,EAAE,OAAO,EAAE,kBAAkB,EAAE,YAAY,CAAC;IAC1E,YAAY,EAAE;QACZ,sBAAsB;QACtB,sBAAsB;QACtB,eAAe;KAChB;IACD,kBAAkB,EAAE,sBAAsB;IAC1C,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAC5B,cAAc,CACZ,MAA4D,CAC7D;CACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::crossref::works
|
|
3
|
+
* @does Registers Crossref REST work search and DOI lookup commands for publisher metadata.
|
|
4
|
+
* @needs api.crossref.org REST API, optional CROSSREF_MAILTO, src/registry.ts
|
|
5
|
+
* @feeds src/commands/scholar.ts via scholar.search and scholar.get
|
|
6
|
+
* @breaks Crossref response-shape drift or rate limiting surfaces as explicit adapter errors.
|
|
7
|
+
* @invariants DOI lookup accepts only DOI-shaped references; output maps to ScholarlyWorkRecord.
|
|
8
|
+
* @side-effects HTTPS egress to api.crossref.org only
|
|
9
|
+
* @perf O(limit) JSON mapping
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/scholar-sources.test.ts
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-19
|
|
14
|
+
*/
|
|
15
|
+
import type { ScholarlyWorkRecord } from "../../types/scholarly.js";
|
|
16
|
+
interface CrossrefPerson {
|
|
17
|
+
given?: unknown;
|
|
18
|
+
family?: unknown;
|
|
19
|
+
name?: unknown;
|
|
20
|
+
}
|
|
21
|
+
interface CrossrefItem {
|
|
22
|
+
DOI?: unknown;
|
|
23
|
+
title?: unknown[];
|
|
24
|
+
subtitle?: unknown[];
|
|
25
|
+
author?: CrossrefPerson[];
|
|
26
|
+
"container-title"?: unknown[];
|
|
27
|
+
issued?: {
|
|
28
|
+
"date-parts"?: unknown[][];
|
|
29
|
+
};
|
|
30
|
+
published?: {
|
|
31
|
+
"date-parts"?: unknown[][];
|
|
32
|
+
};
|
|
33
|
+
"is-referenced-by-count"?: unknown;
|
|
34
|
+
reference?: unknown[];
|
|
35
|
+
URL?: unknown;
|
|
36
|
+
type?: unknown;
|
|
37
|
+
abstract?: unknown;
|
|
38
|
+
}
|
|
39
|
+
export declare function requireCrossrefDoi(value: unknown): string;
|
|
40
|
+
export declare function mapCrossrefItem(item: CrossrefItem, source: string): ScholarlyWorkRecord;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=works.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"works.d.ts","sourceRoot":"","sources":["../../../src/adapters/crossref/works.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAIpE,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,YAAY;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,CAAA;KAAE,CAAC;IACxC,SAAS,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,CAAA;KAAE,CAAC;IAC3C,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;IACtB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA6DD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMzD;AAsBD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,MAAM,GACb,mBAAmB,CAoBrB"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::crossref::works
|
|
3
|
+
* @does Registers Crossref REST work search and DOI lookup commands for publisher metadata.
|
|
4
|
+
* @needs api.crossref.org REST API, optional CROSSREF_MAILTO, src/registry.ts
|
|
5
|
+
* @feeds src/commands/scholar.ts via scholar.search and scholar.get
|
|
6
|
+
* @breaks Crossref response-shape drift or rate limiting surfaces as explicit adapter errors.
|
|
7
|
+
* @invariants DOI lookup accepts only DOI-shaped references; output maps to ScholarlyWorkRecord.
|
|
8
|
+
* @side-effects HTTPS egress to api.crossref.org only
|
|
9
|
+
* @perf O(limit) JSON mapping
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/scholar-sources.test.ts
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-19
|
|
14
|
+
*/
|
|
15
|
+
import { cli, Strategy } from "../../registry.js";
|
|
16
|
+
const API = "https://api.crossref.org";
|
|
17
|
+
function str(value) {
|
|
18
|
+
return typeof value === "string" ? value.trim() : "";
|
|
19
|
+
}
|
|
20
|
+
function arrFirst(value) {
|
|
21
|
+
return Array.isArray(value) ? str(value[0]) : str(value);
|
|
22
|
+
}
|
|
23
|
+
function num(value) {
|
|
24
|
+
return typeof value === "number" && Number.isFinite(value)
|
|
25
|
+
? value
|
|
26
|
+
: undefined;
|
|
27
|
+
}
|
|
28
|
+
function dateParts(item) {
|
|
29
|
+
return (item.issued?.["date-parts"]?.[0] ??
|
|
30
|
+
item.published?.["date-parts"]?.[0] ??
|
|
31
|
+
[]);
|
|
32
|
+
}
|
|
33
|
+
function year(item) {
|
|
34
|
+
const first = dateParts(item)[0];
|
|
35
|
+
return typeof first === "number" && Number.isFinite(first)
|
|
36
|
+
? first
|
|
37
|
+
: undefined;
|
|
38
|
+
}
|
|
39
|
+
function date(item) {
|
|
40
|
+
const parts = dateParts(item).filter((part) => typeof part === "number");
|
|
41
|
+
if (parts.length === 0)
|
|
42
|
+
return undefined;
|
|
43
|
+
return [
|
|
44
|
+
String(parts[0]).padStart(4, "0"),
|
|
45
|
+
String(parts[1] ?? 1).padStart(2, "0"),
|
|
46
|
+
String(parts[2] ?? 1).padStart(2, "0"),
|
|
47
|
+
].join("-");
|
|
48
|
+
}
|
|
49
|
+
function authors(value) {
|
|
50
|
+
if (!Array.isArray(value))
|
|
51
|
+
return undefined;
|
|
52
|
+
const out = value
|
|
53
|
+
.map((person) => str(person.name) ||
|
|
54
|
+
[person.given, person.family].map(str).filter(Boolean).join(" "))
|
|
55
|
+
.filter(Boolean);
|
|
56
|
+
return out.length > 0 ? out : undefined;
|
|
57
|
+
}
|
|
58
|
+
function bareDoi(value) {
|
|
59
|
+
return str(value)
|
|
60
|
+
.replace(/^doi:/i, "")
|
|
61
|
+
.replace(/^https?:\/\/(?:dx\.)?doi\.org\//i, "");
|
|
62
|
+
}
|
|
63
|
+
export function requireCrossrefDoi(value) {
|
|
64
|
+
const doi = bareDoi(value);
|
|
65
|
+
if (!/^10\.\S+\/\S+/.test(doi)) {
|
|
66
|
+
throw new Error(`crossref DOI "${String(value ?? "")}" is not recognised.`);
|
|
67
|
+
}
|
|
68
|
+
return doi;
|
|
69
|
+
}
|
|
70
|
+
function maybeMailto(params) {
|
|
71
|
+
const mailto = process.env.CROSSREF_MAILTO?.trim();
|
|
72
|
+
if (mailto)
|
|
73
|
+
params.set("mailto", mailto);
|
|
74
|
+
}
|
|
75
|
+
async function fetchCrossref(path, label) {
|
|
76
|
+
const response = await fetch(`${API}${path}`, {
|
|
77
|
+
headers: {
|
|
78
|
+
Accept: "application/json",
|
|
79
|
+
"User-Agent": "unicli-crossref/1.0 (https://github.com/olo-dot-io/Uni-CLI)",
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
if (response.status === 404)
|
|
83
|
+
throw new Error(`${label} returned no result.`);
|
|
84
|
+
if (response.status === 429)
|
|
85
|
+
throw new Error(`${label} returned HTTP 429.`);
|
|
86
|
+
if (!response.ok)
|
|
87
|
+
throw new Error(`${label} returned HTTP ${response.status}.`);
|
|
88
|
+
return response.json();
|
|
89
|
+
}
|
|
90
|
+
export function mapCrossrefItem(item, source) {
|
|
91
|
+
const doi = requireCrossrefDoi(item.DOI);
|
|
92
|
+
return {
|
|
93
|
+
id: doi,
|
|
94
|
+
title: arrFirst(item.title),
|
|
95
|
+
authors: authors(item.author),
|
|
96
|
+
year: year(item),
|
|
97
|
+
date: date(item),
|
|
98
|
+
venue: arrFirst(item["container-title"]) || undefined,
|
|
99
|
+
type: str(item.type) || undefined,
|
|
100
|
+
abstract: str(item.abstract).replace(/<[^>]+>/g, " ") || undefined,
|
|
101
|
+
doi,
|
|
102
|
+
cited_by_count: num(item["is-referenced-by-count"]),
|
|
103
|
+
references_count: Array.isArray(item.reference)
|
|
104
|
+
? item.reference.length
|
|
105
|
+
: undefined,
|
|
106
|
+
source_adapter: source,
|
|
107
|
+
source_url: str(item.URL) || `https://doi.org/${doi}`,
|
|
108
|
+
retrieved_at: new Date().toISOString(),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
cli({
|
|
112
|
+
site: "crossref",
|
|
113
|
+
name: "search",
|
|
114
|
+
description: "Search Crossref Works by title, author, DOI, or bibliographic text",
|
|
115
|
+
domain: "api.crossref.org",
|
|
116
|
+
strategy: Strategy.PUBLIC,
|
|
117
|
+
args: [
|
|
118
|
+
{ name: "query", type: "str", required: true, positional: true },
|
|
119
|
+
{ name: "limit", type: "int", default: 20 },
|
|
120
|
+
],
|
|
121
|
+
columns: ["id", "title", "authors", "year", "venue", "doi", "source_url"],
|
|
122
|
+
capabilities: ["http.fetch", "scholar.search"],
|
|
123
|
+
func: async (_page, kwargs) => {
|
|
124
|
+
const query = String(kwargs.query ?? "").trim();
|
|
125
|
+
if (!query)
|
|
126
|
+
throw new Error("crossref search query cannot be empty.");
|
|
127
|
+
const limit = Math.min(Math.max(Number(kwargs.limit ?? 20), 1), 100);
|
|
128
|
+
const params = new URLSearchParams({ query, rows: String(limit) });
|
|
129
|
+
maybeMailto(params);
|
|
130
|
+
const body = (await fetchCrossref(`/works?${params.toString()}`, "crossref search"));
|
|
131
|
+
const rows = (body.message?.items ?? []).map((item) => mapCrossrefItem(item, "crossref"));
|
|
132
|
+
if (rows.length === 0)
|
|
133
|
+
throw new Error(`No Crossref works matched "${query}".`);
|
|
134
|
+
return rows;
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
cli({
|
|
138
|
+
site: "crossref",
|
|
139
|
+
name: "work",
|
|
140
|
+
description: "Fetch one Crossref Work by DOI",
|
|
141
|
+
domain: "api.crossref.org",
|
|
142
|
+
strategy: Strategy.PUBLIC,
|
|
143
|
+
args: [{ name: "doi", type: "str", required: true, positional: true }],
|
|
144
|
+
columns: ["id", "title", "authors", "year", "venue", "doi", "source_url"],
|
|
145
|
+
capabilities: ["http.fetch", "scholar.get"],
|
|
146
|
+
func: async (_page, kwargs) => {
|
|
147
|
+
const doi = requireCrossrefDoi(kwargs.doi ?? kwargs.id ?? kwargs.ref);
|
|
148
|
+
const params = new URLSearchParams();
|
|
149
|
+
maybeMailto(params);
|
|
150
|
+
const suffix = params.size > 0 ? `?${params.toString()}` : "";
|
|
151
|
+
const body = (await fetchCrossref(`/works/${encodeURIComponent(doi)}${suffix}`, `crossref work ${doi}`));
|
|
152
|
+
if (!body.message)
|
|
153
|
+
throw new Error(`Crossref returned no work for ${doi}.`);
|
|
154
|
+
return [mapCrossrefItem(body.message, "crossref")];
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
//# sourceMappingURL=works.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"works.js","sourceRoot":"","sources":["../../../src/adapters/crossref/works.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::cvf::papers
|
|
3
|
+
* @does Registers CVF OpenAccess conference paper search for CVPR/ICCV/ECCV-style proceedings pages.
|
|
4
|
+
* @needs openaccess.thecvf.com static proceedings HTML, src/registry.ts
|
|
5
|
+
* @feeds src/commands/scholar.ts via scholar.search, scholar.pdf, and scholar.venue
|
|
6
|
+
* @breaks CVF markup drift surfaces as empty/parse errors rather than non-CVF fallbacks.
|
|
7
|
+
* @invariants Venue/year map to explicit CVF event pages; PDF URLs are absolutized against openaccess.thecvf.com.
|
|
8
|
+
* @side-effects HTTPS egress to openaccess.thecvf.com only
|
|
9
|
+
* @perf O(N) over one proceedings HTML page
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/scholar-sources.test.ts
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-19
|
|
14
|
+
*/
|
|
15
|
+
import type { ScholarlyWorkRecord } from "../../types/scholarly.js";
|
|
16
|
+
export declare function parseCvfRows(html: string, event?: string): ScholarlyWorkRecord[];
|
|
17
|
+
//# sourceMappingURL=papers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"papers.d.ts","sourceRoot":"","sources":["../../../src/adapters/cvf/papers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAgCpE,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,SAAa,GACjB,mBAAmB,EAAE,CAmCvB"}
|