@zenalexa/unicli 0.220.0 → 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 +35 -22
- package/README.md +23 -17
- package/README.zh-CN.md +23 -17
- package/dist/adapters/anilist/web.d.ts +11 -0
- package/dist/adapters/anilist/web.d.ts.map +1 -0
- package/dist/adapters/anilist/web.js +284 -0
- package/dist/adapters/anilist/web.js.map +1 -0
- package/dist/adapters/bangumi/web.d.ts +14 -0
- package/dist/adapters/bangumi/web.d.ts.map +1 -0
- package/dist/adapters/bangumi/web.js +257 -0
- package/dist/adapters/bangumi/web.js.map +1 -0
- 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/dlsite/web.d.ts +31 -0
- package/dist/adapters/dlsite/web.d.ts.map +1 -0
- package/dist/adapters/dlsite/web.js +455 -0
- package/dist/adapters/dlsite/web.js.map +1 -0
- package/dist/adapters/ehentai/web.d.ts +66 -0
- package/dist/adapters/ehentai/web.d.ts.map +1 -0
- package/dist/adapters/ehentai/web.js +608 -0
- package/dist/adapters/ehentai/web.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/jikan/web.d.ts +9 -0
- package/dist/adapters/jikan/web.d.ts.map +1 -0
- package/dist/adapters/jikan/web.js +154 -0
- package/dist/adapters/jikan/web.js.map +1 -0
- package/dist/adapters/kitsu/web.d.ts +9 -0
- package/dist/adapters/kitsu/web.d.ts.map +1 -0
- package/dist/adapters/kitsu/web.js +97 -0
- package/dist/adapters/kitsu/web.js.map +1 -0
- package/dist/adapters/mangadex/web.d.ts +10 -0
- package/dist/adapters/mangadex/web.d.ts.map +1 -0
- package/dist/adapters/mangadex/web.js +188 -0
- package/dist/adapters/mangadex/web.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/moegirl/web.d.ts +23 -0
- package/dist/adapters/moegirl/web.d.ts.map +1 -0
- package/dist/adapters/moegirl/web.js +269 -0
- package/dist/adapters/moegirl/web.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/safebooru/web.d.ts +10 -0
- package/dist/adapters/safebooru/web.d.ts.map +1 -0
- package/dist/adapters/safebooru/web.js +120 -0
- package/dist/adapters/safebooru/web.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/vndb/web.d.ts +10 -0
- package/dist/adapters/vndb/web.d.ts.map +1 -0
- package/dist/adapters/vndb/web.js +321 -0
- package/dist/adapters/vndb/web.js.map +1 -0
- package/dist/adapters/xiaohongshu/browser-state.d.ts +19 -0
- package/dist/adapters/xiaohongshu/browser-state.d.ts.map +1 -0
- package/dist/adapters/xiaohongshu/browser-state.js +67 -0
- package/dist/adapters/xiaohongshu/browser-state.js.map +1 -0
- package/dist/adapters/xiaohongshu/comments.js +28 -5
- package/dist/adapters/xiaohongshu/comments.js.map +1 -1
- package/dist/adapters/xiaohongshu/download.js +49 -11
- package/dist/adapters/xiaohongshu/download.js.map +1 -1
- package/dist/adapters/xiaohongshu/search.d.ts.map +1 -1
- package/dist/adapters/xiaohongshu/search.js +11 -5
- package/dist/adapters/xiaohongshu/search.js.map +1 -1
- package/dist/adapters/xiaohongshu/trending.d.ts +9 -0
- package/dist/adapters/xiaohongshu/trending.d.ts.map +1 -0
- package/dist/adapters/xiaohongshu/trending.js +94 -0
- package/dist/adapters/xiaohongshu/trending.js.map +1 -0
- package/dist/adapters/youtube/comments.d.ts +80 -0
- package/dist/adapters/youtube/comments.d.ts.map +1 -1
- package/dist/adapters/youtube/comments.js +108 -12
- package/dist/adapters/youtube/comments.js.map +1 -1
- package/dist/adapters/youtube/subtitles.d.ts +9 -0
- package/dist/adapters/youtube/subtitles.d.ts.map +1 -0
- package/dist/adapters/youtube/subtitles.js +42 -0
- package/dist/adapters/youtube/subtitles.js.map +1 -0
- package/dist/adapters/yt-dlp/subtitles.d.ts +9 -0
- package/dist/adapters/yt-dlp/subtitles.d.ts.map +1 -0
- package/dist/adapters/yt-dlp/subtitles.js +41 -0
- package/dist/adapters/yt-dlp/subtitles.js.map +1 -0
- package/dist/adapters/zhihu/answer-detail.d.ts +39 -0
- package/dist/adapters/zhihu/answer-detail.d.ts.map +1 -0
- package/dist/adapters/zhihu/answer-detail.js +204 -0
- package/dist/adapters/zhihu/answer-detail.js.map +1 -0
- package/dist/adapters/zhihu/comment.d.ts +9 -0
- package/dist/adapters/zhihu/comment.d.ts.map +1 -0
- package/dist/adapters/zhihu/comment.js +149 -0
- package/dist/adapters/zhihu/comment.js.map +1 -0
- package/dist/adapters/zhihu/recommend.d.ts +36 -0
- package/dist/adapters/zhihu/recommend.d.ts.map +1 -0
- package/dist/adapters/zhihu/recommend.js +151 -0
- package/dist/adapters/zhihu/recommend.js.map +1 -0
- package/dist/agents/codex-pack.d.ts +62 -0
- package/dist/agents/codex-pack.d.ts.map +1 -0
- package/dist/agents/codex-pack.js +163 -0
- package/dist/agents/codex-pack.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/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +6 -43
- package/dist/commands/agents.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/adapter.d.ts.map +1 -1
- package/dist/commands/browser/adapter.js +17 -3
- package/dist/commands/browser/adapter.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/describe.d.ts.map +1 -1
- package/dist/commands/describe.js +6 -7
- package/dist/commands/describe.js.map +1 -1
- package/dist/commands/dispatch.d.ts +1 -1
- package/dist/commands/dispatch.d.ts.map +1 -1
- package/dist/commands/dispatch.js +31 -5
- package/dist/commands/dispatch.js.map +1 -1
- package/dist/commands/mcp.d.ts +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +10 -5
- package/dist/commands/mcp.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/command-contract-lint.d.ts +10 -0
- package/dist/core/command-contract-lint.d.ts.map +1 -0
- package/dist/core/command-contract-lint.js +41 -0
- package/dist/core/command-contract-lint.js.map +1 -0
- package/dist/core/command-contract.d.ts +100 -0
- package/dist/core/command-contract.d.ts.map +1 -0
- package/dist/core/command-contract.js +174 -0
- package/dist/core/command-contract.js.map +1 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/registry.d.ts +1 -1
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +11 -2
- package/dist/core/registry.js.map +1 -1
- package/dist/discovery/aliases.d.ts +2 -2
- package/dist/discovery/aliases.d.ts.map +1 -1
- package/dist/discovery/aliases.js +464 -6
- package/dist/discovery/aliases.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/discovery/search.d.ts.map +1 -1
- package/dist/discovery/search.js +147 -2
- package/dist/discovery/search.js.map +1 -1
- package/dist/engine/approval-presenter.d.ts +10 -0
- package/dist/engine/approval-presenter.d.ts.map +1 -0
- package/dist/engine/approval-presenter.js +45 -0
- package/dist/engine/approval-presenter.js.map +1 -0
- package/dist/engine/approval-store.d.ts +4 -0
- package/dist/engine/approval-store.d.ts.map +1 -1
- package/dist/engine/approval-store.js +85 -11
- package/dist/engine/approval-store.js.map +1 -1
- package/dist/engine/args.d.ts.map +1 -1
- package/dist/engine/args.js +18 -1
- package/dist/engine/args.js.map +1 -1
- package/dist/engine/artifact-validation.d.ts +29 -0
- package/dist/engine/artifact-validation.d.ts.map +1 -0
- package/dist/engine/artifact-validation.js +211 -0
- package/dist/engine/artifact-validation.js.map +1 -0
- 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/browser/diagnostics.d.ts +38 -0
- package/dist/engine/browser/diagnostics.d.ts.map +1 -0
- package/dist/engine/browser/diagnostics.js +40 -0
- package/dist/engine/browser/diagnostics.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/invoke.d.ts +1 -0
- package/dist/engine/invoke.d.ts.map +1 -1
- package/dist/engine/invoke.js +1 -0
- package/dist/engine/invoke.js.map +1 -1
- package/dist/engine/kernel/errors.d.ts +11 -0
- package/dist/engine/kernel/errors.d.ts.map +1 -0
- package/dist/engine/kernel/errors.js +15 -0
- package/dist/engine/kernel/errors.js.map +1 -0
- package/dist/engine/kernel/execute.d.ts +7 -18
- package/dist/engine/kernel/execute.d.ts.map +1 -1
- package/dist/engine/kernel/execute.js +25 -410
- package/dist/engine/kernel/execute.js.map +1 -1
- package/dist/engine/kernel/stages.d.ts +44 -0
- package/dist/engine/kernel/stages.d.ts.map +1 -0
- package/dist/engine/kernel/stages.js +429 -0
- package/dist/engine/kernel/stages.js.map +1 -0
- package/dist/engine/kernel/types.d.ts +21 -1
- package/dist/engine/kernel/types.d.ts.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 +2 -0
- package/dist/engine/steps/download.d.ts.map +1 -1
- package/dist/engine/steps/download.js +13 -7
- 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/render.js +1 -1
- package/dist/fast-path/render.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 +5 -5
- package/dist/manifest-search.json +1 -1
- package/dist/manifest.json +5189 -55
- package/dist/mcp/handler.d.ts.map +1 -1
- package/dist/mcp/handler.js +11 -1
- package/dist/mcp/handler.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +18 -10
- package/dist/mcp/tools.js.map +1 -1
- package/dist/output/auth-guidance.d.ts +14 -0
- package/dist/output/auth-guidance.d.ts.map +1 -0
- package/dist/output/auth-guidance.js +50 -0
- package/dist/output/auth-guidance.js.map +1 -0
- package/dist/output/error-map.d.ts +1 -1
- package/dist/output/error-map.d.ts.map +1 -1
- package/dist/output/error-map.js +29 -5
- 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 +7 -1
- 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 +10 -5
- 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/anilist/web.test.ts +93 -0
- package/src/adapters/anilist/web.ts +341 -0
- package/src/adapters/arxiv/download.yaml +53 -0
- package/src/adapters/bangumi/web.test.ts +109 -0
- package/src/adapters/bangumi/web.ts +295 -0
- package/src/adapters/bilibili/comments-tree.test.ts +41 -0
- package/src/adapters/bilibili/comments.ts +78 -4
- package/src/adapters/bilibili/compat.ts +5 -2
- package/src/adapters/bilibili/download.ts +7 -4
- package/src/adapters/bilibili/wbi.ts +6 -3
- package/src/adapters/brave/search.yaml +53 -0
- package/src/adapters/cipo/_shared.ts +98 -0
- package/src/adapters/cipo/get.ts +188 -0
- package/src/adapters/cipo/legal-status.ts +148 -0
- package/src/adapters/cipo/search.ts +195 -0
- package/src/adapters/cnipa/_shared.ts +138 -0
- package/src/adapters/cnipa/get.ts +199 -0
- package/src/adapters/cnipa/legal-status.ts +162 -0
- package/src/adapters/cnipa/search.ts +229 -0
- package/src/adapters/danbooru/artists.yaml +44 -0
- package/src/adapters/danbooru/comments.yaml +45 -0
- package/src/adapters/danbooru/detail.yaml +78 -0
- package/src/adapters/danbooru/download.yaml +51 -0
- package/src/adapters/danbooru/pools.yaml +56 -0
- package/src/adapters/danbooru/search.yaml +69 -0
- package/src/adapters/danbooru/tags.yaml +42 -0
- package/src/adapters/danbooru/wiki.yaml +44 -0
- package/src/adapters/dlsite/web.test.ts +132 -0
- package/src/adapters/dlsite/web.ts +557 -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/ehentai/web.test.ts +157 -0
- package/src/adapters/ehentai/web.ts +750 -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/jikan/web.test.ts +50 -0
- package/src/adapters/jikan/web.ts +177 -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/kitsu/web.test.ts +29 -0
- package/src/adapters/kitsu/web.ts +109 -0
- package/src/adapters/konachan/detail.yaml +62 -0
- package/src/adapters/konachan/download.yaml +55 -0
- package/src/adapters/konachan/search.yaml +65 -0
- package/src/adapters/konachan/tags.yaml +40 -0
- package/src/adapters/lens/get.yaml +64 -0
- package/src/adapters/lens/search.yaml +82 -0
- package/src/adapters/mangadex/web.test.ts +46 -0
- package/src/adapters/mangadex/web.ts +210 -0
- package/src/adapters/mastodon/statuses.test.ts +82 -0
- package/src/adapters/mastodon/statuses.ts +208 -0
- package/src/adapters/moegirl/web.test.ts +87 -0
- package/src/adapters/moegirl/web.ts +343 -0
- package/src/adapters/patsnap/get.yaml +65 -0
- package/src/adapters/patsnap/search.yaml +77 -0
- package/src/adapters/pdf/read.yaml +49 -0
- package/src/adapters/pixiv/download.yaml +15 -2
- 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/safebooru/detail.yaml +63 -0
- package/src/adapters/safebooru/download.yaml +58 -0
- package/src/adapters/safebooru/search.yaml +69 -0
- package/src/adapters/safebooru/web.test.ts +60 -0
- package/src/adapters/safebooru/web.ts +130 -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/vndb/web.test.ts +86 -0
- package/src/adapters/vndb/web.ts +393 -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/yandere/detail.yaml +61 -0
- package/src/adapters/yandere/download.yaml +56 -0
- package/src/adapters/yandere/search.yaml +67 -0
- package/src/adapters/yandere/tags.yaml +41 -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,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::freepatentsonline-web::search
|
|
3
|
+
* @does Keyless patent search via www.freepatentsonline.com's SSR `result.html` listing — older site, still maintained, no JS gate, no auth. Complements google-patents-web as a second day-zero source.
|
|
4
|
+
* @needs src/adapters/freepatentsonline-web/_shared.ts, src/engine/normalizer/patent-envelope.ts, src/registry.ts
|
|
5
|
+
* @feeds src/commands/patent.ts (capability tag patent.search)
|
|
6
|
+
* @breaks PATENT_API_DEPRECATED on non-2xx HTTP; PATENT_NOT_FOUND on empty listing; PATENT_SCHEMA_DRIFT when the listing_table selector no longer matches
|
|
7
|
+
* @invariants output rows are canonical PatentRecord; publication_number is decoded from the FPO link path (URL-encoded structural signal) — rows whose link does not encode a kind code are dropped, never fabricated
|
|
8
|
+
* @side-effects HTTPS egress to www.freepatentsonline.com only
|
|
9
|
+
* @perf single page fetch (~50 KB); FPO returns 50 results per page
|
|
10
|
+
* @concurrency safe — stateless
|
|
11
|
+
* @test verification proof in docs/skills/patent-cookbook.md
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification keyless-best-effort
|
|
15
|
+
*/
|
|
16
|
+
import { cli, Strategy } from "../../registry.js";
|
|
17
|
+
import { assemblePatentRecord } from "../../engine/normalizer/patent-envelope.js";
|
|
18
|
+
import { buildPatentEnvelope } from "../../engine/normalizer/patent-envelope.js";
|
|
19
|
+
import { FpoHttpError, buildFpoSearchUrl, fetchFpoHtml, parseFpoListing, } from "./_shared.js";
|
|
20
|
+
const ADAPTER_PATH = "src/adapters/freepatentsonline-web/search.ts";
|
|
21
|
+
function clampLimit(raw) {
|
|
22
|
+
const num = typeof raw === "number" ? raw : Number(raw);
|
|
23
|
+
if (!Number.isFinite(num) || num <= 0)
|
|
24
|
+
return 25;
|
|
25
|
+
return Math.min(50, Math.max(1, Math.floor(num)));
|
|
26
|
+
}
|
|
27
|
+
export async function runFreePatentsOnlineSearch(kwargs) {
|
|
28
|
+
const query = String(kwargs.query ?? "").trim();
|
|
29
|
+
if (query.length === 0) {
|
|
30
|
+
return [
|
|
31
|
+
{
|
|
32
|
+
envelope: buildPatentEnvelope({
|
|
33
|
+
code: "PATENT_UNSUPPORTED_QUERY",
|
|
34
|
+
adapter_path: ADAPTER_PATH,
|
|
35
|
+
step: "validate",
|
|
36
|
+
suggestion: "freepatentsonline-web search requires a non-empty query",
|
|
37
|
+
alternatives: ["google-patents-web"],
|
|
38
|
+
}),
|
|
39
|
+
},
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
const limit = clampLimit(kwargs.limit);
|
|
43
|
+
const url = buildFpoSearchUrl(query, 1);
|
|
44
|
+
let html;
|
|
45
|
+
try {
|
|
46
|
+
html = await fetchFpoHtml(url);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
if (err instanceof FpoHttpError) {
|
|
50
|
+
return [
|
|
51
|
+
{
|
|
52
|
+
envelope: buildPatentEnvelope({
|
|
53
|
+
code: err.status === 429
|
|
54
|
+
? "PATENT_RATE_LIMIT"
|
|
55
|
+
: "PATENT_API_DEPRECATED",
|
|
56
|
+
adapter_path: ADAPTER_PATH,
|
|
57
|
+
step: "fetch",
|
|
58
|
+
suggestion: `FreePatentsOnline returned HTTP ${err.status} for ${err.url}; retry with --sources google-patents-web`,
|
|
59
|
+
alternatives: ["google-patents-web", "espacenet"],
|
|
60
|
+
retryable: err.status === 429,
|
|
61
|
+
}),
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
throw err;
|
|
66
|
+
}
|
|
67
|
+
const rows = parseFpoListing(html);
|
|
68
|
+
if (rows.length === 0) {
|
|
69
|
+
return [
|
|
70
|
+
{
|
|
71
|
+
envelope: buildPatentEnvelope({
|
|
72
|
+
code: html.includes('class="listing_table"')
|
|
73
|
+
? "PATENT_NOT_FOUND"
|
|
74
|
+
: "PATENT_SCHEMA_DRIFT",
|
|
75
|
+
adapter_path: ADAPTER_PATH,
|
|
76
|
+
step: "select",
|
|
77
|
+
suggestion: html.includes('class="listing_table"')
|
|
78
|
+
? `freepatentsonline-web returned no listing rows for "${query}"`
|
|
79
|
+
: "freepatentsonline-web no longer ships listing_table — the parseFpoListing extractor needs updating",
|
|
80
|
+
alternatives: ["google-patents-web", "espacenet"],
|
|
81
|
+
}),
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
const out = [];
|
|
86
|
+
for (const row of rows.slice(0, limit)) {
|
|
87
|
+
const canonical = row.publication_number_canonical;
|
|
88
|
+
if (!canonical) {
|
|
89
|
+
// Row's link path did not encode a kind code (e.g. bare US grant
|
|
90
|
+
// number). Skip rather than fabricate.
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
out.push(assemblePatentRecord({
|
|
95
|
+
publication_number: canonical,
|
|
96
|
+
title: row.title || undefined,
|
|
97
|
+
abstract: row.abstract || undefined,
|
|
98
|
+
source_adapter: "freepatentsonline-web",
|
|
99
|
+
source_url: row.detail_url,
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Defensive: skip rows that fail canonicalisation rather than
|
|
104
|
+
// synthesise.
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (out.length === 0) {
|
|
108
|
+
return [
|
|
109
|
+
{
|
|
110
|
+
envelope: buildPatentEnvelope({
|
|
111
|
+
code: "PATENT_NOT_FOUND",
|
|
112
|
+
adapter_path: ADAPTER_PATH,
|
|
113
|
+
step: "normalize",
|
|
114
|
+
suggestion: `freepatentsonline-web returned ${rows.length} listing rows but none had a structurally decodable kind code; run \`unicli freepatentsonline-web get <pub_no>\` against an individual hit to retrieve its kind code from the detail page`,
|
|
115
|
+
alternatives: ["google-patents-web", "espacenet"],
|
|
116
|
+
}),
|
|
117
|
+
},
|
|
118
|
+
];
|
|
119
|
+
}
|
|
120
|
+
return out;
|
|
121
|
+
}
|
|
122
|
+
cli({
|
|
123
|
+
site: "freepatentsonline-web",
|
|
124
|
+
name: "search",
|
|
125
|
+
description: "Keyless FreePatentsOnline search via the public SSR listing (no API key, no Chrome)",
|
|
126
|
+
domain: "www.freepatentsonline.com",
|
|
127
|
+
strategy: Strategy.PUBLIC,
|
|
128
|
+
adapter_path: ADAPTER_PATH,
|
|
129
|
+
args: [
|
|
130
|
+
{
|
|
131
|
+
name: "query",
|
|
132
|
+
type: "str",
|
|
133
|
+
required: true,
|
|
134
|
+
positional: true,
|
|
135
|
+
description: "Free-text query (FreePatentsOnline xprtsrch syntax)",
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
name: "limit",
|
|
139
|
+
type: "int",
|
|
140
|
+
default: 25,
|
|
141
|
+
description: "Max results to return (1-50, FPO paginates at 50)",
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
columns: ["publication_number", "title", "abstract", "source_url"],
|
|
145
|
+
capabilities: ["http.fetch", "patent.search"],
|
|
146
|
+
minimum_capability: "http.fetch",
|
|
147
|
+
func: async (_page, kwargs) => runFreePatentsOnlineSearch(kwargs),
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/adapters/freepatentsonline-web/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::google-patents-web::_shared
|
|
3
|
+
* @does Shared HTTP helpers and types for the KEYLESS Google Patents web adapter — distinct from the BigQuery-backed google-patents-bq adapter (which requires a billed GCP project). This adapter uses the public XHR endpoint that drives patents.google.com and the SSR /patent/<id>/en bibliography page, both of which are reachable with only a real-browser User-Agent header.
|
|
4
|
+
* @needs src/engine/normalizer/patent-envelope.ts, src/types/patent.ts, node:fetch (global)
|
|
5
|
+
* @feeds src/adapters/google-patents-web/search.yaml, src/adapters/google-patents-web/get.ts
|
|
6
|
+
* @breaks throws GooglePatentsHttpError when the endpoint returns non-2xx or unparseable JSON; callers surface PATENT_API_DEPRECATED to the meta-command
|
|
7
|
+
* @invariants every outbound request carries a real-browser User-Agent — Google rejects bare `node-fetch`/`python-requests`; the @keyless-best-effort verification tag is emitted in adapter file headers
|
|
8
|
+
* @side-effects HTTPS egress to patents.google.com only; no env reads, no cookies
|
|
9
|
+
* @perf single request per call; XHR responses are ~40-100 KB
|
|
10
|
+
* @concurrency safe — pure functions plus stateless `fetch`
|
|
11
|
+
* @test covered transitively via tests/unit/adapters/google-patents-web/*.test.ts (none yet — adapters ship with live verification proof in docs/skills/patent-cookbook.md)
|
|
12
|
+
* @stability experimental — Google does not publish a stability contract for this XHR
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification keyless-best-effort
|
|
15
|
+
*/
|
|
16
|
+
import type { PatentRecord } from "../../types/patent.js";
|
|
17
|
+
/**
|
|
18
|
+
* Local verification-status alias for the keyless-web adapter family.
|
|
19
|
+
*
|
|
20
|
+
* Distinct from the canonical `PatentVerificationStatus` union in
|
|
21
|
+
* `src/types/patent.ts` — adding a new variant there is owned by another
|
|
22
|
+
* agent in this batch, so we expose it as a *local* string-literal type
|
|
23
|
+
* alias the file headers can advertise without forcing a cross-cutting
|
|
24
|
+
* type change. The meta-command does not branch on this value; it is
|
|
25
|
+
* documentation-grade only.
|
|
26
|
+
*/
|
|
27
|
+
export type KeylessBestEffortStatus = "keyless-best-effort";
|
|
28
|
+
export declare const KEYLESS_BEST_EFFORT: KeylessBestEffortStatus;
|
|
29
|
+
/**
|
|
30
|
+
* Real-browser User-Agent string. Google's XHR endpoint returns 403 for the
|
|
31
|
+
* default `node/undici` UA; a Chrome string fixes that. Mirror the version
|
|
32
|
+
* Chrome currently ships rather than freezing on an old number so the header
|
|
33
|
+
* stays plausible if Google starts UA-version-gating in future.
|
|
34
|
+
*/
|
|
35
|
+
export declare const GOOGLE_PATENTS_UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36";
|
|
36
|
+
export declare class GooglePatentsHttpError extends Error {
|
|
37
|
+
readonly status: number;
|
|
38
|
+
readonly url: string;
|
|
39
|
+
constructor(status: number, url: string, message: string);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* GET <url> with a real-browser UA. Returns parsed JSON; throws
|
|
43
|
+
* GooglePatentsHttpError on non-2xx or JSON parse failure.
|
|
44
|
+
*/
|
|
45
|
+
export declare function fetchGooglePatentsJson<T>(url: string): Promise<T>;
|
|
46
|
+
/**
|
|
47
|
+
* GET <url> with a real-browser UA, return raw HTML text. Throws
|
|
48
|
+
* GooglePatentsHttpError on non-2xx.
|
|
49
|
+
*/
|
|
50
|
+
export declare function fetchGooglePatentsHtml(url: string): Promise<string>;
|
|
51
|
+
/**
|
|
52
|
+
* Build the public XHR query URL. Accepts a plain free-text query string and
|
|
53
|
+
* an optional limit (`num` parameter) and earliest-publication-year filter.
|
|
54
|
+
*
|
|
55
|
+
* The XHR endpoint expects a percent-encoded *inner* query string under the
|
|
56
|
+
* `url` parameter — the outer query is `?url=q%3Dfoo&exp=`. We percent-encode
|
|
57
|
+
* the inner once.
|
|
58
|
+
*/
|
|
59
|
+
export declare function buildGooglePatentsXhrUrl(query: string, limit?: number, sinceYear?: string): string;
|
|
60
|
+
/**
|
|
61
|
+
* Build the public detail page URL for a given publication number. Google
|
|
62
|
+
* accepts the segmented form `US-11741188-B2` and the compact form
|
|
63
|
+
* `US11741188B2`; we send the compact form to keep the URL short.
|
|
64
|
+
*/
|
|
65
|
+
export declare function buildGooglePatentsDetailUrl(pubNo: string): string;
|
|
66
|
+
/**
|
|
67
|
+
* XHR response shape. We intentionally type only the fields we read —
|
|
68
|
+
* Google ships many more (figure thumbnails, family metadata, language) that
|
|
69
|
+
* we either ignore or carry through verbatim in `raw`.
|
|
70
|
+
*/
|
|
71
|
+
export interface GoogleXhrResultRow {
|
|
72
|
+
id: string;
|
|
73
|
+
rank?: number;
|
|
74
|
+
patent?: {
|
|
75
|
+
title?: string;
|
|
76
|
+
snippet?: string;
|
|
77
|
+
publication_number?: string;
|
|
78
|
+
inventor?: string;
|
|
79
|
+
assignee?: string;
|
|
80
|
+
filing_date?: string;
|
|
81
|
+
publication_date?: string;
|
|
82
|
+
grant_date?: string;
|
|
83
|
+
priority_date?: string;
|
|
84
|
+
language?: string;
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export interface GoogleXhrResponse {
|
|
88
|
+
results?: {
|
|
89
|
+
cluster?: Array<{
|
|
90
|
+
result?: GoogleXhrResultRow[];
|
|
91
|
+
}>;
|
|
92
|
+
total_num_results?: number;
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Flatten the nested `results.cluster[].result[]` into a single array, in
|
|
97
|
+
* server-supplied order.
|
|
98
|
+
*/
|
|
99
|
+
export declare function flattenGoogleXhrResults(body: GoogleXhrResponse): GoogleXhrResultRow[];
|
|
100
|
+
/**
|
|
101
|
+
* Project a single XHR row to the upstream-facing partial-PatentRecord
|
|
102
|
+
* shape. Empty / missing fields are left undefined rather than synthesised.
|
|
103
|
+
* Snippets contain HTML markup (e.g. `<b>` tags) which we strip.
|
|
104
|
+
*/
|
|
105
|
+
export declare function projectGoogleRowToRecord(row: GoogleXhrResultRow, sourceUrl: string): Partial<PatentRecord> & {
|
|
106
|
+
publication_number: string;
|
|
107
|
+
source_adapter: string;
|
|
108
|
+
};
|
|
109
|
+
export declare function stripHtml(input: string): string;
|
|
110
|
+
//# sourceMappingURL=_shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../../src/adapters/google-patents-web/_shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;;;;;;;GASG;AACH,MAAM,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AAC5D,eAAO,MAAM,mBAAmB,EAAE,uBACX,CAAC;AAExB;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,0HAC2F,CAAC;AAE1H,qBAAa,sBAAuB,SAAQ,KAAK;aAE7B,MAAM,EAAE,MAAM;aACd,GAAG,EAAE,MAAM;gBADX,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EAC3B,OAAO,EAAE,MAAM;CAKlB;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CA0BvE;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBzE;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAUR;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGjE;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,KAAK,CAAC;YAAE,MAAM,CAAC,EAAE,kBAAkB,EAAE,CAAA;SAAE,CAAC,CAAC;QACnD,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,iBAAiB,GACtB,kBAAkB,EAAE,CAQtB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,kBAAkB,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC,GAAG;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB,CAoBA;AAmBD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM/C"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::google-patents-web::_shared
|
|
3
|
+
* @does Shared HTTP helpers and types for the KEYLESS Google Patents web adapter — distinct from the BigQuery-backed google-patents-bq adapter (which requires a billed GCP project). This adapter uses the public XHR endpoint that drives patents.google.com and the SSR /patent/<id>/en bibliography page, both of which are reachable with only a real-browser User-Agent header.
|
|
4
|
+
* @needs src/engine/normalizer/patent-envelope.ts, src/types/patent.ts, node:fetch (global)
|
|
5
|
+
* @feeds src/adapters/google-patents-web/search.yaml, src/adapters/google-patents-web/get.ts
|
|
6
|
+
* @breaks throws GooglePatentsHttpError when the endpoint returns non-2xx or unparseable JSON; callers surface PATENT_API_DEPRECATED to the meta-command
|
|
7
|
+
* @invariants every outbound request carries a real-browser User-Agent — Google rejects bare `node-fetch`/`python-requests`; the @keyless-best-effort verification tag is emitted in adapter file headers
|
|
8
|
+
* @side-effects HTTPS egress to patents.google.com only; no env reads, no cookies
|
|
9
|
+
* @perf single request per call; XHR responses are ~40-100 KB
|
|
10
|
+
* @concurrency safe — pure functions plus stateless `fetch`
|
|
11
|
+
* @test covered transitively via tests/unit/adapters/google-patents-web/*.test.ts (none yet — adapters ship with live verification proof in docs/skills/patent-cookbook.md)
|
|
12
|
+
* @stability experimental — Google does not publish a stability contract for this XHR
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification keyless-best-effort
|
|
15
|
+
*/
|
|
16
|
+
export const KEYLESS_BEST_EFFORT = "keyless-best-effort";
|
|
17
|
+
/**
|
|
18
|
+
* Real-browser User-Agent string. Google's XHR endpoint returns 403 for the
|
|
19
|
+
* default `node/undici` UA; a Chrome string fixes that. Mirror the version
|
|
20
|
+
* Chrome currently ships rather than freezing on an old number so the header
|
|
21
|
+
* stays plausible if Google starts UA-version-gating in future.
|
|
22
|
+
*/
|
|
23
|
+
export const GOOGLE_PATENTS_UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36";
|
|
24
|
+
export class GooglePatentsHttpError extends Error {
|
|
25
|
+
status;
|
|
26
|
+
url;
|
|
27
|
+
constructor(status, url, message) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.status = status;
|
|
30
|
+
this.url = url;
|
|
31
|
+
this.name = "GooglePatentsHttpError";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* GET <url> with a real-browser UA. Returns parsed JSON; throws
|
|
36
|
+
* GooglePatentsHttpError on non-2xx or JSON parse failure.
|
|
37
|
+
*/
|
|
38
|
+
export async function fetchGooglePatentsJson(url) {
|
|
39
|
+
const response = await fetch(url, {
|
|
40
|
+
method: "GET",
|
|
41
|
+
headers: {
|
|
42
|
+
"User-Agent": GOOGLE_PATENTS_UA,
|
|
43
|
+
Accept: "application/json",
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
throw new GooglePatentsHttpError(response.status, url, `Google Patents XHR returned HTTP ${response.status}`);
|
|
48
|
+
}
|
|
49
|
+
let parsed;
|
|
50
|
+
try {
|
|
51
|
+
parsed = await response.json();
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
throw new GooglePatentsHttpError(response.status, url, `Google Patents XHR returned non-JSON body: ${err.message}`);
|
|
55
|
+
}
|
|
56
|
+
return parsed;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* GET <url> with a real-browser UA, return raw HTML text. Throws
|
|
60
|
+
* GooglePatentsHttpError on non-2xx.
|
|
61
|
+
*/
|
|
62
|
+
export async function fetchGooglePatentsHtml(url) {
|
|
63
|
+
const response = await fetch(url, {
|
|
64
|
+
method: "GET",
|
|
65
|
+
headers: {
|
|
66
|
+
"User-Agent": GOOGLE_PATENTS_UA,
|
|
67
|
+
Accept: "text/html,application/xhtml+xml",
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
if (!response.ok) {
|
|
71
|
+
throw new GooglePatentsHttpError(response.status, url, `Google Patents detail page returned HTTP ${response.status}`);
|
|
72
|
+
}
|
|
73
|
+
return await response.text();
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Build the public XHR query URL. Accepts a plain free-text query string and
|
|
77
|
+
* an optional limit (`num` parameter) and earliest-publication-year filter.
|
|
78
|
+
*
|
|
79
|
+
* The XHR endpoint expects a percent-encoded *inner* query string under the
|
|
80
|
+
* `url` parameter — the outer query is `?url=q%3Dfoo&exp=`. We percent-encode
|
|
81
|
+
* the inner once.
|
|
82
|
+
*/
|
|
83
|
+
export function buildGooglePatentsXhrUrl(query, limit, sinceYear) {
|
|
84
|
+
const cleaned = query.trim();
|
|
85
|
+
let inner = `q=${cleaned.replace(/\s+/g, "+")}`;
|
|
86
|
+
if (typeof limit === "number" && Number.isFinite(limit) && limit > 0) {
|
|
87
|
+
inner += `&num=${Math.min(100, Math.max(1, Math.floor(limit)))}`;
|
|
88
|
+
}
|
|
89
|
+
if (sinceYear && /^\d{4}$/.test(sinceYear)) {
|
|
90
|
+
inner += `&after=publication:${sinceYear}0101`;
|
|
91
|
+
}
|
|
92
|
+
return `https://patents.google.com/xhr/query?url=${encodeURIComponent(inner)}&exp=`;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Build the public detail page URL for a given publication number. Google
|
|
96
|
+
* accepts the segmented form `US-11741188-B2` and the compact form
|
|
97
|
+
* `US11741188B2`; we send the compact form to keep the URL short.
|
|
98
|
+
*/
|
|
99
|
+
export function buildGooglePatentsDetailUrl(pubNo) {
|
|
100
|
+
const compact = pubNo.replace(/-/g, "").toUpperCase();
|
|
101
|
+
return `https://patents.google.com/patent/${encodeURIComponent(compact)}/en`;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Flatten the nested `results.cluster[].result[]` into a single array, in
|
|
105
|
+
* server-supplied order.
|
|
106
|
+
*/
|
|
107
|
+
export function flattenGoogleXhrResults(body) {
|
|
108
|
+
const clusters = body.results?.cluster ?? [];
|
|
109
|
+
const out = [];
|
|
110
|
+
for (const cluster of clusters) {
|
|
111
|
+
const rows = cluster.result ?? [];
|
|
112
|
+
for (const row of rows)
|
|
113
|
+
out.push(row);
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Project a single XHR row to the upstream-facing partial-PatentRecord
|
|
119
|
+
* shape. Empty / missing fields are left undefined rather than synthesised.
|
|
120
|
+
* Snippets contain HTML markup (e.g. `<b>` tags) which we strip.
|
|
121
|
+
*/
|
|
122
|
+
export function projectGoogleRowToRecord(row, sourceUrl) {
|
|
123
|
+
const patent = row.patent ?? {};
|
|
124
|
+
const pubNo = (typeof patent.publication_number === "string" &&
|
|
125
|
+
patent.publication_number) ||
|
|
126
|
+
deriveCanonicalFromId(row.id);
|
|
127
|
+
const cleanSnippet = patent.snippet ? stripHtml(patent.snippet) : undefined;
|
|
128
|
+
return {
|
|
129
|
+
publication_number: pubNo,
|
|
130
|
+
title: patent.title ? patent.title.trim() : undefined,
|
|
131
|
+
abstract: cleanSnippet,
|
|
132
|
+
inventors: patent.inventor ? [{ name: patent.inventor.trim() }] : undefined,
|
|
133
|
+
assignees: patent.assignee ? [{ name: patent.assignee.trim() }] : undefined,
|
|
134
|
+
filing_date: patent.filing_date || undefined,
|
|
135
|
+
publication_date: patent.publication_date || undefined,
|
|
136
|
+
grant_date: patent.grant_date || undefined,
|
|
137
|
+
priority_date: patent.priority_date || undefined,
|
|
138
|
+
source_adapter: "google-patents-web",
|
|
139
|
+
source_url: sourceUrl,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/** `patent/US11741188B2/en` → `US11741188B2`. */
|
|
143
|
+
function deriveCanonicalFromId(id) {
|
|
144
|
+
const match = /patent\/([^/]+)/.exec(id);
|
|
145
|
+
return match ? match[1] : id;
|
|
146
|
+
}
|
|
147
|
+
const TAG_RE = /<[^>]+>/g;
|
|
148
|
+
const ENTITY_MAP = {
|
|
149
|
+
"&": "&",
|
|
150
|
+
"<": "<",
|
|
151
|
+
">": ">",
|
|
152
|
+
""": '"',
|
|
153
|
+
"'": "'",
|
|
154
|
+
"…": "…",
|
|
155
|
+
" ": " ",
|
|
156
|
+
};
|
|
157
|
+
export function stripHtml(input) {
|
|
158
|
+
return input
|
|
159
|
+
.replace(TAG_RE, "")
|
|
160
|
+
.replace(/&(?:amp|lt|gt|quot|#39|hellip|nbsp);/g, (m) => ENTITY_MAP[m] ?? m)
|
|
161
|
+
.replace(/\s+/g, " ")
|
|
162
|
+
.trim();
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=_shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_shared.js","sourceRoot":"","sources":["../../../src/adapters/google-patents-web/_shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src::adapters::google-patents-web::get
|
|
3
|
+
* @does Keyless single-publication detail fetch — parses the SSR meta-tag and `<abstract>` block on https://patents.google.com/patent/<id>/en using regex projection (no DOM, no Chrome).
|
|
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.get)
|
|
6
|
+
* @breaks PATENT_NOT_FOUND when the detail page returns 200 but carries no DC.title; PATENT_INVALID_NUMBER for empty input; PATENT_API_DEPRECATED on non-2xx HTTP
|
|
7
|
+
* @invariants output is a single canonical PatentRecord; abstract whitespace is normalised; HTML entities decoded; source_url is the literal page we hit
|
|
8
|
+
* @side-effects HTTPS egress to patents.google.com only
|
|
9
|
+
* @perf single page load (~350 KB); regex parse is linear in document length
|
|
10
|
+
* @concurrency safe — stateless
|
|
11
|
+
* @test verification proof in docs/skills/patent-cookbook.md
|
|
12
|
+
* @stability experimental
|
|
13
|
+
* @since 2026-05-18
|
|
14
|
+
* @verification keyless-best-effort
|
|
15
|
+
*/
|
|
16
|
+
interface DetailPageFields {
|
|
17
|
+
title?: string;
|
|
18
|
+
abstract?: string;
|
|
19
|
+
inventors: string[];
|
|
20
|
+
assignees: string[];
|
|
21
|
+
filing_date?: string;
|
|
22
|
+
publication_date?: string;
|
|
23
|
+
application_number?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Parse the Google Patents detail HTML into the subset of fields we surface
|
|
27
|
+
* on PatentRecord. The DC.* meta tags are the documented machine-readable
|
|
28
|
+
* surface (Dublin Core), and citation_* mirrors what Google Scholar's
|
|
29
|
+
* indexing crawler consumes.
|
|
30
|
+
*/
|
|
31
|
+
export declare function parseGooglePatentsDetail(html: string): DetailPageFields;
|
|
32
|
+
export declare function runGooglePatentsWebGet(kwargs: {
|
|
33
|
+
publication_number?: unknown;
|
|
34
|
+
}): Promise<unknown[]>;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=get.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/adapters/google-patents-web/get.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAcH,UAAU,gBAAgB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAeD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CA+CvE;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAoFrB"}
|