@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,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::cipo::get
|
|
3
|
+
* @does Browser-driven CIPO single-document retrieval — Canadian Patents Database detail page extracted into a PatentRecord.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/cipo/_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 (MCP_BUS_MISSING)
|
|
7
|
+
* @invariants output row is a canonical PatentRecord
|
|
8
|
+
* @side-effects controls Chrome via MCP
|
|
9
|
+
* @perf single navigate + evaluate
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/cipo/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 { assemblePatentRecord } from "../../engine/normalizer/patent-envelope.js";
|
|
19
|
+
import { cipoEnvelope, cipoNavigateAndExtract, transportErrorToCipoEnvelope, } from "./_shared.js";
|
|
20
|
+
const ADAPTER_PATH = "src/adapters/cipo/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('.patent-number, [data-field="patentNo"]'),
|
|
28
|
+
application_number: text('.application-number, [data-field="appNo"]'),
|
|
29
|
+
title: text('.patent-title, h1.title, [data-field="title"]'),
|
|
30
|
+
abstract: text('.abstract, [data-field="abstract"]'),
|
|
31
|
+
applicant: text('.applicant-name, [data-field="applicant"]'),
|
|
32
|
+
inventor: text('.inventor-name, [data-field="inventor"]'),
|
|
33
|
+
publication_date: text('.publication-date, [data-field="pubDate"]'),
|
|
34
|
+
filing_date: text('.filing-date, [data-field="filingDate"]'),
|
|
35
|
+
grant_date: text('.grant-date, [data-field="grantDate"]'),
|
|
36
|
+
source_url: location.href,
|
|
37
|
+
};
|
|
38
|
+
})()`;
|
|
39
|
+
function detailUrlFor(pubNo) {
|
|
40
|
+
const stripped = pubNo.replace(/^CA[-]?/, "");
|
|
41
|
+
return `https://cipo.ic.gc.ca/opic-cipo/cpd/eng/patent/${encodeURIComponent(stripped)}/summary.html`;
|
|
42
|
+
}
|
|
43
|
+
export async function runCipoGet(kwargs) {
|
|
44
|
+
const pubNo = String(kwargs.publication_number ?? "").trim();
|
|
45
|
+
if (pubNo.length === 0) {
|
|
46
|
+
return [
|
|
47
|
+
{
|
|
48
|
+
envelope: cipoEnvelope("PATENT_INVALID_NUMBER", ADAPTER_PATH, "validate", "cipo get requires a non-empty publication_number"),
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
const url = detailUrlFor(pubNo);
|
|
53
|
+
let detail;
|
|
54
|
+
try {
|
|
55
|
+
const result = await cipoNavigateAndExtract(url, DETAIL_EXTRACTOR);
|
|
56
|
+
if (!result.data) {
|
|
57
|
+
return [
|
|
58
|
+
{
|
|
59
|
+
envelope: cipoEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "cipo detail evaluate returned no data"),
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
detail = result.data;
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
if (err instanceof TransportError) {
|
|
67
|
+
return [
|
|
68
|
+
{
|
|
69
|
+
envelope: transportErrorToCipoEnvelope(err, ADAPTER_PATH, "navigate"),
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
}
|
|
73
|
+
throw err;
|
|
74
|
+
}
|
|
75
|
+
if (!detail.publication_number && !detail.title) {
|
|
76
|
+
return [
|
|
77
|
+
{
|
|
78
|
+
envelope: cipoEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "evaluate", `cipo detail page for "${pubNo}" yielded no bibliographic fields`, ["uspto", "epo"]),
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
}
|
|
82
|
+
const rawPubNo = detail.publication_number || pubNo;
|
|
83
|
+
const canonicalPubNo = /^CA[-]?/.test(rawPubNo) ? rawPubNo : `CA${rawPubNo}`;
|
|
84
|
+
try {
|
|
85
|
+
return [
|
|
86
|
+
assemblePatentRecord({
|
|
87
|
+
publication_number: canonicalPubNo,
|
|
88
|
+
application_number: detail.application_number || undefined,
|
|
89
|
+
title: detail.title || undefined,
|
|
90
|
+
abstract: detail.abstract || undefined,
|
|
91
|
+
assignees: detail.applicant
|
|
92
|
+
? [{ name: detail.applicant, country: "CA" }]
|
|
93
|
+
: undefined,
|
|
94
|
+
inventors: detail.inventor
|
|
95
|
+
? [{ name: detail.inventor, country: "CA" }]
|
|
96
|
+
: undefined,
|
|
97
|
+
publication_date: detail.publication_date || undefined,
|
|
98
|
+
filing_date: detail.filing_date || undefined,
|
|
99
|
+
grant_date: detail.grant_date || undefined,
|
|
100
|
+
source_adapter: "cipo",
|
|
101
|
+
source_url: detail.source_url || url,
|
|
102
|
+
}),
|
|
103
|
+
];
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return [
|
|
107
|
+
{
|
|
108
|
+
envelope: cipoEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "normalize", `cipo detail page for "${pubNo}" did not yield a valid publication_number`, ["uspto"]),
|
|
109
|
+
},
|
|
110
|
+
];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
cli({
|
|
114
|
+
site: "cipo",
|
|
115
|
+
name: "get",
|
|
116
|
+
description: "Retrieve a single Canadian patent document (CIPO, browser)",
|
|
117
|
+
domain: "cipo.ic.gc.ca",
|
|
118
|
+
strategy: Strategy.PUBLIC,
|
|
119
|
+
adapter_path: ADAPTER_PATH,
|
|
120
|
+
args: [
|
|
121
|
+
{
|
|
122
|
+
name: "publication_number",
|
|
123
|
+
type: "str",
|
|
124
|
+
required: true,
|
|
125
|
+
positional: true,
|
|
126
|
+
description: "CA publication number (with or without CA prefix)",
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
columns: [
|
|
130
|
+
"publication_number",
|
|
131
|
+
"title",
|
|
132
|
+
"publication_date",
|
|
133
|
+
"grant_date",
|
|
134
|
+
"source_url",
|
|
135
|
+
],
|
|
136
|
+
capabilities: ["mcp-browser.navigate", "mcp-browser.evaluate", "patent.get"],
|
|
137
|
+
minimum_capability: "mcp-browser.evaluate",
|
|
138
|
+
func: async (_page, kwargs) => runCipoGet(kwargs),
|
|
139
|
+
});
|
|
140
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/adapters/cipo/get.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::cipo::legal-status
|
|
3
|
+
* @does Browser-driven CIPO legal-status / prosecution timeline lookup; emits the most recent administrative-status field from the CPD admin tab.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/adapters/cipo/_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 verbatim as CIPO displayed it
|
|
8
|
+
* @side-effects controls Chrome via MCP
|
|
9
|
+
* @perf single navigate + evaluate
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/cipo/search.test.ts (shared transport-error path)
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification browser-only
|
|
15
|
+
*/
|
|
16
|
+
export declare function runCipoLegalStatus(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/cipo/legal-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAqCH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,kBAAkB,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAmErB"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::cipo::legal-status
|
|
3
|
+
* @does Browser-driven CIPO legal-status / prosecution timeline lookup; emits the most recent administrative-status field from the CPD admin tab.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/adapters/cipo/_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 verbatim as CIPO displayed it
|
|
8
|
+
* @side-effects controls Chrome via MCP
|
|
9
|
+
* @perf single navigate + evaluate
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/cipo/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 { cipoEnvelope, cipoNavigateAndExtract, transportErrorToCipoEnvelope, } from "./_shared.js";
|
|
19
|
+
const ADAPTER_PATH = "src/adapters/cipo/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('.patent-number, [data-field="patentNo"]'),
|
|
27
|
+
legal_status: text('.admin-status, [data-field="adminStatus"]'),
|
|
28
|
+
status_date: text('.status-date, [data-field="statusDate"]'),
|
|
29
|
+
source_url: location.href,
|
|
30
|
+
};
|
|
31
|
+
})()`;
|
|
32
|
+
function legalUrlFor(pubNo) {
|
|
33
|
+
const stripped = pubNo.replace(/^CA[-]?/, "");
|
|
34
|
+
return `https://cipo.ic.gc.ca/opic-cipo/cpd/eng/patent/${encodeURIComponent(stripped)}/admin.html`;
|
|
35
|
+
}
|
|
36
|
+
export async function runCipoLegalStatus(kwargs) {
|
|
37
|
+
const pubNo = String(kwargs.publication_number ?? "").trim();
|
|
38
|
+
if (pubNo.length === 0) {
|
|
39
|
+
return [
|
|
40
|
+
{
|
|
41
|
+
envelope: cipoEnvelope("PATENT_INVALID_NUMBER", ADAPTER_PATH, "validate", "cipo legal-status requires a non-empty publication_number"),
|
|
42
|
+
},
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
const url = legalUrlFor(pubNo);
|
|
46
|
+
let detail;
|
|
47
|
+
try {
|
|
48
|
+
const result = await cipoNavigateAndExtract(url, EXTRACTOR);
|
|
49
|
+
if (!result.data) {
|
|
50
|
+
return [
|
|
51
|
+
{
|
|
52
|
+
envelope: cipoEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "cipo legal-status evaluate returned no data"),
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
}
|
|
56
|
+
detail = result.data;
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
if (err instanceof TransportError) {
|
|
60
|
+
return [
|
|
61
|
+
{
|
|
62
|
+
envelope: transportErrorToCipoEnvelope(err, ADAPTER_PATH, "navigate"),
|
|
63
|
+
},
|
|
64
|
+
];
|
|
65
|
+
}
|
|
66
|
+
throw err;
|
|
67
|
+
}
|
|
68
|
+
if (!detail.legal_status) {
|
|
69
|
+
return [
|
|
70
|
+
{
|
|
71
|
+
envelope: cipoEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "evaluate", `cipo returned no admin/legal-status for "${pubNo}"`, ["uspto", "epo"]),
|
|
72
|
+
},
|
|
73
|
+
];
|
|
74
|
+
}
|
|
75
|
+
return [
|
|
76
|
+
{
|
|
77
|
+
publication_number: detail.publication_number || pubNo,
|
|
78
|
+
legal_status: detail.legal_status,
|
|
79
|
+
status_date: detail.status_date,
|
|
80
|
+
source_adapter: "cipo",
|
|
81
|
+
source_url: detail.source_url || url,
|
|
82
|
+
retrieved_at: new Date().toISOString(),
|
|
83
|
+
},
|
|
84
|
+
];
|
|
85
|
+
}
|
|
86
|
+
cli({
|
|
87
|
+
site: "cipo",
|
|
88
|
+
name: "legal-status",
|
|
89
|
+
description: "CIPO Canadian patent administrative-status lookup (browser)",
|
|
90
|
+
domain: "cipo.ic.gc.ca",
|
|
91
|
+
strategy: Strategy.PUBLIC,
|
|
92
|
+
adapter_path: ADAPTER_PATH,
|
|
93
|
+
args: [
|
|
94
|
+
{
|
|
95
|
+
name: "publication_number",
|
|
96
|
+
type: "str",
|
|
97
|
+
required: true,
|
|
98
|
+
positional: true,
|
|
99
|
+
description: "CA publication number",
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
columns: ["publication_number", "legal_status", "status_date", "source_url"],
|
|
103
|
+
capabilities: [
|
|
104
|
+
"mcp-browser.navigate",
|
|
105
|
+
"mcp-browser.evaluate",
|
|
106
|
+
"patent.legal-status",
|
|
107
|
+
],
|
|
108
|
+
minimum_capability: "mcp-browser.evaluate",
|
|
109
|
+
func: async (_page, kwargs) => runCipoLegalStatus(kwargs),
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=legal-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legal-status.js","sourceRoot":"","sources":["../../../src/adapters/cipo/legal-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::cipo::search
|
|
3
|
+
* @does Browser-driven search of the Canadian Patents Database at cipo.ic.gc.ca/opic-cipo/cpd/eng/ — CIPO exposes no general open API for the patents corpus, so the browser route is the only programmatic surface.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/cipo/_shared.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.search)
|
|
6
|
+
* @breaks PATENT_UNSUPPORTED_QUERY (empty), PATENT_NOT_FOUND (empty result), PATENT_API_DEPRECATED with MCP_BUS_MISSING (no outbound MCP transport)
|
|
7
|
+
* @invariants rows are canonical PatentRecord; source_adapter='cipo'
|
|
8
|
+
* @side-effects controls Chrome via MCP
|
|
9
|
+
* @perf single navigate + evaluate
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/cipo/search.test.ts
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification browser-only
|
|
15
|
+
*/
|
|
16
|
+
export declare function runCipoSearch(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/cipo/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAgDH,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAgGrB"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::cipo::search
|
|
3
|
+
* @does Browser-driven search of the Canadian Patents Database at cipo.ic.gc.ca/opic-cipo/cpd/eng/ — CIPO exposes no general open API for the patents corpus, so the browser route is the only programmatic surface.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/cipo/_shared.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.search)
|
|
6
|
+
* @breaks PATENT_UNSUPPORTED_QUERY (empty), PATENT_NOT_FOUND (empty result), PATENT_API_DEPRECATED with MCP_BUS_MISSING (no outbound MCP transport)
|
|
7
|
+
* @invariants rows are canonical PatentRecord; source_adapter='cipo'
|
|
8
|
+
* @side-effects controls Chrome via MCP
|
|
9
|
+
* @perf single navigate + evaluate
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/cipo/search.test.ts
|
|
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 { cipoEnvelope, cipoNavigateAndExtract, transportErrorToCipoEnvelope, } from "./_shared.js";
|
|
20
|
+
const ADAPTER_PATH = "src/adapters/cipo/search.ts";
|
|
21
|
+
const CIPO_SEARCH_URL = "https://cipo.ic.gc.ca/opic-cipo/cpd/eng/search/basic.html";
|
|
22
|
+
const EXTRACTOR = `(() => {
|
|
23
|
+
const rows = Array.from(
|
|
24
|
+
document.querySelectorAll('table.results tr.result-row, .search-results .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/"], a[href]');
|
|
31
|
+
return {
|
|
32
|
+
publication_number: text('.patent-number, td.patent-no, [data-field="patentNo"]'),
|
|
33
|
+
title: text('.patent-title, td.title, [data-field="title"]'),
|
|
34
|
+
applicant: text('.applicant-name, td.applicant, [data-field="applicant"]'),
|
|
35
|
+
publication_date: text('.publication-date, td.pubDate, [data-field="pubDate"]'),
|
|
36
|
+
source_url: linkEl ? linkEl.href : '',
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
return { rows };
|
|
40
|
+
})()`;
|
|
41
|
+
function buildSearchUrl(query) {
|
|
42
|
+
const params = new URLSearchParams({ search: query });
|
|
43
|
+
return `${CIPO_SEARCH_URL}?${params.toString()}`;
|
|
44
|
+
}
|
|
45
|
+
export async function runCipoSearch(kwargs) {
|
|
46
|
+
const limit = typeof kwargs.limit === "number" && Number.isFinite(kwargs.limit)
|
|
47
|
+
? Math.max(1, Math.min(100, Math.floor(kwargs.limit)))
|
|
48
|
+
: 25;
|
|
49
|
+
const query = String(kwargs.query ?? "").trim();
|
|
50
|
+
if (query.length === 0) {
|
|
51
|
+
return [
|
|
52
|
+
{
|
|
53
|
+
envelope: cipoEnvelope("PATENT_UNSUPPORTED_QUERY", ADAPTER_PATH, "validate", "cipo search requires a non-empty query"),
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
const url = buildSearchUrl(query);
|
|
58
|
+
let extract;
|
|
59
|
+
try {
|
|
60
|
+
const result = await cipoNavigateAndExtract(url, EXTRACTOR);
|
|
61
|
+
if (!result.data) {
|
|
62
|
+
return [
|
|
63
|
+
{
|
|
64
|
+
envelope: cipoEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "cipo evaluate returned no data; selector schema likely changed"),
|
|
65
|
+
},
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
extract = result.data;
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
if (err instanceof TransportError) {
|
|
72
|
+
return [
|
|
73
|
+
{
|
|
74
|
+
envelope: transportErrorToCipoEnvelope(err, ADAPTER_PATH, "navigate"),
|
|
75
|
+
},
|
|
76
|
+
];
|
|
77
|
+
}
|
|
78
|
+
throw err;
|
|
79
|
+
}
|
|
80
|
+
if (extract.rows.length === 0) {
|
|
81
|
+
return [
|
|
82
|
+
{
|
|
83
|
+
envelope: cipoEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "evaluate", `cipo returned no rows for query "${query}"`, ["uspto", "epo"]),
|
|
84
|
+
},
|
|
85
|
+
];
|
|
86
|
+
}
|
|
87
|
+
const out = [];
|
|
88
|
+
for (const row of extract.rows.slice(0, limit)) {
|
|
89
|
+
if (!row.publication_number)
|
|
90
|
+
continue;
|
|
91
|
+
const normalizedPub = /^CA[-]?/.test(row.publication_number)
|
|
92
|
+
? row.publication_number
|
|
93
|
+
: `CA${row.publication_number}`;
|
|
94
|
+
try {
|
|
95
|
+
out.push(assemblePatentRecord({
|
|
96
|
+
publication_number: normalizedPub,
|
|
97
|
+
title: row.title || undefined,
|
|
98
|
+
assignees: row.applicant
|
|
99
|
+
? [{ name: row.applicant, country: "CA" }]
|
|
100
|
+
: undefined,
|
|
101
|
+
publication_date: row.publication_date || undefined,
|
|
102
|
+
source_adapter: "cipo",
|
|
103
|
+
source_url: row.source_url || url,
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Skip malformed rows.
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (out.length === 0) {
|
|
111
|
+
out.push({
|
|
112
|
+
envelope: cipoEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "normalize", "cipo returned rows but none carried a valid publication_number", ["uspto"]),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
cli({
|
|
118
|
+
site: "cipo",
|
|
119
|
+
name: "search",
|
|
120
|
+
description: "Search the Canadian Patents Database (CIPO, browser, no API)",
|
|
121
|
+
domain: "cipo.ic.gc.ca",
|
|
122
|
+
strategy: Strategy.PUBLIC,
|
|
123
|
+
adapter_path: ADAPTER_PATH,
|
|
124
|
+
args: [
|
|
125
|
+
{
|
|
126
|
+
name: "query",
|
|
127
|
+
type: "str",
|
|
128
|
+
required: true,
|
|
129
|
+
positional: true,
|
|
130
|
+
description: "Free-text query — matched on title/abstract/applicant",
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
name: "limit",
|
|
134
|
+
type: "int",
|
|
135
|
+
default: 25,
|
|
136
|
+
description: "Max results (1-100)",
|
|
137
|
+
},
|
|
138
|
+
],
|
|
139
|
+
columns: ["publication_number", "title", "publication_date", "source_url"],
|
|
140
|
+
capabilities: [
|
|
141
|
+
"mcp-browser.navigate",
|
|
142
|
+
"mcp-browser.evaluate",
|
|
143
|
+
"patent.search",
|
|
144
|
+
],
|
|
145
|
+
minimum_capability: "mcp-browser.evaluate",
|
|
146
|
+
func: async (_page, kwargs) => runCipoSearch(kwargs),
|
|
147
|
+
});
|
|
148
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/adapters/cipo/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::cnipa::_shared
|
|
3
|
+
* @does Shared helpers for CNIPA browser-driven adapter commands — emits structured PATENT_BROWSER_CAPTCHA / MCP_BUS_MISSING / PATENT_NOT_FOUND error rows so adapters never synthesize results from a failed page.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/types/patent.ts
|
|
5
|
+
* @feeds src/adapters/cnipa/search.ts, src/adapters/cnipa/get.ts, src/adapters/cnipa/legal-status.ts
|
|
6
|
+
* @breaks none — pure helpers; bubble TransportError out to the registry func contract
|
|
7
|
+
* @invariants every error path maps to a PatentEnvelope with adapter_path stamped; no silent fallbacks
|
|
8
|
+
* @side-effects none
|
|
9
|
+
* @perf n/a
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test covered transitively by src/adapters/cnipa/*.test.ts
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification browser-only
|
|
15
|
+
*/
|
|
16
|
+
import { TransportError, type McpBrowserResult } from "../../engine/transport/mcp-browser.js";
|
|
17
|
+
import type { PatentEnvelope, PatentErrorCode } from "../../types/patent.js";
|
|
18
|
+
export interface CnipaErrorRow {
|
|
19
|
+
publication_number: string;
|
|
20
|
+
title: string;
|
|
21
|
+
envelope: PatentEnvelope;
|
|
22
|
+
}
|
|
23
|
+
export declare function cnipaEnvelope(code: PatentErrorCode, adapter_path: string, step: string, suggestion: string, alternatives?: string[]): PatentEnvelope;
|
|
24
|
+
/**
|
|
25
|
+
* Wrap a TransportError from mcp-browser into a PatentEnvelope row.
|
|
26
|
+
* MCP_BUS_MISSING is the production state today — surfaced honestly so the
|
|
27
|
+
* agent's repair loop knows the engine is missing the outbound MCP transport.
|
|
28
|
+
*/
|
|
29
|
+
export declare function transportErrorToEnvelope(err: TransportError, adapter_path: string, step: string): PatentEnvelope;
|
|
30
|
+
/**
|
|
31
|
+
* Navigate then evaluate a DOM-extraction expression. Returns the evaluate
|
|
32
|
+
* result on the happy path, or throws a TransportError with a structured
|
|
33
|
+
* code so callers map to a PatentEnvelope row.
|
|
34
|
+
*
|
|
35
|
+
* Adapters MUST treat the result as untrusted and validate shape before
|
|
36
|
+
* normalization — captcha pages tend to return zero-length arrays without
|
|
37
|
+
* throwing.
|
|
38
|
+
*/
|
|
39
|
+
export declare function navigateAndExtract<T>(url: string, expression: string): Promise<McpBrowserResult<T>>;
|
|
40
|
+
/**
|
|
41
|
+
* Heuristic — CNIPA public-search captcha is a 验证码 iframe. When the
|
|
42
|
+
* evaluator returns a zero-length result array, the safest assumption is
|
|
43
|
+
* captcha; emit a structured envelope rather than a "no results" message
|
|
44
|
+
* the agent cannot disambiguate.
|
|
45
|
+
*/
|
|
46
|
+
export declare function looksLikeCaptcha(rowCount: number, htmlMarker?: string): boolean;
|
|
47
|
+
//# sourceMappingURL=_shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../../src/adapters/cnipa/_shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,cAAc,EAId,KAAK,gBAAgB,EACtB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7E,MAAM,WAAW,aAAa;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,eAAe,EACrB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,YAAY,GAAE,MAAM,EAAO,GAC1B,cAAc,CAShB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,cAAc,EACnB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACX,cAAc,CAoBhB;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAyB9B;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAST"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::cnipa::_shared
|
|
3
|
+
* @does Shared helpers for CNIPA browser-driven adapter commands — emits structured PATENT_BROWSER_CAPTCHA / MCP_BUS_MISSING / PATENT_NOT_FOUND error rows so adapters never synthesize results from a failed page.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/types/patent.ts
|
|
5
|
+
* @feeds src/adapters/cnipa/search.ts, src/adapters/cnipa/get.ts, src/adapters/cnipa/legal-status.ts
|
|
6
|
+
* @breaks none — pure helpers; bubble TransportError out to the registry func contract
|
|
7
|
+
* @invariants every error path maps to a PatentEnvelope with adapter_path stamped; no silent fallbacks
|
|
8
|
+
* @side-effects none
|
|
9
|
+
* @perf n/a
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test covered transitively by src/adapters/cnipa/*.test.ts
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification browser-only
|
|
15
|
+
*/
|
|
16
|
+
import { TransportError, initMcpBrowserTransport, mcpBrowserEvaluate, mcpBrowserNavigate, } from "../../engine/transport/mcp-browser.js";
|
|
17
|
+
import { buildPatentEnvelope } from "../../engine/normalizer/patent-envelope.js";
|
|
18
|
+
export function cnipaEnvelope(code, adapter_path, step, suggestion, alternatives = []) {
|
|
19
|
+
return buildPatentEnvelope({
|
|
20
|
+
code,
|
|
21
|
+
adapter_path,
|
|
22
|
+
step,
|
|
23
|
+
suggestion,
|
|
24
|
+
alternatives,
|
|
25
|
+
retryable: code === "PATENT_BROWSER_CAPTCHA" ? true : false,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Wrap a TransportError from mcp-browser into a PatentEnvelope row.
|
|
30
|
+
* MCP_BUS_MISSING is the production state today — surfaced honestly so the
|
|
31
|
+
* agent's repair loop knows the engine is missing the outbound MCP transport.
|
|
32
|
+
*/
|
|
33
|
+
export function transportErrorToEnvelope(err, adapter_path, step) {
|
|
34
|
+
if (err.code === "MCP_BUS_MISSING") {
|
|
35
|
+
return buildPatentEnvelope({
|
|
36
|
+
code: "PATENT_API_DEPRECATED",
|
|
37
|
+
adapter_path,
|
|
38
|
+
step,
|
|
39
|
+
suggestion: "engine has no outbound MCP transport wired into the bus today; install an McpResolver via src/engine/transport/mcp-browser.installMcpResolver() before invoking this adapter, or try a non-browser source first",
|
|
40
|
+
alternatives: ["uspto", "epo", "lens"],
|
|
41
|
+
retryable: false,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return buildPatentEnvelope({
|
|
45
|
+
code: "PATENT_API_DEPRECATED",
|
|
46
|
+
adapter_path,
|
|
47
|
+
step,
|
|
48
|
+
suggestion: `mcp-browser transport error (${err.code}): ${err.message}`,
|
|
49
|
+
alternatives: ["uspto", "epo"],
|
|
50
|
+
retryable: false,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Navigate then evaluate a DOM-extraction expression. Returns the evaluate
|
|
55
|
+
* result on the happy path, or throws a TransportError with a structured
|
|
56
|
+
* code so callers map to a PatentEnvelope row.
|
|
57
|
+
*
|
|
58
|
+
* Adapters MUST treat the result as untrusted and validate shape before
|
|
59
|
+
* normalization — captcha pages tend to return zero-length arrays without
|
|
60
|
+
* throwing.
|
|
61
|
+
*/
|
|
62
|
+
export async function navigateAndExtract(url, expression) {
|
|
63
|
+
const init = await initMcpBrowserTransport();
|
|
64
|
+
if (init.active_server === "none") {
|
|
65
|
+
const code = init.reason === "bus-missing" ? "MCP_BUS_MISSING" : "MCP_NO_SERVER";
|
|
66
|
+
throw new TransportError(code, `mcp-browser unavailable (${init.reason})`);
|
|
67
|
+
}
|
|
68
|
+
const navResult = await mcpBrowserNavigate({ url });
|
|
69
|
+
if (!navResult.ok) {
|
|
70
|
+
throw new TransportError(navResult.code ?? "MCP_NAVIGATE_FAILED", navResult.message ?? "navigate did not succeed");
|
|
71
|
+
}
|
|
72
|
+
const evalResult = await mcpBrowserEvaluate({
|
|
73
|
+
expression,
|
|
74
|
+
tab: navResult.tab,
|
|
75
|
+
});
|
|
76
|
+
if (!evalResult.ok) {
|
|
77
|
+
throw new TransportError(evalResult.code ?? "MCP_EVALUATE_FAILED", evalResult.message ?? "evaluate did not succeed");
|
|
78
|
+
}
|
|
79
|
+
return evalResult;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Heuristic — CNIPA public-search captcha is a 验证码 iframe. When the
|
|
83
|
+
* evaluator returns a zero-length result array, the safest assumption is
|
|
84
|
+
* captcha; emit a structured envelope rather than a "no results" message
|
|
85
|
+
* the agent cannot disambiguate.
|
|
86
|
+
*/
|
|
87
|
+
export function looksLikeCaptcha(rowCount, htmlMarker) {
|
|
88
|
+
if (rowCount > 0)
|
|
89
|
+
return false;
|
|
90
|
+
if (!htmlMarker)
|
|
91
|
+
return true; // empty result on a browser path = assume captcha
|
|
92
|
+
const lowered = htmlMarker.toLowerCase();
|
|
93
|
+
return (lowered.includes("captcha") ||
|
|
94
|
+
lowered.includes("验证码") ||
|
|
95
|
+
lowered.includes("verifycode"));
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=_shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_shared.js","sourceRoot":"","sources":["../../../src/adapters/cnipa/_shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::cnipa::get
|
|
3
|
+
* @does Browser-driven retrieval of a single CNIPA patent document by publication number; loads the detail page through the mcp-browser transport and extracts the bibliographic fields into a PatentRecord.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/cnipa/_shared.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.get)
|
|
6
|
+
* @breaks emits PATENT_INVALID_NUMBER when input is empty or fails canonicalization; emits PATENT_NOT_FOUND when the detail page returns no fields; PATENT_BROWSER_CAPTCHA when the page is captcha-gated; PATENT_API_DEPRECATED with MCP_BUS_MISSING context when no outbound MCP transport is registered
|
|
7
|
+
* @invariants output is a single PatentRecord row when the upstream answers; never falls back to a stub record
|
|
8
|
+
* @side-effects controls the user's Chrome via MCP
|
|
9
|
+
* @perf single navigate + one evaluate
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/cnipa/search.test.ts (transport-error path) — get-specific tests deferred to integration
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification browser-only
|
|
15
|
+
*/
|
|
16
|
+
export declare function runCnipaGet(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/cnipa/get.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAsDH,wBAAsB,WAAW,CAAC,MAAM,EAAE;IACxC,kBAAkB,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAmGrB"}
|