@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,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::freepatentsonline-web::get
|
|
3
|
+
* @does Keyless single-publication detail fetch from FreePatentsOnline — parses the SSR detail page label/value blocks plus the disp_elm_name_kcode kind-code island so we can canonicalise the publication number even for bare-id US grants where the search-listing URL alone was ambiguous.
|
|
4
|
+
* @needs src/adapters/freepatentsonline-web/_shared.ts, src/engine/normalizer/patent-envelope.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.get)
|
|
6
|
+
* @breaks PATENT_NOT_FOUND when the detail page returns 200 but no Title is parseable; PATENT_INVALID_NUMBER for empty input; PATENT_API_DEPRECATED on non-2xx HTTP
|
|
7
|
+
* @invariants output is a single canonical PatentRecord whenever both the document-type label and kind code are present; otherwise emit PATENT_SCHEMA_DRIFT rather than canonicalise from an era heuristic
|
|
8
|
+
* @side-effects HTTPS egress to www.freepatentsonline.com only
|
|
9
|
+
* @perf single page fetch (~130 KB); regex parse linear in document length
|
|
10
|
+
* @concurrency safe — stateless
|
|
11
|
+
* @test verification proof in docs/skills/patent-cookbook.md
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification keyless-best-effort
|
|
15
|
+
*/
|
|
16
|
+
interface GetArgs {
|
|
17
|
+
publication_number?: unknown;
|
|
18
|
+
}
|
|
19
|
+
export declare function runFreePatentsOnlineGet(kwargs: GetArgs): Promise<unknown[]>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=get.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/adapters/freepatentsonline-web/get.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAeH,UAAU,OAAO;IACf,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,OAAO,EAAE,CAAC,CA8EpB"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::freepatentsonline-web::get
|
|
3
|
+
* @does Keyless single-publication detail fetch from FreePatentsOnline — parses the SSR detail page label/value blocks plus the disp_elm_name_kcode kind-code island so we can canonicalise the publication number even for bare-id US grants where the search-listing URL alone was ambiguous.
|
|
4
|
+
* @needs src/adapters/freepatentsonline-web/_shared.ts, src/engine/normalizer/patent-envelope.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.get)
|
|
6
|
+
* @breaks PATENT_NOT_FOUND when the detail page returns 200 but no Title is parseable; PATENT_INVALID_NUMBER for empty input; PATENT_API_DEPRECATED on non-2xx HTTP
|
|
7
|
+
* @invariants output is a single canonical PatentRecord whenever both the document-type label and kind code are present; otherwise emit PATENT_SCHEMA_DRIFT rather than canonicalise from an era heuristic
|
|
8
|
+
* @side-effects HTTPS egress to www.freepatentsonline.com only
|
|
9
|
+
* @perf single page fetch (~130 KB); regex parse linear in document length
|
|
10
|
+
* @concurrency safe — stateless
|
|
11
|
+
* @test verification proof in docs/skills/patent-cookbook.md
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification keyless-best-effort
|
|
15
|
+
*/
|
|
16
|
+
import { cli, Strategy } from "../../registry.js";
|
|
17
|
+
import { assemblePatentRecord } from "../../engine/normalizer/patent-envelope.js";
|
|
18
|
+
import { buildPatentEnvelope } from "../../engine/normalizer/patent-envelope.js";
|
|
19
|
+
import { FpoHttpError, buildFpoDetailUrl, fetchFpoHtml, parseFpoDetail, reconstructCanonicalPubNo, } from "./_shared.js";
|
|
20
|
+
const ADAPTER_PATH = "src/adapters/freepatentsonline-web/get.ts";
|
|
21
|
+
export async function runFreePatentsOnlineGet(kwargs) {
|
|
22
|
+
const raw = String(kwargs.publication_number ?? "").trim();
|
|
23
|
+
if (raw.length === 0) {
|
|
24
|
+
return [
|
|
25
|
+
{
|
|
26
|
+
envelope: buildPatentEnvelope({
|
|
27
|
+
code: "PATENT_INVALID_NUMBER",
|
|
28
|
+
adapter_path: ADAPTER_PATH,
|
|
29
|
+
step: "validate",
|
|
30
|
+
suggestion: "freepatentsonline-web get requires a publication_number",
|
|
31
|
+
}),
|
|
32
|
+
},
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
const url = buildFpoDetailUrl(raw);
|
|
36
|
+
let html;
|
|
37
|
+
try {
|
|
38
|
+
html = await fetchFpoHtml(url);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
if (err instanceof FpoHttpError) {
|
|
42
|
+
return [
|
|
43
|
+
{
|
|
44
|
+
envelope: buildPatentEnvelope({
|
|
45
|
+
code: err.status === 404 ? "PATENT_NOT_FOUND" : "PATENT_API_DEPRECATED",
|
|
46
|
+
adapter_path: ADAPTER_PATH,
|
|
47
|
+
step: "fetch",
|
|
48
|
+
suggestion: `FreePatentsOnline returned HTTP ${err.status} for ${err.url}`,
|
|
49
|
+
alternatives: ["google-patents-web", "espacenet"],
|
|
50
|
+
}),
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
const detail = parseFpoDetail(html);
|
|
57
|
+
if (!detail.title) {
|
|
58
|
+
return [
|
|
59
|
+
{
|
|
60
|
+
envelope: buildPatentEnvelope({
|
|
61
|
+
code: "PATENT_NOT_FOUND",
|
|
62
|
+
adapter_path: ADAPTER_PATH,
|
|
63
|
+
step: "select",
|
|
64
|
+
suggestion: `freepatentsonline-web detail page for "${raw}" yielded no Title field`,
|
|
65
|
+
alternatives: ["google-patents-web", "espacenet"],
|
|
66
|
+
}),
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
}
|
|
70
|
+
const canonical = reconstructCanonicalPubNo(detail.doc_type_label, detail.kind_code) ?? raw;
|
|
71
|
+
try {
|
|
72
|
+
return [
|
|
73
|
+
assemblePatentRecord({
|
|
74
|
+
publication_number: canonical,
|
|
75
|
+
application_number: detail.application_number || undefined,
|
|
76
|
+
title: detail.title,
|
|
77
|
+
abstract: detail.abstract,
|
|
78
|
+
assignees: detail.assignee ? [{ name: detail.assignee }] : undefined,
|
|
79
|
+
filing_date: detail.filing_date,
|
|
80
|
+
publication_date: detail.publication_date,
|
|
81
|
+
source_adapter: "freepatentsonline-web",
|
|
82
|
+
source_url: url,
|
|
83
|
+
}),
|
|
84
|
+
];
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return [
|
|
88
|
+
{
|
|
89
|
+
envelope: buildPatentEnvelope({
|
|
90
|
+
code: "PATENT_SCHEMA_DRIFT",
|
|
91
|
+
adapter_path: ADAPTER_PATH,
|
|
92
|
+
step: "normalize",
|
|
93
|
+
suggestion: `freepatentsonline-web detail page for "${raw}" did not yield a canonicalisable publication_number (doc_type=${detail.doc_type_label}; kind_code=${detail.kind_code})`,
|
|
94
|
+
alternatives: ["google-patents-web", "espacenet"],
|
|
95
|
+
}),
|
|
96
|
+
},
|
|
97
|
+
];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
cli({
|
|
101
|
+
site: "freepatentsonline-web",
|
|
102
|
+
name: "get",
|
|
103
|
+
description: "Retrieve a single FreePatentsOnline bibliographic record (keyless, no Chrome)",
|
|
104
|
+
domain: "www.freepatentsonline.com",
|
|
105
|
+
strategy: Strategy.PUBLIC,
|
|
106
|
+
adapter_path: ADAPTER_PATH,
|
|
107
|
+
args: [
|
|
108
|
+
{
|
|
109
|
+
name: "publication_number",
|
|
110
|
+
type: "str",
|
|
111
|
+
required: true,
|
|
112
|
+
positional: true,
|
|
113
|
+
description: "ST.16 publication number, compact or segmented (e.g. US20240220787 or EP3716153A1)",
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
columns: [
|
|
117
|
+
"publication_number",
|
|
118
|
+
"title",
|
|
119
|
+
"publication_date",
|
|
120
|
+
"assignees",
|
|
121
|
+
"source_url",
|
|
122
|
+
],
|
|
123
|
+
capabilities: ["http.fetch", "patent.get"],
|
|
124
|
+
minimum_capability: "http.fetch",
|
|
125
|
+
func: async (_page, kwargs) => runFreePatentsOnlineGet(kwargs),
|
|
126
|
+
});
|
|
127
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/adapters/freepatentsonline-web/get.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACjF,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AAEtB,MAAM,YAAY,GAAG,2CAA2C,CAAC;AAMjE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAe;IAEf,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO;YACL;gBACE,QAAQ,EAAE,mBAAmB,CAAC;oBAC5B,IAAI,EAAE,uBAAuB;oBAC7B,YAAY,EAAE,YAAY;oBAC1B,IAAI,EAAE,UAAU;oBAChB,UAAU,EAAE,yDAAyD;iBACtE,CAAC;aACH;SACF,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,YAAY,EAAE,CAAC;YAChC,OAAO;gBACL;oBACE,QAAQ,EAAE,mBAAmB,CAAC;wBAC5B,IAAI,EACF,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,uBAAuB;wBACnE,YAAY,EAAE,YAAY;wBAC1B,IAAI,EAAE,OAAO;wBACb,UAAU,EAAE,mCAAmC,GAAG,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE;wBAC1E,YAAY,EAAE,CAAC,oBAAoB,EAAE,WAAW,CAAC;qBAClD,CAAC;iBACH;aACF,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO;YACL;gBACE,QAAQ,EAAE,mBAAmB,CAAC;oBAC5B,IAAI,EAAE,kBAAkB;oBACxB,YAAY,EAAE,YAAY;oBAC1B,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,0CAA0C,GAAG,0BAA0B;oBACnF,YAAY,EAAE,CAAC,oBAAoB,EAAE,WAAW,CAAC;iBAClD,CAAC;aACH;SACF,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GACb,yBAAyB,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC;IAC5E,IAAI,CAAC;QACH,OAAO;YACL,oBAAoB,CAAC;gBACnB,kBAAkB,EAAE,SAAS;gBAC7B,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,IAAI,SAAS;gBAC1D,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;gBACpE,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;gBACzC,cAAc,EAAE,uBAAuB;gBACvC,UAAU,EAAE,GAAG;aAC8B,CAAC;SACjD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL;gBACE,QAAQ,EAAE,mBAAmB,CAAC;oBAC5B,IAAI,EAAE,qBAAqB;oBAC3B,YAAY,EAAE,YAAY;oBAC1B,IAAI,EAAE,WAAW;oBACjB,UAAU,EAAE,0CAA0C,GAAG,kEAAkE,MAAM,CAAC,cAAc,eAAe,MAAM,CAAC,SAAS,GAAG;oBAClL,YAAY,EAAE,CAAC,oBAAoB,EAAE,WAAW,CAAC;iBAClD,CAAC;aACH;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,GAAG,CAAC;IACF,IAAI,EAAE,uBAAuB;IAC7B,IAAI,EAAE,KAAK;IACX,WAAW,EACT,+EAA+E;IACjF,MAAM,EAAE,2BAA2B;IACnC,QAAQ,EAAE,QAAQ,CAAC,MAAM;IACzB,YAAY,EAAE,YAAY;IAC1B,IAAI,EAAE;QACJ;YACE,IAAI,EAAE,oBAAoB;YAC1B,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,WAAW,EACT,oFAAoF;SACvF;KACF;IACD,OAAO,EAAE;QACP,oBAAoB;QACpB,OAAO;QACP,kBAAkB;QAClB,WAAW;QACX,YAAY;KACb;IACD,YAAY,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;IAC1C,kBAAkB,EAAE,YAAY;IAChC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,uBAAuB,CAAC,MAAiB,CAAC;CAC1E,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::freepatentsonline-web::search
|
|
3
|
+
* @does Keyless patent search via www.freepatentsonline.com's SSR `result.html` listing — older site, still maintained, no JS gate, no auth. Complements google-patents-web as a second day-zero source.
|
|
4
|
+
* @needs src/adapters/freepatentsonline-web/_shared.ts, src/engine/normalizer/patent-envelope.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.search)
|
|
6
|
+
* @breaks PATENT_API_DEPRECATED on non-2xx HTTP; PATENT_NOT_FOUND on empty listing; PATENT_SCHEMA_DRIFT when the listing_table selector no longer matches
|
|
7
|
+
* @invariants output rows are canonical PatentRecord; publication_number is decoded from the FPO link path (URL-encoded structural signal) — rows whose link does not encode a kind code are dropped, never fabricated
|
|
8
|
+
* @side-effects HTTPS egress to www.freepatentsonline.com only
|
|
9
|
+
* @perf single page fetch (~50 KB); FPO returns 50 results per page
|
|
10
|
+
* @concurrency safe — stateless
|
|
11
|
+
* @test verification proof in docs/skills/patent-cookbook.md
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification keyless-best-effort
|
|
15
|
+
*/
|
|
16
|
+
interface SearchArgs {
|
|
17
|
+
query?: unknown;
|
|
18
|
+
limit?: unknown;
|
|
19
|
+
}
|
|
20
|
+
export declare function runFreePatentsOnlineSearch(kwargs: SearchArgs): Promise<unknown[]>;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/adapters/freepatentsonline-web/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAcH,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAQD,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,OAAO,EAAE,CAAC,CAkGpB"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::freepatentsonline-web::search
|
|
3
|
+
* @does Keyless patent search via www.freepatentsonline.com's SSR `result.html` listing — older site, still maintained, no JS gate, no auth. Complements google-patents-web as a second day-zero source.
|
|
4
|
+
* @needs src/adapters/freepatentsonline-web/_shared.ts, src/engine/normalizer/patent-envelope.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.search)
|
|
6
|
+
* @breaks PATENT_API_DEPRECATED on non-2xx HTTP; PATENT_NOT_FOUND on empty listing; PATENT_SCHEMA_DRIFT when the listing_table selector no longer matches
|
|
7
|
+
* @invariants output rows are canonical PatentRecord; publication_number is decoded from the FPO link path (URL-encoded structural signal) — rows whose link does not encode a kind code are dropped, never fabricated
|
|
8
|
+
* @side-effects HTTPS egress to www.freepatentsonline.com only
|
|
9
|
+
* @perf single page fetch (~50 KB); FPO returns 50 results per page
|
|
10
|
+
* @concurrency safe — stateless
|
|
11
|
+
* @test verification proof in docs/skills/patent-cookbook.md
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification keyless-best-effort
|
|
15
|
+
*/
|
|
16
|
+
import { cli, Strategy } from "../../registry.js";
|
|
17
|
+
import { assemblePatentRecord } from "../../engine/normalizer/patent-envelope.js";
|
|
18
|
+
import { buildPatentEnvelope } from "../../engine/normalizer/patent-envelope.js";
|
|
19
|
+
import { FpoHttpError, buildFpoSearchUrl, fetchFpoHtml, parseFpoListing, } from "./_shared.js";
|
|
20
|
+
const ADAPTER_PATH = "src/adapters/freepatentsonline-web/search.ts";
|
|
21
|
+
function clampLimit(raw) {
|
|
22
|
+
const num = typeof raw === "number" ? raw : Number(raw);
|
|
23
|
+
if (!Number.isFinite(num) || num <= 0)
|
|
24
|
+
return 25;
|
|
25
|
+
return Math.min(50, Math.max(1, Math.floor(num)));
|
|
26
|
+
}
|
|
27
|
+
export async function runFreePatentsOnlineSearch(kwargs) {
|
|
28
|
+
const query = String(kwargs.query ?? "").trim();
|
|
29
|
+
if (query.length === 0) {
|
|
30
|
+
return [
|
|
31
|
+
{
|
|
32
|
+
envelope: buildPatentEnvelope({
|
|
33
|
+
code: "PATENT_UNSUPPORTED_QUERY",
|
|
34
|
+
adapter_path: ADAPTER_PATH,
|
|
35
|
+
step: "validate",
|
|
36
|
+
suggestion: "freepatentsonline-web search requires a non-empty query",
|
|
37
|
+
alternatives: ["google-patents-web"],
|
|
38
|
+
}),
|
|
39
|
+
},
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
const limit = clampLimit(kwargs.limit);
|
|
43
|
+
const url = buildFpoSearchUrl(query, 1);
|
|
44
|
+
let html;
|
|
45
|
+
try {
|
|
46
|
+
html = await fetchFpoHtml(url);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
if (err instanceof FpoHttpError) {
|
|
50
|
+
return [
|
|
51
|
+
{
|
|
52
|
+
envelope: buildPatentEnvelope({
|
|
53
|
+
code: err.status === 429
|
|
54
|
+
? "PATENT_RATE_LIMIT"
|
|
55
|
+
: "PATENT_API_DEPRECATED",
|
|
56
|
+
adapter_path: ADAPTER_PATH,
|
|
57
|
+
step: "fetch",
|
|
58
|
+
suggestion: `FreePatentsOnline returned HTTP ${err.status} for ${err.url}; retry with --sources google-patents-web`,
|
|
59
|
+
alternatives: ["google-patents-web", "espacenet"],
|
|
60
|
+
retryable: err.status === 429,
|
|
61
|
+
}),
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
throw err;
|
|
66
|
+
}
|
|
67
|
+
const rows = parseFpoListing(html);
|
|
68
|
+
if (rows.length === 0) {
|
|
69
|
+
return [
|
|
70
|
+
{
|
|
71
|
+
envelope: buildPatentEnvelope({
|
|
72
|
+
code: html.includes('class="listing_table"')
|
|
73
|
+
? "PATENT_NOT_FOUND"
|
|
74
|
+
: "PATENT_SCHEMA_DRIFT",
|
|
75
|
+
adapter_path: ADAPTER_PATH,
|
|
76
|
+
step: "select",
|
|
77
|
+
suggestion: html.includes('class="listing_table"')
|
|
78
|
+
? `freepatentsonline-web returned no listing rows for "${query}"`
|
|
79
|
+
: "freepatentsonline-web no longer ships listing_table — the parseFpoListing extractor needs updating",
|
|
80
|
+
alternatives: ["google-patents-web", "espacenet"],
|
|
81
|
+
}),
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
const out = [];
|
|
86
|
+
for (const row of rows.slice(0, limit)) {
|
|
87
|
+
const canonical = row.publication_number_canonical;
|
|
88
|
+
if (!canonical) {
|
|
89
|
+
// Row's link path did not encode a kind code (e.g. bare US grant
|
|
90
|
+
// number). Skip rather than fabricate.
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
out.push(assemblePatentRecord({
|
|
95
|
+
publication_number: canonical,
|
|
96
|
+
title: row.title || undefined,
|
|
97
|
+
abstract: row.abstract || undefined,
|
|
98
|
+
source_adapter: "freepatentsonline-web",
|
|
99
|
+
source_url: row.detail_url,
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Defensive: skip rows that fail canonicalisation rather than
|
|
104
|
+
// synthesise.
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (out.length === 0) {
|
|
108
|
+
return [
|
|
109
|
+
{
|
|
110
|
+
envelope: buildPatentEnvelope({
|
|
111
|
+
code: "PATENT_NOT_FOUND",
|
|
112
|
+
adapter_path: ADAPTER_PATH,
|
|
113
|
+
step: "normalize",
|
|
114
|
+
suggestion: `freepatentsonline-web returned ${rows.length} listing rows but none had a structurally decodable kind code; run \`unicli freepatentsonline-web get <pub_no>\` against an individual hit to retrieve its kind code from the detail page`,
|
|
115
|
+
alternatives: ["google-patents-web", "espacenet"],
|
|
116
|
+
}),
|
|
117
|
+
},
|
|
118
|
+
];
|
|
119
|
+
}
|
|
120
|
+
return out;
|
|
121
|
+
}
|
|
122
|
+
cli({
|
|
123
|
+
site: "freepatentsonline-web",
|
|
124
|
+
name: "search",
|
|
125
|
+
description: "Keyless FreePatentsOnline search via the public SSR listing (no API key, no Chrome)",
|
|
126
|
+
domain: "www.freepatentsonline.com",
|
|
127
|
+
strategy: Strategy.PUBLIC,
|
|
128
|
+
adapter_path: ADAPTER_PATH,
|
|
129
|
+
args: [
|
|
130
|
+
{
|
|
131
|
+
name: "query",
|
|
132
|
+
type: "str",
|
|
133
|
+
required: true,
|
|
134
|
+
positional: true,
|
|
135
|
+
description: "Free-text query (FreePatentsOnline xprtsrch syntax)",
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
name: "limit",
|
|
139
|
+
type: "int",
|
|
140
|
+
default: 25,
|
|
141
|
+
description: "Max results to return (1-50, FPO paginates at 50)",
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
columns: ["publication_number", "title", "abstract", "source_url"],
|
|
145
|
+
capabilities: ["http.fetch", "patent.search"],
|
|
146
|
+
minimum_capability: "http.fetch",
|
|
147
|
+
func: async (_page, kwargs) => runFreePatentsOnlineSearch(kwargs),
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/adapters/freepatentsonline-web/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::google-patents-web::_shared
|
|
3
|
+
* @does Shared HTTP helpers and types for the KEYLESS Google Patents web adapter — distinct from the BigQuery-backed google-patents-bq adapter (which requires a billed GCP project). This adapter uses the public XHR endpoint that drives patents.google.com and the SSR /patent/<id>/en bibliography page, both of which are reachable with only a real-browser User-Agent header.
|
|
4
|
+
* @needs src/engine/normalizer/patent-envelope.ts, src/types/patent.ts, node:fetch (global)
|
|
5
|
+
* @feeds src/adapters/google-patents-web/search.yaml, src/adapters/google-patents-web/get.ts
|
|
6
|
+
* @breaks throws GooglePatentsHttpError when the endpoint returns non-2xx or unparseable JSON; callers surface PATENT_API_DEPRECATED to the meta-command
|
|
7
|
+
* @invariants every outbound request carries a real-browser User-Agent — Google rejects bare `node-fetch`/`python-requests`; the @keyless-best-effort verification tag is emitted in adapter file headers
|
|
8
|
+
* @side-effects HTTPS egress to patents.google.com only; no env reads, no cookies
|
|
9
|
+
* @perf single request per call; XHR responses are ~40-100 KB
|
|
10
|
+
* @concurrency safe — pure functions plus stateless `fetch`
|
|
11
|
+
* @test covered transitively via tests/unit/adapters/google-patents-web/*.test.ts (none yet — adapters ship with live verification proof in docs/skills/patent-cookbook.md)
|
|
12
|
+
* @stability experimental — Google does not publish a stability contract for this XHR
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification keyless-best-effort
|
|
15
|
+
*/
|
|
16
|
+
import type { PatentRecord } from "../../types/patent.js";
|
|
17
|
+
/**
|
|
18
|
+
* Local verification-status alias for the keyless-web adapter family.
|
|
19
|
+
*
|
|
20
|
+
* Distinct from the canonical `PatentVerificationStatus` union in
|
|
21
|
+
* `src/types/patent.ts` — adding a new variant there is owned by another
|
|
22
|
+
* agent in this batch, so we expose it as a *local* string-literal type
|
|
23
|
+
* alias the file headers can advertise without forcing a cross-cutting
|
|
24
|
+
* type change. The meta-command does not branch on this value; it is
|
|
25
|
+
* documentation-grade only.
|
|
26
|
+
*/
|
|
27
|
+
export type KeylessBestEffortStatus = "keyless-best-effort";
|
|
28
|
+
export declare const KEYLESS_BEST_EFFORT: KeylessBestEffortStatus;
|
|
29
|
+
/**
|
|
30
|
+
* Real-browser User-Agent string. Google's XHR endpoint returns 403 for the
|
|
31
|
+
* default `node/undici` UA; a Chrome string fixes that. Mirror the version
|
|
32
|
+
* Chrome currently ships rather than freezing on an old number so the header
|
|
33
|
+
* stays plausible if Google starts UA-version-gating in future.
|
|
34
|
+
*/
|
|
35
|
+
export declare const GOOGLE_PATENTS_UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36";
|
|
36
|
+
export declare class GooglePatentsHttpError extends Error {
|
|
37
|
+
readonly status: number;
|
|
38
|
+
readonly url: string;
|
|
39
|
+
constructor(status: number, url: string, message: string);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* GET <url> with a real-browser UA. Returns parsed JSON; throws
|
|
43
|
+
* GooglePatentsHttpError on non-2xx or JSON parse failure.
|
|
44
|
+
*/
|
|
45
|
+
export declare function fetchGooglePatentsJson<T>(url: string): Promise<T>;
|
|
46
|
+
/**
|
|
47
|
+
* GET <url> with a real-browser UA, return raw HTML text. Throws
|
|
48
|
+
* GooglePatentsHttpError on non-2xx.
|
|
49
|
+
*/
|
|
50
|
+
export declare function fetchGooglePatentsHtml(url: string): Promise<string>;
|
|
51
|
+
/**
|
|
52
|
+
* Build the public XHR query URL. Accepts a plain free-text query string and
|
|
53
|
+
* an optional limit (`num` parameter) and earliest-publication-year filter.
|
|
54
|
+
*
|
|
55
|
+
* The XHR endpoint expects a percent-encoded *inner* query string under the
|
|
56
|
+
* `url` parameter — the outer query is `?url=q%3Dfoo&exp=`. We percent-encode
|
|
57
|
+
* the inner once.
|
|
58
|
+
*/
|
|
59
|
+
export declare function buildGooglePatentsXhrUrl(query: string, limit?: number, sinceYear?: string): string;
|
|
60
|
+
/**
|
|
61
|
+
* Build the public detail page URL for a given publication number. Google
|
|
62
|
+
* accepts the segmented form `US-11741188-B2` and the compact form
|
|
63
|
+
* `US11741188B2`; we send the compact form to keep the URL short.
|
|
64
|
+
*/
|
|
65
|
+
export declare function buildGooglePatentsDetailUrl(pubNo: string): string;
|
|
66
|
+
/**
|
|
67
|
+
* XHR response shape. We intentionally type only the fields we read —
|
|
68
|
+
* Google ships many more (figure thumbnails, family metadata, language) that
|
|
69
|
+
* we either ignore or carry through verbatim in `raw`.
|
|
70
|
+
*/
|
|
71
|
+
export interface GoogleXhrResultRow {
|
|
72
|
+
id: string;
|
|
73
|
+
rank?: number;
|
|
74
|
+
patent?: {
|
|
75
|
+
title?: string;
|
|
76
|
+
snippet?: string;
|
|
77
|
+
publication_number?: string;
|
|
78
|
+
inventor?: string;
|
|
79
|
+
assignee?: string;
|
|
80
|
+
filing_date?: string;
|
|
81
|
+
publication_date?: string;
|
|
82
|
+
grant_date?: string;
|
|
83
|
+
priority_date?: string;
|
|
84
|
+
language?: string;
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export interface GoogleXhrResponse {
|
|
88
|
+
results?: {
|
|
89
|
+
cluster?: Array<{
|
|
90
|
+
result?: GoogleXhrResultRow[];
|
|
91
|
+
}>;
|
|
92
|
+
total_num_results?: number;
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Flatten the nested `results.cluster[].result[]` into a single array, in
|
|
97
|
+
* server-supplied order.
|
|
98
|
+
*/
|
|
99
|
+
export declare function flattenGoogleXhrResults(body: GoogleXhrResponse): GoogleXhrResultRow[];
|
|
100
|
+
/**
|
|
101
|
+
* Project a single XHR row to the upstream-facing partial-PatentRecord
|
|
102
|
+
* shape. Empty / missing fields are left undefined rather than synthesised.
|
|
103
|
+
* Snippets contain HTML markup (e.g. `<b>` tags) which we strip.
|
|
104
|
+
*/
|
|
105
|
+
export declare function projectGoogleRowToRecord(row: GoogleXhrResultRow, sourceUrl: string): Partial<PatentRecord> & {
|
|
106
|
+
publication_number: string;
|
|
107
|
+
source_adapter: string;
|
|
108
|
+
};
|
|
109
|
+
export declare function stripHtml(input: string): string;
|
|
110
|
+
//# sourceMappingURL=_shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../../src/adapters/google-patents-web/_shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;;;;;;;GASG;AACH,MAAM,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AAC5D,eAAO,MAAM,mBAAmB,EAAE,uBACX,CAAC;AAExB;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,0HAC2F,CAAC;AAE1H,qBAAa,sBAAuB,SAAQ,KAAK;aAE7B,MAAM,EAAE,MAAM;aACd,GAAG,EAAE,MAAM;gBADX,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EAC3B,OAAO,EAAE,MAAM;CAKlB;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CA0BvE;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBzE;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAUR;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGjE;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,KAAK,CAAC;YAAE,MAAM,CAAC,EAAE,kBAAkB,EAAE,CAAA;SAAE,CAAC,CAAC;QACnD,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,iBAAiB,GACtB,kBAAkB,EAAE,CAQtB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,kBAAkB,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC,GAAG;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB,CAoBA;AAmBD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM/C"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::google-patents-web::_shared
|
|
3
|
+
* @does Shared HTTP helpers and types for the KEYLESS Google Patents web adapter — distinct from the BigQuery-backed google-patents-bq adapter (which requires a billed GCP project). This adapter uses the public XHR endpoint that drives patents.google.com and the SSR /patent/<id>/en bibliography page, both of which are reachable with only a real-browser User-Agent header.
|
|
4
|
+
* @needs src/engine/normalizer/patent-envelope.ts, src/types/patent.ts, node:fetch (global)
|
|
5
|
+
* @feeds src/adapters/google-patents-web/search.yaml, src/adapters/google-patents-web/get.ts
|
|
6
|
+
* @breaks throws GooglePatentsHttpError when the endpoint returns non-2xx or unparseable JSON; callers surface PATENT_API_DEPRECATED to the meta-command
|
|
7
|
+
* @invariants every outbound request carries a real-browser User-Agent — Google rejects bare `node-fetch`/`python-requests`; the @keyless-best-effort verification tag is emitted in adapter file headers
|
|
8
|
+
* @side-effects HTTPS egress to patents.google.com only; no env reads, no cookies
|
|
9
|
+
* @perf single request per call; XHR responses are ~40-100 KB
|
|
10
|
+
* @concurrency safe — pure functions plus stateless `fetch`
|
|
11
|
+
* @test covered transitively via tests/unit/adapters/google-patents-web/*.test.ts (none yet — adapters ship with live verification proof in docs/skills/patent-cookbook.md)
|
|
12
|
+
* @stability experimental — Google does not publish a stability contract for this XHR
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification keyless-best-effort
|
|
15
|
+
*/
|
|
16
|
+
export const KEYLESS_BEST_EFFORT = "keyless-best-effort";
|
|
17
|
+
/**
|
|
18
|
+
* Real-browser User-Agent string. Google's XHR endpoint returns 403 for the
|
|
19
|
+
* default `node/undici` UA; a Chrome string fixes that. Mirror the version
|
|
20
|
+
* Chrome currently ships rather than freezing on an old number so the header
|
|
21
|
+
* stays plausible if Google starts UA-version-gating in future.
|
|
22
|
+
*/
|
|
23
|
+
export const GOOGLE_PATENTS_UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36";
|
|
24
|
+
export class GooglePatentsHttpError extends Error {
|
|
25
|
+
status;
|
|
26
|
+
url;
|
|
27
|
+
constructor(status, url, message) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.status = status;
|
|
30
|
+
this.url = url;
|
|
31
|
+
this.name = "GooglePatentsHttpError";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* GET <url> with a real-browser UA. Returns parsed JSON; throws
|
|
36
|
+
* GooglePatentsHttpError on non-2xx or JSON parse failure.
|
|
37
|
+
*/
|
|
38
|
+
export async function fetchGooglePatentsJson(url) {
|
|
39
|
+
const response = await fetch(url, {
|
|
40
|
+
method: "GET",
|
|
41
|
+
headers: {
|
|
42
|
+
"User-Agent": GOOGLE_PATENTS_UA,
|
|
43
|
+
Accept: "application/json",
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
throw new GooglePatentsHttpError(response.status, url, `Google Patents XHR returned HTTP ${response.status}`);
|
|
48
|
+
}
|
|
49
|
+
let parsed;
|
|
50
|
+
try {
|
|
51
|
+
parsed = await response.json();
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
throw new GooglePatentsHttpError(response.status, url, `Google Patents XHR returned non-JSON body: ${err.message}`);
|
|
55
|
+
}
|
|
56
|
+
return parsed;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* GET <url> with a real-browser UA, return raw HTML text. Throws
|
|
60
|
+
* GooglePatentsHttpError on non-2xx.
|
|
61
|
+
*/
|
|
62
|
+
export async function fetchGooglePatentsHtml(url) {
|
|
63
|
+
const response = await fetch(url, {
|
|
64
|
+
method: "GET",
|
|
65
|
+
headers: {
|
|
66
|
+
"User-Agent": GOOGLE_PATENTS_UA,
|
|
67
|
+
Accept: "text/html,application/xhtml+xml",
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
if (!response.ok) {
|
|
71
|
+
throw new GooglePatentsHttpError(response.status, url, `Google Patents detail page returned HTTP ${response.status}`);
|
|
72
|
+
}
|
|
73
|
+
return await response.text();
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Build the public XHR query URL. Accepts a plain free-text query string and
|
|
77
|
+
* an optional limit (`num` parameter) and earliest-publication-year filter.
|
|
78
|
+
*
|
|
79
|
+
* The XHR endpoint expects a percent-encoded *inner* query string under the
|
|
80
|
+
* `url` parameter — the outer query is `?url=q%3Dfoo&exp=`. We percent-encode
|
|
81
|
+
* the inner once.
|
|
82
|
+
*/
|
|
83
|
+
export function buildGooglePatentsXhrUrl(query, limit, sinceYear) {
|
|
84
|
+
const cleaned = query.trim();
|
|
85
|
+
let inner = `q=${cleaned.replace(/\s+/g, "+")}`;
|
|
86
|
+
if (typeof limit === "number" && Number.isFinite(limit) && limit > 0) {
|
|
87
|
+
inner += `&num=${Math.min(100, Math.max(1, Math.floor(limit)))}`;
|
|
88
|
+
}
|
|
89
|
+
if (sinceYear && /^\d{4}$/.test(sinceYear)) {
|
|
90
|
+
inner += `&after=publication:${sinceYear}0101`;
|
|
91
|
+
}
|
|
92
|
+
return `https://patents.google.com/xhr/query?url=${encodeURIComponent(inner)}&exp=`;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Build the public detail page URL for a given publication number. Google
|
|
96
|
+
* accepts the segmented form `US-11741188-B2` and the compact form
|
|
97
|
+
* `US11741188B2`; we send the compact form to keep the URL short.
|
|
98
|
+
*/
|
|
99
|
+
export function buildGooglePatentsDetailUrl(pubNo) {
|
|
100
|
+
const compact = pubNo.replace(/-/g, "").toUpperCase();
|
|
101
|
+
return `https://patents.google.com/patent/${encodeURIComponent(compact)}/en`;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Flatten the nested `results.cluster[].result[]` into a single array, in
|
|
105
|
+
* server-supplied order.
|
|
106
|
+
*/
|
|
107
|
+
export function flattenGoogleXhrResults(body) {
|
|
108
|
+
const clusters = body.results?.cluster ?? [];
|
|
109
|
+
const out = [];
|
|
110
|
+
for (const cluster of clusters) {
|
|
111
|
+
const rows = cluster.result ?? [];
|
|
112
|
+
for (const row of rows)
|
|
113
|
+
out.push(row);
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Project a single XHR row to the upstream-facing partial-PatentRecord
|
|
119
|
+
* shape. Empty / missing fields are left undefined rather than synthesised.
|
|
120
|
+
* Snippets contain HTML markup (e.g. `<b>` tags) which we strip.
|
|
121
|
+
*/
|
|
122
|
+
export function projectGoogleRowToRecord(row, sourceUrl) {
|
|
123
|
+
const patent = row.patent ?? {};
|
|
124
|
+
const pubNo = (typeof patent.publication_number === "string" &&
|
|
125
|
+
patent.publication_number) ||
|
|
126
|
+
deriveCanonicalFromId(row.id);
|
|
127
|
+
const cleanSnippet = patent.snippet ? stripHtml(patent.snippet) : undefined;
|
|
128
|
+
return {
|
|
129
|
+
publication_number: pubNo,
|
|
130
|
+
title: patent.title ? patent.title.trim() : undefined,
|
|
131
|
+
abstract: cleanSnippet,
|
|
132
|
+
inventors: patent.inventor ? [{ name: patent.inventor.trim() }] : undefined,
|
|
133
|
+
assignees: patent.assignee ? [{ name: patent.assignee.trim() }] : undefined,
|
|
134
|
+
filing_date: patent.filing_date || undefined,
|
|
135
|
+
publication_date: patent.publication_date || undefined,
|
|
136
|
+
grant_date: patent.grant_date || undefined,
|
|
137
|
+
priority_date: patent.priority_date || undefined,
|
|
138
|
+
source_adapter: "google-patents-web",
|
|
139
|
+
source_url: sourceUrl,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/** `patent/US11741188B2/en` → `US11741188B2`. */
|
|
143
|
+
function deriveCanonicalFromId(id) {
|
|
144
|
+
const match = /patent\/([^/]+)/.exec(id);
|
|
145
|
+
return match ? match[1] : id;
|
|
146
|
+
}
|
|
147
|
+
const TAG_RE = /<[^>]+>/g;
|
|
148
|
+
const ENTITY_MAP = {
|
|
149
|
+
"&": "&",
|
|
150
|
+
"<": "<",
|
|
151
|
+
">": ">",
|
|
152
|
+
""": '"',
|
|
153
|
+
"'": "'",
|
|
154
|
+
"…": "…",
|
|
155
|
+
" ": " ",
|
|
156
|
+
};
|
|
157
|
+
export function stripHtml(input) {
|
|
158
|
+
return input
|
|
159
|
+
.replace(TAG_RE, "")
|
|
160
|
+
.replace(/&(?:amp|lt|gt|quot|#39|hellip|nbsp);/g, (m) => ENTITY_MAP[m] ?? m)
|
|
161
|
+
.replace(/\s+/g, " ")
|
|
162
|
+
.trim();
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=_shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_shared.js","sourceRoot":"","sources":["../../../src/adapters/google-patents-web/_shared.ts"],"names":[],"mappings":"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"}
|