{"_id":"@240xu/dsh-websearch","_rev":"16-4724a29e35ca1ec24eb2217f71bec711","name":"@240xu/dsh-websearch","dist-tags":{"latest":"2.8.1"},"versions":{"2.0.0":{"name":"@240xu/dsh-websearch","version":"2.0.0","keywords":["dsh","deepseek-harness","plugin","web-search","mcp","exa","parallel","brave","tavily","serper","searxng","mojeek","claude","codex","cordis"],"author":{"name":"240xu","email":"2401826246@qq.com"},"license":"MIT","_id":"@240xu/dsh-websearch@2.0.0","maintainers":[{"name":"240xu","email":"2401826246@qq.com"}],"homepage":"https://github.com/240xu/dsh-websearch#readme","bugs":{"url":"https://github.com/240xu/dsh-websearch/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web"}},"dist":{"shasum":"42d9ee99dcfa233367d6e44bc0ed1bf55f809f93","tarball":"https://registry.npmjs.org/@240xu/dsh-websearch/-/dsh-websearch-2.0.0.tgz","fileCount":23,"integrity":"sha512-yaoPYYhRSL9mJ/z8xxnIk2CLxtuWo3+7MO01VCh4UKLFwf2v6eyTw1RQMn+UXp0y1vqD5s3RxQq5Sgu6ljI/Lw==","signatures":[{"sig":"MEQCIF33shZ/eaMhsryX7YyPThtlvErOWXjd7KgqBa6IjhHdAiBNyl1CetHFZQAPZtyjU30TawP1+WMrCp5SKoACDYR+xg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116763},"main":"lib/index.js","type":"module","exports":{".":{"default":"./lib/index.js"},"./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"5f65765c46008bb7b5d560320d27157835bf8294","_npmUser":{"name":"240xu","email":"2401826246@qq.com"},"repository":{"url":"git+https://github.com/240xu/dsh-websearch.git","type":"git"},"_npmVersion":"11.19.0","description":"Unified web search provider for DeepSeek Harness (ctx.web): 11 backends — Exa + Parallel + DDG + SearXNG (keyless), DeepSeek + Anthropic + OpenAI + Brave + Tavily + Serper + Mojeek (key-gated via Settings credentials). Registers provider id \"unified\" for ","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"*","@deepseek-ai/dsh-web":"*","@deepseek-ai/schemastery":"*","@deepseek-ai/dsh-settings":"*","@deepseek-ai/dsh-credentials":"*","@deepseek-ai/dsh-launch-environment":"*"},"_npmOperationalInternal":{"tmp":"tmp/dsh-websearch_2.0.0_1787411927952_0.6508201762494714","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@240xu/dsh-websearch","version":"2.0.1","keywords":["dsh","deepseek-harness","plugin","web-search","mcp","exa","parallel","brave","tavily","serper","searxng","mojeek","claude","codex","cordis"],"author":{"name":"240xu","email":"2401826246@qq.com"},"license":"MIT","_id":"@240xu/dsh-websearch@2.0.1","maintainers":[{"name":"240xu","email":"2401826246@qq.com"}],"homepage":"https://github.com/240xu/dsh-websearch#readme","bugs":{"url":"https://github.com/240xu/dsh-websearch/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web"}},"dist":{"shasum":"f21b35ac84cb9eb096027e0037d459c0f7a755e0","tarball":"https://registry.npmjs.org/@240xu/dsh-websearch/-/dsh-websearch-2.0.1.tgz","fileCount":23,"integrity":"sha512-07gbFdEDo7s2PuWQRbcI7OC+FRjTHx1mn6xijD0NW72+OIYktwrgECXYCj5uXJT3R0D8FSuFxMX6TdK6M00q3A==","signatures":[{"sig":"MEYCIQCz569JJImDOFW6AuigRF+349yAky5sE5zSJaVCqJzxAQIhAP02CNX8L0Go5SLIltK3jyIC4CWATCePQ1cViRiItr64","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116763},"main":"lib/index.js","type":"module","exports":{".":{"default":"./lib/index.js"},"./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"5f65765c46008bb7b5d560320d27157835bf8294","_npmUser":{"name":"240xu","email":"2401826246@qq.com"},"repository":{"url":"git+https://github.com/240xu/dsh-websearch.git","type":"git"},"_npmVersion":"11.19.0","description":"Unified web search provider for DeepSeek Harness (ctx.web): 11 backends — Exa + Parallel + DDG + SearXNG (keyless), DeepSeek + Anthropic + OpenAI + Brave + Tavily + Serper + Mojeek (key-gated via Settings credentials). Registers provider id \"unified\" for ","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"*","@deepseek-ai/dsh-web":"*","@deepseek-ai/schemastery":"*","@deepseek-ai/dsh-settings":"*","@deepseek-ai/dsh-credentials":"*","@deepseek-ai/dsh-launch-environment":"*"},"_npmOperationalInternal":{"tmp":"tmp/dsh-websearch_2.0.1_1787412344986_0.08124406274041052","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@240xu/dsh-websearch","version":"2.0.2","keywords":["dsh","deepseek-harness","plugin","web-search","mcp","exa","parallel","brave","tavily","serper","searxng","mojeek","claude","codex","cordis"],"author":{"name":"240xu","email":"2401826246@qq.com"},"license":"MIT","_id":"@240xu/dsh-websearch@2.0.2","maintainers":[{"name":"240xu","email":"2401826246@qq.com"}],"homepage":"https://github.com/240xu/dsh-websearch#readme","bugs":{"url":"https://github.com/240xu/dsh-websearch/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web"}},"dist":{"shasum":"15608052c320908d20af4a0ca084c7f8696bdb78","tarball":"https://registry.npmjs.org/@240xu/dsh-websearch/-/dsh-websearch-2.0.2.tgz","fileCount":23,"integrity":"sha512-GZVJXd4FEUR4uZ4danvbSeRxAyhYsb62Rq5Teij8IoUxBTE7t6pnD032V7xR2qgjCo4hnFS5XBKD2/Pt50yoTQ==","signatures":[{"sig":"MEQCID8GN106W2MjYfoizd2TIDE9xwb95FVvLlHE43W3KoIqAiAKS8ScmLRSjImMvBWpDTUrhCp5lk8XBe528Log9xdvCQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116909},"main":"lib/index.js","type":"module","exports":{".":{"default":"./lib/index.js"},"./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"87c4d21e74eb2c3fb9e7742bad98c2f1090fdd1e","_npmUser":{"name":"240xu","email":"2401826246@qq.com"},"repository":{"url":"git+https://github.com/240xu/dsh-websearch.git","type":"git"},"_npmVersion":"11.19.0","description":"Unified web search provider for DeepSeek Harness (ctx.web): 11 backends — Exa + Parallel + DDG + SearXNG (keyless), DeepSeek + Anthropic + OpenAI + Brave + Tavily + Serper + Mojeek (key-gated via Settings credentials). Registers provider id \"unified\" for ","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"*","@deepseek-ai/dsh-web":"*","@deepseek-ai/schemastery":"*","@deepseek-ai/dsh-settings":"*","@deepseek-ai/dsh-credentials":"*","@deepseek-ai/dsh-launch-environment":"*"},"_npmOperationalInternal":{"tmp":"tmp/dsh-websearch_2.0.2_1787418986100_0.9737960607777945","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"@240xu/dsh-websearch","version":"2.0.3","keywords":["dsh","deepseek-harness","plugin","web-search","mcp","exa","parallel","brave","tavily","serper","searxng","mojeek","claude","codex","cordis"],"author":{"name":"240xu","email":"2401826246@qq.com"},"license":"MIT","_id":"@240xu/dsh-websearch@2.0.3","maintainers":[{"name":"240xu","email":"2401826246@qq.com"}],"homepage":"https://github.com/240xu/dsh-websearch#readme","bugs":{"url":"https://github.com/240xu/dsh-websearch/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web"}},"dist":{"shasum":"5bbfcbc500a7f631d4f4324d0739706e41c20efe","tarball":"https://registry.npmjs.org/@240xu/dsh-websearch/-/dsh-websearch-2.0.3.tgz","fileCount":23,"integrity":"sha512-kxkAdEZaVHDij2cFK1yowK5dW/f+xhEewXjxca8gN8bUWGRrTT9RiOXcarSnCMa3A2gyx/aT+k4IjEiqsakTcw==","signatures":[{"sig":"MEUCIGPra0NghZaB9MLM0vDU4WSAh/LxjSWak/hcA+6n3hhMAiEAg9NQW1QXatowQqYkXOdpe02jNoLcFjmlFskLFHn83dw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":117899},"main":"lib/index.js","type":"module","exports":{".":{"default":"./lib/index.js"},"./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"87c4d21e74eb2c3fb9e7742bad98c2f1090fdd1e","_npmUser":{"name":"240xu","email":"2401826246@qq.com"},"repository":{"url":"git+https://github.com/240xu/dsh-websearch.git","type":"git"},"_npmVersion":"11.19.0","description":"Unified web search provider for DeepSeek Harness (ctx.web): 11 backends — Exa + Parallel + DDG + SearXNG (keyless), DeepSeek + Anthropic + OpenAI + Brave + Tavily + Serper + Mojeek (key-gated via Settings credentials). Registers provider id \"unified\" for ","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"*","@deepseek-ai/dsh-web":"*","@deepseek-ai/schemastery":"*","@deepseek-ai/dsh-settings":"*","@deepseek-ai/dsh-credentials":"*","@deepseek-ai/dsh-launch-environment":"*"},"_npmOperationalInternal":{"tmp":"tmp/dsh-websearch_2.0.3_1787463386080_0.44297300214161894","host":"s3://npm-registry-packages-npm-production"}},"2.0.4":{"name":"@240xu/dsh-websearch","version":"2.0.4","keywords":["dsh","deepseek-harness","plugin","web-search","mcp","exa","parallel","brave","tavily","serper","searxng","mojeek","claude","codex","cordis"],"author":{"name":"240xu","email":"2401826246@qq.com"},"license":"MIT","_id":"@240xu/dsh-websearch@2.0.4","maintainers":[{"name":"240xu","email":"2401826246@qq.com"}],"homepage":"https://github.com/240xu/dsh-websearch#readme","bugs":{"url":"https://github.com/240xu/dsh-websearch/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web"}},"dist":{"shasum":"75b94536cc876fc431e1e4aabb0478a82d714f7a","tarball":"https://registry.npmjs.org/@240xu/dsh-websearch/-/dsh-websearch-2.0.4.tgz","fileCount":23,"integrity":"sha512-npevoXbPMJwfeOu0G6vCM/SGnCz2wBdqqZOu4A7Tb4gpRReSr0JXxhXUpSq2KhKQvrsXSi8BzXcpwdjKPu2xTQ==","signatures":[{"sig":"MEYCIQCKnW1fY8ktLqtYpxwMx6SGDKRKKmb7Md3YmWELXg/bhgIhAOTW2lm1tekBTEYNFG3GYtt84Ed9c1i82Ch8XQ/8J+7V","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118757},"main":"lib/index.js","type":"module","exports":{".":{"default":"./lib/index.js"},"./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"33d3a63f98cdf5ad3555bd82aebf3ebfc1406a5a","_npmUser":{"name":"240xu","email":"2401826246@qq.com"},"repository":{"url":"git+https://github.com/240xu/dsh-websearch.git","type":"git"},"_npmVersion":"11.19.0","description":"Unified web search provider for DeepSeek Harness (ctx.web): 11 backends — Exa + Parallel + DDG + SearXNG (keyless), DeepSeek + Anthropic + OpenAI + Brave + Tavily + Serper + Mojeek (key-gated via Settings credentials). Registers provider id \"unified\" for ","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"*","@deepseek-ai/dsh-web":"*","@deepseek-ai/schemastery":"*","@deepseek-ai/dsh-settings":"*","@deepseek-ai/dsh-credentials":"*","@deepseek-ai/dsh-launch-environment":"*"},"_npmOperationalInternal":{"tmp":"tmp/dsh-websearch_2.0.4_1787478890104_0.4573477571638216","host":"s3://npm-registry-packages-npm-production"}},"2.0.5":{"name":"@240xu/dsh-websearch","version":"2.0.5","keywords":["dsh","deepseek-harness","plugin","web-search","mcp","exa","parallel","brave","tavily","serper","searxng","mojeek","claude","codex","cordis"],"author":{"name":"240xu","email":"2401826246@qq.com"},"license":"MIT","_id":"@240xu/dsh-websearch@2.0.5","maintainers":[{"name":"240xu","email":"2401826246@qq.com"}],"homepage":"https://github.com/240xu/dsh-websearch#readme","bugs":{"url":"https://github.com/240xu/dsh-websearch/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web"}},"dist":{"shasum":"01e2bbaae59e1e0a3b1e17d73c60e5012d340ccd","tarball":"https://registry.npmjs.org/@240xu/dsh-websearch/-/dsh-websearch-2.0.5.tgz","fileCount":23,"integrity":"sha512-HvWOb6TBGGlNTs1OVjiLI/iaGTBAxGVQ1RRoEMS9CHGJc7ah3llTfpa1CGVUvOqn0zJYY4tF8T6/bJgWZ4E9Kg==","signatures":[{"sig":"MEYCIQDOkEBwAHVb0P1QM1x4z+Frt48/GgXQVkbTUIIq8cqwXAIhAI6cg5R6kUWuaMHdtcN5HD60nv6qhNOU3K0gB3UUCk3q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121327},"main":"lib/index.js","type":"module","exports":{".":{"default":"./lib/index.js"},"./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"d5a1b3322014ef037ceed44888e10c6d7c99932a","_npmUser":{"name":"240xu","email":"2401826246@qq.com"},"repository":{"url":"git+https://github.com/240xu/dsh-websearch.git","type":"git"},"_npmVersion":"11.19.0","description":"Unified web search provider for DeepSeek Harness (ctx.web): 11 backends — Exa + Parallel + DDG + SearXNG (keyless), DeepSeek + Anthropic + OpenAI + Brave + Tavily + Serper + Mojeek (key-gated via Settings credentials). Registers provider id \"unified\" for ","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"*","@deepseek-ai/dsh-web":"*","@deepseek-ai/schemastery":"*","@deepseek-ai/dsh-settings":"*","@deepseek-ai/dsh-credentials":"*","@deepseek-ai/dsh-launch-environment":"*"},"_npmOperationalInternal":{"tmp":"tmp/dsh-websearch_2.0.5_1787487718719_0.7159464537525815","host":"s3://npm-registry-packages-npm-production"}},"2.0.6":{"name":"@240xu/dsh-websearch","version":"2.0.6","keywords":["dsh","deepseek-harness","plugin","web-search","mcp","exa","parallel","brave","tavily","serper","searxng","mojeek","claude","codex","cordis"],"author":{"name":"240xu","email":"2401826246@qq.com"},"license":"MIT","_id":"@240xu/dsh-websearch@2.0.6","maintainers":[{"name":"240xu","email":"2401826246@qq.com"}],"homepage":"https://github.com/240xu/dsh-websearch#readme","bugs":{"url":"https://github.com/240xu/dsh-websearch/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web"}},"dist":{"shasum":"d7b3ddff0978afe8b74eb4237528d09dcf6f3e32","tarball":"https://registry.npmjs.org/@240xu/dsh-websearch/-/dsh-websearch-2.0.6.tgz","fileCount":23,"integrity":"sha512-CZLq3SHMXN7QrphmdVm3BCw9Ng3NqtzEIP/sKRXuOPR/RUfKOV0vgao7v4YHyAtX/QY1RlEiOqOjNrlJEVh/qw==","signatures":[{"sig":"MEUCIQDIsJFSYRCkBr2UW55eYVC4FdszM4QbkzHGynM3QWnavgIgRLnTLXNKmHScu8QfrmM+Zw9rZw5+fgioP2N90idyjo8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121987},"main":"lib/index.js","type":"module","exports":{".":{"default":"./lib/index.js"},"./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"93bdff2c24423cbe031ad70144bbc198a6bf1307","_npmUser":{"name":"240xu","email":"2401826246@qq.com"},"repository":{"url":"git+https://github.com/240xu/dsh-websearch.git","type":"git"},"_npmVersion":"11.19.0","description":"Unified web search provider for DeepSeek Harness (ctx.web): 11 backends — Exa + Parallel + DDG + SearXNG (keyless), DeepSeek + Anthropic + OpenAI + Brave + Tavily + Serper + Mojeek (key-gated via Settings credentials). Registers provider id \"unified\" for ","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"*","@deepseek-ai/dsh-web":"*","@deepseek-ai/schemastery":"*","@deepseek-ai/dsh-settings":"*","@deepseek-ai/dsh-credentials":"*","@deepseek-ai/dsh-launch-environment":"*"},"_npmOperationalInternal":{"tmp":"tmp/dsh-websearch_2.0.6_1787590928269_0.3685440031502747","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@240xu/dsh-websearch","version":"2.1.0","keywords":["dsh","deepseek-harness","plugin","web-search","mcp","exa","parallel","brave","tavily","serper","searxng","mojeek","claude","codex","cordis"],"author":{"name":"240xu","email":"2401826246@qq.com"},"license":"MIT","_id":"@240xu/dsh-websearch@2.1.0","maintainers":[{"name":"240xu","email":"2401826246@qq.com"}],"homepage":"https://github.com/240xu/dsh-websearch#readme","bugs":{"url":"https://github.com/240xu/dsh-websearch/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web"}},"dist":{"shasum":"4fbbebe78bceeedd87798655dc8f2be6f43a054f","tarball":"https://registry.npmjs.org/@240xu/dsh-websearch/-/dsh-websearch-2.1.0.tgz","fileCount":25,"integrity":"sha512-HP5Ebq0IILPQ6uaODoVdWXOo30MloJD9FC6GN0n5xp+lVStEvhFeZpKBcbldwFFN+B02TREjARVCRQf1l39TmQ==","signatures":[{"sig":"MEUCIQC7bzl3ixjVB/67qEo9SLS5z3/74UW2Bo1W7yrVe/3KXwIgQGsiFhasAikoc2J99/NdECPDMYf05u3pMv9lcj/MRxQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":140111},"main":"lib/index.js","type":"module","exports":{".":{"default":"./lib/index.js"},"./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"ad692eaf2aefbcd6a8fee3bdc4d70c9af6be3a88","_npmUser":{"name":"240xu","email":"2401826246@qq.com"},"repository":{"url":"git+https://github.com/240xu/dsh-websearch.git","type":"git"},"_npmVersion":"11.19.0","description":"Unified web search provider for DeepSeek Harness (ctx.web): 11 backends — Exa + Parallel + DDG + SearXNG (keyless), DeepSeek + Anthropic + OpenAI + Brave + Tavily + Serper + Mojeek (key-gated via Settings credentials). Registers provider id \"unified\" for ","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"*","@deepseek-ai/dsh-web":"*","@deepseek-ai/schemastery":"*","@deepseek-ai/dsh-settings":"*","@deepseek-ai/dsh-credentials":"*","@deepseek-ai/dsh-launch-environment":"*"},"_npmOperationalInternal":{"tmp":"tmp/dsh-websearch_2.1.0_1787646268766_0.6383789286138746","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"@240xu/dsh-websearch","version":"2.1.1","keywords":["dsh","deepseek-harness","plugin","web-search","mcp","exa","parallel","brave","tavily","serper","searxng","mojeek","claude","codex","cordis"],"author":{"name":"240xu","email":"2401826246@qq.com"},"license":"MIT","_id":"@240xu/dsh-websearch@2.1.1","maintainers":[{"name":"240xu","email":"2401826246@qq.com"}],"homepage":"https://github.com/240xu/dsh-websearch#readme","bugs":{"url":"https://github.com/240xu/dsh-websearch/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web"}},"dist":{"shasum":"8077aee73e03f1fbc32b2a833996b953f76b6372","tarball":"https://registry.npmjs.org/@240xu/dsh-websearch/-/dsh-websearch-2.1.1.tgz","fileCount":25,"integrity":"sha512-O9mA2xwmxq7HYF5foovjWs0OMVaDHTtq4WNvje54vvUfIBMsnyK6+7pzAWxah1FRAgk31BPJMzTn2zgU/oxDuQ==","signatures":[{"sig":"MEUCIQDAs84IJlRGYs2RwIgDvisUvUdHbf2oq9tB5iE4eX6EFQIgSMvA7Z4T4nprY/up8VPVB4s5hMWfZbQM6MiSPUJa8MA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":140133},"main":"lib/index.js","type":"module","exports":{".":{"default":"./lib/index.js"},"./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"1be6586b729b17c2ed3148bccf683e2e12063101","_npmUser":{"name":"240xu","email":"2401826246@qq.com"},"repository":{"url":"git+https://github.com/240xu/dsh-websearch.git","type":"git"},"_npmVersion":"11.19.0","description":"Unified web search provider for DeepSeek Harness (ctx.web): 11 backends — Exa + Parallel + DDG + SearXNG (keyless), DeepSeek + Anthropic + OpenAI + Brave + Tavily + Serper + Mojeek (key-gated via Settings credentials). Registers provider id \"unified\" for ","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"*","@deepseek-ai/dsh-web":"*","@deepseek-ai/schemastery":"*","@deepseek-ai/dsh-settings":"*","@deepseek-ai/dsh-credentials":"*","@deepseek-ai/dsh-launch-environment":"*"},"_npmOperationalInternal":{"tmp":"tmp/dsh-websearch_2.1.1_1787648685302_0.7689530284903281","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@240xu/dsh-websearch","version":"2.2.0","keywords":["dsh","deepseek-harness","plugin","web-search","mcp","exa","parallel","brave","tavily","serper","searxng","mojeek","claude","codex","cordis"],"author":{"name":"240xu","email":"2401826246@qq.com"},"license":"MIT","_id":"@240xu/dsh-websearch@2.2.0","maintainers":[{"name":"240xu","email":"2401826246@qq.com"}],"homepage":"https://github.com/240xu/dsh-websearch#readme","bugs":{"url":"https://github.com/240xu/dsh-websearch/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web"}},"dist":{"shasum":"9a15c7da521ea52d6179c29993adb15351f32a06","tarball":"https://registry.npmjs.org/@240xu/dsh-websearch/-/dsh-websearch-2.2.0.tgz","fileCount":25,"integrity":"sha512-b9gN4P4aNQUZo4hgxTb/gqsscunWJ4p1Y4Sgqynzr73naKjTQGqHkaX30UDqeLDpNF7V3Y41ZDDXhZJMIGmZXQ==","signatures":[{"sig":"MEQCIDZg7NFvw6vsIRavEp5d6qrZUHB62Xj9zvjhOFyDTMLNAiBDqU/cGQKwdZzHIT+gPtEtaXGT6WCWYqf0dcrx9ZfJLw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142997},"main":"lib/index.js","type":"module","exports":{".":{"default":"./lib/index.js"},"./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"b8826df224f40d61e35577410f4d4898f10d9af8","_npmUser":{"name":"240xu","email":"2401826246@qq.com"},"repository":{"url":"git+https://github.com/240xu/dsh-websearch.git","type":"git"},"_npmVersion":"11.19.0","description":"Unified web search provider for DeepSeek Harness (ctx.web): 11 backends — Exa + Parallel + DDG + SearXNG (keyless), DeepSeek + Anthropic + OpenAI + Brave + Tavily + Serper + Mojeek (key-gated via Settings credentials). Registers provider id \"unified\" for ","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"*","@deepseek-ai/dsh-web":"*","@deepseek-ai/schemastery":"*","@deepseek-ai/dsh-settings":"*","@deepseek-ai/dsh-credentials":"*","@deepseek-ai/dsh-launch-environment":"*"},"_npmOperationalInternal":{"tmp":"tmp/dsh-websearch_2.2.0_1787677118554_0.4670351813154099","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@240xu/dsh-websearch","version":"2.3.0","keywords":["dsh","deepseek-harness","plugin","web-search","mcp","exa","parallel","brave","tavily","serper","searxng","mojeek","claude","codex","cordis"],"author":{"name":"240xu","email":"2401826246@qq.com"},"license":"MIT","_id":"@240xu/dsh-websearch@2.3.0","maintainers":[{"name":"240xu","email":"2401826246@qq.com"}],"homepage":"https://github.com/240xu/dsh-websearch#readme","bugs":{"url":"https://github.com/240xu/dsh-websearch/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web"}},"dist":{"shasum":"5aaebcee4edeee275b968b5698acde78fa4514c5","tarball":"https://registry.npmjs.org/@240xu/dsh-websearch/-/dsh-websearch-2.3.0.tgz","fileCount":25,"integrity":"sha512-pBBFzFbpNKCr6NDboALSiFpwd2gvgYq1QUdlv4ABj5txNMemuRJQprP0yEV9/IurYo/o7h3Yjm7pN7P6zmk48A==","signatures":[{"sig":"MEUCICx7O17hwAucXViGM0nnTC5xXT9MYUWcxTQFghX+aYHHAiEA+8TgQij5hcbRIK3z7g1s9W9/JXZtnf0gXp71JeWl1aM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":145246},"main":"lib/index.js","type":"module","exports":{".":{"default":"./lib/index.js"},"./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"59fae5b8c6d2f57644cc857cfe65d4fdbb2116c1","_npmUser":{"name":"240xu","email":"2401826246@qq.com"},"repository":{"url":"git+https://github.com/240xu/dsh-websearch.git","type":"git"},"_npmVersion":"11.19.0","description":"Unified web search provider for DeepSeek Harness (ctx.web): 11 backends — Exa + Parallel + DDG + SearXNG (keyless), DeepSeek + Anthropic + OpenAI + Brave + Tavily + Serper + Mojeek (key-gated via Settings credentials). Registers provider id \"unified\" for ","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"*","@deepseek-ai/dsh-web":"*","@deepseek-ai/schemastery":"*","@deepseek-ai/dsh-settings":"*","@deepseek-ai/dsh-credentials":"*","@deepseek-ai/dsh-launch-environment":"*"},"_npmOperationalInternal":{"tmp":"tmp/dsh-websearch_2.3.0_1787714402281_0.6053175364229619","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"@240xu/dsh-websearch","version":"2.4.0","keywords":["dsh","deepseek-harness","plugin","web-search","mcp","exa","parallel","brave","tavily","serper","searxng","mojeek","claude","codex","cordis"],"author":{"name":"240xu","email":"2401826246@qq.com"},"license":"MIT","_id":"@240xu/dsh-websearch@2.4.0","maintainers":[{"name":"240xu","email":"2401826246@qq.com"}],"homepage":"https://github.com/240xu/dsh-websearch#readme","bugs":{"url":"https://github.com/240xu/dsh-websearch/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web"}},"dist":{"shasum":"783b9ad41e117e13fe64b2fe34a1e04227ce1bc6","tarball":"https://registry.npmjs.org/@240xu/dsh-websearch/-/dsh-websearch-2.4.0.tgz","fileCount":23,"integrity":"sha512-iKeM8B/3jLEEddDW6bXN9NHlK7dilVlybjxqr+JS374yRgcvks2HUm0XUV8fMgdXyOracmQLnHQmLEeFK2T9AA==","signatures":[{"sig":"MEYCIQCksHg5hmrJwe+2npsdqHEUyaaI5qOvz0ZhBPtOQnYfvQIhAP3Y9+PGuaKBjrWHhWjjQjv4yGQPhnvHTTGF4ZJ16DeQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":135847},"main":"lib/index.js","type":"module","exports":{".":{"default":"./lib/index.js"},"./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"113cc7a8a82297210886c30b6616bdb197e6e4f1","_npmUser":{"name":"240xu","email":"2401826246@qq.com"},"repository":{"url":"git+https://github.com/240xu/dsh-websearch.git","type":"git"},"_npmVersion":"11.19.0","description":"Unified web search provider for DeepSeek Harness (ctx.web): 11 backends — Exa + Parallel + DDG + SearXNG (keyless), DeepSeek + Anthropic + OpenAI + Brave + Tavily + Serper + Mojeek (key-gated via Settings credentials). Registers provider id \"unified\" for ","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"*","@deepseek-ai/dsh-web":"*","@deepseek-ai/schemastery":"*","@deepseek-ai/dsh-settings":"*","@deepseek-ai/dsh-credentials":"*","@deepseek-ai/dsh-launch-environment":"*"},"_npmOperationalInternal":{"tmp":"tmp/dsh-websearch_2.4.0_1787729230989_0.9732469226034361","host":"s3://npm-registry-packages-npm-production"}},"2.7.2":{"name":"@240xu/dsh-websearch","version":"2.7.2","keywords":["dsh","deepseek-harness","plugin","web-search","mcp","exa","parallel","brave","tavily","serper","searxng","mojeek","claude","codex","cordis"],"author":{"name":"240xu","email":"2401826246@qq.com"},"license":"MIT","_id":"@240xu/dsh-websearch@2.7.2","maintainers":[{"name":"240xu","email":"2401826246@qq.com"}],"homepage":"https://github.com/240xu/dsh-websearch#readme","bugs":{"url":"https://github.com/240xu/dsh-websearch/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web"}},"dist":{"shasum":"ac6c733d10a15d30aa333a562b7ca94d0c6600e8","tarball":"https://registry.npmjs.org/@240xu/dsh-websearch/-/dsh-websearch-2.7.2.tgz","fileCount":28,"integrity":"sha512-d4VZD5XdLVGdEKQZU4AGMWuA8achSRhKcmuKCKpafM1BrQ0Fx3vXNBCGQh0DYlZWsAB7moKBm2QcCJCQhy8lKg==","signatures":[{"sig":"MEUCIQCFyeCTSNDmDFQYTzw22xpfpBswJE15J9hznrG3OKCL3gIgCVdLRuC1LY37PE/qpuf4Q5SLdpU/wJdJKftgc2JhbzM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC6gVKu9ubkQeQu0mvUpDgClEHoKXJcKBvwFSB1Ky957QIhAKhjgXaQktk+ePeZeerpj9MwW4MAFk8Kt9aq7z709Fl4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179515},"main":"lib/index.js","type":"module","exports":{".":{"default":"./lib/index.js"},"./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"3295f766b27fd96e8e14a91e3ab89d02edc676ae","_npmUser":{"name":"240xu","email":"2401826246@qq.com"},"repository":{"url":"git+https://github.com/240xu/dsh-websearch.git","type":"git"},"_npmVersion":"12.0.2","description":"Unified web search provider for DeepSeek Harness (ctx.web): 11 backends — Exa + Parallel + DDG + SearXNG (keyless), DeepSeek + Anthropic + OpenAI + Brave + Tavily + Serper + Mojeek (key-gated via Settings credentials). Registers provider id \"unified\" for ","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"*","@deepseek-ai/dsh-web":"*","@deepseek-ai/schemastery":"*","@deepseek-ai/dsh-settings":"*","@deepseek-ai/dsh-credentials":"*","@deepseek-ai/dsh-launch-environment":"*"},"_npmOperationalInternal":{"tmp":"tmp/dsh-websearch_2.7.2_1790546577366_0.6362200421253388","host":"s3://npm-registry-packages-npm-production"}},"2.7.3":{"name":"@240xu/dsh-websearch","version":"2.7.3","keywords":["dsh","deepseek-harness","plugin","web-search","mcp","exa","parallel","brave","tavily","serper","searxng","mojeek","claude","codex","cordis"],"author":{"name":"240xu","email":"2401826246@qq.com"},"license":"MIT","_id":"@240xu/dsh-websearch@2.7.3","maintainers":[{"name":"240xu","email":"2401826246@qq.com"}],"homepage":"https://github.com/240xu/dsh-websearch#readme","bugs":{"url":"https://github.com/240xu/dsh-websearch/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web"}},"dist":{"shasum":"726f5029070e715fdb983db4643226636a2e099a","tarball":"https://registry.npmjs.org/@240xu/dsh-websearch/-/dsh-websearch-2.7.3.tgz","fileCount":28,"integrity":"sha512-aADbtfZQbAMhriiLbKdomp0hww5c163ZWelCDdlmuQC+h+tQKge981TbNapnLoBAAZq7vb/dADVG8RVKkQ3yHQ==","signatures":[{"sig":"MEYCIQCPjQQcIG0eGugVj2fcvhuXofjVT3LJlQOw0DC9aemPHAIhAI2HWgu1xByDnNUqZcFkBf8GYpbS+QULNp0LyayWG23s","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDLGZoKP34zP2pH0AbpFUDfw++DOTQ8GyLrdyzsf4fgBQIgHp8zAx3MkO9hUBFtWUar6OcjSiNfJ3p2Ivh407PXBn8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":182596},"main":"lib/index.js","type":"module","engines":{"node":">=20.3"},"exports":{".":{"default":"./lib/index.js"},"./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"6a69eab9a2a852a26a2954167a4ce01979770467","_npmUser":{"name":"240xu","email":"2401826246@qq.com"},"repository":{"url":"git+https://github.com/240xu/dsh-websearch.git","type":"git"},"_npmVersion":"12.0.2","description":"Unified web search provider for DeepSeek Harness (ctx.web): 11 backends — Exa + Parallel + DDG + SearXNG (keyless), DeepSeek + Anthropic + OpenAI + Brave + Tavily + Serper + Mojeek (key-gated via Settings credentials). Registers provider id \"unified\" for ","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"*","@deepseek-ai/dsh-web":"*","@deepseek-ai/schemastery":"*","@deepseek-ai/dsh-settings":"*","@deepseek-ai/dsh-credentials":"*","@deepseek-ai/dsh-launch-environment":"*"},"_npmOperationalInternal":{"tmp":"tmp/dsh-websearch_2.7.3_1790685343294_0.38181971841913454","host":"s3://npm-registry-packages-npm-production"}},"2.8.0":{"name":"@240xu/dsh-websearch","version":"2.8.0","keywords":["dsh","deepseek-harness","plugin","web-search","mcp","exa","parallel","brave","tavily","serper","searxng","mojeek","claude","codex","cordis"],"author":{"name":"240xu","email":"2401826246@qq.com"},"license":"MIT","_id":"@240xu/dsh-websearch@2.8.0","maintainers":[{"name":"240xu","email":"2401826246@qq.com"}],"homepage":"https://github.com/240xu/dsh-websearch#readme","bugs":{"url":"https://github.com/240xu/dsh-websearch/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web"}},"dist":{"shasum":"9e983bb64b8820c0d34be66670b86e476f93a6fb","tarball":"https://registry.npmjs.org/@240xu/dsh-websearch/-/dsh-websearch-2.8.0.tgz","fileCount":30,"integrity":"sha512-Zna0KasI971go3kuOkMej7zDfNltU/SVByCgio+fZr+3yqeRMeTiu9kYeQh4zBmPpOaL78KRxanD8JA5HqqQwQ==","signatures":[{"sig":"MEYCIQDRmVW5Hy47diGB/9EM5Wd5uOxOgL/TsaIdEYMQlVhaugIhALKULhDz1Wv0QZ7fdv93FND/tYE2WJosyOJN3A7GAU5Q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGZiKKjvN/4FWvS+By1sAt0sOtOgxhyxVW9YT55Knc7eAiAjva1FoARE/KKPiCUc/qlMphksT+Ci1lfjed34+L+nwQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":196236},"main":"lib/index.js","type":"module","engines":{"node":">=20.3"},"exports":{".":{"default":"./lib/index.js"},"./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"27cc5df60257ffdc904cdda1c07af547333898f4","_npmUser":{"name":"240xu","email":"2401826246@qq.com"},"repository":{"url":"git+https://github.com/240xu/dsh-websearch.git","type":"git"},"_npmVersion":"12.0.2","description":"Unified web search provider for DeepSeek Harness (ctx.web): 11 backends — Exa + Parallel + DDG + SearXNG (keyless), DeepSeek + Anthropic + OpenAI + Brave + Tavily + Serper + Mojeek (key-gated via Settings credentials). Registers provider id \"unified\" for ","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"*","@deepseek-ai/dsh-web":"*","@deepseek-ai/schemastery":"*","@deepseek-ai/dsh-settings":"*","@deepseek-ai/dsh-credentials":"*","@deepseek-ai/dsh-launch-environment":"*"},"_npmOperationalInternal":{"tmp":"tmp/dsh-websearch_2.8.0_1790738003800_0.7533404974161884","host":"s3://npm-registry-packages-npm-production"}},"2.8.1":{"_id":"@240xu/dsh-websearch@2.8.1","dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-locale","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-api-remotes","@deepseek-ai/dsh-client-ui-settings"],"platform":"web"}},"bugs":{"url":"https://github.com/240xu/dsh-websearch/issues"},"dist":{"shasum":"a0634a14447a082d4af45ba91f3c3106e51cab61","tarball":"https://registry.npmjs.org/@240xu/dsh-websearch/-/dsh-websearch-2.8.1.tgz","fileCount":30,"integrity":"sha512-deBfGJ3BIfhxHCSPxJRw3tLayuCG805Dmf3bh6V2e0v+5/fiRB0tl7i5QYnivBhDhuIqV1ADnqg93cwPrrOvbw==","signatures":[{"sig":"MEUCIG5PuMk2dliFP/+36pnAaYJrZTLeELFoU+RMmB5q7elYAiEAzzjG6Z03yo8xEVUttd6gs5cGGs+DX3KST3Pvk3wCkWA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDgDCy6OlMRdPCpDVOlUgb9FHsnRWTEWRE7b/Rv/vv6zAIgdVvx/LQBlv/DM5j7wOv8iRUmv1iMbvf0BYQdbjANdpg="}],"unpackedSize":199263},"main":"lib/index.js","name":"@240xu/dsh-websearch","type":"module","author":{"name":"240xu","email":"2401826246@qq.com"},"engines":{"node":">=20.3"},"exports":{".":{"default":"./lib/index.js"},"./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"4caca4578f729a0accbbf50805ffe92e4aee02b3","license":"MIT","version":"2.8.1","_npmUser":{"name":"240xu","email":"2401826246@qq.com"},"homepage":"https://github.com/240xu/dsh-websearch#readme","keywords":["dsh","deepseek-harness","plugin","web-search","mcp","exa","parallel","brave","tavily","serper","searxng","mojeek","claude","codex","cordis"],"repository":{"url":"git+https://github.com/240xu/dsh-websearch.git","type":"git"},"_npmVersion":"12.0.2","description":"Unified web search provider for DeepSeek Harness (ctx.web): 11 backends — Exa + Parallel + DDG + SearXNG (keyless), DeepSeek + Anthropic + OpenAI + Brave + Tavily + Serper + Mojeek (key-gated via Settings credentials). Registers provider id \"unified\" for ","directories":{},"maintainers":[{"name":"240xu","email":"2401826246@qq.com"}],"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":"*","@deepseek-ai/dsh-web":"*","@deepseek-ai/schemastery":"*","@deepseek-ai/dsh-settings":"*","@deepseek-ai/dsh-credentials":"*","@deepseek-ai/dsh-launch-environment":"*"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-websearch_2.8.1_1790778717388_0.7989415643496982"}}},"time":{"created":"2026-08-22T15:18:47.784Z","modified":"2026-09-30T14:31:58.174Z","2.0.0":"2026-08-22T15:18:48.147Z","2.0.1":"2026-08-22T15:25:45.129Z","2.0.2":"2026-08-22T17:16:26.254Z","2.0.3":"2026-08-23T05:36:26.232Z","2.0.4":"2026-08-23T09:54:50.246Z","2.0.5":"2026-08-23T12:21:58.865Z","2.0.6":"2026-08-24T17:02:08.487Z","2.1.0":"2026-08-25T08:24:28.898Z","2.1.1":"2026-08-25T09:04:45.449Z","2.2.0":"2026-08-25T16:58:38.697Z","2.3.0":"2026-08-26T03:20:02.419Z","2.4.0":"2026-08-26T07:27:11.136Z","2.7.2":"2026-09-27T22:02:57.451Z","2.7.3":"2026-09-29T12:35:43.391Z","2.8.0":"2026-09-30T03:13:23.889Z","2.8.1":"2026-09-30T14:31:57.473Z"},"bugs":{"url":"https://github.com/240xu/dsh-websearch/issues"},"author":{"name":"240xu","email":"2401826246@qq.com"},"license":"MIT","homepage":"https://github.com/240xu/dsh-websearch#readme","keywords":["dsh","deepseek-harness","plugin","web-search","mcp","exa","parallel","brave","tavily","serper","searxng","mojeek","claude","codex","cordis"],"repository":{"url":"git+https://github.com/240xu/dsh-websearch.git","type":"git"},"description":"Unified web search provider for DeepSeek Harness (ctx.web): 11 backends — Exa + Parallel + DDG + SearXNG (keyless), DeepSeek + Anthropic + OpenAI + Brave + Tavily + Serper + Mojeek (key-gated via Settings credentials). Registers provider id \"unified\" for ","maintainers":[{"name":"240xu","email":"2401826246@qq.com"}],"readme":"# @240xu/dsh-websearch\n\n[![npm version](https://img.shields.io/npm/v/@240xu/dsh-websearch.svg)](https://www.npmjs.com/package/@240xu/dsh-websearch)\n[![license](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n\n> Aggregated web search provider for [DeepSeek Harness](https://github.com/deepseek-ai/dsh) — one plugin id `unified` that fans out to eleven backends concurrently, merges + URL-dedups results, and stays usable even when some backends go down.\n\nA pure-Cordis drop-in: registers ONE provider at `ctx.web` so the `dsh-web` selection rule never fires `WEB_PROVIDER_AMBIGUOUS`. Zero-config search out of the box (Exa + Parallel + DuckDuckGo + SearXNG are keyless); API-key backends (DeepSeek / Anthropic / OpenAI / Brave / Tavily / Serper / Mojeek) auto-activate once their key is supplied via the credentials service or env.\n\n---\n\nDSH（[DeepSeek Harness](https://github.com/deepseek-ai/dsh)）原生插件：向 `ctx.web` 注册**唯一**的聚合搜索 provider `unified`，内置十一后端并发 fan-out，合并 + URL 去重后返回——即使部分后端宕机仍可用。\n\n纯 Cordis 直插：只注册一个 provider，所以 `dsh-web` 的选择规则永远不会触发 `WEB_PROVIDER_AMBIGUOUS`。**零配置即可搜索**——Exa + Parallel + DuckDuckGo + SearXNG 四者皆无 key、开箱即用；DeepSeek / Anthropic / OpenAI / Brave / Tavily / Serper / Mojeek 在提供 API key 后自动激活。\n\n## Backends | 后端\n\n| id | key | endpoint | how it returns | notes |\n|---|---|---|---|---|\n| `exa` | none | `https://mcp.exa.ai/mcp` | streamable-http MCP, tool `web_search_exa { query, numResults }`, text blocks \"Title:/URL:/Published:/Highlights:\" | opencode 同源,无 key |\n| `parallel` | none | `https://search.parallel.ai/mcp` | streamable-http MCP, tool `web_search { objective, search_queries[], session_id?, model_name? }` returns JSON-string `{ search_id, results: [{ url, title, publish_date, excerpts[] }] }` | opencode 同源,无 key |\n| `ddg` | none | `https://html.duckduckgo.com/html/` | HTML scrape, decode `uddg=` redirect param for real URL + `result__snippet` | 兜底,零依赖 |\n| `searxng` | none/optional | `https://searx.be/search` (default) | REST JSON `/search?q=`, public instances unlimited | 元搜索,隐私友好 |\n| `brave` | `BRAVE_API_KEY` | `https://api.search.brave.com/res/v1/web/search` | REST JSON, independent index, 2000/mo free | 高质量,无 Google 偏见 |\n| `tavily` | `TAVILY_API_KEY` | `https://api.tavily.com/search` | REST JSON, AI-focused, `answer` + `results[]`, deep search | AI 专用,含答案摘要 |\n| `serper` | `SERPER_API_KEY` | `https://google.serper.dev/search` | REST JSON, scrapes Google `organic[]`, 2500/mo free | 极速,结构化 |\n| `mojeek` | `MOJEEK_API_KEY` | `https://api.mojeek.com/v1/search` | REST JSON, independent index, 1000/day free | 无追踪,英文为主 |\n| `deepseek` | `DEEPSEEK_API_KEY` | `https://api.deepseek.com/anthropic/v1/messages` | Anthropic Messages API + native `web_search_20250305` server tool, model `deepseek-v4-flash` | 与 dav web-search-deepseek 同机制 |\n| `anthropic` | `ANTHROPIC_API_KEY` | `https://api.anthropic.com/v1/messages` | Anthropic Messages + `web_search_20250305`, model `claude-sonnet-4-6` | Claude Code 同机制 |\n| `openai` | `OPENAI_API_KEY` | `https://api.openai.com/v1/responses` | Responses API native `web_search` tool, parse `url_citation` annotations | Codex 同机制 |\n\n> 可用性说明：available() 只做本地配置检查（不联网探测可达性）；密钥在每次搜索时按操作解析，缺失时该后端以明确错误码软失败（不阻塞其他后端）。全部缺 Key 时错误会指向设置页。\n\n### SearXNG 实例 | Public instances\n\nSearXNG 默认指向 `https://searx.be`；公共实例可用性随网络环境波动，失败时错误信息会提示换源。\n在设置面板修改 `searxngBaseURL` 即可切换，常见候选：\n\n| 实例 | 备注 |\n|---|---|\n| https://searx.be | 官方默认，部分地区不可达 |\n| https://searx.tiekoetter.com | 稳定性较好 |\n| https://priv.au | 隐私友好 |\n| 自托管 | 最可靠，支持 API Key（`searxngApiKeyEnv`） |\n\n## Install | 安装\n\n### 方式一：作为 profile 依赖安装（推荐，规范做法）\n\n```bash\ncd ~/.dsh/profiles/web\n# 在 package.json 的 dependencies 里加入：\n#   \"@240xu/dsh-websearch\": \"file:/path/to/@240xu/dsh-websearch\"\npnpm install\n```\n\n插件自带 `dsh.bundle` 元数据（package.json 声明 `\"dsh\": {\"bundle\": {\"patch\": \"./cordis.patch.yml\"}}`），把它加入 profile package.json 的 `dsh.profile.bundles` 列表后即自动注册，**无需**在 cordis.patch.yml 手写条目。\n\n只需在 `~/.dsh/profiles/web/cordis.patch.yml` 里把内置 web_search 工具指到 unified provider：\n\n```yaml\n- id: web\n  name: '@deepseek-ai/dsh-web'\n  config:\n    searchProvider: unified\n- id: web-search-deepseek\n  name: '@deepseek-ai/dsh-web-search-deepseek'\n  disabled: true\n```\n\n重启 `dsh web` 即生效。\n\n## Settings | 配置\n\n> v2.0.3 起，配置界面位于 **Settings → 左侧栏「搜索 / Web Search」**（顶级分区，与通用/模型/插件同级）。\n> 每个 API Key 字段旁有 **「获取 Key ↗」** 直达对应平台控制台；保存即写入凭证库并立即生效。\n\n\n插件向 DSH 设置面板注册 `unified-search` namespace（Settings → Unified Search），全部字段扁平化、开箱可编辑：\n\n**全局**\n\n| 字段 | 默认 | 说明 |\n|---|---|---|\n| `numResults` | 8 | 每次搜索返回结果数（1-50） |\n| `concurrency` | 6 | 并发后端数（1-10） |\n| `backendTimeoutMs` | 30000 | 单后端超时毫秒 |\n| `recency` | any | 时间范围过滤：day / week / month / year（映射到各后端原生参数） |\n| `language` | 空 | 搜索语言，如 en、zh-CN（SearXNG/Brave/Serper 支持） |\n| `safeSearch` | true | 安全搜索开关（SearXNG/Brave 支持） |\n| `dedupStrategy` | url | url 仅按链接去重；url+title 额外合并同标题的转载镜像 |\n| `rerank` | false | 按查询词相关性重排序（确定性；并列时保持后端优先级） |\n\n**v2.1 结果策略**：设置面板新增「结果策略」分区。时间/语言过滤按各后端能力自动映射——Brave `freshness/country/search_lang`、Tavily `time_range`、Serper `tbs/hl/gl`（Google 日期语法）、SearXNG `time_range/language`、DDG `df`；不支持的后端自动忽略对应维度。内部超时以真实原因失败（backend \"<id>\" timed out after Nms），不再被静默降级为取消；Mojeek 的 API Key 改走 Authorization 头，不再出现在 URL 中。\n\n**结果健康遥测（默认开）**：每次搜索的 `content` 尾部附一行 `[websearch backends] exa ✓5ms/3 · ddg ✗30000ms`，\n模型可据此自诊断并建议用户调整设置；设置面板「结果策略」可关闭（`resultTelemetry`）。\n\n**11 个后端开关**：`enableExa` / `enableParallel` / `enableDdg` / `enableSearxng`（默认开）；`enableBrave` / `enableTavily` / `enableSerper` / `enableMojeek` / `enableDeepseek` / `enableAnthropic` / `enableOpenai`（默认关）\n\n**API Key 授权**（credential-ref，填环境变量名，实际 key 存于 credentials 服务或环境变量）：\n\n| 字段 | 默认引用 |\n|---|---|\n| `braveApiKeyEnv` | `BRAVE_API_KEY` |\n| `tavilyApiKeyEnv` | `TAVILY_API_KEY` |\n| `serperApiKeyEnv` | `SERPER_API_KEY` |\n| `mojeekApiKeyEnv` | `MOJEEK_API_KEY` |\n| `deepseekApiKeyEnv` | `DEEPSEEK_API_KEY` |\n| `anthropicApiKeyEnv` | `ANTHROPIC_API_KEY` |\n| `openaiApiKeyEnv` | `OPENAI_API_KEY` |\n| `searxngApiKeyEnv` | `SEARXNG_API_KEY`（私有实例可选） |\n\n**Base URL / Model**：每个 key-gated 后端都有对应 `${id}BaseURL`；DeepSeek/Anthropic/OpenAI 另有 `${id}Model`；Tavily 有 `tavilySearchDepth`（basic/advanced）。\n\n环境变量兜底：未在 credentials 配置时回退读同名环境变量；`DSH_UNIFIED_SEARCH_BACKENDS` 可逗号分隔强制指定启用集合。\n\n## v2.8.1 SettingsForms 适配 | What's new in v2.8.1\n\n- **0.2.0 设置面板表单**：Config 标记 `meta.volatile`——0.2.0 SettingsForms 从插件 Config 自动生成表单，但 volatileForm 只保留 volatile 字段（此前 websearch 表单为空）；现整棵 Config 成为 0.2.0 表单。裁决与考证见 dsh-plugin-hub/docs/reviews/cross-settings-forms.md。\n- 删除 0.2.0 线上与可见 UI 自相矛盾的 \"no installSection\" console.warn（0.1.5 路径不变）。\n- 补齐全部裸字段（×ApiKeyEnv/×BaseURL/×Model）的 description——0.2.0 表单渲染唯一用户可见文案来自 meta.description。\n\n## v2.8.0 查全查多 | What's new in v2.8.0\n\n面向「查的多一点、查的全一点」的检索深度升级，全部 feature-gated、默认关：\n\n### 1. multiQuery 多查询 RRF 融合（`multiQueryEnabled`，默认关）\n\n- 门控启发式（刻意从严）：查询长度 > 60 字符，或含 `vs / and / 比较 / 对比 / 和` 分隔词，才触发；简单查询单扇出，行为与旧版完全一致（arXiv:2404.01037：盲目多查询会劣化）。\n- 触发后派生 ≤3 个子查询（原查询永远参与融合且保持全权重），各自走完整 11 后端扇出，再用 RRF（k=60）融合：出现在多个子查询结果里的条目被提升，单列表独占条目按位次衰减；URL 去重、首见元数据保留。\n- 遥测行合并各变体并截断至 12 条，避免淹没结果。\n\n### 2. deepCoverage 深度覆盖（`deepCoverage`，默认关）\n\n- 每后端请求条数上调至 `ceil(maxResults × 1.5)`，全局去重后仍按 maxResults 截断——牺牲带宽换覆盖面。\n- 后端能力适配（feature-detect，不破坏旧参数）：Tavily 自动切 `search_depth: advanced`（2 credits，多 snippet/URL）；SearXNG 类目扩为 `general,news,it`（Search API `categories` 逗号列表）。\n- Exa：`inferExaCategory` 从查询推断 data category（github / research paper / news，仅高置信注入）。\n\n### 3. 运维可观测（P2）\n\n- `GET /api/websearch/history` 响应新增 `backends` 字段：每后端最近真实成败/延迟/熔断状态（`{id, ok, ms, at, failCount, cooled}`，无错误串无凭证），兜底冗余度可观测。\n\n### 4. per-backend 超时上限（P2）\n\n- `ddg` / `searxng` 专属超时上限 5s（`min(5s, backendTimeoutMs)`，全局默认仍 30s、配置更短则以配置为准）——不可达后端不再拖住整个扇出尾。实测见 docs/real-call-2.8.0.md。\n\n## v2.7.3 兼容修复 | What's new in v2.7.3\n\n- **DSH 0.1.7 客户端兼容（P0）**：settingsScope 客户端服务在 0.1.7 被移除；现改为 feature-detect——0.1.5（或装 dsh-settings-scope-shim）行为不变，0.1.7 无 shim 时设置卡片优雅停用（console.warn 指引），客户端不再静默全死。\n- **DSH 0.1.7 服务端（P1）**：SettingsForms 无 installSection，原 typeof 守卫静默跳过；现输出一次性 console.warn（搜索功能经 cordis config 不受影响），SettingsForms 迁移已立牌。\n- **engines**：声明 `node >= 20.3`（AbortSignal.any 实测需求，Node 18/20.0-20.2 首次搜索即 TypeError）。\n- description 瘦身（版本历史移回本文件/CHANGELOG.md）。\n- **Windows 双端（P2）**：缓存/历史目录回退改用 `os.homedir()`（此前 `process.env.HOME` 在 Windows 通常未设 → 相对路径 → 缓存静默失效）。\n\n## v2.7.2 补丁 | What's new in v2.7.2\n\n- 设置项 label：6 个新设置项在 schema 层挂用户语言 label（含单位尾注，如「缓存有效期（秒）」），宿主渲染不再回退 camelCase 键名；description 同步以人话名称开头（真机渲染行为归视觉待办 V5）。\n\n## v2.7.1 评审修复 | What's new in v2.7.1\n\n- **缓存 key 加入 enabledBackends 选择集**（arch-review P1-1）：切换后端组合后立即拿到与新配置一致的结果，不再吃旧组合缓存。\n- **缓存命中路径复用 URL scheme 白名单**（纵深防御）：被篡改的缓存文件里的 javascript:/data: 条目在命中时同样被过滤。\n- **history 并发写串行化**：record() 经进程内 promise 链串行，杜绝并发搜索完成时的丢失更新；单条写入仍为 tmp+rename 原子替换。\n- **history 路由信任围栏**：两条 /api/websearch/* 路由要求回环 Host（防 DNS rebinding）+ same-site 浏览器上下文（防跨站 text/plain CSRF）；无头客户端（curl）放行只读 GET。\n- **熔断冷却时长支持 0**：`breakerCooldownMs=0` 显式关闭冷却（此前静默回退 60s）。\n- **设置文案**：6 个新设置项改用户语言并按【缓存】/【熔断】/【历史】分组，单位（秒/毫秒）写入说明。\n- **互操作**：新增 window 事件 `dsh-websearch:open-settings`（devkit 命令联动）；收到时经 devkit toast 提示设置路径（宿主无分区跳转 API）。\n\n## v2.7.0 新增 | What's new in v2.7.0\n\n三大增量功能，全部经设置开关控制、默认为保守值，且不改变既有结果语义（v2.6.0 提示词原样保留）：\n\n### 1. 搜索结果磁盘缓存（默认开）\n\n- 相同 **(整形后查询 + filters + maxResults + 启用后端集合)** 在 TTL 内直接命中缓存，不打任何后端；`sources` 与首次搜索完全一致。\n- 命中时 `content` 追加一行 `[websearch cache] cache hit, age Ns`。\n- 存储位置：`$DSH_HOME/cache/websearch/results/`，单条目一个 JSON 文件，tmp+rename 原子写，超出上限按最旧淘汰；任何 fs 错误都被吞掉，缓存坏了绝不影响搜索。\n- 设置：`cacheEnabled`（默认 true）、`cacheTtl`（秒，默认 900）。\n\n### 2. 后端熔断器（默认开，保守阈值）\n\n- 同一后端**连续失败 3 次**进入 **60s 冷却**；冷却期内 eligible 选择直接跳过该后端，遥测行标注 `id ⏸cooled Ns`。\n- 状态与 `recordBackendHealth` 共用（健康条目新增 `failCount` / `cooledUntil` 字段），任意一次成功立即复位。\n- **Fail-open 兜底**：若所有候选后端都处于冷却期，则全部放行照常扇出——熔断器永远只会让搜索更快，不会让它更差。\n- 设置：`breakerEnabled`（默认 true）、`breakerThreshold`（默认 3）、`breakerCooldownMs`（默认 60000）。\n\n### 3. 搜索历史 API（默认开，只追加 / 只读暴露）\n\n- 每次搜索（含缓存命中）追加一条记录，环形上限 50 条，新在前；文件 `$DSH_HOME/cache/websearch/history.json`，写前原子替换。\n- `GET /api/websearch/history` → `{ ok, entries: [{ query, time, resultCount, backendsOk, backendsTotal }] }`（只读，无凭证、无 URL）。\n- `POST /api/websearch/history/clear` → `{ ok, cleared: true }` 显式清空。\n- 设置：`historyEnabled`（默认 true）。\n\n## Design | 设计\n\n- **One provider, no ambiguity**: a single `registeredSearchProvider({id:\"unified\"})` — the `dsh-web` seam's selection rule picks it unambiguously, and `search()` caps `maxResults` itself.\n- **`Promise.allSettled` fan-out**: every enabled + available backend fires concurrently; a single backend failure is demoted to a soft `null` so the rest still contribute — only when ALL fail does the provider throw `WEB_PROVIDER_ERROR`.\n- **Per-backend abort demotion**: a single backend aborting becomes soft-null; the provider only rethrows `WEB_ABORTED` when the caller's own `AbortSignal` fires.\n- **Dedup strategies**: `url` keeps the historical URL-key merge with cross-backend field fill-in; `url+title` additionally collapses same-story syndicated mirrors (title Jaccard >= 0.9, CJK-aware tokenizer) while still enriching the kept entry.\n- **Deterministic rerank (optional)**: query-term overlap scoring (title x3 / snippet x2 / URL x1); stable ties preserve fan-out priority — same input always yields the same order.\n- **Honest timeouts**: each backend runs under an internal abort controller merged into the caller signal; when only the internal timer fires, the failure is reclassified as WEB_PROVIDER_ERROR (\"backend <id> timed out\") instead of being masked as a user cancellation.\n- **Concurrency & Timeout Control**: `concurrency` (default 6) limits simultaneous calls; `backendTimeoutMs` (default 30s) caps each backend.\n- **Streamable-http MCP, custom handshake**: `lib/util/mcp-client.js` implements `initialize → notifications/initialized → tools/call` with `Mcp-Session-Id` header caching against Exa and Parallel — no dependency on the full MCP SDK.\n- **Host-logger diagnostics**: each backend routes request/outcome through lib/util/log.js to the host logger (ctx.logger), best-effort and never thrown - deliberately NOT session events: the session event vocabulary is a closed set third-party plugins must not extend (an unknown envelope type makes the whole session log unreadable).\n\n## Architecture | 架构\n\n```\nlib/\n  index.js                 # name/inject/Config/apply — registers settings + provider\n  provider.js              # UnifiedSearchProvider — fan-out, abort demotion, dedup, truncate, concurrency, timeout\n  util/\n    abort.js               # isAbortError / searchAborted / throwIfSearchAborted / maybeAbortError\n    mcp-client.js          # streamable-http MCP client (initialize + tools/call + session cache)\n    log.js                 # recordBackendRequest / recordBackendOutcome → session event log\n  backends/\n    exa.js                 # Exa (web_search_exa) via mcp-client\n    parallel.js            # Parallel (web_search) via mcp-client\n    ddg.js                 # DuckDuckGo HTML scrape (uddg redirect decode)\n    searxng.js             # SearXNG REST JSON (keyless)\n    brave.js               # Brave Search REST (key-gated)\n    tavily.js              # Tavily REST (key-gated, AI answer + deep search)\n    serper.js              # Serper.dev REST (key-gated, Google scrape)\n    mojeek.js              # Mojeek REST (key-gated)\n    anthropic-like.js      # shared: DeepSeek + Anthropic (Messages API + web_search_* server tool)\n    openai.js              # OpenAI /responses + web_search tool (url_citation parsing)\n    index.js               # unified registry + individual exports\ntests/\n  parse.test.js            # 28 unit tests for each backend's pure parse fn\n  provider.test.js         # 5 fan-out tests (merge/dedup, abort demotion, all-fail, maxResults cap, concurrency)\n```\n\n## Test | 测试\n\n```bash\nnode --test tests/\n```\n\nv2.7.0 起共 76+ tests pass（`node --test \"tests/*.test.js\" \"test/*.test.mjs\"`）。\n\n## 权威依据与取舍 | Authoritative sources & design trade-offs\n\nv2.7.0 缓存/熔断/历史三项的依据与刻意取舍（含查证过的反例）：\n\n1. **熔断器（Circuit Breaker）**：出处 Michael T. Nygard《Release It!》(Pragmatic Bookshelf, 2007) 与 Microsoft Azure Architecture Center「Circuit Breaker pattern」https://learn.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker 。经典状态机是 Closed → Open → Half-Open（半开态放行少量探测请求）。**本插件刻意省略半开态**：冷却到期即视为 Closed（下一次真实搜索就是探测），失败则立即重新开窗——因为这里的\"请求\"是一次多后端扇出中的单个后端调用，探测请求必然真实发生且失败成本只是一次软降级，无需额外探测计数器；同时保留 fail-open 兜底（全部冷却时放行），比经典模式更保守。\n2. **缓存失效（TTL-only vs 事件驱动）**：Cloudflare「Retention vs Freshness (TTL)」https://developers.cloudflare.com/cache/concepts/retention-vs-freshness/ 与「Revalidation」https://developers.cloudflare.com/cache/concepts/revalidation/ 。搜索结果没有可靠的原站变更信号可订阅（网页索引持续变化），事件驱动失效无锚点；TTL-only + 把 TTL 做成设置项（默认 900s）+ key 纳入后端组合，是\"可接受的最终一致性\"。取舍：900s 内索引更新不可见——对搜索场景可接受，且用户可调低。\n3. **原子写（tmp + renameSync）**：POSIX 上 rename(2) 原子替换（Node 文档：newPath 已存在时覆盖）；Windows 上 libuv 将 fs.rename 映射为 MoveFileExW(MOVEFILE_REPLACE_EXISTING)（libuv#283 https://github.com/joyent/libuv/issues/283 ，LWN 讨论 https://lwn.net/Articles/682988/ 指出 MS 文档不承诺该调用的原子性）。**结论：POSIX 双端原子；Windows 实践上等价但官方文档不背书**——因此本插件在写入端额外做了兜底：读端永远校验 JSON 完整性、坏条目按 miss 处理并删除，即使 Windows 上出现半写状态也不会返回坏数据。\n4b. **查全查多（v2.8.0）**：Tavily Search API（`search_depth: advanced` 2 credits、`max_results` 0-20、`include_answer`、topic=news 时间加权）https://docs.tavily.com/api-reference/endpoint/search ；Exa Search API（type 分类检索、category 枚举、livecrawl；注意 2026 版 coding-agent 指南声明 neural 为 legacy 术语、且告诫勿臆造 category 值——本插件只注入 OpenAPI 枚举内的高置信值）https://exa.ai/docs/reference/search-api-guide-for-coding-agents 与 https://github.com/exa-labs/openapi-spec/blob/master/exa-openapi-spec.yaml ；SearXNG Search API（`categories` 逗号多类目、`language`）https://docs.searxng.org/dev/search_api.html ；Brave Search API（`freshness`、`result_filter`，本轮仅调研未接线）https://api-dashboard.search.brave.com/app/documentation 。多查询融合：RRF 出自 Cormack et al. 2009，RAG-Fusion 实现 https://github.com/Raudaschl/rag-fusion ；HyDE https://arxiv.org/abs/2212.10496 ；**门控依据** arXiv:2404.01037（盲目多查询劣化）——因此 multiQuery 默认关、启发式从严、原查询全权重参与。\n4c. **per-backend 超时**：不可达主机的 TCP 连接失败不受应用层超时保护，只能靠 abort 计时器兜底；ddg（HTML 抓取）与 SearXNG（公共实例无 SLA）是拖尾主力，5s 上限取「P50 成功延迟的一个数量级」。\n4d. **搜索历史隐私**：Article 29 Working Party 意见书 WP148 https://ec.europa.eu/justice/article-29/documentation/opinion-recommendation/files/2008/wp148_en.pdf 认定查询日志（query + 时间 + 来源标识）属个人数据；EFF 六条自保建议 https://w2.eff.org/Privacy/search/searchtips.pdf 的第一条是\"别在搜索词里放 PII\"——说明 query 天然可能携带 PII（人名、账号、地址）。本插件的取舍：历史只存 {query, time, resultCount, backendsOk/Total}（无 IP、无 cookie、无结果 URL）、环形 50 条自动滚动即短保留、本机存储不出网、提供 historyEnabled 开关与 POST clear 端点。**未做 query 脱敏**：脱敏会破坏\"查看最近搜了什么\"的核心用途，且本机单用户场景下该数据本就在 DSH 会话日志里存在；若未来历史跨设备同步，脱敏/加密是上线前置条件。\n\n## License | 许可\n\nMIT © 2026 240xu\n","readmeFilename":"README.md"}