@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,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::espacenet::family
|
|
3
|
+
* @does Browser-driven Espacenet family lookup — DOCDB simple-family rows visible on the family tab of the detail page; alternative to EPO OPS keyed family broker.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/adapters/espacenet/_shared.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.family)
|
|
6
|
+
* @breaks PATENT_INVALID_NUMBER, PATENT_NOT_FOUND, PATENT_API_DEPRECATED (MCP_BUS_MISSING)
|
|
7
|
+
* @invariants output rows carry publication_number + jurisdiction + relationship per PatentFamilyMember shape
|
|
8
|
+
* @side-effects controls Chrome via MCP
|
|
9
|
+
* @perf single navigate + evaluate
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/espacenet/search.test.ts (transport-error shared path)
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification browser-only
|
|
15
|
+
*/
|
|
16
|
+
import { cli, Strategy } from "../../registry.js";
|
|
17
|
+
import { TransportError } from "../../engine/transport/mcp-browser.js";
|
|
18
|
+
import { espacenetEnvelope, espacenetNavigateAndExtract, transportErrorToEspacenetEnvelope, } from "./_shared.js";
|
|
19
|
+
const ADAPTER_PATH = "src/adapters/espacenet/family.ts";
|
|
20
|
+
const FAMILY_EXTRACTOR = `(() => {
|
|
21
|
+
const rows = Array.from(
|
|
22
|
+
document.querySelectorAll('[data-test="family-row"], .familyRow, tr.family-member')
|
|
23
|
+
).map((el) => {
|
|
24
|
+
const text = (sel) => {
|
|
25
|
+
const node = el.querySelector(sel);
|
|
26
|
+
return node ? (node.textContent || '').trim() : '';
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
publication_number: text('[data-test="publication-number"], .publicationNumber'),
|
|
30
|
+
jurisdiction: text('[data-test="country"], .country'),
|
|
31
|
+
publication_date: text('[data-test="publication-date"], .publicationDate'),
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
return { rows };
|
|
35
|
+
})()`;
|
|
36
|
+
function familyUrlFor(pubNo) {
|
|
37
|
+
return `https://worldwide.espacenet.com/patent/search/family/${encodeURIComponent(pubNo)}`;
|
|
38
|
+
}
|
|
39
|
+
export async function runEspacenetFamily(kwargs) {
|
|
40
|
+
const pubNo = String(kwargs.publication_number ?? "").trim();
|
|
41
|
+
if (pubNo.length === 0) {
|
|
42
|
+
return [
|
|
43
|
+
{
|
|
44
|
+
envelope: espacenetEnvelope("PATENT_INVALID_NUMBER", ADAPTER_PATH, "validate", "espacenet family requires a non-empty publication_number"),
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
}
|
|
48
|
+
const url = familyUrlFor(pubNo);
|
|
49
|
+
let extract;
|
|
50
|
+
try {
|
|
51
|
+
const result = await espacenetNavigateAndExtract(url, FAMILY_EXTRACTOR);
|
|
52
|
+
if (!result.data) {
|
|
53
|
+
return [
|
|
54
|
+
{
|
|
55
|
+
envelope: espacenetEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "espacenet family evaluate returned no data"),
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
extract = result.data;
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
if (err instanceof TransportError) {
|
|
63
|
+
return [
|
|
64
|
+
{
|
|
65
|
+
envelope: transportErrorToEspacenetEnvelope(err, ADAPTER_PATH, "navigate"),
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
}
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
if (extract.rows.length === 0) {
|
|
72
|
+
return [
|
|
73
|
+
{
|
|
74
|
+
envelope: espacenetEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "evaluate", `espacenet found no family members for "${pubNo}"`, ["epo"]),
|
|
75
|
+
},
|
|
76
|
+
];
|
|
77
|
+
}
|
|
78
|
+
return extract.rows
|
|
79
|
+
.filter((row) => row.publication_number)
|
|
80
|
+
.map((row) => ({
|
|
81
|
+
publication_number: row.publication_number,
|
|
82
|
+
jurisdiction: row.jurisdiction || row.publication_number.slice(0, 2).toUpperCase(),
|
|
83
|
+
relationship: "simple_family",
|
|
84
|
+
publication_date: row.publication_date || undefined,
|
|
85
|
+
source_adapter: "espacenet",
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
cli({
|
|
89
|
+
site: "espacenet",
|
|
90
|
+
name: "family",
|
|
91
|
+
description: "Espacenet DOCDB simple-family lookup (browser)",
|
|
92
|
+
domain: "worldwide.espacenet.com",
|
|
93
|
+
strategy: Strategy.PUBLIC,
|
|
94
|
+
adapter_path: ADAPTER_PATH,
|
|
95
|
+
args: [
|
|
96
|
+
{
|
|
97
|
+
name: "publication_number",
|
|
98
|
+
type: "str",
|
|
99
|
+
required: true,
|
|
100
|
+
positional: true,
|
|
101
|
+
description: "ST.16 publication number",
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
columns: [
|
|
105
|
+
"publication_number",
|
|
106
|
+
"jurisdiction",
|
|
107
|
+
"relationship",
|
|
108
|
+
"publication_date",
|
|
109
|
+
],
|
|
110
|
+
capabilities: [
|
|
111
|
+
"mcp-browser.navigate",
|
|
112
|
+
"mcp-browser.evaluate",
|
|
113
|
+
"patent.family",
|
|
114
|
+
],
|
|
115
|
+
minimum_capability: "mcp-browser.evaluate",
|
|
116
|
+
func: async (_page, kwargs) => runEspacenetFamily(kwargs),
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=family.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"family.js","sourceRoot":"","sources":["../../../src/adapters/espacenet/family.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::espacenet::get
|
|
3
|
+
* @does Browser-driven retrieval of a single Espacenet publication detail page; extracts bibliographic fields and emits a PatentRecord.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/espacenet/_shared.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.get)
|
|
6
|
+
* @breaks PATENT_INVALID_NUMBER, PATENT_NOT_FOUND, PATENT_API_DEPRECATED with MCP_BUS_MISSING
|
|
7
|
+
* @invariants output is a single PatentRecord row when upstream answers; never returns a stub
|
|
8
|
+
* @side-effects controls Chrome via MCP
|
|
9
|
+
* @perf single navigate + evaluate
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/espacenet/search.test.ts (transport-error path)
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification browser-only
|
|
15
|
+
*/
|
|
16
|
+
export declare function runEspacenetGet(kwargs: {
|
|
17
|
+
publication_number: string;
|
|
18
|
+
}): Promise<unknown[]>;
|
|
19
|
+
//# sourceMappingURL=get.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/adapters/espacenet/get.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAmDH,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC5C,kBAAkB,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CA6FrB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::espacenet::get
|
|
3
|
+
* @does Browser-driven retrieval of a single Espacenet publication detail page; extracts bibliographic fields and emits a PatentRecord.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/espacenet/_shared.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.get)
|
|
6
|
+
* @breaks PATENT_INVALID_NUMBER, PATENT_NOT_FOUND, PATENT_API_DEPRECATED with MCP_BUS_MISSING
|
|
7
|
+
* @invariants output is a single PatentRecord row when upstream answers; never returns a stub
|
|
8
|
+
* @side-effects controls Chrome via MCP
|
|
9
|
+
* @perf single navigate + evaluate
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/espacenet/search.test.ts (transport-error path)
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification browser-only
|
|
15
|
+
*/
|
|
16
|
+
import { cli, Strategy } from "../../registry.js";
|
|
17
|
+
import { TransportError } from "../../engine/transport/mcp-browser.js";
|
|
18
|
+
import { assemblePatentRecord } from "../../engine/normalizer/patent-envelope.js";
|
|
19
|
+
import { espacenetEnvelope, espacenetNavigateAndExtract, transportErrorToEspacenetEnvelope, } from "./_shared.js";
|
|
20
|
+
const ADAPTER_PATH = "src/adapters/espacenet/get.ts";
|
|
21
|
+
const DETAIL_EXTRACTOR = `(() => {
|
|
22
|
+
const text = (sel) => {
|
|
23
|
+
const node = document.querySelector(sel);
|
|
24
|
+
return node ? (node.textContent || '').trim() : '';
|
|
25
|
+
};
|
|
26
|
+
return {
|
|
27
|
+
publication_number: text('[data-test="publication-number"], .publicationNumber'),
|
|
28
|
+
application_number: text('[data-test="application-number"], .applicationNumber'),
|
|
29
|
+
title: text('[data-test="title"], h1.title, .invention-title'),
|
|
30
|
+
abstract: text('[data-test="abstract"], .abstract'),
|
|
31
|
+
applicant: text('[data-test="applicant"], .applicantName'),
|
|
32
|
+
inventor: text('[data-test="inventor"], .inventorName'),
|
|
33
|
+
publication_date: text('[data-test="publication-date"], .publicationDate'),
|
|
34
|
+
filing_date: text('[data-test="filing-date"], .filingDate'),
|
|
35
|
+
source_url: location.href,
|
|
36
|
+
html_marker: document.body && document.body.innerText
|
|
37
|
+
? document.body.innerText.slice(0, 200)
|
|
38
|
+
: '',
|
|
39
|
+
};
|
|
40
|
+
})()`;
|
|
41
|
+
function detailUrlFor(pubNo) {
|
|
42
|
+
return `https://worldwide.espacenet.com/patent/search/publication/${encodeURIComponent(pubNo)}`;
|
|
43
|
+
}
|
|
44
|
+
export async function runEspacenetGet(kwargs) {
|
|
45
|
+
const pubNo = String(kwargs.publication_number ?? "").trim();
|
|
46
|
+
if (pubNo.length === 0) {
|
|
47
|
+
return [
|
|
48
|
+
{
|
|
49
|
+
envelope: espacenetEnvelope("PATENT_INVALID_NUMBER", ADAPTER_PATH, "validate", "espacenet get requires a non-empty publication_number"),
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
}
|
|
53
|
+
const url = detailUrlFor(pubNo);
|
|
54
|
+
let detail;
|
|
55
|
+
try {
|
|
56
|
+
const result = await espacenetNavigateAndExtract(url, DETAIL_EXTRACTOR);
|
|
57
|
+
if (!result.data) {
|
|
58
|
+
return [
|
|
59
|
+
{
|
|
60
|
+
envelope: espacenetEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "espacenet detail evaluate returned no data"),
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
}
|
|
64
|
+
detail = result.data;
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
if (err instanceof TransportError) {
|
|
68
|
+
return [
|
|
69
|
+
{
|
|
70
|
+
envelope: transportErrorToEspacenetEnvelope(err, ADAPTER_PATH, "navigate"),
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
}
|
|
74
|
+
throw err;
|
|
75
|
+
}
|
|
76
|
+
const fieldCount = [detail.publication_number, detail.title].filter(Boolean).length;
|
|
77
|
+
if (fieldCount === 0) {
|
|
78
|
+
return [
|
|
79
|
+
{
|
|
80
|
+
envelope: espacenetEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "evaluate", `espacenet detail page for "${pubNo}" yielded no bibliographic fields`, ["epo", "uspto"]),
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
}
|
|
84
|
+
const canonicalPubNo = detail.publication_number || pubNo;
|
|
85
|
+
try {
|
|
86
|
+
return [
|
|
87
|
+
assemblePatentRecord({
|
|
88
|
+
publication_number: canonicalPubNo,
|
|
89
|
+
application_number: detail.application_number || undefined,
|
|
90
|
+
title: detail.title || undefined,
|
|
91
|
+
abstract: detail.abstract || undefined,
|
|
92
|
+
assignees: detail.applicant ? [{ name: detail.applicant }] : undefined,
|
|
93
|
+
inventors: detail.inventor ? [{ name: detail.inventor }] : undefined,
|
|
94
|
+
publication_date: detail.publication_date || undefined,
|
|
95
|
+
filing_date: detail.filing_date || undefined,
|
|
96
|
+
source_adapter: "espacenet",
|
|
97
|
+
source_url: detail.source_url || url,
|
|
98
|
+
}),
|
|
99
|
+
];
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return [
|
|
103
|
+
{
|
|
104
|
+
envelope: espacenetEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "normalize", `espacenet detail page for "${pubNo}" did not yield a valid publication_number`, ["epo"]),
|
|
105
|
+
},
|
|
106
|
+
];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
cli({
|
|
110
|
+
site: "espacenet",
|
|
111
|
+
name: "get",
|
|
112
|
+
description: "Retrieve a single Espacenet publication detail (browser, no key)",
|
|
113
|
+
domain: "worldwide.espacenet.com",
|
|
114
|
+
strategy: Strategy.PUBLIC,
|
|
115
|
+
adapter_path: ADAPTER_PATH,
|
|
116
|
+
args: [
|
|
117
|
+
{
|
|
118
|
+
name: "publication_number",
|
|
119
|
+
type: "str",
|
|
120
|
+
required: true,
|
|
121
|
+
positional: true,
|
|
122
|
+
description: "ST.16 publication number (e.g. EP4123456A1)",
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
columns: ["publication_number", "title", "publication_date", "source_url"],
|
|
126
|
+
capabilities: ["mcp-browser.navigate", "mcp-browser.evaluate", "patent.get"],
|
|
127
|
+
minimum_capability: "mcp-browser.evaluate",
|
|
128
|
+
func: async (_page, kwargs) => runEspacenetGet(kwargs),
|
|
129
|
+
});
|
|
130
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/adapters/espacenet/get.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::espacenet::legal-status
|
|
3
|
+
* @does Browser-driven Espacenet legal-status lookup — INPADOC events table on the legal-status tab.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/adapters/espacenet/_shared.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.legal-status)
|
|
6
|
+
* @breaks PATENT_INVALID_NUMBER, PATENT_NOT_FOUND, PATENT_API_DEPRECATED (MCP_BUS_MISSING)
|
|
7
|
+
* @invariants output row carries legal_status as the most-recent INPADOC event verbatim
|
|
8
|
+
* @side-effects controls Chrome via MCP
|
|
9
|
+
* @perf single navigate + evaluate
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/espacenet/search.test.ts (shared transport-error path)
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification browser-only
|
|
15
|
+
*/
|
|
16
|
+
export declare function runEspacenetLegalStatus(kwargs: {
|
|
17
|
+
publication_number: string;
|
|
18
|
+
}): Promise<unknown[]>;
|
|
19
|
+
//# sourceMappingURL=legal-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legal-status.d.ts","sourceRoot":"","sources":["../../../src/adapters/espacenet/legal-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAoCH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE;IACpD,kBAAkB,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAuErB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::espacenet::legal-status
|
|
3
|
+
* @does Browser-driven Espacenet legal-status lookup — INPADOC events table on the legal-status tab.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/adapters/espacenet/_shared.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.legal-status)
|
|
6
|
+
* @breaks PATENT_INVALID_NUMBER, PATENT_NOT_FOUND, PATENT_API_DEPRECATED (MCP_BUS_MISSING)
|
|
7
|
+
* @invariants output row carries legal_status as the most-recent INPADOC event verbatim
|
|
8
|
+
* @side-effects controls Chrome via MCP
|
|
9
|
+
* @perf single navigate + evaluate
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/espacenet/search.test.ts (shared transport-error path)
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification browser-only
|
|
15
|
+
*/
|
|
16
|
+
import { cli, Strategy } from "../../registry.js";
|
|
17
|
+
import { TransportError } from "../../engine/transport/mcp-browser.js";
|
|
18
|
+
import { espacenetEnvelope, espacenetNavigateAndExtract, transportErrorToEspacenetEnvelope, } from "./_shared.js";
|
|
19
|
+
const ADAPTER_PATH = "src/adapters/espacenet/legal-status.ts";
|
|
20
|
+
const EXTRACTOR = `(() => {
|
|
21
|
+
const text = (sel) => {
|
|
22
|
+
const node = document.querySelector(sel);
|
|
23
|
+
return node ? (node.textContent || '').trim() : '';
|
|
24
|
+
};
|
|
25
|
+
return {
|
|
26
|
+
publication_number: text('[data-test="publication-number"], .publicationNumber'),
|
|
27
|
+
legal_status: text('[data-test="legal-status"] tr:first-child td:nth-child(2), .legalStatus__currentStatus'),
|
|
28
|
+
status_date: text('[data-test="legal-status"] tr:first-child td:nth-child(1), .legalStatus__currentDate'),
|
|
29
|
+
source_url: location.href,
|
|
30
|
+
};
|
|
31
|
+
})()`;
|
|
32
|
+
function legalUrlFor(pubNo) {
|
|
33
|
+
return `https://worldwide.espacenet.com/patent/search/legal-status/${encodeURIComponent(pubNo)}`;
|
|
34
|
+
}
|
|
35
|
+
export async function runEspacenetLegalStatus(kwargs) {
|
|
36
|
+
const pubNo = String(kwargs.publication_number ?? "").trim();
|
|
37
|
+
if (pubNo.length === 0) {
|
|
38
|
+
return [
|
|
39
|
+
{
|
|
40
|
+
envelope: espacenetEnvelope("PATENT_INVALID_NUMBER", ADAPTER_PATH, "validate", "espacenet legal-status requires a non-empty publication_number"),
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
}
|
|
44
|
+
const url = legalUrlFor(pubNo);
|
|
45
|
+
let detail;
|
|
46
|
+
try {
|
|
47
|
+
const result = await espacenetNavigateAndExtract(url, EXTRACTOR);
|
|
48
|
+
if (!result.data) {
|
|
49
|
+
return [
|
|
50
|
+
{
|
|
51
|
+
envelope: espacenetEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "espacenet legal-status evaluate returned no data"),
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
detail = result.data;
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
if (err instanceof TransportError) {
|
|
59
|
+
return [
|
|
60
|
+
{
|
|
61
|
+
envelope: transportErrorToEspacenetEnvelope(err, ADAPTER_PATH, "navigate"),
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
throw err;
|
|
66
|
+
}
|
|
67
|
+
if (!detail.legal_status) {
|
|
68
|
+
return [
|
|
69
|
+
{
|
|
70
|
+
envelope: espacenetEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "evaluate", `espacenet returned no legal_status for "${pubNo}"`, ["epo"]),
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
}
|
|
74
|
+
return [
|
|
75
|
+
{
|
|
76
|
+
publication_number: detail.publication_number || pubNo,
|
|
77
|
+
legal_status: detail.legal_status,
|
|
78
|
+
status_date: detail.status_date,
|
|
79
|
+
source_adapter: "espacenet",
|
|
80
|
+
source_url: detail.source_url || url,
|
|
81
|
+
retrieved_at: new Date().toISOString(),
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
cli({
|
|
86
|
+
site: "espacenet",
|
|
87
|
+
name: "legal-status",
|
|
88
|
+
description: "Espacenet INPADOC legal-status lookup (browser)",
|
|
89
|
+
domain: "worldwide.espacenet.com",
|
|
90
|
+
strategy: Strategy.PUBLIC,
|
|
91
|
+
adapter_path: ADAPTER_PATH,
|
|
92
|
+
args: [
|
|
93
|
+
{
|
|
94
|
+
name: "publication_number",
|
|
95
|
+
type: "str",
|
|
96
|
+
required: true,
|
|
97
|
+
positional: true,
|
|
98
|
+
description: "ST.16 publication number",
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
columns: ["publication_number", "legal_status", "status_date", "source_url"],
|
|
102
|
+
capabilities: [
|
|
103
|
+
"mcp-browser.navigate",
|
|
104
|
+
"mcp-browser.evaluate",
|
|
105
|
+
"patent.legal-status",
|
|
106
|
+
],
|
|
107
|
+
minimum_capability: "mcp-browser.evaluate",
|
|
108
|
+
func: async (_page, kwargs) => runEspacenetLegalStatus(kwargs),
|
|
109
|
+
});
|
|
110
|
+
//# sourceMappingURL=legal-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legal-status.js","sourceRoot":"","sources":["../../../src/adapters/espacenet/legal-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::espacenet::search
|
|
3
|
+
* @does Browser-driven Espacenet front-end search at worldwide.espacenet.com/patent/search — the EPO public no-key fallback for global patent search; complements the keyed EPO OPS adapter at src/adapters/epo/*.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/espacenet/_shared.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.search)
|
|
6
|
+
* @breaks PATENT_API_DEPRECATED with MCP_BUS_MISSING when no outbound MCP transport; PATENT_NOT_FOUND on empty result; PATENT_BROWSER_CAPTCHA on EPO's anti-bot challenge
|
|
7
|
+
* @invariants output rows are canonical PatentRecord; source_adapter='espacenet'
|
|
8
|
+
* @side-effects controls Chrome via MCP
|
|
9
|
+
* @perf single navigate + evaluate
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/espacenet/search.test.ts
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification browser-only (distinct from EPO OPS which is keyed REST)
|
|
15
|
+
*/
|
|
16
|
+
export declare function runEspacenetSearch(kwargs: {
|
|
17
|
+
query: string;
|
|
18
|
+
limit?: number;
|
|
19
|
+
}): Promise<unknown[]>;
|
|
20
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/adapters/espacenet/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA+DH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAkHrB"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::espacenet::search
|
|
3
|
+
* @does Browser-driven Espacenet front-end search at worldwide.espacenet.com/patent/search — the EPO public no-key fallback for global patent search; complements the keyed EPO OPS adapter at src/adapters/epo/*.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/espacenet/_shared.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.search)
|
|
6
|
+
* @breaks PATENT_API_DEPRECATED with MCP_BUS_MISSING when no outbound MCP transport; PATENT_NOT_FOUND on empty result; PATENT_BROWSER_CAPTCHA on EPO's anti-bot challenge
|
|
7
|
+
* @invariants output rows are canonical PatentRecord; source_adapter='espacenet'
|
|
8
|
+
* @side-effects controls Chrome via MCP
|
|
9
|
+
* @perf single navigate + evaluate
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/espacenet/search.test.ts
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification browser-only (distinct from EPO OPS which is keyed REST)
|
|
15
|
+
*/
|
|
16
|
+
import { cli, Strategy } from "../../registry.js";
|
|
17
|
+
import { TransportError } from "../../engine/transport/mcp-browser.js";
|
|
18
|
+
import { assemblePatentRecord } from "../../engine/normalizer/patent-envelope.js";
|
|
19
|
+
import { espacenetEnvelope, espacenetNavigateAndExtract, transportErrorToEspacenetEnvelope, } from "./_shared.js";
|
|
20
|
+
const ADAPTER_PATH = "src/adapters/espacenet/search.ts";
|
|
21
|
+
const ESPACENET_SEARCH_URL = "https://worldwide.espacenet.com/patent/search";
|
|
22
|
+
const EXTRACTOR = `(() => {
|
|
23
|
+
const rows = Array.from(
|
|
24
|
+
document.querySelectorAll('article.publication, .item--ezfpdY, [data-test="result"]')
|
|
25
|
+
).map((el) => {
|
|
26
|
+
const text = (sel) => {
|
|
27
|
+
const node = el.querySelector(sel);
|
|
28
|
+
return node ? (node.textContent || '').trim() : '';
|
|
29
|
+
};
|
|
30
|
+
const linkEl = el.querySelector('a[href*="/patent/search/family"], a[href*="/patent/search/publication"], a[href]');
|
|
31
|
+
return {
|
|
32
|
+
publication_number: text('[data-test="publication-number"], .publicationNumber, .publication__id'),
|
|
33
|
+
title: text('[data-test="title"], .publicationTitle, h3'),
|
|
34
|
+
applicant: text('[data-test="applicant"], .applicantName'),
|
|
35
|
+
inventor: text('[data-test="inventor"], .inventorName'),
|
|
36
|
+
publication_date: text('[data-test="publication-date"], .publicationDate, .publication__date'),
|
|
37
|
+
source_url: linkEl ? linkEl.href : '',
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
const html_marker = (document.body && document.body.innerText
|
|
41
|
+
? document.body.innerText.slice(0, 200)
|
|
42
|
+
: '');
|
|
43
|
+
return { rows, html_marker };
|
|
44
|
+
})()`;
|
|
45
|
+
function buildSearchUrl(query, limit) {
|
|
46
|
+
// Espacenet smart-search query — `q` is the CQL-lite syntax accepted by
|
|
47
|
+
// the front-end search box. Limit is enforced client-side; Espacenet
|
|
48
|
+
// paginates server-side via the `?p=` page parameter.
|
|
49
|
+
const params = new URLSearchParams({ q: query });
|
|
50
|
+
// Espacenet shows ~25 rows per page; cap requested limit at one page so
|
|
51
|
+
// the browser does not paginate by default.
|
|
52
|
+
if (limit > 25)
|
|
53
|
+
params.set("ps", String(Math.min(100, limit)));
|
|
54
|
+
return `${ESPACENET_SEARCH_URL}?${params.toString()}`;
|
|
55
|
+
}
|
|
56
|
+
export async function runEspacenetSearch(kwargs) {
|
|
57
|
+
const limit = typeof kwargs.limit === "number" && Number.isFinite(kwargs.limit)
|
|
58
|
+
? Math.max(1, Math.min(100, Math.floor(kwargs.limit)))
|
|
59
|
+
: 25;
|
|
60
|
+
const query = String(kwargs.query ?? "").trim();
|
|
61
|
+
if (query.length === 0) {
|
|
62
|
+
return [
|
|
63
|
+
{
|
|
64
|
+
envelope: espacenetEnvelope("PATENT_UNSUPPORTED_QUERY", ADAPTER_PATH, "validate", "espacenet search requires a non-empty query"),
|
|
65
|
+
},
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
const url = buildSearchUrl(query, limit);
|
|
69
|
+
let extract;
|
|
70
|
+
try {
|
|
71
|
+
const result = await espacenetNavigateAndExtract(url, EXTRACTOR);
|
|
72
|
+
if (!result.data) {
|
|
73
|
+
return [
|
|
74
|
+
{
|
|
75
|
+
envelope: espacenetEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "espacenet evaluate returned no data; selector schema likely changed"),
|
|
76
|
+
},
|
|
77
|
+
];
|
|
78
|
+
}
|
|
79
|
+
extract = result.data;
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
if (err instanceof TransportError) {
|
|
83
|
+
return [
|
|
84
|
+
{
|
|
85
|
+
envelope: transportErrorToEspacenetEnvelope(err, ADAPTER_PATH, "navigate"),
|
|
86
|
+
},
|
|
87
|
+
];
|
|
88
|
+
}
|
|
89
|
+
throw err;
|
|
90
|
+
}
|
|
91
|
+
if (extract.rows.length === 0) {
|
|
92
|
+
const marker = (extract.html_marker ?? "").toLowerCase();
|
|
93
|
+
if (marker.includes("captcha") ||
|
|
94
|
+
marker.includes("challenge") ||
|
|
95
|
+
marker.includes("are you a human")) {
|
|
96
|
+
return [
|
|
97
|
+
{
|
|
98
|
+
envelope: espacenetEnvelope("PATENT_BROWSER_CAPTCHA", ADAPTER_PATH, "evaluate", "espacenet served an anti-bot challenge; solve it in the open browser tab and re-run", ["epo"]),
|
|
99
|
+
},
|
|
100
|
+
];
|
|
101
|
+
}
|
|
102
|
+
return [
|
|
103
|
+
{
|
|
104
|
+
envelope: espacenetEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "evaluate", `espacenet returned no rows for query "${query}"`, ["epo", "uspto"]),
|
|
105
|
+
},
|
|
106
|
+
];
|
|
107
|
+
}
|
|
108
|
+
const out = [];
|
|
109
|
+
for (const row of extract.rows.slice(0, limit)) {
|
|
110
|
+
if (!row.publication_number)
|
|
111
|
+
continue;
|
|
112
|
+
try {
|
|
113
|
+
out.push(assemblePatentRecord({
|
|
114
|
+
publication_number: row.publication_number,
|
|
115
|
+
title: row.title || undefined,
|
|
116
|
+
assignees: row.applicant ? [{ name: row.applicant }] : undefined,
|
|
117
|
+
inventors: row.inventor ? [{ name: row.inventor }] : undefined,
|
|
118
|
+
publication_date: row.publication_date || undefined,
|
|
119
|
+
source_adapter: "espacenet",
|
|
120
|
+
source_url: row.source_url || url,
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// Skip rows that fail canonicalization rather than synthesize.
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (out.length === 0) {
|
|
128
|
+
out.push({
|
|
129
|
+
envelope: espacenetEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "normalize", "espacenet returned rows but none carried a valid publication_number", ["epo"]),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
return out;
|
|
133
|
+
}
|
|
134
|
+
cli({
|
|
135
|
+
site: "espacenet",
|
|
136
|
+
name: "search",
|
|
137
|
+
description: "Search Espacenet (EPO public no-key front end) for worldwide patents",
|
|
138
|
+
domain: "worldwide.espacenet.com",
|
|
139
|
+
strategy: Strategy.PUBLIC,
|
|
140
|
+
adapter_path: ADAPTER_PATH,
|
|
141
|
+
args: [
|
|
142
|
+
{
|
|
143
|
+
name: "query",
|
|
144
|
+
type: "str",
|
|
145
|
+
required: true,
|
|
146
|
+
positional: true,
|
|
147
|
+
description: "Espacenet smart-search query (CQL-lite syntax)",
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
name: "limit",
|
|
151
|
+
type: "int",
|
|
152
|
+
default: 25,
|
|
153
|
+
description: "Max results (1-100)",
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
columns: ["publication_number", "title", "publication_date", "source_url"],
|
|
157
|
+
capabilities: [
|
|
158
|
+
"mcp-browser.navigate",
|
|
159
|
+
"mcp-browser.evaluate",
|
|
160
|
+
"patent.search",
|
|
161
|
+
],
|
|
162
|
+
minimum_capability: "mcp-browser.evaluate",
|
|
163
|
+
func: async (_page, kwargs) => runEspacenetSearch(kwargs),
|
|
164
|
+
});
|
|
165
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/adapters/espacenet/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner Facebook subtitle adapter.
|
|
3
|
+
* @does Extracts LLM-readable subtitle text from public Facebook video URLs.
|
|
4
|
+
* @needs `yt-dlp` on PATH and an accessible video subtitle track.
|
|
5
|
+
* @feeds Social video evidence gathering without browser-security bypasses.
|
|
6
|
+
* @breaks Facebook or yt-dlp extractor changes can alter subtitle availability.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=subtitles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subtitles.d.ts","sourceRoot":"","sources":["../../../src/adapters/facebook/subtitles.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|