@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,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::google-patents-web::search
|
|
3
|
+
* @does Keyless free-text patent search via the public XHR endpoint that drives patents.google.com — distinct from src/adapters/google-patents-bq which talks to BigQuery and needs a billed GCP project.
|
|
4
|
+
* @needs src/adapters/google-patents-web/_shared.ts, src/engine/normalizer/patent-envelope.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.search)
|
|
6
|
+
* @breaks PATENT_API_DEPRECATED with status code embedded when the XHR returns non-2xx (typically 403 → suspected UA gating); PATENT_NOT_FOUND on empty result; PATENT_SCHEMA_DRIFT when the JSON shape no longer carries results.cluster[].result[]
|
|
7
|
+
* @invariants output rows are canonical PatentRecord; source_adapter='google-patents-web'; results are server-ordered (Google's relevance ranking)
|
|
8
|
+
* @side-effects HTTPS egress to patents.google.com only — no env reads, no cookies, no auth
|
|
9
|
+
* @perf single XHR request, ~40-100 KB; results capped at min(limit, 100) per call
|
|
10
|
+
* @concurrency safe — stateless
|
|
11
|
+
* @test verification proof captured in docs/skills/patent-cookbook.md (recipe: day-zero search)
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification keyless-best-effort — Google does not publish a stability contract for this XHR; we live-call it from the same User-Agent the public site uses
|
|
15
|
+
*/
|
|
16
|
+
import { cli, Strategy } from "../../registry.js";
|
|
17
|
+
import { assemblePatentRecord } from "../../engine/normalizer/patent-envelope.js";
|
|
18
|
+
import { buildPatentEnvelope } from "../../engine/normalizer/patent-envelope.js";
|
|
19
|
+
import { GooglePatentsHttpError, buildGooglePatentsXhrUrl, fetchGooglePatentsJson, flattenGoogleXhrResults, projectGoogleRowToRecord, } from "./_shared.js";
|
|
20
|
+
const ADAPTER_PATH = "src/adapters/google-patents-web/search.ts";
|
|
21
|
+
function clampLimit(raw) {
|
|
22
|
+
const num = typeof raw === "number" ? raw : Number(raw);
|
|
23
|
+
if (!Number.isFinite(num) || num <= 0)
|
|
24
|
+
return 25;
|
|
25
|
+
return Math.min(100, Math.max(1, Math.floor(num)));
|
|
26
|
+
}
|
|
27
|
+
function normaliseSince(raw) {
|
|
28
|
+
if (typeof raw !== "string")
|
|
29
|
+
return undefined;
|
|
30
|
+
const trimmed = raw.trim();
|
|
31
|
+
return /^\d{4}$/.test(trimmed) ? trimmed : undefined;
|
|
32
|
+
}
|
|
33
|
+
export async function runGooglePatentsWebSearch(kwargs) {
|
|
34
|
+
const query = String(kwargs.query ?? "").trim();
|
|
35
|
+
if (query.length === 0) {
|
|
36
|
+
return [
|
|
37
|
+
{
|
|
38
|
+
envelope: buildPatentEnvelope({
|
|
39
|
+
code: "PATENT_UNSUPPORTED_QUERY",
|
|
40
|
+
adapter_path: ADAPTER_PATH,
|
|
41
|
+
step: "validate",
|
|
42
|
+
suggestion: "google-patents-web search requires a non-empty query",
|
|
43
|
+
alternatives: ["freepatentsonline-web"],
|
|
44
|
+
}),
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
}
|
|
48
|
+
const limit = clampLimit(kwargs.limit);
|
|
49
|
+
const since = normaliseSince(kwargs.since);
|
|
50
|
+
const url = buildGooglePatentsXhrUrl(query, limit, since);
|
|
51
|
+
let body;
|
|
52
|
+
try {
|
|
53
|
+
body = await fetchGooglePatentsJson(url);
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
if (err instanceof GooglePatentsHttpError) {
|
|
57
|
+
return [
|
|
58
|
+
{
|
|
59
|
+
envelope: buildPatentEnvelope({
|
|
60
|
+
code: err.status === 429
|
|
61
|
+
? "PATENT_RATE_LIMIT"
|
|
62
|
+
: err.status === 403
|
|
63
|
+
? "PATENT_REGION_BLOCKED"
|
|
64
|
+
: "PATENT_API_DEPRECATED",
|
|
65
|
+
adapter_path: ADAPTER_PATH,
|
|
66
|
+
step: "fetch",
|
|
67
|
+
suggestion: `Google Patents XHR returned HTTP ${err.status} for ${err.url}; retry with --sources freepatentsonline-web, or check if Google now requires a session cookie`,
|
|
68
|
+
alternatives: ["freepatentsonline-web", "espacenet"],
|
|
69
|
+
retryable: err.status === 429,
|
|
70
|
+
}),
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
}
|
|
74
|
+
throw err;
|
|
75
|
+
}
|
|
76
|
+
const rows = flattenGoogleXhrResults(body);
|
|
77
|
+
if (rows.length === 0) {
|
|
78
|
+
if (!body.results || !Array.isArray(body.results.cluster)) {
|
|
79
|
+
return [
|
|
80
|
+
{
|
|
81
|
+
envelope: buildPatentEnvelope({
|
|
82
|
+
code: "PATENT_SCHEMA_DRIFT",
|
|
83
|
+
adapter_path: ADAPTER_PATH,
|
|
84
|
+
step: "select",
|
|
85
|
+
suggestion: "Google Patents XHR no longer carries results.cluster[].result[]; the adapter's flattenGoogleXhrResults projection needs updating",
|
|
86
|
+
alternatives: ["freepatentsonline-web"],
|
|
87
|
+
}),
|
|
88
|
+
},
|
|
89
|
+
];
|
|
90
|
+
}
|
|
91
|
+
return [
|
|
92
|
+
{
|
|
93
|
+
envelope: buildPatentEnvelope({
|
|
94
|
+
code: "PATENT_NOT_FOUND",
|
|
95
|
+
adapter_path: ADAPTER_PATH,
|
|
96
|
+
step: "select",
|
|
97
|
+
suggestion: `google-patents-web returned no rows for "${query}"`,
|
|
98
|
+
alternatives: ["freepatentsonline-web", "espacenet"],
|
|
99
|
+
}),
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
}
|
|
103
|
+
const out = [];
|
|
104
|
+
for (const row of rows.slice(0, limit)) {
|
|
105
|
+
const partial = projectGoogleRowToRecord(row, url);
|
|
106
|
+
if (!partial.publication_number)
|
|
107
|
+
continue;
|
|
108
|
+
try {
|
|
109
|
+
out.push(assemblePatentRecord(partial));
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Rows whose publication_number cannot be canonicalised are skipped
|
|
113
|
+
// rather than synthesised — we never invent ST.16 fields.
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (out.length === 0) {
|
|
117
|
+
return [
|
|
118
|
+
{
|
|
119
|
+
envelope: buildPatentEnvelope({
|
|
120
|
+
code: "PATENT_NOT_FOUND",
|
|
121
|
+
adapter_path: ADAPTER_PATH,
|
|
122
|
+
step: "normalize",
|
|
123
|
+
suggestion: `google-patents-web returned ${rows.length} rows but none carried a canonicalisable publication_number`,
|
|
124
|
+
alternatives: ["freepatentsonline-web", "espacenet"],
|
|
125
|
+
}),
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
}
|
|
129
|
+
return out;
|
|
130
|
+
}
|
|
131
|
+
cli({
|
|
132
|
+
site: "google-patents-web",
|
|
133
|
+
name: "search",
|
|
134
|
+
description: "Keyless Google Patents search via the public XHR endpoint (no API key, no Chrome required)",
|
|
135
|
+
domain: "patents.google.com",
|
|
136
|
+
strategy: Strategy.PUBLIC,
|
|
137
|
+
adapter_path: ADAPTER_PATH,
|
|
138
|
+
args: [
|
|
139
|
+
{
|
|
140
|
+
name: "query",
|
|
141
|
+
type: "str",
|
|
142
|
+
required: true,
|
|
143
|
+
positional: true,
|
|
144
|
+
description: "Free-text query (Google Patents smart-search syntax)",
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
name: "limit",
|
|
148
|
+
type: "int",
|
|
149
|
+
default: 25,
|
|
150
|
+
description: "Max results to return (1-100)",
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: "since",
|
|
154
|
+
type: "str",
|
|
155
|
+
description: "Earliest publication year (YYYY); translated to after:publication:YYYY0101",
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
columns: [
|
|
159
|
+
"publication_number",
|
|
160
|
+
"title",
|
|
161
|
+
"publication_date",
|
|
162
|
+
"assignees",
|
|
163
|
+
"source_url",
|
|
164
|
+
],
|
|
165
|
+
capabilities: ["http.fetch", "patent.search"],
|
|
166
|
+
minimum_capability: "http.fetch",
|
|
167
|
+
func: async (_page, kwargs) => runGooglePatentsWebSearch(kwargs),
|
|
168
|
+
});
|
|
169
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/adapters/google-patents-web/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACjF,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,GAEzB,MAAM,cAAc,CAAC;AAEtB,MAAM,YAAY,GAAG,2CAA2C,CAAC;AAQjE,SAAS,UAAU,CAAC,GAAY;IAC9B,MAAM,GAAG,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAAkB;IAElB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL;gBACE,QAAQ,EAAE,mBAAmB,CAAC;oBAC5B,IAAI,EAAE,0BAA0B;oBAChC,YAAY,EAAE,YAAY;oBAC1B,IAAI,EAAE,UAAU;oBAChB,UAAU,EAAE,sDAAsD;oBAClE,YAAY,EAAE,CAAC,uBAAuB,CAAC;iBACxC,CAAC;aACH;SACF,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,wBAAwB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAE1D,IAAI,IAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,sBAAsB,CAAoB,GAAG,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,sBAAsB,EAAE,CAAC;YAC1C,OAAO;gBACL;oBACE,QAAQ,EAAE,mBAAmB,CAAC;wBAC5B,IAAI,EACF,GAAG,CAAC,MAAM,KAAK,GAAG;4BAChB,CAAC,CAAC,mBAAmB;4BACrB,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG;gCAClB,CAAC,CAAC,uBAAuB;gCACzB,CAAC,CAAC,uBAAuB;wBAC/B,YAAY,EAAE,YAAY;wBAC1B,IAAI,EAAE,OAAO;wBACb,UAAU,EAAE,oCAAoC,GAAG,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAG,gGAAgG;wBACzK,YAAY,EAAE,CAAC,uBAAuB,EAAE,WAAW,CAAC;wBACpD,SAAS,EAAE,GAAG,CAAC,MAAM,KAAK,GAAG;qBAC9B,CAAC;iBACH;aACF,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,OAAO;gBACL;oBACE,QAAQ,EAAE,mBAAmB,CAAC;wBAC5B,IAAI,EAAE,qBAAqB;wBAC3B,YAAY,EAAE,YAAY;wBAC1B,IAAI,EAAE,QAAQ;wBACd,UAAU,EACR,kIAAkI;wBACpI,YAAY,EAAE,CAAC,uBAAuB,CAAC;qBACxC,CAAC;iBACH;aACF,CAAC;QACJ,CAAC;QACD,OAAO;YACL;gBACE,QAAQ,EAAE,mBAAmB,CAAC;oBAC5B,IAAI,EAAE,kBAAkB;oBACxB,YAAY,EAAE,YAAY;oBAC1B,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,4CAA4C,KAAK,GAAG;oBAChE,YAAY,EAAE,CAAC,uBAAuB,EAAE,WAAW,CAAC;iBACrD,CAAC;aACH;SACF,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,wBAAwB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,kBAAkB;YAAE,SAAS;QAC1C,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CACN,oBAAoB,CAClB,OAAqD,CACtD,CACF,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;YACpE,0DAA0D;QAC5D,CAAC;IACH,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO;YACL;gBACE,QAAQ,EAAE,mBAAmB,CAAC;oBAC5B,IAAI,EAAE,kBAAkB;oBACxB,YAAY,EAAE,YAAY;oBAC1B,IAAI,EAAE,WAAW;oBACjB,UAAU,EAAE,+BAA+B,IAAI,CAAC,MAAM,6DAA6D;oBACnH,YAAY,EAAE,CAAC,uBAAuB,EAAE,WAAW,CAAC;iBACrD,CAAC;aACH;SACF,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,GAAG,CAAC;IACF,IAAI,EAAE,oBAAoB;IAC1B,IAAI,EAAE,QAAQ;IACd,WAAW,EACT,4FAA4F;IAC9F,MAAM,EAAE,oBAAoB;IAC5B,QAAQ,EAAE,QAAQ,CAAC,MAAM;IACzB,YAAY,EAAE,YAAY;IAC1B,IAAI,EAAE;QACJ;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,sDAAsD;SACpE;QACD;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,+BAA+B;SAC7C;QACD;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,KAAK;YACX,WAAW,EACT,4EAA4E;SAC/E;KACF;IACD,OAAO,EAAE;QACP,oBAAoB;QACpB,OAAO;QACP,kBAAkB;QAClB,WAAW;QACX,YAAY;KACb;IACD,YAAY,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC;IAC7C,kBAAkB,EAAE,YAAY;IAChC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAC5B,yBAAyB,CAAC,MAAoB,CAAC;CAClD,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::inpi-br::_shared
|
|
3
|
+
* @does Shared helpers for the INPI Brasil browser adapter — busca.inpi.gov.br/pePI/ has no programmatic API today (pre-API status); the browser route is the only path.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/types/patent.ts
|
|
5
|
+
* @feeds src/adapters/inpi-br/*.ts
|
|
6
|
+
* @breaks none — pure helpers
|
|
7
|
+
* @invariants every transport gap surfaces as a PatentEnvelope row
|
|
8
|
+
* @side-effects none
|
|
9
|
+
* @perf n/a
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test covered transitively
|
|
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 declare function inpiBrEnvelope(code: PatentErrorCode, adapter_path: string, step: string, suggestion: string, alternatives?: string[]): PatentEnvelope;
|
|
19
|
+
export declare function transportErrorToInpiBrEnvelope(err: TransportError, adapter_path: string, step: string): PatentEnvelope;
|
|
20
|
+
export declare function inpiBrNavigateAndExtract<T>(url: string, expression: string): Promise<McpBrowserResult<T>>;
|
|
21
|
+
//# sourceMappingURL=_shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../../src/adapters/inpi-br/_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,wBAAgB,cAAc,CAC5B,IAAI,EAAE,eAAe,EACrB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,YAAY,GAAE,MAAM,EAAO,GAC1B,cAAc,CAShB;AAED,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,cAAc,EACnB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACX,cAAc,CAoBhB;AAED,wBAAsB,wBAAwB,CAAC,CAAC,EAC9C,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAyB9B"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::inpi-br::_shared
|
|
3
|
+
* @does Shared helpers for the INPI Brasil browser adapter — busca.inpi.gov.br/pePI/ has no programmatic API today (pre-API status); the browser route is the only path.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/types/patent.ts
|
|
5
|
+
* @feeds src/adapters/inpi-br/*.ts
|
|
6
|
+
* @breaks none — pure helpers
|
|
7
|
+
* @invariants every transport gap surfaces as a PatentEnvelope row
|
|
8
|
+
* @side-effects none
|
|
9
|
+
* @perf n/a
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test covered transitively
|
|
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 inpiBrEnvelope(code, adapter_path, step, suggestion, alternatives = []) {
|
|
19
|
+
return buildPatentEnvelope({
|
|
20
|
+
code,
|
|
21
|
+
adapter_path,
|
|
22
|
+
step,
|
|
23
|
+
suggestion,
|
|
24
|
+
alternatives,
|
|
25
|
+
retryable: false,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
export function transportErrorToInpiBrEnvelope(err, adapter_path, step) {
|
|
29
|
+
if (err.code === "MCP_BUS_MISSING") {
|
|
30
|
+
return buildPatentEnvelope({
|
|
31
|
+
code: "PATENT_API_DEPRECATED",
|
|
32
|
+
adapter_path,
|
|
33
|
+
step,
|
|
34
|
+
suggestion: "engine has no outbound MCP transport wired into the bus today; INPI Brasil has no upstream API so the browser path is the only route — install an McpResolver to activate this adapter",
|
|
35
|
+
alternatives: ["espacenet", "lens"],
|
|
36
|
+
retryable: false,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return buildPatentEnvelope({
|
|
40
|
+
code: "PATENT_API_DEPRECATED",
|
|
41
|
+
adapter_path,
|
|
42
|
+
step,
|
|
43
|
+
suggestion: `mcp-browser transport error (${err.code}): ${err.message}`,
|
|
44
|
+
alternatives: ["espacenet"],
|
|
45
|
+
retryable: false,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
export async function inpiBrNavigateAndExtract(url, expression) {
|
|
49
|
+
const init = await initMcpBrowserTransport();
|
|
50
|
+
if (init.active_server === "none") {
|
|
51
|
+
const code = init.reason === "bus-missing" ? "MCP_BUS_MISSING" : "MCP_NO_SERVER";
|
|
52
|
+
throw new TransportError(code, `mcp-browser unavailable (${init.reason})`);
|
|
53
|
+
}
|
|
54
|
+
const navResult = await mcpBrowserNavigate({ url });
|
|
55
|
+
if (!navResult.ok) {
|
|
56
|
+
throw new TransportError(navResult.code ?? "MCP_NAVIGATE_FAILED", navResult.message ?? "navigate did not succeed");
|
|
57
|
+
}
|
|
58
|
+
const evalResult = await mcpBrowserEvaluate({
|
|
59
|
+
expression,
|
|
60
|
+
tab: navResult.tab,
|
|
61
|
+
});
|
|
62
|
+
if (!evalResult.ok) {
|
|
63
|
+
throw new TransportError(evalResult.code ?? "MCP_EVALUATE_FAILED", evalResult.message ?? "evaluate did not succeed");
|
|
64
|
+
}
|
|
65
|
+
return evalResult;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=_shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_shared.js","sourceRoot":"","sources":["../../../src/adapters/inpi-br/_shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,GAEnB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AAGjF,MAAM,UAAU,cAAc,CAC5B,IAAqB,EACrB,YAAoB,EACpB,IAAY,EACZ,UAAkB,EAClB,eAAyB,EAAE;IAE3B,OAAO,mBAAmB,CAAC;QACzB,IAAI;QACJ,YAAY;QACZ,IAAI;QACJ,UAAU;QACV,YAAY;QACZ,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,GAAmB,EACnB,YAAoB,EACpB,IAAY;IAEZ,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACnC,OAAO,mBAAmB,CAAC;YACzB,IAAI,EAAE,uBAAuB;YAC7B,YAAY;YACZ,IAAI;YACJ,UAAU,EACR,wLAAwL;YAC1L,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC;YACnC,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,mBAAmB,CAAC;QACzB,IAAI,EAAE,uBAAuB;QAC7B,YAAY;QACZ,IAAI;QACJ,UAAU,EAAE,gCAAgC,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE;QACvE,YAAY,EAAE,CAAC,WAAW,CAAC;QAC3B,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,GAAW,EACX,UAAkB;IAElB,MAAM,IAAI,GAAG,MAAM,uBAAuB,EAAE,CAAC;IAC7C,IAAI,IAAI,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;QAClC,MAAM,IAAI,GACR,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC;QACtE,MAAM,IAAI,cAAc,CAAC,IAAI,EAAE,4BAA4B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,cAAc,CACtB,SAAS,CAAC,IAAI,IAAI,qBAAqB,EACvC,SAAS,CAAC,OAAO,IAAI,0BAA0B,CAChD,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAI;QAC7C,UAAU;QACV,GAAG,EAAE,SAAS,CAAC,GAAG;KACnB,CAAC,CAAC;IACH,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,cAAc,CACtB,UAAU,CAAC,IAAI,IAAI,qBAAqB,EACxC,UAAU,CAAC,OAAO,IAAI,0BAA0B,CACjD,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::inpi-br::get
|
|
3
|
+
* @does Browser-driven retrieval of an INPI Brasil patent record by application/publication number; extracts the bibliographic block from the pePI detail page.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/inpi-br/_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/inpi-br/search.test.ts (shared transport-error path)
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification browser-only
|
|
15
|
+
*/
|
|
16
|
+
export declare function runInpiBrGet(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/inpi-br/get.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAoDH,wBAAsB,YAAY,CAAC,MAAM,EAAE;IACzC,kBAAkB,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CA+FrB"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::inpi-br::get
|
|
3
|
+
* @does Browser-driven retrieval of an INPI Brasil patent record by application/publication number; extracts the bibliographic block from the pePI detail page.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/inpi-br/_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/inpi-br/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 { assemblePatentRecord } from "../../engine/normalizer/patent-envelope.js";
|
|
19
|
+
import { inpiBrEnvelope, inpiBrNavigateAndExtract, transportErrorToInpiBrEnvelope, } from "./_shared.js";
|
|
20
|
+
const ADAPTER_PATH = "src/adapters/inpi-br/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-field="numPedido"], .num-pedido, td.numero'),
|
|
28
|
+
application_number: text('[data-field="numAplicacao"], .num-aplicacao'),
|
|
29
|
+
title: text('[data-field="titulo"], .titulo, h1'),
|
|
30
|
+
abstract: text('[data-field="resumo"], .resumo'),
|
|
31
|
+
applicant: text('[data-field="depositante"], .depositante'),
|
|
32
|
+
inventor: text('[data-field="inventor"], .inventor'),
|
|
33
|
+
publication_date: text('[data-field="dataPub"], .data-pub'),
|
|
34
|
+
filing_date: text('[data-field="dataDep"], .data-dep'),
|
|
35
|
+
source_url: location.href,
|
|
36
|
+
};
|
|
37
|
+
})()`;
|
|
38
|
+
function detailUrlFor(pubNo) {
|
|
39
|
+
const stripped = pubNo.replace(/^BR[-]?/, "");
|
|
40
|
+
const params = new URLSearchParams({
|
|
41
|
+
Action: "detail",
|
|
42
|
+
NumPedido: stripped,
|
|
43
|
+
});
|
|
44
|
+
return `https://busca.inpi.gov.br/pePI/servlet/PatenteServletController?${params.toString()}`;
|
|
45
|
+
}
|
|
46
|
+
export async function runInpiBrGet(kwargs) {
|
|
47
|
+
const pubNo = String(kwargs.publication_number ?? "").trim();
|
|
48
|
+
if (pubNo.length === 0) {
|
|
49
|
+
return [
|
|
50
|
+
{
|
|
51
|
+
envelope: inpiBrEnvelope("PATENT_INVALID_NUMBER", ADAPTER_PATH, "validate", "inpi-br get requires a non-empty publication_number"),
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
const url = detailUrlFor(pubNo);
|
|
56
|
+
let detail;
|
|
57
|
+
try {
|
|
58
|
+
const result = await inpiBrNavigateAndExtract(url, DETAIL_EXTRACTOR);
|
|
59
|
+
if (!result.data) {
|
|
60
|
+
return [
|
|
61
|
+
{
|
|
62
|
+
envelope: inpiBrEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "inpi-br detail evaluate returned no data"),
|
|
63
|
+
},
|
|
64
|
+
];
|
|
65
|
+
}
|
|
66
|
+
detail = result.data;
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
if (err instanceof TransportError) {
|
|
70
|
+
return [
|
|
71
|
+
{
|
|
72
|
+
envelope: transportErrorToInpiBrEnvelope(err, ADAPTER_PATH, "navigate"),
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
}
|
|
76
|
+
throw err;
|
|
77
|
+
}
|
|
78
|
+
if (!detail.publication_number && !detail.title) {
|
|
79
|
+
return [
|
|
80
|
+
{
|
|
81
|
+
envelope: inpiBrEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "evaluate", `inpi-br detail page for "${pubNo}" yielded no bibliographic fields`, ["espacenet"]),
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
const rawPubNo = detail.publication_number || pubNo;
|
|
86
|
+
const canonicalPubNo = /^BR[-]?/.test(rawPubNo) ? rawPubNo : `BR${rawPubNo}`;
|
|
87
|
+
try {
|
|
88
|
+
return [
|
|
89
|
+
assemblePatentRecord({
|
|
90
|
+
publication_number: canonicalPubNo,
|
|
91
|
+
application_number: detail.application_number || undefined,
|
|
92
|
+
title: detail.title || undefined,
|
|
93
|
+
abstract: detail.abstract || undefined,
|
|
94
|
+
assignees: detail.applicant
|
|
95
|
+
? [{ name: detail.applicant, country: "BR" }]
|
|
96
|
+
: undefined,
|
|
97
|
+
inventors: detail.inventor
|
|
98
|
+
? [{ name: detail.inventor, country: "BR" }]
|
|
99
|
+
: undefined,
|
|
100
|
+
publication_date: detail.publication_date || undefined,
|
|
101
|
+
filing_date: detail.filing_date || undefined,
|
|
102
|
+
source_adapter: "inpi-br",
|
|
103
|
+
source_url: detail.source_url || url,
|
|
104
|
+
}),
|
|
105
|
+
];
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return [
|
|
109
|
+
{
|
|
110
|
+
envelope: inpiBrEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "normalize", `inpi-br detail page for "${pubNo}" did not yield a valid publication_number`, ["espacenet"]),
|
|
111
|
+
},
|
|
112
|
+
];
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
cli({
|
|
116
|
+
site: "inpi-br",
|
|
117
|
+
name: "get",
|
|
118
|
+
description: "Retrieve a single INPI Brasil patent record (browser-only)",
|
|
119
|
+
domain: "busca.inpi.gov.br",
|
|
120
|
+
strategy: Strategy.PUBLIC,
|
|
121
|
+
adapter_path: ADAPTER_PATH,
|
|
122
|
+
args: [
|
|
123
|
+
{
|
|
124
|
+
name: "publication_number",
|
|
125
|
+
type: "str",
|
|
126
|
+
required: true,
|
|
127
|
+
positional: true,
|
|
128
|
+
description: "Brazil patent application/publication number",
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
columns: [
|
|
132
|
+
"publication_number",
|
|
133
|
+
"title",
|
|
134
|
+
"publication_date",
|
|
135
|
+
"filing_date",
|
|
136
|
+
"source_url",
|
|
137
|
+
],
|
|
138
|
+
capabilities: ["mcp-browser.navigate", "mcp-browser.evaluate", "patent.get"],
|
|
139
|
+
minimum_capability: "mcp-browser.evaluate",
|
|
140
|
+
func: async (_page, kwargs) => runInpiBrGet(kwargs),
|
|
141
|
+
});
|
|
142
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/adapters/inpi-br/get.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::inpi-br::search
|
|
3
|
+
* @does Browser-driven INPI Brasil search at busca.inpi.gov.br/pePI/ — Brazil's patent office has no open API (pre-API status); the public web search is the only programmatic surface.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/inpi-br/_shared.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.search)
|
|
6
|
+
* @breaks PATENT_UNSUPPORTED_QUERY (empty), PATENT_NOT_FOUND (no rows), PATENT_API_DEPRECATED with MCP_BUS_MISSING
|
|
7
|
+
* @invariants output rows canonicalized into PatentRecord with source_adapter='inpi-br'
|
|
8
|
+
* @side-effects controls Chrome via MCP
|
|
9
|
+
* @perf single navigate + evaluate
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/inpi-br/search.test.ts
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification browser-only
|
|
15
|
+
*/
|
|
16
|
+
export declare function runInpiBrSearch(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/inpi-br/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAsDH,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAqGrB"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::inpi-br::search
|
|
3
|
+
* @does Browser-driven INPI Brasil search at busca.inpi.gov.br/pePI/ — Brazil's patent office has no open API (pre-API status); the public web search is the only programmatic surface.
|
|
4
|
+
* @needs src/engine/transport/mcp-browser.ts, src/engine/normalizer/patent-envelope.ts, src/adapters/inpi-br/_shared.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.search)
|
|
6
|
+
* @breaks PATENT_UNSUPPORTED_QUERY (empty), PATENT_NOT_FOUND (no rows), PATENT_API_DEPRECATED with MCP_BUS_MISSING
|
|
7
|
+
* @invariants output rows canonicalized into PatentRecord with source_adapter='inpi-br'
|
|
8
|
+
* @side-effects controls Chrome via MCP
|
|
9
|
+
* @perf single navigate + evaluate
|
|
10
|
+
* @concurrency safe
|
|
11
|
+
* @test tests/unit/adapters/inpi-br/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 { inpiBrEnvelope, inpiBrNavigateAndExtract, transportErrorToInpiBrEnvelope, } from "./_shared.js";
|
|
20
|
+
const ADAPTER_PATH = "src/adapters/inpi-br/search.ts";
|
|
21
|
+
const INPI_BR_SEARCH_URL = "https://busca.inpi.gov.br/pePI/servlet/PatenteServletController";
|
|
22
|
+
const EXTRACTOR = `(() => {
|
|
23
|
+
const rows = Array.from(
|
|
24
|
+
document.querySelectorAll('table.tabela tr.linha, table tr[bgcolor]')
|
|
25
|
+
).map((el) => {
|
|
26
|
+
const text = (sel) => {
|
|
27
|
+
const node = el.querySelector(sel);
|
|
28
|
+
return node ? (node.textContent || '').trim() : '';
|
|
29
|
+
};
|
|
30
|
+
const cells = Array.from(el.querySelectorAll('td')).map((td) => (td.textContent || '').trim());
|
|
31
|
+
const linkEl = el.querySelector('a[href]');
|
|
32
|
+
return {
|
|
33
|
+
publication_number: text('td.num-pedido, td:first-child') || (cells[0] || ''),
|
|
34
|
+
title: text('td.titulo, td:nth-child(3)') || (cells[2] || ''),
|
|
35
|
+
applicant: text('td.depositante, td:nth-child(4)') || (cells[3] || ''),
|
|
36
|
+
publication_date: text('td.data-pub, td:nth-child(5)') || (cells[4] || ''),
|
|
37
|
+
filing_date: text('td.data-dep, td:nth-child(2)') || (cells[1] || ''),
|
|
38
|
+
source_url: linkEl ? linkEl.href : '',
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
return { rows };
|
|
42
|
+
})()`;
|
|
43
|
+
function buildSearchUrl(query) {
|
|
44
|
+
const params = new URLSearchParams({
|
|
45
|
+
Action: "searchPatente",
|
|
46
|
+
ExpressaoPesquisa: query,
|
|
47
|
+
});
|
|
48
|
+
return `${INPI_BR_SEARCH_URL}?${params.toString()}`;
|
|
49
|
+
}
|
|
50
|
+
export async function runInpiBrSearch(kwargs) {
|
|
51
|
+
const limit = typeof kwargs.limit === "number" && Number.isFinite(kwargs.limit)
|
|
52
|
+
? Math.max(1, Math.min(100, Math.floor(kwargs.limit)))
|
|
53
|
+
: 25;
|
|
54
|
+
const query = String(kwargs.query ?? "").trim();
|
|
55
|
+
if (query.length === 0) {
|
|
56
|
+
return [
|
|
57
|
+
{
|
|
58
|
+
envelope: inpiBrEnvelope("PATENT_UNSUPPORTED_QUERY", ADAPTER_PATH, "validate", "inpi-br search requires a non-empty query"),
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
const url = buildSearchUrl(query);
|
|
63
|
+
let extract;
|
|
64
|
+
try {
|
|
65
|
+
const result = await inpiBrNavigateAndExtract(url, EXTRACTOR);
|
|
66
|
+
if (!result.data) {
|
|
67
|
+
return [
|
|
68
|
+
{
|
|
69
|
+
envelope: inpiBrEnvelope("PATENT_SCHEMA_DRIFT", ADAPTER_PATH, "evaluate", "inpi-br evaluate returned no data; selectors likely drifted"),
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
}
|
|
73
|
+
extract = result.data;
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
if (err instanceof TransportError) {
|
|
77
|
+
return [
|
|
78
|
+
{
|
|
79
|
+
envelope: transportErrorToInpiBrEnvelope(err, ADAPTER_PATH, "navigate"),
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
}
|
|
83
|
+
throw err;
|
|
84
|
+
}
|
|
85
|
+
if (extract.rows.length === 0) {
|
|
86
|
+
return [
|
|
87
|
+
{
|
|
88
|
+
envelope: inpiBrEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "evaluate", `inpi-br returned no rows for query "${query}"`, ["espacenet", "lens"]),
|
|
89
|
+
},
|
|
90
|
+
];
|
|
91
|
+
}
|
|
92
|
+
const out = [];
|
|
93
|
+
for (const row of extract.rows.slice(0, limit)) {
|
|
94
|
+
if (!row.publication_number)
|
|
95
|
+
continue;
|
|
96
|
+
const normalizedPub = /^BR[-]?/.test(row.publication_number)
|
|
97
|
+
? row.publication_number
|
|
98
|
+
: `BR${row.publication_number}`;
|
|
99
|
+
try {
|
|
100
|
+
out.push(assemblePatentRecord({
|
|
101
|
+
publication_number: normalizedPub,
|
|
102
|
+
title: row.title || undefined,
|
|
103
|
+
assignees: row.applicant
|
|
104
|
+
? [{ name: row.applicant, country: "BR" }]
|
|
105
|
+
: undefined,
|
|
106
|
+
publication_date: row.publication_date || undefined,
|
|
107
|
+
filing_date: row.filing_date || undefined,
|
|
108
|
+
source_adapter: "inpi-br",
|
|
109
|
+
source_url: row.source_url || url,
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Skip malformed rows.
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (out.length === 0) {
|
|
117
|
+
out.push({
|
|
118
|
+
envelope: inpiBrEnvelope("PATENT_NOT_FOUND", ADAPTER_PATH, "normalize", "inpi-br returned rows but none normalized to a valid publication_number", ["espacenet"]),
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return out;
|
|
122
|
+
}
|
|
123
|
+
cli({
|
|
124
|
+
site: "inpi-br",
|
|
125
|
+
name: "search",
|
|
126
|
+
description: "Search INPI Brasil patents (browser-only, no upstream API)",
|
|
127
|
+
domain: "busca.inpi.gov.br",
|
|
128
|
+
strategy: Strategy.PUBLIC,
|
|
129
|
+
adapter_path: ADAPTER_PATH,
|
|
130
|
+
args: [
|
|
131
|
+
{
|
|
132
|
+
name: "query",
|
|
133
|
+
type: "str",
|
|
134
|
+
required: true,
|
|
135
|
+
positional: true,
|
|
136
|
+
description: "Free-text query for INPI Brasil patent search",
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
name: "limit",
|
|
140
|
+
type: "int",
|
|
141
|
+
default: 25,
|
|
142
|
+
description: "Max results (1-100)",
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
columns: ["publication_number", "title", "publication_date", "source_url"],
|
|
146
|
+
capabilities: [
|
|
147
|
+
"mcp-browser.navigate",
|
|
148
|
+
"mcp-browser.evaluate",
|
|
149
|
+
"patent.search",
|
|
150
|
+
],
|
|
151
|
+
minimum_capability: "mcp-browser.evaluate",
|
|
152
|
+
func: async (_page, kwargs) => runInpiBrSearch(kwargs),
|
|
153
|
+
});
|
|
154
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/adapters/inpi-br/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner Instagram subtitle adapter.
|
|
3
|
+
* @does Extracts LLM-readable subtitle text from public Instagram reel and video URLs.
|
|
4
|
+
* @needs `yt-dlp` on PATH and an accessible video subtitle track.
|
|
5
|
+
* @feeds Cross-platform social video analysis workflows.
|
|
6
|
+
* @breaks Instagram 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/instagram/subtitles.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|