@zenalexa/unicli 0.220.1 → 0.221.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +28 -6
- package/README.md +8 -8
- package/README.zh-CN.md +8 -8
- 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/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/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/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/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/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 +6 -0
- 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/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/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/loader.d.ts.map +1 -1
- package/dist/discovery/loader.js +4 -0
- package/dist/discovery/loader.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/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 +3 -3
- package/dist/manifest-search.json +1 -1
- package/dist/manifest.json +2239 -176
- 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 +18 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +5 -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.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/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/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/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/patsnap/get.yaml +65 -0
- package/src/adapters/patsnap/search.yaml +77 -0
- package/src/adapters/pqai/prior-art.yaml +59 -0
- package/src/adapters/pqai/search.yaml +60 -0
- package/src/adapters/reddit/comments-tree.test.ts +79 -0
- package/src/adapters/reddit/comments.ts +159 -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/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
|
@@ -0,0 +1,144 @@
|
|
|
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
|
+
|
|
17
|
+
import { cli, Strategy } from "../../registry.js";
|
|
18
|
+
import { assemblePatentRecord } from "../../engine/normalizer/patent-envelope.js";
|
|
19
|
+
import { buildPatentEnvelope } from "../../engine/normalizer/patent-envelope.js";
|
|
20
|
+
import {
|
|
21
|
+
FpoHttpError,
|
|
22
|
+
buildFpoDetailUrl,
|
|
23
|
+
fetchFpoHtml,
|
|
24
|
+
parseFpoDetail,
|
|
25
|
+
reconstructCanonicalPubNo,
|
|
26
|
+
} from "./_shared.js";
|
|
27
|
+
|
|
28
|
+
const ADAPTER_PATH = "src/adapters/freepatentsonline-web/get.ts";
|
|
29
|
+
|
|
30
|
+
interface GetArgs {
|
|
31
|
+
publication_number?: unknown;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export async function runFreePatentsOnlineGet(
|
|
35
|
+
kwargs: GetArgs,
|
|
36
|
+
): Promise<unknown[]> {
|
|
37
|
+
const raw = String(kwargs.publication_number ?? "").trim();
|
|
38
|
+
if (raw.length === 0) {
|
|
39
|
+
return [
|
|
40
|
+
{
|
|
41
|
+
envelope: buildPatentEnvelope({
|
|
42
|
+
code: "PATENT_INVALID_NUMBER",
|
|
43
|
+
adapter_path: ADAPTER_PATH,
|
|
44
|
+
step: "validate",
|
|
45
|
+
suggestion: "freepatentsonline-web get requires a publication_number",
|
|
46
|
+
}),
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
}
|
|
50
|
+
const url = buildFpoDetailUrl(raw);
|
|
51
|
+
let html: string;
|
|
52
|
+
try {
|
|
53
|
+
html = await fetchFpoHtml(url);
|
|
54
|
+
} catch (err) {
|
|
55
|
+
if (err instanceof FpoHttpError) {
|
|
56
|
+
return [
|
|
57
|
+
{
|
|
58
|
+
envelope: buildPatentEnvelope({
|
|
59
|
+
code:
|
|
60
|
+
err.status === 404 ? "PATENT_NOT_FOUND" : "PATENT_API_DEPRECATED",
|
|
61
|
+
adapter_path: ADAPTER_PATH,
|
|
62
|
+
step: "fetch",
|
|
63
|
+
suggestion: `FreePatentsOnline returned HTTP ${err.status} for ${err.url}`,
|
|
64
|
+
alternatives: ["google-patents-web", "espacenet"],
|
|
65
|
+
}),
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
}
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
const detail = parseFpoDetail(html);
|
|
72
|
+
if (!detail.title) {
|
|
73
|
+
return [
|
|
74
|
+
{
|
|
75
|
+
envelope: buildPatentEnvelope({
|
|
76
|
+
code: "PATENT_NOT_FOUND",
|
|
77
|
+
adapter_path: ADAPTER_PATH,
|
|
78
|
+
step: "select",
|
|
79
|
+
suggestion: `freepatentsonline-web detail page for "${raw}" yielded no Title field`,
|
|
80
|
+
alternatives: ["google-patents-web", "espacenet"],
|
|
81
|
+
}),
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
const canonical =
|
|
86
|
+
reconstructCanonicalPubNo(detail.doc_type_label, detail.kind_code) ?? raw;
|
|
87
|
+
try {
|
|
88
|
+
return [
|
|
89
|
+
assemblePatentRecord({
|
|
90
|
+
publication_number: canonical,
|
|
91
|
+
application_number: detail.application_number || undefined,
|
|
92
|
+
title: detail.title,
|
|
93
|
+
abstract: detail.abstract,
|
|
94
|
+
assignees: detail.assignee ? [{ name: detail.assignee }] : undefined,
|
|
95
|
+
filing_date: detail.filing_date,
|
|
96
|
+
publication_date: detail.publication_date,
|
|
97
|
+
source_adapter: "freepatentsonline-web",
|
|
98
|
+
source_url: url,
|
|
99
|
+
} as Parameters<typeof assemblePatentRecord>[0]),
|
|
100
|
+
];
|
|
101
|
+
} catch {
|
|
102
|
+
return [
|
|
103
|
+
{
|
|
104
|
+
envelope: buildPatentEnvelope({
|
|
105
|
+
code: "PATENT_SCHEMA_DRIFT",
|
|
106
|
+
adapter_path: ADAPTER_PATH,
|
|
107
|
+
step: "normalize",
|
|
108
|
+
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})`,
|
|
109
|
+
alternatives: ["google-patents-web", "espacenet"],
|
|
110
|
+
}),
|
|
111
|
+
},
|
|
112
|
+
];
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
cli({
|
|
117
|
+
site: "freepatentsonline-web",
|
|
118
|
+
name: "get",
|
|
119
|
+
description:
|
|
120
|
+
"Retrieve a single FreePatentsOnline bibliographic record (keyless, no Chrome)",
|
|
121
|
+
domain: "www.freepatentsonline.com",
|
|
122
|
+
strategy: Strategy.PUBLIC,
|
|
123
|
+
adapter_path: ADAPTER_PATH,
|
|
124
|
+
args: [
|
|
125
|
+
{
|
|
126
|
+
name: "publication_number",
|
|
127
|
+
type: "str",
|
|
128
|
+
required: true,
|
|
129
|
+
positional: true,
|
|
130
|
+
description:
|
|
131
|
+
"ST.16 publication number, compact or segmented (e.g. US20240220787 or EP3716153A1)",
|
|
132
|
+
},
|
|
133
|
+
],
|
|
134
|
+
columns: [
|
|
135
|
+
"publication_number",
|
|
136
|
+
"title",
|
|
137
|
+
"publication_date",
|
|
138
|
+
"assignees",
|
|
139
|
+
"source_url",
|
|
140
|
+
],
|
|
141
|
+
capabilities: ["http.fetch", "patent.get"],
|
|
142
|
+
minimum_capability: "http.fetch",
|
|
143
|
+
func: async (_page, kwargs) => runFreePatentsOnlineGet(kwargs as GetArgs),
|
|
144
|
+
});
|
|
@@ -0,0 +1,170 @@
|
|
|
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
|
+
|
|
17
|
+
import { cli, Strategy } from "../../registry.js";
|
|
18
|
+
import { assemblePatentRecord } from "../../engine/normalizer/patent-envelope.js";
|
|
19
|
+
import { buildPatentEnvelope } from "../../engine/normalizer/patent-envelope.js";
|
|
20
|
+
import {
|
|
21
|
+
FpoHttpError,
|
|
22
|
+
buildFpoSearchUrl,
|
|
23
|
+
fetchFpoHtml,
|
|
24
|
+
parseFpoListing,
|
|
25
|
+
} from "./_shared.js";
|
|
26
|
+
|
|
27
|
+
const ADAPTER_PATH = "src/adapters/freepatentsonline-web/search.ts";
|
|
28
|
+
|
|
29
|
+
interface SearchArgs {
|
|
30
|
+
query?: unknown;
|
|
31
|
+
limit?: unknown;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function clampLimit(raw: unknown): number {
|
|
35
|
+
const num = typeof raw === "number" ? raw : Number(raw);
|
|
36
|
+
if (!Number.isFinite(num) || num <= 0) return 25;
|
|
37
|
+
return Math.min(50, Math.max(1, Math.floor(num)));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export async function runFreePatentsOnlineSearch(
|
|
41
|
+
kwargs: SearchArgs,
|
|
42
|
+
): Promise<unknown[]> {
|
|
43
|
+
const query = String(kwargs.query ?? "").trim();
|
|
44
|
+
if (query.length === 0) {
|
|
45
|
+
return [
|
|
46
|
+
{
|
|
47
|
+
envelope: buildPatentEnvelope({
|
|
48
|
+
code: "PATENT_UNSUPPORTED_QUERY",
|
|
49
|
+
adapter_path: ADAPTER_PATH,
|
|
50
|
+
step: "validate",
|
|
51
|
+
suggestion: "freepatentsonline-web search requires a non-empty query",
|
|
52
|
+
alternatives: ["google-patents-web"],
|
|
53
|
+
}),
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
const limit = clampLimit(kwargs.limit);
|
|
58
|
+
const url = buildFpoSearchUrl(query, 1);
|
|
59
|
+
let html: string;
|
|
60
|
+
try {
|
|
61
|
+
html = await fetchFpoHtml(url);
|
|
62
|
+
} catch (err) {
|
|
63
|
+
if (err instanceof FpoHttpError) {
|
|
64
|
+
return [
|
|
65
|
+
{
|
|
66
|
+
envelope: buildPatentEnvelope({
|
|
67
|
+
code:
|
|
68
|
+
err.status === 429
|
|
69
|
+
? "PATENT_RATE_LIMIT"
|
|
70
|
+
: "PATENT_API_DEPRECATED",
|
|
71
|
+
adapter_path: ADAPTER_PATH,
|
|
72
|
+
step: "fetch",
|
|
73
|
+
suggestion: `FreePatentsOnline returned HTTP ${err.status} for ${err.url}; retry with --sources google-patents-web`,
|
|
74
|
+
alternatives: ["google-patents-web", "espacenet"],
|
|
75
|
+
retryable: err.status === 429,
|
|
76
|
+
}),
|
|
77
|
+
},
|
|
78
|
+
];
|
|
79
|
+
}
|
|
80
|
+
throw err;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const rows = parseFpoListing(html);
|
|
84
|
+
if (rows.length === 0) {
|
|
85
|
+
return [
|
|
86
|
+
{
|
|
87
|
+
envelope: buildPatentEnvelope({
|
|
88
|
+
code: html.includes('class="listing_table"')
|
|
89
|
+
? "PATENT_NOT_FOUND"
|
|
90
|
+
: "PATENT_SCHEMA_DRIFT",
|
|
91
|
+
adapter_path: ADAPTER_PATH,
|
|
92
|
+
step: "select",
|
|
93
|
+
suggestion: html.includes('class="listing_table"')
|
|
94
|
+
? `freepatentsonline-web returned no listing rows for "${query}"`
|
|
95
|
+
: "freepatentsonline-web no longer ships listing_table — the parseFpoListing extractor needs updating",
|
|
96
|
+
alternatives: ["google-patents-web", "espacenet"],
|
|
97
|
+
}),
|
|
98
|
+
},
|
|
99
|
+
];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const out: unknown[] = [];
|
|
103
|
+
for (const row of rows.slice(0, limit)) {
|
|
104
|
+
const canonical = row.publication_number_canonical;
|
|
105
|
+
if (!canonical) {
|
|
106
|
+
// Row's link path did not encode a kind code (e.g. bare US grant
|
|
107
|
+
// number). Skip rather than fabricate.
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
out.push(
|
|
112
|
+
assemblePatentRecord({
|
|
113
|
+
publication_number: canonical,
|
|
114
|
+
title: row.title || undefined,
|
|
115
|
+
abstract: row.abstract || undefined,
|
|
116
|
+
source_adapter: "freepatentsonline-web",
|
|
117
|
+
source_url: row.detail_url,
|
|
118
|
+
} as Parameters<typeof assemblePatentRecord>[0]),
|
|
119
|
+
);
|
|
120
|
+
} catch {
|
|
121
|
+
// Defensive: skip rows that fail canonicalisation rather than
|
|
122
|
+
// synthesise.
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (out.length === 0) {
|
|
127
|
+
return [
|
|
128
|
+
{
|
|
129
|
+
envelope: buildPatentEnvelope({
|
|
130
|
+
code: "PATENT_NOT_FOUND",
|
|
131
|
+
adapter_path: ADAPTER_PATH,
|
|
132
|
+
step: "normalize",
|
|
133
|
+
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`,
|
|
134
|
+
alternatives: ["google-patents-web", "espacenet"],
|
|
135
|
+
}),
|
|
136
|
+
},
|
|
137
|
+
];
|
|
138
|
+
}
|
|
139
|
+
return out;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
cli({
|
|
143
|
+
site: "freepatentsonline-web",
|
|
144
|
+
name: "search",
|
|
145
|
+
description:
|
|
146
|
+
"Keyless FreePatentsOnline search via the public SSR listing (no API key, no Chrome)",
|
|
147
|
+
domain: "www.freepatentsonline.com",
|
|
148
|
+
strategy: Strategy.PUBLIC,
|
|
149
|
+
adapter_path: ADAPTER_PATH,
|
|
150
|
+
args: [
|
|
151
|
+
{
|
|
152
|
+
name: "query",
|
|
153
|
+
type: "str",
|
|
154
|
+
required: true,
|
|
155
|
+
positional: true,
|
|
156
|
+
description: "Free-text query (FreePatentsOnline xprtsrch syntax)",
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
name: "limit",
|
|
160
|
+
type: "int",
|
|
161
|
+
default: 25,
|
|
162
|
+
description: "Max results to return (1-50, FPO paginates at 50)",
|
|
163
|
+
},
|
|
164
|
+
],
|
|
165
|
+
columns: ["publication_number", "title", "abstract", "source_url"],
|
|
166
|
+
capabilities: ["http.fetch", "patent.search"],
|
|
167
|
+
minimum_capability: "http.fetch",
|
|
168
|
+
func: async (_page, kwargs) =>
|
|
169
|
+
runFreePatentsOnlineSearch(kwargs as SearchArgs),
|
|
170
|
+
});
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Google Patents BigQuery — keyword-based prior-art fan-out.
|
|
2
|
+
#
|
|
3
|
+
# verification_status: blocked-by-key
|
|
4
|
+
#
|
|
5
|
+
# This command is the keyword arm of `unicli patent prior-art`. It tokenises
|
|
6
|
+
# the abstract argument into noun phrases (handled by the substring LIKE
|
|
7
|
+
# template) and joins against the publication table, returning the top-N
|
|
8
|
+
# candidates by recency. The full fusion happens in `unicli patent prior-art`,
|
|
9
|
+
# which combines this with PQAI semantic embedding and EPO CPC classification.
|
|
10
|
+
site: google-patents-bq
|
|
11
|
+
name: prior-art
|
|
12
|
+
description: Keyword-arm of the prior-art fusion against BigQuery public dataset
|
|
13
|
+
domain: bigquery.googleapis.com
|
|
14
|
+
type: web-api
|
|
15
|
+
strategy: header
|
|
16
|
+
|
|
17
|
+
args:
|
|
18
|
+
abstract:
|
|
19
|
+
type: str
|
|
20
|
+
required: true
|
|
21
|
+
description: Candidate abstract — long-form natural language
|
|
22
|
+
limit:
|
|
23
|
+
type: int
|
|
24
|
+
default: 20
|
|
25
|
+
project:
|
|
26
|
+
type: str
|
|
27
|
+
default: ""
|
|
28
|
+
|
|
29
|
+
pipeline:
|
|
30
|
+
- fetch:
|
|
31
|
+
url: "https://bigquery.googleapis.com/bigquery/v2/projects/${{ args.project || env.GCLOUD_PROJECT || '' }}/queries"
|
|
32
|
+
method: POST
|
|
33
|
+
headers:
|
|
34
|
+
Authorization: "Bearer ${{ env.GCLOUD_ACCESS_TOKEN || '' }}"
|
|
35
|
+
Content-Type: application/json
|
|
36
|
+
body:
|
|
37
|
+
query: |-
|
|
38
|
+
SELECT
|
|
39
|
+
publication_number,
|
|
40
|
+
ANY_VALUE(kind_code) AS kind_code,
|
|
41
|
+
ANY_VALUE(title_localized)[OFFSET(0)].text AS title,
|
|
42
|
+
ANY_VALUE(abstract_localized)[OFFSET(0)].text AS abstract,
|
|
43
|
+
ANY_VALUE(publication_date) AS publication_date,
|
|
44
|
+
ANY_VALUE(filing_date) AS filing_date,
|
|
45
|
+
ANY_VALUE(family_id) AS family_id,
|
|
46
|
+
TO_JSON_STRING(ANY_VALUE(inventor_harmonized)) AS inventors,
|
|
47
|
+
TO_JSON_STRING(ANY_VALUE(assignee_harmonized)) AS assignees,
|
|
48
|
+
TO_JSON_STRING(ANY_VALUE(cpc)) AS cpc
|
|
49
|
+
FROM `patents-public-data.patents.publications`
|
|
50
|
+
WHERE LOWER(abstract_localized[OFFSET(0)].text) LIKE LOWER('%${{ args.abstract | truncate(80) }}%')
|
|
51
|
+
GROUP BY publication_number
|
|
52
|
+
ORDER BY ANY_VALUE(publication_date) DESC
|
|
53
|
+
LIMIT ${{ args.limit }}
|
|
54
|
+
useLegacySql: false
|
|
55
|
+
|
|
56
|
+
- select: rows
|
|
57
|
+
|
|
58
|
+
- map:
|
|
59
|
+
publication_number: "${{ item.f[0].v }}"
|
|
60
|
+
kind_code: "${{ item.f[1].v || '' }}"
|
|
61
|
+
title: "${{ item.f[2].v }}"
|
|
62
|
+
abstract: "${{ item.f[3].v }}"
|
|
63
|
+
publication_date: "${{ item.f[4].v }}"
|
|
64
|
+
filing_date: "${{ item.f[5].v }}"
|
|
65
|
+
family_id: "${{ item.f[6].v }}"
|
|
66
|
+
inventors: "${{ JSON.stringify((function(){ try { var arr = JSON.parse(item.f[7].v || '[]'); return Array.isArray(arr) ? arr.map(i => ({ name: i.name || i, country: i.country_code || undefined })) : []; } catch(e) { return []; } })()) }}"
|
|
67
|
+
assignees: "${{ JSON.stringify((function(){ try { var arr = JSON.parse(item.f[8].v || '[]'); return Array.isArray(arr) ? arr.map(a => ({ name: a.name || a, country: a.country_code || undefined })) : []; } catch(e) { return []; } })()) }}"
|
|
68
|
+
classifications: "${{ JSON.stringify((function(){ try { var cpc = JSON.parse(item.f[9].v || '[]'); return Array.isArray(cpc) ? cpc.map(c => ({ scheme: 'cpc', code: c.code || c })).filter(x => x.code) : []; } catch(e){ return []; } })()) }}"
|
|
69
|
+
source_adapter: google-patents-bq
|
|
70
|
+
source_url: "${{ 'https://patents.google.com/patent/' + (item.f[0].v || '') }}"
|
|
71
|
+
retrieved_at: "${{ now }}"
|
|
72
|
+
|
|
73
|
+
columns: [publication_number, title, abstract]
|
|
74
|
+
|
|
75
|
+
capabilities: ["http.fetch", "patent.prior-art"]
|
|
76
|
+
minimum_capability: http.fetch
|
|
77
|
+
trust: public
|
|
78
|
+
confidentiality: public
|
|
79
|
+
quarantine: false
|
|
80
|
+
schema_version: v2
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Google Patents Public Datasets via BigQuery REST.
|
|
2
|
+
#
|
|
3
|
+
# verification_status: blocked-by-key
|
|
4
|
+
#
|
|
5
|
+
# The dataset `patents-public-data.patents.publications` is free to query but
|
|
6
|
+
# requires a Google Cloud project with billing enabled (queries are billed at
|
|
7
|
+
# the standard BigQuery rate; the 1 TB / month free tier covers exploratory
|
|
8
|
+
# work). Auth path is OAuth2 — read $GCLOUD_ACCESS_TOKEN first; the adapter
|
|
9
|
+
# self-repair sequence asks the user to run `gcloud auth print-access-token`
|
|
10
|
+
# and re-export the value.
|
|
11
|
+
#
|
|
12
|
+
# The query template uses standard SQL against the public publications table.
|
|
13
|
+
# `args.query` is interpolated as a substring match on title/abstract — adapt
|
|
14
|
+
# the template for richer CQL when needed.
|
|
15
|
+
site: google-patents-bq
|
|
16
|
+
name: search
|
|
17
|
+
description: BigQuery search over the Google Patents Public Datasets corpus
|
|
18
|
+
domain: bigquery.googleapis.com
|
|
19
|
+
type: web-api
|
|
20
|
+
strategy: header
|
|
21
|
+
lint_listing_detail: skip
|
|
22
|
+
|
|
23
|
+
args:
|
|
24
|
+
query:
|
|
25
|
+
type: str
|
|
26
|
+
required: true
|
|
27
|
+
positional: true
|
|
28
|
+
description: Substring matched against title and abstract (case-insensitive)
|
|
29
|
+
limit:
|
|
30
|
+
type: int
|
|
31
|
+
default: 20
|
|
32
|
+
project:
|
|
33
|
+
type: str
|
|
34
|
+
default: ""
|
|
35
|
+
description: GCP project ID — falls back to $GCLOUD_PROJECT
|
|
36
|
+
|
|
37
|
+
pipeline:
|
|
38
|
+
- fetch:
|
|
39
|
+
url: "https://bigquery.googleapis.com/bigquery/v2/projects/${{ args.project || env.GCLOUD_PROJECT || '' }}/queries"
|
|
40
|
+
method: POST
|
|
41
|
+
headers:
|
|
42
|
+
Authorization: "Bearer ${{ env.GCLOUD_ACCESS_TOKEN || '' }}"
|
|
43
|
+
Content-Type: application/json
|
|
44
|
+
body:
|
|
45
|
+
query: |-
|
|
46
|
+
SELECT
|
|
47
|
+
publication_number,
|
|
48
|
+
ANY_VALUE(country_code) AS country_code,
|
|
49
|
+
ANY_VALUE(kind_code) AS kind_code,
|
|
50
|
+
ANY_VALUE(title_localized)[OFFSET(0)].text AS title,
|
|
51
|
+
ANY_VALUE(abstract_localized)[OFFSET(0)].text AS abstract,
|
|
52
|
+
ANY_VALUE(publication_date) AS publication_date,
|
|
53
|
+
ANY_VALUE(filing_date) AS filing_date,
|
|
54
|
+
ANY_VALUE(grant_date) AS grant_date,
|
|
55
|
+
ANY_VALUE(priority_date) AS priority_date,
|
|
56
|
+
ANY_VALUE(application_number) AS application_number,
|
|
57
|
+
ANY_VALUE(family_id) AS family_id,
|
|
58
|
+
TO_JSON_STRING(ANY_VALUE(inventor_harmonized)) AS inventors,
|
|
59
|
+
TO_JSON_STRING(ANY_VALUE(assignee_harmonized)) AS assignees,
|
|
60
|
+
TO_JSON_STRING(ANY_VALUE(cpc)) AS cpc,
|
|
61
|
+
TO_JSON_STRING(ANY_VALUE(ipc)) AS ipc,
|
|
62
|
+
ANY_VALUE(claims_localized_html)[OFFSET(0)].text AS claims_text
|
|
63
|
+
FROM `patents-public-data.patents.publications`
|
|
64
|
+
WHERE LOWER(title_localized[OFFSET(0)].text) LIKE LOWER('%${{ args.query }}%')
|
|
65
|
+
OR LOWER(abstract_localized[OFFSET(0)].text) LIKE LOWER('%${{ args.query }}%')
|
|
66
|
+
GROUP BY publication_number
|
|
67
|
+
LIMIT ${{ args.limit }}
|
|
68
|
+
useLegacySql: false
|
|
69
|
+
|
|
70
|
+
- select: rows
|
|
71
|
+
|
|
72
|
+
- map:
|
|
73
|
+
publication_number: "${{ item.f[0].v }}"
|
|
74
|
+
kind_code: "${{ item.f[2].v || '' }}"
|
|
75
|
+
title: "${{ item.f[3].v }}"
|
|
76
|
+
abstract: "${{ item.f[4].v }}"
|
|
77
|
+
publication_date: "${{ item.f[5].v }}"
|
|
78
|
+
filing_date: "${{ item.f[6].v }}"
|
|
79
|
+
grant_date: "${{ item.f[7].v }}"
|
|
80
|
+
priority_date: "${{ item.f[8].v }}"
|
|
81
|
+
application_number: "${{ item.f[9].v }}"
|
|
82
|
+
family_id: "${{ item.f[10].v }}"
|
|
83
|
+
inventors: "${{ JSON.stringify((function(){ try { var arr = JSON.parse(item.f[11].v || '[]'); return Array.isArray(arr) ? arr.map(i => ({ name: i.name || i, country: i.country_code || undefined })) : []; } catch(e) { return []; } })()) }}"
|
|
84
|
+
assignees: "${{ JSON.stringify((function(){ try { var arr = JSON.parse(item.f[12].v || '[]'); return Array.isArray(arr) ? arr.map(a => ({ name: a.name || a, country: a.country_code || undefined })) : []; } catch(e) { return []; } })()) }}"
|
|
85
|
+
classifications: "${{ JSON.stringify((function(){ var out = []; try { var cpc = JSON.parse(item.f[13].v || '[]'); if(Array.isArray(cpc)){ for (var i=0;i<cpc.length;i++) out.push({ scheme: 'cpc', code: cpc[i].code || cpc[i] }); } } catch(e){} try { var ipc = JSON.parse(item.f[14].v || '[]'); if(Array.isArray(ipc)){ for (var j=0;j<ipc.length;j++) out.push({ scheme: 'ipc', code: ipc[j].code || ipc[j] }); } } catch(e){} return out.filter(x => x.code); })()) }}"
|
|
86
|
+
source_adapter: google-patents-bq
|
|
87
|
+
source_url: "${{ 'https://patents.google.com/patent/' + (item.f[0].v || '') }}"
|
|
88
|
+
retrieved_at: "${{ now }}"
|
|
89
|
+
|
|
90
|
+
columns: [publication_number, title, publication_date, source_adapter]
|
|
91
|
+
|
|
92
|
+
capabilities: ["http.fetch", "patent.search"]
|
|
93
|
+
minimum_capability: http.fetch
|
|
94
|
+
trust: public
|
|
95
|
+
confidentiality: public
|
|
96
|
+
quarantine: false
|
|
97
|
+
schema_version: v2
|