{"_id":"@emmaneugene/pi-cursor-sdk","_rev":"9-e9a6d62cfe44fe9538c8f3a5c5cb194b","name":"@emmaneugene/pi-cursor-sdk","dist-tags":{"latest":"0.6.0"},"versions":{"0.3.7":{"name":"@emmaneugene/pi-cursor-sdk","version":"0.3.7","keywords":["pi-package","pi","pi-extension","cursor","cursor-sdk","ai","extension"],"author":{"url":"https://github.com/emmaneugene","name":"Emmanuel Oh","email":"emmaneugene@outlook.com"},"license":"MIT","_id":"@emmaneugene/pi-cursor-sdk@0.3.7","maintainers":[{"name":"emmaneugene","email":"emmaneugene@outlook.com"}],"contributors":[{"url":"https://github.com/fitchmultz","name":"Mitch Fultz"}],"homepage":"https://github.com/emmaneugene/pi-cursor-sdk#readme","bugs":{"url":"https://github.com/emmaneugene/pi-cursor-sdk/issues"},"pi":{"extensions":["./dist/index.js"]},"dist":{"shasum":"17327414f992fbf791bd26b170d844dd04d04ed1","tarball":"https://registry.npmjs.org/@emmaneugene/pi-cursor-sdk/-/pi-cursor-sdk-0.3.7.tgz","fileCount":3697,"integrity":"sha512-Kpa/Rr/3UN8XCIOFm4ZVqeKqlIPUmSMVbSTniQGpo1zv8y18CgCGci+B18OEyEDPKReOd+BAAyP1EzSYGSkHqA==","signatures":[{"sig":"MEQCIBfvTg8Kz+DIY4avnWrYZrIhUk/b7Dt9SjtQcnL1qmQUAiBeyMvag908TQlzUMiXRmCu3tdxhMQU/BRjRsw6taBUpA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17089257},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"de2c6b21e6628a5372bd84489093348b9b663f85","scripts":{"test":"vitest run","build":"node ./scripts/build.mjs","verify":"npm run check:platform-smoke && npm run typecheck && npm test","prepare":"node ./scripts/prepare.mjs","typecheck":"npm run typecheck:src && npm run typecheck:tests && npm run typecheck:replay-compile","smoke:live":"npm run build && scripts/tmux-live-smoke.sh","test:watch":"vitest","smoke:cloud":"node scripts/cloud-runtime-smoke.mjs","smoke:jsonl":"node scripts/validate-smoke-jsonl.mjs","smoke:visual":"npm run build && node scripts/visual-tui-smoke.mjs","typecheck:src":"tsc --noEmit","smoke:isolated":"npm run build && scripts/isolated-cursor-smoke.sh","smoke:platform":"node scripts/platform-smoke.mjs","smoke:steering":"node scripts/steering-rpc-smoke.mjs","typecheck:tests":"tsc -p tsconfig.test.json --noEmit","debug:sdk-events":"node scripts/debug-sdk-events.mjs","smoke:local-resume":"node scripts/local-resume-smoke.mjs","smoke:platform:all":"npm run smoke:platform:doctor && node scripts/platform-smoke.mjs run --target macos,ubuntu,windows-native","debug:mcp-coldstart":"node scripts/probe-mcp-coldstart.mjs","smoke:cloud:context":"node scripts/cloud-runtime-smoke.mjs --context-matrix","check:platform-smoke":"node --check platform-smoke.config.mjs && node --check scripts/cloud-runtime-smoke.mjs && node --check scripts/lib/cloud-smoke-cleanup-evidence.mjs && node --check scripts/lib/cloud-smoke-artifacts.mjs && node --check scripts/lib/cloud-smoke-pi-runner.mjs && node --check scripts/lib/cloud-smoke-github.mjs && node --check scripts/lib/cloud-smoke-shutdown.mjs && node --check scripts/local-resume-cleanup-smoke.mjs && node --check scripts/local-resume-smoke.mjs && node --check scripts/lib/local-resume-smoke-harness.mjs && node --check scripts/platform-smoke.mjs && node --check scripts/platform-smoke/artifact-bundle-chunk.mjs && node --check scripts/platform-smoke/artifact-bundle-contract.mjs && node --check scripts/platform-smoke/artifact-fs-safety.mjs && node --check scripts/platform-smoke/artifact-anchored-extract.mjs && node --check scripts/platform-smoke/artifact-secrets.mjs && node --check scripts/platform-smoke/assertions.mjs && node --check scripts/platform-smoke/artifacts.mjs && node --check scripts/platform-smoke/card-detect.mjs && node --check scripts/platform-smoke/crabbox-runner.mjs && node --check scripts/platform-smoke/doctor.mjs && node --check scripts/platform-smoke/jsonl-text.mjs && node --check scripts/platform-smoke/live-suite-runner.mjs && node --check scripts/platform-smoke/local-resume-runner.mjs && node --check scripts/platform-smoke/pty-capture.mjs && node --check scripts/platform-smoke/render-ansi.mjs && node --check scripts/platform-smoke/scenarios.mjs && node --check scripts/platform-smoke/target-runtime.mjs && node --check scripts/platform-smoke/targets.mjs && node --check scripts/platform-smoke/visual-evidence.mjs && node --check scripts/platform-smoke/wrapped-line-match.mjs && vitest run test/platform-artifact-boundaries.test.ts test/platform-smoke-artifact-transport.test.ts test/cloud-smoke-helpers.test.ts test/cursor-sdk-cloud-list-runs-contract.test.ts test/smoke-cli-package-contracts.test.ts test/smoke-tooling.test.ts","smoke:platform:macos":"node scripts/platform-smoke.mjs run --target macos","debug:provider-events":"node scripts/debug-provider-events.mjs","smoke:platform:doctor":"node scripts/platform-smoke.mjs doctor","smoke:platform:ubuntu":"node scripts/platform-smoke.mjs run --target ubuntu","check:cursor-snapshots":"node scripts/refresh-cursor-model-snapshots.mjs --check","smoke:local-resume:tree":"node scripts/local-resume-smoke.mjs --tree","refresh:cursor-snapshots":"node scripts/refresh-cursor-model-snapshots.mjs","smoke:local-resume:abort":"node scripts/local-resume-smoke.mjs --abort","typecheck:replay-compile":"tsc --noEmit -p test/tsconfig.json","smoke:local-resume:safety":"node scripts/local-resume-smoke.mjs --safety","smoke:local-resume:cleanup":"node scripts/local-resume-smoke.mjs --cleanup","smoke:local-resume:fallback":"node scripts/local-resume-smoke.mjs --fallback","smoke:local-resume:compaction":"node scripts/local-resume-smoke.mjs --compaction","smoke:platform:windows-native":"node scripts/platform-smoke.mjs run --target windows-native","smoke:local-resume:copy-switch":"node scripts/local-resume-smoke.mjs --copy-switch","smoke:local-resume:tool-surface":"node scripts/local-resume-smoke.mjs --tool-surface","smoke:local-resume:default-dry-run":"node scripts/local-resume-smoke.mjs --default-dry-run"},"_npmUser":{"name":"emmaneugene","email":"emmaneugene@outlook.com"},"repository":{"url":"git+https://github.com/emmaneugene/pi-cursor-sdk.git","type":"git"},"_npmVersion":"11.19.0","description":"pi provider extension backed by @cursor/sdk local and cloud agents","directories":{},"_nodeVersion":"26.8.1","allowScripts":{"node-pty@1.1.0":true},"dependencies":{"@cursor/sdk":"1.0.30","@hono/node-server":"2.0.12","@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.6","typebox":"1.3.7","node-pty":"^1.1.0","playwright":"^1.60.0","typescript":"^6.0.3","@xterm/xterm":"^6.0.0","@earendil-works/pi-ai":"0.84.0","@earendil-works/pi-tui":"0.84.0","@earendil-works/pi-coding-agent":"0.84.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"bundleDependencies":["@hono/node-server","@modelcontextprotocol/sdk"],"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-tui":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pi-cursor-sdk_0.3.7_1788630359453_0.3269162643506074","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@emmaneugene/pi-cursor-sdk","version":"0.4.0","keywords":["pi-package","pi","pi-extension","cursor","cursor-sdk","ai","extension"],"author":{"url":"https://github.com/emmaneugene","name":"Emmanuel Oh","email":"emmaneugene@outlook.com"},"license":"MIT","_id":"@emmaneugene/pi-cursor-sdk@0.4.0","maintainers":[{"name":"emmaneugene","email":"emmaneugene@outlook.com"}],"contributors":[{"url":"https://github.com/fitchmultz","name":"Mitch Fultz"}],"homepage":"https://github.com/emmaneugene/pi-cursor-sdk#readme","bugs":{"url":"https://github.com/emmaneugene/pi-cursor-sdk/issues"},"pi":{"extensions":["./dist/index.js"]},"dist":{"shasum":"047a9eacd5b5b7677761fa42780f75aecab09283","tarball":"https://registry.npmjs.org/@emmaneugene/pi-cursor-sdk/-/pi-cursor-sdk-0.4.0.tgz","fileCount":3675,"integrity":"sha512-phYGADXn8VB+XQ2a/JnTpNUp0qnzKUumOfGVMS2nXZUeDca/xJ/pwWf+TqjHDMDE02ytcFILRY6WqKdmEhwqrw==","signatures":[{"sig":"MEUCIG57JKo4+JiYD5flr568T63mEM8C7xIuzzbCLH+y8VslAiEAjleBY2DAFduF/syfk+87yLx2mpN54noNvz4mAmHC92I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIG5rTOZbvASqkwKGNV+hDLF3GBUCUczcHWGpVFcETFOuAiBCcffhDdvQA73dOvpn0BSggQOBv1zTl83MEfTwdlCW/g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":16757735},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"671c8f4ee39b62d9d6d25ec1b5851b7f98c42c29","scripts":{"test":"vitest run","build":"node ./scripts/build.mjs","verify":"npm run check:platform-smoke && npm run typecheck && npm test","prepare":"node ./scripts/prepare.mjs","typecheck":"npm run typecheck:src && npm run typecheck:tests && npm run typecheck:replay-compile","smoke:live":"npm run build && scripts/tmux-live-smoke.sh","test:watch":"vitest","smoke:jsonl":"node scripts/validate-smoke-jsonl.mjs","smoke:visual":"npm run build && node scripts/visual-tui-smoke.mjs","typecheck:src":"tsc --noEmit","smoke:isolated":"npm run build && scripts/isolated-cursor-smoke.sh","smoke:platform":"node scripts/platform-smoke.mjs","smoke:steering":"node scripts/steering-rpc-smoke.mjs","typecheck:tests":"tsc -p tsconfig.test.json --noEmit","debug:sdk-events":"node scripts/debug-sdk-events.mjs","smoke:local-resume":"node scripts/local-resume-smoke.mjs","smoke:platform:all":"npm run smoke:platform:doctor && node scripts/platform-smoke.mjs run --target macos,ubuntu,windows-native","debug:mcp-coldstart":"node scripts/probe-mcp-coldstart.mjs","check:platform-smoke":"node --check platform-smoke.config.mjs && node --check scripts/local-resume-cleanup-smoke.mjs && node --check scripts/local-resume-smoke.mjs && node --check scripts/lib/local-resume-smoke-harness.mjs && node --check scripts/platform-smoke.mjs && node --check scripts/platform-smoke/artifact-bundle-chunk.mjs && node --check scripts/platform-smoke/artifact-bundle-contract.mjs && node --check scripts/platform-smoke/artifact-fs-safety.mjs && node --check scripts/platform-smoke/artifact-anchored-extract.mjs && node --check scripts/platform-smoke/artifact-secrets.mjs && node --check scripts/platform-smoke/assertions.mjs && node --check scripts/platform-smoke/artifacts.mjs && node --check scripts/platform-smoke/card-detect.mjs && node --check scripts/platform-smoke/crabbox-runner.mjs && node --check scripts/platform-smoke/doctor.mjs && node --check scripts/platform-smoke/jsonl-text.mjs && node --check scripts/platform-smoke/live-suite-runner.mjs && node --check scripts/platform-smoke/local-resume-runner.mjs && node --check scripts/platform-smoke/pty-capture.mjs && node --check scripts/platform-smoke/render-ansi.mjs && node --check scripts/platform-smoke/scenarios.mjs && node --check scripts/platform-smoke/target-runtime.mjs && node --check scripts/platform-smoke/targets.mjs && node --check scripts/platform-smoke/visual-evidence.mjs && node --check scripts/platform-smoke/wrapped-line-match.mjs && vitest run test/platform-artifact-boundaries.test.ts test/platform-smoke-artifact-transport.test.ts test/smoke-cli-package-contracts.test.ts test/smoke-tooling.test.ts","smoke:platform:macos":"node scripts/platform-smoke.mjs run --target macos","debug:provider-events":"node scripts/debug-provider-events.mjs","smoke:platform:doctor":"node scripts/platform-smoke.mjs doctor","smoke:platform:ubuntu":"node scripts/platform-smoke.mjs run --target ubuntu","check:cursor-snapshots":"node scripts/refresh-cursor-model-snapshots.mjs --check","smoke:local-resume:tree":"node scripts/local-resume-smoke.mjs --tree","refresh:cursor-snapshots":"node scripts/refresh-cursor-model-snapshots.mjs","smoke:local-resume:abort":"node scripts/local-resume-smoke.mjs --abort","typecheck:replay-compile":"tsc --noEmit -p test/tsconfig.json","smoke:local-resume:safety":"node scripts/local-resume-smoke.mjs --safety","smoke:local-resume:cleanup":"node scripts/local-resume-smoke.mjs --cleanup","smoke:local-resume:fallback":"node scripts/local-resume-smoke.mjs --fallback","smoke:local-resume:compaction":"node scripts/local-resume-smoke.mjs --compaction","smoke:platform:windows-native":"node scripts/platform-smoke.mjs run --target windows-native","smoke:local-resume:copy-switch":"node scripts/local-resume-smoke.mjs --copy-switch","smoke:local-resume:tool-surface":"node scripts/local-resume-smoke.mjs --tool-surface","smoke:local-resume:default-dry-run":"node scripts/local-resume-smoke.mjs --default-dry-run"},"_npmUser":{"name":"emmaneugene","email":"emmaneugene@outlook.com"},"repository":{"url":"git+https://github.com/emmaneugene/pi-cursor-sdk.git","type":"git"},"_npmVersion":"11.19.0","description":"pi provider extension backed by @cursor/sdk local agents","directories":{},"_nodeVersion":"26.8.1","allowScripts":{"node-pty@1.1.0":true},"dependencies":{"@cursor/sdk":"1.0.30","@hono/node-server":"2.0.12","@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.6","typebox":"1.3.7","node-pty":"^1.1.0","playwright":"^1.60.0","typescript":"^6.0.3","@xterm/xterm":"^6.0.0","@earendil-works/pi-ai":"0.84.0","@earendil-works/pi-tui":"0.84.0","@earendil-works/pi-coding-agent":"0.84.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"bundleDependencies":["@hono/node-server","@modelcontextprotocol/sdk"],"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-tui":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pi-cursor-sdk_0.4.0_1788709918236_0.2830771466042892","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@emmaneugene/pi-cursor-sdk","version":"0.4.1","keywords":["pi-package","pi","pi-extension","cursor","cursor-sdk","ai","extension"],"author":{"url":"https://github.com/emmaneugene","name":"Emmanuel Oh","email":"emmaneugene@outlook.com"},"license":"MIT","_id":"@emmaneugene/pi-cursor-sdk@0.4.1","maintainers":[{"name":"emmaneugene","email":"emmaneugene@outlook.com"}],"contributors":[{"url":"https://github.com/fitchmultz","name":"Mitch Fultz"}],"homepage":"https://github.com/emmaneugene/pi-cursor-sdk#readme","bugs":{"url":"https://github.com/emmaneugene/pi-cursor-sdk/issues"},"pi":{"extensions":["./dist/index.js"]},"dist":{"shasum":"7546a9c0f603ddcab4748821c4eb6347e21310e0","tarball":"https://registry.npmjs.org/@emmaneugene/pi-cursor-sdk/-/pi-cursor-sdk-0.4.1.tgz","fileCount":3678,"integrity":"sha512-hr1PcYdPf6DTtJk2R1E2TONMw7DIviSQWKhYqcrOUuorwTbjgf9QNOTH+32+kPnByeDAuvFVDAneWJ3qPA1+aQ==","signatures":[{"sig":"MEUCIBGQkWMgZLAz9Ud6NkWbAZxKds3B4Cb13joh4BxvRFxhAiEA3cR3PftGk9rmcgCBuY3/vL594x6COWz+IduBCfvJKJU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDAUHjl4jNwZp4pI5JpfxZJRmuL3oPBNJYET+SNkuvB2AIhAPh//Fvd1+qDla0F2ycEECCamDh3vYsqHRAOtcNcPQqc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":16769569},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"764fdb93bc757b090ba4cba30a0541ffad7353da","scripts":{"test":"vitest run","build":"node ./scripts/build.mjs","verify":"npm run check:platform-smoke && npm run typecheck && npm test","prepare":"node ./scripts/prepare.mjs","typecheck":"npm run typecheck:src && npm run typecheck:tests && npm run typecheck:replay-compile","smoke:live":"npm run build && scripts/tmux-live-smoke.sh","test:watch":"vitest","smoke:jsonl":"node scripts/validate-smoke-jsonl.mjs","smoke:visual":"npm run build && node scripts/visual-tui-smoke.mjs","typecheck:src":"tsc --noEmit","smoke:isolated":"npm run build && scripts/isolated-cursor-smoke.sh","smoke:platform":"node scripts/platform-smoke.mjs","smoke:steering":"node scripts/steering-rpc-smoke.mjs","typecheck:tests":"tsc -p tsconfig.test.json --noEmit","debug:sdk-events":"node scripts/debug-sdk-events.mjs","smoke:local-resume":"node scripts/local-resume-smoke.mjs","smoke:platform:all":"npm run smoke:platform:doctor && node scripts/platform-smoke.mjs run --target macos,ubuntu,windows-native","debug:mcp-coldstart":"node scripts/probe-mcp-coldstart.mjs","check:platform-smoke":"node --check platform-smoke.config.mjs && node --check scripts/local-resume-cleanup-smoke.mjs && node --check scripts/local-resume-smoke.mjs && node --check scripts/lib/local-resume-smoke-harness.mjs && node --check scripts/platform-smoke.mjs && node --check scripts/platform-smoke/artifact-bundle-chunk.mjs && node --check scripts/platform-smoke/artifact-bundle-contract.mjs && node --check scripts/platform-smoke/artifact-fs-safety.mjs && node --check scripts/platform-smoke/artifact-anchored-extract.mjs && node --check scripts/platform-smoke/artifact-secrets.mjs && node --check scripts/platform-smoke/assertions.mjs && node --check scripts/platform-smoke/artifacts.mjs && node --check scripts/platform-smoke/card-detect.mjs && node --check scripts/platform-smoke/crabbox-runner.mjs && node --check scripts/platform-smoke/doctor.mjs && node --check scripts/platform-smoke/jsonl-text.mjs && node --check scripts/platform-smoke/live-suite-runner.mjs && node --check scripts/platform-smoke/local-resume-runner.mjs && node --check scripts/platform-smoke/pty-capture.mjs && node --check scripts/platform-smoke/render-ansi.mjs && node --check scripts/platform-smoke/scenarios.mjs && node --check scripts/platform-smoke/target-runtime.mjs && node --check scripts/platform-smoke/targets.mjs && node --check scripts/platform-smoke/visual-evidence.mjs && node --check scripts/platform-smoke/wrapped-line-match.mjs && vitest run test/platform-artifact-boundaries.test.ts test/platform-smoke-artifact-transport.test.ts test/smoke-cli-package-contracts.test.ts test/smoke-tooling.test.ts","smoke:platform:macos":"node scripts/platform-smoke.mjs run --target macos","debug:provider-events":"node scripts/debug-provider-events.mjs","smoke:platform:doctor":"node scripts/platform-smoke.mjs doctor","smoke:platform:ubuntu":"node scripts/platform-smoke.mjs run --target ubuntu","check:cursor-snapshots":"node scripts/refresh-cursor-model-snapshots.mjs --check","smoke:local-resume:tree":"node scripts/local-resume-smoke.mjs --tree","refresh:cursor-snapshots":"node scripts/refresh-cursor-model-snapshots.mjs","smoke:local-resume:abort":"node scripts/local-resume-smoke.mjs --abort","typecheck:replay-compile":"tsc --noEmit -p test/tsconfig.json","smoke:local-resume:safety":"node scripts/local-resume-smoke.mjs --safety","smoke:local-resume:cleanup":"node scripts/local-resume-smoke.mjs --cleanup","smoke:local-resume:fallback":"node scripts/local-resume-smoke.mjs --fallback","smoke:local-resume:compaction":"node scripts/local-resume-smoke.mjs --compaction","smoke:platform:windows-native":"node scripts/platform-smoke.mjs run --target windows-native","smoke:local-resume:copy-switch":"node scripts/local-resume-smoke.mjs --copy-switch","smoke:local-resume:tool-surface":"node scripts/local-resume-smoke.mjs --tool-surface","smoke:local-resume:default-dry-run":"node scripts/local-resume-smoke.mjs --default-dry-run"},"_npmUser":{"name":"emmaneugene","email":"emmaneugene@outlook.com"},"repository":{"url":"git+https://github.com/emmaneugene/pi-cursor-sdk.git","type":"git"},"_npmVersion":"11.19.0","description":"pi provider extension backed by @cursor/sdk local agents","directories":{},"_nodeVersion":"26.8.1","allowScripts":{"node-pty@1.1.0":true},"dependencies":{"@cursor/sdk":"1.0.30","@hono/node-server":"2.0.12","@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.6","typebox":"1.3.7","node-pty":"^1.1.0","playwright":"^1.60.0","typescript":"^6.0.3","@xterm/xterm":"^6.0.0","@earendil-works/pi-ai":"0.84.0","@earendil-works/pi-tui":"0.84.0","@earendil-works/pi-coding-agent":"0.84.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"bundleDependencies":["@hono/node-server","@modelcontextprotocol/sdk"],"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-tui":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pi-cursor-sdk_0.4.1_1788776159743_0.10906898080463923","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@emmaneugene/pi-cursor-sdk","version":"0.4.2","keywords":["pi-package","pi","pi-extension","cursor","cursor-sdk","ai","extension"],"author":{"url":"https://github.com/emmaneugene","name":"Emmanuel Oh","email":"emmaneugene@outlook.com"},"license":"MIT","_id":"@emmaneugene/pi-cursor-sdk@0.4.2","maintainers":[{"name":"emmaneugene","email":"emmaneugene@outlook.com"}],"contributors":[{"url":"https://github.com/fitchmultz","name":"Mitch Fultz"}],"homepage":"https://github.com/emmaneugene/pi-cursor-sdk#readme","bugs":{"url":"https://github.com/emmaneugene/pi-cursor-sdk/issues"},"pi":{"extensions":["./dist/index.js"]},"dist":{"shasum":"0274b0e3fe84bf52094da195d4bbba1c0e12ac1a","tarball":"https://registry.npmjs.org/@emmaneugene/pi-cursor-sdk/-/pi-cursor-sdk-0.4.2.tgz","fileCount":3680,"integrity":"sha512-4j9x3sLn3I5ZYqDujgGzj/HokLadcMDT+hK0D0rkx5S8It8WMSa1vwtNx2fCuA2r6ROR3xAp6Eg31Oqcqbo77g==","signatures":[{"sig":"MEUCICLce8p450KnDOSSRkbdMZZ6f0lgeNWzeL5tp3N/82wsAiEAnQfYaY/q6ZMArW2Y6aDtgZ0m+10EauRo9pJI1H1zNL8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD2KRyb5vvJoBLUTEEJGwEMQzgnQsWDTFHjDHn3loF63gIhAJtuF+AW8Y2ukoaPVqWdj9iATueG8ceA6Ti3pyJf7At6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":16779202},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"96b308b5636b020d0c6acad7785a43832aa5706f","scripts":{"test":"vitest run","build":"node ./scripts/build.mjs","verify":"npm run check:platform-smoke && npm run typecheck && npm test","prepare":"node ./scripts/prepare.mjs","typecheck":"npm run typecheck:src && npm run typecheck:tests && npm run typecheck:replay-compile","smoke:live":"npm run build && scripts/tmux-live-smoke.sh","test:watch":"vitest","smoke:jsonl":"node scripts/validate-smoke-jsonl.mjs","smoke:visual":"npm run build && node scripts/visual-tui-smoke.mjs","typecheck:src":"tsc --noEmit","smoke:isolated":"npm run build && scripts/isolated-cursor-smoke.sh","smoke:platform":"node scripts/platform-smoke.mjs","smoke:steering":"node scripts/steering-rpc-smoke.mjs","typecheck:tests":"tsc -p tsconfig.test.json --noEmit","debug:sdk-events":"node scripts/debug-sdk-events.mjs","smoke:local-resume":"node scripts/local-resume-smoke.mjs","smoke:platform:all":"npm run smoke:platform:doctor && node scripts/platform-smoke.mjs run --target macos,ubuntu,windows-native","debug:mcp-coldstart":"node scripts/probe-mcp-coldstart.mjs","check:platform-smoke":"node --check platform-smoke.config.mjs && node --check scripts/local-resume-cleanup-smoke.mjs && node --check scripts/local-resume-smoke.mjs && node --check scripts/lib/local-resume-smoke-harness.mjs && node --check scripts/platform-smoke.mjs && node --check scripts/platform-smoke/artifact-bundle-chunk.mjs && node --check scripts/platform-smoke/artifact-bundle-contract.mjs && node --check scripts/platform-smoke/artifact-fs-safety.mjs && node --check scripts/platform-smoke/artifact-anchored-extract.mjs && node --check scripts/platform-smoke/artifact-secrets.mjs && node --check scripts/platform-smoke/assertions.mjs && node --check scripts/platform-smoke/artifacts.mjs && node --check scripts/platform-smoke/card-detect.mjs && node --check scripts/platform-smoke/crabbox-runner.mjs && node --check scripts/platform-smoke/doctor.mjs && node --check scripts/platform-smoke/jsonl-text.mjs && node --check scripts/platform-smoke/live-suite-runner.mjs && node --check scripts/platform-smoke/local-resume-runner.mjs && node --check scripts/platform-smoke/pty-capture.mjs && node --check scripts/platform-smoke/render-ansi.mjs && node --check scripts/platform-smoke/scenarios.mjs && node --check scripts/platform-smoke/target-runtime.mjs && node --check scripts/platform-smoke/targets.mjs && node --check scripts/platform-smoke/visual-evidence.mjs && node --check scripts/platform-smoke/wrapped-line-match.mjs && vitest run test/platform-artifact-boundaries.test.ts test/platform-smoke-artifact-transport.test.ts test/smoke-cli-package-contracts.test.ts test/smoke-tooling.test.ts","smoke:platform:macos":"node scripts/platform-smoke.mjs run --target macos","debug:provider-events":"node scripts/debug-provider-events.mjs","smoke:platform:doctor":"node scripts/platform-smoke.mjs doctor","smoke:platform:ubuntu":"node scripts/platform-smoke.mjs run --target ubuntu","check:cursor-snapshots":"node scripts/refresh-cursor-model-snapshots.mjs --check","smoke:local-resume:tree":"node scripts/local-resume-smoke.mjs --tree","refresh:cursor-snapshots":"node scripts/refresh-cursor-model-snapshots.mjs","smoke:local-resume:abort":"node scripts/local-resume-smoke.mjs --abort","typecheck:replay-compile":"tsc --noEmit -p test/tsconfig.json","smoke:local-resume:safety":"node scripts/local-resume-smoke.mjs --safety","smoke:local-resume:cleanup":"node scripts/local-resume-smoke.mjs --cleanup","smoke:local-resume:fallback":"node scripts/local-resume-smoke.mjs --fallback","smoke:local-resume:compaction":"node scripts/local-resume-smoke.mjs --compaction","smoke:platform:windows-native":"node scripts/platform-smoke.mjs run --target windows-native","smoke:local-resume:copy-switch":"node scripts/local-resume-smoke.mjs --copy-switch","smoke:local-resume:tool-surface":"node scripts/local-resume-smoke.mjs --tool-surface","smoke:local-resume:default-dry-run":"node scripts/local-resume-smoke.mjs --default-dry-run"},"_npmUser":{"name":"emmaneugene","email":"emmaneugene@outlook.com"},"repository":{"url":"git+https://github.com/emmaneugene/pi-cursor-sdk.git","type":"git"},"_npmVersion":"11.19.0","description":"pi provider extension backed by @cursor/sdk local agents","directories":{},"_nodeVersion":"26.8.1","allowScripts":{"node-pty@1.1.0":true},"dependencies":{"@cursor/sdk":"1.0.30","@hono/node-server":"2.0.12","@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.6","typebox":"1.3.7","node-pty":"^1.1.0","playwright":"^1.60.0","typescript":"^6.0.3","@xterm/xterm":"^6.0.0","@earendil-works/pi-ai":"0.84.0","@earendil-works/pi-tui":"0.84.0","@earendil-works/pi-coding-agent":"0.84.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"bundleDependencies":["@hono/node-server","@modelcontextprotocol/sdk"],"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-tui":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pi-cursor-sdk_0.4.2_1788784778827_0.704725110028414","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@emmaneugene/pi-cursor-sdk","version":"0.4.3","keywords":["pi-package","pi","pi-extension","cursor","cursor-sdk","ai","extension"],"author":{"url":"https://github.com/emmaneugene","name":"Emmanuel Oh","email":"emmaneugene@outlook.com"},"license":"MIT","_id":"@emmaneugene/pi-cursor-sdk@0.4.3","maintainers":[{"name":"emmaneugene","email":"emmaneugene@outlook.com"}],"contributors":[{"url":"https://github.com/fitchmultz","name":"Mitch Fultz"}],"homepage":"https://github.com/emmaneugene/pi-cursor-sdk#readme","bugs":{"url":"https://github.com/emmaneugene/pi-cursor-sdk/issues"},"pi":{"extensions":["./dist/index.js"]},"dist":{"shasum":"36ae155e17d86e012b6be5f0a9e71c5130dbd678","tarball":"https://registry.npmjs.org/@emmaneugene/pi-cursor-sdk/-/pi-cursor-sdk-0.4.3.tgz","fileCount":3680,"integrity":"sha512-CViXm3Eup4CGAzzW8/QvyXs9VIqq0eS6+Ffy7MUypXpVfuJSKnrroHpnkjQtvDrilt4fsbbZIUgYJ8BNc2F44w==","signatures":[{"sig":"MEUCIH7WkuVa26jLzoIqP29hxHUP8qALUawn3b8JGc8B6KbDAiEAzfB9fkqpFbCWBsjI1FUs0zYPXAWKUWcYydLWKDn+EY4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCB7WOnnu+OZTv/8kLgmMM9XzbqKq0b7tQO6wW40gM8vgIhAN8XKv0aT8DxfTBxgrxdIa5Cxg2Fd0huJwptsUi9jyCM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":16780675},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"a25498fd58b42fba2a9f4f537bb38b17e7b51d0f","scripts":{"test":"vitest run","build":"node ./scripts/build.mjs","verify":"npm run check:platform-smoke && npm run typecheck && npm test","prepare":"node ./scripts/prepare.mjs","typecheck":"npm run typecheck:src && npm run typecheck:tests && npm run typecheck:replay-compile","smoke:live":"npm run build && scripts/tmux-live-smoke.sh","test:watch":"vitest","smoke:jsonl":"node scripts/validate-smoke-jsonl.mjs","smoke:visual":"npm run build && node scripts/visual-tui-smoke.mjs","typecheck:src":"tsc --noEmit","smoke:isolated":"npm run build && scripts/isolated-cursor-smoke.sh","smoke:platform":"node scripts/platform-smoke.mjs","smoke:steering":"node scripts/steering-rpc-smoke.mjs","typecheck:tests":"tsc -p tsconfig.test.json --noEmit","debug:sdk-events":"node scripts/debug-sdk-events.mjs","smoke:local-resume":"node scripts/local-resume-smoke.mjs","smoke:platform:all":"npm run smoke:platform:doctor && node scripts/platform-smoke.mjs run --target macos,ubuntu,windows-native","debug:mcp-coldstart":"node scripts/probe-mcp-coldstart.mjs","check:platform-smoke":"node --check platform-smoke.config.mjs && node --check scripts/local-resume-cleanup-smoke.mjs && node --check scripts/local-resume-smoke.mjs && node --check scripts/lib/local-resume-smoke-harness.mjs && node --check scripts/platform-smoke.mjs && node --check scripts/platform-smoke/artifact-bundle-chunk.mjs && node --check scripts/platform-smoke/artifact-bundle-contract.mjs && node --check scripts/platform-smoke/artifact-fs-safety.mjs && node --check scripts/platform-smoke/artifact-anchored-extract.mjs && node --check scripts/platform-smoke/artifact-secrets.mjs && node --check scripts/platform-smoke/assertions.mjs && node --check scripts/platform-smoke/artifacts.mjs && node --check scripts/platform-smoke/card-detect.mjs && node --check scripts/platform-smoke/crabbox-runner.mjs && node --check scripts/platform-smoke/doctor.mjs && node --check scripts/platform-smoke/jsonl-text.mjs && node --check scripts/platform-smoke/live-suite-runner.mjs && node --check scripts/platform-smoke/local-resume-runner.mjs && node --check scripts/platform-smoke/pty-capture.mjs && node --check scripts/platform-smoke/render-ansi.mjs && node --check scripts/platform-smoke/scenarios.mjs && node --check scripts/platform-smoke/target-runtime.mjs && node --check scripts/platform-smoke/targets.mjs && node --check scripts/platform-smoke/visual-evidence.mjs && node --check scripts/platform-smoke/wrapped-line-match.mjs && vitest run test/platform-artifact-boundaries.test.ts test/platform-smoke-artifact-transport.test.ts test/smoke-cli-package-contracts.test.ts test/smoke-tooling.test.ts","smoke:platform:macos":"node scripts/platform-smoke.mjs run --target macos","debug:provider-events":"node scripts/debug-provider-events.mjs","smoke:platform:doctor":"node scripts/platform-smoke.mjs doctor","smoke:platform:ubuntu":"node scripts/platform-smoke.mjs run --target ubuntu","check:cursor-snapshots":"node scripts/refresh-cursor-model-snapshots.mjs --check","smoke:local-resume:tree":"node scripts/local-resume-smoke.mjs --tree","refresh:cursor-snapshots":"node scripts/refresh-cursor-model-snapshots.mjs","smoke:local-resume:abort":"node scripts/local-resume-smoke.mjs --abort","typecheck:replay-compile":"tsc --noEmit -p test/tsconfig.json","smoke:local-resume:safety":"node scripts/local-resume-smoke.mjs --safety","smoke:local-resume:cleanup":"node scripts/local-resume-smoke.mjs --cleanup","smoke:local-resume:fallback":"node scripts/local-resume-smoke.mjs --fallback","smoke:local-resume:compaction":"node scripts/local-resume-smoke.mjs --compaction","smoke:platform:windows-native":"node scripts/platform-smoke.mjs run --target windows-native","smoke:local-resume:copy-switch":"node scripts/local-resume-smoke.mjs --copy-switch","smoke:local-resume:tool-surface":"node scripts/local-resume-smoke.mjs --tool-surface","smoke:local-resume:default-dry-run":"node scripts/local-resume-smoke.mjs --default-dry-run"},"_npmUser":{"name":"emmaneugene","email":"emmaneugene@outlook.com"},"repository":{"url":"git+https://github.com/emmaneugene/pi-cursor-sdk.git","type":"git"},"_npmVersion":"11.19.1","description":"pi provider extension backed by @cursor/sdk local agents","directories":{},"_nodeVersion":"26.8.2","allowScripts":{"node-pty@1.1.0":true},"dependencies":{"@cursor/sdk":"1.0.30","@hono/node-server":"2.0.12","@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.6","typebox":"1.3.7","node-pty":"^1.1.0","playwright":"^1.60.0","typescript":"^6.0.3","@xterm/xterm":"^6.0.0","@earendil-works/pi-ai":"0.84.0","@earendil-works/pi-tui":"0.84.0","@earendil-works/pi-coding-agent":"0.84.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"bundleDependencies":["@hono/node-server","@modelcontextprotocol/sdk"],"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-tui":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pi-cursor-sdk_0.4.3_1789110793197_0.8011878586142622","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@emmaneugene/pi-cursor-sdk","version":"0.5.0","keywords":["pi-package","pi","pi-extension","cursor","cursor-sdk","ai","extension"],"author":{"url":"https://github.com/emmaneugene","name":"Emmanuel Oh","email":"emmaneugene@outlook.com"},"license":"MIT","_id":"@emmaneugene/pi-cursor-sdk@0.5.0","maintainers":[{"name":"emmaneugene","email":"emmaneugene@outlook.com"}],"contributors":[{"url":"https://github.com/fitchmultz","name":"Mitch Fultz"}],"homepage":"https://github.com/emmaneugene/pi-cursor-sdk#readme","bugs":{"url":"https://github.com/emmaneugene/pi-cursor-sdk/issues"},"pi":{"extensions":["./dist/index.js"]},"dist":{"shasum":"968e43c4ed2e6d28eb4114012cdd27abceb0efad","tarball":"https://registry.npmjs.org/@emmaneugene/pi-cursor-sdk/-/pi-cursor-sdk-0.5.0.tgz","fileCount":3677,"integrity":"sha512-erE8CRJ+ZqXwShP9VTMxSA3Wa74VGiSs5DKrlfS56Ky3I/1FnVsFxkD+ONhnejcDFT8ihbzT/WN2eI61Wumdag==","signatures":[{"sig":"MEYCIQClm/rIyuxoIZFhWs/h2pVw4vtqf7WhCxOLriDabkck1wIhAJMWqaC/Cq1V/tbv5SV8sj6CUyhDqE4vle2DQrXWcUx+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDJ/0jr+D245Xyykb9eLNaSDFDOdIOP2ObgBKfE3bm8FQIhALQ40anAo24gfJQZZcOBA0/Cc8LcmqBG3x3D07g5qYkJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":16740662},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"a25498fd58b42fba2a9f4f537bb38b17e7b51d0f","scripts":{"test":"vitest run","build":"node ./scripts/build.mjs","verify":"npm run check:platform-smoke && npm run typecheck && npm test","prepare":"node ./scripts/prepare.mjs","typecheck":"npm run typecheck:src && npm run typecheck:tests && npm run typecheck:replay-compile","smoke:live":"npm run build && scripts/tmux-live-smoke.sh","test:watch":"vitest","smoke:jsonl":"node scripts/validate-smoke-jsonl.mjs","smoke:visual":"npm run build && node scripts/visual-tui-smoke.mjs","typecheck:src":"tsc --noEmit","smoke:isolated":"npm run build && scripts/isolated-cursor-smoke.sh","smoke:platform":"node scripts/platform-smoke.mjs","smoke:steering":"node scripts/steering-rpc-smoke.mjs","typecheck:tests":"tsc -p tsconfig.test.json --noEmit","debug:sdk-events":"node scripts/debug-sdk-events.mjs","smoke:local-resume":"node scripts/local-resume-smoke.mjs","smoke:platform:all":"npm run smoke:platform:doctor && node scripts/platform-smoke.mjs run --target macos,ubuntu,windows-native","debug:mcp-coldstart":"node scripts/probe-mcp-coldstart.mjs","check:platform-smoke":"node --check platform-smoke.config.mjs && node --check scripts/local-resume-cleanup-smoke.mjs && node --check scripts/local-resume-smoke.mjs && node --check scripts/lib/local-resume-smoke-harness.mjs && node --check scripts/platform-smoke.mjs && node --check scripts/platform-smoke/artifact-bundle-chunk.mjs && node --check scripts/platform-smoke/artifact-bundle-contract.mjs && node --check scripts/platform-smoke/artifact-fs-safety.mjs && node --check scripts/platform-smoke/artifact-anchored-extract.mjs && node --check scripts/platform-smoke/artifact-secrets.mjs && node --check scripts/platform-smoke/assertions.mjs && node --check scripts/platform-smoke/artifacts.mjs && node --check scripts/platform-smoke/card-detect.mjs && node --check scripts/platform-smoke/crabbox-runner.mjs && node --check scripts/platform-smoke/doctor.mjs && node --check scripts/platform-smoke/jsonl-text.mjs && node --check scripts/platform-smoke/live-suite-runner.mjs && node --check scripts/platform-smoke/local-resume-runner.mjs && node --check scripts/platform-smoke/pty-capture.mjs && node --check scripts/platform-smoke/render-ansi.mjs && node --check scripts/platform-smoke/scenarios.mjs && node --check scripts/platform-smoke/target-runtime.mjs && node --check scripts/platform-smoke/targets.mjs && node --check scripts/platform-smoke/visual-evidence.mjs && node --check scripts/platform-smoke/wrapped-line-match.mjs && vitest run test/platform-artifact-boundaries.test.ts test/platform-smoke-artifact-transport.test.ts test/smoke-cli-package-contracts.test.ts test/smoke-tooling.test.ts","smoke:platform:macos":"node scripts/platform-smoke.mjs run --target macos","debug:provider-events":"node scripts/debug-provider-events.mjs","smoke:platform:doctor":"node scripts/platform-smoke.mjs doctor","smoke:platform:ubuntu":"node scripts/platform-smoke.mjs run --target ubuntu","check:cursor-snapshots":"node scripts/refresh-cursor-model-snapshots.mjs --check","smoke:local-resume:tree":"node scripts/local-resume-smoke.mjs --tree","refresh:cursor-snapshots":"node scripts/refresh-cursor-model-snapshots.mjs","smoke:local-resume:abort":"node scripts/local-resume-smoke.mjs --abort","typecheck:replay-compile":"tsc --noEmit -p test/tsconfig.json","smoke:local-resume:safety":"node scripts/local-resume-smoke.mjs --safety","smoke:local-resume:cleanup":"node scripts/local-resume-smoke.mjs --cleanup","smoke:local-resume:fallback":"node scripts/local-resume-smoke.mjs --fallback","smoke:local-resume:compaction":"node scripts/local-resume-smoke.mjs --compaction","smoke:platform:windows-native":"node scripts/platform-smoke.mjs run --target windows-native","smoke:local-resume:copy-switch":"node scripts/local-resume-smoke.mjs --copy-switch","smoke:local-resume:tool-surface":"node scripts/local-resume-smoke.mjs --tool-surface","smoke:local-resume:default-dry-run":"node scripts/local-resume-smoke.mjs --default-dry-run"},"_npmUser":{"name":"emmaneugene","email":"emmaneugene@outlook.com"},"repository":{"url":"git+https://github.com/emmaneugene/pi-cursor-sdk.git","type":"git"},"_npmVersion":"11.19.1","description":"pi provider extension backed by @cursor/sdk local agents","directories":{},"_nodeVersion":"26.8.2","allowScripts":{"node-pty@1.1.0":true},"dependencies":{"@cursor/sdk":"1.0.30","@hono/node-server":"2.0.12","@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.6","typebox":"1.3.7","node-pty":"^1.1.0","playwright":"^1.60.0","typescript":"^6.0.3","@xterm/xterm":"^6.0.0","@earendil-works/pi-ai":"0.84.0","@earendil-works/pi-tui":"0.84.0","@earendil-works/pi-coding-agent":"0.84.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"bundleDependencies":["@hono/node-server","@modelcontextprotocol/sdk"],"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-tui":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pi-cursor-sdk_0.5.0_1789286578574_0.2584205679629912","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@emmaneugene/pi-cursor-sdk","version":"0.5.1","keywords":["pi-package","pi","pi-extension","cursor","cursor-sdk","ai","extension"],"author":{"url":"https://github.com/emmaneugene","name":"Emmanuel Oh","email":"emmaneugene@outlook.com"},"license":"MIT","_id":"@emmaneugene/pi-cursor-sdk@0.5.1","maintainers":[{"name":"emmaneugene","email":"emmaneugene@outlook.com"}],"contributors":[{"url":"https://github.com/fitchmultz","name":"Mitch Fultz"}],"homepage":"https://github.com/emmaneugene/pi-cursor-sdk#readme","bugs":{"url":"https://github.com/emmaneugene/pi-cursor-sdk/issues"},"pi":{"extensions":["./dist/index.js"]},"dist":{"shasum":"19bd6ddabe8f0d85a30be893d9a6dc31a11006d0","tarball":"https://registry.npmjs.org/@emmaneugene/pi-cursor-sdk/-/pi-cursor-sdk-0.5.1.tgz","fileCount":3677,"integrity":"sha512-ozDJO3x8hW90THY87SPJy5MXJrYpVVIu4A9SGPWw/2RJEDXcyqcVwKa+swUUgv1sSKCqedzCfIjsKGxDcH96Qg==","signatures":[{"sig":"MEUCIC5nbIMGBM+IKi9/ySWyWJMoSnrrRw8zMMxe19sqge9KAiEAzRLJoxCe2Mlaq0q61Bm1MkRsbBeNaeWxEBxdrp//Wx8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBf2FdnnmtrcVyoarFjb3RmlbCfDBYfeTiXQGgNyGZYeAiEA15Dmi27v0I26S68V+wp6a12a2tqVBbTyEGH4DPvU46Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@emmaneugene%2fpi-cursor-sdk@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":16736895},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"60157819249b7a1dc09935cad6b1e0962e61b5e8","scripts":{"test":"vitest run","build":"node ./scripts/build.mjs","verify":"npm run check:platform-smoke && npm run typecheck && npm test","prepare":"node ./scripts/prepare.mjs","typecheck":"npm run typecheck:src && npm run typecheck:tests && npm run typecheck:replay-compile","smoke:live":"npm run build && scripts/tmux-live-smoke.sh","test:watch":"vitest","smoke:jsonl":"node scripts/validate-smoke-jsonl.mjs","smoke:visual":"npm run build && node scripts/visual-tui-smoke.mjs","typecheck:src":"tsc --noEmit","smoke:isolated":"npm run build && scripts/isolated-cursor-smoke.sh","smoke:platform":"node scripts/platform-smoke.mjs","smoke:steering":"node scripts/steering-rpc-smoke.mjs","typecheck:tests":"tsc -p tsconfig.test.json --noEmit","debug:sdk-events":"node scripts/debug-sdk-events.mjs","smoke:local-resume":"node scripts/local-resume-smoke.mjs","smoke:platform:all":"npm run smoke:platform:doctor && node scripts/platform-smoke.mjs run --target macos,ubuntu,windows-native","debug:mcp-coldstart":"node scripts/probe-mcp-coldstart.mjs","check:platform-smoke":"node --check platform-smoke.config.mjs && node --check scripts/local-resume-cleanup-smoke.mjs && node --check scripts/local-resume-smoke.mjs && node --check scripts/lib/local-resume-smoke-harness.mjs && node --check scripts/platform-smoke.mjs && node --check scripts/platform-smoke/artifact-bundle-chunk.mjs && node --check scripts/platform-smoke/artifact-bundle-contract.mjs && node --check scripts/platform-smoke/artifact-fs-safety.mjs && node --check scripts/platform-smoke/artifact-anchored-extract.mjs && node --check scripts/platform-smoke/artifact-secrets.mjs && node --check scripts/platform-smoke/assertions.mjs && node --check scripts/platform-smoke/artifacts.mjs && node --check scripts/platform-smoke/card-detect.mjs && node --check scripts/platform-smoke/crabbox-runner.mjs && node --check scripts/platform-smoke/doctor.mjs && node --check scripts/platform-smoke/jsonl-text.mjs && node --check scripts/platform-smoke/live-suite-runner.mjs && node --check scripts/platform-smoke/local-resume-runner.mjs && node --check scripts/platform-smoke/pty-capture.mjs && node --check scripts/platform-smoke/render-ansi.mjs && node --check scripts/platform-smoke/scenarios.mjs && node --check scripts/platform-smoke/target-runtime.mjs && node --check scripts/platform-smoke/targets.mjs && node --check scripts/platform-smoke/visual-evidence.mjs && node --check scripts/platform-smoke/wrapped-line-match.mjs && vitest run test/platform-artifact-boundaries.test.ts test/platform-smoke-artifact-transport.test.ts test/smoke-cli-package-contracts.test.ts test/smoke-tooling.test.ts","smoke:platform:macos":"node scripts/platform-smoke.mjs run --target macos","debug:provider-events":"node scripts/debug-provider-events.mjs","smoke:platform:doctor":"node scripts/platform-smoke.mjs doctor","smoke:platform:ubuntu":"node scripts/platform-smoke.mjs run --target ubuntu","check:cursor-snapshots":"node scripts/refresh-cursor-model-snapshots.mjs --check","smoke:local-resume:tree":"node scripts/local-resume-smoke.mjs --tree","refresh:cursor-snapshots":"node scripts/refresh-cursor-model-snapshots.mjs","smoke:local-resume:abort":"node scripts/local-resume-smoke.mjs --abort","typecheck:replay-compile":"tsc --noEmit -p test/tsconfig.json","smoke:local-resume:safety":"node scripts/local-resume-smoke.mjs --safety","smoke:local-resume:cleanup":"node scripts/local-resume-smoke.mjs --cleanup","smoke:local-resume:fallback":"node scripts/local-resume-smoke.mjs --fallback","smoke:local-resume:compaction":"node scripts/local-resume-smoke.mjs --compaction","smoke:platform:windows-native":"node scripts/platform-smoke.mjs run --target windows-native","smoke:local-resume:copy-switch":"node scripts/local-resume-smoke.mjs --copy-switch","smoke:local-resume:tool-surface":"node scripts/local-resume-smoke.mjs --tool-surface","smoke:local-resume:default-dry-run":"node scripts/local-resume-smoke.mjs --default-dry-run"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4eeedfb9-58c5-4721-9833-b49acb837449"}},"repository":{"url":"git+https://github.com/emmaneugene/pi-cursor-sdk.git","type":"git"},"_npmVersion":"11.19.1","description":"pi provider extension backed by @cursor/sdk local agents","directories":{},"_nodeVersion":"24.20.0","allowScripts":{"node-pty@1.1.0":true},"dependencies":{"@cursor/sdk":"1.0.30","@hono/node-server":"2.0.12","@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.6","typebox":"1.3.7","node-pty":"^1.1.0","playwright":"^1.60.0","typescript":"^6.0.3","@xterm/xterm":"^6.0.0","@earendil-works/pi-ai":"0.84.0","@earendil-works/pi-tui":"0.84.0","@earendil-works/pi-coding-agent":"0.84.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"bundleDependencies":["@hono/node-server","@modelcontextprotocol/sdk"],"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-tui":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pi-cursor-sdk_0.5.1_1789309510848_0.23061594556228804","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@emmaneugene/pi-cursor-sdk","version":"0.5.2","keywords":["pi-package","pi","pi-extension","cursor","cursor-sdk","ai","extension"],"author":{"url":"https://github.com/emmaneugene","name":"Emmanuel Oh","email":"emmaneugene@outlook.com"},"license":"MIT","_id":"@emmaneugene/pi-cursor-sdk@0.5.2","maintainers":[{"name":"emmaneugene","email":"emmaneugene@outlook.com"}],"contributors":[{"url":"https://github.com/fitchmultz","name":"Mitch Fultz"}],"homepage":"https://github.com/emmaneugene/pi-cursor-sdk#readme","bugs":{"url":"https://github.com/emmaneugene/pi-cursor-sdk/issues"},"pi":{"extensions":["./dist/index.js"]},"dist":{"shasum":"9ba13f345210c130d5ff7c79a05b5f8723a055a2","tarball":"https://registry.npmjs.org/@emmaneugene/pi-cursor-sdk/-/pi-cursor-sdk-0.5.2.tgz","fileCount":3647,"integrity":"sha512-CYkv/LlA1b6DRXr/4cBZNEcwzVLAYu4jIR1hv4Fg/9e7GZCMNxxJsI7KnUv1qS+sPFt7Uk0oGYC740EYXJMKtA==","signatures":[{"sig":"MEUCIDyRXqWDp2KLF2Q8uv76YCjDPMjVs4LuYBMtVUaF5AR3AiEAlDOSa706xPzZsa9+K6vRow2PK5RfjyM/EU8CgEYPbE4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHW/FOMGwLE84zMuP95C1mqJ6zjX11vBWL2vjtYNWosnAiAfo9jiWqj7dJsS31GKOtB+etwfTxt6I9BNfr7jgDlo+A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@emmaneugene%2fpi-cursor-sdk@0.5.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":16412673},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"e3b688e41abadbacdcde7c1702e070c9fc9b7ef9","scripts":{"test":"vitest run","build":"node ./scripts/build.mjs","verify":"npm run typecheck && npm test","prepare":"node ./scripts/prepare.mjs","typecheck":"npm run typecheck:src && npm run typecheck:tests && npm run typecheck:replay-compile","smoke:live":"npm run build && scripts/tmux-live-smoke.sh","test:watch":"vitest","smoke:jsonl":"node scripts/validate-smoke-jsonl.mjs","smoke:visual":"npm run build && node scripts/visual-tui-smoke.mjs","typecheck:src":"tsc --noEmit","smoke:isolated":"npm run build && scripts/isolated-cursor-smoke.sh","smoke:steering":"node scripts/steering-rpc-smoke.mjs","typecheck:tests":"tsc -p tsconfig.test.json --noEmit","debug:sdk-events":"node scripts/debug-sdk-events.mjs","smoke:local-resume":"node scripts/local-resume-smoke.mjs","debug:mcp-coldstart":"node scripts/probe-mcp-coldstart.mjs","debug:provider-events":"node scripts/debug-provider-events.mjs","check:cursor-snapshots":"node scripts/refresh-cursor-model-snapshots.mjs --check","smoke:local-resume:tree":"node scripts/local-resume-smoke.mjs --tree","refresh:cursor-snapshots":"node scripts/refresh-cursor-model-snapshots.mjs","smoke:local-resume:abort":"node scripts/local-resume-smoke.mjs --abort","typecheck:replay-compile":"tsc --noEmit -p test/tsconfig.json","smoke:local-resume:safety":"node scripts/local-resume-smoke.mjs --safety","smoke:local-resume:cleanup":"node scripts/local-resume-smoke.mjs --cleanup","smoke:local-resume:fallback":"node scripts/local-resume-smoke.mjs --fallback","smoke:local-resume:compaction":"node scripts/local-resume-smoke.mjs --compaction","smoke:local-resume:copy-switch":"node scripts/local-resume-smoke.mjs --copy-switch","smoke:local-resume:tool-surface":"node scripts/local-resume-smoke.mjs --tool-surface","smoke:local-resume:default-dry-run":"node scripts/local-resume-smoke.mjs --default-dry-run"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4eeedfb9-58c5-4721-9833-b49acb837449"}},"repository":{"url":"git+https://github.com/emmaneugene/pi-cursor-sdk.git","type":"git"},"_npmVersion":"11.19.1","description":"pi provider extension backed by @cursor/sdk local agents","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@cursor/sdk":"1.0.30","@hono/node-server":"2.0.12","@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.6","typebox":"1.3.7","playwright":"^1.60.0","typescript":"^6.0.3","@xterm/xterm":"^6.0.0","@earendil-works/pi-ai":"0.84.0","@earendil-works/pi-tui":"0.84.0","@earendil-works/pi-coding-agent":"0.84.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"bundleDependencies":["@hono/node-server","@modelcontextprotocol/sdk"],"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-tui":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pi-cursor-sdk_0.5.2_1789872274308_0.2841469271808479","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"pi":{"extensions":["./dist/index.js"]},"_id":"@emmaneugene/pi-cursor-sdk@0.6.0","bugs":{"url":"https://github.com/emmaneugene/pi-cursor-sdk/issues"},"dist":{"shasum":"61f537da8f532b49554b66efe59ccd4d7a198efe","tarball":"https://registry.npmjs.org/@emmaneugene/pi-cursor-sdk/-/pi-cursor-sdk-0.6.0.tgz","fileCount":3613,"integrity":"sha512-DYQ+yGoYmFBkUfxwJR7+77b5yQiE0jcMtMDGVL3w1hqIL8eRLqMkTxTmxfAhApWL0RnIoE6d1Fzrar+TuKgRnw==","signatures":[{"sig":"MEUCIHAGNpcr9N5xkPZgtOlOREIZhRhznOs8yLlDrlT76XSNAiEA/pmLlzp3HCrCluP+C+STXL5lFfXFyH7HjXxdz4JmAJs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHUUAtCvdPjlnlF/JBgxljZ9KOCvsFNdlBZbipGP4p/jAiEA5/iCjAhTjW3TmbDZI5fYuQHovgo6I1itMfn8bgjkoJU="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@emmaneugene%2fpi-cursor-sdk@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":16262687},"name":"@emmaneugene/pi-cursor-sdk","type":"module","author":{"url":"https://github.com/emmaneugene","name":"Emmanuel Oh","email":"emmaneugene@outlook.com"},"engines":{"node":">=22.19.0"},"gitHead":"2d2acf366b7bd172dfc7b20b2910bb3ab5f057d8","license":"MIT","scripts":{"test":"vitest run","build":"node ./scripts/build.mjs","verify":"npm run typecheck && npm test","prepare":"node ./scripts/prepare.mjs","typecheck":"npm run typecheck:src && npm run typecheck:tests && npm run typecheck:replay-compile","smoke:live":"npm run build && scripts/tmux-live-smoke.sh","test:watch":"vitest","smoke:jsonl":"node scripts/validate-smoke-jsonl.mjs","smoke:visual":"npm run build && node scripts/visual-tui-smoke.mjs","typecheck:src":"tsc --noEmit","smoke:isolated":"npm run build && scripts/isolated-smoke.sh","smoke:steering":"node scripts/steering-rpc-smoke.mjs","typecheck:tests":"tsc -p tsconfig.test.json --noEmit","debug:sdk-events":"node scripts/debug-sdk-events.mjs","debug:mcp-coldstart":"node scripts/probe-mcp-coldstart.mjs","debug:provider-events":"node scripts/debug-provider-events.mjs","check:cursor-snapshots":"node scripts/refresh-model-snapshots.mjs --check","refresh:cursor-snapshots":"node scripts/refresh-model-snapshots.mjs","typecheck:replay-compile":"tsc --noEmit -p test/tsconfig.json"},"version":"0.6.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4eeedfb9-58c5-4721-9833-b49acb837449"}},"homepage":"https://github.com/emmaneugene/pi-cursor-sdk#readme","keywords":["pi-package","pi","pi-extension","cursor","cursor-sdk","ai","extension"],"repository":{"url":"git+https://github.com/emmaneugene/pi-cursor-sdk.git","type":"git"},"_npmVersion":"11.19.1","description":"pi provider extension backed by @cursor/sdk local agents","directories":{},"maintainers":[{"name":"emmaneugene","email":"emmaneugene@outlook.com"}],"_nodeVersion":"24.20.0","contributors":[{"url":"https://github.com/fitchmultz","name":"Mitch Fultz"}],"dependencies":{"@cursor/sdk":"1.0.30","@hono/node-server":"2.0.12","@modelcontextprotocol/sdk":"1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.6","typebox":"1.3.27","playwright":"^1.60.0","typescript":"^6.0.3","@xterm/xterm":"^6.0.0","@earendil-works/pi-ai":"0.86.0","@earendil-works/pi-tui":"0.86.0","@earendil-works/pi-coding-agent":"0.86.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-ai":"*","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"bundleDependencies":["@hono/node-server","@modelcontextprotocol/sdk"],"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-ai":{"optional":true},"@earendil-works/pi-tui":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-cursor-sdk_0.6.0_1789913407431_0.652684235994131"}}},"time":{"created":"2026-09-05T17:45:59.246Z","modified":"2026-09-20T14:10:07.921Z","0.3.7":"2026-09-05T17:45:59.738Z","0.4.0":"2026-09-06T15:51:58.400Z","0.4.1":"2026-09-07T10:15:59.941Z","0.4.2":"2026-09-07T12:39:38.990Z","0.4.3":"2026-09-11T07:13:13.373Z","0.5.0":"2026-09-13T08:02:58.794Z","0.5.1":"2026-09-13T14:25:11.084Z","0.5.2":"2026-09-20T02:44:34.490Z","0.6.0":"2026-09-20T14:10:07.626Z"},"bugs":{"url":"https://github.com/emmaneugene/pi-cursor-sdk/issues"},"author":{"url":"https://github.com/emmaneugene","name":"Emmanuel Oh","email":"emmaneugene@outlook.com"},"license":"MIT","homepage":"https://github.com/emmaneugene/pi-cursor-sdk#readme","keywords":["pi-package","pi","pi-extension","cursor","cursor-sdk","ai","extension"],"repository":{"url":"git+https://github.com/emmaneugene/pi-cursor-sdk.git","type":"git"},"description":"pi provider extension backed by @cursor/sdk local agents","contributors":[{"url":"https://github.com/fitchmultz","name":"Mitch Fultz"}],"maintainers":[{"name":"emmaneugene","email":"emmaneugene@outlook.com"}],"readme":"# @emmaneugene/pi-cursor-sdk\n\nA pi provider extension that lets pi use Cursor models through the local `@cursor/sdk` agent runtime.\n\nThis is a maintained fork of [fitchmultz/pi-cursor-sdk](https://github.com/fitchmultz/pi-cursor-sdk)\n\nUse this extension if you primarily use Cursor models inside pi and want Cursor's SDK agent loop preserved while pi adds native model selection, auth, thinking/context controls, session behavior, replay UI, and optional pi tool bridging.\n\n## Why use this instead of an OpenAI-compatible Cursor endpoint?\n\nUse `pi-cursor-sdk` when you primarily want to use Cursor models **inside pi**.\n\nThis extension runs Cursor models through the local `@cursor/sdk` agent runtime and keeps Cursor's agent loop intact. pi integrates around that loop: model discovery, model selection, thinking controls where Cursor exposes them, fast mode, Cursor mode, session handling, native replay cards, and the optional pi tool bridge.\n\nOpenAI-compatible Cursor proxies are useful when you want a generic `/v1/chat/completions` or `/v1/responses` endpoint for many clients such as curl, the OpenAI SDK, OpenCode, or other tools. That compatibility comes from translating Cursor behavior into OpenAI-shaped requests, responses, and tool calls.\n\nFor pi users, that translation is usually the wrong abstraction. `pi-cursor-sdk` is pi-specific on purpose: it lets Cursor remain Cursor while making it feel native in pi.\n\n| If you want... | Prefer |\n| --- | --- |\n| First-class Cursor usage inside pi | `pi-cursor-sdk` |\n| Cursor's local SDK agent loop preserved, not replaced by an OpenAI-shaped adapter | `pi-cursor-sdk` |\n| pi model picker, `/login`, `/model`, sessions, context display, footer/status UX | `pi-cursor-sdk` |\n| Cursor SDK local-agent tools, settings, MCP, and native replay surfaced in pi | `pi-cursor-sdk` |\n| pi extension tools exposed to Cursor through a local MCP bridge | `pi-cursor-sdk` |\n| A generic OpenAI-compatible localhost `/v1` API for non-pi clients | An OpenAI-compatible Cursor proxy |\n| One Cursor-ish endpoint shared across several unrelated tools | An OpenAI-compatible Cursor proxy |\n\n## Quick start\n\n1. Install the package:\n\n```bash\npi install npm:@emmaneugene/pi-cursor-sdk\n```\n\nOr install from GitHub:\n\n```bash\npi install https://github.com/emmaneugene/pi-cursor-sdk\n```\n\n2. Start pi with a Cursor model:\n\n```bash\npi --model cursor/grok-4.6\n```\n\n3. In pi, run `/login`, choose `Use an API key`, choose `Cursor`, and paste your Cursor SDK API key.\n\nIf pi started without a key, run `/cursor-refresh-models` after `/login` to refresh the full live Cursor model catalog without restarting pi. Inside pi, use `/model` to choose another Cursor model.\n\n## Requirements\n\n- Node.js 22.19+\n- Pi 0.84.0 or later; pi core peer metadata remains optional and uses `\"*\"` ranges per Pi package guidance\n- a Cursor SDK API key saved through `/login`, available as `CURSOR_API_KEY`, or passed with pi's `--api-key`\n\nNo global `@cursor/sdk` install is required. This package depends on exact `@cursor/sdk@1.0.30`, so normal package installation brings in the SDK version this extension was built and tested against. Cursor SDK 1.0.30 declares its Node ConnectRPC transport dependency directly, so npm installs place `@connectrpc/connect-node` where the SDK can resolve it. The extension intentionally does not bundle `@cursor/sdk` or its platform packages, because packing from one maintainer OS can otherwise ship the wrong optional SDK binary for another OS. Cursor SDK 1.0.30 keeps the older `sqlite3 -> node-gyp@8` dependency chain out of the runtime tree, so deprecated install warnings for `inflight`, `rimraf`, `glob@7`, `npmlog`, `gauge`, `are-we-there-yet`, and `tar@6` from that chain are not expected. Older Pi and Cursor SDK compatibility paths are not maintained.\n\n## Install\n\n### Global install\n\n```bash\npi install npm:@emmaneugene/pi-cursor-sdk\n```\n\nAlternative GitHub install:\n\n```bash\npi install https://github.com/emmaneugene/pi-cursor-sdk\n```\n\n### Project-local install\n\nUse `-l` if you want the package recorded in the current project's `.pi/settings.json` instead of your global pi settings:\n\n```bash\npi install -l npm:@emmaneugene/pi-cursor-sdk\n```\n\nPi 0.84.0 loads project-local extensions only after project trust is resolved. Durable extension settings still live in `~/.pi/agent/cursor-sdk.json`. This package does not read project `.pi/cursor-sdk.json`.\n\n### Try from a local checkout\n\nFor development from this repository:\n\n```bash\nnpm install   # runs prepare, which compiles src/ into dist/ (the manifest entry pi loads)\npi -ne --approve -e . --model cursor/grok-4.6\n```\n\n`-ne` keeps a host `pi install` of this package from colliding with `-e .`. After editing `src/`, run `npm run build` before the next `pi -e .` run, or pi loads the previous build.\n\n## Configure your Cursor SDK API key\n\n`pi-cursor-sdk` passes an explicit API key to the Cursor SDK. It does **not** reuse Cursor Agent CLI login, Cursor Desktop login, or Cursor subscription/OAuth state shown by `agent status`.\n\nUse either a user API key from Cursor Dashboard → API Keys or a service account API key from Team settings. Team Admin API keys are not supported by the Cursor SDK. Then configure the key with one of the methods below.\n\nPreferred setup:\n\n```bash\npi --model cursor/grok-4.6\n```\n\nThen, inside pi:\n\n1. Run `/login`.\n2. Select `Use an API key`.\n3. Select `Cursor`.\n4. Paste your Cursor SDK API key.\n5. The key is saved in pi's native `~/.pi/agent/auth.json`.\n\nIf pi started without a key, fallback Cursor models still register so `/login` is reachable. After `/login`, fallback model runs can use the stored key, and `/cursor-refresh-models` refreshes the full live Cursor model catalog discovered from the Cursor SDK without restarting pi.\n\nNote: if `/login` shows `Cursor ✓ key in models.json` but you have not saved a Cursor key and `CURSOR_API_KEY` is unset, that status is a pi auth-status limitation. A real Cursor SDK API key is still required for Cursor runs.\n\nEnvironment setup:\n\n```bash\nexport CURSOR_API_KEY=\"your-key\"\npi --model cursor/grok-4.6\n```\n\nOne-shot setup:\n\n```bash\npi --api-key \"your-key\" --model cursor/grok-4.6 --cursor-no-fast -p \"Say ok only.\"\n```\n\nStartup discovery intentionally does not parse Pi CLI arguments. It uses the stored `cursor` key in `~/.pi/agent/auth.json`, then `CURSOR_API_KEY`; without either, the bundled fallback catalog registers. Provider turns still receive Pi's resolved `--api-key`. `/cursor-refresh-models` asks Pi's ModelRegistry for provider `cursor`, so command-time auth follows Pi's provider-scoped resolution and is normalized through `CURSOR_API_KEY` placeholders before reaching the Cursor SDK.\n\n### Model catalog cache\n\nTo avoid a live `Cursor.models.list` network round-trip on every pi startup, the discovered catalog is cached on disk at `~/.pi/agent/cursor-sdk-model-list.json` (written `0600`, keyed by an API-key fingerprint — the key itself is never stored). Warm startups within the cache TTL skip the network call and avoid loading `@cursor/sdk` until a Cursor turn needs it; `/cursor-refresh-models` always bypasses the cache and refreshes the live catalog. If a refresh fails, a previously cached catalog is preferred over the generic bundled fallback.\n\nTune the cache in `~/.pi/agent/cursor-sdk.json`:\n\n```json\n{\n  \"models\": {\n    \"cache\": {\n      \"enabled\": true,\n      \"ttlMs\": 3600000\n    }\n  }\n}\n```\n\nSet `models.cache.enabled` to `false` to skip cache reads and writes and discover live when possible. Omit `ttlMs` to keep the 24h default. `0` disables fresh-cache hits but still allows a stale-cache fallback after a discovery failure.\n\nDo not store the API key in `~/.pi/agent/cursor-sdk.json`. That file is only for non-secret extension state such as Cursor fast defaults. `PATH` is only for executable lookup and should not contain the API key.\n\n## Verify your setup\n\nList Cursor models:\n\n```bash\npi --list-models cursor\n```\n\nExpected behavior:\n\n- with a valid key, Cursor models appear under the `cursor` provider\n- if discovery cannot authenticate or reach Cursor, pi may still show fallback Cursor models; after adding auth with `/login`, fallback model runs can use the saved key, and `/cursor-refresh-models` refreshes the live catalog\n- capture both stdout and stderr before treating empty stdout as a discovery failure\n\nSmoke test:\n\n```bash\npi --model cursor/grok-4.6 --cursor-no-fast --no-session --mode json \\\n  -p \"Reply exactly PI_CURSOR_MODEL_OK and nothing else.\"\n```\n\nExpected: the final assistant text is `PI_CURSOR_MODEL_OK`. If auth is missing or invalid, pi should tell you to configure a Cursor SDK API key via `/login`, `CURSOR_API_KEY`, or `--api-key`.\n\n## Choosing a model\n\nChoose Cursor models interactively with `/model`, or pass a model on the command line:\n\n```bash\npi --model cursor/grok-4.6\npi --model cursor/gpt-5.5\npi --model cursor/claude-opus-4-8\n```\n\nEach item returned by `Cursor.models.list()` becomes one pi model with the canonical Cursor ID. Cursor aliases, alternative context values, and fast/slow states do not create additional model rows. The selected catalog item's default variant supplies its context and fast parameters.\n\nPi applies supported thinking levels at send time without creating more model rows:\n\n```bash\npi --model cursor/gpt-5.5:medium\npi --model cursor/claude-opus-4-7:max\npi --model cursor/gpt-5.5 --thinking medium\n```\n\nThe model's static pi `contextWindow` follows cached checkpoint evidence for its canonical ID or default context, then falls back to the default context reported by Cursor. Cursor SDK conversation mode and fast mode remain extension state, not model identity.\n\n## Thinking support\n\nAll Cursor SDK models should be treated as thinking-capable Cursor models. The `thinking` column in `pi --list-models` is narrower: it only means pi can control a Cursor SDK thinking parameter for that model.\n\nFor models where Cursor exposes `reasoning`, `effort`, or boolean `thinking` parameters, pi's native thinking controls map to Cursor SDK params:\n\n- `reasoning=none|low|medium|high|extra-high`\n- `effort=low|medium|high|xhigh|max`\n- `thinking=false|true` for boolean thinking models\n\nPi `xhigh` maps to Cursor `xhigh` or `extra-high`; Pi `max` maps only to a distinct Cursor `max` value.\n\nFor Claude models with both `thinking` and `effort`, pi thinking `off` sends `thinking=false` and omits `effort`.\n\n### Why some Cursor models show `thinking=no`\n\nIn `pi --list-models`, `thinking=no` means pi cannot control the model's thinking level with `--thinking`, a final `:medium` model suffix, or shift+tab. It does not mean the Cursor model cannot think.\n\nSome Cursor SDK models do not expose a `reasoning`, `effort`, or `thinking` parameter for the extension to set. Cursor thinking is still enabled/supported by the model, and Cursor may still emit thinking deltas. The extension surfaces those deltas through pi's native thinking rendering when the SDK emits them.\n\n## Fast mode\n\nUse `/cursor-fast` to persistently toggle fast mode for the selected Cursor model when the model supports Cursor's `fast` parameter.\n\nFast preferences are remembered per canonical Cursor model ID and stored:\n\n- in the current session with `pi.appendEntry()`\n- globally in `~/.pi/agent/cursor-sdk.json`\n\nFor one run, force fast on or off without changing saved defaults:\n\n```bash\npi --model cursor/gpt-5.5 --cursor-fast -p \"Say ok only\"\npi --model cursor/grok-4.6 --cursor-no-fast -p \"Say ok only\"\n```\n\nComposer 2 and Composer 2.5 can default to fast. Use `--cursor-no-fast` for a one-shot no-fast Composer run. In print mode (`-p`), `--cursor-no-fast` is silent and does not write `~/.pi/agent/cursor-sdk.json`.\n\nIn interactive mode, the footer shows Cursor status only while a Cursor model is active. Fast-capable models show fast state explicitly, and fast and plan mode share one Cursor status value so they do not overwrite each other:\n\n```text\ncursor · fast:n/a\ncursor · fast:n/a · plan\ncursor · fast:off\ncursor · fast:on\ncursor · fast:off · plan\ncursor · fast:on · plan\ncursor · fast:on · http1\n```\n\n`fast:off` means fast mode is off. `fast:n/a` means the active model does not expose a fast toggle. `http1` appears when HTTP/1.1/SSE transport is enabled for Cursor SDK agents. If you do not see `plan`, Cursor SDK mode is the default `agent` mode.\n\n## Cursor SDK mode\n\nCursor SDK conversation mode is Cursor-only extension state. It is not a pi model variant, not pi thinking/reasoning, and not pi's separate read-only plan-mode extension.\n\nDefault mode is `agent`. Start a one-shot run in a specific mode:\n\n```bash\npi --model cursor/grok-4.6 --cursor-mode agent\npi --model cursor/grok-4.6 --cursor-mode plan\n```\n\nChange the session mode interactively:\n\n```text\n/cursor-mode agent\n/cursor-mode plan\n/cursor-mode\n```\n\n`/cursor-mode` with no argument reports the current mode and usage. The CLI flag does not persist to the session; slash-command changes are persisted with `pi.appendEntry()`.\n\nMaintainers can run `/cursor-tools` in a Cursor model session to print `tools.bridge.enabled`, `tools.manifest`, `local.settingSources`, and the callable-surface snapshot (host tools summary plus current `pi__*` names). See [Cursor dogfood checklist](docs/dogfood-checklist.md).\n\nWhen a new local Cursor SDK agent is created, the extension seeds the mode through `Agent.create({ mode })`. The extension also sends the effective Cursor mode on every `agent.send(..., { mode })` call so `/cursor-mode` and `--cursor-mode` remain the source of truth even when a pooled SDK agent is reused.\n\nCursor SDK `plan` mode can produce plan-oriented output and Cursor todo/plan activity, but those replay cards remain display-only. They do not drive pi's plan-mode extension, pi todos, or active tool state.\n\n## Cursor local agent config and safety controls\n\n`/cursor-refresh-config` calls the current pooled SDK agent's `agent.reload()` so Cursor reloads filesystem config such as local hooks, project MCP, and subagents without restarting pi. If no Cursor agent exists yet, the next Cursor run loads config normally.\n\nCursor SDK local safety controls stay off by default. Enable them for one run with CLI flags, or persist them in user config:\n\n```bash\npi --model cursor/grok-4.6 --cursor-auto-review --cursor-sandbox\n```\n\n```json\n{\n  \"local\": {\n    \"autoReview\": true,\n    \"sandbox\": true\n  }\n}\n```\n\nFor manual stuck-run recovery only, force-expire the active persisted local SDK run before sending:\n\n```bash\npi --model cursor/grok-4.6 --cursor-local-force\n```\n\nThis maps to the next actual `agent.send(..., { local: { force: true } })` only. SDK load, agent acquire, prompt preparation, or a pre-send abort does not consume it. A consumed CLI flag is not rearmed by session reload or tree lifecycle events. It is not a retry loop and does not cancel another live process's existing run handle. Use it only when you know the persisted local run is wedged.\n\nEach local agent whose send is initiated is recorded once per native pi session as a best-effort non-resumable `cursor-sdk-agent-lineage` custom entry at the `Agent.send()` boundary. Cloned or forked sessions record their own lineage under their new pi session ID. After a pi process restart, the next turn always creates a new SDK agent and bootstraps from the pi transcript. Same-process pooling, incremental sends, the 20-send rebootstrap, and idle eviction stay.\n\nEach persisted pi session gets a SQLite store under `<getDefaultSdkStateRoot(cwd)>/pi-sessions/<session-hash>/`. Fileless sessions use a unique OS-temporary store per acquisition and remove it on graceful disposal.\n\nDurable non-secret defaults live only in `~/.pi/agent/cursor-sdk.json`. Fast-default and HTTP transport saves preserve unrecognized fields, reject malformed or non-object JSON without rewriting it, and serialize concurrent writers. A completed global preference write is retained if Pi's subsequent session-journal append fails, because Pi may already have mutated the in-memory branch; the command reports that partial journal failure and ignores the uncertain session entry until a later successful save or session restart. If a process is force-killed during the tiny update window, the next save reports the `.lock` path; remove it only after confirming no pi process is writing that config.\n\n```json\n{\n  \"local\": {\n    \"autoReview\": true,\n    \"sandbox\": true\n  },\n  \"tools\": {\n    \"bridge\": {\n      \"exclude\": [\"bash\"]\n    }\n  }\n}\n```\n\n`tools.bridge.exclude` is a denylist of pi tool names for the pi tool bridge. Denylisted active pi tools are hidden from Cursor; everything else active stays exposed, so an unset or empty list means no restriction, not zero exposure. Names must be strings; empty and malformed entries are dropped. Overlapping built-in pi tools (`read`, `bash`, `write`, `edit`, `grep`, `find`, `ls`) stay hidden unless `tools.bridge.exposeBuiltins` is `true`, and a denylist entry keeps hiding a tool even with that opt-in. A change to the resulting exposed surface splits the local agent pool, so the next turn creates a Cursor agent with the narrowed bridge snapshot.\n\nOnly enabled local safety values are passed to `Agent.create({ local })`; false/default values are omitted to preserve the current local-agent behavior. Local force is one-shot and CLI-only through `--cursor-local-force`, and is passed only to the next `Agent.send({ local: { force: true } })`. Changes take effect on the next turn without recreating a healthy pooled agent.\n\n## Images\n\nImages from the latest user message are forwarded to Cursor. Historical images are kept out of the transcript and appear only as `[image omitted from transcript]` placeholders, so follow-up questions about an earlier image should reattach the image or include a textual description. The extension advertises `text` and `image` input for Cursor models because Cursor's SDK accepts image messages and Cursor models are expected to support them.\n\n\n## Cursor provider tool contract\n\nSee [Cursor tool surfaces in pi](docs/tool-surfaces.md) for a concise guide to callable vs display-only tools, MCP catalog limits, JSONL ID patterns, and how pi toggles differ from Cursor ambient MCP.\n\nLocal Cursor runs use two separate tool surfaces:\n\n- **Cursor-native surface:** Cursor local-agent tools, Cursor settings, plugins, and configured Cursor MCP servers. These remain owned by the Cursor SDK local agent path. Pi CLI tool toggles such as `--no-tools`, `--tools`, and `--exclude-tools` do not disable this Cursor-native surface.\n- **pi bridge surface:** pi-cursor-sdk exposes bridgeable active pi tools through a per-run local loopback MCP bridge when the bridge is enabled and the current pi tool registry has exposed tools. Pi CLI tool toggles affect this bridge surface because they change pi's active tool registry.\n\nBridge capabilities are snapshotted from `pi.getActiveTools()` and `pi.getAllTools()` for each Cursor run, including per-tool prompt guidelines when pi exposes them. Cursor sees active bridgeable pi tools as collision-safe MCP names such as `pi__sem_reindex` only when they are exposed in that current run. When exposed, Cursor is instructed to prefer `pi__mcp` for MCP work and `pi__subagent` for delegation; Cursor-configured MCP and Cursor-native subagents are fallbacks when the matching pi tool is not exposed or is unavailable. Pi session output, tool cards, confirmations, hooks, renderers, history, and abort behavior use the real pi tool name, such as `sem_reindex`. The bridge queues Cursor's MCP call, emits a normal pi `toolCall`, waits for the matching pi `toolResult`, and resolves that result back into the same live Cursor SDK run without creating a new `Agent`, unless the run was disposed, aborted, or cancelled. The bridge does not call pi tool `execute()` handlers directly.\n\nPi subagents can select Cursor models under both Cursor and non-Cursor parents. Each nested Cursor child registers a child-local provider and bridge and uses an isolated SDK agent scope, so it does not replace or wait on the parent's active Cursor agent.\n\nOverlapping built-in pi tools (`read`, `bash`, `write`, `edit`, `grep`, `find`, `ls`) are hidden by default because Cursor local agents already have native equivalents. Extension/custom tools and non-overlapping active tools present in pi's active tool registry normally remain exposed. When pi has visible Agent Skills loaded, the extension rewrites pi's skill catalog for Cursor and exposes `cursor_activate_skill` as `pi__cursor_activate_skill`; Cursor should call that bridge tool with a listed skill name to load the full `SKILL.md` and bundled resource list before applying the skill. If the bridge is disabled, the catalog remains available and instructs Cursor to fall back to reading the listed `SKILL.md` path directly.\n\nCursor-native tool replay is separate from the bridge. Replay cards are display-only recorded Cursor SDK activity. They never re-run Cursor-side commands, reapply Cursor edits, call MCP servers, or mutate pi state. See [Cursor native tool replay](docs/native-tool-replay.md).\n\nBridge and transport controls live in `~/.pi/agent/cursor-sdk.json`. One-shot HTTP/1.1 toggling still uses `/cursor-http`:\n\n```json\n{\n  \"local\": {\n    \"transport\": \"http1\",\n    \"settingSources\": [\"all\"]\n  },\n  \"tools\": {\n    \"manifest\": true,\n    \"bridge\": {\n      \"enabled\": true,\n      \"exposeBuiltins\": false,\n      \"callTimeoutMs\": 120000,\n      \"debug\": { \"stderr\": true }\n    },\n    \"mcp\": {\n      \"callTimeoutMs\": 7200000,\n      \"connectTimeoutMs\": 5000\n    }\n  }\n}\n```\n\n```text\n/cursor-http on\n```\n\nOn bootstrap sends, a compact **callable tool surfaces** block is injected into the Cursor prompt by default. It reminds the model that Cursor host/configured MCP tools are controlled by Cursor, while pi tool toggles only affect pi tools/bridge exposure; when bridge tools are exposed, it lists the current `pi__*` names. Disable it with `tools.manifest: false`.\n\n`tools.bridge.enabled: false` disables the bridge entirely. `tools.bridge.exposeBuiltins: true` opts in to exposing overlapping pi tool names that Cursor already has native equivalents for. The installed Cursor SDK uses a 60-second MCP protocol default with no public per-server timeout option. pi-cursor-sdk overrides that seam in two directions by default: MCP `callTool` requests are extended to 3600 seconds for long-running local MCP tools (including the pi bridge and configured Cursor MCP servers), and known MCP initialize/listTools requests on first send are shortened to 10 seconds so unavailable configured MCP servers fail fast instead of blocking for a full minute. Unknown Cursor SDK MCP protocol timeout stacks keep the SDK default instead of being shortened. Override tool-call timeouts with `tools.mcp.callTimeoutMs`, and first-send initialize/listTools timeouts with `tools.mcp.connectTimeoutMs`. Bridged calls also have a local fail-closed deadline that defaults to the effective MCP tool timeout; lower it with `tools.bridge.callTimeoutMs` when a lost pi result should fail sooner. On expiry, the bridge rejects and removes the pending call and aborts active pi execution when available. The bridge's `listTools` handler returns its snapshot synchronously, so a Cursor UI label such as `GetMcpTools` does not by itself identify a `listTools` deadlock; the durable bridge waiter is `CallTool` awaiting its matching pi result.\n\n`local.transport: \"http1\"` maps to the Cursor SDK `Cursor.configure({ local: { useHttp1ForAgent: true } })` compatibility mode for corporate VPN/proxy environments where HTTP/2 streams fail. In interactive sessions, `/cursor-http on`, `/cursor-http off`, and `/cursor-http toggle` set the branch-scoped session preference and save the user default as `local.transport` in `~/.pi/agent/cursor-sdk.json`; `/cursor-http` with no argument reports the effective state. Precedence is session command/history, then user config, then the built-in `default` transport. Session shutdown clears extension-owned SDK transport state before module reload. Changing the effective setting splits the local agent pool so an agent created under another transport is not reused. When enabled, the Cursor footer shows `http1` (for example `cursor · fast:on · http1`). This affects Cursor SDK local-agent backend streams, which are all provider streams. It does not configure HTTP proxies, TLS certificates, or HTTP/3.\n\n`tools.bridge.debug.stderr: true` is off by default and emits typed, allowlisted, scrubbed single-line JSONL records to `process.stderr`. These records are operational diagnostics, not anonymous telemetry: they intentionally include tool names, safe correlation IDs, bridge run state, exposed pi↔MCP name pairs, queued requests, result resolution, rejection, cancellation, and pending counts. They must not include endpoint URLs, endpoint path components, endpoint tokens, raw args/results, stdout/stderr payloads, file contents, Cursor settings output, API keys, bearer tokens, cookies, session credentials, or secrets. Set `tools.bridge.debug.file` to also append the same JSONL to a path. Do not enable or share bridge debug logs where tool names themselves are sensitive.\n\n### Maintainer release evidence\n\nFor Cursor provider/runtime changes, the current fork release evidence bar is:\n\n- `npm test`\n- `npm run typecheck`\n- `npm pack --dry-run`\n- one live print-mode Cursor run with `cursor/grok-4.6`\n- `npm run smoke:visual -- --label release-check --prompt 'Read ./package.json and reply with its package name.'`\n\nThe visual smoke captures an offscreen PTY, renders it through browser/xterm, and saves PNG screenshots with Playwright or `agent_browser`. Its default matrix is native replay only: native replay registration is forced on, Cursor setting sources are disabled, the pi bridge is off, overlapping built-in pi tools are not exposed, and inherited Cursor SDK event-debug artifact env is cleared. The visible TUI/output, rendered screenshots, scrubbed diagnostics, and persisted JSONL must agree. See [Cursor live smoke checklist](docs/live-smoke-checklist.md) and [Cursor testing lessons](docs/testing-lessons.md).\n\n### Maintainer Cursor SDK event capture\n\nUse `npm run debug:sdk-events` to capture timestamped `run.stream()`, `onDelta`, and `onStep` timelines for one direct `@cursor/sdk` run.\n\nUse `npm run debug:provider-events` to capture the same `onDelta`/`onStep` payloads **through pi's Cursor provider** (session agent reuse, bridge, native replay, send planning). Artifacts default under gitignored `.debug/cursor-sdk-events/`. Interactive multi-turn pi sessions group turns under `.debug/cursor-sdk-events/sessions/<session-slug>/turn-NNN-.../` with a `session.json` index. You can also opt in during any pi run with `debug.sdkEvents.enabled` in `~/.pi/agent/cursor-sdk.json`; capture is file-only by default so the pi TUI stays normal. Each cumulative JSONL artifact is capped at 2 MiB, ends with an `artifact_truncated` record when capped, and is listed in `summary.json` under `truncatedJsonlFiles`.\n\nSee [Cursor testing lessons](docs/testing-lessons.md#cursor-sdk-event-capture-probe) for usage, artifact layout, and safety notes.\n\n## Fallback models\n\nIf startup has no stored `/login` key or `CURSOR_API_KEY`, model discovery fails, or discovery returns no models, the extension registers a bundled fallback snapshot of the latest reviewed Cursor SDK model catalog and notifies interactive users when possible. Pi CLI `--api-key` remains available to provider turns but is not parsed independently during startup discovery.\n\nThe fallback snapshot includes Grok 4.6, Composer 2.5, Composer 2, Cursor's GPT-5.6 Luna/Sol/Terra models, Claude, Gemini, Grok 4.5, Kimi, and other model IDs exposed by the reviewed `Cursor.models.list()` output. Recommended local/smoke runs use `cursor/grok-4.6`. Pi's separate `openai-codex` catalog is owned by Pi itself; Pi 0.84.0 includes native `gpt-5.6-luna`, `gpt-5.6-sol`, and `gpt-5.6-terra` support. The exact checked-in Cursor snapshot lives in `src/fallback-models.generated.ts`. A dated maintainer capture documents the assistant-visible [Cursor system prompts and tool guidance](https://github.com/emmaneugene/pi-cursor-sdk/blob/main/docs/evidence/system-prompts-2026-08-02/README.md) for Grok 4.5, Opus 5, Fable 5, and the GPT-5.6 Sol/Terra/Luna family.\n\nActual Cursor runs still need a key from `/login`, `CURSOR_API_KEY`, or `--api-key`. If you add auth after startup, run `/cursor-refresh-models` to refresh the full live Cursor model catalog without restarting pi.\n\n## Limits\n\n- **The pi tool bridge is local and MCP-backed.** Bridgeable active pi tools are exposed to local Cursor agents through a tokenized `127.0.0.1` MCP endpoint; internal Cursor replay activity names are excluded, and overlapping built-in pi tools are hidden by default. Set `tools.bridge.enabled` to `false` to disable it, or `tools.bridge.exposeBuiltins` to `true` to expose overlapping built-ins too. Hide individual pi tools from Cursor with `tools.bridge.exclude` in `~/.pi/agent/cursor-sdk.json`.\n- **Cursor native tool replay is display-only.** Replay renders recorded Cursor SDK activity and never re-runs Cursor-side commands, reapplies Cursor edits, calls MCP servers, or mutates pi state. Workflow tools such as Cursor mode/task/todo/plan activity are not pi workflow controls. See [Cursor native tool replay](docs/native-tool-replay.md) for supported replay cards, ordering, conflict handling, and opt-out settings.\n- **Cursor run state can span tool-use turns.** Within a pi session, the extension reuses one Cursor SDK agent across compatible follow-up turns and sends incremental prompts when context still matches. It recreates the agent when context diverges, after compaction or `/tree` navigation, on API key changes, after send errors, after five minutes without a successful send, or on session shutdown. Idle recreate uses `Agent.create`. For bridged pi tools, the matching pi `toolResult` resolves into the same live Cursor SDK run without creating a new `Agent`, unless the run was disposed, aborted, or cancelled. Replay can also split one live Cursor SDK run across pi `toolUse` turns for display.\n- **Final assistant text is the last non-empty text part.** Composer responses can produce one assistant message with early progress `text`, thinking/tool metadata, and a later final `text` report. Consumers that need a final answer should scan assistant message content from the end and use the last non-empty `text` part, not the first. Cursor `thinking` deltas are shown as thinking traces when the SDK emits them; those traces can include draft answers or copied exact-output targets and are intentionally not collapsed by this extension.\n- **Cursor setting sources default to all.** The extension passes `local.settingSources: [\"all\"]` by default so configured Cursor MCP servers, plugin tools, project/user settings, and related Cursor-native capabilities are available like they are in Cursor. To narrow loading, set `local.settingSources` to a list such as `[\"project\", \"user\", \"plugins\"]`. To disable ambient setting sources, set `local.settingSources` to `[]`. Direct Cursor SDK bootstrap logs (settings, skills, hook-load compatibility warnings, and similar) are suppressed so they do not pollute the TUI.\n- **AGENTS.md / CLAUDE.md are not duplicated on Cursor models when Cursor loads the same rules.** Pi discovers global and project context files (`AGENTS.md`, `CLAUDE.md`, and case variants) unless you start with `-nc`. On `cursor/*` models the extension removes only `<project_instructions>` blocks that overlap Cursor `settingSources` via the `before_agent_start` hook: `user` for `~/.pi/agent/AGENTS.md`, `project` for repo/parent `AGENTS.md` and `CLAUDE.md` (verified Cursor behavior: local agents load project `AGENTS.md` and `CLAUDE.md` alongside Cursor rules). `~/.pi/agent/CLAUDE.md` is not stripped (Cursor user rules use `~/.claude/CLAUDE.md`, not pi's agent dir). With `local.settingSources: []` or `plugins`-only, pi context is left intact. Set `local.preservePiAgentsContext` to `true` to keep duplicate injection.\n- **Max Mode is not a manual pi variant.** Cursor's SDK may enable Max Mode automatically for models that require it. This extension uses each model's default Cursor context and cached checkpoint evidence for pi context accounting.\n- **Output token limits are conservative.** Cursor SDK model metadata does not currently expose output token limits directly.\n- **Local token usage uses Cursor SDK data when safely attributable.** For local turns with in-time SDK usage, pi records the latest per-turn raw `turn-ended` `inputTokens`, `outputTokens`, `cacheReadTokens`, and `cacheWriteTokens`; that raw local shape keeps full-prompt `inputTokens` with cache as a partition (published SDK `toTokenUsage` totals differ), so pi maps disjoint components (`input = inputTokens - cacheRead - cacheWrite`, plus cache fields) and sets `totalTokens = inputTokens + outputTokens` for occupancy/compaction. If the local SDK reports no usage in time, the extension falls back to local `input/output` activity estimates while setting `totalTokens` to the current replayable context estimate so the footer/compaction percentage does not collapse after split tool turns. Later usage for that live run is ignored rather than risk applying stale usage to the wrong pi turn. Cursor SDK cost is not exposed, so pi cost remains zero/absent.\n\n## User config reference\n\nDurable settings live only in `~/.pi/agent/cursor-sdk.json`. CLI flags and `/cursor-*` session commands remain one-shot or session overrides. `PI_CURSOR_*` behavior variables are ignored.\n\n| Key | Default | Effect |\n|---|---|---|\n| `models.fastDefaults` | unset | Saved `/cursor-fast` defaults keyed by canonical Cursor model ID. |\n| `models.cache.enabled` | `true` | When `false`, skip model-list cache reads and writes. See [Model catalog cache](#model-catalog-cache). |\n| `models.cache.ttlMs` | `86400000` (24h) | Fresh-cache lifetime. `0` disables fresh-cache hits but keeps the stale-cache fallback after a discovery failure. |\n| `local.autoReview` | `false` | Passes `autoReview: true` into Cursor SDK agent options when true. CLI: `--cursor-auto-review`. |\n| `local.sandbox` | `false` | Passes local sandbox enablement when true. CLI: `--cursor-sandbox`. The SDK runs `cursorsandbox` from the platform package. |\n| `local.transport` | `\"default\"` | `\"http1\"` forces Cursor SDK local-agent streams to HTTP/1.1/SSE. Session: `/cursor-http`. |\n| `local.settingSources` | `[\"all\"]` | Cursor SDK setting sources. `[]` disables ambient sources. Other lists such as `[\"project\", \"user\", \"plugins\"]` narrow loading. |\n| `local.preservePiAgentsContext` | `false` | Keeps pi `AGENTS.md`/`CLAUDE.md` context injection even when Cursor setting sources load the same rules. |\n| `tools.manifest` | `true` | Injects the compact callable-surface guidance block on bootstrap sends. |\n| `tools.bridge.enabled` | `true` | Exposes active pi tools to local Cursor agents through the loopback MCP bridge. |\n| `tools.bridge.exposeBuiltins` | `false` | Also exposes overlapping pi built-ins (`read`, `bash`, `write`, `edit`, `grep`, `find`, `ls`). |\n| `tools.bridge.exclude` | `[]` | Denylist of pi tool names for the bridge. |\n| `tools.bridge.callTimeoutMs` | Effective MCP tool timeout | Local fail-closed deadline for a stranded bridged `CallTool`. Lower it to fail sooner. |\n| `tools.bridge.debug.stderr` | `false` | Emits scrubbed single-line JSONL bridge diagnostics to stderr. |\n| `tools.bridge.debug.file` | unset | Appends the same JSONL bridge diagnostics to the given file path. |\n| `tools.mcp.callTimeoutMs` | `3600000` (1h) | Overrides SDK MCP `callTool` timeout. Clamped to 60s–~24.8d. |\n| `tools.mcp.connectTimeoutMs` | `10000` (10s) | Overrides known MCP initialize/listTools timeouts on first send. Clamped to 1s–60s. |\n| `tools.display.native` | `\"auto\"` | `\"on\"` / `\"off\"` force native Cursor tool cards. `\"auto\"` follows `tui`/`json`/`rpc` or `stdout.isTTY`. |\n| `tools.display.taskPresentation` | `\"subagent-meta\"` | Task activity titles: `task`, `subagent`, or `subagent-meta`. |\n| `debug.sdkEvents.enabled` | `false` | Writes raw provider/SDK event artifacts under `.debug/cursor-sdk-events/`. |\n| `debug.sdkEvents.directory` | `.debug/cursor-sdk-events` | Artifact base directory. |\n| `debug.sdkEvents.stderr` | `false` | Also emit capture markers to stderr. |\n\nSee [Cursor provider tool contract](#cursor-provider-tool-contract) for the narrative version of this table.\n\n## Environment variable reference\n\nThe extension reads these env vars only:\n\n| Variable | Default | Effect |\n|---|---|---|\n| `CURSOR_API_KEY` | Unset | Authenticates Cursor SDK requests. The stored `/login` credential is preferred; the env var is the fallback. See [Configure your Cursor SDK API key](#configure-your-cursor-sdk-api-key). |\n| `CURSOR_RIPGREP_PATH` | Bundled SDK `rg` when available | Ripgrep executable for the local SDK agent. Only an absolute path is honored; the extension sets the bundled default itself at turn prepare. |\n| `CURSOR_TREE_SITTER_VENDOR_DIR` | Bundled SDK `vendor/` when available | Vendored tree-sitter natives for the local SDK agent. Only an absolute path is honored; the extension sets the bundled default itself at turn prepare. |\n\nPi relocates the agent dir with `PI_CODING_AGENT_DIR`. The extension then loads `cursor-sdk.json` from that dir.\n\nInternal script coordination only:\n\n| Variable | Default | Effect |\n|---|---|---|\n| `PI_CURSOR_SDK_EVENT_DEBUG_RUN_DIR` | Unset | Pins one turn's artifacts to an exact directory, bypassing session grouping. |\n| `PI_CURSOR_SDK_EVENT_DEBUG_SESSION_DIR` | Unset | Pins the session's turn grouping and manifest to an exact directory. |\n\n`PI_CURSOR_BRIDGE_TOOL_CALL_ID` is an internal cancellation marker injected by the bridge on some platforms, not a user setting. `*_SMOKE_*` and `PLATFORM_*` names belong to maintainer smoke scripts, not the extension runtime.\n\n## Troubleshooting\n\n### I can see Cursor models, but runs fail\n\nYou may be seeing fallback startup models or a missing/invalid Cursor SDK API key. Cursor Agent CLI/Desktop login is not reused by this extension. In interactive pi, run `/login`, choose `Use an API key`, choose `Cursor`, paste the key, then run `/cursor-refresh-models`.\n\nWhen a Cursor run fails after auth is configured, pi now surfaces scrubbed provider detail instead of only `Cursor SDK run failed`. Generic SDK failures include safe run metadata such as model id, a short run id prefix, and duration when available, and are phrased as pi retryable provider errors so automatic retry/backoff can recover transient SDK failures.\n\nAborted runs now include a likely cause when determinable, for example `Cancelled: prompt interrupted.` for user cancel or `Cancelled: Cursor SDK run was cancelled.` for SDK-side cancellation.\n\nNetwork failures from the Cursor SDK connect layer (for example `ConnectError: read ETIMEDOUT` or `ConnectError: [aborted] read ECONNRESET`) surface as scrubbed `Network error` messages instead of crashing pi, matching pi's native auto-retry classifier. The exact Cursor SDK 1.0.23-provenance `WriteIterableClosedError: WritableIterable is closed` race is contained for the Pi session lifecycle because controlled-exec can reject after the originating provider turn; Connect/network suppression remains active-turn scoped; raw Cursor SDK `AbortError` DOMExceptions are suppressed while any provider turn or session process-error guard is active (stall/inter-turn timers). Unrelated failures remain fatal. The observed raw `write EPIPE` uncaught exception (SDK 1.0.23 local shell executor writes child stdin without a stream error listener; 1.0.27 attaches a no-op listener before that write) is still contained only for that exact one-frame shape and only while a local Cursor provider turn is active; a contained closed pipe marks that turn's pooled/resumable agent transport dead so the next turn recreates it. EPIPE outside an active local turn, and the multi-frame synchronous write-path EPIPE from pi's own piped stdout or a dead terminal, stay fatal. The affected run may still report its underlying transport or tool failure normally. Persistent failures may indicate a transient Cursor service or network issue.\n\nYou can also restart pi with a key in the same shell or launcher that starts pi:\n\n```bash\nexport CURSOR_API_KEY=\"your-key\"\npi --model cursor/grok-4.6\n```\n\nOr run a one-shot command:\n\n```bash\npi --api-key \"your-key\" --model cursor/grok-4.6 -p \"Say ok only\"\n```\n\n### `pi --list-models cursor` shows no Cursor models\n\nConfirm the package is installed:\n\n```bash\npi list\n```\n\nThen reinstall if needed:\n\n```bash\npi install npm:@emmaneugene/pi-cursor-sdk\n```\n\n### `pi --list-models` shows `thinking=no`\n\nThat does not mean the model cannot think. It means the Cursor SDK does not expose a pi-controllable thinking parameter for that model. The model may still think internally and may still emit thinking deltas that pi renders natively.\n\n### I do not see `cursor` or `plan` in the footer\n\nThe Cursor footer appears only while a Cursor model is active. Fast-capable models show `cursor · fast:on` or `cursor · fast:off`; Cursor models without a fast parameter show `cursor · fast:n/a`. Cursor SDK mode is the default `agent` mode when `plan` is absent. When plan mode is active, pi shows one combined Cursor status such as `cursor · fast:on · plan`.\n\n### My Cursor app settings or rules do not seem to apply\n\nCursor setting sources are loaded with `local.settingSources: [\"all\"]` by default. To narrow loading, set `local.settingSources` to a list such as `[\"project\", \"user\", \"plugins\"]`. If you set `local.settingSources` to `[]`, remove that override or restore `[\"all\"]`.\n\n### Cursor does not call my web search MCP/tool\n\nCursor SDK local agents load MCP servers from Cursor setting sources and inline SDK config. This extension enables all Cursor setting sources by default, so a missing web search tool usually means it is not configured in Cursor or the run was started with a narrowing/disable override such as `local.settingSources: []`.\n\n### I do not see Cursor web search or web fetch in pi's tool UI\n\npi shows **Cursor web search** / **Cursor web fetch** activity cards only when the installed `@cursor/sdk` reports completed replayable tool data. Supported sources are SDK `mcp` completions whose `toolName` is `WebSearch` / `web_search` / `WebFetch` / similar, host tool names that normalize to those labels, and local Cursor transcript `webSearchToolCall` / `webFetchToolCall` records available through `Agent.messages.list()` after the run. This is separate from SDK `semSearch`, which is semantic **codebase** search.\n\nKnown SDK boundary: some local Cursor web search activity is not emitted through live `onDelta`, `onStep`, or `run.stream()` tool events. When that happens, pi can only reconstruct a card from the local agent transcript after `run.wait()` finishes, so the **Cursor web search** card may appear after assistant text rather than as a live in-progress card. Buffering all assistant text until `run.wait()` would make the ordering prettier but would break normal streaming, so pi does not do that.\n\nKnown SDK boundary: Cursor SDK `task` activity is shown as **Cursor subagent** because it represents Cursor-spawned child-agent work, but the SDK does not always emit a live nested subagent action stream. Pi shows the subagent start, final output, kind/model/short-ID metadata, and any `conversationSteps` tool-call summaries Cursor returns. If Cursor only returns final subagent text, pi cannot show the subagent's internal read/shell/MCP steps.\n\nMany runs never expose web activity as replayable SDK tool completions or local transcript web tool records. The model may still answer from internal Cursor web tooling or only mention search in assistant text/thinking. In that case pi cannot render a tool card because there is no completed SDK tool-call payload to replay. Capture a run with `npm run debug:provider-events` when investigating; if `on-delta.jsonl`, `on-step.jsonl`, `stream-events.jsonl`, `coordinator-events.jsonl`, and `display-decisions.jsonl` have no completed or transcript web tool data, the limitation is on the Cursor SDK surface, not pi replay registration.\n\n**Web fetch:** `pi-cursor-sdk` can display `webFetchToolCall` transcript records and web-fetch-shaped MCP/host completions when Cursor reports them. It cannot make Cursor expose or execute a `WebFetch` tool. If Cursor's current local SDK tool set does not include WebFetch, pi cannot fetch a URL through Cursor web fetch; use an allowed browser/shell/MCP tool instead.\n\n### I disabled MCP in pi but Cursor still has extra tools\n\npi extension toggles and pi's MCP catalog do not control Cursor ambient MCP. Local Cursor agents load MCP servers from Cursor setting sources (`local.settingSources: [\"all\"]` by default), including `~/.cursor/mcp.json`. To remove a server, edit or clear that file (or Cursor MCP settings) and restart the pi session, or set `local.settingSources` to `[]` or a narrower list. See [Cursor tool surfaces in pi](docs/tool-surfaces.md).\n\n### Cursor does not call my pi extension tool\n\nThe local pi bridge only exposes tools that are active in the current pi session and present in pi's tool registry at Cursor run start. By default, it does not expose overlapping pi tool names that Cursor already has native equivalents for (`read`, `bash`, `write`, `edit`, `grep`, `find`, and `ls`). Opt in if you intentionally want Cursor to see both the Cursor-native tool and an overlapping built-in pi tool:\n\n```json\n{\n  \"tools\": {\n    \"bridge\": {\n      \"exposeBuiltins\": true\n    }\n  }\n}\n```\n\nTo disable the bridge for rollback or isolation, set `tools.bridge.enabled` to `false`.\n\n### First Cursor message is slow (10+ seconds)\n\nThe extension loads Cursor setting sources with `local.settingSources: [\"all\"]` by default, which includes user MCP servers from `~/.cursor/mcp.json`. On the first send of a session, the Cursor SDK connects to each configured MCP server before streaming a reply. pi-cursor-sdk shortens the known MCP initialize/listTools timeout path to **10 seconds by default** (the raw Cursor SDK default is 60 seconds), so a dead server should fail fast instead of blocking for a full minute. Unknown MCP protocol timeout stacks keep the SDK default instead of being shortened. A slow or unavailable server can still add roughly that connect timeout before the first reply. Tighten further with `tools.mcp.connectTimeoutMs`:\n\n```json\n{\n  \"tools\": {\n    \"mcp\": {\n      \"connectTimeoutMs\": 5000\n    }\n  }\n}\n```\n\nWorkarounds if you do not need user-level MCP in pi:\n\n```json\n{\n  \"local\": {\n    \"settingSources\": [\"project\", \"plugins\", \"team\"]\n  }\n}\n```\n\nOr fix/disable the slow MCP server in Cursor settings. Maintainer timing probe: `npm run debug:mcp-coldstart`.\n\n### A Cursor MCP tool times out\n\nThe extension raises Cursor SDK's MCP tool-call timeout from 60 seconds to 3600 seconds by default for Cursor SDK MCP `callTool` requests, including the local pi bridge and configured Cursor MCP servers. For longer local MCP tools, set `tools.mcp.callTimeoutMs`:\n\n```json\n{\n  \"tools\": {\n    \"mcp\": {\n      \"callTimeoutMs\": 7200000\n    }\n  }\n}\n```\n\nA bridged pi call additionally uses a local deadline capped by that effective MCP timeout. To fail a stranded bridge call sooner without shortening other MCP servers, set `tools.bridge.callTimeoutMs`:\n\n```json\n{\n  \"tools\": {\n    \"bridge\": {\n      \"callTimeoutMs\": 120000\n    }\n  }\n}\n```\n\n### Tool calls appear as a plain text list instead of pi tool cards\n\nThis usually needs session JSONL to classify. Common cases:\n\n- **Model text echo:** Assistant `text` blocks contain lines like `Tool call`, `Cursor activity`, or `call cursor-replay-…` without matching `toolCall` blocks — the Cursor model narrated pi prompt transcript format instead of invoking SDK tools. See [Tool calls listed as plain text (#40 triage)](docs/testing-lessons.md#tool-calls-listed-as-plain-text-40-triage).\n- **Stale replay routing / plan-strip:** Error `toolResult` or error assistant messages contain `Tool grep/cursor/find/ls not found`, or provider debug shows `inactive_trace` after plan-mode execute stripped active tools — tracked in **#52** (distinct from model text echo and #55).\n- **Replay vs execution:** `cursor-replay-*` IDs and neutral **Cursor MCP** activity cards are display-only recorded Cursor results; they do not re-run browser/MCP work. See [Cursor native tool replay](docs/native-tool-replay.md).\n- **Run failure / discarded tools:** A red toast with scrubbed detail may indicate an SDK failure (#55). Started-but-never-completed Cursor tools surface neutral **Cursor … did not complete** activity cards with a bounded reason when the run failed, was aborted, or produced no assistant text. After a successful text-producing run, missing-completion starts are debug-only for all tools: the installed Cursor SDK emits `tool-call-started` with no completion delta, step, or conversation entry when a permission policy or hook denies a call, and offers no way to distinguish such denials from lost completions, so suppression is the deliberate choice over false error cards. Maintainer debug for the same gap remains in **#52** (`debug.sdkEvents.enabled` in `cursor-sdk.json`).\n- **Hard SDK crash:** pi exited with an uncaught Cursor SDK `ConnectError` or `WriteIterableClosedError` instead of showing a normal run error — capture the stack/session tail as a process-guard regression, not #40 text echo.\n\nCapture `pi --version`, extension version, model, flags, the exact prompt, and a redacted session dir before filing bugs.\n\n### Cursor native tool cards conflict with another extension\n\nCursor native replay is a display enhancement for TUI sessions and structured JSON/RPC consumers. It replays recorded Cursor SDK activity without re-running tools, and print mode remains text-first. See [Cursor native tool replay](docs/native-tool-replay.md) for conflict behavior and `tools.display.native` opt-out.\n\n## Development\n\nRun checks:\n\n```bash\nnpm test\nnpm run typecheck\n```\n\nCheck the reviewable Cursor fallback catalog against the authenticated live catalog before releases:\n\n```bash\nCURSOR_API_KEY=\"your-key\" npm run check:cursor-snapshots\n```\n\nRefresh it after Cursor model changes:\n\n```bash\nCURSOR_API_KEY=\"your-key\" npm run refresh:cursor-snapshots -- --write\n```\n\nRefresh the bundled default/non-Max context-window snapshot only when checkpoint-derived context windows have been collected from live local runs:\n\n```bash\nCURSOR_API_KEY=\"your-key\" npm run refresh:cursor-snapshots -- --write \\\n  --context-windows ~/.pi/agent/cursor-sdk-context-windows.json\n```\n\nThe check and refresh modes fetch and sort the same sanitized live catalog. Check mode byte-compares the generated fallback without writing; generated provenance records the installed `@cursor/sdk` version and model count. Both modes print public model metadata only and scrub known auth material from SDK errors. Do not run them with shell tracing that would echo API keys.\n\nLocal development run:\n\n```bash\nnpm install\nCURSOR_API_KEY=\"your-key\" pi -ne --approve -e . --model cursor/grok-4.6\n```\n\nAfter editing `src/`, run `npm run build` before the next `pi -e .` run, or pi loads the previous build.\n\nMaintainer design notes live in [`docs/model-ux-spec.md`](docs/model-ux-spec.md).\n\n## License\n\nMIT\n","readmeFilename":"README.md"}