{"_id":"pi-permission-system","_rev":"29-80245bc924c11392eac3fca14b84d350","name":"pi-permission-system","dist-tags":{"latest":"0.8.0"},"versions":{"0.1.0":{"name":"pi-permission-system","version":"0.1.0","keywords":["pi-package","pi","pi-extension","permissions","policy","coding-agent"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.1.0","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"5a5fc03d0594bc435014ac95266533a9d7c1def1","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.1.0.tgz","fileCount":13,"integrity":"sha512-zzlvwlxm5RK1R/Hth+VyO/MYcsfuoHEQeocYJwRwU2r6XPQnBcyIzl/NWDSupsh/HdQBEvJeafAy0xg9ytqDdg==","signatures":[{"sig":"MEYCIQCbKXJKp86X9VUCGW+8THW0vVUfb4Cp/MryeXDkadKiQgIhALAsHKIOyp9LrSQN8pkFMB+3vQipcH69sETPY7orpwBW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74760},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"f59ce79a6a3c9b48994b9c4a15e5e81d853a7b2b","scripts":{"lint":"npm run build","test":"bun ./src/test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"_npmVersion":"11.6.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.8.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"*","@mariozechner/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.1.0_1772436504310_0.9990774716953839","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"pi-permission-system","version":"0.1.1","keywords":["pi-package","pi","pi-extension","permissions","policy","coding-agent"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.1.1","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"0fc8046e281279ca1a2b6c7a7985108ba7944670","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.1.1.tgz","fileCount":14,"integrity":"sha512-CgH3Ft3IVL6wEEQZFZh74IaOxtXlZDudyQAlRxwED4GBV1UB+PUvPLsawsANCbYtq8BTzzBIlvwYXDm+s6HAJw==","signatures":[{"sig":"MEYCIQDgQ6ppwcxdyiVpIKRRF+e2Hnf0qoQ0cgoW7Eb2f4XPGgIhAPxpEh25N+thfUJWuQCodV0OnnSGQULCgUMKmM3cFogm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1500113},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"5d8739ba5ceabcbd940ebb61b8ffbbf05a962579","scripts":{"lint":"npm run build","test":"bun ./src/test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"_npmVersion":"11.6.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.8.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"*","@mariozechner/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.1.1_1772437001316_0.7197405199626594","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"pi-permission-system","version":"0.1.2","keywords":["pi-package","pi","pi-extension","permissions","policy","coding-agent"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.1.2","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"3e60e84b375d6ecdced1fae342f460d3fb45328f","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.1.2.tgz","fileCount":14,"integrity":"sha512-d2vdhTw675zLpoe18me/QO1HV9riio+5+ChwAOyDIx02mB+s7eIk8cA6hmpi93lNLSTBe1i5PNWPaekDiIXDGw==","signatures":[{"sig":"MEUCIQDsYu/94E4G0IHkBkywG5Fl0M+Gkcks8fOOQJV4+klSnAIgciaA9hVSdlpNU4JVZ8k34pwu8COyVvcGIS/uB3MFZZ0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1499898},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"3fa6a496f4c28e65bbcb6787a3e9b5c636706ed3","scripts":{"lint":"npm run build","test":"bun ./src/test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.8.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"*","@mariozechner/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.1.2_1772563042689_0.9259922193900563","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"pi-permission-system","version":"0.1.3","keywords":["pi-package","pi","pi-extension","permissions","policy","coding-agent"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.1.3","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"7b18ccdd34840c4880fe97333a3f11deef919e21","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.1.3.tgz","fileCount":14,"integrity":"sha512-2EdMx9jIleQahheTTMxhW5M2rz058Dwn6mOF80SlO136Yu/jTvITJNRBtP+Bhq8Meq2I5HRzie/bSIGTmze1IQ==","signatures":[{"sig":"MEUCIQDbt62l4KBc+JvsgU5gt+E06j4t0w+CJQIobl1Hfd8BFAIgI9Pe7+1XIx+bnihMVITawyLth8TZplf+wg4ilTK6qkE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1500068},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"3fa6a496f4c28e65bbcb6787a3e9b5c636706ed3","scripts":{"lint":"npm run build","test":"bun ./src/test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.8.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"*","@mariozechner/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.1.3_1772563451162_0.29852296316976235","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"pi-permission-system","version":"0.1.4","keywords":["pi-package","pi","pi-extension","permissions","policy","coding-agent"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.1.4","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"5f9ed90c9d697ef05a7674929e9b3ba83728bc07","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.1.4.tgz","fileCount":14,"integrity":"sha512-AuCUNS+IsfaJFrOqYc2ojMzSugWITuOtdwDQ9mu5NhjW4TsQ4iZCSuzNk5T93kbzhO2cHQ2mfBeMUMsnw+zc9A==","signatures":[{"sig":"MEUCIBkEItjCEiC699fR+XpXlJOj8n8repPwOfYPP+i5wRT3AiEAj+WJMdglkH/TJitRRNubL66bvhHLw8i9P12JJtnbK8A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1517556},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"6c9804b4434681248edfde07cff75d32e50240c6","scripts":{"lint":"npm run build","test":"bun ./src/test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"_npmVersion":"11.9.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"*","@mariozechner/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.1.4_1772851561216_0.03880443060817962","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"pi-permission-system","version":"0.1.5","keywords":["pi-package","pi","pi-extension","permissions","policy","coding-agent"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.1.5","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"654ae7e2da4cf29722852d840e4b8eed56821f92","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.1.5.tgz","fileCount":14,"integrity":"sha512-S8Id/Fw7iYVr8F0HnkYB95r0xT2vpzf8fKxA30EUuxV+rNKo82b3W6sI766XVCO9xswxEXNXjqwxFajq3EOzvg==","signatures":[{"sig":"MEYCIQCJZUMJL9CozhVfiBHq4MZi898IMrU7Ws/2BJnKlBW+NQIhAMZ9vteSMt2tFHiW2k28Ruq6lYj+pEmU41GS00JhQchx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1520916},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"scripts":{"lint":"npm run build","test":"bun ./src/test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.8.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"*","@mariozechner/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.1.5_1773051458584_0.7660759367020018","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"pi-permission-system","version":"0.1.6","keywords":["pi-package","pi","pi-extension","permissions","policy","coding-agent"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.1.6","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"271285c23fe2139a8b0fc588233131d3347a5b0f","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.1.6.tgz","fileCount":15,"integrity":"sha512-ZGy+PXkvUM/2zNdM/Z/BOfCpU+NPVMY+0OgJT/NuF660ZGc0zO7f98LTcDkj54X8GttcwIVnhZJV7Ns47vUBsw==","signatures":[{"sig":"MEYCIQCQPkxCvh464+rzP2D9mXikK+cXucOfA3IgfNY4c3pzvAIhAML1KIU2db8lxh0GnSmiiBUxb4mtIS3lqungElnkXa9U","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1524671},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"644660e37e287b0121c7b5433095e536cd46ee92","scripts":{"lint":"npm run build","test":"bun ./src/test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.8.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"*","@mariozechner/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.1.6_1773052016808_0.9893242994927776","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"pi-permission-system","version":"0.1.7","keywords":["pi-package","pi","pi-extension","permissions","policy","coding-agent"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.1.7","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"0334e031ab839c684d275af7408ad213688f6356","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.1.7.tgz","fileCount":17,"integrity":"sha512-vUxHBcvghSmA08HnhSAF/ApUYI6iFA5Zxm17MxP3L7fwk5azvuv4TIWIDe32GOZ2PorAhZPuLDxKBvavrCJHjA==","signatures":[{"sig":"MEYCIQDUlD7K9g7WPcookpLkJ+7wwED4msZ2MycsV8ZWUS3ZOQIhAIMJtSsAlH6Nv0cE/6EuAxLM+zLXdBmNqibNtiTCHd31","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1530689},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"1e731249bc2fdaf5f2e37efdaa1fa58475cd75f9","scripts":{"lint":"npm run build","test":"bun ./src/test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"*","@mariozechner/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.1.7_1773076409125_0.055432182610618996","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"pi-permission-system","version":"0.1.8","keywords":["pi-package","pi","pi-extension","permissions","policy","coding-agent"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.1.8","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"8ba30b001b588960831bd07b57bbf68d80e223a8","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.1.8.tgz","fileCount":17,"integrity":"sha512-E6qaFnr6OxXWLwCZGCWYK96nr+F/ZZ0Z3kyFwCxp4+8/SbMn3LIlanyCX0WBuU/roW/zmfLmwSv97EYAad8xLw==","signatures":[{"sig":"MEUCIDfPJj1wmCLrlXdgM4mafik0VoFaPNug54MC7sPEaGQfAiEAq1pL129h10vTomXTlMZybzZCqT9C/IxzapJLNUDjNQE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1532556},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"164a6e3434a19b817725edb3ec9db9dd51856393","scripts":{"lint":"npm run build","test":"bun ./src/test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"*","@mariozechner/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.1.8_1773079456156_0.27959498199463195","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"pi-permission-system","version":"0.2.0","keywords":["pi-package","pi","pi-extension","permissions","policy","coding-agent"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.2.0","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"a17a1abf1dc54265f3cf04b835413cb933a5590a","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.2.0.tgz","fileCount":17,"integrity":"sha512-04A+iyJGA3ORyr/iUvcSIfR4iWv304ykINNNXx4xiLYrLGyIPooCE8a2DcVKCD0LSvu3/+ACTCb3puSKv10qPw==","signatures":[{"sig":"MEQCIERH3tsFSpPmBRNvxY1sL2dTCyumo/O826l8AdohZGJeAiBJ/eDUmcJCYdslE7zkAlYDsCubSAmLx8LGRXfb5kNz2w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1536728},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"4df5864414cb5a252eb757b060034ca86e5c96eb","scripts":{"lint":"npm run build","test":"bun ./src/test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"*","@mariozechner/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.2.0_1773305335960_0.01637587464033552","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"pi-permission-system","version":"0.2.1","keywords":["pi-package","pi","pi-extension","permissions","policy","coding-agent"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.2.1","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"04ea3b8946e08a4970c932600f14aa64e75879aa","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.2.1.tgz","fileCount":20,"integrity":"sha512-SPdMdjTuPDoCt0KJhssgbtFlFw6nHamjvRHhwRNIRTAMa+S55y2QtB8TjCQdpec8kfW5JdV+JTjvXON7NVHXNQ==","signatures":[{"sig":"MEQCIDqZuBRGLCUXdjeZBWTAGorg9+Ys1YLotLBT+5sLfSMsAiB7zWGNGIdJWXGsB/j/5YFtClzQXJ8mO3mtJySbjF7maQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1558112},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"6252d9e44ae0611dd399208f66da685dec5d4dbf","scripts":{"lint":"npm run build","test":"bun ./src/test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"*","@mariozechner/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.2.1_1773325223604_0.6163717273838221","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"pi-permission-system","version":"0.2.2","keywords":["pi-package","pi","pi-extension","permissions","policy","coding-agent"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.2.2","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"9c31234025bb0512b749688465275862d933f468","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.2.2.tgz","fileCount":20,"integrity":"sha512-XMk6u5KfEP3h1natAvkmBtDGU/UYqU5r/de3hqk1qDaXqZJExupyDL2Q6T+c+KxL/Ddjf7juJHqDYizznNwcgA==","signatures":[{"sig":"MEYCIQC88D619wPgDAHRRaEXp2vFZtNXL5bK6KNAWOWwehKgKgIhANFK9UzauJD4GLIHBdBoJRD3eAxi0Sbzjnf8pQxSR5Yi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1560926},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"c1543949f466d50e9607667a9abb1224d7088f25","scripts":{"lint":"npm run build","test":"bun ./src/test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"*","@mariozechner/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.2.2_1773341216628_0.20059072425628877","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"pi-permission-system","version":"0.3.0","keywords":["pi-package","pi","pi-extension","permissions","policy","coding-agent"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.3.0","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"9e499dd5a4f216f2e07c3a3b979880dd2eb72ff0","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.3.0.tgz","fileCount":27,"integrity":"sha512-6L01QuXlTUIOKUcKaCOJ0DJzJWy+ZFxY9QZd/BGGJY/O+/MtuS4DCYr7FtVEWQPs1w+6jHbznOp9QRUWtcY+9A==","signatures":[{"sig":"MEUCIGu1gqdGY6gu9tXGbgAX3Alo6/BvazJvexSkHabmBRXTAiEA534dlnO2ePUvRHWjVafHlZ+lv2pV4xqlzA3IKMq0zdc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1626957},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"36a3d7ee2794b9350bdac5de029d9f074a2c63ad","scripts":{"lint":"npm run build","test":"bun ./src/test.ts && bun ./src/config-modal-test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"^0.34.48","@mariozechner/pi-tui":"^0.62.0","@mariozechner/pi-coding-agent":"^0.62.0"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.3.0_1774265537336_0.4499672603131393","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"pi-permission-system","version":"0.3.1","keywords":["pi-package","pi","pi-extension","permissions","policy","coding-agent"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.3.1","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"5b3aa0168ef247acbebc54d7eef131d67c4d5651","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.3.1.tgz","fileCount":28,"integrity":"sha512-UPo68u8zL0BXGxjPD1bqOt6Ym6YGPcvA+Gg3mk0KPiKyC71uLhRawsTYAyfPEZhmkVVEXGFnJ4E9fQTGGWwg9Q==","signatures":[{"sig":"MEYCIQCNBeNnhwduTaFb70rsWZqr7kdnVzbzxh8WSXR1MopQrgIhAPRGcZOHC1c8ESCb/PPQrM0BBEAIXbHvqNrAJ+eYoIK7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1629097},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"0b77943adbc8a87de2161fd8037d2d80505fbfd1","scripts":{"lint":"npm run build","test":"bun ./src/test.ts && bun ./src/config-modal-test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"^0.34.48","@mariozechner/pi-tui":"^0.62.0","@mariozechner/pi-coding-agent":"^0.62.0"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.3.1_1774305506025_0.31034136892087183","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"pi-permission-system","version":"0.4.0","keywords":["pi-package","pi","pi-extension","permissions","policy","coding-agent"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.4.0","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"2473efe6ede3e78c112c2ba119a2fe9c780ef4a2","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.4.0.tgz","fileCount":28,"integrity":"sha512-agLA21vY8eVTwg3axlKc+VS0xuTtbovN+5W9AfyttJFNGUqvOJpORC1wI2kmia2wC91YQPNlujd0W9Stws05CA==","signatures":[{"sig":"MEUCIF+xrebCoRLFRnZMJCOjiCA7TKOX7osSDDCxXGWrU3UbAiEA8cwZ8G5AAcGLThkzvXrpny5zlHV24KHomPkfVWWuyvw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1635614},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"5689e4a3bb028517b09ba4f1d2999936316acb33","scripts":{"lint":"npm run build","test":"bun ./src/test.ts && bun ./src/config-modal-test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"^0.34.49","@mariozechner/pi-tui":"^0.64.0","@mariozechner/pi-coding-agent":"^0.64.0"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.4.0_1775013996636_0.9072274904919095","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"pi-permission-system","version":"0.4.1","keywords":["pi-package","pi","pi-extension","pi-coding-agent","coding-agent","permissions","policy","access-control","authorization","security"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.4.1","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"0992d4794fd525a517a0c961acce509b4e4f4f0e","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.4.1.tgz","fileCount":28,"integrity":"sha512-n80ASVkPUBc2qNQoqQ4xyrh1yymifnLPrxW8Gk4YKuFv4aadl/xTBktDQk+wezCmxXSvmKa0/fpLnXSbUlqbvg==","signatures":[{"sig":"MEUCIQDFdfMgmrtkqJ8luNKJCnZDG9kfWBRFogaowlv5fkd1SAIgLXSkAH6K3Ga9oZm/nekKS4MtDUwt7G23zfc39j3Sbjk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1636509},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"da22e1879aaf0bf5d0673eefddd9df29f7f4e256","scripts":{"lint":"npm run build","test":"bun ./src/test.ts && bun ./src/config-modal-test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"^0.34.49","@mariozechner/pi-tui":"^0.64.0","@mariozechner/pi-coding-agent":"^0.64.0"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.4.1_1775025884094_0.5604465489954535","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"pi-permission-system","version":"0.4.2","keywords":["pi-package","pi","pi-extension","pi-coding-agent","coding-agent","permissions","policy","access-control","authorization","security"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.4.2","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"4703de3139604f1dfe2a83f19ba35c9438f4b9ea","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.4.2.tgz","fileCount":29,"integrity":"sha512-o64RuhNIyFOUVQ5TLAt4VZ113uqFv+00zx1Lu/ZIczRKblPtZnAW+M7pD6dfz9Kx+gVt4QuKNXWoO0VYFzVEog==","signatures":[{"sig":"MEUCIAIwS7W1hUpm8itcHtCUJHbHSAxnvHzLbU7BHbNADh96AiEAglD/YUwqskweSCEVHhzodoY9TDgtL6277XPyrnPJ+tY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":235280},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"47084d6af8fb4b515dad4519c3487f9f6b11d287","scripts":{"lint":"npm run build","test":"bun ./tests/permission-system.test.ts && bun ./tests/config-modal.test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"^0.34.49","@mariozechner/pi-tui":"^0.67.68","@mariozechner/pi-coding-agent":"^0.67.68"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.4.2_1776699742281_0.6004278176335671","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"pi-permission-system","version":"0.4.3","keywords":["pi-package","pi","pi-extension","pi-coding-agent","coding-agent","permissions","policy","access-control","authorization","security"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.4.3","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"4529448db86ab04a7468a04a6e6f4714bc7377a2","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.4.3.tgz","fileCount":30,"integrity":"sha512-iDSNi0ERCY5V3iqCZC/ziUaKSAbzCZv4/lI/beO9mUz+mtiWz+VvsG/sZmVpbFM0VN30ORgjMf92/t7wkpBIjg==","signatures":[{"sig":"MEYCIQD3PDQ400h956XWd3cY9tzMr/YkXCjUgMzYu7/I/kGVvgIhALPIX5rZFZ6tIo76MlXmKVdToktonuBJAvL2kuBL3j7D","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":244498},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"9f7509ef5526a227f0b079999686c4775fca6c53","scripts":{"lint":"npm run build","test":"bun ./tests/permission-system.test.ts && bun ./tests/config-modal.test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"^0.34.49","@mariozechner/pi-tui":"^0.68.1","@mariozechner/pi-coding-agent":"^0.68.1"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.4.3_1776879759910_0.1754390819384204","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"pi-permission-system","version":"0.4.4","keywords":["pi-package","pi","pi-extension","pi-coding-agent","coding-agent","permissions","policy","access-control","authorization","security"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.4.4","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"5aa86504d99a95c452febc171d08d3f02d1686b1","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.4.4.tgz","fileCount":30,"integrity":"sha512-FK3yR5h4tSXG9khY8Pqnpl8qROI7GdoplrCNBcR49TT8VTraSlK6Dg4hPomX9cDQq/tWinMFU5fV6qxpaGDiSw==","signatures":[{"sig":"MEUCIQC5WIeySo+KkNK+1O6kMRNAE1WTvBrfN5xmkDl0SxgN/AIgKZxp8M9krUjV44+SPaInsUXHd/ypeqxAUqzaac8Aa8w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":270466},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"78f5c48aab6a94c7bb7356af4db1798340522848","scripts":{"lint":"npm run build","test":"bun ./tests/permission-system.test.ts && bun ./tests/config-modal.test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"^0.34.49","@mariozechner/pi-tui":"^0.70.2","@mariozechner/pi-coding-agent":"^0.70.2"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.4.4_1777094423637_0.03872145876769695","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"pi-permission-system","version":"0.4.5","keywords":["pi-package","pi","pi-extension","pi-coding-agent","coding-agent","permissions","policy","access-control","authorization","security"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.4.5","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"23404b5657d5f0dfe00aec30887ad0f79ba5a949","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.4.5.tgz","fileCount":31,"integrity":"sha512-zyIsUEHj8uNsMSyYc3cVV2o8Kxz9wQjKB9+QQzkz8GKS29wIwLx3MgQQmfqqLhS4Qm8uw/ikCMOYBCi/2nQCcA==","signatures":[{"sig":"MEUCIGmvwlmNAVfH15KHYVkaMuJOYYHPYyjK04Bty49Hr7AsAiEAov/lxoqSi/3EEHjYqWGX7g5eyhT1gcSmWrJ0KeJxGE4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":278323},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"e5a713b0e3a0149e2728b81c4ca85188ebe668eb","scripts":{"lint":"npm run build","test":"bun ./tests/permission-system.test.ts && bun ./tests/config-modal.test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"^0.34.49","@mariozechner/pi-ai":"^0.70.2","@mariozechner/pi-tui":"^0.70.2","@mariozechner/pi-coding-agent":"^0.70.2"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.4.5_1777296413432_0.10745018352332325","host":"s3://npm-registry-packages-npm-production"}},"0.4.6":{"name":"pi-permission-system","version":"0.4.6","keywords":["pi-package","pi","pi-extension","pi-coding-agent","coding-agent","permissions","policy","access-control","authorization","security"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.4.6","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"bf9cd0236eb04bbaf7b179b67f072cae3d774cf1","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.4.6.tgz","fileCount":31,"integrity":"sha512-Vx/rKqKK4TC0f+SisiN5EpPU2n8JGPpZoSaTlhA3VnFIGgEYp+2HegAFmX9dczFXW+7hjHTTf/HGemW0CVq7dQ==","signatures":[{"sig":"MEUCICYMQCd5ojNCONBDVGYcRt52S+Uxjc5ZfZVjvILkDujZAiEA5vTA9PwekRfeL8iic7RQkx581wtanlGeCZ0w6zxyLLI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":280176},"main":"./index.ts","type":"module","engines":{"node":">=20"},"exports":{".":"./index.ts"},"gitHead":"88034e0a8418174a284dc5b43651460daa0c44d7","scripts":{"lint":"npm run build","test":"bun ./tests/permission-system.test.ts && bun ./tests/config-modal.test.ts","build":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noCheck","check":"npm run lint && npm run test"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"^0.34.49","@mariozechner/pi-ai":"^0.70.5","@mariozechner/pi-tui":"^0.70.5","@mariozechner/pi-coding-agent":"^0.70.5"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.4.6_1777376245238_0.012198850882466639","host":"s3://npm-registry-packages-npm-production"}},"0.4.7":{"name":"pi-permission-system","version":"0.4.7","keywords":["pi-package","pi","pi-extension","pi-coding-agent","coding-agent","permissions","policy","access-control","authorization","security"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.4.7","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"ee57dc11b0ac04f3a779379be20a7dafa4a1b885","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.4.7.tgz","fileCount":30,"integrity":"sha512-Rzt8Jz/kQQ6+259sg/OqYXYpr7703ymNKEWg++YuHcor4hDezxheWoxvL7REBWT4VrbgVcChaCv+kgNTOEtvdQ==","signatures":[{"sig":"MEUCIQC9z5JQvHyVIWCphrg7U08gO/bmaqTPQBlD4aeWwQQnCQIgcdQJGo8Vxx1VY5cOvvPJBePQKMN5psQegt8Sx3bAPIg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":293747},"main":"./index.ts","type":"module","engines":{"bun":">=1.1.0","node":">=20"},"exports":{".":"./index.ts"},"gitHead":"9a745b886e30961abeb023a74cea76f57bed59e3","scripts":{"lint":"npm run typecheck","test":"bun ./tests/permission-system.test.ts && bun ./tests/config-modal.test.ts","build":"npm run typecheck","check":"npm run lint && npm run validate:artifacts && npm run test","typecheck":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noEmit","validate:artifacts":"node ./scripts/validate-artifacts.mjs"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"^0.34.49","@mariozechner/pi-ai":"^0.72.0","@mariozechner/pi-tui":"^0.72.0","@mariozechner/pi-coding-agent":"^0.72.0"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.4.7_1777859530150_0.03298898891029456","host":"s3://npm-registry-packages-npm-production"}},"0.4.8":{"name":"pi-permission-system","version":"0.4.8","keywords":["pi-package","pi","pi-extension","pi-coding-agent","coding-agent","permissions","policy","access-control","authorization","security"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.4.8","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"eb8cc2bf0463240a54c152501035285d757415fe","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.4.8.tgz","fileCount":31,"integrity":"sha512-AuDykfVCJr8y3dd+S5/1nJg0DyC50wdIKuuaVyy1OL5oL6+X0Pym1s5fo/NjIeBmIUh25YzWfPfE+SZlfwWBSw==","signatures":[{"sig":"MEUCICFnHagG3tvG3gNbv0mzO4Jm5CYzEBS1wHwVdvwmLaB7AiEAsAbZ9aAdqJDyd6G5cDZZxDfrVLQNYCOk5kXhZBw47Ag=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":307523},"main":"./index.ts","type":"module","engines":{"bun":">=1.1.0","node":">=20"},"exports":{".":"./index.ts"},"gitHead":"874d40a968cd50757407980ee30890a9489a580e","scripts":{"lint":"npm run typecheck","test":"bun ./tests/permission-system.test.ts && bun ./tests/config-modal.test.ts","build":"npm run typecheck","check":"npm run lint && npm run validate:artifacts && npm run test","typecheck":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noEmit","validate:artifacts":"node ./scripts/validate-artifacts.mjs"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"^0.34.49","@mariozechner/pi-ai":"^0.72.0","@mariozechner/pi-tui":"^0.72.0","@mariozechner/pi-coding-agent":"^0.72.0"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.4.8_1777872141171_0.805315124009399","host":"s3://npm-registry-packages-npm-production"}},"0.4.9":{"name":"pi-permission-system","version":"0.4.9","keywords":["pi-package","pi","pi-extension","pi-coding-agent","coding-agent","permissions","policy","access-control","authorization","security"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.4.9","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"63f065c647c447e4d5a31161daae257cafd473be","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.4.9.tgz","fileCount":32,"integrity":"sha512-vPFNATSulfXv/dRu/ulMduK8R/JXkfkxc1oHOhPYYsUS1qJQG6sePMz8tpXxgugpShlzCt4RRbtu2oxbQOeP/A==","signatures":[{"sig":"MEQCIGEyekOSO5xvvjVO/noz2eYqKvrwJsudJ56LyXGkHbG7AiAu27qkpR7WKYBzTLm1FH/Jgm6rA+D/c5/Y7N4y7NjE0A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":315971},"main":"./index.ts","type":"module","engines":{"bun":">=1.1.0","node":">=20"},"exports":{".":"./index.ts"},"gitHead":"cedd6d73e97e067dfb60fff6dadff6248fa0369d","scripts":{"lint":"npm run typecheck","test":"bun ./tests/permission-system.test.ts && bun ./tests/config-modal.test.ts","build":"npm run typecheck","check":"npm run lint && npm run validate:artifacts && npm run test","typecheck":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noEmit","validate:artifacts":"node ./scripts/validate-artifacts.mjs"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"jsonc-parser":"^3.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"^0.34.49","@mariozechner/pi-ai":"^0.72.0","@mariozechner/pi-tui":"^0.72.0","@mariozechner/pi-coding-agent":"^0.72.0"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.4.9_1777913761599_0.24850532409032478","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"pi-permission-system","version":"0.5.0","keywords":["pi-package","pi","pi-extension","pi-coding-agent","coding-agent","permissions","policy","access-control","authorization","security"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.5.0","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"b4666b47b5af0ebdda0c27622c181ca242b1d4bd","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.5.0.tgz","fileCount":32,"integrity":"sha512-Nk3XN2FeUESQ/nKsSpIeprkZSd6gH7Ir3GgArAeOA+P/L1r74du69SlM7HVc5FkOcKMDlWERcFxVFafuhz4tTg==","signatures":[{"sig":"MEQCIBTABcJpv+NkyzovSVPEWFoqFDz1FfoQEJc5EH0Nvg08AiB3UlE9rcRCrwGsLy3BnGnZVx8zaQzheacyN9aUBqExfA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":347244},"main":"./index.ts","type":"module","engines":{"bun":">=1.1.0","node":">=20"},"exports":{".":"./index.ts"},"gitHead":"008bf399d430d94f4dcbe31ca9fec6745ccbdc22","scripts":{"lint":"npm run typecheck","test":"bun ./tests/permission-system.test.ts && bun ./tests/config-modal.test.ts","build":"npm run typecheck","check":"npm run lint && npm run validate:artifacts && npm run test","typecheck":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noEmit","validate:artifacts":"node ./scripts/validate-artifacts.mjs"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"jsonc-parser":"^3.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"^0.34.49","@earendil-works/pi-ai":"^0.75.4","@earendil-works/pi-tui":"^0.75.4","@earendil-works/pi-coding-agent":"^0.75.4"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.5.0_1779463224677_0.21609799344480796","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"pi-permission-system","version":"0.6.0","keywords":["pi-package","pi","pi-extension","pi-coding-agent","coding-agent","permissions","policy","access-control","authorization","security"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.6.0","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"e06b061f4d0784a130230b3a497ec89851f20aa2","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.6.0.tgz","fileCount":32,"integrity":"sha512-ki67oQ1Ttj+aVc46Xm1Kh8FCO3yNii2w1jPLXjto0GUEpIXkwJh3OX+gJNO4UtGuswpj1YaGqPLh/P+9hArcoQ==","signatures":[{"sig":"MEQCIDin4r0CR72wul4hmU2xS4uRcuTl0VV+t7pk9Pr0CjWTAiAUJRbiH6dNF3T2Wb7Hsi0m1gu6WoCb1sbwWFLq7IAleQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":358329},"main":"./index.ts","type":"module","engines":{"bun":">=1.1.0","node":">=20"},"exports":{".":"./index.ts"},"gitHead":"8da1f293a129d1a7693b58ce48e9372d1870c856","scripts":{"lint":"npm run typecheck","test":"bun ./tests/permission-system.test.ts && bun ./tests/config-modal.test.ts","build":"npm run typecheck","check":"npm run lint && npm run validate:artifacts && npm run test","typecheck":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noEmit","validate:artifacts":"node ./scripts/validate-artifacts.mjs"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"jsonc-parser":"^3.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"^0.34.49","@earendil-works/pi-ai":"^0.74.0 || ^0.75.0","@earendil-works/pi-tui":"^0.74.0 || ^0.75.0","@earendil-works/pi-coding-agent":"^0.74.0 || ^0.75.0"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.6.0_1779842005919_0.3653988947463662","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"pi-permission-system","version":"0.7.0","keywords":["pi-package","pi","pi-extension","pi-coding-agent","coding-agent","permissions","policy","access-control","authorization","security"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.7.0","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"98f02759b906db882eb07a9395d98193a47b859d","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.7.0.tgz","fileCount":38,"integrity":"sha512-FBa6ycSUqck55Pg+9eHZrOPW9X7/OtZb5//a2+VkqAuyXBll2Y9COlQLA0U6pZ0dOHlKUMK+2G0dSiRmTc4ZZg==","signatures":[{"sig":"MEYCIQCrrimqvUWdZK99u0TRsJ/yI32TfSoOMwu/AUMran7IKQIhAIw08nsk9GVnaqf80xuvl+96vitGK1B0V04ptlbQqCXG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":463027},"main":"./index.ts","type":"module","engines":{"bun":">=1.1.0","node":">=20"},"exports":{".":"./index.ts"},"gitHead":"231c07d789e3c6fe6c94b254363a104937ff2e77","scripts":{"lint":"npm run typecheck","test":"bun ./tests/permission-system.test.ts && bun ./tests/config-modal.test.ts","build":"npm run typecheck","check":"npm run lint && npm run validate:artifacts && npm run test","typecheck":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noEmit","validate:artifacts":"node ./scripts/validate-artifacts.mjs"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"jsonc-parser":"^3.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"^0.34.49","@earendil-works/pi-ai":"^0.74.0 || ^0.75.0","@earendil-works/pi-tui":"^0.74.0 || ^0.75.0","@earendil-works/pi-coding-agent":"^0.74.0 || ^0.75.0"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.7.0_1780317908569_0.08629370135924885","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"pi-permission-system","version":"0.7.1","keywords":["pi-package","pi","pi-extension","pi-coding-agent","coding-agent","permissions","policy","access-control","authorization","security"],"author":{"name":"MasuRii"},"license":"MIT","_id":"pi-permission-system@0.7.1","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"pi":{"extensions":["./index.ts"]},"dist":{"shasum":"fa79e49b106db2c9d8ce9f78638279c1164a78aa","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.7.1.tgz","fileCount":44,"integrity":"sha512-TvIzIc9BTViXHzseuKpcuGvkKCE/IKHi14lsFhlsmFcPLu3stvN2VlHejNSQfydWcfcNo37LTf413iVQkRx31A==","signatures":[{"sig":"MEUCIE38yx1N9/avSxuBzdR4Bl38RoliHlCFXVzXoPKMIJ+AAiEAmUEyFwGPIZINgIzpAzOlgDqmsVNvWXlFvJ/TwoPkJik=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":565632},"main":"./index.ts","type":"module","engines":{"bun":">=1.1.0","node":">=20"},"exports":{".":"./index.ts"},"gitHead":"c8cc5d6ff1b58175610bda8fd970004932e30b81","scripts":{"lint":"npm run typecheck","test":"bun ./tests/permission-system.test.ts && bun ./tests/config-modal.test.ts && bun ./tests/edit-prompt-compaction-red.test.ts && bun ./tests/edit-decision-deduplication-red.test.ts","build":"npm run typecheck","check":"npm run lint && npm run validate:artifacts && npm run test","typecheck":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noEmit","validate:artifacts":"node ./scripts/validate-artifacts.mjs"},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"repository":{"url":"git+https://github.com/MasuRii/pi-permission-system.git","type":"git"},"_npmVersion":"11.11.0","description":"Permission enforcement extension for the Pi coding agent.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"jsonc-parser":"^3.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"@sinclair/typebox":"^0.34.49","@earendil-works/pi-ai":"^0.74.0 || ^0.75.0 || ^0.78.0 || ^0.79.0","@earendil-works/pi-tui":"^0.74.0 || ^0.75.0 || ^0.78.0 || ^0.79.0","@earendil-works/pi-coding-agent":"^0.74.0 || ^0.75.0 || ^0.78.0 || ^0.79.0"},"_npmOperationalInternal":{"tmp":"tmp/pi-permission-system_0.7.1_1781624992491_0.6578284503343381","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"pi-permission-system","version":"0.8.0","description":"Permission enforcement extension for the Pi coding agent.","type":"module","main":"./index.ts","exports":{".":"./index.ts"},"scripts":{"typecheck":"npx --yes -p typescript@5.7.3 tsc -p tsconfig.json --noEmit","build":"npm run typecheck","lint":"npm run typecheck","validate:artifacts":"node ./scripts/validate-artifacts.mjs","test":"bun ./tests/approved-fixes.test.ts && bun ./tests/config-modal.test.ts && bun ./tests/config-modal-theme-red.test.ts && bun ./tests/config-preservation-red.test.ts && bun ./tests/directory-resource-matching-red.test.ts && bun ./tests/edge-red-agent-name-traversal.test.ts && bun ./tests/edit-decision-deduplication-red.test.ts && bun ./tests/edit-prompt-compaction-red.test.ts && bun ./tests/permission-persistence-red.test.ts && bun ./tests/permission-system.test.ts && bun ./tests/session-permanent-permission.test.ts && bun ./tests/types-shims-coverage.test.ts && bun ./tests/wildcard-multiline.test.ts && bun ./tests/wildcard-redos.test.ts","test:issue23":"bun ./tests/session-permanent-permission.test.ts","check":"npm run lint && npm run validate:artifacts && npm run test","postinstall":"node -e \"const fs=require('fs'),cp=require('child_process'),p=require('path');const cwd=process.cwd();const normalized=cwd.split(p.sep).join('/');if(!normalized.includes('/.pi/agent/extensions/'))process.exit(0);const s=p.resolve(cwd,'../../scripts/patch-vulnerable-deps.mjs');if(!fs.existsSync(s))process.exit(0);const r=cp.spawnSync(process.execPath,[s,'--target',cwd,'--quiet'],{stdio:'inherit'});process.exit(r.status||0)\""},"keywords":["pi-package","pi","pi-extension","pi-coding-agent","coding-agent","permissions","policy","access-control","authorization","security"],"author":{"name":"MasuRii"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/MasuRii/pi-permission-system.git"},"homepage":"https://github.com/MasuRii/pi-permission-system#readme","bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"engines":{"node":">=20","bun":">=1.1.0"},"publishConfig":{"access":"public"},"pi":{"extensions":["./index.ts"]},"peerDependencies":{"@sinclair/typebox":"^0.34.49","@earendil-works/pi-ai":"^0.74.0 || ^0.75.0 || ^0.78.0 || ^0.79.0 || ^0.80.0","@earendil-works/pi-coding-agent":"^0.74.0 || ^0.75.0 || ^0.78.0 || ^0.79.0 || ^0.80.0","@earendil-works/pi-tui":"^0.74.0 || ^0.75.0 || ^0.78.0 || ^0.79.0 || ^0.80.0"},"dependencies":{"jsonc-parser":"^3.3.1"},"overrides":{"protobufjs":"7.6.3","ws":"8.21.0"},"devDependencies":{"@earendil-works/pi-coding-agent":"^0.80.3"},"_id":"pi-permission-system@0.8.0","gitHead":"9affcc9d1b52cd79b8bb7da2bebb761ac7e5b1d8","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-pGogaOxM5HQpjW4sVUkrJI7+6+HrENp0hBxUF3YYriNWesL5PqC5SECvfJvw0LRJAEMvOtM82gCk5A2gzpnh1w==","shasum":"1838280e418c80a48ebe12e0a2b8ccefb5347bab","tarball":"https://registry.npmjs.org/pi-permission-system/-/pi-permission-system-0.8.0.tgz","fileCount":47,"unpackedSize":660673,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGSX2MtSCwKjKOnx7MRZlUdCuCOlLX/3V32O/Bpp9Hk0AiEApobKok5NTDJYvQcQV7+LjkULlsMXGDPHfl6pJgSc5VI="}]},"_npmUser":{"name":"masurii","email":"kanjiharigana@gmail.com"},"directories":{},"maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-permission-system_0.8.0_1783049621233_0.4547688978693005"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-02T07:28:24.233Z","modified":"2026-07-03T03:33:41.524Z","0.1.0":"2026-03-02T07:28:24.456Z","0.1.1":"2026-03-02T07:36:41.504Z","0.1.2":"2026-03-03T18:37:22.926Z","0.1.3":"2026-03-03T18:44:11.347Z","0.1.4":"2026-03-07T02:46:01.524Z","0.1.5":"2026-03-09T10:17:38.817Z","0.1.6":"2026-03-09T10:26:57.019Z","0.1.7":"2026-03-09T17:13:29.458Z","0.1.8":"2026-03-09T18:04:16.403Z","0.2.0":"2026-03-12T08:48:56.179Z","0.2.1":"2026-03-12T14:20:23.874Z","0.2.2":"2026-03-12T18:46:56.941Z","0.3.0":"2026-03-23T11:32:17.550Z","0.3.1":"2026-03-23T22:38:26.254Z","0.4.0":"2026-04-01T03:26:36.871Z","0.4.1":"2026-04-01T06:44:44.308Z","0.4.2":"2026-04-20T15:42:22.433Z","0.4.3":"2026-04-22T17:42:40.073Z","0.4.4":"2026-04-25T05:20:23.779Z","0.4.5":"2026-04-27T13:26:53.570Z","0.4.6":"2026-04-28T11:37:25.384Z","0.4.7":"2026-05-04T01:52:10.301Z","0.4.8":"2026-05-04T05:22:21.310Z","0.4.9":"2026-05-04T16:56:01.738Z","0.5.0":"2026-05-22T15:20:24.889Z","0.6.0":"2026-05-27T00:33:26.051Z","0.7.0":"2026-06-01T12:45:08.727Z","0.7.1":"2026-06-16T15:49:52.634Z","0.8.0":"2026-07-03T03:33:41.364Z"},"bugs":{"url":"https://github.com/MasuRii/pi-permission-system/issues"},"author":{"name":"MasuRii"},"license":"MIT","homepage":"https://github.com/MasuRii/pi-permission-system#readme","keywords":["pi-package","pi","pi-extension","pi-coding-agent","coding-agent","permissions","policy","access-control","authorization","security"],"repository":{"type":"git","url":"git+https://github.com/MasuRii/pi-permission-system.git"},"description":"Permission enforcement extension for the Pi coding agent.","maintainers":[{"name":"masurii","email":"kanjiharigana@gmail.com"}],"readme":"<div align=\"center\">\r\n\r\n# pi-permission-system\r\n\r\n[![npm version](https://img.shields.io/npm/v/pi-permission-system?style=for-the-badge)](https://www.npmjs.com/package/pi-permission-system)\r\n[![License](https://img.shields.io/github/license/MasuRii/pi-permission-system?style=for-the-badge)](LICENSE)\r\n[![Platform](https://img.shields.io/badge/Platform-macOS%20%7C%20Linux%20%7C%20Windows-blue?style=for-the-badge)]()\r\n\r\n[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/Y8Y01PSSVR)\r\n\r\nPermission enforcement extension for the Pi coding agent that provides centralized, deterministic permission gates for tool, bash, MCP, skill, and special operations.\r\n<img width=\"1360\" height=\"752\" alt=\"image\" src=\"https://github.com/user-attachments/assets/3e85190a-17fa-4d94-ac8e-efa54337df5d\" />\r\n\r\n</div>\r\n\r\n## Coming from OpenCode?\r\n\r\nYes — this extension was designed so OpenCode-style agent permission policies can be ported into Pi with minimal friction.\r\n\r\n### Start here\r\n\r\n| If you have this in OpenCode | In Pi, use this |\r\n|---|---|\r\n| Agent markdown file | `~/.pi/agent/agents/<agent-name>.md` (respects `PI_CODING_AGENT_DIR`) |\r\n| YAML frontmatter | Same place: top of the markdown file |\r\n| Agent instructions / system prompt body | Same file, below frontmatter |\r\n| Agent permission rules | `permission:` inside that same frontmatter |\r\n\r\n### Important compatibility notes\r\n\r\n- **Agents are still markdown files with YAML frontmatter.**\r\n- **Wildcard permissions still use last-match-wins ordering.**\r\n- **Resource-qualified path rules are supported for path-bearing tools.** Use action-scoped `tools` keys like `read:/home/alice/project/generated/*` and scoped special keys like `external_directory:/home/alice/shared/*` when you need OpenCode-style directory rules.\r\n- **Keep frontmatter simple when porting.** This extension intentionally supports `key: value` scalars and nested maps, not full YAML features like arrays, anchors, or multiline scalars.\r\n\r\n### Minimal Pi agent example\r\n\r\n```md\r\n---\r\nname: my-agent\r\nmode: primary\r\ndescription: My ported agent\r\npermission:\r\n  tools:\r\n    read: allow\r\n    grep: allow\r\n  bash:\r\n    \"*\": ask\r\n  mcp:\r\n    \"*\": ask\r\n---\r\n\r\nYour agent instructions go here.\r\n```\r\n\r\n### Compatibility matrix\r\n\r\n| OpenCode concept | Pi equivalent with this extension | Compatibility | Porting notes |\r\n|---|---|---:|---|\r\n| Agent markdown files with YAML frontmatter | `~/.pi/agent/agents/<agent-name>.md` | High | Your agent-local `permission:` frontmatter pattern carries over cleanly. |\r\n| Wildcard precedence | Same last-declared-match-wins behavior | High | Broad rules first, specific overrides later. |\r\n| `bash` permission rules | `permission.bash` | High | Command-pattern gating ports cleanly. |\r\n| Per-tool permission rules like `read`, `grep`, `list`, `task`, or arbitrary extension tool names | `permission.tools` | Medium-High | Pi groups registered tool names under `tools`, including built-ins and extension tools. |\r\n| `external_directory` | `permission.special.external_directory` or `permission.special.external_directory:<path>/*` | Medium-High | Coarse fallback stays supported; add resource-qualified rules for specific outside-worktree directories. |\r\n| `doom_loop` | `permission.special.doom_loop` | Medium | Same idea, different location. |\r\n| `skill` permission rules | `permission.skills` | Medium | Same purpose, but Pi uses a dedicated plural `skills` section. |\r\n| MCP-related access | `permission.mcp` for proxy targets, `permission.tools` for direct registered tools | Medium | This is the biggest Pi-specific difference: proxy MCP targets and direct tool names are intentionally split. |\r\n| OpenCode-specific permissions like `webfetch`, `websearch`, `question`, `lsp`, `todowrite` | Usually extension-specific Pi tool names under `permission.tools` | Low-Medium | These do not have universal built-in one-to-one Pi names; map them to the actual registered tools available in your Pi setup. |\r\n\r\n### Most important difference\r\n\r\nIn OpenCode, many permission names live in one broad permission namespace. In Pi with this extension, there is a deliberate split:\r\n\r\n| Use this when... | Put the rule here |\r\n|---|---|\r\n| You are targeting the registered **`mcp` proxy tool** and its internal server/tool targets | `permission.mcp` |\r\n| You are targeting an actual registered tool name, including direct extension tools like `context7_*`, `github_*`, or `exa_*` | `permission.tools` |\r\n\r\n### Fast porting guide\r\n\r\n| If your OpenCode agent has... | In Pi, do this |\r\n|---|---|\r\n| `permission.bash` rules | Move them into `permission.bash` |\r\n| `permission.external_directory` | Move it to `permission.special.external_directory` |\r\n| `permission.doom_loop` | Move it to `permission.special.doom_loop` |\r\n| `permission.skill` rules | Move them to `permission.skills` |\r\n| Tool-ish permissions like `read`, `grep`, `list`, `task`, or third-party tool names | Put them in `permission.tools` |\r\n| MCP server/tool target logic | Put proxy-target rules in `permission.mcp` |\r\n\r\n### Practical takeaway\r\n\r\nIf you are coming from OpenCode, you usually do **not** need to rewrite your whole agent. In most cases, porting is just:\r\n\r\n1. Keep the agent markdown/frontmatter structure.\r\n2. Move OpenCode-style tool permissions into Pi's `tools` section.\r\n3. Move `external_directory` and `doom_loop` into `special`.\r\n4. Split MCP proxy target rules into `mcp` and direct registered tool rules into `tools`.\r\n\r\n## Features\r\n\r\n- **Tool Filtering** — Hides disallowed tools from the agent before it starts (reduces \"try another tool\" behavior)\r\n- **System Prompt Sanitization** — Removes denied tool entries from the `Available tools:` system prompt section so the agent only sees tools it can actually call\r\n- **Runtime Enforcement** — Blocks/asks/allows at tool call time with UI confirmation dialogs and readable approval summaries\r\n- **Bash Command Control** — Wildcard pattern matching for granular bash command permissions\r\n- **MCP Access Control** — Server and tool-level permissions for MCP operations\r\n- **Skill Protection** — Controls which skills can be loaded or read from disk, including multi-block prompt sanitization and path-inferred reads under Pi skill directories\r\n- **Per-Agent Overrides** — Agent-specific permission policies via YAML frontmatter\r\n- **Subagent Permission Forwarding** — Forwards `ask` confirmations from non-UI subagents back to the main interactive session\r\n- **Runtime YOLO Control** — Lets users toggle yolo mode from the settings modal and lets other extensions toggle it through the runtime API\r\n- **File-Based Debug Logging** — Writes verbose diagnostics and permission request/denial review entries to one debug file when enabled in `config.json`, including the responsible agent and raw tool-call input\r\n- **JSON Schema Validation** — Full schema for editor autocomplete and config validation\r\n- **External Directory Guard** — Enforces `special.external_directory` for path-bearing file tools that target paths outside the active working directory\r\n\r\n## Installation\r\n\r\n### npm package\r\n\r\n```bash\r\npi install npm:pi-permission-system\r\n```\r\n\r\n### Local extension folder\r\n\r\nPlace this folder in one of the following locations:\r\n\r\n| Scope   | Path |\r\n|---------|------|\r\n| Global default | `~/.pi/agent/extensions/pi-permission-system` (respects `PI_CODING_AGENT_DIR`) |\r\n| Project | `.pi/extensions/pi-permission-system` |\r\n\r\nPi auto-discovers extensions in these paths.\r\n\r\n> **Tip:** All `~/.pi/agent` paths shown in this document are defaults. If the `PI_CODING_AGENT_DIR` environment variable is set, pi uses that directory instead. The extension automatically follows pi's `getAgentDir()` helper for extension installation, session directories, and extension-local config paths. If you need policy lookup to come from a different global agent root, set `PI_PERMISSION_SYSTEM_POLICY_AGENT_DIR`.\r\n\r\n## Usage\r\n\r\n### Quick Start\r\n\r\n1. Create the global policy file at the Pi agent runtime root (default: `~/.pi/agent/pi-permissions.jsonc`, respects `PI_CODING_AGENT_DIR`):\r\n\r\n```jsonc\r\n{\r\n  \"defaultPolicy\": {\r\n    \"tools\": \"ask\",\r\n    \"bash\": \"ask\",\r\n    \"mcp\": \"ask\",\r\n    \"skills\": \"ask\",\r\n    \"special\": \"ask\"\r\n  },\r\n  \"tools\": {\r\n    \"read\": \"allow\",\r\n    \"write\": \"deny\"\r\n  }\r\n}\r\n```\r\n\r\n2. Start Pi — the extension automatically loads and enforces your policy.\r\n\r\n### Permission States\r\n\r\nAll permissions use one of three states:\r\n\r\n| State   | Behavior                                    |\r\n|---------|---------------------------------------------|\r\n| `allow` | Permits the action silently                 |\r\n| `deny`  | Blocks the action with an error message     |\r\n| `ask`   | Prompts the user for confirmation via UI    |\r\n\r\nWhen an `ask` permission prompts, the confirmation UI offers `Allow Once`, `Allow Always`, `Reject`, and `Reject with Reason`. `Allow Once` approves only the current request. `Allow Always` records an explicit matching approval for the current session only (in-memory, not persisted to disk), while plain `Reject` and `Reject with Reason` deny only the current request and do not silently become future defaults. YOLO/auto-response approvals also do not create saved approval rules; after YOLO mode is disabled, matching `ask` requests require approval again. A configured `deny` remains a hard boundary and is not relaxed by prior one-shot, auto-response, or saved approvals.\r\n\r\n### Pi Integration Hooks\r\n\r\nThe extension integrates via Pi's lifecycle hooks:\r\n\r\n| Hook                 | Behavior                                                                                  |\r\n|----------------------|-------------------------------------------------------------------------------------------|\r\n| `before_agent_start` | Filters active tools, removes denied tool entries from the system prompt, and hides denied skills |\r\n| `tool_call`          | Enforces permissions for every tool invocation                                            |\r\n| `input`              | Tracks explicit `/skill:<name>` requests so user-invoked skill loads can proceed while agent-initiated reads remain policy-gated |\r\n\r\n**Additional behaviors:**\r\n- Unknown/unregistered tools are blocked before permission checks (prevents bypass attempts)\r\n- The `Available tools:` system prompt section is rewritten to match the filtered active tool set\r\n- Extension-provided tools like `task`, `mcp`, and third-party tools are handled through the same registered-tool permission layer instead of private built-in hardcodes\r\n- When a subagent hits an `ask` permission without direct UI access, the request can be forwarded to the main interactive session for confirmation\r\n- Generic extension-tool approval prompts include a bounded input preview; built-in file tools use concise human-readable summaries instead of raw multiline JSON\r\n- Debug review entries include the responsible agent, raw prompt, raw tool-call input, command, target, and decision metadata for auditing.\r\n- Path-bearing file tools (`read`, `write`, `edit`, `find`, `grep`, `ls`) evaluate `special.external_directory` before their normal tool permission when an explicit path points outside `ctx.cwd`\r\n- `read` calls under global and project Pi skill directories are checked against `skills` policy even when the skill entry is inferred from the path rather than an active prompt block.\r\n- Structured edit payloads are summarized by operation and line count in prompts so permission decisions do not require raw multiline JSON.\r\n\r\n## Configuration\r\n\r\n### Extension Config File\r\n\r\n**Location:** global Pi extension config (default: `~/.pi/agent/extensions/pi-permission-system/config.json`, respects `PI_CODING_AGENT_DIR`)\r\n\r\nSet `PI_PERMISSION_SYSTEM_CONFIG_PATH` to point this extension at a specific config file when the default global path is not appropriate.\r\n\r\nThe extension creates this file automatically when it is missing. It controls extension-local debug logging behavior and yolo mode defaults:\r\n\r\n```json\r\n{\r\n  \"enabled\": true,\r\n  \"debug\": false,\r\n  \"yoloMode\": false\r\n}\r\n```\r\n\r\n| Key | Default | Description |\r\n|-----|---------|-------------|\r\n| `enabled` | `true` | Master switch. When `false`, the extension skips all registrations and startup work (permission hooks, commands, runtime API, forwarding). |\r\n| `debug` | `false` | Enables verbose diagnostics and permission review entries in `logs/pi-permission-system-debug.jsonl` |\r\n| `yoloMode` | `false` | Auto-approves `ask` results instead of prompting when yolo mode is enabled |\r\n\r\nDebug output writes only under the extension directory by default. Set `PI_PERMISSION_SYSTEM_LOGS_DIR` to redirect the debug file to a specific directory. No debug output is printed to the terminal.\r\n\r\n### Runtime YOLO Control\r\n\r\nUse `/permission-system` to open the settings modal and inspect or change yolo mode interactively. In interactive TUI mode, the settings modal uses Pi's renderer-provided theme and does not require a separate global `initTheme()` call before opening.\r\n\r\nOther extensions can toggle yolo mode immediately through the shared runtime API:\r\n\r\n```ts\r\ntype PermissionSystemGlobal = typeof globalThis & {\r\n  __piPermissionSystem?: {\r\n    toggleYoloMode(options?: { persist?: boolean; source?: string }): { error?: string };\r\n  };\r\n};\r\n\r\npi.registerShortcut(\"f8\", {\r\n  description: \"Toggle pi-permission-system YOLO mode\",\r\n  handler: () => {\r\n    const permissionSystem = (globalThis as PermissionSystemGlobal).__piPermissionSystem;\r\n    const result = permissionSystem?.toggleYoloMode({ source: \"my-extension\" });\r\n    if (result?.error) {\r\n      // Notify or log the error in your extension.\r\n    }\r\n  },\r\n});\r\n```\r\n\r\nThe runtime API exposes `getYoloMode()`, `setYoloMode(enabled, options?)`, and `toggleYoloMode(options?)`. Runtime updates persist to `config.json` by default; pass `{ persist: false }` for a current-session-only toggle.\r\n\r\n### Global Policy File\r\n\r\n**Location:** global Pi policy file (default: `~/.pi/agent/pi-permissions.jsonc`, respects `PI_PERMISSION_SYSTEM_POLICY_AGENT_DIR` when set and otherwise follows `PI_CODING_AGENT_DIR`)\r\n\r\nThe policy file is a JSON object with these sections:\r\n\r\n| Section         | Description                                         |\r\n|-----------------|-----------------------------------------------------|\r\n| `defaultPolicy` | Fallback permissions per category                   |\r\n| `tools`         | Pattern-based tool permissions for registered tools |\r\n| `bash`          | Command pattern permissions                         |\r\n| `mcp`           | MCP server/tool permissions for calls routed through a registered `mcp` tool |\r\n| `skills`        | Skill name pattern permissions                      |\r\n| `special`       | Reserved permission checks such as external directory access |\r\n\r\n> **Note:** JSONC comments and trailing commas are supported. If parsing still fails, the extension falls back to `ask` for all categories and shows a warning in the TUI when available.\r\n\r\n### Global Per-Agent Overrides\r\n\r\nOverride global permissions for specific agents via YAML frontmatter in the global Pi agents directory (default: `~/.pi/agent/agents/<agent-name>.md`, respects `PI_PERMISSION_SYSTEM_POLICY_AGENT_DIR` when set and otherwise follows `PI_CODING_AGENT_DIR`):\r\n\r\n```yaml\r\n---\r\nname: my-agent\r\npermission:\r\n  tools:\r\n    read: allow\r\n    write: deny\r\n    mcp: allow\r\n  bash:\r\n    git status: allow\r\n    git *: ask\r\n  mcp:\r\n    chrome_devtools_*: deny\r\n    exa_*: allow\r\n  skills:\r\n    \"*\": ask\r\n---\r\n```\r\n\r\n**MCP behavior:** `permission.tools.mcp` is the coarse entry/fallback permission for a registered `mcp` tool when one is available. More specific `permission.mcp` target rules override that fallback when they match.\r\n\r\n**Limitations:** The frontmatter parser is intentionally minimal. Use only `key: value` scalars and nested maps. Avoid arrays, multi-line scalars, and YAML anchors. If you are porting from OpenCode, simplify richer YAML frontmatter before expecting a clean migration.\r\n\r\n### Project-Level Policy Files\r\n\r\nThe extension can also layer project-local permission files relative to the active session working directory:\r\n\r\n| Scope | Path |\r\n|-------|------|\r\n| Project policy | `<cwd>/.pi/agent/pi-permissions.jsonc` |\r\n| Project agent override | `<cwd>/.pi/agent/agents/<agent-name>.md` |\r\n\r\nProject-local files use the same formats as the global policy file and global agent frontmatter. These project files are resolved from Pi's current session `cwd`, so they are workspace-specific and do **not** move under `PI_CODING_AGENT_DIR`.\r\n\r\n**Precedence order:**\r\n1. Global policy file\r\n2. Project policy file\r\n3. Global agent frontmatter\r\n4. Project agent frontmatter\r\n\r\nLater trusted layers override earlier layers within the same permission category, and project-local layers can tighten policy by adding `deny` rules. Project-local policy cannot relax a `deny` from the global policy file or global agent frontmatter: an `allow` or `ask` in a project policy is ignored when the latest matching trusted layer is `deny`. For wildcard-based sections like `tools`, `bash`, `mcp`, `skills`, and `special`, matching still follows **last matching rule wins** within the applicable trust boundary, with global/system `deny` rules acting as floors for project-local overrides.\r\n\r\n---\r\n\r\n## Policy Reference\r\n\r\n### `defaultPolicy`\r\n\r\nSets fallback permissions when no specific rule matches:\r\n\r\n```jsonc\r\n{\r\n  \"defaultPolicy\": {\r\n    \"tools\": \"ask\",\r\n    \"bash\": \"ask\",\r\n    \"mcp\": \"ask\",\r\n    \"skills\": \"ask\",\r\n    \"special\": \"ask\"\r\n  }\r\n}\r\n```\r\n\r\n### `tools`\r\n\r\nControls tools by registered name pattern. This is the recommended standalone format for **all** tool entries, including Pi built-ins and arbitrary third-party extension tools. Patterns use `*` wildcards and follow last-declared-match semantics, so put broad fallbacks first and specific overrides later.\r\n\r\n| Tool name example     | Description |\r\n|-----------------------|-------------|\r\n| `bash`                | Shell command execution (tool-level fallback before `bash` pattern rules) |\r\n| `read` / `write`      | Canonical Pi built-in file tools |\r\n| `mcp`                 | Registered MCP proxy tool entry/fallback when available |\r\n| `task`                | Delegation tool handled like any other registered extension tool |\r\n| `third_party_tool`    | Arbitrary registered extension tool |\r\n| `context7_*`          | Wildcard for direct tools registered by another extension |\r\n| `*`                   | Fallback for every registered tool not matched by a later rule |\r\n\r\n```jsonc\r\n{\r\n  \"tools\": {\r\n    \"*\": \"ask\",\r\n    \"context7_*\": \"ask\",\r\n    \"third_party_tool\": \"ask\",\r\n    \"mcp\": \"allow\",\r\n    \"read\": \"allow\",\r\n    \"write\": \"deny\"\r\n  }\r\n}\r\n```\r\n\r\nUnknown or absent tools are not required in the config. If another extension is not installed, its tool simply will not be registered at runtime, and this extension will block attempts to call that missing tool before permission checks run. Wildcard `tools` rules apply to direct tools from any extension; no adapter-specific naming is required.\r\n\r\nPath-bearing built-ins (`read`, `write`, `edit`, `find`, `grep`, `ls`) can also use action/resource keys in `tools` with normalized absolute paths. Use this when a tool should be allowed or denied only for a specific directory resource:\r\n\r\n```jsonc\r\n{\r\n  \"tools\": {\r\n    \"read\": \"ask\",\r\n    \"read:/home/alice/project/generated/*\": \"allow\",\r\n    \"write\": \"deny\"\r\n  }\r\n}\r\n```\r\n\r\nAction-scoped resource rules still respect normal permission guardrails: matching uses the same wildcard/last-match behavior as other tool rules, and outside-worktree paths must also satisfy the `special.external_directory` check.\r\n\r\n> **Note:** Setting `tools.bash` affects the *default* for bash commands, but `bash` patterns can provide command-level overrides.\r\n>\r\n> **Note:** Setting `tools.mcp` controls coarse access to a registered `mcp` proxy tool when one is available. Specific `mcp` rules still override it when a proxy target pattern matches. Direct MCP tools registered by extensions are regular registered tools and should be controlled with `tools` patterns such as `context7_*` or `github_*`.\r\n>\r\n> **Note:** Top-level shorthand is only supported for the canonical Pi built-ins (`bash`, `read`, `write`, `edit`, `grep`, `find`, `ls`) in agent frontmatter. Use `permission.tools.<name>` for `mcp`, `task`, and any third-party tool.\r\n\r\n### `bash`\r\n\r\nCommand patterns use `*` wildcards and match against the full command string. If multiple patterns match, the **last declared matching rule wins**. Put broad fallback rules first and more specific overrides later.\r\n\r\n```jsonc\r\n{\r\n  \"bash\": {\r\n    \"git *\": \"ask\",\r\n    \"git status\": \"allow\",\r\n    \"rm -rf *\": \"deny\"\r\n  }\r\n}\r\n```\r\n\r\n### `mcp`\r\n\r\nMCP permissions match against derived targets from tool input. These rules are more specific than `tools.mcp` and override that fallback when a pattern matches:\r\n\r\n| Target Type       | Examples                                    |\r\n|-------------------|---------------------------------------------|\r\n| Baseline ops      | `mcp_status`, `mcp_list`, `mcp_search`, `mcp_describe`, `mcp_connect` |\r\n| Server name       | `myServer`                                  |\r\n| Server/tool combo | `myServer:search`, `myServer_search`        |\r\n| Generic           | `mcp_call`                                  |\r\n\r\n```jsonc\r\n{\r\n  \"mcp\": {\r\n    \"*\": \"ask\",\r\n    \"myServer:*\": \"ask\",\r\n    \"mcp_status\": \"allow\",\r\n    \"mcp_list\": \"allow\",\r\n    \"dangerousServer\": \"deny\"\r\n  }\r\n}\r\n```\r\n\r\n> **Note:** Baseline discovery targets may auto-allow when you permit any MCP rule.\r\n\r\n#### MCP Tool Fallback via `tools.mcp`\r\n\r\nA registered `mcp` tool can use `tools.mcp` as an entry permission point. This provides a fallback when no specific MCP pattern matches:\r\n\r\n```jsonc\r\n{\r\n  \"tools\": {\r\n    \"mcp\": \"allow\"\r\n  }\r\n}\r\n```\r\n\r\nThis is useful for per-agent configurations where you want to grant MCP access broadly:\r\n\r\n```yaml\r\n# In the global Pi agents directory (default: ~/.pi/agent/agents/researcher.md; respects PI_CODING_AGENT_DIR)\r\n---\r\nname: researcher\r\npermission:\r\n  tools:\r\n    mcp: allow\r\n---\r\n```\r\n\r\nThe permission resolution order for MCP operations:\r\n1. Specific `mcp` patterns (e.g., `myServer:toolName`, `myServer_*`)\r\n2. `tools.mcp` fallback (if set)\r\n3. `defaultPolicy.mcp`\r\n\r\n### `skills`\r\n\r\nSkill name patterns use `*` wildcards:\r\n\r\n```jsonc\r\n{\r\n  \"skills\": {\r\n    \"*\": \"ask\",\r\n    \"dangerous-*\": \"deny\"\r\n  }\r\n}\r\n```\r\n\r\nSkill-read enforcement also applies when a `read` path is under the global Pi skills directory (`~/.pi/agent/skills` or `PI_CODING_AGENT_DIR/skills`) or the active project's `.pi/agent/skills` directory. In that case the skill name is inferred from the path and checked against `skills` policy even if no active prompt block listed the skill; direct user `/skill:<name>` requests are allowed to proceed for that requested skill.\r\n### `special`\r\n\r\nReserved permission checks:\r\n\r\n| Key                  | Description                              |\r\n|----------------------|------------------------------------------|\r\n| `doom_loop`          | Controls doom loop detection behavior    |\r\n| `external_directory` | Coarse fallback for ask/allow/deny decisions on path-bearing built-in tools (`read`, `write`, `edit`, `find`, `grep`, `ls`) when they target paths outside the active working directory |\r\n| `external_directory:<path>/*` | Resource-qualified external-directory rule for a specific normalized outside-worktree directory |\r\n\r\n```jsonc\r\n{\r\n  \"special\": {\r\n    \"doom_loop\": \"deny\",\r\n    \"external_directory\": \"ask\",\r\n    \"external_directory:/home/alice/shared/*\": \"allow\"\r\n  }\r\n}\r\n```\r\n\r\n`external_directory` is evaluated before the normal tool permission check. For example, `tools.read: \"allow\"` can permit ordinary reads while `special.external_directory: \"ask\"` still requires confirmation before reading `../outside.txt` or an absolute path outside `ctx.cwd`. Add `external_directory:<normalized-absolute-directory>/*` when a known outside directory should be allowed or denied without changing the coarse fallback. Optional-path search tools (`find`, `grep`, `ls`) skip this check when no `path` is provided because they default to the active working directory.\r\n\r\n---\r\n\r\n## Common Recipes\r\n\r\n### Read-Only Mode\r\n\r\n```jsonc\r\n{\r\n  \"defaultPolicy\": { \"tools\": \"ask\", \"bash\": \"ask\", \"mcp\": \"ask\", \"skills\": \"ask\", \"special\": \"ask\" },\r\n  \"tools\": {\r\n    \"read\": \"allow\",\r\n    \"grep\": \"allow\",\r\n    \"find\": \"allow\",\r\n    \"ls\": \"allow\",\r\n    \"write\": \"deny\",\r\n    \"edit\": \"deny\"\r\n  }\r\n}\r\n```\r\n\r\n### Restricted Bash Surface\r\n\r\n```jsonc\r\n{\r\n  \"defaultPolicy\": { \"tools\": \"ask\", \"bash\": \"deny\", \"mcp\": \"ask\", \"skills\": \"ask\", \"special\": \"ask\" },\r\n  \"bash\": {\r\n    \"git *\": \"ask\",\r\n    \"git status\": \"allow\",\r\n    \"git diff\": \"allow\",\r\n    \"git log *\": \"allow\"\r\n  }\r\n}\r\n```\r\n\r\n### MCP Discovery Only\r\n\r\n```jsonc\r\n{\r\n  \"defaultPolicy\": { \"tools\": \"ask\", \"bash\": \"ask\", \"mcp\": \"ask\", \"skills\": \"ask\", \"special\": \"ask\" },\r\n  \"mcp\": {\r\n    \"*\": \"ask\",\r\n    \"mcp_status\": \"allow\",\r\n    \"mcp_list\": \"allow\",\r\n    \"mcp_search\": \"allow\",\r\n    \"mcp_describe\": \"allow\"\r\n  }\r\n}\r\n```\r\n\r\n### Per-Agent Lockdown\r\n\r\nIn the global Pi agents directory (default: `~/.pi/agent/agents/reviewer.md`, respects `PI_CODING_AGENT_DIR`):\r\n\r\n```yaml\r\n---\r\npermission:\r\n  tools:\r\n    write: deny\r\n    edit: deny\r\n  bash:\r\n    \"*\": deny\r\n---\r\n```\r\n\r\n---\r\n\r\n## Technical Details\r\n\r\n### Permission Prompt Summaries\r\n\r\nWhen a tool permission resolves to `ask`, the prompt is designed to be readable enough for an informed approval decision:\r\n\r\n- `bash` prompts show the command and matched bash pattern when available.\r\n- `mcp` prompts show the derived MCP target and matched rule when available.\r\n- Built-in file tools show concise summaries, such as the target path and edit/write line counts, instead of raw multiline JSON.\r\n- Unknown or third-party extension tools show a bounded single-line JSON preview of the input so users are not asked to approve a blind tool name.\r\n\r\nExample edit approval prompt:\r\n\r\n```text\r\nCurrent agent requested tool 'edit' for '.gitignore' (1 replacement: edit #1 replaces 5 lines with 2 lines). Allow this call?\r\n```\r\n\r\n### Subagent Permission Forwarding\r\n\r\nWhen a delegated or routed subagent runs without direct UI access, `ask` permissions can still be enforced by forwarding the confirmation request through Pi session directories. The main interactive session polls for forwarded requests, shows the confirmation prompt, writes the response, and the subagent resumes once that decision is available.\r\n\r\nThis keeps `ask` policies usable even when the original permission check happens inside a non-UI execution context.\r\n\r\n### Logging\r\n\r\nWhen the extension prompts, denies, or forwards permission requests, it can append structured JSONL entries under:\r\n\r\n```text\r\nDefault global logs directory: ~/.pi/agent/extensions/pi-permission-system/logs/\r\nActual global logs directory: $PI_CODING_AGENT_DIR/extensions/pi-permission-system/logs when PI_CODING_AGENT_DIR is set\r\nOverride logs directory: $PI_PERMISSION_SYSTEM_LOGS_DIR when set\r\n```\r\n\r\n- `pi-permission-system-debug.jsonl` — disabled by default; includes troubleshooting diagnostics and permission review/audit entries with responsible agent metadata, raw prompts, raw tool-call inputs, commands, targets, and decisions\r\n\r\n### Architecture\r\n\r\n```\r\nindex.ts                         → Root Pi entrypoint shim\r\nsrc/\r\n├── index.ts                     → Extension bootstrap, permission checks, readable prompts, debug review entries, reload handling, and subagent forwarding\r\n├── before-agent-start-cache.ts  → Caches prompt/tool filtering state between before_agent_start runs\r\n├── bash-filter.ts               → Bash command wildcard pattern matching\r\n├── common.ts                    → Shared utilities (YAML parsing, type guards, etc.)\r\n├── config-modal.ts              → `/permission-system` modal registration and settings UI wiring\r\n├── extension-config.ts          → Extension-local config loading and default creation\r\n├── logging.ts                   → File-only debug logging helpers\r\n├── model-option-compatibility.ts → Guards unsupported provider/model options\r\n├── permission-dialog.ts         → Interactive permission approval UI helpers\r\n├── permission-forwarding.ts     → Subagent-to-parent permission forwarding utilities\r\n├── permission-manager.ts        → Global/project policy loading, merging, and resolution with caching\r\n├── skill-prompt-sanitizer.ts    → Skill prompt parsing, multi-block sanitization, and skill-read path matching\r\n├── status.ts                    → Status line integration for runtime yolo state\r\n├── system-prompt-sanitizer.ts   → Available-tools prompt filtering helpers\r\n├── tool-registry.ts             → Registered tool name resolution\r\n├── types.ts                     → TypeScript type definitions\r\n├── wildcard-matcher.ts          → Shared wildcard pattern compilation and matching\r\n├── yolo-mode.ts                 → Runtime yolo approval helpers\r\n├── yolo-mode-api.ts             → Shared global runtime API for yolo toggling\r\n└── zellij-modal.ts              → Reusable modal/settings UI components\r\ntests/\r\n├── permission-system.test.ts    → Core permission, layering, forwarding, and policy tests\r\n├── config-modal.test.ts         → Modal command behavior tests\r\n└── test-harness.ts              → Shared lightweight test helpers\r\nschemas/\r\n└── permissions.schema.json      → JSON Schema for policy validation\r\nconfig/\r\n└── config.example.json          → Starter global policy template\r\n```\r\n\r\n#### Module Organization\r\n\r\nThe extension uses a modular architecture with shared utilities:\r\n\r\n| Module | Purpose |\r\n|--------|---------|\r\n| `common.ts` | Shared utilities: `toRecord()`, `getNonEmptyString()`, `isPermissionState()`, `parseSimpleYamlMap()`, `extractFrontmatter()` |\r\n| `wildcard-matcher.ts` | Compile-once wildcard patterns with specificity sorting: `compileWildcardPatterns()`, `findCompiledWildcardMatch()` |\r\n| `permission-manager.ts` | Policy resolution with file stamp caching for performance |\r\n| `bash-filter.ts` | Uses shared wildcard matcher for bash command patterns |\r\n| `skill-prompt-sanitizer.ts` | Parses all available skill prompt blocks, removes denied skills, and tracks visible skill paths for read protection |\r\n\r\n#### Performance Optimizations\r\n\r\n- **File stamp caching**: Configurations are cached with file modification timestamps to avoid redundant reads\r\n- **Pre-compiled patterns**: Wildcard patterns are compiled to regex once and reused across permission checks\r\n- **Resolved permissions caching**: Merged agent+global permissions are cached per-agent with invalidation on file changes\r\n\r\n### Threat Model\r\n\r\n**Goal:** Enforce policy at the host level, not the model level.\r\n\r\n**What this stops:**\r\n- Agent calling tools it shouldn't use (e.g., `write`, dangerous `bash`)\r\n- Tool switching attempts (calling non-existent tool names)\r\n- Accidental escalation via skill loading\r\n- Unapproved path-bearing tool access outside the active working directory when `external_directory` is `ask` or `deny`\r\n\r\n**Limitations:**\r\n- If a dangerous action is possible via an allowed tool, policy must explicitly restrict it\r\n- This is a permission decision layer, not a sandbox\r\n\r\n### Schema Validation\r\n\r\nValidate your config against the included schema:\r\n\r\n```bash\r\nnpx --yes ajv-cli@5 validate \\\r\n  -s ./schemas/permissions.schema.json \\\r\n  -d ./pi-permissions.valid.json\r\n```\r\n\r\n**Editor tip:** Add `\"$schema\": \"./schemas/permissions.schema.json\"` to your config for autocomplete support.\r\n\r\n---\r\n\r\n## Troubleshooting\r\n\r\n| Problem | Cause | Solution |\r\n|---------|-------|----------|\r\n| Config not applied (everything asks) | File not found or parse error | Verify the global Pi policy file (default: `~/.pi/agent/pi-permissions.jsonc`, respects `PI_CODING_AGENT_DIR`); check the TUI warning for the parse location/message |\r\n| Per-agent override not applied | Frontmatter parsing issue | Ensure `---` delimiters at file top; keep YAML simple; restart session |\r\n| Tool blocked as unregistered | Unknown tool name | Use a registered `mcp` tool for server tools: `{ \"tool\": \"server:tool\" }` |\r\n| `/skill:<name>` blocked | Deny policy or confirmation unavailable | Check merged `skills` policy (global/project/agent layers). Active agent context is optional in the main session; `ask` still requires UI or forwarded confirmation. |\r\n| External file path blocked | `special.external_directory` is `ask` without UI or a matching rule resolves to `deny` | Keep file tools inside the active working directory, set an appropriate coarse fallback, or add a scoped rule such as `external_directory:/home/alice/shared/*`. |\r\n| Permission prompt is too verbose | Generic extension tool input is large | Built-in file tools are summarized automatically; third-party tools are capped to a bounded one-line JSON preview. |\r\n\r\n---\r\n\r\n## Development\r\n\r\nRuntime checks require Node.js 20+ and Bun 1.1+; the test suite runs through Bun.\r\n\r\n```bash\r\nnpm run build              # Run TypeScript type checks\r\nnpm run lint               # Run local static checks\r\nnpm run validate:artifacts # Validate JSON/schema/example artifacts\r\nnpm run test               # Run Bun tests from ./tests\r\nnpm run check              # Run static, artifact, and test checks\r\n```\r\n\r\n---\r\n\r\n## Related Pi Extensions\r\n\r\n- [pi-multi-auth](https://github.com/MasuRii/pi-multi-auth) — Multi-provider credential management and quota-aware rotation\r\n- [pi-tool-display](https://github.com/MasuRii/pi-tool-display) — Compact tool rendering and diff visualization\r\n- [pi-rtk-optimizer](https://github.com/MasuRii/pi-rtk-optimizer) — RTK command rewriting and output compaction\r\n- [pi-MUST-have-extension](https://github.com/MasuRii/pi-MUST-have-extension) — RFC 2119 keyword normalization for prompts\r\n\r\n## License\r\n\r\n[MIT](LICENSE)\r\n","readmeFilename":"README.md"}