{"_id":"pi-web-access","_rev":"39-3b0240e21d45e9959216dbf6cbd6b677","name":"pi-web-access","dist-tags":{"latest":"0.28.0"},"versions":{"0.4.2":{"name":"pi-web-access","version":"0.4.2","keywords":["pi-package"],"_id":"pi-web-access@0.4.2","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"aa8912c2f60fb0447828d273ed223c0ef4a6735e","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.4.2.tgz","fileCount":11,"integrity":"sha512-xgQJeREUUUDpqoTqHv7GwC6h3InIt2/XZWw3RAeOw+mQBtnb6zbiYEC4+B9ICqyT/8uA1fVRLLIGZFg4Mp5npA==","signatures":[{"sig":"MEUCIQD6a5ZgylMnrV/Ab0oKhBQs1sXzBfXAeQj/gvrBYy15agIgFImt3U4/s4zDi7VK4yF4w/T9I1AFJvmmxnC1xqFDcG4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1344129},"type":"module","gitHead":"88b7bef8bff13f1f48325828e06f45d1bc90c792","_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"_npmVersion":"11.6.2","description":"<p>   <img src=\"banner.png\" alt=\"pi-web-access\" width=\"1100\"> </p>","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.4.0","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.4.2_1769539510902_0.027850833153359122","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"pi-web-access","version":"0.4.3","keywords":["pi-package"],"_id":"pi-web-access@0.4.3","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"53721089229ece5ce593f84347a0ef03647b587f","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.4.3.tgz","fileCount":11,"integrity":"sha512-zXVE7I4nyouU2KnXOpk9oorGVi9425OAE6wIYJOxBkcoQUN2hwURyU5a6qB7SqyzbSU8E0tb3jBJANUITG6ehw==","signatures":[{"sig":"MEUCIQCQ1K455BkTvKpZVldEjpXwYTfkbiFThbmjsZGPb3wfMQIgUiUNM5EAepjl76zZTONgoEtxCPJAXJRO1LEwPMFScrY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1344126},"type":"module","gitHead":"90f1eaec4d695f6e2945b693b323486a0601d8c2","_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"_npmVersion":"11.6.2","description":"<p>   <img src=\"banner.png\" alt=\"pi-web-access\" width=\"1100\"> </p>","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.4.0","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.4.3_1769583205852_0.8665804327391868","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"pi-web-access","version":"0.4.4","keywords":["pi-package"],"_id":"pi-web-access@0.4.4","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"e86345a5a97b119fbe83493cc8aec0c0d078c12f","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.4.4.tgz","fileCount":11,"integrity":"sha512-ZIEglj4DUwTaWkp54rwXEDfgKR2i/VxwGEa5RirPHGLJF1OYjQq3Dhy02d8RA2cGlodVioVw/DX/XIADOWswgA==","signatures":[{"sig":"MEQCIDBUafL2MLOEzbtVz0hMSIp0Fi78HDiSeUbnG1qqF1fGAiBx1vOdrgIVPaMu3dVQNa31/ytdh2vog7ftp0ZQeT7EHw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1344268},"type":"module","gitHead":"6fde1fec3f3fe16610c150ab8989247b9454df28","_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"_npmVersion":"11.6.2","description":"<p>   <img src=\"banner.png\" alt=\"pi-web-access\" width=\"1100\"> </p>","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.4.0","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.4.4_1769992794697_0.41551307824622885","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"pi-web-access","version":"0.4.5","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","perplexity","fetch","scraping"],"_id":"pi-web-access@0.4.5","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"a9566859b7a039034008a326ca2f7ab07ce18075","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.4.5.tgz","fileCount":11,"integrity":"sha512-A3JNDrbYKhELPekDN0P7s7KDzxPa17ifLcT77YVNQYJfIZaYJJxFUfnIMvV5nt900gnwUj/iLvPPMD1sFWsl7A==","signatures":[{"sig":"MEUCIQDnmNdupyxHnxZjcIK3wwvEirx7i2knasNiNUB0xem2AwIgORJALeNV2UfBT9LXMrJ+Gi9lNSzCyKkgVBz8r+gct3Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1344442},"type":"module","gitHead":"03bd6b3207c49557d243f516387312a4993f40d9","_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"_npmVersion":"11.6.2","description":"<p>   <img src=\"banner.png\" alt=\"pi-web-access\" width=\"1100\"> </p>","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.4.0","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.4.5_1769992967338_0.9286045141468429","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"pi-web-access","version":"0.5.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","perplexity","fetch","scraping"],"_id":"pi-web-access@0.5.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"b9d3224c8a14b3084ea49a07a80a1c459e280e9d","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.5.0.tgz","fileCount":13,"integrity":"sha512-EZ6oc47PzWHMRkU3Q439bt6I/SJm5xf4OSKkHgDEFVN7/plJkI49czK0hkJP7f1TT1/5x4kbJ661FkreRGTYpg==","signatures":[{"sig":"MEUCIQCv+JCJd0b4mGHqb280w/B8HgwQw4RjcoKNjg7yn0xkvQIgBMG/77xhUVo0q8uWAXHRRO4gLyCkSZ3e6DqdRzSaid0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1368044},"type":"module","gitHead":"5f5f90ea4ffa11b26a42bc252be85cf2502acc18","_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"_npmVersion":"11.6.2","description":"<p>   <img src=\"banner.png\" alt=\"pi-web-access\" width=\"1100\"> </p>","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.4.0","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.5.0_1769997706405_0.2153250744942976","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"pi-web-access","version":"0.5.1","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","perplexity","fetch","scraping"],"_id":"pi-web-access@0.5.1","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"pi":{"skills":["./skills"],"extensions":["./index.ts"]},"dist":{"shasum":"342912fd3e07be11c9cb6736dcb3785155f3cff8","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.5.1.tgz","fileCount":14,"integrity":"sha512-lhnuPld2bX5g+efm2aZyTXaofJUHDz7VL9UO677GFTMyBl5mh933uqCS/rIbIcjxBOvIcHqTmwCsRPkSmINg2Q==","signatures":[{"sig":"MEUCIQCZfRkotUswl2suVQlWGWNx41U2DtTled05IwWipjknwgIgdJY+2wj+TIe2fyyMN8dEDvwPvlB5Mc281ppw1bedzFk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1375843},"type":"module","gitHead":"db08867a19fc9af95b5702f7024c882a2507fe4e","_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"_npmVersion":"11.6.2","description":"<p>   <img src=\"banner.png\" alt=\"pi-web-access\" width=\"1100\"> </p>","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.4.0","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.5.1_1770052779300_0.5931671521225914","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"pi-web-access","version":"0.7.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","perplexity","fetch","scraping"],"_id":"pi-web-access@0.7.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","skills":["./skills"],"extensions":["./index.ts"]},"dist":{"shasum":"0c31f8f789dd607a3a645b4a9f5ec40161b2edf4","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.7.0.tgz","fileCount":23,"integrity":"sha512-a47M5paLGcoR99VJGf9veSrxXGv9Qi3WI/syq4dTuZM/T3NU2bIbUyY43gNOlztZc2PAj9IgGP/E2ss5G6Qz+w==","signatures":[{"sig":"MEQCIE2SiZY2b4bQlkCNLtfes2NdgWWg02x48aaSIRbBt78LAiB8q2bTX4apn2CO9izKeu6aDKoHfHD3WuK1b0AOee5vTQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6584699},"type":"module","gitHead":"1b04ef0e8d9b5c7cf1f499942ec0460efefef345","_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"_npmVersion":"11.6.2","description":"<p>   <img src=\"banner.png\" alt=\"pi-web-access\" width=\"1100\"> </p>","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.4.0","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.7.0_1770148424839_0.6629880851738534","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"pi-web-access","version":"0.7.1","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.7.1","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","skills":["./skills"],"extensions":["./index.ts"]},"dist":{"shasum":"a0d3f43c173361a9bebde0d3a43b339b6e197263","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.7.1.tgz","fileCount":23,"integrity":"sha512-eKoUrkvcbadkaLqzhocLrnxCWz7ieplPtPUZad/xM6FEp3WR0cFUa8aCiclGKUbhvm42y/9CAuChN42q4SRxBg==","signatures":[{"sig":"MEUCICMXM6ajc1dgX/Qc+mI1YHyaK6NvZWFRPBHKJ3/jCVF/AiEAgDSaNV3iemMH9ytHpbzdI5UIXYJ9fdnxDpIi3PiBEWA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6585489},"type":"module","gitHead":"b26866bfaeb06e121acf022eefe5bac044213281","_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.4.0","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.7.1_1770149812430_0.9803764405148927","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"pi-web-access","version":"0.7.2","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.7.2","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","skills":["./skills"],"extensions":["./index.ts"]},"dist":{"shasum":"2655392581a54a249550d6048747239b89c62e2a","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.7.2.tgz","fileCount":24,"integrity":"sha512-DJMDT/Ud6QvUXk60jcFu7oC9aOkM69/K9HcYFkyIpvJxCmpvIpavJCQz/605y1ZW0Qz5CiA5TueNJS3wepAZsQ==","signatures":[{"sig":"MEQCIFRZDLRtQsJ2AQcW93YCbNWWJHS+XPov748bsokDy7UmAiB+Oh0EXsj+Wnp7sLTe8yLuzRkNkGcITat2ZYGpF8UEZw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6583777},"type":"module","gitHead":"8a5bb9d1a061b99486adf9bb144a75d7b4fe6095","_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.4.0","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.7.2_1770152545241_0.7621346658719266","host":"s3://npm-registry-packages-npm-production"}},"0.7.3":{"name":"pi-web-access","version":"0.7.3","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.7.3","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","skills":["./skills"],"extensions":["./index.ts"]},"dist":{"shasum":"46712f4c67c9396f0e67163acdb73f63ad59a6c8","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.7.3.tgz","fileCount":24,"integrity":"sha512-kpDjoz09/0e5FFCDszIn7FBkSgFKMMw8tFz1Vxa6iqsilrqGR7PgEjCefyVSyuDPlaYiYBMZxSwrGt4/oh7jqg==","signatures":[{"sig":"MEYCIQCXiyo0Y6ztTXMt2mprZWy1q7a6AMECJQ1aJj8+39esFAIhAJER1vu0fc5tje8JlOBl5YDGYJQqkXEqu9DmHYeGCWeb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6588816},"type":"module","gitHead":"b702b4a397147d71294ba70eacd68374c77e0105","_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.4.0","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.7.3_1770360511700_0.828877423843787","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"pi-web-access","version":"0.10.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.10.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","skills":["./skills"],"extensions":["./index.ts"]},"dist":{"shasum":"85f9f268d91e8605d19284cf7016fe8e2d345b27","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.10.0.tgz","fileCount":27,"integrity":"sha512-kNhjCoJFhOABCzeDS45FCxXH7UriIoWvwNuYZ6VcufJmkm5zSeYuhVP5EgDaRvWXah1VgvKKXbl6V0gRR1039g==","signatures":[{"sig":"MEQCIBMP45R4Xq9HSx9w3DiDrkzTfOcJ5NuRGQW46++OYAToAiBNbPVhZ4nwLT3vBKD+UxAGwBDf1hkyzoFLXCHexHbX8g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6679445},"type":"module","gitHead":"b0791cca8ccb59472422233847f2689acfbdea9e","_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.4.0","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.10.0_1771424923803_0.4531903502672887","host":"s3://npm-registry-packages-npm-production"}},"0.10.2":{"name":"pi-web-access","version":"0.10.2","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.10.2","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","skills":["./skills"],"extensions":["./index.ts"]},"dist":{"shasum":"5273a69700d2feaa4bcc45bcb56fcb92fb0dae7f","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.10.2.tgz","fileCount":27,"integrity":"sha512-K3OeL1drOsoF22yvoRD+wpAQcWUDfgDG2R6/4uB63/GjovXBlV6t0FV66N1g2csqcBYLdMILf894F7MFXYJgtA==","signatures":[{"sig":"MEYCIQDmdaduwSg02BPVP6GSxvzTnhuz8ZajaHAvsvGEWctn4gIhAKXnXAHBKggh8SMC98TIDYiNPwoLS7E4hTsxbFeL03w0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6680649},"type":"module","gitHead":"4461c2bcb2d871bd8b7b54ee5ecadee20bf3a1f8","_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.4.0","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.10.2_1771432032852_0.5353356394695812","host":"s3://npm-registry-packages-npm-production"}},"0.10.3":{"name":"pi-web-access","version":"0.10.3","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.10.3","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","skills":["./skills"],"extensions":["./index.ts"]},"dist":{"shasum":"1b4bc2cb26c8118212bbf2f03121764785b7436a","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.10.3.tgz","fileCount":27,"integrity":"sha512-NF2m+WatSnSW2gAC8gGBD+Yt3iGqMqYxVUtUN599Epf+h3rJDjs4iM4PmfdGRuz8+MpdBTyz5lsXvfXDEOBNSg==","signatures":[{"sig":"MEQCIFACT0JQfh8R8gbS4JlpGKTc+KyU0eSnuXC2hfrJUeyJAiB3gh3gDTlkaLF3bGIk66jKo33nfh4k71ID2Wtus6ZU7g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6689488},"type":"module","gitHead":"374c144ded173f0a7535657fc5d0791bbe09d88c","_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.4.0","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.10.3_1773293278517_0.7722591502157565","host":"s3://npm-registry-packages-npm-production"}},"0.10.4":{"name":"pi-web-access","version":"0.10.4","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.10.4","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","skills":["./skills"],"extensions":["./index.ts"]},"dist":{"shasum":"d2c5ab02d81d6a96329bab9968e2e2686a79e9b8","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.10.4.tgz","fileCount":29,"integrity":"sha512-6zK/Qi8mLrcpswGwAlbBVxOIdfN1iQ6HMbFRx3VH61jg8BvopTWUv8i1lKC+ELIn8R/iKLxrT40CJRD9FxA4zg==","signatures":[{"sig":"MEQCIEY80d8P9HiqJ1ImziFqi1YINQtMkIS6XTjnd1vCSKslAiBQSs6FzSHz6ocoavnwj8V2VhtD5WqTCLamGLrPK0JagA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6841080},"type":"module","gitHead":"37d70019eebb4f3479f58d6ed8c107660f60bc6d","_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.4.0","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.10.4_1774652467526_0.07823634289509629","host":"s3://npm-registry-packages-npm-production"}},"0.10.5":{"name":"pi-web-access","version":"0.10.5","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.10.5","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","skills":["./skills"],"extensions":["./index.ts"]},"dist":{"shasum":"8272a8bda37977cb0c0c10bf788b1e5abe39c075","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.10.5.tgz","fileCount":29,"integrity":"sha512-BATOZBoJPjOhGm2L4r5hGUpdquXNpFCV97XiFejsp9kck9gjh768X6PDOjySc5dI1UxhrYx+ec3b/3QyiaHw2Q==","signatures":[{"sig":"MEQCIBRsh/zD/9oSxUTAExtQXAFNKTe5hntw52MX0lW5G+mUAiBR0MLT5Gy+tfx5B/Z+1kWd91uy7HZteIqY8Seg4/1cqA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6841647},"type":"module","gitHead":"521b29651911c9146ff85a04ae193026df4776f7","_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.4.0","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.10.5_1775266127549_0.7940676635500776","host":"s3://npm-registry-packages-npm-production"}},"0.10.6":{"name":"pi-web-access","version":"0.10.6","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.10.6","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","skills":["./skills"],"extensions":["./index.ts"]},"dist":{"shasum":"97befb2a45c57737657eb7327823fc8eb2ece18a","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.10.6.tgz","fileCount":29,"integrity":"sha512-GXLxcDcKYV5Lu5vZvhZmwABJ2sl/aSd/VoPgITt/5bAyF88B0/TdAfQx2vDOqpKhkCugngnXcZPyNf+zrMqrHw==","signatures":[{"sig":"MEYCIQDoHZL+cjB0ePAhtKqqAcSBY+ZryEv/JM8lSDa2oK0+3AIhAJrX8L8XkSpDUi9UFK5Qhs5ta76ncdtGvJy3PpC2e9Ex","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6842507},"type":"module","gitHead":"b378e5d80d424806058e819b262f72e5f6b58b7d","_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.4.0","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.10.6_1775268899666_0.17797573015361134","host":"s3://npm-registry-packages-npm-production"}},"0.10.7":{"name":"pi-web-access","version":"0.10.7","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.10.7","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","skills":["./skills"],"extensions":["./index.ts"]},"dist":{"shasum":"92ad5ce96d22fcf4655e707b040186455c8fefff","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.10.7.tgz","fileCount":32,"integrity":"sha512-HbRN2dMGpgvtUrpTI4EEWKXDs/miZ+9s9ZOQl4uj9tb4NhRYTuXNrztrUAD1PPNP5XkFi0vosUwz7GbGGchZSw==","signatures":[{"sig":"MEUCIQDuhGdrp57imnr369vUXO4ud2J9Ml06Ub0cEfCkgeZftQIgWp8We00dS7NoZXlqj78uGvB2aos7phg7ut8V3JNWnv8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6852655},"type":"module","gitHead":"076bf0db5e739b200286ca37486e4edd8d19123c","scripts":{"test":"node --test"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.6.2","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.10.7_1777757587424_0.3660182671917418","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"pi-web-access","version":"0.12.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.12.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","skills":["./skills"],"extensions":["./index.ts"]},"dist":{"shasum":"95d26f3bf100d944a2721ff9bf4cf3c075027503","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.12.0.tgz","fileCount":52,"integrity":"sha512-qyX3oaAxUvwjMN7Uix4joMMX93vYRqaoR9++KtgPi53a6Xnqyp87V8lueDazKTsiSMzbdrr0PZbckRU7/ztu1g==","signatures":[{"sig":"MEQCIEPw0qu5uJtzjV1qV6caQn3LuXYl+wtUEA3YFRXkjVU8AiAVeIMsUyf8lyLePJjS33H/a+0fNh04WqerJHqFGMIQEQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6986805},"type":"module","gitHead":"2a7cb5d4c974f03bb489c6d3a851b283448b2408","scripts":{"test":"node --test"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"10.9.8","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, Tavily, Exa, Perplexity, and Gemini.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"unpdf":"^1.6.2","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.12.0_1782284635670_0.32653169882902855","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"pi-web-access","version":"0.13.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.13.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","skills":["./skills"],"extensions":["./index.ts"]},"dist":{"shasum":"e85808ebfa6969f247b424aeae9172dbaf2bb997","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.13.0.tgz","fileCount":53,"integrity":"sha512-ny0bHisMWdobmu1hcMp/jqjaRh6pYrH7dctBK2CVyRF4ia7bP47RnOPYdG1yiks9ohtcanWir5Hl9EFap8h0zQ==","signatures":[{"sig":"MEUCIQCFa3P0ffZaD3hjddJepXWaCiVYDjLZfCkYe+ib4EqhFQIgKDKzAyLwJc7K7PS4NIgHmpzsclNlJA8352eDDMXfsKQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7004031},"type":"module","gitHead":"7bdc30a65cf77273eb9c0034647b373bda4060d7","scripts":{"test":"node --test"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"10.9.8","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, Tavily, Exa, Perplexity, and Gemini.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"unpdf":"^1.6.2","p-limit":"^6.1.0","linkedom":"^0.16.0","turndown":"^7.2.0","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.13.0_1782373298533_0.7914739716198258","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"pi-web-access","version":"0.14.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.14.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","extensions":["./index.ts"]},"dist":{"shasum":"6b9c4ce48500993400eace08501f4d1f87474c91","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.14.0.tgz","fileCount":44,"integrity":"sha512-7RDVCfYkcGSgWMtroDCq47davp6W36Nc4ETLd8dhyPjox/rA89nxUwvvjba+ln39G28uiebnTh5G83UYFjkjWw==","signatures":[{"sig":"MEUCIQDO/myoArC8haO8tbPoP0Ec26TsDdURAFUmI7mt4/OzDwIgEXTzpWHfk5NK6OC0nI79IFzRB4ex/0tB0ung0Yyft2Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7059659},"type":"module","gitHead":"58ce1566b5959552cf9e8b9f227b158b199a4975","scripts":{"test":"node --test","typecheck":"tsc","audit:runtime":"npm audit --omit=dev --omit=peer"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.16.0","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, Tavily, SERPdive, AnySearch, SearXNG, Firecrawl extraction, Exa, Perplexity, and Ge","directories":{},"_nodeVersion":"24.18.0","dependencies":{"unpdf":"^1.6.2","p-limit":"^6.1.0","typebox":"^1.1.38","linkedom":"^0.16.0","turndown":"^7.2.0","promise.try":"^2.0.1","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/turndown":"^5.0.6"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.14.0_1785009579552_0.9540440784267767","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"name":"pi-web-access","version":"0.15.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","tinyfish","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.15.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","extensions":["./index.ts"]},"dist":{"shasum":"33d8864020704e74f4ef5fec933075c7e2529119","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.15.0.tgz","fileCount":45,"integrity":"sha512-62ir9Z5K8oCPZVFJRCYeV0uzsTHNEi01p84nn/5NkTYFhVQzxLVooA2DU83hTeWt2DlwaiijYyoPx6yxHrC4LA==","signatures":[{"sig":"MEUCIQDjrXtO2q1cajr0SbA33uW3ldSf4whBGAogEWgXR1l66gIgGkFXiJzI53OBTRef5l3tNx4ycKf82Qrhv9zdzro9yfw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7088606},"type":"module","gitHead":"b537183632d555d1b2e61cb8f6bdf585766f2380","scripts":{"test":"node --test","typecheck":"tsc","audit:runtime":"npm audit --omit=dev --omit=peer"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Tavily, SERPdive, AnySearch, SearXNG, Firecrawl extraction, Exa, Perplexi","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.6.2","p-limit":"^6.1.0","typebox":"^1.1.38","linkedom":"^0.16.0","turndown":"^7.2.0","promise.try":"^2.0.1","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/turndown":"^5.0.6"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.15.0_1785220803483_0.5936450183467139","host":"s3://npm-registry-packages-npm-production"}},"0.16.0":{"name":"pi-web-access","version":"0.16.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","tinyfish","search1api","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.16.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","extensions":["./index.ts"]},"dist":{"shasum":"2160c6ea05b7ebed4ccfb47d19b5e9b272065ed4","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.16.0.tgz","fileCount":47,"integrity":"sha512-PhtT3vVR0hH1xWSxMO65zwoW4gW7kphA1U/a5zAVa3QqdYXnmRgH/i82P5hVv7EpYBoFy/jV8nQhX3AF4OTaPg==","signatures":[{"sig":"MEUCIGSmTHOsUq/jHtGT5EdPbEBPc0HQyHRsubc9mNyycnzIAiEAm+svIxNkPihppm3dJoIvfHiTk3JZ08hA1TbdFhnwdp4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7120963},"type":"module","gitHead":"59a79f9b843c0ee5896da0ecc05e2395226f0064","scripts":{"test":"node --test","typecheck":"tsc","audit:runtime":"npm audit --omit=dev --omit=peer"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Search1API, Tavily, SERPdive, AnySearch, SearXNG, Firecrawl extraction, E","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.6.2","p-limit":"^6.1.0","typebox":"^1.1.38","linkedom":"^0.16.0","turndown":"^7.2.0","promise.try":"^2.0.1","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/turndown":"^5.0.6"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.16.0_1785426752641_0.6284345209482072","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"pi-web-access","version":"0.17.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","tinyfish","search1api","searchinfinity","querit","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.17.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","extensions":["./index.ts"]},"dist":{"shasum":"f3ef97b037ffd3d720a9bbab885dc00a064f9676","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.17.0.tgz","fileCount":50,"integrity":"sha512-rDAhkIzYtBmCCNgstTJ/zFnw91V64TQqhqLOeGXFxmnJaxE45nj+L4BkUPMYSUb3WFexDDYdGlONyBLLKE4eVw==","signatures":[{"sig":"MEUCICOI17iR2ZzjWC11HbuQELmGu/eBHcx2UFv0uACTH8q9AiEA+23zLgXjLcfcoR0dmdPVRQRmz7cG/Mp30Vqa8pNQxXA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7167672},"type":"module","gitHead":"c702b3be11bfbc832489eb7cfe31d9bbbbb2cc27","scripts":{"test":"node --test","typecheck":"tsc","audit:runtime":"npm audit --omit=dev --omit=peer"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, SERPdive, AnySearch, SearXNG,","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.6.2","p-limit":"^6.1.0","typebox":"^1.1.38","linkedom":"^0.16.0","turndown":"^7.2.0","promise.try":"^2.0.1","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/turndown":"^5.0.6"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.17.0_1785453278097_0.6358587176728627","host":"s3://npm-registry-packages-npm-production"}},"0.17.1":{"name":"pi-web-access","version":"0.17.1","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","tinyfish","search1api","searchinfinity","querit","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.17.1","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","extensions":["./index.ts"]},"dist":{"shasum":"184ef78d2da858e85e50f08cbd9e8998198e49c8","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.17.1.tgz","fileCount":50,"integrity":"sha512-AZaDlr6HE4Mn3P7/bokbukGcTqlqGqy/Am+vurxfk9g6L2iZMERLIEAMcZI7aFamrNBBcJ+js1B70ZSgye2xEQ==","signatures":[{"sig":"MEYCIQCCAvJlGqa7YppLwfDFP4GEbO6eEJw5AI9KrT2eNUMIggIhAJdpSutV+rL3ed3E1mgELs7sqKqwhXeih+pEV2k5XmD8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7167887},"type":"module","gitHead":"2a186dbebab7be605d8c615ae33dd3f2e649666b","scripts":{"test":"node --test","typecheck":"tsc","audit:runtime":"npm audit --omit=dev --omit=peer"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, SERPdive, AnySearch, SearXNG,","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.6.2","p-limit":"^6.1.0","typebox":"^1.1.38","linkedom":"^0.16.0","turndown":"^7.2.0","promise.try":"^2.0.1","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/turndown":"^5.0.6"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.17.1_1785520929995_0.009184218383673448","host":"s3://npm-registry-packages-npm-production"}},"0.18.0":{"name":"pi-web-access","version":"0.18.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","tinyfish","search1api","searchinfinity","querit","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.18.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","extensions":["./index.ts"]},"dist":{"shasum":"ee2d325b247b0239eab0d20b6b27eea698a42df4","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.18.0.tgz","fileCount":58,"integrity":"sha512-UVLWaNBHrbbe2jnpYq+uVJdPgoExz8HevkI7r3VSboZ6AT/S7oxsxpJY/a72mUt9jAy41512ndVxfxh/CIuYqg==","signatures":[{"sig":"MEQCIFjyGRHz5H/V4oSw/N8Ab15c21pssH/K1wK+kEZwbvEXAiACR7uFoPMSR+N7fVcRIy45HpnA88pUazuJ1xnyiRu5zg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7302388},"type":"module","gitHead":"d2aab00dcf0547572276d9de4bc4a2a49d640e13","scripts":{"test":"node --test","typecheck":"tsc","audit:runtime":"npm audit --omit=dev --omit=peer"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, SERPdive, Kagi, Ollama, AnySe","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.6.2","p-limit":"^6.1.0","typebox":"^1.1.38","linkedom":"^0.16.0","turndown":"^7.2.0","promise.try":"^2.0.1","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/turndown":"^5.0.6"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.18.0_1785727243336_0.46120552275653526","host":"s3://npm-registry-packages-npm-production"}},"0.19.0":{"name":"pi-web-access","version":"0.19.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","tinyfish","search1api","searchinfinity","querit","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.19.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","extensions":["./index.ts"]},"dist":{"shasum":"a58f9994301c8c2e6b3b54066a7b8b78d51f8890","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.19.0.tgz","fileCount":59,"integrity":"sha512-F3NCRlIg0zc4/IvCXwBXhxfcoIPmEFTBucjCYIeJ7RhzR22Fb0yDy8QucAVkN91oBEOGwYEy6+j6C6S8/1ZtZw==","signatures":[{"sig":"MEQCIFlFCYT3SPTINcR2wnAVyxruHfgWDXcj2BBvpun5nk/wAiATnqB+eOblt5sIgVCkzId40P7fHGLbX3gBUylLgjKeJA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7327182},"type":"module","gitHead":"7bf05f9acc4a61d9ff50927fa8be7ad3f87d77b6","scripts":{"test":"node --test","typecheck":"tsc","audit:runtime":"npm audit --omit=dev --omit=peer"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Jina, SERPdive, Kagi, Ollama,","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.6.2","p-limit":"^6.1.0","typebox":"^1.1.38","linkedom":"^0.16.0","turndown":"^7.2.0","promise.try":"^2.0.1","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/turndown":"^5.0.6"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.19.0_1786176049287_0.12484623863820432","host":"s3://npm-registry-packages-npm-production"}},"0.20.0":{"name":"pi-web-access","version":"0.20.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","tinyfish","search1api","searchinfinity","querit","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.20.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","extensions":["./index.ts"]},"dist":{"shasum":"cbc93c524cf6bfe1374647ed060421662b29b151","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.20.0.tgz","fileCount":61,"integrity":"sha512-jMHiNe6hGQYmblSJsYBA2HdGuEe2sOM1GSVvVRMESwJoPvdfClaln6NlRD0/SOfBo1PiLCD1OUQhSrW4gMF3vQ==","signatures":[{"sig":"MEQCIBFrK9pJD8cb1lrBe9X4H7eBg28Y532wbcO3BSHGiq6kAiBtlEqOtFBzY5VFg5t+xsYb2WYnI0H2hXaOioyjKaGr+w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7359334},"type":"module","gitHead":"00b2271d0f1603ac780df3f324aed0fc92f3e849","scripts":{"test":"node --test","typecheck":"tsc","audit:runtime":"npm audit --omit=dev --omit=peer"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Jina, SERPdive, Kagi, Ollama,","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.6.2","undici":"^8.9.0","p-limit":"^6.1.0","typebox":"^1.1.38","linkedom":"^0.16.0","turndown":"^7.2.0","promise.try":"^2.0.1","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/turndown":"^5.0.6"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.20.0_1786342526614_0.6176605182615149","host":"s3://npm-registry-packages-npm-production"}},"0.21.0":{"name":"pi-web-access","version":"0.21.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","tinyfish","search1api","searchinfinity","querit","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.21.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","extensions":["./index.ts"]},"dist":{"shasum":"8940456bd19021eab71fda5045d30e1bc52f4d97","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.21.0.tgz","fileCount":62,"integrity":"sha512-Qoit6EHJL3ab4S4e3tb0U7tZx8OsnBwMPRjQSp8dLk4HtBzACxu5BTqXr5t0GlApTf/S/wk5nFyruP1Y9UkMSQ==","signatures":[{"sig":"MEUCIBE6TV/D5g3aXGc+2DoTOKpstJA2w8Vc/idcyJoWjFu+AiEA8QBVLdecEYAWsyDwZgZeaGoDQX3Vddn+Y1NzsNXYknk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7374200},"type":"module","gitHead":"2de5e7f343fa76bbb567e2e1c3bc11d06e44d42e","scripts":{"test":"node --test","typecheck":"tsc","audit:runtime":"npm audit --omit=dev --omit=peer"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Jina, SERPdive, Kagi, Ollama,","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.6.2","undici":"^8.9.0","p-limit":"^6.1.0","typebox":"^1.1.38","linkedom":"^0.16.0","turndown":"^7.2.0","promise.try":"^2.0.1","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/turndown":"^5.0.6"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.21.0_1786405313026_0.40686014891200184","host":"s3://npm-registry-packages-npm-production"}},"0.22.0":{"name":"pi-web-access","version":"0.22.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","tinyfish","search1api","searchinfinity","querit","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.22.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","extensions":["./index.ts"]},"dist":{"shasum":"189e04a0d0b0957145e4fefcd6ac627f12591c05","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.22.0.tgz","fileCount":63,"integrity":"sha512-xzeU0q9OCYJv3yufK3vqIoelvPT/1/aoV5Pj7NbsQiW2QnB0FOlMxhP29TBTWkPJdleRnch6/MH8P2ebhwUTBQ==","signatures":[{"sig":"MEUCIErvpvvU7r/5WvBL3/h16iUtViP6IsDwuFdhKd9P43nUAiEA0Uq4H8UtxazyGON307zPOyhtOMK1wAuXLbNEqeL0qO0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7393329},"type":"module","gitHead":"7e488620f32de239992d45eac83235d03c9c6bbd","scripts":{"test":"node --test","typecheck":"tsc","audit:runtime":"npm audit --omit=dev --omit=peer"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Jina, SERPdive, Kagi, Ollama,","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.6.2","undici":"^8.9.0","p-limit":"^6.1.0","typebox":"^1.1.38","linkedom":"^0.16.0","turndown":"^7.2.0","promise.try":"^2.0.1","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/turndown":"^5.0.6"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.22.0_1786482369643_0.8422535429926219","host":"s3://npm-registry-packages-npm-production"}},"0.23.0":{"name":"pi-web-access","version":"0.23.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","tinyfish","search1api","searchinfinity","querit","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.23.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","extensions":["./index.ts"]},"dist":{"shasum":"342020d636c49c956044a2ea2713d677c67c923f","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.23.0.tgz","fileCount":64,"integrity":"sha512-RrMaR/1iI1E7LNBkthUzD8yaPmMhAYY/EzBm+bAN9QA1I8g5YBpLVrD97+d6ezsGN6qdOX0E++psBj12i74kRw==","signatures":[{"sig":"MEQCIAmZJQYHoLka0ahjnWItuxw0XRjh1Hn5KvOngR4SIb2mAiBXGOaaA2Y9Ik9KtUECOYi+jgCm3qnHJW+5Nd5GiCNnoQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7423491},"type":"module","gitHead":"c77b28221d527f298d409d7e61ade661e548f50c","scripts":{"test":"node --test","typecheck":"tsc","audit:runtime":"npm audit --omit=dev --omit=peer"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Ka","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.6.2","undici":"^8.9.0","p-limit":"^6.1.0","typebox":"^1.1.38","linkedom":"^0.16.0","turndown":"^7.2.0","promise.try":"^2.0.1","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/turndown":"^5.0.6"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.23.0_1786755168628_0.7339769708162014","host":"s3://npm-registry-packages-npm-production"}},"0.24.0":{"name":"pi-web-access","version":"0.24.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","tinyfish","search1api","searchinfinity","querit","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.24.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","extensions":["./index.ts"]},"dist":{"shasum":"ddef685aa273ecfb8459193d3fbfad9490ad59a9","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.24.0.tgz","fileCount":68,"integrity":"sha512-BVosva1tGDhHveaGpFnc++YS5+pzmWVzJ/5B+1xBavkRjAgyDvMpA1EfVL+GYIviAxXKck9JyRGVzo4ASV7snA==","signatures":[{"sig":"MEQCID2cBLKGpokkArGxq6oiIiMHp7Z/BrGfiT+o2vPr1k2WAiB010Rp4h56Eep9/uIdnbPN1xsEvq8TatP3W1oPvNM7cw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7465072},"type":"module","gitHead":"3b875f574840eebae39e5fede0d99a5f7c71f482","scripts":{"test":"node --test","typecheck":"tsc","audit:runtime":"npm audit --omit=dev --omit=peer"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Ka","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.6.2","undici":"^8.9.0","p-limit":"^6.1.0","typebox":"^1.1.38","linkedom":"^0.16.0","turndown":"^7.2.0","promise.try":"^2.0.1","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/turndown":"^5.0.6"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.24.0_1787074666343_0.15887014828063517","host":"s3://npm-registry-packages-npm-production"}},"0.24.1":{"name":"pi-web-access","version":"0.24.1","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","tinyfish","search1api","searchinfinity","querit","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.24.1","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","extensions":["./index.ts"]},"dist":{"shasum":"78449966e7f682f707bb9964c3e62d5f04318d8c","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.24.1.tgz","fileCount":69,"integrity":"sha512-kNYVqPT2wbWbDKD2mfMsrCie1DyVsE/KYNVgpp7yqq072sG2PciKAB28PG4h0+klSO3MtCFRoPWAyA+l0CS7/A==","signatures":[{"sig":"MEUCIHWixbVKRPsZLBFWjRfbfPRKPnLRkcbEA7UkmVqAZbnCAiEA91yipBcy6FjijcXJlagqZrN+fi9mrJo7YXr45y20Zb8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7489653},"type":"module","gitHead":"fbbd0cb3b3eb918c8833906aa0b41e257fffe979","scripts":{"test":"node --test","typecheck":"tsc","audit:runtime":"npm audit --omit=dev --omit=peer"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Ka","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.6.2","undici":"^8.9.0","p-limit":"^6.1.0","typebox":"^1.1.38","linkedom":"^0.16.0","turndown":"^7.2.0","promise.try":"^2.0.1","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/turndown":"^5.0.6"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.24.1_1787346269228_0.2843112699297765","host":"s3://npm-registry-packages-npm-production"}},"0.24.2":{"name":"pi-web-access","version":"0.24.2","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","tinyfish","search1api","searchinfinity","querit","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.24.2","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","extensions":["./index.ts"]},"dist":{"shasum":"a03f40ee3bfa239da692540d0a44279e8982cd88","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.24.2.tgz","fileCount":69,"integrity":"sha512-wpw1XJLITrLY5epZCjiGxdF75HlKgZTrK1UM3TG/AVRzRrFqvNoc4bLYaCFFjYUG8QNEo6dIpYbCJyAUkLz/QA==","signatures":[{"sig":"MEUCIBblT94YRIRF0wSqI5zT0+ELR2kyDT22/l4n/RhUNC6/AiEAicJuOhS4Gx+YX0cmtQXsmL2o+WxDsP5ux5Z74QXiucE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7492130},"type":"module","gitHead":"846949c645efadd6314f25eef60b390b0669704a","scripts":{"test":"node --test","typecheck":"tsc","audit:runtime":"npm audit --omit=dev --omit=peer"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Ka","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.6.2","undici":"^8.9.0","p-limit":"^6.1.0","typebox":"^1.1.38","linkedom":"^0.16.0","turndown":"^7.2.0","promise.try":"^2.0.1","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/turndown":"^5.0.6"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.24.2_1787441476342_0.9163783964603163","host":"s3://npm-registry-packages-npm-production"}},"0.25.0":{"name":"pi-web-access","version":"0.25.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","tinyfish","search1api","searchinfinity","querit","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.25.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","extensions":["./index.ts"]},"dist":{"shasum":"8b6cab44e86f6d134a25f8a3e31d241d4b92c1ec","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.25.0.tgz","fileCount":72,"integrity":"sha512-DYOEIMEPwpC6pHElexBy3XuaYPnfMxH0ZBaGrILFsLNQzhhHJ3kJLrCQU4fnKXYXV6OEwxsLt2pBP76koK4hHg==","signatures":[{"sig":"MEYCIQDbJ4NWO5TXYEyKGsmzMI6qANAugpz/XKoJpumffur1uAIhAMyywc+9z9awutskJ2FOF5Fj7C382InK9D79kuSiefYI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7592590},"type":"module","gitHead":"08e347f4fe6bea807882c2363527118cce6eb539","scripts":{"test":"node --test","typecheck":"tsc","audit:runtime":"npm audit --omit=dev --omit=peer"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Ka","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.6.2","undici":"^8.9.0","p-limit":"^6.1.0","typebox":"^1.1.38","defuddle":"0.19.3","linkedom":"^0.16.0","turndown":"^7.2.0","promise.try":"^2.0.1","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/turndown":"^5.0.6"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.25.0_1787701193819_0.1963890179718759","host":"s3://npm-registry-packages-npm-production"}},"0.26.0":{"name":"pi-web-access","version":"0.26.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","tinyfish","search1api","searchinfinity","querit","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.26.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","extensions":["./index.ts"]},"dist":{"shasum":"a8f4e11e89500893ca63e9e3cd46f891f305c0a9","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.26.0.tgz","fileCount":73,"integrity":"sha512-ob24VPqSx6/WjK4k2IQzwBtI+m9TiL2lSFKEdTTJdCeW6D7Sd1z/RlwFUD+nPD45yo6mURTiJQ8GUN6Lhi8YJw==","signatures":[{"sig":"MEUCIQClZdi2YtXB+qLlBoegwKoqP3yDG2Lht9wMidJTzl3rXwIgZDj28bgkMHCvOwhi8/NJDAiqjPRIBdOrLXQFBFcqsdc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7605750},"type":"module","gitHead":"479e282e01490d498abed8bdf33b98cb5625f796","scripts":{"test":"node --test","typecheck":"tsc","audit:runtime":"npm audit --omit=dev --omit=peer"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Ka","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.6.2","undici":"^8.9.0","p-limit":"^6.1.0","typebox":"^1.1.38","defuddle":"0.19.3","linkedom":"^0.16.0","turndown":"^7.2.0","promise.try":"^2.0.1","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/turndown":"^5.0.6"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.26.0_1787899625044_0.7909818866295217","host":"s3://npm-registry-packages-npm-production"}},"0.27.0":{"name":"pi-web-access","version":"0.27.0","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","tinyfish","search1api","searchinfinity","querit","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","_id":"pi-web-access@0.27.0","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"homepage":"https://github.com/nicobailon/pi-web-access#readme","bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"pi":{"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4","extensions":["./index.ts"]},"dist":{"shasum":"f97ea9371f81d44c9bb34e43e1868db32e2c21ae","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.27.0.tgz","fileCount":73,"integrity":"sha512-D/z7ILwbnJeDjzFPC1j3G1OvO+j2vl2H13ByYcH5FLbrJ1yBdbBwTBcl96Bbt2NEqH5vdmoZ/EpbDG8BTF9W7Q==","signatures":[{"sig":"MEYCIQCIOQgsPvGQbWI27CVU0d5EMHEPdMuC7ZuuV2b9ZZk7HAIhAPvh2gR0I6LHpQCUSqwBqZ+IFqK3NpjmAApknIgF4zXS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7614755},"type":"module","gitHead":"8f11a0a94988093b0ea5d725d18e8dcabacd2373","scripts":{"test":"node --test","typecheck":"tsc","audit:runtime":"npm audit --omit=dev --omit=peer"},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"repository":{"url":"git+https://github.com/nicobailon/pi-web-access.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Ka","directories":{},"_nodeVersion":"25.2.1","dependencies":{"unpdf":"^1.6.2","undici":"^8.9.0","p-limit":"^6.1.0","typebox":"^1.1.38","defuddle":"0.19.3","linkedom":"^0.16.0","turndown":"^7.2.0","promise.try":"^2.0.1","@mozilla/readability":"^0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/turndown":"^5.0.6"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-web-access_0.27.0_1787946241995_0.5330948396564945","host":"s3://npm-registry-packages-npm-production"}},"0.28.0":{"name":"pi-web-access","version":"0.28.0","description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Ka","type":"module","scripts":{"test":"node --test","typecheck":"tsc","audit:runtime":"npm audit --omit=dev --omit=peer"},"keywords":["pi-package","pi","pi-coding-agent","extension","web-search","tinyfish","search1api","searchinfinity","querit","perplexity","fetch","scraping"],"author":{"name":"Nico Bailon"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/nicobailon/pi-web-access.git"},"bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"homepage":"https://github.com/nicobailon/pi-web-access#readme","devDependencies":{"@types/turndown":"^5.0.6","typescript":"^7.0.2"},"dependencies":{"@mozilla/readability":"^0.6.0","defuddle":"0.19.3","linkedom":"^0.16.0","p-limit":"^6.1.0","promise.try":"^2.0.1","turndown":"^7.2.0","typebox":"^1.1.38","unpdf":"^1.6.2","undici":"^8.9.0"},"peerDependencies":{"@earendil-works/pi-ai":"*","@earendil-works/pi-coding-agent":"*","@earendil-works/pi-tui":"*"},"pi":{"extensions":["./index.ts"],"video":"https://github.com/nicobailon/pi-web-access/raw/refs/heads/main/pi-web-fetch-demo.mp4"},"gitHead":"e55f78a6cf28e2ba5013e14c3dd7bb5eef2ac7c5","_id":"pi-web-access@0.28.0","_nodeVersion":"25.2.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-NMiRWiRXt46oNOoef+9WUN9IKzwADXuM9Wu6fPgMBScIVO8wQK3+dUV0CkmkvTHWADv8PBCqxcDSufVwqF++9Q==","shasum":"fa14439d050527f994003c981a1bde7fdde146b0","tarball":"https://registry.npmjs.org/pi-web-access/-/pi-web-access-0.28.0.tgz","fileCount":74,"unpackedSize":7646614,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDI3xAKiYLUDCkJnkpUcXR3Mv9wi0LBXD6lMdkAwiUYUAiBXXk0XMDd2jrgdUQuHsqJu/P3bI5JUziwwCN+IN7bxlA=="}]},"_npmUser":{"name":"nicopreme","email":"nico.bailon@gmail.com"},"directories":{},"maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-web-access_0.28.0_1788578322752_0.6968842186073805"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-27T18:45:10.901Z","modified":"2026-09-05T03:18:43.235Z","0.4.2":"2026-01-27T18:45:11.122Z","0.4.3":"2026-01-28T06:53:26.096Z","0.4.4":"2026-02-02T00:39:54.916Z","0.4.5":"2026-02-02T00:42:47.609Z","0.5.0":"2026-02-02T02:01:46.641Z","0.5.1":"2026-02-02T17:19:39.577Z","0.7.0":"2026-02-03T19:53:45.224Z","0.7.1":"2026-02-03T20:16:52.814Z","0.7.2":"2026-02-03T21:02:25.635Z","0.7.3":"2026-02-06T06:48:32.035Z","0.10.0":"2026-02-18T14:28:44.154Z","0.10.1":"2026-02-18T16:23:15.304Z","0.10.2":"2026-02-18T16:27:13.266Z","0.10.3":"2026-03-12T05:27:58.888Z","0.10.4":"2026-03-27T23:01:07.847Z","0.10.5":"2026-04-04T01:28:47.912Z","0.10.6":"2026-04-04T02:14:59.997Z","0.10.7":"2026-05-02T21:33:07.794Z","0.12.0":"2026-06-24T07:03:55.908Z","0.13.0":"2026-06-25T07:41:38.785Z","0.14.0":"2026-07-25T19:59:39.779Z","0.15.0":"2026-07-28T06:40:03.831Z","0.16.0":"2026-07-30T15:52:32.913Z","0.17.0":"2026-07-30T23:14:38.341Z","0.17.1":"2026-07-31T18:02:10.275Z","0.18.0":"2026-08-03T03:20:43.607Z","0.19.0":"2026-08-08T08:00:49.578Z","0.20.0":"2026-08-10T06:15:26.887Z","0.21.0":"2026-08-10T23:41:53.385Z","0.22.0":"2026-08-11T21:06:09.927Z","0.23.0":"2026-08-15T00:52:48.863Z","0.24.0":"2026-08-18T17:37:46.628Z","0.24.1":"2026-08-21T21:04:29.519Z","0.24.2":"2026-08-22T23:31:16.616Z","0.25.0":"2026-08-25T23:39:54.141Z","0.26.0":"2026-08-28T06:47:05.299Z","0.27.0":"2026-08-28T19:44:02.262Z","0.28.0":"2026-09-05T03:18:42.996Z"},"bugs":{"url":"https://github.com/nicobailon/pi-web-access/issues"},"author":{"name":"Nico Bailon"},"license":"MIT","homepage":"https://github.com/nicobailon/pi-web-access#readme","keywords":["pi-package","pi","pi-coding-agent","extension","web-search","tinyfish","search1api","searchinfinity","querit","perplexity","fetch","scraping"],"repository":{"type":"git","url":"git+https://github.com/nicobailon/pi-web-access.git"},"description":"Web search, URL fetching, GitHub repo cloning, PDF extraction, YouTube video understanding, and local video analysis for Pi coding agent. Supports OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Ka","maintainers":[{"name":"nicopreme","email":"nico.bailon@gmail.com"}],"readme":"<p>\n  <img src=\"banner.png\" alt=\"pi-web-access\" width=\"1100\">\n</p>\n\n# Pi Web Access\n\n**Web search, content extraction, and video understanding for Pi agent. OpenAI/Codex search, zero-config Exa search, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Kagi, Bocha, Ollama, AnySearch, XCrawl, Valyu, xAI/Grok, Mistral, Bright Data SERP, SerpBase, Serper, self-hosted SearXNG, keyless DuckDuckGo, optional browser-cookie Gemini Web, Kimi Code Plan search, or bring your own API keys.**\n\n[![npm version](https://img.shields.io/npm/v/pi-web-access?style=for-the-badge)](https://www.npmjs.com/package/pi-web-access)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=for-the-badge)](https://opensource.org/licenses/MIT)\n[![Platform](https://img.shields.io/badge/Platform-macOS%20%7C%20Linux%20%7C%20Windows*-blue?style=for-the-badge)]()\n\n<https://github.com/user-attachments/assets/cac6a17a-1eeb-4dde-9818-cdf85d8ea98f>\n\n## Why Pi Web Access\n\n**Zero Config** — Works out of the box with Exa MCP (no API key needed). If you're signed into Pi with a Codex subscription, OpenAI web search can reuse that auth. An active Kimi Code Plan signed in through `/login kimi-coding` enables explicit Kimi search without a separate Open Platform key. Add API keys or endpoints for OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Kagi, Bocha, Ollama, Valyu, SerpBase, Serper, Exa, Perplexity, Gemini API, or Mistral for more control; configure a self-hosted SearXNG endpoint for private search; or opt into browser-cookie access for Gemini Web.\n\n**Video Understanding** — Point it at a YouTube video or local screen recording and ask questions about what's on screen. Full transcripts, visual descriptions, and frame extraction at exact timestamps.\n\n**Smart Fallbacks** — Every capability has a fallback chain. Search tries configured SearXNG first for local/private search. When the active Pi model is `openai-codex`, it then tries Codex-backed OpenAI search. Otherwise it tries Exa before OpenAI, then Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Kagi, Bocha, Ollama, Perplexity, Gemini API, and Gemini Web when browser cookies are enabled. YouTube tries Gemini Web when enabled, then API, then Perplexity. Blocked pages try configured self-hosted Firecrawl first. Third-party hosted page fetchers require explicit `fetchRouting.allowRemoteHostedProviders` opt-in for remote HTTP(S) targets.\n\n**GitHub Cloning** — GitHub URLs are cloned locally instead of scraped. The agent gets real file contents and a local path to explore, not rendered HTML.\n\n## Install\n\n```bash\npi install npm:pi-web-access\n```\n\nWorks immediately with no API keys — Exa MCP provides zero-config search. If Pi has Codex auth from `/login`, OpenAI search can also work without a separate key. For more providers or direct API access, add keys to `~/.pi/web-search.json`:\n\n```json\n{\n  \"openaiApiKey\": \"sk-...\",\n  \"braveApiKey\": \"BSA_...\",\n  \"exaApiKey\": \"exa-...\",\n  \"tinyfishApiKey\": \"sk-tinyfish-...\",\n  \"search1apiApiKey\": \"...\",\n  \"searchinfinityApiKey\": \"...\",\n  \"queritApiKey\": \"...\",\n  \"jinaApiKey\": \"jina_...\",\n  \"bochaApiKey\": \"sk-...\",\n  \"perplexityApiKey\": \"pplx-...\",\n  \"geminiApiKey\": \"AIza...\",\n  \"mistralApiKey\": \"...\"\n}\n```\n\nIn `auto` mode (default), `web_search` tries a configured SearXNG endpoint first for local/private search. When the active Pi model is `openai-codex`, it then tries Codex-backed OpenAI search. Otherwise it tries Exa (direct API if keyed, MCP if not) before OpenAI, then Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Perplexity, Gemini API, and Gemini Web when browser-cookie access is enabled. Exa handles search; curator summary drafts are generated separately by the configured Pi summary model, defaulting to Claude Haiku, Codex Luna, Codex Terra, Gemini 3.6 Flash, GPT-5 mini, then DeepSeek V4 Flash when available. Slow summary drafts fall back to a deterministic result summary after a bounded deadline.\n\nIf your OpenAI key belongs to a third-party Responses-compatible gateway, set `openaiResponsesUrl` to that gateway's full Responses endpoint. The default remains `https://api.openai.com/v1/responses`.\n\nTo route automatic searches through the active Pi model, configure an ordered route without a top-level `provider`:\n\n```json\n{\n  \"searchRouting\": {\n    \"providers\": [\"openai\", \"tavily\"],\n    \"useCurrentModel\": true,\n    \"fallbackOn\": [\"unsupported\", \"transient\", \"quota\", \"network\", \"invalid-response\"]\n  }\n}\n```\n\nWith `useCurrentModel: true`, the automatic `openai` step uses Hosted `web_search` when the active model is a GPT model backed by an official OpenAI Responses endpoint: `openai`/`openai-responses` on HTTPS `api.openai.com`, or `openai-codex`/`openai-codex-responses` on the official ChatGPT Codex endpoint. Third-party gateways, Azure, and other models continue to the next route entry. A tool-level `provider` or top-level `provider` remains an explicit override; `provider: \"openai\"` keeps the existing independent OpenAI/Codex search-model behavior.\n\nFor sandboxed networks that provide outbound proxy transport through environment variables, set `ssrf.trustEnvProxy` to `true` to skip local DNS preflight for proxied hostnames:\n\n```json\n{\n  \"ssrf\": {\n    \"trustEnvProxy\": true\n  }\n}\n```\n\nThis is an opt-in DNS-preflight adjustment, not proxy transport configuration. `HTTP_PROXY`, `HTTPS_PROXY`, and `ALL_PROXY` are recognized; `NO_PROXY` hosts still undergo DNS validation, and localhost or literal private IP targets remain blocked.\n\nOptional dependencies for video frame extraction:\n\n```bash\nbrew install ffmpeg   # frame extraction, video thumbnails, local video duration\nbrew install yt-dlp   # YouTube stream URLs for frame extraction\n```\n\nWithout these, video content analysis (transcripts, visual descriptions via Gemini) still works. The binaries are only needed for extracting individual frames as images.\n\nSystem dependency for curator browser launch on Linux:\n\n| Package | Purpose | Install |\n|---------|---------|---------|\n| `xdg-utils` | Opens the curator UI in your default browser | Debian/Ubuntu: `sudo apt install -y xdg-utils` · Fedora/RHEL: `sudo dnf install -y xdg-utils` · Arch: `sudo pacman -S xdg-utils` |\n\nWithout `xdg-utils`, the curator URL is printed to the tool output so you can copy it into a browser.\n\nRequires Pi v0.37.3+.\n\n## Quick Start\n\n```typescript\n// Search the web\nweb_search({ query: \"TypeScript best practices 2025\" })\n\n// Fetch a page\nfetch_content({ url: \"https://docs.example.com/guide\" })\n\n// Clone a GitHub repo\nfetch_content({ url: \"https://github.com/owner/repo\" })\n\n// Understand a YouTube video\nfetch_content({ url: \"https://youtube.com/watch?v=abc\", prompt: \"What libraries are shown?\" })\n\n// Analyze a screen recording\nfetch_content({ url: \"/path/to/recording.mp4\", prompt: \"What error appears on screen?\" })\n```\n\n## Tools\n\n### web_search\n\nSearch the web via OpenAI, Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Kagi, Bocha, Ollama, AnySearch, XCrawl, Valyu, xAI, Mistral, Bright Data SERP, SerpBase, Serper, self-hosted SearXNG, keyless DuckDuckGo, Exa, Perplexity AI, Gemini, or Kimi. Returns a synthesized answer with source citations.\n\n```typescript\nweb_search({ query: \"rust async programming\" })\nweb_search({ queries: [\"query 1\", \"query 2\"] })\nweb_search({ query: \"latest news\", numResults: 10, recencyFilter: \"week\" })\nweb_search({ query: \"...\", domainFilter: [\"github.com\"] })\nweb_search({ query: \"...\", provider: \"openai\" })\nweb_search({ query: \"...\", provider: \"kimi\" })\nweb_search({ query: \"...\", provider: \"mistral\" })\nweb_search({ query: \"...\", provider: \"all\" })\nweb_search({ query: \"...\", includeContent: true })\nweb_search({ queries: [\"query 1\", \"query 2\"], workflow: \"none\" })\nweb_search({ queries: [\"query 1\", \"query 2\"], workflow: \"summary-review\" })\nweb_search({ queries: [\"query 1\", \"query 2\"], workflow: \"auto-summary\" })\n```\n\n| Parameter | Description |\n| ----------- | ------------- |\n| `query` / `queries` | Single query or batch of queries |\n| `numResults` | Results per query (default: 5, max: 20) |\n| `recencyFilter` | `day`, `week`, `month`, or `year` |\n| `domainFilter` | Limit to domains (prefix with `-` to exclude) |\n| `provider` | Configured provider when omitted or set to `auto`; `all` searches every eligible provider except Parallel MCP, DuckDuckGo, Kimi, AnySearch, XCrawl, Valyu, xAI, Mistral, Bright Data, SerpBase, and Serper simultaneously; otherwise `openai`, `brave`, `parallel`, `parallel-mcp`, `tinyfish`, `search1api`, `searchinfinity`, `querit`, `tavily`, `firecrawl`, `jina`, `serpdive`, `kagi`, `bocha`, `ollama`, `anysearch`, `xcrawl`, `valyu`, `xai`, `mistral`, `brightdata`, `serpbase`, `serper`, `searxng`, `duckduckgo`, `exa`, `perplexity`, `gemini`, or `kimi` (auto-selects when no provider or routing is configured; Parallel MCP, DuckDuckGo, Kimi, AnySearch, XCrawl, Valyu, xAI, Mistral, Bright Data, SerpBase, and Serper are explicit-only) |\n| `includeContent` | Fetch full page content from sources in background |\n| `workflow` | `none` (skip curator), `summary-review` (open curator and auto-generate a summary draft, default), or `auto-summary` (generate a summary without opening the curator) |\n\nBatch searches run up to three queries concurrently. Provider routing and fallback within each query remain sequential.\n\n### fetch_content\n\nFetch URL(s) as readable markdown, exact textual HTTP bodies, direct images, or page-grounded answers. Automatically detects and handles GitHub repos, GitHub PRs and issues, YouTube videos, PDFs, local video files, images, and regular web pages.\n\n```typescript\nfetch_content({ url: \"https://example.com/article\" })\nfetch_content({ urls: [\"url1\", \"url2\", \"url3\"] })\nfetch_content({ url: \"https://github.com/owner/repo\" })\nfetch_content({ url: \"https://github.com/owner/repo/pull/123#discussion_r456\" })\nfetch_content({ url: \"https://youtube.com/watch?v=abc\", prompt: \"What libraries are shown?\" })\nfetch_content({ url: \"/path/to/recording.mp4\", prompt: \"What error appears on screen?\" })\nfetch_content({ url: \"https://youtube.com/watch?v=abc\", timestamp: \"23:41-25:00\", frames: 4 })\nfetch_content({ url: \"https://example.com/api\", mode: \"raw\" })\nfetch_content({ url: \"https://example.com/guide\", mode: \"answer\", prompt: \"What are the installation steps?\" })\nfetch_content({ url: \"https://example.com/account\", auth: \"work\", mode: \"raw\" })\nfetch_content({ url: \"https://example.com/diagram.png\" })\n```\n\n| Parameter | Description |\n| ----------- | ------------- |\n| `url` / `urls` | Single URL/path or multiple URLs |\n| `prompt` | Question for video analysis, or the page-local question required by `mode: \"answer\"` |\n| `mode` | `readable` (default), `raw` for exact textual HTTP bodies, or `answer` for a grounded answer from fetched content |\n| `answerModel` | Optional `provider/model-id` override for answer mode; defaults to the configured `fetch.answerProvider` + `fetch.answerModel` pair, or the current enabled Pi model when no pair is configured |\n| `timestamp` | Extract frame(s) — single (`\"23:41\"`), range (`\"23:41-25:00\"`), or seconds (`\"85\"`) |\n| `frames` | Number of frames to extract (max 12) |\n| `forceClone` | Clone GitHub repos that exceed the 350MB size threshold |\n\nFor a standing answer-mode model, set both `fetch.answerProvider` and `fetch.answerModel` in `web-search.json`; a per-call `answerModel` takes precedence. Configured answer defaults are opt-in and can send fetched page text to a different provider/model, which may change privacy and cost behavior.\n\nThanks to [@linuxtextadventurer](https://github.com/linuxtextadventurer) for PR #328.\n\n### get_search_content\n\nRetrieve stored content from previous searches or fetches. Fetched URL content is stored in full in a private `web-search-cache` directory under the Pi config directory, not in the session JSONL. This includes `fetch_content` answer mode, which stores the original page content. The cache has a one-hour lifetime and fixed limits of 128 entries and 128 MiB; when either limit is reached, the oldest entries are removed first. On macOS and Linux the cache directory and files are kept at permissions `0700` and `0600`, respectively. Use `findText` to locate bounded matching passages without paging through a large page, or use `offset` and `limit` to retrieve slices intentionally.\n\n```typescript\nget_search_content({ responseId: \"abc123\", urlIndex: 0 })\nget_search_content({ responseId: \"abc123\", url: \"https://...\", offset: 30000 })\nget_search_content({ responseId: \"abc123\", query: \"original query\" })\nget_search_content({ responseId: \"abc123\", urlIndex: 0, findText: \"installation\" })\nget_search_content({ responseId: \"abc123\", urlIndex: 0, findText: [\"timeout\", \"retry\"], findMode: \"fuzzy\" })\n```\n\n`findMode` supports `exact`, `case-insensitive` (default), and `fuzzy`. Finder output is capped at 20,000 characters with match counts and nearby context. `findText` cannot be combined with `offset` or `limit`. The default `limit` and maximum permitted `limit` use `maxInlineContentChars`.\n\n### source_check\n\nCheck a claim and return a machine-readable artifact with exact passage citations. Search results are deduplicated and capped at 20 sources; `fetchContent` fetches at most 5 pages, while stored and retrieved content remains subject to the configured `maxInlineContentChars` `offset`/`limit` bounds.\n\n```typescript\nsource_check({ claim: \"The API supports streaming responses\" })\nsource_check({\n  claim: \"The API supports streaming responses\",\n  queries: [\"API streaming responses documentation\", \"API streaming limitations\"],\n  fetchContent: true,\n  domainFilter: [\"docs.example.com\", \"-old.example.com\"]\n})\n```\n\nThe artifact includes `supported`, `contradicted`, `unclear`, or `missing-evidence` claim status, source quality hints, SHA-256 content hashes, and passage IDs with exact source offsets. Search and fetch errors remain in the artifact instead of being silently discarded. Artifacts are stored with the session and retrieved through `get_search_content` using the returned `responseId`; paged artifact responses are JSON slices, so request the next `offset` when needed.\n\n## Capabilities\n\n### GitHub repos\n\nGitHub URLs are cloned locally instead of scraped. The agent gets real file contents and a local path to explore with `read` and `bash`. Root URLs return the repo tree + README, `/tree/` paths return directory listings, `/blob/` paths return file contents.\n\nRepos over 350MB get a lightweight API-based view instead of a full clone (override with `forceClone: true`). Commit SHA URLs are handled via the API. Clones are cached for the session and wiped on session change. Private repos require the `gh` CLI. Set `githubClone.enabled` to `false` to skip this GitHub-specific clone/API handling; `fetch_content` remains available, so the URL can continue through the normal HTTP extraction path.\n\nPull request and issue URLs are rendered as one priority-ordered markdown document instead of scraped HTML. PR views include status, body, checks when `gh` supports them, review verdicts, linked references, files, commits, conversation comments, review thread comments, truncation markers, and escalation commands. Issue views include state, metadata, body, linked closing PRs when available, and comments. Comment anchors such as `#issuecomment-...` and `#discussion_r...` are forced inline. The full rendered document is stored for `get_search_content` offsets and `findText`.\n\n`fetch_content` uses `gh pr view` or `gh issue view` first with prompts disabled. It retries with a smaller field set when an older `gh` does not know a requested field. Public unauthenticated REST is used as a bounded fallback under the same `fetchContent.domainPolicy` and SSRF rules; REST cannot include checks. Set `githubPrIssue.enabled` to `false` to skip PR/issue specialization and keep normal HTTP extraction.\n\n### YouTube videos\n\nYouTube URLs are processed via Gemini for full video understanding — visual descriptions, transcripts with timestamps, and chapter markers. Pass a `prompt` to ask specific questions about the video. Results include the video thumbnail so the agent gets visual context alongside the transcript.\n\nFallback: Gemini Web when browser cookies are enabled → Gemini API → Perplexity (text summary only). Handles all URL formats: `/watch?v=`, `youtu.be/`, `/shorts/`, `/live/`, `/embed/`, `/v/`.\n\n### Local video files\n\nPass a file path (`/`, `./`, `../`, or `file://` prefix) to analyze video content via Gemini. Supports MP4, MOV, WebM, AVI, and other common formats up to 50MB for Gemini analysis. Pass a `prompt` to ask about specific content. If ffmpeg is installed, a thumbnail frame is included alongside the analysis. Timestamp/frame extraction uses ffmpeg directly and can still operate on larger local files.\n\nFallback: Gemini API (Files API upload) → Gemini Web when browser cookies are enabled.\n\n### Video frame extraction\n\nUse `timestamp` and/or `frames` on any YouTube URL or local video file to extract visual frames as images.\n\n```typescript\nfetch_content({ url: \"...\", timestamp: \"23:41\" })                       // single frame\nfetch_content({ url: \"...\", timestamp: \"23:41-25:00\" })                 // range, 6 frames\nfetch_content({ url: \"...\", timestamp: \"23:41-25:00\", frames: 3 })      // range, custom count\nfetch_content({ url: \"...\", timestamp: \"23:41\", frames: 5 })            // 5 frames at 5s intervals\nfetch_content({ url: \"...\", frames: 6 })                                // sample whole video\n```\n\nRequires `ffmpeg` (and `yt-dlp` for YouTube). Timestamps accept `H:MM:SS`, `MM:SS`, or bare seconds.\n\n### PDFs\n\nPDF URLs are converted to Markdown and saved under the temporary `pi-web-pdf` directory by default so the agent can `read` specific sections without loading the full document into context. Three engines are available, selected with `pdf.provider` (`\"auto\"` is the default):\n\n| Provider | Engine | Trade-offs |\n| --- | --- | --- |\n| `datalab` | Datalab hosted conversion (Marker) | Deterministic layout-aware output — tables, multi-column reading order, headings, math; `accurate` mode handles scanned pages; may return a `parse_quality_score`; requires a Datalab key, billed per page with a free monthly credit |\n| `gemini` | Gemini API (vision LLM) | Best on scanned/complex pages; LLM transcription can occasionally drift or truncate; requires a Gemini key |\n| `unpdf` | Local pdf.js text extraction | Free, offline, no key; flattened text only — no layout, no tables, no OCR |\n\n`auto` order: Datalab (when a key is configured) → Gemini (when a key is configured) → local `unpdf`. Datalab runs first for layout-aware conversion. If its request fails — including after free-tier credit is exhausted — the chain continues to Gemini, then `unpdf`, automatically. Setting `pdf.provider` to `gemini`, `datalab`, or `unpdf` pins that engine and skips the other remote tiers (an explicit engine still falls back to `unpdf` when it errors, except for credential/config errors and caller cancellation). No Datalab key means the `datalab` tier is simply skipped — behavior is unchanged for existing users.\n\n**Why Datalab.** The hosted converter uses a dedicated extraction engine (Marker) intended to retain document structure such as tables, multi-column reading order, headings, links, and math, where local `unpdf` extraction only yields flattened text. It is deterministic rather than LLM-based. Completed responses may include a `parse_quality_score` (0–5) for optional quality gating. Pricing is per processed page: **fast / balanced** $4 / 1,000 pages; **accurate** $10 / 1,000 pages. The free tier gives a **$10 monthly credit** (personal email; $20 with a work email) at **25 requests/minute** — roughly **2,500 pages/month free in `fast` mode** or 1,000 in `accurate` mode. Processing defaults to the **US region**. EU data residency uses **1.25× usage**; opt in with `DATALAB_PROCESSING_LOCATION=eu`.\n\nConfigure Datalab via the web-search config:\n\n```jsonc\n{\n  \"datalabApiKey\": \"$DATALAB_API_KEY\",\n  \"pdf\": {\n    \"maxSizeMB\": 20,\n    \"maxPages\": 100,\n    \"provider\": \"auto\",      // \"auto\" | \"gemini\" | \"datalab\" | \"unpdf\"\n    \"datalabMode\": \"balanced\", // \"fast\" | \"balanced\" | \"accurate\"\n    \"datalabTimeoutMs\": 120000\n  }\n}\n```\n\nEnv vars: `DATALAB_API_KEY` (or `datalabApiKey` in config), `DATALAB_PROCESSING_LOCATION` (`us` default; `eu` enables EU data residency at 1.25× usage), `DATALAB_MODE` (`fast` / `balanced` / `accurate`), and `DATALAB_API_BASE` (custom gateway). `pdf.datalabMode` overrides `DATALAB_MODE`. The default `datalabTimeoutMs` is 120s and is capped at 300s.\n\n> Privacy note: like the Gemini tier, the PDF bytes are sent to the Datalab cloud for conversion. Files are uploaded to the selected region's storage and deleted best-effort after conversion.\n\n### Blocked pages\n\nRaw and direct-image HTTP requests use the same SSRF validation, hostname domain policy, redirect checks, timeout, and 5MB streamed response bound as normal extraction. Raw mode returns textual bodies even for non-2xx responses and exposes the HTTP status in tool details; it does not run readability or hosted extraction fallbacks.\n\n`fetch_content` can opt into local browser-cookie auth with `auth: \"profile\"`, or `auth: true` when exactly one `authFetch` profile exists. Configure profiles in `~/.pi/web-search.json`, for example `{ \"authFetch\": { \"social\": [\"x.com\", \"instagram.com\"], \"work\": { \"hosts\": [\"docs.company.com\"], \"chromeProfile\": \"Profile 2\", \"cache\": \"off\" } } }`. Auth fetch uses only the local direct HTTP path, requires HTTPS, allows only configured hosts and their subdomains, refuses cross-origin redirects, and never sends cookies or authenticated content to hosted extraction providers. Browser cookie extraction remains opt-in through `allowBrowserCookies: true` or `PI_ALLOW_BROWSER_COOKIES=1`.\n\n#### Proxy (`proxy`)\n\n`web_search`, `source_check`, and `fetch_content` all accept an optional `proxy` string (e.g. `\"http://mcr:4444\"`). When provided, every outbound HTTP(S) request is routed through `curl` instead of Node's built-in fetch — this works around Node fetch ignoring `HTTP(S)_PROXY` env vars and undici `ProxyAgent` failing the TLS handshake against several common HTTP proxies (ERR_SSL_WRONG_VERSION_NUMBER).\n\nAn empty string (`\"\"`) forces a direct connection even when a config-level proxy is set. Omitting the parameter falls back to the global `proxy` in `~/.pi/web-search.json`.\n\nThe config-level `proxy` applies only to requests made by this extension's tools. Other traffic in the host process — such as the coding agent's own model API calls — is never routed through it, so a configured proxy that is temporarily down cannot break unrelated requests.\n\n```jsonc\n// ~/.pi/web-search.json — global proxy for all tools\n{\n  \"proxy\": \"http://mcr:4444\"\n}\n```\n\nLocalhost, `127.0.0.1`, `[::1]`, and any host matching the `NO_PROXY` environment variable are never proxied.\n\nWhen Readability fails or returns only a cookie notice, the extension can retry configured Firecrawl extraction, Jina Reader (handles JS rendering server-side, no API key needed), TinyFish, Search1API, Querit, Kagi Extract, Ollama Web Fetch, Parallel, Bright Data Web Unlocker, Gemini URL Context API, and Gemini Web extraction when browser cookies are enabled. Configure `fetchRouting.providers` to change the order or set of `fetch_content` providers. Supported values are `http`, `firecrawl`, `jina`, `tinyfish`, `search1api`, `querit`, `kagi`, `ollama`, `parallel`, `parallel-mcp`, `brightdata`, and `gemini`; when absent, the default order is unchanged. `parallel-mcp` is not in the default fetch order and must be listed explicitly. For remote HTTP(S) targets, third-party hosted providers are disabled unless `fetchRouting.allowRemoteHostedProviders` is `true`, because hosted services perform their own fetch and can see a different redirect chain than the local safety gate. Firecrawl stays available as a configured extraction service. Firecrawl requests are cache-only by default and require an explicit fresh-scrape opt-in before the Firecrawl server can fetch target URLs. Bright Data Web Unlocker runs last of the remote scraping providers, ahead of only the Gemini fallbacks, because it is billed per request against a paid account; it is skipped unless both a key and an `unblocker` zone are configured. It applies no minimum-length check, so any non-empty body it returns — including a short consent or paywall stub — is the final answer for that URL and the Gemini fallbacks are not tried. Handles SPAs, JS-heavy pages, and anti-bot protections transparently. Also parses Next.js RSC flight data when present. HTML extraction also surfaces registered discovery relations (`service-desc`, `service-doc`, `service-meta`, `api-catalog`, `describedby`) from the HTTP `Link` header and matching `link`/`a[rel]` markup. Readable or rendered content remains primary; on an empty shell, the normal extraction fallbacks run before declared links are returned on their own.\n\n## How It Works\n\n```\nweb_search(query)\n  → configured searchRouting (optionally active-model-aware OpenAI Hosted Search) → automatic provider chain\n\nfetch_content(url)\n  → Video file?  Gemini API (Files API) → Gemini Web (if browser cookies enabled)\n  → GitHub URL?  Clone repo, return file contents + local path\n  → YouTube URL? Gemini Web (if browser cookies enabled) → Gemini API → Perplexity\n  → HTTP fetch → PDF? Datalab → Gemini API → local text extraction, save to temp pi-web-pdf\n               → HTML? Readability (+ declared Link/rel discovery) → RSC parser → Firecrawl (if configured) → third-party hosted fallbacks only when fetchRouting.allowRemoteHostedProviders is enabled\n               → Text/JSON/Markdown? Return directly\n```\n\n## Commands\n\n### /websearch\n\nOpen the search curator directly. Runs searches and lets you review, add, select results, and approve a summary before it is sent back to the agent — no LLM round-trip needed.\n\n```\n/websearch                                               # empty page, type your own searches\n/websearch react hooks, next.js caching                  # pre-fill with comma-separated queries\n```\n\nResults get injected into the conversation when you approve the summary or click \"Send selected results without summary\". On timeout, the curator auto-submits and falls back to a deterministic summary if no approved draft is present.\n\n### /curator\n\nToggle or configure the curator workflow at runtime.\n\n```\n/curator                    # toggle on/off\n/curator on                 # enable curator (summary-review)\n/curator off                # disable curator (raw results only)\n/curator summary-review     # explicit workflow\n```\n\nPersists to `~/.pi/web-search.json` and takes effect on the next `web_search` call. When disabled, `web_search` returns raw results without opening the curator window.\n\n### /search\n\nBrowse stored search results interactively. Lists all results from the current session with their response IDs for easy retrieval.\n\n### /google-account\n\nShow the active Google account currently authenticated for Gemini Web. If cookie extraction fails, it reports sanitized attempted browser/profile entries and whether the failure was missing required cookies, password-store access, decryption, SQLite, or profile lookup.\n\n## Activity Monitor\n\nToggle with **Ctrl+Shift+W** to see live request/response activity:\n\n```\n─── Web Search Activity ────────────────────────────────────\n  API  \"typescript best practices\"     200    2.1s ✓\n  GET  docs.example.com/article        200    0.8s ✓\n  GET  blog.example.com/post           404    0.3s ✗\n────────────────────────────────────────────────────────────\n```\n\n## Configuration\n\nConfig defaults to `~/.pi/web-search.json`. `PI_CODING_AGENT_DIR` takes precedence when set; with `XDG_CONFIG_HOME`, an existing `XDG_CONFIG_HOME/pi/web-search.json` is preferred, an existing legacy `~/.pi/web-search.json` remains usable, and the XDG path is used as the new-config target when neither file exists. Every field is optional.\n\n```json\n{\n  \"openaiApiKey\": \"sk-...\",\n  \"openaiResponsesUrl\": \"https://gateway.example.com/v1/responses\",\n  \"braveApiKey\": \"BSA_...\",\n  \"braveBaseUrl\": \"https://gateway.example.com/brave/res/v1\",\n  \"exaApiKey\": \"exa-...\",\n  \"exaBaseUrl\": \"https://gateway.example.com/exa\",\n  \"parallelApiKey\": \"...\",\n  \"tinyfishApiKey\": \"sk-tinyfish-...\",\n  \"search1apiApiKey\": \"...\",\n  \"tavilyApiKey\": \"tvly-...\",\n  \"tavilyBaseUrl\": \"https://gateway.example.com/tavily\",\n  \"jinaApiKey\": \"$JINA_API_KEY\",\n  \"serpdiveApiKey\": \"sd_live_...\",\n  \"serpdiveModel\": \"krill\",\n  \"kagiApiKey\": \"$KAGI_API_KEY\",\n  \"ollamaApiKey\": \"$OLLAMA_API_KEY\",\n  \"valyuApiKey\": \"$VALYU_API_KEY\",\n  \"serpbaseApiKey\": \"$SERPBASE_API_KEY\",\n  \"serperApiKey\": \"$SERPER_API_KEY\",\n  \"brightdataApiKey\": \"$BRIGHTDATA_API_KEY\",\n  \"brightdataSerpZone\": \"pi_serp\",\n  \"xaiApiKey\": \"xai-...\",\n  \"xaiSearchTools\": [\"web_search\"],\n  \"mistralApiKey\": \"$MISTRAL_API_KEY\",\n  \"mistralSearchModel\": \"mistral-small-latest\",\n  \"mistralSearchTool\": \"web_search\",\n  \"searxngBaseUrl\": \"https://search.example.com\",\n  \"searxngHeaders\": {\n    \"CF-Access-Client-Id\": \"xxxxxxxx.access\",\n    \"CF-Access-Client-Secret\": \"xxxxxxxx\"\n  },\n  \"firecrawlBaseUrl\": \"https://crawl.example.com\",\n  \"firecrawlApiKey\": \"fc-...\",\n  \"firecrawlApiVersion\": \"v2\",\n  \"firecrawlFreshScrape\": false,\n  \"brightdataUnlockerZone\": \"pi_unlocker\",\n  \"perplexityApiKey\": \"pplx-...\",\n  \"geminiApiKey\": \"AIza...\",\n  \"geminiBaseUrl\": \"https://my-gateway.example.com/gemini\",\n  \"cloudflareApiKey\": \"...\",\n  \"geminiAuth\": \"adc\",\n  \"geminiProject\": \"my-gcp-project\",\n  \"geminiLocation\": \"us-central1\",\n  \"provider\": \"openai\",\n  \"searchRouting\": {\n    \"providers\": [\"openai\", \"brave\", \"exa\"],\n    \"useCurrentModel\": false,\n    \"fallbackOn\": [\"transient\", \"quota\", \"network\", \"invalid-response\"]\n  },\n  \"fetchRouting\": {\n    \"providers\": [\"http\", \"firecrawl\", \"jina\", \"tinyfish\", \"search1api\", \"querit\", \"kagi\", \"ollama\", \"parallel\", \"brightdata\", \"gemini\"],\n    \"allowRemoteHostedProviders\": false\n  },\n  \"fetch\": {\n    \"timeout\": 30,\n    \"answerProvider\": \"openai\",\n    \"answerModel\": \"gpt-5.6\"\n  },\n  \"webSearch\": {\n    \"enabled\": true\n  },\n  \"tools\": {\n    \"webSearch\": { \"enabled\": true },\n    \"sourceCheck\": { \"enabled\": true },\n    \"fetchContent\": { \"enabled\": true },\n    \"getSearchContent\": { \"enabled\": true }\n  },\n  \"commands\": {\n    \"websearch\": { \"enabled\": true },\n    \"curator\": { \"enabled\": true },\n    \"search\": { \"enabled\": true },\n    \"google-account\": { \"enabled\": true }\n  },\n  \"image\": {\n    \"enabled\": true\n  },\n  \"browserCookies\": {\n    \"browser\": \"helium\",\n    \"profile\": \"Profile 2\"\n  },\n  \"allowBrowserCookies\": false,\n  \"searchModel\": \"gemini-3.6-flash\",\n  \"summaryModel\": \"anthropic/claude-haiku-4-5\",\n  \"summaryGenerationDeadlineMs\": 30000,\n  \"maxInlineContentChars\": 30000,\n  \"workflow\": \"summary-review\",\n  \"curatorTimeoutSeconds\": 20,\n  \"curatorRemote\": {\n    \"host\": \"my-box.tailnet.ts.net\",\n    \"bind\": \"100.101.102.103\"\n  },\n  \"autoOpenBrowser\": true,\n  \"githubClone\": {\n    \"enabled\": true,\n    \"maxRepoSizeMB\": 350,\n    \"cloneTimeoutSeconds\": 30,\n    \"clonePath\": \"/tmp/pi-github-repos\"\n  },\n  \"githubPrIssue\": {\n    \"enabled\": true\n  },\n  \"youtube\": {\n    \"enabled\": true,\n    \"preferredModel\": \"gemini-3.6-flash\"\n  },\n  \"video\": {\n    \"enabled\": true,\n    \"preferredModel\": \"gemini-3.6-flash\",\n    \"maxSizeMB\": 50\n  },\n  \"pdf\": {\n    \"enabled\": true,\n    \"maxSizeMB\": 20,\n    \"provider\": \"auto\"\n  },\n  \"fetchContent\": {\n    \"domainPolicy\": {\n      \"allow\": [\"example.com\"],\n      \"deny\": [\"blocked.example.com\"]\n    }\n  },\n  \"shortcuts\": {\n    \"curate\": \"ctrl+shift+s\",\n    \"activity\": \"ctrl+shift+w\"\n  },\n  \"ssrf\": {\n    \"allowRanges\": [\"198.18.0.0/15\"],\n    \"trustEnvProxy\": false\n  }\n}\n```\n\n`summaryModel` accepts an optional thinking-level suffix, such as `anthropic/claude-haiku-4-5:low`. Supported suffixes are `off`, `minimal`, `low`, `medium`, `high`, `xhigh`, and `max`.\n\nAll provider API-key fields (`openaiApiKey`, `braveApiKey`, `parallelApiKey`, `tinyfishApiKey`, `search1apiApiKey`, `searchinfinityApiKey`, `queritApiKey`, `tavilyApiKey`, `jinaApiKey`, `serpdiveApiKey`, `kagiApiKey`, `bochaApiKey`, `ollamaApiKey`, `serpbaseApiKey`, `anysearchApiKey`, `xcrawlApiKey`, `xaiApiKey`, `mistralApiKey`, `brightdataApiKey`, `firecrawlApiKey`, `exaApiKey`, `perplexityApiKey`, `geminiApiKey`, `datalabApiKey`, and `cloudflareApiKey`) accept explicit credential sources. Use `$NAME` or `${NAME}` to read one named environment variable, or prefix a trusted local shell command with `!` to resolve one value at provider request time. Escape `$$` as a literal leading `$` and `$!` as a literal leading `!`:\n\n```json\n{\n  \"openaiApiKey\": \"!/absolute/path/to/secret-manager read openai\",\n  \"braveApiKey\": \"${SCOPED_BRAVE_API_KEY}\",\n  \"exaApiKey\": \"$$literal-key\",\n  \"geminiApiKey\": \"$!literal-command\"\n}\n```\n\nThis syntax applies to provider credentials only; other configuration fields are not interpolated. `firecrawlApiKey`, `kagiApiKey`, `ollamaApiKey`, `valyuApiKey`, `serpbaseApiKey`, `serperApiKey`, `mistralApiKey`, and `brightdataApiKey` use the same credential-source rules, while `braveBaseUrl`, `exaBaseUrl`, `tavilyBaseUrl`, `firecrawlBaseUrl`, `firecrawlApiVersion`, `firecrawlFreshScrape`, `brightdataSerpZone`, and `brightdataUnlockerZone` are literal config values.\n\nA command source is not run while the extension loads or registers tools. Each selected provider request runs it again with a five-second timeout, a 16 KiB output limit, a minimized environment, and a one-line non-empty stdout requirement. Command text and stderr are omitted from errors. These commands are trusted local configuration, not a same-user process isolation boundary; use absolute executable paths and protect the config file. `OP_SESSION_*` variables are forwarded to trusted resolver commands so shell-local 1Password sessions can be reused without storing them in config. An explicit source overrides legacy provider environment variables and fails that provider locally rather than falling back with a stale credential. Direct Google Gemini API requests send the resolved key only in the `x-goog-api-key` header, never in the URL.\n\n`mistralSearchModel` defaults to `mistral-small-latest` and must be a non-empty string. `mistralSearchTool` defaults to `web_search` and accepts only `web_search` or the opt-in `web_search_premium` tool.\n\nSet `braveBaseUrl`, `exaBaseUrl`, or `tavilyBaseUrl` to route those providers through a compatible HTTPS API gateway. `BRAVE_BASE_URL`, `EXA_BASE_URL`, and `TAVILY_BASE_URL` are the environment-variable equivalents and take precedence over config. Brave appends `/web/search`, Exa appends `/answer` or `/search`, and Tavily appends `/search`. Defaults remain the providers' official API roots. `exaBaseUrl` applies only to keyed direct API calls; zero-config Exa MCP search continues to use Exa's hosted MCP endpoint. Invalid overrides fail before a request is sent instead of falling back to an official endpoint, and credential headers are removed if a gateway redirects to another origin.\n\n`authFetch` configures named local browser-cookie auth profiles for explicit `fetch_content` calls. A profile can be a host array (`\"work\": [\"docs.company.com\"]`) or an object with `hosts`, optional `chromeProfile`, `redirects: \"same-origin\"`, and `cache: \"session\" | \"off\"`.\n\n`browserCookies` selects the Chromium browser preset and profile used for Gemini Web cookies, for example `{ \"browserCookies\": { \"browser\": \"helium\", \"profile\": \"Profile 1\" } }`. When `browser` is set, cookie discovery checks only that browser, which avoids unrelated password-store prompts. Supported preset names are `helium`, `chrome`, `brave`, `arc`, `chromium`, and `edge`, subject to platform availability. Omit `browser` to keep automatic browser discovery. `profile` must be a profile directory name. The old top-level `chromeProfile` field is rejected; move it to `browserCookies.profile`. Arbitrary profile paths and `profilePath` are intentionally not supported.\n\n`fetchContent.domainPolicy` is an optional hostname allow/deny policy for `fetch_content` target URLs. It is off when omitted. Each bare hostname matches itself and its subdomains; `deny` wins when a hostname matches both lists. The policy is checked before HTTP(S) target handling and before each redirect followed by this extension's own fetch path. Local file paths and non-HTTP sources are not subject to this policy. It is an additional restriction: the existing SSRF guard still blocks private and internal destinations. Remote extraction services can still perform their own DNS, redirects, and egress after this extension preflights the submitted target URL, so third-party hosted HTTP(S) fallbacks stay disabled unless `fetchRouting.allowRemoteHostedProviders` is enabled for separately isolated provider deployments.\n\n`fetch.timeout` is an optional positive finite number of seconds for direct HTTP fetches and the Jina Reader fallback. When omitted, both use a 30-second budget. Fractional values are supported and rounded up to at least 1 millisecond; values that cannot be converted to a finite safe integer delay from 1 through Node's 2,147,483,647 ms timer maximum are rejected. An invalid declared value fails closed with an error naming `web-search.json`. An internal/per-call `timeoutMs` override takes precedence over this setting. Other remote extraction fallbacks keep their own documented budgets.\n\n`fetch.answerProvider` and `fetch.answerModel` are an optional pair that selects the model used by `fetch_content` answer mode when no per-call `answerModel` is supplied. Both values must be non-empty strings and must identify an enabled text-capable model available in Pi's model registry; invalid or partial configuration fails closed. This is opt-in: answering with the configured provider/model can send fetched page text outside the current session and may incur that provider's costs. A per-call `answerModel` override is resolved first and remains usable even when these configured defaults are malformed.\n\nSet `searxngBaseUrl` or `SEARXNG_BASE_URL` to use a self-hosted SearXNG JSON API. A configured endpoint is preferred first in `auto` mode for local/private search. Its base URL and redirects remain subject to the SSRF guard; add only the narrowest self-hosted range to `ssrf.allowRanges` when it resolves to a private or synthetic range. Optional `searxngHeaders` merges extra HTTP headers into each SearXNG request (string values only; invalid header names are ignored), which is useful for reverse-proxy or Zero Trust auth such as Cloudflare Access service tokens (`CF-Access-Client-Id` / `CF-Access-Client-Secret`). Configured headers override the default `Accept: application/json` when the same name is supplied. Thanks to Marcos A. Núñez (@marnunez) for PR #107 and Avinash Kanaujiya (@avinashkanaujiya) for issue #105.\n\n**DuckDuckGo.** DuckDuckGo HTML search is keyless and explicit-only. Select it with `provider: \"duckduckgo\"` or place it in `searchRouting`; it is never chosen by `auto` and never participates in `provider: \"all\"`. Domain filters are enforced locally after DuckDuckGo redirect URLs are decoded. `recencyFilter` is not guaranteed because the HTML endpoint has no documented stable time parameter. A 200 page with no parseable results is reported as an invalid response, so routing can continue when `fallbackOn` includes `\"invalid-response\"`.\n\nSet `firecrawlBaseUrl` or `FIRECRAWL_BASE_URL` to use Firecrawl for `web_search` and as an extraction fallback for `fetch_content`. Search calls `/v2/search` by default, requests `sources: [\"web\"]`, maps `numResults` to `limit`, maps `recencyFilter` to Firecrawl's `tbs`, and maps domain filters to `includeDomains` or `excludeDomains` when possible. With `includeContent: true`, Firecrawl search adds Markdown scrape options and returns successful result Markdown as inline content. Fetch extraction calls `/v2/scrape` by default. Set `firecrawlApiVersion` or `FIRECRAWL_API_VERSION` to `v1` for older self-hosted images. Firecrawl page scraping is cache-only by default (`lockdown: true`), so the Firecrawl server does not make fresh outbound target requests unless you explicitly set `firecrawlFreshScrape: true` or `FIRECRAWL_FRESH_SCRAPE=1`. Enable fresh scraping only for a Firecrawl deployment whose own egress, redirects, DNS rebinding behavior, and internal-network access are isolated or allowlisted; this extension can preflight submitted fetch URLs but cannot control network requests made by the Firecrawl server. A configured Firecrawl API base URL may use `localhost`, `127.0.0.0/8`, or `::1` without adding those loopback ranges to global `ssrf.allowRanges`; that exception is only for Firecrawl API calls, not submitted fetch/search target URLs. The configured Firecrawl API base URL and redirects are otherwise still validated by the same SSRF guard as other remote requests, and Firecrawl credentials are stripped from cross-origin API redirects.\n\n**Bright Data.** Set `brightdataApiKey` or `BRIGHTDATA_API_KEY` to use Bright Data-backed features. The SERP search provider also requires `brightdataSerpZone` or `BRIGHTDATA_SERP_ZONE`, and the Web Unlocker extraction fallback also requires `brightdataUnlockerZone` or `BRIGHTDATA_UNLOCKER_ZONE`. These zone settings are separate and are never substituted for each other: SERP requires a Bright Data zone of type `serp`, while Web Unlocker requires a zone of type `unblocker`. Leaving either zone unset keeps that product unavailable, so enabling one Bright Data feature does not opt into the other.\n\nBright Data search is explicit-only. Select it with `provider: \"brightdata\"` or place it in `searchRouting`; it is never chosen by `auto` and never participates in `provider: \"all\"`. The SERP path maps domain filters to Google `site:` clauses and recency filters to Google `tbs` parameters, validates the returned SERP envelope, and surfaces provider errors instead of converting them to empty results.\n\nBright Data Web Unlocker is a paid `fetch_content` fallback after Parallel and before Gemini. It validates the target URL with the local SSRF guard before resolving credentials or sending any request to Bright Data, validates redirects from the Bright Data API endpoint, and strips authorization across cross-origin API redirects. As with any remote extraction service, Bright Data fetches the submitted target from its own infrastructure; keep `brightdataUnlockerZone` unset for URLs that must not be disclosed to a third party. Successful Unlocker responses are returned as Markdown, including short pages or consent stubs, because the request has already been billed and discarding the body would hide what Bright Data saw.\n\n**Kagi.** Set `kagiApiKey` or `KAGI_API_KEY` to use Kagi Search API as a normal configured search provider. It maps `numResults` to Kagi's `limit` parameter and returns Kagi result snippets; when Kagi includes extracted Markdown in the search response, `includeContent` exposes it as inline content. Kagi Extract is also available as a `fetch_content` fallback after Querit and before Ollama/Parallel. The target URL is validated locally before the API request and Kagi authorization is stripped across cross-origin API redirects.\n\n**Ollama.** Set `ollamaApiKey` or `OLLAMA_API_KEY` to use Ollama Cloud Web Search without running a local daemon. The same account key used for Ollama Cloud inference authenticates `POST https://ollama.com/api/web_search`, with `numResults` capped to Ollama's documented max of 10. Ollama Web Fetch is available as a `fetch_content` fallback after Kagi and before Parallel, with local target validation before the Cloud request.\n\n**SerpBase.** Set `serpbaseApiKey` or `SERPBASE_API_KEY` and select `provider: \"serpbase\"` to query SerpBase's Google Search Results API. SerpBase is explicit-only: it is never chosen by `auto` and never participates in `provider: \"all\"`, because each request can consume paid Google SERP credits. Domain filters are sent as Google `site:` clauses and reapplied locally; recency maps to Google's `tbs` time filter.\n\n**Valyu.** Set `valyuApiKey` or `VALYU_API_KEY` and select `provider: \"valyu\"` to query Valyu's research search API. Valyu is explicit-only: it is never chosen by `auto` or `provider: \"all\"`, but it can be configured as the named provider or added to `searchRouting`. Returned page bodies provide result snippets and optional inline content, capped at 2,500 and 4,000 characters per result.\n\n**Serper.** Set `serperApiKey` or `SERPER_API_KEY` and select `provider: \"serper\"` to query Serper's Google Search API. Serper is explicit-only: it is never chosen by `auto` or `provider: \"all\"`, but it can be configured as the named provider or added to `searchRouting`.\n\n**Parallel MCP.** Select `provider: \"parallel-mcp\"` to use Parallel Search MCP without an API key, or add it to `searchRouting`. It is explicit-only and is never chosen by `auto` or `provider: \"all\"`; the existing `parallel` provider remains the key-required REST API. A configured `parallelApiKey` or `PARALLEL_API_KEY` is sent as an optional Bearer token for higher MCP limits. To use MCP `web_fetch`, add `parallel-mcp` to `fetchRouting.providers` and set `fetchRouting.allowRemoteHostedProviders` to `true`; it is not part of the default fetch route.\n\nWithout an explicit `$` or `!` source, `OPENAI_API_KEY`, `BRAVE_API_KEY`, `PARALLEL_API_KEY`, `TINYFISH_API_KEY`, `SEARCH1API_KEY`, `SEARCHINFINITY_API_KEY`, `QUERIT_API_KEY`, `TAVILY_API_KEY`, `JINA_API_KEY`, `SERPDIVE_API_KEY`, `KAGI_API_KEY`, `BOCHA_API_KEY`, `OLLAMA_API_KEY`, `SERPBASE_API_KEY`, `SERPER_API_KEY`, `ANYSEARCH_API_KEY`, `XCRAWL_API_KEY`, `VALYU_API_KEY`, `XAI_API_KEY`, `MISTRAL_API_KEY`, `BRIGHTDATA_API_KEY`, `FIRECRAWL_API_KEY`, `EXA_API_KEY`, `GEMINI_API_KEY`, `DATALAB_API_KEY`, `DATALAB_PROCESSING_LOCATION`, `DATALAB_MODE`, `DATALAB_API_BASE`, `PERPLEXITY_API_KEY`, `GOOGLE_GEMINI_BASE_URL`, and `CLOUDFLARE_API_KEY` env vars retain their existing precedence over literal config file values. `openaiResponsesUrl` can point OpenAI `web_search` and `source_check` at a third-party gateway that supports the OpenAI Responses API and web search tool; it is an explicit endpoint override, not derived from Pi model provider settings, and defaults to `https://api.openai.com/v1/responses`. `openaiSearchModel` pins the model id used for OpenAI `web_search`, bypassing automatic selection (newest terra-tier model); the id is sent verbatim with whichever OpenAI auth resolves, so gateway-only model ids work too. `xaiSearchModel` similarly pins the xAI search model. `openaiSearchProviders` sets which Pi model providers OpenAI `web_search` resolves login credentials from, in priority order; it defaults to `[\"openai-codex\", \"openai\"]`, entries that are not registered or not signed in are skipped, and an empty array skips Pi credentials entirely so the `openaiApiKey` / `OPENAI_API_KEY` fallback applies. Useful for choosing between multiple Codex accounts (for example a second account registered by an extension) or forcing API-key billing while signed into Codex. Configured Exa API keys use Exa's own account limits directly; any legacy local `exa-usage.json` file is ignored. `GOOGLE_GEMINI_BASE_URL` overrides the Gemini API host for Gemini generate-content calls such as search, URL context, YouTube, and local video analysis. Set it to a bare host with no trailing slash and no version segment, for example `https://my-gateway.example.com/gemini`; `geminiBaseUrl` is the config-file equivalent. When the configured host contains `gateway.ai.cloudflare.com`, authentication uses `cf-aig-authorization: Bearer <token>` from `CLOUDFLARE_API_KEY` or `cloudflareApiKey`, and `GEMINI_API_KEY` is not required for generate-content calls. Alternatively, set `geminiAuth` to `\"adc\"` to authenticate Gemini generate-content calls with Google Application Default Credentials (ADC) instead of an API key; calls go to the Vertex AI endpoint (`aiplatform.googleapis.com`) with an OAuth bearer token minted from the ADC file (`GOOGLE_APPLICATION_CREDENTIALS` or `~/.config/gcloud/application_default_credentials.json`, i.e. `gcloud auth application-default login`). `geminiProject`/`geminiLocation` set the Vertex project and location and fall back to the `GOOGLE_CLOUD_PROJECT`/`GOOGLE_CLOUD_LOCATION` (or `GCLOUD_PROJECT`) env vars; project and location are required. ADC supports `authorized_user` (OAuth refresh token) and `service_account` (JWT assertion) credential files, and tokens are cached and refreshed from expiry. ADC mode covers search, URL context, and PDF/inline-data extraction; YouTube and local video analysis still go through the Gemini Files API, so they fall back to Gemini Web unless a `GEMINI_API_KEY` is also configured. The access token is treated as a credential and is redacted from errors. Local video file upload still uses Google's Files API directly, so gateway-only video extraction falls back to Gemini Web unless a `GEMINI_API_KEY` is also configured. `provider` or `searchProvider` sets the default search provider and is used when a tool call omits `provider` or sends `\"auto\"`: `\"all\"`, `\"openai\"`, `\"brave\"`, `\"parallel\"`, `\"parallel-mcp\"`, `\"tinyfish\"`, `\"search1api\"`, `\"searchinfinity\"`, `\"querit\"`, `\"tavily\"`, `\"firecrawl\"`, `\"jina\"`, `\"serpdive\"`, `\"kagi\"`, `\"bocha\"`, `\"ollama\"`, `\"anysearch\"`, `\"xcrawl\"`, `\"valyu\"`, `\"xai\"`, `\"mistral\"`, `\"brightdata\"`, `\"serpbase\"`, `\"serper\"`, `\"searxng\"`, `\"exa\"`, `\"perplexity\"`, or `\"gemini\"`. Parallel MCP, AnySearch, XCrawl, Valyu, xAI, Mistral, Bright Data, SerpBase, and Serper are never selected by `auto`; choose them explicitly or place them in `searchRouting`. If either single-provider field is configured, it takes precedence over `searchRouting`. Otherwise, `searchRouting` can opt into an ordered `providers` list and an explicit `fallbackOn` list containing `\"transient\"`, `\"quota\"`, `\"network\"`, and/or `\"invalid-response\"`; only those typed failures continue to the next available candidate. `\"all\"` is not valid inside `searchRouting.providers`, because that list defines sequential fallback rather than multi-provider aggregation. Named providers remain strict, and exhausted routes return per-provider diagnostics. `provider` can also be a non-empty array of named providers such as `[\"brave\", \"exa\"]`; those providers run concurrently using the same aggregation path as `\"all\"`, while `\"auto\"` and `\"all\"` are invalid inside arrays. Random, weighted, sticky, and cooldown routing are not enabled. This is also updated automatically when you change the provider in the curator UI. Set `webSearch.enabled` to `false` to unregister the configured search and source-check tools while leaving fetch/content tools available. `toolNames` can opt into alternate public tool names for environments where another extension or model reserves the defaults, without changing behavior: `webSearch`, `sourceCheck`, `fetchContent`, and `getSearchContent` default to `web_search`, `source_check`, `fetch_content`, and `get_search_content`. `workflow` sets the default search workflow: `\"summary-review\"` (default, opens curator with auto-generated summary draft), `\"auto-summary\"` (returns a model-generated summary without opening the browser curator), or `\"none\"` (raw results, no curator). Overridden per-call via the `workflow` parameter on the configured search tool, or toggled at runtime with `/curator`. `browserCookies.profile` pins Gemini Web cookie lookup to a specific Chromium profile. When omitted, detected Chromium profiles are scanned in stable order and the first profile containing the required Gemini cookies is used. macOS discovery supports Helium, Chrome, Brave, and Arc; Linux discovery supports Chromium and Chrome. `allowBrowserCookies` enables Chromium cookie extraction for Gemini Web; it defaults to `false` to avoid browser data access and surprise macOS Keychain prompts. You can also set `PI_ALLOW_BROWSER_COOKIES=1`. Cookie databases are copied to a temporary read-only working copy; the reader uses `node:sqlite` when available and otherwise tries the `sqlite3` CLI or Python's standard-library SQLite module. `searchModel` overrides the Gemini API model used by the configured search tool without changing URL, YouTube, or video extraction defaults. Gemini API grounded search uses `gemini-3.6-flash` by default; set `searchModel` to choose another model. Gemini Web browser-cookie fallback uses its separate `gemini-3.1-pro` default because Gemini Web relies on private header values; explicitly configured unsupported Web models fail instead of silently falling back to 2.5 Flash. `summaryModel` sets the default model used for generating summary drafts in the curator UI and `auto-summary` mode (e.g. `\"anthropic/claude-haiku-4-5\"`, `\"openai-codex/gpt-5.3-codex-spark\"`, or `\"openrouter/nvidia/nemotron-3-super-120b-a12b:free\"`). Preferred summary and query-rewrite models also resolve through routed provider registrations such as OpenRouter when the native provider is unavailable. When Pi `enabledModels` is configured, summaries are limited to that allowlist; if no enabled summary model is available, the tool returns a deterministic summary instead of calling an unrelated model. `summaryGenerationDeadlineMs` sets the maximum time for one summary model attempt in the curator UI and `auto-summary` mode. It defaults to `30000`, must be a positive integer, and is capped at `600000`. `maxInlineContentChars` sets the direct `fetch_content` content slice and the default and maximum `get_search_content` slice. It defaults to `30000`, must be a positive integer, and is capped at `200000`; full fetched content remains stored for later retrieval. `curatorTimeoutSeconds` controls the initial curator idle timeout (default `20`, max `600`); users can still adjust the timer in the curator UI. `ssrf.allowRanges` lists CIDR ranges (e.g. `\"198.18.0.0/15\"`, `\"fd00::/8\"`) exempted from the SSRF guard that otherwise blocks private/reserved IP ranges. This unblocks `fetch_content`/`web_search` on hosts whose network proxy runs in TUN + fake-IP mode (Surge, Clash, Mihomo, Stash, ...), where public domains resolve into a synthetic reserved range. It is **off by default** — the guard stays fully enabled unless you list ranges here. Use the narrowest range that covers your proxy's fake-IP pool. All-address CIDRs such as `0.0.0.0/0` and `::/0` are rejected. `ssrf.trustEnvProxy` is a separate opt-in for sandboxed environments with valid HTTP(S) proxy env vars; it skips local DNS preflight only for proxied hostnames and still blocks localhost, literal private IP targets, and `NO_PROXY` matches. It does not configure proxy transport.\n### Kimi Code Plan\n\nRun `/login kimi-coding` in Pi and complete sign-in for an active Kimi Code Plan. Then select `provider: \"kimi\"`, include `\"kimi\"` in an explicit provider array, or add it to `searchRouting.providers`. The extension resolves a model with provider `kimi-coding` from Pi's model registry and reuses Pi's refreshed OAuth credential; no Moonshot Open Platform key is configured here.\n\nKimi search calls `POST https://api.kimi.com/coding/v1/search` with the query as `text_query`. This is the Kimi Code Plan search service, not Moonshot Open Platform `$web_search`. The endpoint exposes no native recency parameter, so `recencyFilter` is unsupported and is not sent. Shared `domainFilter` and `numResults` behavior is enforced locally on the returned `search_results`.\n\nKimi is explicit-only: it is never chosen by `auto` and never participates in `provider: \"all\"`. Search usage is drawn from the Kimi Code Plan's shared subscription quota, while the response reports no per-request usage. Excluding Kimi from automatic fan-out prevents one search from consuming opaque plan quota without an explicit choice.\n\n### All providers\n\nSet `provider: \"all\"` on `web_search` or `source_check`, or configure `\"provider\": \"all\"` as the default, to run the same query against every eligible search provider simultaneously. Parallel MCP, DuckDuckGo, Kimi, AnySearch, XCrawl, Valyu, xAI, Mistral, Bright Data, SerpBase, and Serper are always excluded because they are explicit-only; Bright Data, SerpBase, and Serper are paid Google SERP providers, while Kimi and Mistral may consume account quota or paid search-tool usage, so `all` never spends either resource without an explicit request. Exa remains eligible through its zero-config MCP path, OpenAI can use Pi auth, and other API-backed search providers participate when their API key, local endpoint, or gateway makes them available. Browser-cookie access alone does not opt Gemini into `all`; select Gemini explicitly or configure its API/gateway.\n\nSuccessful provider answers are preserved separately while source URLs and inline content are deduplicated, and one provider failure does not discard the other results. If every participating provider fails, the tool returns per-provider diagnostics. Configured Firecrawl participates in `all` like other eligible providers. In the Curator, **All** can also be selected like the other provider buttons. Each participating provider gets its own result card, including a provider badge and independent selection checkbox; failed providers get their own disabled error card. The final summary is generated from the selected provider cards and is what Pi receives. Outside the Curator, the same provider answers remain available as labeled sections in one tool response.\n\n### Jina Search\n\n`jinaApiKey` enables [Jina Search](https://s.jina.ai); alternatively, set `JINA_API_KEY`. The key may be a literal, an environment-variable reference, or a trusted command credential source:\n\n```json\n{\n  \"jinaApiKey\": \"$JINA_API_KEY\",\n  \"provider\": \"jina\"\n}\n```\n\nSetting `provider` is optional. In `auto` mode, Jina is tried after Firecrawl and before SERPdive. It can also be selected per request with `provider: \"jina\"`, included in provider arrays or `provider: \"all\"`, or placed in `searchRouting.providers`.\n\nJina Search maps `numResults` to its bounded `count` parameter, sends included domains as `site` filters, and adds excluded domains and recency constraints to the search query. Without `includeContent`, it requests SERP metadata only. With `includeContent: true`, Jina visits matching pages and returns their Markdown inline, so requests can take longer and consume more Jina tokens. The fixed hosted endpoint is `https://s.jina.ai`; no custom endpoint is configured by this extension.\n\n### TinyFish\n\n`tinyfishApiKey` enables the TinyFish Search and Fetch APIs; alternatively, set `TINYFISH_API_KEY`. Get an API key from the [TinyFish API Keys](https://agent.tinyfish.ai/api-keys) page. Like the other provider keys, `tinyfishApiKey` can contain a literal key, an environment-variable reference, or a trusted command credential source:\n\n```json\n{\n  \"tinyfishApiKey\": \"$TINYFISH_API_KEY\",\n  \"provider\": \"tinyfish\"\n}\n```\n\nSetting `provider` is optional. In `auto` mode, an available TinyFish provider is tried after Parallel and before Search1API. You can also select it per request with `provider: \"tinyfish\"` or place `\"tinyfish\"` in `searchRouting.providers`.\n\nTinyFish Search supports the shared `numResults`, `recencyFilter`, and include/exclude `domainFilter` options. Requests above 10 results use TinyFish pagination. When `includeContent` is true, result URLs are sent to TinyFish Fetch in batches of up to 10 and returned as inline Markdown content. TinyFish Fetch is also used as a hosted `fetch_content` fallback after Jina Reader and before Search1API.\n\nThe stable Search (`https://api.search.tinyfish.ai`) and Fetch (`https://api.fetch.tinyfish.ai`) endpoints are built in, so no base URL setting is required. TinyFish currently documents both APIs as credit-free, with Free-plan limits of 30 search requests per minute and 150 fetched URLs per minute; an API key is still required. See the [TinyFish Search reference](https://docs.tinyfish.ai/search-api/reference) and [TinyFish Fetch reference](https://docs.tinyfish.ai/fetch-api/reference).\n\n### Search1API\n\n`search1apiApiKey` enables [Search1API](https://www.search1api.com) Search and Crawl; alternatively, set `SEARCH1API_KEY`. Create a key in the [Search1API dashboard](https://dashboard.search1api.com). Like the other provider keys, `search1apiApiKey` can contain a literal key, an environment-variable reference, or a trusted command credential source:\n\n```json\n{\n  \"search1apiApiKey\": \"$SEARCH1API_KEY\",\n  \"provider\": \"search1api\"\n}\n```\n\nSetting `provider` is optional. In `auto` mode, an available Search1API provider is tried after TinyFish and before Searchinfinity. You can also select it per request with `provider: \"search1api\"`, include it in provider arrays or `provider: \"all\"`, or place `\"search1api\"` in `searchRouting.providers`.\n\nSearch1API Search supports the shared `numResults`, `recencyFilter`, and include/exclude `domainFilter` options. When `includeContent` is true, it maps to Search1API Deep Search and returns successfully crawled result content inline. The Search1API Crawl endpoint is also used as a hosted `fetch_content` fallback after Jina Reader and TinyFish, before Parallel.\n\nSearch1API is credit-based. A basic search costs 1 credit; Deep Search adds 1 credit for each result page crawled successfully, and a Crawl request costs 1 credit. The extension never enables Deep Search unless `includeContent` is true. See the [Search API guide](https://www.search1api.com/docs/basic/search), [Crawl API guide](https://www.search1api.com/docs/basic/crawl), and [credit rules](https://www.search1api.com/docs/essentials/credits-and-limits).\n\n### Searchinfinity\n\n`searchinfinityApiKey` enables [Byteplus Searchinfinity](https://docs.byteplus.com/en/docs/searchinfinity/) web search (the Global edition of Volcengine 豆包搜索); alternatively, set `SEARCHINFINITY_API_KEY`. Create a key in the [Searchinfinity console](https://console.byteplus.com/search-infinity/api-key). Like the other provider keys, `searchinfinityApiKey` can contain a literal key, an environment-variable reference, or a trusted command credential source:\n\n```json\n{\n  \"searchinfinityApiKey\": \"$SEARCHINFINITY_API_KEY\",\n  \"provider\": \"searchinfinity\"\n}\n```\n\nSetting `provider` is optional. In `auto` mode, an available Searchinfinity provider is tried after Search1API and before Querit. You can also select it per request with `provider: \"searchinfinity\"`, include it in provider arrays or `provider: \"all\"`, or place `\"searchinfinity\"` in `searchRouting.providers`.\n\nSearchinfinity Search supports the shared `numResults` (max 20 per request), `recencyFilter`, and include/exclude `domainFilter` options (up to 5 domains each). Answers are assembled from the model-generated per-result summaries when present, falling back to plain snippets. Accounts include a monthly free search quota shared with the Custom edition; API Key requests are limited to 5 QPS and a 30-second server-side timeout. See the [Searchinfinity API reference](https://docs.byteplus.com/api/docs/searchinfinity/Searchinfinity_API_Reference).\n\n### Querit\n\n`queritApiKey` enables Querit Search and Contents; alternatively, set `QUERIT_API_KEY`. Create a key in the [Querit dashboard](https://www.querit.ai/en/dashboard/api-keys). Like the other provider keys, `queritApiKey` can contain a literal key, an environment-variable reference, or a trusted command credential source:\n\n```json\n{\n  \"queritApiKey\": \"$QUERIT_API_KEY\",\n  \"provider\": \"querit\"\n}\n```\n\nSetting `provider` is optional. In `auto` mode, an available Querit provider is tried after Searchinfinity and before Tavily. You can also select it per request with `provider: \"querit\"`, include it in provider arrays or `provider: \"all\"`, or place `\"querit\"` in `searchRouting.providers`.\n\nSearch requests follow the official [`querit-python`](https://github.com/querit-ai/querit-python) models: `numResults` maps to `count`, include/exclude `domainFilter` values map to `filters.sites`, and recency maps to `filters.timeRange.date` (`d1`, `w1`, `m1`, or `y1`). When `includeContent` is true, result URLs are sent to `POST /v1/contents` in batches of up to 10 and returned as inline Markdown. The same Contents endpoint is used as a hosted `fetch_content` fallback after Search1API and before Parallel. Querit Search and Contents subscriptions are independent; an API key can search successfully while `/v1/contents` returns `403 No active contents subscription`.\n\n### AnySearch\n\nAnySearch is an explicit-only provider: it is never included in zero-config `auto` fallback or in `provider: \"all\"`, but it can be selected with `provider: \"anysearch\"`, configured as the named provider, or placed in `searchRouting`. It supports anonymous requests and optional `anysearchApiKey` / `ANYSEARCH_API_KEY` credentials. Requests intentionally send only `{ query, max_results }`; `recencyFilter`, `domainFilter`, and `includeContent` do not add API request parameters. When `includeContent` is true, returned `content` fields are exposed as inline content.\n\n### XCrawl\n\nXCrawl is an explicit-only provider: it is never included in zero-config `auto` fallback or in `provider: \"all\"`, but it can be selected with `provider: \"xcrawl\"`, configured as the named provider, or placed ","readmeFilename":"README.md"}