{"_id":"@aemonculaba/pi-search","_rev":"5-4dbf84a937fe6ea586c60d523b946ded","name":"@aemonculaba/pi-search","dist-tags":{"latest":"0.2.3"},"versions":{"0.1.0":{"name":"@aemonculaba/pi-search","version":"0.1.0","keywords":["pi-package","pi-extension","pi-coding-agent","web-search","web-fetch"],"license":"MIT","_id":"@aemonculaba/pi-search@0.1.0","maintainers":[{"name":"aemonculaba","email":"eysenfalk@gmail.com"}],"homepage":"https://github.com/eysenfalk/pi-search#readme","bugs":{"url":"https://github.com/eysenfalk/pi-search/issues"},"pi":{"extensions":["./dist/index.js"]},"dist":{"shasum":"14c470d1c053a9b3ab9b259aac0c717a5cf50ce4","tarball":"https://registry.npmjs.org/@aemonculaba/pi-search/-/pi-search-0.1.0.tgz","fileCount":4,"integrity":"sha512-iMYhEc1+jwAHkWhvD5K9B/NR/GzaBZzh7E+uEhGTBGx2bd/bTjnD8i+AZ2TGivGBzT051+xfXR3MdKahW8QXSQ==","signatures":[{"sig":"MEUCICJ5sqNyR9g8XK69bIf0juRpsNn74WH0G2lRtvDrfQ9bAiEAxT+R6j2XISsgrjdHYrRa7CQYrvZejFuPX0Rn9te2tSc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20945},"main":"dist/index.js","type":"commonjs","engines":{"node":">=20"},"gitHead":"cb60800f6660e63bd3e4cd1f2d3e91e0385c39c4","scripts":{"test":"node --test test/*.test.cjs","build":"rm -rf dist && esbuild index.ts --platform=node --format=cjs --outfile=dist/index.js --packages=external","prepare":"npm run build","pack:check":"npm pack --dry-run","release:dry-run":"npm publish --dry-run --access public"},"_npmUser":{"name":"aemonculaba","email":"eysenfalk@gmail.com"},"repository":{"url":"git+https://github.com/eysenfalk/pi-search.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search + fetch extension for pi (OpenAI search + Readability extraction)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"linkedom":"^0.18.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.4.2","esbuild":"^0.25.9","@sinclair/typebox":"^0.34.48"},"peerDependencies":{"@sinclair/typebox":"^0.34.48","@mariozechner/pi-coding-agent":"^0.54.2"},"optionalDependencies":{"playwright":"^1.58.2"},"_npmOperationalInternal":{"tmp":"tmp/pi-search_0.1.0_1771941725979_0.5465497661386056","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@aemonculaba/pi-search","version":"0.2.0","keywords":["pi-package","pi-extension","pi-coding-agent","web-search","web-fetch"],"license":"MIT","_id":"@aemonculaba/pi-search@0.2.0","maintainers":[{"name":"eysenfalk","email":"eysenfalk@gmail.com"}],"homepage":"https://github.com/eysenfalk/pi-search#readme","bugs":{"url":"https://github.com/eysenfalk/pi-search/issues"},"pi":{"extensions":["./index.cjs"]},"dist":{"shasum":"1790c9e9dbce97dc062e0ec9cd9ad21b96f58344","tarball":"https://registry.npmjs.org/@aemonculaba/pi-search/-/pi-search-0.2.0.tgz","fileCount":6,"integrity":"sha512-NYVrIVS6BAH4bRxIya6YAvpoymcv+/yIrMmoM1mtdJ/oSS0V4iqZ41sezzbHyqRIpMydi/c+IwIsU71Dcl+G9A==","signatures":[{"sig":"MEYCIQCcouvhmgGe/p8KCTHrhnJRC/fn9PHoYArOhy/jUW1SggIhAKMBj6F4N941IkJ1t34hGOflNblqNwG7IsO5cXyb9oZx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27798},"main":"index.cjs","type":"commonjs","engines":{"node":">=20"},"gitHead":"a94db61390089d007b3eef65861c94f0ae40f13f","scripts":{"test":"node --test test/*.test.cjs","build":"rm -rf dist && esbuild index.ts --platform=node --format=cjs --outfile=dist/index.js --packages=external","prepare":"npm run build","pack:check":"npm pack --dry-run","release:dry-run":"npm publish --dry-run --access public"},"_npmUser":{"name":"eysenfalk","email":"eysenfalk@gmail.com"},"repository":{"url":"git+https://github.com/eysenfalk/pi-search.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search + fetch extension for pi (OpenAI search + Readability extraction)","directories":{},"_nodeVersion":"25.2.1","dependencies":{"linkedom":"^0.18.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.4.2","esbuild":"^0.25.9","@sinclair/typebox":"^0.34.48"},"peerDependencies":{"@sinclair/typebox":"^0.34.48","@mariozechner/pi-coding-agent":"^0.54.2"},"optionalDependencies":{"playwright":"^1.58.2"},"_npmOperationalInternal":{"tmp":"tmp/pi-search_0.2.0_1771944963992_0.0479685985114664","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@aemonculaba/pi-search","version":"0.2.2","keywords":["pi-package","pi-extension","pi-coding-agent","web-search","web-fetch"],"license":"MIT","_id":"@aemonculaba/pi-search@0.2.2","maintainers":[{"name":"eysenfalk","email":"eysenfalk@gmail.com"}],"homepage":"https://github.com/eysenfalk/pi-search#readme","bugs":{"url":"https://github.com/eysenfalk/pi-search/issues"},"pi":{"extensions":["./index.cjs"]},"dist":{"shasum":"011f9c47b493ab03054a0ec6dbc41ef6f7d83426","tarball":"https://registry.npmjs.org/@aemonculaba/pi-search/-/pi-search-0.2.2.tgz","fileCount":6,"integrity":"sha512-6NpdOnYg9JHB/f4d4GOKJKJHVyVn1LlfSvPhf7+dajWH7vluqqJ+HbzrKholSgFcZPK1MulYZ2X0+LJCJCwsOA==","signatures":[{"sig":"MEUCIQDpi6tdb9wfs41YUDUKC/zVr3c31dMtc7c6gn4QuY1bJAIgCT9MqVKFLTk6jshbS5DDdHkCRxodgdL0kYGkcu5Jfpk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aemonculaba%2fpi-search@0.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":27798},"main":"index.cjs","type":"commonjs","engines":{"node":">=20"},"gitHead":"1b70956e59171465230b931e36817fbcf88eafea","scripts":{"test":"node --test test/*.test.cjs","build":"rm -rf dist && esbuild index.ts --platform=node --format=cjs --outfile=dist/index.js --packages=external","prepare":"npm run build","pack:check":"npm pack --dry-run","release:dry-run":"npm publish --dry-run --access public"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4d91ea8c-c16c-4882-a815-215f5212ff57"}},"repository":{"url":"git+https://github.com/eysenfalk/pi-search.git","type":"git"},"_npmVersion":"11.6.2","description":"Web search + fetch extension for pi (OpenAI search + Readability extraction)","directories":{},"_nodeVersion":"24.13.0","dependencies":{"linkedom":"^0.18.0","turndown":"^7.2.0","@mozilla/readability":"^0.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.4.2","esbuild":"^0.25.9","@sinclair/typebox":"^0.34.48"},"peerDependencies":{"@sinclair/typebox":"^0.34.48","@mariozechner/pi-coding-agent":"^0.54.2"},"optionalDependencies":{"playwright":"^1.58.2"},"_npmOperationalInternal":{"tmp":"tmp/pi-search_0.2.2_1771945295151_0.42187231289566607","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@aemonculaba/pi-search","version":"0.2.3","description":"Web search + fetch extension for pi (OpenAI search + Readability extraction)","license":"MIT","type":"commonjs","main":"index.cjs","keywords":["pi-package","pi-extension","pi-coding-agent","web-search","web-fetch"],"repository":{"type":"git","url":"git+https://github.com/eysenfalk/pi-search.git"},"homepage":"https://github.com/eysenfalk/pi-search#readme","bugs":{"url":"https://github.com/eysenfalk/pi-search/issues"},"engines":{"node":">=20"},"scripts":{"build":"rm -rf dist && esbuild index.ts --platform=node --format=cjs --outfile=dist/index.js --packages=external","prepare":"npm run build","test":"node --test test/*.test.cjs","pack:check":"npm pack --dry-run","release:dry-run":"npm publish --dry-run --access public"},"dependencies":{"@mozilla/readability":"^0.5.0","linkedom":"^0.18.0","turndown":"^7.2.0"},"peerDependencies":{"@mariozechner/pi-coding-agent":"^0.54.2","@sinclair/typebox":"^0.34.48"},"optionalDependencies":{"playwright":"^1.58.2"},"devDependencies":{"@sinclair/typebox":"^0.34.48","esbuild":"^0.25.9","jiti":"^2.4.2"},"publishConfig":{"access":"public"},"pi":{"extensions":["./index.cjs"]},"gitHead":"3c7efb4d15ff862857c34dcd33ee82ff5830ad4c","_id":"@aemonculaba/pi-search@0.2.3","_nodeVersion":"24.13.1","_npmVersion":"11.8.0","dist":{"integrity":"sha512-H4ux7v7Ckx1FUhZPRrAoJVMBQjab0G+vm2zsxi0BoWQlhUsqWNrIX7wHaJBZrYjQuLkDlql0TLU8mJPEorTMww==","shasum":"d51199d9cd1c9130d073b8b2768df6092c8176d8","tarball":"https://registry.npmjs.org/@aemonculaba/pi-search/-/pi-search-0.2.3.tgz","fileCount":6,"unpackedSize":28164,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aemonculaba%2fpi-search@0.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGjCeZboPZh7For3Qezy9HlTVObTQu9P1cq8/R0K9dsJAiARx3Bbl3R8FI2NBdpNh4QDIohrHVTX8zx5LuwF3lIfYg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4d91ea8c-c16c-4882-a815-215f5212ff57"}},"directories":{},"maintainers":[{"name":"eysenfalk","email":"eysenfalk@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-search_0.2.3_1772106407045_0.6605900739067991"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-24T14:02:05.871Z","modified":"2026-02-26T11:46:47.497Z","0.1.0":"2026-02-24T14:02:06.107Z","0.2.0":"2026-02-24T14:56:04.132Z","0.2.2":"2026-02-24T15:01:35.311Z","0.2.3":"2026-02-26T11:46:47.185Z"},"bugs":{"url":"https://github.com/eysenfalk/pi-search/issues"},"license":"MIT","homepage":"https://github.com/eysenfalk/pi-search#readme","keywords":["pi-package","pi-extension","pi-coding-agent","web-search","web-fetch"],"repository":{"type":"git","url":"git+https://github.com/eysenfalk/pi-search.git"},"description":"Web search + fetch extension for pi (OpenAI search + Readability extraction)","maintainers":[{"name":"eysenfalk","email":"eysenfalk@gmail.com"}],"readme":"# @aemonculaba/pi-search\n\nWeb search + fetch extension for pi with an agent-first browse workflow:\n\n1. `web_search(query)` → list of results (title, URL, snippet)\n2. `web_fetch(url)` → clean Markdown content + links found on page\n\nThis avoids DDG scraping/rate limits by using OpenAI/Codex native web search.\n\n## Tools\n\n### `web_search`\nUses OpenAI `web_search` tool (Codex OAuth or OpenAI API key) and returns raw results.\n\n### `web_fetch`\nFetches and extracts page content via:\n- **Readability + Turndown** (default)\n- **Playwright + Readability** fallback for JS-heavy pages\n- **Raw text** fallback for non-HTML responses\n\nAlso returns links found on the page for follow-up crawling.\n\n## Auth priority\n\n1. `openai-codex` (`/login` subscription)\n2. `openai` API key\n3. `OPENAI_API_KEY` env var\n\n## Local dev (no symlink)\n\n```bash\nnpm install\nnpx playwright install chromium\npi install /absolute/path/to/pi-search\n```\n\nThen in pi run `/reload`.\n\nTo update while developing, just edit files and run `/reload` again.\n\n## Install from npm in pi\n\n```bash\npi install npm:@aemonculaba/pi-search\n# or pin a version\npi install npm:@aemonculaba/pi-search@0.2.0\n```\n\n## Release / test install flow\n\n1. Validate package locally:\n\n```bash\nnpm ci\nnpm test\nnpm run pack:check\nnpm run release:dry-run\n```\n\n2. Publish a **dev tag** (for npm-based testing before latest):\n\n```bash\nnpm version prerelease --preid=dev\nnpm publish --tag dev\n```\n\nThen test in pi:\n\n```bash\npi remove npm:@aemonculaba/pi-search || true\npi install npm:@aemonculaba/pi-search@dev\n```\n\n3. Publish stable (tag + push):\n\n```bash\ngit tag v0.2.0\ngit push origin v0.2.0\n```\n\nGitHub Action will publish to npm via Trusted Publishing (OIDC), no `NPM_TOKEN` needed.\n\n4. Test official install in pi:\n\n```bash\npi remove npm:@aemonculaba/pi-search || true\npi install npm:@aemonculaba/pi-search@0.2.0\n```\n\n## CI/CD\n\n- `CI` workflow: install, test, package dry-check on push/PR\n- `Release` workflow: publish to npm on `v*` tags (or manual dispatch) using npm Trusted Publishing\n\n## Policy (baked into extension)\n\nThis package includes a web-tool policy that enforces `web_search` + `web_fetch` for web access.\n\nWhen enabled (default):\n- injects guidance into the system prompt each turn\n- blocks known alternate web-search/web-fetch tools\n- optionally blocks bash-based web fetching (`curl`, `wget`, raw URLs, etc.)\n\n## Config\n\n| Variable | Description |\n|---|---|\n| `WEBSEARCH_PROVIDER` | Force provider (`openai`) |\n| `WEBSEARCH_MODEL` | Override model (default `gpt-5.2` for codex) |\n| `OPENAI_API_KEY` | API key fallback |\n| `PI_SEARCH_ENFORCE_WEB_POLICY` | Enable/disable embedded policy (`true` by default) |\n| `PI_SEARCH_BLOCK_BASH_WEB` | Block bash web-fetch patterns (`true` by default) |\n| `PI_SEARCH_EXTRA_BLOCKED_TOOLS` | CSV list of extra tool names to block |\n| `PI_SEARCH_ALLOWED_WEB_TOOLS` | CSV list of blocked tools to allow |\n\n## Managing pi extensions and migrating across servers\n\nSee [`docs/PI_AGENT_OPERATIONS.md`](docs/PI_AGENT_OPERATIONS.md) for a practical playbook:\n- package-based extension management\n- version pinning for reproducibility\n- project-local `.pi/settings.json` strategy\n- migration checklist for new servers\n","readmeFilename":"README.md"}