{"_id":"@openclaw/fs-safe","_rev":"52-1051b5d4a35b4ae7e2f348599610a398","name":"@openclaw/fs-safe","dist-tags":{"latest":"0.19.0"},"versions":{"0.1.0":{"name":"@openclaw/fs-safe","version":"0.1.0","license":"MIT","_id":"@openclaw/fs-safe@0.1.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://github.com/openclaw/fs-safe#readme","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"a6cefeb1e960fd0221eb45c96cbbf436e7bf7f24","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.1.0.tgz","fileCount":260,"integrity":"sha512-ByFeXAA+7EXje15eaI3mqee9STFcglTkfdhenZQ2V4OGAkhkHzb2yxe3hInuWXYImG9gDolbccNEnwlsoTayaA==","signatures":[{"sig":"MEQCIEaKpm6baJAtM27YGDpQGJafrj1WjXYRgxEMdhWu2IUlAiBQZBLftLxcCl7EgePAanQFBsg3BKUx5SaThrJw44lhQA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":615833},"type":"module","engines":{"node":">=20.11"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"}},"gitHead":"621d643d379533791ab5108e1cf639fc7d8e2c8c","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","check":"pnpm build && pnpm test","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"11.12.1","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.19","@vitest/coverage-v8":"3.2.4"},"optionalDependencies":{"tar":"7.5.13","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.1.0_1778028973059_0.6890056058521941","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@openclaw/fs-safe","version":"0.1.1","license":"MIT","_id":"@openclaw/fs-safe@0.1.1","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://github.com/openclaw/fs-safe#readme","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"6a8ab2a09139ff5f383bc7a249407fb2a8573570","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.1.1.tgz","fileCount":260,"integrity":"sha512-+50LBpW7nKWzu3wJb4C5X9BQAcAxmj3oNRd/ZqZK+YO1ZdiikOPZ6fy5ta631xsV13+m+Ap5s0Gb3zPSl+0kOQ==","signatures":[{"sig":"MEQCIG+fzqlcrixcZ8TgWby7iBT+HkDG0XbEXaqnu0rNhN1aAiBBbJOaU3WsohTL+Zo3MYlEQNQa5V6LlSCBDhzLJDD0pA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":617911},"type":"module","engines":{"node":">=20.11"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"}},"gitHead":"695710c4790ce3c95432b0d32af6f244b88a4957","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","check":"pnpm build && pnpm test","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"11.12.1","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.19","@vitest/coverage-v8":"3.2.4"},"optionalDependencies":{"tar":"7.5.13","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.1.1_1778031019835_0.2674438693699117","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@openclaw/fs-safe","version":"0.1.2","license":"MIT","_id":"@openclaw/fs-safe@0.1.2","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://github.com/openclaw/fs-safe#readme","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"becd7aa00576c4b5b66a496144faf80597335ea6","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.1.2.tgz","fileCount":256,"integrity":"sha512-4x0FzdEenLzrm+sZjuR/Yo5EUEsnXLMF+rinrY/OSqn9D+/2ibmPdWrvX0HfeddVxNOKa+VVcgPMnEb102nKEg==","signatures":[{"sig":"MEYCIQCvvobdDfvrPATYVmWkYyQ8O4H1QBRI+NQ4IZ+9uraMzgIhANboZsot/aZlwi0+PkBtyUCYGS5dnnIMJSSKbf8AsHpm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":683149},"type":"module","engines":{"node":">=20.11"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"}},"gitHead":"cbe59d156a0d9ddc0b7f4b237fa02e42806654a0","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm build && pnpm test","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/openclaw-read-bypass-parity.test.ts test/openclaw-write-bypass-parity.test.ts test/additional-bypass-parity.test.ts test/adversarial-boundary-payloads.test.ts","lint:file-size":"node scripts/check-file-size.mjs"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"11.12.1","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.19","@vitest/coverage-v8":"3.2.4"},"optionalDependencies":{"tar":"7.5.13","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.1.2_1778039745575_0.23646923266861042","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@openclaw/fs-safe","version":"0.2.0","license":"MIT","_id":"@openclaw/fs-safe@0.2.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://github.com/openclaw/fs-safe#readme","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"309c2378a05a6c8a4f80d99edd52ead92988bd8f","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.2.0.tgz","fileCount":290,"integrity":"sha512-lFR7d0XOs3vqfhTRAJ7xGRcsW2jZNEKBBKt9dGuiE4jX0fvfN8mbFyWTJ9YUsgjP4DReAwErevphUKTKLZ+UYg==","signatures":[{"sig":"MEUCIQDshiKCENdj1nn9dELQCPyHqBDckAUFwEeZ/eNnuqe1hAIgbTm0jomBq3rdEjaB6RrcI4FSawZy7xMRTrkUMcERNAY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":782352},"type":"module","engines":{"node":">=20.11"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"}},"gitHead":"c7ccb99d3058f2acf2ad2758ad2470c7e113a53c","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/openclaw-read-bypass-parity.test.ts test/openclaw-write-bypass-parity.test.ts test/additional-bypass-parity.test.ts test/adversarial-boundary-payloads.test.ts","lint:file-size":"node scripts/check-file-size.mjs","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"11.12.1","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.19","@vitest/coverage-v8":"3.2.4"},"optionalDependencies":{"tar":"7.5.13","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.2.0_1778148461988_0.5725338173119163","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@openclaw/fs-safe","version":"0.2.1","license":"MIT","_id":"@openclaw/fs-safe@0.2.1","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://github.com/openclaw/fs-safe#readme","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"386a0e36cf1b62af0dba7d711da5cb155999475d","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.2.1.tgz","fileCount":290,"integrity":"sha512-xFLJZHRtnxI9V5RfrPArzPXZRs5bVAbhV0x96qYKFmvyqxRwAyCdjXYLHpLHqU3uzwOGzRQFP8anAVNcfI7umA==","signatures":[{"sig":"MEUCIFuQesYqOA8r8qo3qT22xgYKKV/D+29qg5ej5Rl6TTKjAiEArDU8sP2JY+NRAkB6u4/KuwekDI6BJzH4jzlv6lrUorg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":783794},"type":"module","engines":{"node":">=20.11"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"}},"gitHead":"d3f37bc700e8fd31473afee48eb96f9e6377ffad","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/openclaw-read-bypass-parity.test.ts test/openclaw-write-bypass-parity.test.ts test/additional-bypass-parity.test.ts test/adversarial-boundary-payloads.test.ts","lint:file-size":"node scripts/check-file-size.mjs","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"11.12.1","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.19","@vitest/coverage-v8":"3.2.4"},"optionalDependencies":{"tar":"7.5.13","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.2.1_1778239613195_0.7989608130970478","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@openclaw/fs-safe","version":"0.2.2","license":"MIT","_id":"@openclaw/fs-safe@0.2.2","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://github.com/openclaw/fs-safe#readme","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"bf89b0ccf66f7cf925f09f73c58f4b589de93afa","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.2.2.tgz","fileCount":341,"integrity":"sha512-rQIqgVjuI8MONThAuOsGp1x1nK5UUvBYI8BW5OZtZw/0d8MbSfl27DNdkxzNF2FwHb8yKG8VBnmTlPHI269KTw==","signatures":[{"sig":"MEUCIAuwTvHCvbi1l5EZXcZjVVKyjFYxNPdiCdwvzbX5m/SOAiEAy9cxFE4p6HRlZPoK4Fg9KOa9F3koz1aku5mcLVSPb+k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":926432},"type":"module","engines":{"node":">=20.11"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"}},"gitHead":"530e2f25864e2278ab8dbab25f262f2f61aab775","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/openclaw-read-bypass-parity.test.ts test/openclaw-write-bypass-parity.test.ts test/additional-bypass-parity.test.ts test/adversarial-boundary-payloads.test.ts","lint:file-size":"node scripts/check-file-size.mjs","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"11.11.0","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.19","@vitest/coverage-v8":"3.2.4"},"optionalDependencies":{"tar":"7.5.13","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.2.2_1778485566574_0.5236190903931561","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@openclaw/fs-safe","version":"0.2.3","license":"MIT","_id":"@openclaw/fs-safe@0.2.3","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://github.com/openclaw/fs-safe#readme","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"da23cab5b67bc2033cb52cb7d4432f5dd0175fc2","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.2.3.tgz","fileCount":290,"integrity":"sha512-O8AJ/ZiLbBQvpxYyXrZuyIFFUG2N2Oz6uhle5Gn1gVGkgT+Qmx7O1A9tbE2pTZs2Cyk75A31H0F8w34CL2X6gg==","signatures":[{"sig":"MEQCIHz0+MpwnOzGDRRivk6iGzvjPtdc85tN0IYN7gLo5P0uAiBlTaT3jPzGUnJ29VzBQ8hjnYBS4S9JIoNG5Em0a5tBoA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":784443},"type":"module","engines":{"node":">=20.11"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"}},"gitHead":"4c9720f575c8a90f07ce4cc3dac8887762101739","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","lint:file-size":"node scripts/check-file-size.mjs","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"11.11.0","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.19","@vitest/coverage-v8":"3.2.4"},"optionalDependencies":{"tar":"7.5.13","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.2.3_1778739972029_0.5175275569655868","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@openclaw/fs-safe","version":"0.2.4","license":"MIT","_id":"@openclaw/fs-safe@0.2.4","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://github.com/openclaw/fs-safe#readme","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"bfaec3db87fbc7492093e8e711527728049330e5","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.2.4.tgz","fileCount":341,"integrity":"sha512-Fo3WTQhxu0asD/rZqIKBqhX6fuZfjyHxSW5yTKfcRx+D9BRAcz0AGoVh+3ur/4XRvZkvsh3Ud8XTw006yRYLgg==","signatures":[{"sig":"MEUCIQDjfEFp9VbDZwSn9sgkF9o6y9OwvJMKpVjvUm+G0WssgwIgFUCqC5EpAFTvrby7fiTt/S3zM5yZM0baBV9PDe782AA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":929942},"type":"module","engines":{"node":">=20.11"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"}},"gitHead":"a51f90ccf40f900f215a6a653276316332509c58","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","lint:file-size":"node scripts/check-file-size.mjs","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"11.12.1","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.19","@vitest/coverage-v8":"3.2.4"},"optionalDependencies":{"tar":"7.5.13","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.2.4_1778741647240_0.9228151905111226","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@openclaw/fs-safe","version":"0.2.5","license":"MIT","_id":"@openclaw/fs-safe@0.2.5","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://github.com/openclaw/fs-safe#readme","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"7d84911135e2788200d2452472b9c080a53707b0","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.2.5.tgz","fileCount":287,"integrity":"sha512-j39mOrNmJGRoMCjFWM+kB29X1rDKQnty74faRa/1QEb2Ew/OUAGo7SY2ci5xSGfZ60/koQsido6NmV5BuqiZBQ==","signatures":[{"sig":"MEYCIQCil4HtKKpb/uG8CU6AnPcGASRET17wtS1jsSDk3t3L2gIhAMlg4LLmO7DqdxL0uL8cy9ogvzMzfbJqbBGUnhqHBwRu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":789083},"type":"module","engines":{"node":">=20.11"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"}},"gitHead":"d6628de98648c68157d8e578d399492607e70b41","scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","lint:file-size":"node scripts/check-file-size.mjs","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"11.11.0","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.6","typescript":"^5.8.3","@types/node":"^22.15.19","@vitest/coverage-v8":"4.1.6"},"optionalDependencies":{"tar":"7.5.13","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.2.5_1778967093136_0.8191503140966354","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"@openclaw/fs-safe","version":"0.2.6","license":"MIT","_id":"@openclaw/fs-safe@0.2.6","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://github.com/openclaw/fs-safe#readme","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"9e23b3203d05a0713fcc6b0eb97fe3f32eff32bf","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.2.6.tgz","fileCount":287,"integrity":"sha512-9RG/tD9yJF5UkoXiXgvd+IWXFeTWQmNJWB20h/lbbDJiV+6C/pgjcLDMRq9vntSNNEJhaj6Hrqs2W8iiIbAtOA==","signatures":[{"sig":"MEUCIQD4xWEMPC8aOQyCLeJiReIPwDK7DLEXJWFg0QUl1uZOzAIgXD4W2PFyCWcwq0UY7UL/93VDWu2RxPFDf138P4mKJ2M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":794263},"type":"module","engines":{"node":">=20.11"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"}},"gitHead":"dc409b7841d542f881c9de53ee46f5638036ce9c","scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","lint:file-size":"node scripts/check-file-size.mjs","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"11.11.0","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.6","typescript":"^5.8.3","@types/node":"^22.15.19","@vitest/coverage-v8":"4.1.6"},"optionalDependencies":{"tar":"7.5.13","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.2.6_1779000289607_0.11723465509276942","host":"s3://npm-registry-packages-npm-production"}},"0.2.7":{"name":"@openclaw/fs-safe","version":"0.2.7","license":"MIT","_id":"@openclaw/fs-safe@0.2.7","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://github.com/openclaw/fs-safe#readme","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"fb9d3d3d4659e6bc2ca535fc05699f6a1bad5f5e","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.2.7.tgz","fileCount":293,"integrity":"sha512-l/Yj3K2ChR/gI+bZo1wIe7rjKyTFwGOAw120cTCMRT8LZbVhJhTbiZLGIRBMv0Gc9GQjYE8EjPBza3RdrSSbyQ==","signatures":[{"sig":"MEUCIEAcHCnL5LWiyxq8fWotBQzGP6JdxjpfgzLsVJqH1RE8AiEAtSG4/v4XdlFkFldxHlkE3rcNk9zTLfJrtGelz4NqTRg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":806370},"type":"module","engines":{"node":">=20.11"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"}},"gitHead":"d649786af91d3385f068cadce0b2b59bbcd4ed0b","scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","lint:file-size":"node scripts/check-file-size.mjs","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"11.14.1","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.6","typescript":"^5.8.3","@types/node":"^22.15.19","@vitest/coverage-v8":"4.1.6"},"optionalDependencies":{"tar":"7.5.13","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.2.7_1779300963938_0.846633694025009","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@openclaw/fs-safe","version":"0.3.0","license":"MIT","_id":"@openclaw/fs-safe@0.3.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://github.com/openclaw/fs-safe#readme","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"3a6e5c019803c0a4cf2b72d95e1d8d059b8fd043","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.3.0.tgz","fileCount":302,"integrity":"sha512-uIBE441CIt1kIURoP9qRGKZ8LkGyfD9ZzeESjwAd29ZPWtghws/5GR3Pjb67jKdcJHP1I6roNXcvnhzAU7lHlA==","signatures":[{"sig":"MEUCIQCzqnKV2aHfICfyVq7EFwfyUbvy81+8G5z5k2XQpSFkSwIgV/AyZA5Mv9zkAOBgpwSlS9U9tkS6J3D9zV2v7nYMTtQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":823053},"type":"module","engines":{"node":">=20.11"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"}},"gitHead":"cb91a5e42b301b330218c7658da56f1b0a826003","scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","lint:file-size":"node scripts/check-file-size.mjs","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"11.11.0","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.6","typescript":"^5.8.3","@types/node":"^22.15.19","@vitest/coverage-v8":"4.1.6"},"optionalDependencies":{"tar":"7.5.13","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.3.0_1779405146225_0.5931943840533764","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@openclaw/fs-safe","version":"0.4.0","license":"MIT","_id":"@openclaw/fs-safe@0.4.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"dist":{"shasum":"03c1fa0908fa61448f5919013e86066169ba3029","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.4.0.tgz","fileCount":308,"integrity":"sha512-UxHKy+W2Wc5y7ARLdSZuIzutNCuhFpZpKlpX4iodycBadYLR30c6yuv9AhTpJ+Sq0x1NoXsZJcfwRncfQNT48Q==","signatures":[{"sig":"MEUCIDWWxc+Elu8YAbE6ljKmyzTlEG3VDQG8yWt1QQBzm7daAiEAteGtQOhtihFc5AwG2ZkBriiQGlDliNXHazxJMbVjwQo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":836784},"type":"module","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"}},"scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","crabbox:run":"crabbox run","crabbox:stop":"crabbox stop","test:changed":"pnpm run test","check:changed":"pnpm run check","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.8","typescript":"^5.9.3","@types/node":"^22.19.20","@vitest/coverage-v8":"4.1.8"},"optionalDependencies":{"tar":"7.5.16","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.4.0_1781754806793_0.6774810995180749","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@openclaw/fs-safe","version":"0.4.1","license":"MIT","_id":"@openclaw/fs-safe@0.4.1","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://github.com/openclaw/fs-safe#readme","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"3665fc937649634e9f6c9dce85b0f4e5b44358d7","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.4.1.tgz","fileCount":308,"integrity":"sha512-hQi+BxO10KdRFlYUot1syC+hTaUnGeQNdqX5kwkKJig8CFq1tKsYJLPm+zkiiGsSKOprPAquQl/txejEhpKPgg==","signatures":[{"sig":"MEQCIHKGQov1lkg1TSZ1igKqMI5LaIhPtLaJAZ9ZV3B8UpgnAiBME8gk+vXyhkod35MjpqzcNMbX3mnB34+mDrePsr5nTA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":846410},"type":"module","_from":"file:/tmp/fs-safe-0.4.1.aRxBqJ/openclaw-fs-safe-0.4.1.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"}},"scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","crabbox:run":"crabbox run","crabbox:stop":"crabbox stop","test:changed":"pnpm run test","check:changed":"pnpm run check","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"_resolved":"/tmp/fs-safe-0.4.1.aRxBqJ/openclaw-fs-safe-0.4.1.tgz","_integrity":"sha512-hQi+BxO10KdRFlYUot1syC+hTaUnGeQNdqX5kwkKJig8CFq1tKsYJLPm+zkiiGsSKOprPAquQl/txejEhpKPgg==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"11.11.0","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.5","vitest":"^4.1.9","typescript":"^5.9.3","@types/node":"^22.20.0","@vitest/coverage-v8":"4.1.9"},"optionalDependencies":{"tar":"7.5.19","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.4.1_1782897180816_0.7757808237359882","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@openclaw/fs-safe","version":"0.4.2","license":"MIT","_id":"@openclaw/fs-safe@0.4.2","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://github.com/openclaw/fs-safe#readme","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"67f8747c5ac699a38126d21f3bb7661ab1ec4e32","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.4.2.tgz","fileCount":311,"integrity":"sha512-x02inO/FF+kuKU8W5vX5UFgkkMG2bCf2u02lX90XQYCYzvD87P/J0F9dfYKF4o/9b37JATdXcUhJwrhtREpwWQ==","signatures":[{"sig":"MEUCIQDdfCetnhD9IPdvOoS53US/PvOaQCYMuLmx376J0ReXQQIgLhyJLXDrQW4qMEvJPvyop94/3FYbL2Wea3tZTuCXtU8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":852026},"type":"module","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"}},"gitHead":"f5fc0cbb947ea92fc77ef940b43931e1e7f42c98","scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","crabbox:run":"crabbox run","crabbox:stop":"crabbox stop","test:changed":"pnpm run test","check:changed":"pnpm run check","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"11.16.0","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"vite":"8.1.5","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.1.1","@vitest/coverage-v8":"4.1.10"},"optionalDependencies":{"tar":"7.5.20","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.4.2_1784428862409_0.8000385502856364","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@openclaw/fs-safe","version":"0.4.3","license":"MIT","_id":"@openclaw/fs-safe@0.4.3","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://github.com/openclaw/fs-safe#readme","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"c20294ddfed112debead5ba9870eb26662fe5af8","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.4.3.tgz","fileCount":311,"integrity":"sha512-COOPvc0yFwisi0QXA4FtKz5LLzT+1reYNNJn+598/PHYPCxo4uS8NZS4BQV62ypqxL7laW702PitCKyEXu5MpA==","signatures":[{"sig":"MEUCIQD2VWzVW3lWw18uW87ynfl4MtmePWRjd5JWMnnUUkQ8tAIgUTGm08EdLRfREyuC6ebUzP8xfuvnq4PDyCAlbsE5ZeI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":853034},"type":"module","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"}},"gitHead":"08132c98edd6ac3bc478ee356a9bfc62177b87e5","scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","crabbox:run":"crabbox run","crabbox:stop":"crabbox stop","test:changed":"pnpm run test","check:changed":"pnpm run check","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.1","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"vite":"8.1.5","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.1.1","@vitest/coverage-v8":"4.1.10"},"optionalDependencies":{"tar":"7.5.20","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.4.3_1784434959924_0.2766441599415215","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"@openclaw/fs-safe","version":"0.4.4","license":"MIT","_id":"@openclaw/fs-safe@0.4.4","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://github.com/openclaw/fs-safe#readme","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"00b60529cbe2a5ecd44093d2fed775568e591c07","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.4.4.tgz","fileCount":314,"integrity":"sha512-QklFGshaQDXl7RFyxPeSN/1moYq/X+SJcmX/nY3oXJO/tzVasL9i1g3m4nJqIfd6qUTJQjeu+41aIqw8+SbUww==","signatures":[{"sig":"MEYCIQDd5e7Q3oX6i4JvUgxsSwfb+Myxu29XSzKTPGH9tCWrsAIhAMpxMUJ2LduIkO3CNlq6trntlT2d4R3JCBTxSw4J8fkd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":861644},"type":"module","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"}},"gitHead":"cc8a26b23d3a1d1c4f8781bc3f8dfe604240e4ea","scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","crabbox:run":"crabbox run","crabbox:stop":"crabbox stop","test:changed":"pnpm run test","check:changed":"pnpm run check","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"11.17.0","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"vite":"8.1.5","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.1.1","@vitest/coverage-v8":"4.1.10"},"optionalDependencies":{"tar":"7.5.20","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.4.4_1784439302966_0.10871933563621239","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"@openclaw/fs-safe","version":"0.4.5","license":"MIT","_id":"@openclaw/fs-safe@0.4.5","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://github.com/openclaw/fs-safe#readme","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"c2e0eb69117e20b7dc097a2f66b31ceaf872c68f","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.4.5.tgz","fileCount":314,"integrity":"sha512-1r3A5L6nqzQy61duqNQ83fBPzitVwZlu/uDX2YHhKcao4RPa91wWLX0tZkHNaeQi14sInRGIbId0LFkQsp6bqQ==","signatures":[{"sig":"MEUCIQC4PtjV/s70PBI3oalQuFhA1yGGD6kwuyfq9guKU/2MCAIgZ+5AFv0HyL06UdvmpISfGJagYGCm/b3bipC+hyQL4VQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":866380},"type":"module","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"}},"gitHead":"9e067b41f3eaa0b952bca9b35f697b8dc1cdaf80","scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","crabbox:run":"crabbox run","crabbox:stop":"crabbox stop","test:changed":"pnpm run test","check:changed":"pnpm run check","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"11.17.0","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"vite":"8.1.5","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.1.1","@vitest/coverage-v8":"4.1.10"},"optionalDependencies":{"tar":"7.5.20","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.4.5_1784611899390_0.8866997890686463","host":"s3://npm-registry-packages-npm-production"}},"0.4.6":{"name":"@openclaw/fs-safe","version":"0.4.6","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.4.6","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"472d5c06f2348ace826372f4bdc7edaf32e8d108","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.4.6.tgz","fileCount":320,"integrity":"sha512-aIuQp7Xb2UE3Jiup86HAlK0+36VJnHtCMtEwhA1A/2R8HjO3VrawNuyNwWynb/SihQgrUxluWw7O6vRW6Se0Ig==","signatures":[{"sig":"MEUCIQCbRyGX5C3Rhfy4Dld+RSPqH4GkTwVvpxXr8XqhbsmQywIgJpM17XYEal9/CjrkWQf07lpaiUctsb6KU389NrSZBNk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDZExozdkE5amMdWUPpLaaBOfnjeLX7M3EfVeR61PHQrwIhAPNQ6guyYQUSoZUNgVzW9UugCprAU9ULwvJDx5oOhcIg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.4.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":881830},"type":"module","_from":"file:release-artifact/openclaw-fs-safe-0.4.6.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","crabbox:stop":"crabbox stop","test:changed":"pnpm run test","check:changed":"pnpm run check","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifact/openclaw-fs-safe-0.4.6.tgz","_integrity":"sha512-aIuQp7Xb2UE3Jiup86HAlK0+36VJnHtCMtEwhA1A/2R8HjO3VrawNuyNwWynb/SihQgrUxluWw7O6vRW6Se0Ig==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"11.16.0","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"vite":"8.1.5","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.1.1","@vitest/coverage-v8":"4.1.10"},"optionalDependencies":{"tar":"7.5.20","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.4.6_1784890044195_0.23181808174506258","host":"s3://npm-registry-packages-npm-production"}},"0.4.7":{"name":"@openclaw/fs-safe","version":"0.4.7","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.4.7","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"6c890bb39205c84469d9d02d2e145968214914a4","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.4.7.tgz","fileCount":327,"integrity":"sha512-UO+FCB8vF+VJngOzZuVTdkOapX/gPml0HFEjRj2qIeEmBlCkGLHjRJ4CZWFziRtcq3g4YioWra/6J3iwEH1JaA==","signatures":[{"sig":"MEUCIQDUvz4KV50QYAXnB/g6VMDhWZtXYZaIxzGZQ2346fUupQIgaT4IOBmG8c9YNgnon+8c7Fy8C1VL/1N+w1xH/4ICvzc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC5b7SOUTOPNhA2it+A3W2hHjpAW/p/2ZVtbw4hHXu/RAIhAO4hAwoXMBE/IYDGpW2yNHlW/Q6WqaG9oJ4hpsPM7Qcr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.4.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":902614},"type":"module","_from":"file:release-artifact/openclaw-fs-safe-0.4.7.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","crabbox:stop":"crabbox stop","test:changed":"pnpm run test","check:changed":"pnpm run check","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifact/openclaw-fs-safe-0.4.7.tgz","_integrity":"sha512-UO+FCB8vF+VJngOzZuVTdkOapX/gPml0HFEjRj2qIeEmBlCkGLHjRJ4CZWFziRtcq3g4YioWra/6J3iwEH1JaA==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"11.16.0","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"vite":"8.1.5","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.1.1","@vitest/coverage-v8":"4.1.10"},"optionalDependencies":{"tar":"7.5.20","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.4.7_1784935115772_0.8016562061025325","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@openclaw/fs-safe","version":"0.5.0","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.5.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"576d58efaa053ad8a51ae5dffccca90461a351b8","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.5.0.tgz","fileCount":417,"integrity":"sha512-TPpFG8PkAKlM/eP7glzHhCeZnDX3sSqyjXgeoc0jeyii0y957/zePB62BIwc75gOFmxaeKLWkd4iF41/Ghlgjg==","signatures":[{"sig":"MEUCIQC4fhUB8BpzSXWHqv5nbzggfjTLgOUDgyT+SXHQJoMIEQIgcLmHHXbHTKmPxRRwSfsCuofCjtZ4U6SFUCX6AW628Fo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGbTYGX+2dtBIwZVpPwHAqh7YQMwoUCJLHjO+gjFBXWjAiEAzSi05IRPcLGlh2HuJ8XxOg66uCRqyKHz/5RZ2Oy5P8Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":16993344},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.5.0.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --manifest-path native/Cargo.toml","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.5.0.tgz","_integrity":"sha512-TPpFG8PkAKlM/eP7glzHhCeZnDX3sSqyjXgeoc0jeyii0y957/zePB62BIwc75gOFmxaeKLWkd4iF41/Ghlgjg==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.1","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"vite":"8.1.5","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.1.1","@napi-rs/cli":"3.7.4","@vitest/coverage-v8":"4.1.10"},"optionalDependencies":{"tar":"7.5.21","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.5.0_1785197982602_0.8155902769007746","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@openclaw/fs-safe","version":"0.5.1","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.5.1","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"f4dabf3ed706bf08ea7a282750baa4ebf1707b60","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.5.1.tgz","fileCount":417,"integrity":"sha512-WcaG3NUMd4q+puq/I55zxwc0+OjNVhqxSprKzpS17c2cDd9bYc8c2DrYrs6Io3mmNXNa90re/UWSwVkX4I6PkA==","signatures":[{"sig":"MEYCIQDoTe+ea6J2ut/J6wVJBA0Fk5WqYKbGuwpU7nVCYWHuvQIhAJx/YgA1oyhHI0sQrQQUsshz1vq9zd/xTlDPQ12Owgr0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEyEubtfSJGmjzXZZWb7sU5cxGFvLua6TEJgZwRmL/0pAiAuF5L7RTKZYDreynb8QBhOFHtq7ZBFkz0MOvXyH3YTQQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":17092354},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.5.1.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --manifest-path native/Cargo.toml","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.5.1.tgz","_integrity":"sha512-WcaG3NUMd4q+puq/I55zxwc0+OjNVhqxSprKzpS17c2cDd9bYc8c2DrYrs6Io3mmNXNa90re/UWSwVkX4I6PkA==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.1","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"vite":"8.2.0","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.1.2","@napi-rs/cli":"3.8.1","@vitest/coverage-v8":"4.1.10"},"optionalDependencies":{"tar":"7.5.22","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.5.1_1785638272775_0.9179894756500377","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@openclaw/fs-safe","version":"0.5.2","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.5.2","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"7a2c8f406a8829371465683155aded24f21aef19","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.5.2.tgz","fileCount":431,"integrity":"sha512-klidJFTE5FFAweNFpy/aVgschya3JYMWtXfdoSH3bTFN7+WAqlJtD+UQjOIFdkD42kJcWM7josNUpIIm7dnwXg==","signatures":[{"sig":"MEQCIH+N2sI8FePv+a9yOHMaG0vnaZK06Mq2bnUOcTDKtP+0AiAuYzdy4kx+NALS365Hzaprp4hlwFnPd6lmVQ/ekTVlOg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCmkT5STfd4iro1Z73Eh+1gVbTaVqzdIkP9mjFQLcE4EwIhAPY9Y9BbEiRJmZN1bxOb0UA1xtaeaVhJ3GNJW4B2HAgV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.5.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":17249142},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.5.2.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --manifest-path native/Cargo.toml","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.5.2.tgz","_integrity":"sha512-klidJFTE5FFAweNFpy/aVgschya3JYMWtXfdoSH3bTFN7+WAqlJtD+UQjOIFdkD42kJcWM7josNUpIIm7dnwXg==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.1","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"vite":"8.2.0","vitest":"^4.1.10","sigstore":"5.0.0","typescript":"^7.0.2","@types/node":"^26.1.2","@napi-rs/cli":"3.8.2","@vitest/coverage-v8":"4.1.10"},"optionalDependencies":{"tar":"7.5.22","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.5.2_1785728130237_0.5255935084499608","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"@openclaw/fs-safe","version":"0.5.3","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.5.3","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"6820005852dfef805e5f2a9f63292bfc5e5a4c4a","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.5.3.tgz","fileCount":434,"integrity":"sha512-tWzQywX8Q2Lu4rXpPp/b+T2XL7H4WgupxLcXrpaM6qes6UevsRjY22NRt6XVAeIE8xysrPriMGFV67ooxfBpkw==","signatures":[{"sig":"MEUCIQCEGbXTMZ1z0RUoqjkPJkjwzKe4gRZ4tmMmqBxxyB3XgwIgRexPlq56cUrPrQKbs7r2edJKPMeXdyH0ppQBfxvV0n8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBV/DKR1HNv4LiTSPxVjFtqd6aVBR11hcdX7GjylBzG0AiEAkzepUHsNs5kQAauH+mc+1z5r8CQdP9duJvhzQ4Rw3jM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.5.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":17270971},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.5.3.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --manifest-path native/Cargo.toml","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.5.3.tgz","_integrity":"sha512-tWzQywX8Q2Lu4rXpPp/b+T2XL7H4WgupxLcXrpaM6qes6UevsRjY22NRt6XVAeIE8xysrPriMGFV67ooxfBpkw==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.1","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"vite":"8.2.1","vitest":"^4.1.10","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.1.2","@napi-rs/cli":"3.8.2","@emnapi/runtime":"2.0.0-alpha.3","istanbul-reports":"3.2.0","@vitest/coverage-v8":"4.1.10","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"tar":"7.5.22","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.5.3_1786248836651_0.061462382687168526","host":"s3://npm-registry-packages-npm-production"}},"0.5.4":{"name":"@openclaw/fs-safe","version":"0.5.4","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.5.4","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"66be0d3b5f4e3d77dc3f058f59be2177ec63254c","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.5.4.tgz","fileCount":437,"integrity":"sha512-lttlWKRBQU7eYDYykU2BPoF1S6AESGrT77mVCXsuWBxnRBTAI/PuGB89DB3D1lBCDaqTykIjymPJz4pFesGnkg==","signatures":[{"sig":"MEUCIEojKXi7kGrw9ADZ0ChdULR/IHseFvJBXBD/gzwdyAbRAiEA1bwoS59fFKIfoILfIjV2fuOLXFdWvxEZ2b18hj0u9fk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIEf0VS2JURNjGOuTUnC3N1XlDi6a/AjRQgz6sydtU+btAiEA9NVCNfR0GAhniiBtiNsLt4KuPl9hFafYaDeULL1HFOU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.5.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":17501651},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.5.4.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --manifest-path native/Cargo.toml","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.5.4.tgz","_integrity":"sha512-lttlWKRBQU7eYDYykU2BPoF1S6AESGrT77mVCXsuWBxnRBTAI/PuGB89DB3D1lBCDaqTykIjymPJz4pFesGnkg==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.1","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"vite":"8.2.1","vitest":"^4.1.10","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.2.0","@napi-rs/cli":"3.8.2","@emnapi/runtime":"2.0.0-alpha.3","istanbul-reports":"3.2.0","@vitest/coverage-v8":"4.1.10","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"tar":"7.5.22","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.5.4_1786368649187_0.2868149443225758","host":"s3://npm-registry-packages-npm-production"}},"0.5.5":{"name":"@openclaw/fs-safe","version":"0.5.5","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.5.5","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"a8c820ccd495c0b1d8660f2bfc881363620503d7","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.5.5.tgz","fileCount":437,"integrity":"sha512-x8wYigrOwmnsE8v4LfAh2eTvvkuDMspBrQeBp/GyB9/c7eFf8aL7gK4keewDbhscKX1pACD8Yd+ehZq6o29xHw==","signatures":[{"sig":"MEQCIEIIHDE3Xwc+6FribmOdRKQqZXEqulypmvMdegSwu5KBAiAnf7n4sP1ySHmXoXexvO0582kzZyt3HRspyIagQhQk4Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIAlpLlFElvlXVNSDQNk9+DtnreRpAw6BOIqYGGkNQ7k+AiEA99i8flXketi+D4K2V09edzpquyo50Fw1u18aQSHXmx8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.5.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":17500321},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.5.5.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --manifest-path native/Cargo.toml","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.5.5.tgz","_integrity":"sha512-x8wYigrOwmnsE8v4LfAh2eTvvkuDMspBrQeBp/GyB9/c7eFf8aL7gK4keewDbhscKX1pACD8Yd+ehZq6o29xHw==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.1","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"vite":"8.2.1","vitest":"^4.1.10","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.2.0","@napi-rs/cli":"3.8.2","@emnapi/runtime":"2.0.0-alpha.3","istanbul-reports":"3.2.0","@vitest/coverage-v8":"4.1.10","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"tar":"7.5.22","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.5.5_1786508203073_0.5913361942258659","host":"s3://npm-registry-packages-npm-production"}},"0.5.6":{"name":"@openclaw/fs-safe","version":"0.5.6","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.5.6","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"7001bdd7db3e715a0da61fe8d0b86d947205243d","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.5.6.tgz","fileCount":437,"integrity":"sha512-0M1vz1PEFAgCwTxhB1lt/B7z+TRTTWmlYJ3dSbdhjZp2AcfM7rXPGjQVJqHXpzpsb9SRxvKGrAM454Uul/Xy5g==","signatures":[{"sig":"MEQCIHOpwBFLfbilV4Y0QtFSHdh4Q5wgYt9eCWjZHZJvOHuRAiADPQmFCdauKCy7zYukA0H0663y3IrtSvSt51WiGqqhJg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFK1eP8syRqcy+t7W+M1Cy9ZdqiDfrOvrKUQ1bfxZ8/WAiBN5Von4dKMIUugl5mprcCw1ojp8qkDGamINZD9IKsxxQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.5.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":17504725},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.5.6.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --manifest-path native/Cargo.toml","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.5.6.tgz","_integrity":"sha512-0M1vz1PEFAgCwTxhB1lt/B7z+TRTTWmlYJ3dSbdhjZp2AcfM7rXPGjQVJqHXpzpsb9SRxvKGrAM454Uul/Xy5g==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.1","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@10.34.5","devDependencies":{"vite":"8.2.1","vitest":"^4.1.10","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.2.0","@napi-rs/cli":"3.8.6","@emnapi/runtime":"2.0.0-alpha.3","istanbul-reports":"3.2.0","@vitest/coverage-v8":"4.1.10","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"tar":"7.5.22","jszip":"^3.10.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.5.6_1786738548274_0.09041546145639767","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@openclaw/fs-safe","version":"0.6.0","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.6.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"e5ada8dcebcdbcb9f0b4e9a78c78bc4d41df4552","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.6.0.tgz","fileCount":474,"integrity":"sha512-tO5m6zOtRwy+qYVGPzMsjD2W45n5efxAxH9yemaje/0gYibq/i+dJt/zFHkcIHYVccmdKJKjWat1F75igyr0Qw==","signatures":[{"sig":"MEQCICJ2kg4tU1SkyX0piU2k5nrlk7xMCGZSOIdnRx0JrZp7AiB8z1ycJpxYs4p0KCVOKul1Mo2QGAnQ5TNUBmRJG5HIzg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDdTKoGdTtgAcLI5YdCpp0uoFSuJOVAWj9NVnhNcFhwUgIhAMTN+T5ctVId2ZKwi5olASxI0NMafBinABrUoB8W3i6n","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1394053},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.6.0.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --manifest-path native/Cargo.toml","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.6.0.tgz","_integrity":"sha512-tO5m6zOtRwy+qYVGPzMsjD2W45n5efxAxH9yemaje/0gYibq/i+dJt/zFHkcIHYVccmdKJKjWat1F75igyr0Qw==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"vite":"8.2.2","vitest":"^4.1.11","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.3.0","@napi-rs/cli":"3.8.6","@emnapi/runtime":"2.0.0-alpha.4","istanbul-reports":"3.2.0","@vitest/coverage-v8":"4.1.11","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"tar":"7.5.22","jszip":"^3.10.1","@openclaw/fs-safe-darwin-x64":"0.6.0","@openclaw/fs-safe-darwin-arm64":"0.6.0","@openclaw/fs-safe-linux-x64-gnu":"0.6.0","@openclaw/fs-safe-linux-x64-musl":"0.6.0","@openclaw/fs-safe-win32-x64-msvc":"0.6.0","@openclaw/fs-safe-linux-arm64-gnu":"0.6.0","@openclaw/fs-safe-linux-arm64-musl":"0.6.0"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.6.0_1788030089477_0.8056912032448875","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@openclaw/fs-safe","version":"0.7.0","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.7.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"09dc6e8d5339c80c73f33dccb1ecf4ee431ea487","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.7.0.tgz","fileCount":519,"integrity":"sha512-i+0a4yQYa4ThUahaSLMledG99AL38XdAn8q/ppVMr49zr0dsOO+1gf8Jz6jgI0ggdcq6U4IhgsNunACsSymjyA==","signatures":[{"sig":"MEYCIQC9FswO9JD8b/fc2w1zsp+xvIXJluk1fEgIwKk7t1kt6QIhAOF8p3ibfbIabrsoaez4BXtsi0io6w6ChAnI1gCTIKBK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFMUfkBZ5sLH60hu8bkGcP5KSDPhQIo4gIQyvmCfaKKRAiBAj8MWC/nXqUguZDvPgdI38Vle9HQHVLRoHJx7FqcuXA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1539599},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.7.0.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --manifest-path native/Cargo.toml","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.7.0.tgz","_integrity":"sha512-i+0a4yQYa4ThUahaSLMledG99AL38XdAn8q/ppVMr49zr0dsOO+1gf8Jz6jgI0ggdcq6U4IhgsNunACsSymjyA==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"vite":"8.2.2","vitest":"^4.1.11","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.4.0","@napi-rs/cli":"3.8.6","@emnapi/runtime":"2.0.0-alpha.4","istanbul-reports":"3.2.0","@vitest/coverage-v8":"4.1.11","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"tar":"7.5.22","jszip":"^3.10.1","@openclaw/fs-safe-darwin-x64":"0.7.0","@openclaw/fs-safe-darwin-arm64":"0.7.0","@openclaw/fs-safe-linux-x64-gnu":"0.7.0","@openclaw/fs-safe-linux-x64-musl":"0.7.0","@openclaw/fs-safe-win32-x64-msvc":"0.7.0","@openclaw/fs-safe-linux-arm64-gnu":"0.7.0","@openclaw/fs-safe-linux-arm64-musl":"0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.7.0_1788193790610_0.4768946628852315","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@openclaw/fs-safe","version":"0.7.1","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.7.1","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"e68a589c031ce18d674079100d61dfd55ff05f6c","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.7.1.tgz","fileCount":528,"integrity":"sha512-wxvJNMygGEFnrYvnjsNA4UiFxRYQd839q/Ps5qeIYYxxcgI5sOR6ynH57uJQ2bOeIvsQCI3phpyelhaUs1Oy/Q==","signatures":[{"sig":"MEUCIQDJ3VIt/qbtIQ7raAlXFnD14vlJEAKpR2AH++bKbUGEtQIgMvZUdB2Mog1xzYSXYnAopndj+JdmnAv2o+JYHAQpgtE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGzT5a6cT4LjR1c36QlyNaT267v0c42krDHlNumG+fN0AiB06KvjBYil1JkILMkwIZGvwEACai7jfgy+QWCYci1SYA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1565382},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.7.1.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --manifest-path native/Cargo.toml","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.7.1.tgz","_integrity":"sha512-wxvJNMygGEFnrYvnjsNA4UiFxRYQd839q/Ps5qeIYYxxcgI5sOR6ynH57uJQ2bOeIvsQCI3phpyelhaUs1Oy/Q==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"vite":"8.2.2","vitest":"^4.1.11","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.4.0","@napi-rs/cli":"3.8.6","@emnapi/runtime":"2.0.0-alpha.4","istanbul-reports":"3.2.0","@vitest/coverage-v8":"4.1.11","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"tar":"7.5.22","jszip":"^3.10.1","@openclaw/fs-safe-darwin-x64":"0.7.1","@openclaw/fs-safe-darwin-arm64":"0.7.1","@openclaw/fs-safe-linux-x64-gnu":"0.7.1","@openclaw/fs-safe-linux-x64-musl":"0.7.1","@openclaw/fs-safe-win32-x64-msvc":"0.7.1","@openclaw/fs-safe-linux-arm64-gnu":"0.7.1","@openclaw/fs-safe-linux-arm64-musl":"0.7.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.7.1_1788286861851_0.9548135179696122","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"@openclaw/fs-safe","version":"0.7.2","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.7.2","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"fd1180e767298c733f21eb3f203dde5db9aaca56","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.7.2.tgz","fileCount":528,"integrity":"sha512-Ls27+zwLKg7uomERaYeFFzKlhFH7A/T6PsQue/9JcLmJWS29041C/PcCaLH/r9Xajvk691EFkaNAq8lcKR75ew==","signatures":[{"sig":"MEUCIQDFvlvNbz0410On076gE/9JyFksKu82GlO3caafr8PUNAIgMLXpdzxtGU/fxAlMpHorW0Rjwgi5fGsxJ85M4KKaqp4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD8F3dwJLMcZWV5QUOvsG7LVFNZ9eRjgjpoyhc7l8h21wIgLtlepC1E8xdZpKeQdui5I9AdBQjsnJeWycgkPkqQYUI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.7.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1568355},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.7.2.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --manifest-path native/Cargo.toml","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.7.2.tgz","_integrity":"sha512-Ls27+zwLKg7uomERaYeFFzKlhFH7A/T6PsQue/9JcLmJWS29041C/PcCaLH/r9Xajvk691EFkaNAq8lcKR75ew==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0","devDependencies":{"vite":"8.2.2","vitest":"^4.1.11","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.4.0","@napi-rs/cli":"3.8.6","@emnapi/runtime":"2.0.0-alpha.4","istanbul-reports":"3.2.0","@vitest/coverage-v8":"4.1.11","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"tar":"7.5.22","jszip":"^3.10.1","@openclaw/fs-safe-darwin-x64":"0.7.2","@openclaw/fs-safe-darwin-arm64":"0.7.2","@openclaw/fs-safe-linux-x64-gnu":"0.7.2","@openclaw/fs-safe-linux-x64-musl":"0.7.2","@openclaw/fs-safe-win32-x64-msvc":"0.7.2","@openclaw/fs-safe-linux-arm64-gnu":"0.7.2","@openclaw/fs-safe-linux-arm64-musl":"0.7.2"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.7.2_1788292667197_0.9420548276761129","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@openclaw/fs-safe","version":"0.8.0","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.8.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"00d858e361f49fc1993945abfa025668c42e66b5","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.8.0.tgz","fileCount":543,"integrity":"sha512-RS2YgIn4Zpp0q56KEsFxbH093Dlx2Iq8fNfTEEawNDPxfeQ7hiXSaAbU1HhNvfh3aAYXHJH06lCg0qtChqpAVw==","signatures":[{"sig":"MEQCIFsdGCywtH8RPuyp3dMfzrBbNCn3Pt+tFnsMSAX6xBziAiARZ+Xh4M2oYeSZUhw+WzBbHNQ7dQjaaY7Fyx70EyQfuQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCdpJaLCKcu1/gmECTeKGo7+ggndJvHvTkuSr2bL/ux0QIgG8nbgnrkZ2P663rx/x1T424f0fCLeKzSLr8yQfJB+DQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1647477},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.8.0.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --manifest-path native/Cargo.toml","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.8.0.tgz","_integrity":"sha512-RS2YgIn4Zpp0q56KEsFxbH093Dlx2Iq8fNfTEEawNDPxfeQ7hiXSaAbU1HhNvfh3aAYXHJH06lCg0qtChqpAVw==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"vite":"8.2.2","vitest":"^4.1.11","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.4.1","@napi-rs/cli":"3.8.6","@emnapi/runtime":"2.0.0-alpha.4","istanbul-reports":"3.2.0","@vitest/coverage-v8":"4.1.11","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"tar":"7.5.22","jszip":"^3.10.1","@openclaw/fs-safe-darwin-x64":"0.8.0","@openclaw/fs-safe-darwin-arm64":"0.8.0","@openclaw/fs-safe-linux-x64-gnu":"0.8.0","@openclaw/fs-safe-linux-x64-musl":"0.8.0","@openclaw/fs-safe-win32-x64-msvc":"0.8.0","@openclaw/fs-safe-linux-arm64-gnu":"0.8.0","@openclaw/fs-safe-linux-arm64-musl":"0.8.0"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.8.0_1788543989360_0.8777547900008977","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@openclaw/fs-safe","version":"0.8.1","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.8.1","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"f9b05e1f306153a4887dddadf77a859ee9228917","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.8.1.tgz","fileCount":543,"integrity":"sha512-I11v+xiet4RCE1G1bmWFLEMmd9nBnZMmKqHPT9gkqVtoqacY7GtFvpt1O7cffUDD6C2YlAt7Z5Z2Vlbq5rYxDg==","signatures":[{"sig":"MEQCIDTuaEXNvcK6BpfxIFQEcfLINtjKu/AvF7aIZKLB6wNUAiBPJnFrJaF3qi6rL+a84CVLroBPVNRlxg5JY/6JWR/9+w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQC7k2fCrgTxkSdtI9OCi5xtwEeFP6vQ79vfoF/AjxqXQgIgIKYVgRTllRsY2SAqWoL6ih9d2BVK6LuJ3yIXLOKNDLs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1650270},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.8.1.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --manifest-path native/Cargo.toml","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.8.1.tgz","_integrity":"sha512-I11v+xiet4RCE1G1bmWFLEMmd9nBnZMmKqHPT9gkqVtoqacY7GtFvpt1O7cffUDD6C2YlAt7Z5Z2Vlbq5rYxDg==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"vite":"8.2.2","vitest":"^4.1.11","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.4.1","@napi-rs/cli":"3.8.6","@emnapi/runtime":"2.0.0-alpha.4","istanbul-reports":"3.2.0","@vitest/coverage-v8":"4.1.11","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"tar":"7.5.22","jszip":"^3.10.1","@openclaw/fs-safe-darwin-x64":"0.8.1","@openclaw/fs-safe-darwin-arm64":"0.8.1","@openclaw/fs-safe-linux-x64-gnu":"0.8.1","@openclaw/fs-safe-linux-x64-musl":"0.8.1","@openclaw/fs-safe-win32-x64-msvc":"0.8.1","@openclaw/fs-safe-linux-arm64-gnu":"0.8.1","@openclaw/fs-safe-linux-arm64-musl":"0.8.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.8.1_1788562314125_0.940910452347586","host":"s3://npm-registry-packages-npm-production"}},"0.8.2":{"name":"@openclaw/fs-safe","version":"0.8.2","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.8.2","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"29016cefa078c8d0b6148af545fd9d7128f2b108","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.8.2.tgz","fileCount":538,"integrity":"sha512-XZ/5RCK45asJNLM+zvFW1lf/Jwjhxb3DdScWWe89rBKumFrcWuFn8R0xVZVzXUsIPchaNm5eoUJIFUN3Q1u36A==","signatures":[{"sig":"MEQCIC7V8S4e/oLNC9d7TAAiodHINBQdDqOx9YcEsvOX7tkmAiA/6qNEquM0GH41JYaKjBQy4fAzOvUUPdW3kejfCQnjAA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCNjiGDNhq4iKZoqVZcngVSPQBciKi/5zSMPJ0zUa/iIwIhAK9LzKi25fWaXOLKhjMVWfNz/GqUXXbLsaIZ4Y78yRTG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.8.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2079173},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.8.2.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.8.2.tgz","_integrity":"sha512-XZ/5RCK45asJNLM+zvFW1lf/Jwjhxb3DdScWWe89rBKumFrcWuFn8R0xVZVzXUsIPchaNm5eoUJIFUN3Q1u36A==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"tar":"7.5.22","vite":"8.2.2","vitest":"^5.0.0","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.4.1","@napi-rs/cli":"3.9.0","@emnapi/runtime":"2.0.0-alpha.4","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.0","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.1","@openclaw/fs-safe-darwin-x64":"0.8.2","@openclaw/fs-safe-darwin-arm64":"0.8.2","@openclaw/fs-safe-linux-x64-gnu":"0.8.2","@openclaw/fs-safe-linux-x64-musl":"0.8.2","@openclaw/fs-safe-win32-x64-msvc":"0.8.2","@openclaw/fs-safe-linux-arm64-gnu":"0.8.2","@openclaw/fs-safe-linux-arm64-musl":"0.8.2"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.8.2_1788640310972_0.9956441757279033","host":"s3://npm-registry-packages-npm-production"}},"0.8.3":{"name":"@openclaw/fs-safe","version":"0.8.3","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.8.3","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"ae8f9582d01af0bbd50a942001f2569391a11f14","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.8.3.tgz","fileCount":520,"integrity":"sha512-2hzKN8W5CQhhoa+9NZCO9vwpuEInrX4nlVbm2JrEvI2aYCI/dXcjHcZWJOefWR/t3VfqLntr30+7lLg3dj0t5A==","signatures":[{"sig":"MEYCIQCfZ0SW4I2iUHu9Vg7kfDMGaaPh/+/gFn7BygJjWPRtoQIhAO+sPgx1iboqZFyHeizHFow56TVb67vofZzbEWjRCTFi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAYRTfUjB7t0bUXv6sGnaKpZVr8vHccruZeufap25+OsAiBo9Oc798fxHtn4GA29yFpljzJVDb6CB/c0YWDgk59Yyg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.8.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2076108},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.8.3.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.8.3.tgz","_integrity":"sha512-2hzKN8W5CQhhoa+9NZCO9vwpuEInrX4nlVbm2JrEvI2aYCI/dXcjHcZWJOefWR/t3VfqLntr30+7lLg3dj0t5A==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"tar":"7.5.22","vite":"8.2.2","vitest":"^5.0.0","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.4.1","@napi-rs/cli":"3.9.0","@emnapi/runtime":"2.0.0-alpha.4","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.0","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.1","@openclaw/fs-safe-darwin-x64":"0.8.3","@openclaw/fs-safe-darwin-arm64":"0.8.3","@openclaw/fs-safe-linux-x64-gnu":"0.8.3","@openclaw/fs-safe-linux-x64-musl":"0.8.3","@openclaw/fs-safe-win32-x64-msvc":"0.8.3","@openclaw/fs-safe-linux-arm64-gnu":"0.8.3","@openclaw/fs-safe-linux-arm64-musl":"0.8.3"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.8.3_1788744214065_0.4033533540872609","host":"s3://npm-registry-packages-npm-production"}},"0.8.4":{"name":"@openclaw/fs-safe","version":"0.8.4","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.8.4","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"ec2c92ca731c1aeecbb51657f80d6a5ba14e3208","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.8.4.tgz","fileCount":526,"integrity":"sha512-/smWdIgJWPx1JaswmhswiOsVo4gT3ZoigP+y84VWYGbvMJwyFF3KESTP44k+CCvrhyUpK75CFcWWPlOdWpVJow==","signatures":[{"sig":"MEUCIQDcNkSRp5Z38yn3Xsazy9FckeGd/6VSG4DlVHeC9DdKWAIgdJXRBjdAzo0cOlBm1c0yLUtwlqBF0onRatkKdGzO8xY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCID9DccVc4odczGMr5Ke0038AjOvhUEQtINYA2fqioi+CAiAQOfmtmrz2gImVuVnV28tnnsdn/o2et9C1xjsXRj49LA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.8.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2090934},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.8.4.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.8.4.tgz","_integrity":"sha512-/smWdIgJWPx1JaswmhswiOsVo4gT3ZoigP+y84VWYGbvMJwyFF3KESTP44k+CCvrhyUpK75CFcWWPlOdWpVJow==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"tar":"7.5.22","vite":"8.2.2","vitest":"^5.0.0","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.4.1","@napi-rs/cli":"3.9.0","@emnapi/runtime":"2.0.0-alpha.4","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.0","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.1","@openclaw/fs-safe-darwin-x64":"0.8.4","@openclaw/fs-safe-darwin-arm64":"0.8.4","@openclaw/fs-safe-linux-x64-gnu":"0.8.4","@openclaw/fs-safe-linux-x64-musl":"0.8.4","@openclaw/fs-safe-win32-x64-msvc":"0.8.4","@openclaw/fs-safe-linux-arm64-gnu":"0.8.4","@openclaw/fs-safe-linux-arm64-musl":"0.8.4"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.8.4_1788756319912_0.4288863185748659","host":"s3://npm-registry-packages-npm-production"}},"0.8.5":{"name":"@openclaw/fs-safe","version":"0.8.5","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.8.5","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"c0d297e0817019a6cef720a68728bc4053bbe523","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.8.5.tgz","fileCount":526,"integrity":"sha512-MAuWVgZ+DZhakzfrbyn2NOKsZop3ES2ITeVCoAaDNb/NIxF45hAzYDXmp2G8W10CE/HGasL97QMC0+iBZNzHUQ==","signatures":[{"sig":"MEUCICFI8TSR1ojP1dh1Z/B9+WA9G/o70nQ82LcmLQxenEseAiEAkZZfHa0SKxKdxPXi19HKBRGbxs55bn4HukQxNrrSK7c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCID9xXdMnZyKC/+MRmomcVMQYTnydCmRYFCO9M25gkOdVAiEAtgIxfpdipHkceyMwhmO/chlLmCE6pCZ3TLUv76CiPE4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.8.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2092652},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.8.5.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.8.5.tgz","_integrity":"sha512-MAuWVgZ+DZhakzfrbyn2NOKsZop3ES2ITeVCoAaDNb/NIxF45hAzYDXmp2G8W10CE/HGasL97QMC0+iBZNzHUQ==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"tar":"7.5.22","vite":"8.2.2","vitest":"^5.0.0","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.4.1","@napi-rs/cli":"3.9.0","@emnapi/runtime":"2.0.0-alpha.4","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.0","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.1","@openclaw/fs-safe-darwin-x64":"0.8.5","@openclaw/fs-safe-darwin-arm64":"0.8.5","@openclaw/fs-safe-linux-x64-gnu":"0.8.5","@openclaw/fs-safe-linux-x64-musl":"0.8.5","@openclaw/fs-safe-win32-x64-msvc":"0.8.5","@openclaw/fs-safe-linux-arm64-gnu":"0.8.5","@openclaw/fs-safe-linux-arm64-musl":"0.8.5"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.8.5_1788774765246_0.0603573492055538","host":"s3://npm-registry-packages-npm-production"}},"0.8.6":{"name":"@openclaw/fs-safe","version":"0.8.6","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.8.6","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"68c1620bfc3ef3b9cf13f6e760ce06b2c499cc32","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.8.6.tgz","fileCount":526,"integrity":"sha512-0Rc0bzd7zz26PiRGzeFtK3VLdKtCQSUu/mXsKC6T6/FlVDvKmz8PU87AdFMWBxo2zge1nZC0vuPegaJB+bnO5w==","signatures":[{"sig":"MEQCIHzIOF3a4R53K/Ykuj4QSIpdSPqWf8rJ/aVt8pL7L5eqAiAnDNqqM5Va09peH0M/CIit4+TnNK5aAnGnA3gnY9JLNQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBPW+BDunQp2Za4HE7J6Ascq2HA02vkIMo2KdAbefc7mAiALoa2Xizn2SJyW12yDDVo2jYnEE+sI6M4N8EnLzirk7g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.8.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2094982},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.8.6.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.8.6.tgz","_integrity":"sha512-0Rc0bzd7zz26PiRGzeFtK3VLdKtCQSUu/mXsKC6T6/FlVDvKmz8PU87AdFMWBxo2zge1nZC0vuPegaJB+bnO5w==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"tar":"7.5.22","vite":"8.2.2","vitest":"^5.0.0","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.4.1","@napi-rs/cli":"3.9.0","@emnapi/runtime":"2.0.0-alpha.4","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.0","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.1","@openclaw/fs-safe-darwin-x64":"0.8.6","@openclaw/fs-safe-darwin-arm64":"0.8.6","@openclaw/fs-safe-linux-x64-gnu":"0.8.6","@openclaw/fs-safe-linux-x64-musl":"0.8.6","@openclaw/fs-safe-win32-x64-msvc":"0.8.6","@openclaw/fs-safe-linux-arm64-gnu":"0.8.6","@openclaw/fs-safe-linux-arm64-musl":"0.8.6"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.8.6_1788778513337_0.09346991843913677","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@openclaw/fs-safe","version":"0.9.0","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.9.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"8eedbe02ae5e482f8aebd335c3557cdb30f967a4","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.9.0.tgz","fileCount":532,"integrity":"sha512-tosF8aEryiwblHUcoiZLlyNFHqtwNkvZcTGM0rnpl30Szlxkg6GEdzbpmvWM0x6q4ZaMrkGAODtrwZGD0eoXEw==","signatures":[{"sig":"MEUCICwR1eZ0Mnx8YCVXnJmJNNC3x4FGhA/iteRR0c60c0m3AiEAkQBRlPsGCWRkC/Qi7adTt4H2DFwpNuHKT2BL3x+mwmE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICK5qDmy5XKGIy+79H+fI9AUjU6rbPd5vzOB73COuN+9AiEA0O3xYBA/WB2geZLsvmpFQNoOa6OKttcro+cEQ3cQfiw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2123373},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.9.0.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.9.0.tgz","_integrity":"sha512-tosF8aEryiwblHUcoiZLlyNFHqtwNkvZcTGM0rnpl30Szlxkg6GEdzbpmvWM0x6q4ZaMrkGAODtrwZGD0eoXEw==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"tar":"7.5.22","vite":"8.2.2","vitest":"^5.0.0","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.5.1","@napi-rs/cli":"3.9.0","@emnapi/runtime":"2.0.0-alpha.5","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.0","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.2","@openclaw/fs-safe-darwin-x64":"0.9.0","@openclaw/fs-safe-darwin-arm64":"0.9.0","@openclaw/fs-safe-linux-x64-gnu":"0.9.0","@openclaw/fs-safe-linux-x64-musl":"0.9.0","@openclaw/fs-safe-win32-x64-msvc":"0.9.0","@openclaw/fs-safe-linux-arm64-gnu":"0.9.0","@openclaw/fs-safe-linux-arm64-musl":"0.9.0"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.9.0_1789166807045_0.3884595112613285","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@openclaw/fs-safe","version":"0.10.0","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.10.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"6edc8ef663af1a63105111df63add56878e3b1e6","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.10.0.tgz","fileCount":573,"integrity":"sha512-tZW2fR6TgLAYfsaYx+ewC4zoPLO6EicRfx7f6kke4N/jIb8ZkteBEq2cD4Y6jMeNgVM7YClVzQuzcaAIkan3Dg==","signatures":[{"sig":"MEQCIC4CqO/wOTrOFCbAWRPMVFPmps51EB//g7UB8Gv9uyXSAiAvWdky8GpM/FUDqEnlCkBdDhy6O/PqGpwo2gRfDfYWpg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIG67irVJEnegGS15I56faA+N+W/7KXWntPPFPP29Ms3uAiEA699kn8Zpo/Dk9FcI92so+VmaDvuTFMktV8l76eCa3Ic=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2259711},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.10.0.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./copy":{"types":"./dist/copy.d.ts","default":"./dist/copy.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:methods":"node benchmarks/runner.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.10.0.tgz","_integrity":"sha512-tZW2fR6TgLAYfsaYx+ewC4zoPLO6EicRfx7f6kke4N/jIb8ZkteBEq2cD4Y6jMeNgVM7YClVzQuzcaAIkan3Dg==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"tar":"7.5.22","vite":"8.2.2","vitest":"^5.0.0","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.5.1","@napi-rs/cli":"3.9.0","@emnapi/runtime":"2.0.0-alpha.5","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.0","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.2","@openclaw/fs-safe-darwin-x64":"0.10.0","@openclaw/fs-safe-darwin-arm64":"0.10.0","@openclaw/fs-safe-linux-x64-gnu":"0.10.0","@openclaw/fs-safe-linux-x64-musl":"0.10.0","@openclaw/fs-safe-win32-x64-msvc":"0.10.0","@openclaw/fs-safe-linux-arm64-gnu":"0.10.0","@openclaw/fs-safe-linux-arm64-musl":"0.10.0"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.10.0_1789288502642_0.0030551688083710893","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@openclaw/fs-safe","version":"0.11.0","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.11.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"a685d118b65a79211398d75e10ed0a13ac6a6b88","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.11.0.tgz","fileCount":623,"integrity":"sha512-peGqt1p6b/93Xvqo8V5ZvrL9NdNX6VjzrcnDuo0o+Y+UfeuFvxcF64qSarsHwyJ24s2gEjE9Vl76A3vtFR8WTg==","signatures":[{"sig":"MEQCIFbSj2Df7P5SymsTT38RWUB99VZRS8ogL8LOH8rwW/7SAiA/ZFBca1JjjimWxru7GPz8oIpAgbBE/CWYyFDy0kKleQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDSSYdcY9OyxBeeHWYrJx6+WgY7dP5fJZuYEj/5q2h2AAiEA00Az6fOXJ1dIX3OLsibIyJAUg9DHFnMaus2ad5YmR4g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2431834},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.11.0.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./copy":{"types":"./dist/copy.d.ts","default":"./dist/copy.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./guest":{"types":"./dist/guest.d.ts","default":"./dist/guest.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","test:bun":"bun node_modules/vitest/vitest.mjs run --config scripts/bun-vitest.config.ts","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","test:bun:native":"bun scripts/bun-native-proof.mjs && bun node_modules/vitest/vitest.mjs run --config scripts/bun-native-vitest.config.ts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:methods":"node benchmarks/runner.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.11.0.tgz","_integrity":"sha512-peGqt1p6b/93Xvqo8V5ZvrL9NdNX6VjzrcnDuo0o+Y+UfeuFvxcF64qSarsHwyJ24s2gEjE9Vl76A3vtFR8WTg==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"tar":"7.5.22","vite":"8.2.2","vitest":"^5.0.0","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.5.1","@napi-rs/cli":"3.9.0","@emnapi/runtime":"2.0.0-alpha.5","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.0","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.2","@openclaw/fs-safe-darwin-x64":"0.11.0","@openclaw/fs-safe-darwin-arm64":"0.11.0","@openclaw/fs-safe-linux-x64-gnu":"0.11.0","@openclaw/fs-safe-linux-x64-musl":"0.11.0","@openclaw/fs-safe-win32-x64-msvc":"0.11.0","@openclaw/fs-safe-linux-arm64-gnu":"0.11.0","@openclaw/fs-safe-linux-arm64-musl":"0.11.0"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.11.0_1789372246259_0.1017346295881707","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@openclaw/fs-safe","version":"0.12.0","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.12.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"1e9ff3b00ade5d225adf28048c0e9fea83ce46be","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.12.0.tgz","fileCount":638,"integrity":"sha512-Dwu2BZL6+n9pTeSLwijjL+dUBN0ktOjyucZPDjwSpuIkiPx9aussFWdyiWUD9UvNu3gwfLRAcktz1HfYT8QW1w==","signatures":[{"sig":"MEUCIQC3kzbFyGCL3R+2CWDhzEXWlWAszAvzgopDOhOKW5fW5gIgbBTUnCtIXaKzs9/z0BPamDi87sQrStu7HUJuiuTURP0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCUn2HaDlG7491GIoMOsokgAgIJeJR0DqKwdfv1aF6ceAIhAOSE4MAqHsuLKgV3CzOwele3jUEysk1iWnwO6pK5UaOa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.12.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2490546},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.12.0.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./copy":{"types":"./dist/copy.d.ts","default":"./dist/copy.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./guest":{"types":"./dist/guest.d.ts","default":"./dist/guest.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","test:bun":"bun node_modules/vitest/vitest.mjs run --config scripts/bun-vitest.config.ts","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","test:bun:native":"bun scripts/bun-native-proof.mjs && bun node_modules/vitest/vitest.mjs run --config scripts/bun-native-vitest.config.ts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:methods":"node benchmarks/runner.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.12.0.tgz","_integrity":"sha512-Dwu2BZL6+n9pTeSLwijjL+dUBN0ktOjyucZPDjwSpuIkiPx9aussFWdyiWUD9UvNu3gwfLRAcktz1HfYT8QW1w==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"tar":"7.5.22","vite":"8.2.2","vitest":"^5.0.0","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.5.1","@napi-rs/cli":"3.9.0","@emnapi/runtime":"2.0.0-alpha.5","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.0","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.2","@openclaw/fs-safe-darwin-x64":"0.12.0","@openclaw/fs-safe-darwin-arm64":"0.12.0","@openclaw/fs-safe-linux-x64-gnu":"0.12.0","@openclaw/fs-safe-linux-x64-musl":"0.12.0","@openclaw/fs-safe-win32-x64-msvc":"0.12.0","@openclaw/fs-safe-linux-arm64-gnu":"0.12.0","@openclaw/fs-safe-linux-arm64-musl":"0.12.0"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.12.0_1789475921975_0.4927718318170722","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"@openclaw/fs-safe","version":"0.13.0","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.13.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"3f7d372ca8ee9517b7314e85fa4f0c5ef1696e1f","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.13.0.tgz","fileCount":773,"integrity":"sha512-8dyH9wMH5PFsOZZocY/lb+EYFMVN3+BMaPo0z2a1YwaOrkwrEt6kLvhI2g0X2AAKeq75r99cS1aMvY+Tk3wa6g==","signatures":[{"sig":"MEYCIQDTzBYJ9Py0r3JBtI/AX2zEGQooi7QOHkLNlgsPnivh/QIhAM4Oc86DYWcjb+1mHimgt2ooOPL7QZWGnXAtz/JKdp/k","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD8w38jTGCvGAJ/L7hEbM2mOIailyY3tWet56zU9cUVhAIhAJZ9fWNzZyCZ80qd6uMUFir8JgakiEH00TCrRX2/GzLp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.13.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3041410},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.13.0.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./copy":{"types":"./dist/copy.d.ts","default":"./dist/copy.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./guest":{"types":"./dist/guest.d.ts","default":"./dist/guest.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","test:bun":"bun node_modules/vitest/vitest.mjs run --config scripts/bun-vitest.config.ts","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","test:bun:native":"bun scripts/bun-native-proof.mjs && bun node_modules/vitest/vitest.mjs run --config scripts/bun-native-vitest.config.ts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:methods":"node benchmarks/runner.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.13.0.tgz","_integrity":"sha512-8dyH9wMH5PFsOZZocY/lb+EYFMVN3+BMaPo0z2a1YwaOrkwrEt6kLvhI2g0X2AAKeq75r99cS1aMvY+Tk3wa6g==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"tar":"7.5.22","vite":"8.3.0","vitest":"^5.0.0","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.5.1","@napi-rs/cli":"3.9.1","@emnapi/runtime":"2.0.0-alpha.5","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.0","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.2","@openclaw/fs-safe-darwin-x64":"0.13.0","@openclaw/fs-safe-darwin-arm64":"0.13.0","@openclaw/fs-safe-linux-x64-gnu":"0.13.0","@openclaw/fs-safe-linux-x64-musl":"0.13.0","@openclaw/fs-safe-win32-x64-msvc":"0.13.0","@openclaw/fs-safe-linux-arm64-gnu":"0.13.0","@openclaw/fs-safe-linux-arm64-musl":"0.13.0"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.13.0_1789581470553_0.23884868825540106","host":"s3://npm-registry-packages-npm-production"}},"0.13.1":{"name":"@openclaw/fs-safe","version":"0.13.1","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.13.1","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"e6e3f4bb697ea515f047553eb66ca4c0d7b88024","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.13.1.tgz","fileCount":773,"integrity":"sha512-nfsEjPirAKotKBaQoQt10JbZx3RwkFIcv2Ujj0m3DCJCP5Jre3AUnMatVinsNL/W60IL4XeRWEXCvlra7edx7g==","signatures":[{"sig":"MEYCIQCc4ljYptRwKfpoYE3oCppk1V5nkttVgNM3QbXdmDEtSwIhAPy2/+bSuCrNgpCBdW8lXTgkViUJgFHQiBFU0zfYGOIM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDtBZNWr6R1+vzDh2wxnTdT9nN9xH3IeFXSv9iq6pMYQAiArrBl/0ONKe9r4FgdRIP+2uUn6FiIhb7OtZQymGdRA8A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.13.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3045948},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.13.1.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./copy":{"types":"./dist/copy.d.ts","default":"./dist/copy.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./guest":{"types":"./dist/guest.d.ts","default":"./dist/guest.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","test:bun":"bun node_modules/vitest/vitest.mjs run --config scripts/bun-vitest.config.ts","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","test:bun:native":"bun scripts/bun-native-proof.mjs && bun node_modules/vitest/vitest.mjs run --config scripts/bun-native-vitest.config.ts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:methods":"node benchmarks/runner.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.13.1.tgz","_integrity":"sha512-nfsEjPirAKotKBaQoQt10JbZx3RwkFIcv2Ujj0m3DCJCP5Jre3AUnMatVinsNL/W60IL4XeRWEXCvlra7edx7g==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"tar":"7.5.22","vite":"8.3.0","vitest":"^5.0.0","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.5.1","@napi-rs/cli":"3.9.1","@emnapi/runtime":"2.0.0-alpha.5","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.0","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.2","@openclaw/fs-safe-darwin-x64":"0.13.1","@openclaw/fs-safe-darwin-arm64":"0.13.1","@openclaw/fs-safe-linux-x64-gnu":"0.13.1","@openclaw/fs-safe-linux-x64-musl":"0.13.1","@openclaw/fs-safe-win32-x64-msvc":"0.13.1","@openclaw/fs-safe-linux-arm64-gnu":"0.13.1","@openclaw/fs-safe-linux-arm64-musl":"0.13.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.13.1_1789596056301_0.7218695188409228","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"@openclaw/fs-safe","version":"0.14.0","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.14.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"98e47c2d9cdc58ab0920ee2db7bc1effddd1eb06","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.14.0.tgz","fileCount":779,"integrity":"sha512-QvowaR5IGtEe/HUTvxWZDZgV4NZyzKUkuZk05r7vrzlNSfcT4PALhbkbTguDNXMMVNA5URCt2f2vqk/3e8cwYw==","signatures":[{"sig":"MEUCIQDTsCoqCUJMPniABtOGDgdBibnxtaxx+UUrKF9rs7bgbwIgEPK4lB0Xe/6ppXHByZ1lHhQ5Xvci4pgURsi7vhE6ANo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIED564e4am4v8bQ+awonSqc24DwkN2SVh36ANMrEo72jAiB9oHTI4pTrsZI4uXwnX/xDTsPOiH+Vm6REs6xEb0rxgw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.14.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3068861},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.14.0.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./copy":{"types":"./dist/copy.d.ts","default":"./dist/copy.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./guest":{"types":"./dist/guest.d.ts","default":"./dist/guest.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","test:bun":"bun node_modules/vitest/vitest.mjs run --config scripts/bun-vitest.config.ts","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","test:bun:native":"bun scripts/bun-native-proof.mjs && bun node_modules/vitest/vitest.mjs run --config scripts/bun-native-vitest.config.ts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:methods":"node benchmarks/runner.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.14.0.tgz","_integrity":"sha512-QvowaR5IGtEe/HUTvxWZDZgV4NZyzKUkuZk05r7vrzlNSfcT4PALhbkbTguDNXMMVNA5URCt2f2vqk/3e8cwYw==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"tar":"7.5.22","vite":"8.3.0","vitest":"^5.0.0","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.5.1","@napi-rs/cli":"3.9.1","@emnapi/runtime":"2.0.0-alpha.5","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.0","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.2","@openclaw/fs-safe-darwin-x64":"0.14.0","@openclaw/fs-safe-darwin-arm64":"0.14.0","@openclaw/fs-safe-linux-x64-gnu":"0.14.0","@openclaw/fs-safe-linux-x64-musl":"0.14.0","@openclaw/fs-safe-win32-x64-msvc":"0.14.0","@openclaw/fs-safe-linux-arm64-gnu":"0.14.0","@openclaw/fs-safe-linux-arm64-musl":"0.14.0"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.14.0_1789639134905_0.7328411451199706","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"name":"@openclaw/fs-safe","version":"0.15.0","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.15.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"29898376fa0328f16c8c50617e1e3a87ab89d3f9","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.15.0.tgz","fileCount":830,"integrity":"sha512-np+OHOn7eeENHgwoMzc3h0PjXjepIv0VDAk4Qfwwut9b8VGdroYnJlG8Ea36kZYQvrkUjbT+aSpBlra8KNXKcg==","signatures":[{"sig":"MEUCIQC27YsZE143b3WP5NBLaRtAQ+dfSSSlxDQMuUjrnpc/9wIgexhGuU9dcGoZa39EenM6/dRIVoZFTLG1I+AcVOwoj7s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDC42XKwGxiRq57zGlHbT3Lrvxu1q6yG/PSuKg0CrQ06QIhAOcw8YXhX4rEoEWbmcteOWq+PA4nYTGhXgOaWIzL7jA7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.15.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3317875},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.15.0.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./copy":{"types":"./dist/copy.d.ts","default":"./dist/copy.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./guest":{"types":"./dist/guest.d.ts","default":"./dist/guest.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","test:bun":"bun node_modules/vitest/vitest.mjs run --config scripts/bun-vitest.config.ts","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","test:bun:native":"bun scripts/bun-native-proof.mjs && bun node_modules/vitest/vitest.mjs run --config scripts/bun-native-vitest.config.ts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:methods":"node benchmarks/runner.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.15.0.tgz","_integrity":"sha512-np+OHOn7eeENHgwoMzc3h0PjXjepIv0VDAk4Qfwwut9b8VGdroYnJlG8Ea36kZYQvrkUjbT+aSpBlra8KNXKcg==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@11.25.0","devDependencies":{"tar":"7.5.22","vite":"8.3.0","vitest":"^5.0.0","sigstore":"5.0.0","fast-check":"^4.9.0","typescript":"^7.0.2","@types/node":"^26.5.1","@napi-rs/cli":"3.10.0","@emnapi/runtime":"2.0.0-alpha.5","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.1","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.2","@openclaw/fs-safe-darwin-x64":"0.15.0","@openclaw/fs-safe-darwin-arm64":"0.15.0","@openclaw/fs-safe-linux-x64-gnu":"0.15.0","@openclaw/fs-safe-linux-x64-musl":"0.15.0","@openclaw/fs-safe-win32-x64-msvc":"0.15.0","@openclaw/fs-safe-linux-arm64-gnu":"0.15.0","@openclaw/fs-safe-linux-arm64-musl":"0.15.0"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.15.0_1789745676289_0.9824009689126807","host":"s3://npm-registry-packages-npm-production"}},"0.16.0":{"name":"@openclaw/fs-safe","version":"0.16.0","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.16.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"231111467dcf6f38615794b79abb05302e8d5748","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.16.0.tgz","fileCount":890,"integrity":"sha512-jRCVSEfnJQdyAV7LyYOnysV09EQRoQ7KcEysLLhBtzdNVwjYtZApnwwoDDpf38IF2pXIeok0cB679yVUUkAOpg==","signatures":[{"sig":"MEUCIE5fRWUWShVC8uZ04zQuaFW6Zs6t7KFd9uAO/qUcra3/AiEA8IEWQe6AqFqAj9dlmJMzoPc/5T6+Y2lN2J0+0K65DqI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCXBJ4iZXrNdZOIFzTKwhBfi5UJbFkHmDnX83CBAu7UawIhALteRjZoOxJQBeIu2N3RWHW/0Ovzt42Fq5Ubnlon+uy5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.16.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3542899},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.16.0.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./copy":{"types":"./dist/copy.d.ts","default":"./dist/copy.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./guest":{"types":"./dist/guest.d.ts","default":"./dist/guest.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm archive:wasm:allocator-tests && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","test:bun":"bun node_modules/vitest/vitest.mjs run --config scripts/bun-vitest.config.ts","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","test:bun:native":"bun scripts/bun-native-proof.mjs && bun node_modules/vitest/vitest.mjs run --config scripts/bun-native-vitest.config.ts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:methods":"node benchmarks/runner.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && pnpm archive:wasm:allocator-tests && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs","archive:wasm:allocator-tests":"node scripts/build-archive-wasm.mjs --allocator-tests"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.16.0.tgz","_integrity":"sha512-jRCVSEfnJQdyAV7LyYOnysV09EQRoQ7KcEysLLhBtzdNVwjYtZApnwwoDDpf38IF2pXIeok0cB679yVUUkAOpg==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@12.4.2","devDependencies":{"tar":"7.5.22","vite":"8.3.0","vitest":"^5.0.1","sigstore":"5.0.0","fast-check":"^4.10.1","typescript":"^7.0.2","@types/node":"^26.6.1","@napi-rs/cli":"3.10.3","@emnapi/runtime":"2.0.0-alpha.5","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.1","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.2","@openclaw/fs-safe-darwin-x64":"0.16.0","@openclaw/fs-safe-darwin-arm64":"0.16.0","@openclaw/fs-safe-linux-x64-gnu":"0.16.0","@openclaw/fs-safe-linux-x64-musl":"0.16.0","@openclaw/fs-safe-win32-x64-msvc":"0.16.0","@openclaw/fs-safe-linux-arm64-gnu":"0.16.0","@openclaw/fs-safe-linux-arm64-musl":"0.16.0"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.16.0_1789800267691_0.6376492178283526","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"@openclaw/fs-safe","version":"0.17.0","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.17.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"571cad125208a0f781be455f4e0cdba4467b72f7","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.17.0.tgz","fileCount":897,"integrity":"sha512-T2p3BM5Iz3CnFdK6XkdMowKsaxTgZG9J/FTIlrA3U/wGZCAqfaqHylFOQqMQqIU14i+8A1OM6Vt80ycu1zeqQw==","signatures":[{"sig":"MEUCIQCoM1aebC3qE3tQc+RgdUzp+7RHKfgliNzCHuaGiJlBqAIgdqY6s67jqqimrFP3VhuLoKdh26GzmOO4fRgmMbhCa9M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIG9+3CD6Po0TrEjzV2tD2C7U1t5TJu1Za4/d0X8ggvbvAiEA+xo+c7YHf3ZleGmFpYJzgbrHwK4dyR4mzRwphYtIqbE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.17.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3587495},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.17.0.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./copy":{"types":"./dist/copy.d.ts","default":"./dist/copy.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./guest":{"types":"./dist/guest.d.ts","default":"./dist/guest.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm archive:wasm:allocator-tests && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","test:bun":"bun node_modules/vitest/vitest.mjs run --config scripts/bun-vitest.config.ts","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","test:bun:native":"bun scripts/bun-native-proof.mjs && bun node_modules/vitest/vitest.mjs run --config scripts/bun-native-vitest.config.ts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:methods":"node benchmarks/runner.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && pnpm archive:wasm:allocator-tests && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs","archive:wasm:allocator-tests":"node scripts/build-archive-wasm.mjs --allocator-tests"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.17.0.tgz","_integrity":"sha512-T2p3BM5Iz3CnFdK6XkdMowKsaxTgZG9J/FTIlrA3U/wGZCAqfaqHylFOQqMQqIU14i+8A1OM6Vt80ycu1zeqQw==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@12.4.2","devDependencies":{"tar":"7.5.22","vite":"8.3.0","vitest":"^5.0.1","sigstore":"5.0.0","fast-check":"^4.10.1","typescript":"^7.0.2","@types/node":"^26.6.1","@napi-rs/cli":"3.10.3","@emnapi/runtime":"2.0.0-alpha.5","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.1","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.2","@openclaw/fs-safe-darwin-x64":"0.17.0","@openclaw/fs-safe-darwin-arm64":"0.17.0","@openclaw/fs-safe-linux-x64-gnu":"0.17.0","@openclaw/fs-safe-linux-x64-musl":"0.17.0","@openclaw/fs-safe-win32-x64-msvc":"0.17.0","@openclaw/fs-safe-linux-arm64-gnu":"0.17.0","@openclaw/fs-safe-linux-arm64-musl":"0.17.0"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.17.0_1789923275369_0.44465024880133197","host":"s3://npm-registry-packages-npm-production"}},"0.18.0":{"name":"@openclaw/fs-safe","version":"0.18.0","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.18.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"155789db3f7fa0501043b9cf44d33fad3378884d","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.18.0.tgz","fileCount":621,"integrity":"sha512-eSPdJUUIHSPMc0iHwgvONxEtFQ8AwtDGBwWLjOau7THlnL173QArWE9xlsxsOOacAcjG6awVo25IU4D6Dxfzng==","signatures":[{"sig":"MEUCIQCp6oYmTV745Y8neElm0ad9IZdCmplyyLZzOf+w95ZG+gIgFsmXjqQ9YXhdDzPH42bqwptlslNBL/imqb1fbSuO/y0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICdYwC8ehO4lz8Jwb5g4aYzDJwlejAesItJtBfs+BB4WAiAY0mjCvohVTJDAp8VndhThPFMB1Y7BahoD9HNsoyYDfQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.18.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3298787},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.18.0.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./copy":{"types":"./dist/copy.d.ts","default":"./dist/copy.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./guest":{"types":"./dist/guest.d.ts","default":"./dist/guest.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm archive:wasm:allocator-tests && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","test:bun":"bun node_modules/vitest/vitest.mjs run --config scripts/bun-vitest.config.ts","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","test:bun:native":"bun scripts/bun-native-proof.mjs && bun node_modules/vitest/vitest.mjs run --config scripts/bun-native-vitest.config.ts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:methods":"node benchmarks/runner.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && pnpm archive:wasm:allocator-tests && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs","archive:wasm:allocator-tests":"node scripts/build-archive-wasm.mjs --allocator-tests"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.18.0.tgz","_integrity":"sha512-eSPdJUUIHSPMc0iHwgvONxEtFQ8AwtDGBwWLjOau7THlnL173QArWE9xlsxsOOacAcjG6awVo25IU4D6Dxfzng==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@12.4.2","devDependencies":{"tar":"7.5.22","vite":"8.3.0","vitest":"^5.0.1","sigstore":"5.0.0","fast-check":"^4.10.1","typescript":"^7.0.2","@types/node":"^26.6.1","@napi-rs/cli":"3.10.3","@emnapi/runtime":"2.0.0-alpha.5","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.1","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.2","@openclaw/fs-safe-darwin-x64":"0.18.0","@openclaw/fs-safe-darwin-arm64":"0.18.0","@openclaw/fs-safe-linux-x64-gnu":"0.18.0","@openclaw/fs-safe-linux-x64-musl":"0.18.0","@openclaw/fs-safe-win32-x64-msvc":"0.18.0","@openclaw/fs-safe-linux-arm64-gnu":"0.18.0","@openclaw/fs-safe-linux-arm64-musl":"0.18.0"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.18.0_1790013678103_0.46208744179488237","host":"s3://npm-registry-packages-npm-production"}},"0.18.1":{"name":"@openclaw/fs-safe","version":"0.18.1","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.18.1","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"4f7ebb0f31d0f5c014cc956937caf9073783fc2d","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.18.1.tgz","fileCount":589,"integrity":"sha512-p56o1BFSQ2Ayc2+WhTJHfiWNyEtl8DOY15uUCUV/lvQILt+58651v964SpqNEgCvaXdccJvK/YHW5+ivOYKt0A==","signatures":[{"sig":"MEUCIF13UAvX1BzKy8nSCpMCclLF1vBuk8AvxRl00jr94545AiEAoBWqXDK2BeqnvQ77S35r6Pam+3lW3M5UIHhPHRMW0Mk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDsm/8T4C4cqMC5nHzto0Os9NVjonYfqQ3QPf6yJe6IuAIhAM3G1NyTOdnOndImXkwGmYvv3RZH+0miM2HI8G6c7KAW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.18.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3288786},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.18.1.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./copy":{"types":"./dist/copy.d.ts","default":"./dist/copy.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./guest":{"types":"./dist/guest.d.ts","default":"./dist/guest.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm archive:wasm:allocator-tests && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","test:bun":"bun node_modules/vitest/vitest.mjs run --config scripts/bun-vitest.config.ts","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","test:bun:native":"bun scripts/bun-native-proof.mjs && bun node_modules/vitest/vitest.mjs run --config scripts/bun-native-vitest.config.ts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:methods":"node benchmarks/runner.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && pnpm archive:wasm:allocator-tests && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs","archive:wasm:allocator-tests":"node scripts/build-archive-wasm.mjs --allocator-tests"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.18.1.tgz","_integrity":"sha512-p56o1BFSQ2Ayc2+WhTJHfiWNyEtl8DOY15uUCUV/lvQILt+58651v964SpqNEgCvaXdccJvK/YHW5+ivOYKt0A==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@12.4.2","devDependencies":{"tar":"7.5.22","vite":"8.3.0","vitest":"^5.0.1","sigstore":"5.0.0","fast-check":"^4.10.1","typescript":"^7.0.2","@types/node":"^26.6.1","@napi-rs/cli":"3.10.3","@emnapi/runtime":"2.0.0-alpha.5","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.1","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.2","@openclaw/fs-safe-darwin-x64":"0.18.1","@openclaw/fs-safe-darwin-arm64":"0.18.1","@openclaw/fs-safe-linux-x64-gnu":"0.18.1","@openclaw/fs-safe-linux-x64-musl":"0.18.1","@openclaw/fs-safe-win32-x64-msvc":"0.18.1","@openclaw/fs-safe-linux-arm64-gnu":"0.18.1","@openclaw/fs-safe-linux-arm64-musl":"0.18.1"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.18.1_1790080912871_0.6123842478786199","host":"s3://npm-registry-packages-npm-production"}},"0.18.2":{"name":"@openclaw/fs-safe","version":"0.18.2","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","_id":"@openclaw/fs-safe@0.18.2","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"homepage":"https://fs-safe.io","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"e7f3d7d80ca585e7e196323279c095f419d0c675","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.18.2.tgz","fileCount":587,"integrity":"sha512-ZurOE7wousc+xT1HhVw+/lkqLHms378GcHz8O9dlMAsXY+MGNLKpZncmjpuEVHPz292n82FC1mp2SCCRUnvbNg==","signatures":[{"sig":"MEQCICdhtv4zr76ody0SHHI2q87/zKaQyhVYZLMjUHxk/vr1AiB+qKz3nZdm9rKJ4L2KSYBHqsewZGnajp/1ZDoGD7L82g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDz4//kOnfE2KZZGq2Hw57oLycof1FiDdEoGbviVAA7ZAiB0vc3pW/RFpO8w+NS5/fAVQ5t3AljGofp1FCcbeoa/9w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.18.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3285942},"type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.18.2.tgz","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./copy":{"types":"./dist/copy.d.ts","default":"./dist/copy.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./guest":{"types":"./dist/guest.d.ts","default":"./dist/guest.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm archive:wasm:allocator-tests && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","test:bun":"bun node_modules/vitest/vitest.mjs run --config scripts/bun-vitest.config.ts","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","test:bun:native":"bun scripts/bun-native-proof.mjs && bun node_modules/vitest/vitest.mjs run --config scripts/bun-native-vitest.config.ts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:methods":"node benchmarks/runner.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && pnpm archive:wasm:allocator-tests && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs","archive:wasm:allocator-tests":"node scripts/build-archive-wasm.mjs --allocator-tests"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.18.2.tgz","_integrity":"sha512-ZurOE7wousc+xT1HhVw+/lkqLHms378GcHz8O9dlMAsXY+MGNLKpZncmjpuEVHPz292n82FC1mp2SCCRUnvbNg==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@12.4.2","devDependencies":{"tar":"7.5.22","vite":"8.3.0","vitest":"^5.0.1","sigstore":"5.0.0","fast-check":"^4.10.1","typescript":"^7.0.2","@types/node":"^26.6.1","@napi-rs/cli":"3.10.3","@emnapi/runtime":"2.0.0-alpha.5","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.1","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.2","@openclaw/fs-safe-darwin-x64":"0.18.2","@openclaw/fs-safe-darwin-arm64":"0.18.2","@openclaw/fs-safe-linux-x64-gnu":"0.18.2","@openclaw/fs-safe-linux-x64-musl":"0.18.2","@openclaw/fs-safe-win32-x64-msvc":"0.18.2","@openclaw/fs-safe-linux-arm64-gnu":"0.18.2","@openclaw/fs-safe-linux-arm64-musl":"0.18.2"},"_npmOperationalInternal":{"tmp":"tmp/fs-safe_0.18.2_1790141203114_0.675907744604243","host":"s3://npm-registry-packages-npm-production"}},"0.19.0":{"_id":"@openclaw/fs-safe@0.19.0","bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"dist":{"shasum":"12abaa9a743b8dfde7e3b4999aa2b9566650198f","tarball":"https://registry.npmjs.org/@openclaw/fs-safe/-/fs-safe-0.19.0.tgz","fileCount":587,"integrity":"sha512-skoljavKmNulSdsu40HtSHNf39RfdZIZ4bfzxMJLT6n/7RK2PIPPMhxp0FoilRaeh1d8AHJRj6b2ZeDvTY1rSA==","signatures":[{"sig":"MEQCIFdLGKlzar3Kzj/A5XsJXL+FWNUqSNrLr40BDHe3PoFhAiAv12c1m/TA0c+EJSTlsPW21kjDcffqcrD2gruLoxHx6A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGAAyF+knYanKm9yvamOsVel2iUUW3un41W8hoOVHD2mAiA+WxTamklTEylcToGaz76+Ds5SeDVoc6hZ4ykzJx62wg=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openclaw%2ffs-safe@0.19.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3294011},"name":"@openclaw/fs-safe","type":"module","_from":"file:/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.19.0.tgz","author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./copy":{"types":"./dist/copy.d.ts","default":"./dist/copy.js"},"./json":{"types":"./dist/json.d.ts","default":"./dist/json.js"},"./path":{"types":"./dist/path.d.ts","default":"./dist/path.js"},"./root":{"types":"./dist/root.d.ts","default":"./dist/root.js"},"./temp":{"types":"./dist/temp.d.ts","default":"./dist/temp.js"},"./walk":{"types":"./dist/walk.d.ts","default":"./dist/walk.js"},"./guest":{"types":"./dist/guest.d.ts","default":"./dist/guest.js"},"./store":{"types":"./dist/store.d.ts","default":"./dist/store.js"},"./types":{"types":"./dist/types.d.ts","default":"./dist/types.js"},"./atomic":{"types":"./dist/atomic.d.ts","default":"./dist/atomic.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"},"./errors":{"types":"./dist/errors.d.ts","default":"./dist/errors.js"},"./output":{"types":"./dist/output.d.ts","default":"./dist/output.js"},"./secret":{"types":"./dist/secret.d.ts","default":"./dist/secret.js"},"./archive":{"types":"./dist/archive.d.ts","default":"./dist/archive.js"},"./advanced":{"types":"./dist/advanced.d.ts","default":"./dist/advanced.js"},"./file-lock":{"types":"./dist/file-lock.d.ts","default":"./dist/file-lock.js"},"./durability":{"types":"./dist/durability.d.ts","default":"./dist/durability.js"},"./test-hooks":{"types":"./dist/test-hooks.d.ts","default":"./dist/test-hooks.js"},"./permissions":{"types":"./dist/permissions-public.d.ts","default":"./dist/permissions-public.js"},"./secure-file":{"types":"./dist/secure-file.d.ts","default":"./dist/secure-file.js"},"./package.json":"./package.json","./secure-temp-root":{"types":"./dist/secure-temp-dir.d.ts","default":"./dist/secure-temp-dir.js"}},"license":"MIT","scripts":{"test":"vitest run","build":"node scripts/prepack-build.mjs","check":"pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm archive:wasm:allocator-tests && pnpm docs:check && pnpm test && node scripts/check-pack.mjs","prepack":"node scripts/prepack-build.mjs","test:bun":"bun node_modules/vitest/vitest.mjs run --config scripts/bun-vitest.config.ts","benchmark":"node scripts/benchmark.mjs","docs:site":"node scripts/build-docs-site.mjs","docs:check":"node scripts/check-doc-examples.mjs","pack:check":"pnpm build && node scripts/check-pack.mjs","crabbox:run":"crabbox run","native:test":"cargo test --workspace","archive:wasm":"node scripts/build-archive-wasm.mjs","crabbox:stop":"crabbox stop","native:build":"pnpm --filter @openclaw/fs-safe-native-build build","test:changed":"pnpm run test","check:changed":"pnpm run check","package:smoke":"node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts","release:notes":"node scripts/release-notes.mjs","test:coverage":"vitest run --coverage","test:security":"vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts","crabbox:warmup":"crabbox warmup","lint:file-size":"node scripts/check-file-size.mjs","crabbox:hydrate":"crabbox actions hydrate","package:collect":"node scripts/check-release-packages.mjs --output release-artifacts","test:bun:native":"bun scripts/bun-native-proof.mjs && bun node_modules/vitest/vitest.mjs run --config scripts/bun-native-vitest.config.ts","lint:fs-boundary":"node scripts/check-fs-boundary-primitives.mjs","benchmark:methods":"node benchmarks/runner.mjs","benchmark:publish":"pnpm build && node scripts/bench-publish.mjs","public-api:update":"pnpm build && node scripts/check-pack.mjs --update-public-api","test:coverage:merge":"node scripts/merge-coverage.mjs","test:coverage:collect":"pnpm build && pnpm archive:wasm:allocator-tests && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0","archive:producer-smoke":"node scripts/archive-producer-smoke.mjs","archive:wasm:allocator-tests":"node scripts/build-archive-wasm.mjs --allocator-tests"},"version":"0.19.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:71485d21-a8c3-4f6c-ae40-dd60e3585161"}},"homepage":"https://fs-safe.io","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"_resolved":"/home/runner/work/fs-safe/fs-safe/release-artifacts/openclaw-fs-safe-0.19.0.tgz","_integrity":"sha512-skoljavKmNulSdsu40HtSHNf39RfdZIZ4bfzxMJLT6n/7RK2PIPPMhxp0FoilRaeh1d8AHJRj6b2ZeDvTY1rSA==","repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"_npmVersion":"12.0.2","description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","directories":{},"maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"sideEffects":false,"_nodeVersion":"24.21.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@12.4.2","devDependencies":{"tar":"7.5.22","vite":"8.3.0","vitest":"^5.0.1","sigstore":"5.0.0","fast-check":"^4.10.1","typescript":"^7.0.2","@types/node":"^26.6.1","@napi-rs/cli":"3.10.3","@emnapi/runtime":"2.0.0-alpha.5","istanbul-reports":"3.2.0","@vitest/coverage-v8":"5.0.1","istanbul-lib-report":"3.0.1","istanbul-lib-coverage":"3.2.2"},"optionalDependencies":{"jszip":"^3.10.2","@openclaw/fs-safe-darwin-x64":"0.19.0","@openclaw/fs-safe-darwin-arm64":"0.19.0","@openclaw/fs-safe-linux-x64-gnu":"0.19.0","@openclaw/fs-safe-linux-x64-musl":"0.19.0","@openclaw/fs-safe-win32-x64-msvc":"0.19.0","@openclaw/fs-safe-linux-arm64-gnu":"0.19.0","@openclaw/fs-safe-linux-arm64-musl":"0.19.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/fs-safe_0.19.0_1790288272545_0.050097501705054226"}}},"time":{"created":"2026-05-06T00:56:12.903Z","modified":"2026-09-24T22:17:53.014Z","0.1.0":"2026-05-06T00:56:13.211Z","0.1.1":"2026-05-06T01:30:19.977Z","0.1.2":"2026-05-06T03:55:45.741Z","0.2.0":"2026-05-07T10:07:42.188Z","0.2.1":"2026-05-08T11:26:53.408Z","0.2.2":"2026-05-11T07:46:06.770Z","0.2.3":"2026-05-14T06:26:12.279Z","0.2.4":"2026-05-14T06:54:07.417Z","0.2.5":"2026-05-16T21:31:33.323Z","0.2.6":"2026-05-17T06:44:49.762Z","0.2.7":"2026-05-20T18:16:04.215Z","0.3.0":"2026-05-21T23:12:26.380Z","0.4.0":"2026-06-18T03:53:27.015Z","0.4.1":"2026-07-01T09:13:00.992Z","0.4.2":"2026-07-19T02:41:02.564Z","0.4.3":"2026-07-19T04:22:40.081Z","0.4.4":"2026-07-19T05:35:03.124Z","0.4.5":"2026-07-21T05:31:39.569Z","0.4.6":"2026-07-24T10:47:24.276Z","0.4.7":"2026-07-24T23:18:35.891Z","0.5.0":"2026-07-28T00:19:42.846Z","0.5.1":"2026-08-02T02:37:52.971Z","0.5.2":"2026-08-03T03:35:30.471Z","0.5.3":"2026-08-09T04:13:56.852Z","0.5.4":"2026-08-10T13:30:49.362Z","0.5.5":"2026-08-12T04:16:43.387Z","0.5.6":"2026-08-14T20:15:48.591Z","0.6.0":"2026-08-29T19:01:29.601Z","0.7.0":"2026-08-31T16:29:50.754Z","0.7.1":"2026-09-01T18:21:01.964Z","0.7.2":"2026-09-01T19:57:47.311Z","0.8.0":"2026-09-04T17:46:29.445Z","0.8.1":"2026-09-04T22:51:54.214Z","0.8.2":"2026-09-05T20:31:51.118Z","0.8.3":"2026-09-07T01:23:34.233Z","0.8.4":"2026-09-07T04:45:20.058Z","0.8.5":"2026-09-07T09:52:45.348Z","0.8.6":"2026-09-07T10:55:13.458Z","0.9.0":"2026-09-11T22:46:47.142Z","0.10.0":"2026-09-13T08:35:02.755Z","0.11.0":"2026-09-14T07:50:46.406Z","0.12.0":"2026-09-15T12:38:42.129Z","0.13.0":"2026-09-16T17:57:50.666Z","0.13.1":"2026-09-16T22:00:56.413Z","0.14.0":"2026-09-17T09:58:55.050Z","0.15.0":"2026-09-18T15:34:36.392Z","0.16.0":"2026-09-19T06:44:27.800Z","0.17.0":"2026-09-20T16:54:35.482Z","0.18.0":"2026-09-21T18:01:18.267Z","0.18.1":"2026-09-22T12:41:53.020Z","0.18.2":"2026-09-23T05:26:43.267Z","0.19.0":"2026-09-24T22:17:52.679Z"},"bugs":{"url":"https://github.com/openclaw/fs-safe/issues"},"author":{"name":"OpenClaw Team","email":"dev@openclaw.ai"},"license":"MIT","homepage":"https://fs-safe.io","keywords":["filesystem","openclaw","path-traversal","security","typescript"],"repository":{"url":"git+https://github.com/openclaw/fs-safe.git","type":"git"},"description":"Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.","maintainers":[{"name":"steipete","email":"steipete@gmail.com"},{"name":"vincentkoc","email":"vincentkoc@ieee.org"}],"readme":"# 🛡️ @openclaw/fs-safe\n\n![fs-safe banner](docs/assets/readme-banner.jpg)\n\n[![npm](https://img.shields.io/npm/v/@openclaw/fs-safe.svg?color=10b981&label=npm)](https://www.npmjs.com/package/@openclaw/fs-safe)\n[![ci](https://github.com/openclaw/fs-safe/actions/workflows/ci.yml/badge.svg)](https://github.com/openclaw/fs-safe/actions/workflows/ci.yml)\n[![node](https://img.shields.io/node/v/@openclaw/fs-safe.svg?color=10b981)](https://nodejs.org)\n[![license](https://img.shields.io/npm/l/@openclaw/fs-safe.svg?color=10b981)](LICENSE)\n[![docs](https://img.shields.io/badge/docs-fs--safe.io-10b981)](https://fs-safe.io)\n\nCapability-style filesystem roots for Node.js apps that handle untrusted relative paths.\n\nThink Go's `os.Root` / `OpenInRoot` or Rust's [`cap-std`](https://github.com/bytecodealliance/cap-std), but for Node. Hand `root()` a trusted directory and you get back a handle whose every method resolves relative paths against it and defends against `..`, symlink swaps, hardlink aliases, and TOCTOU rename races. The exact containment strength is reported per mechanism: Linux native opens are kernel-atomic; macOS, Windows, and JavaScript paths are best-effort.\n\n```ts\nimport { root } from \"@openclaw/fs-safe\";\n\nconst fs = await root(\"/safe/workspace\");\nawait fs.write(\"notes/today.txt\", \"hello\\n\");   // ok\nawait fs.write(\"../escape.txt\", \"x\");            // throws FsSafeError(\"outside-workspace\")\n```\n\nThat's the whole pitch. `root()` is the product; the rest of the package — JSON stores, atomic writes, secret files, archive extraction, temp workspaces — is supporting cast for the same boundary.\n\nFull docs and reference at **[fs-safe.io](https://fs-safe.io)**.\n\n## Contents\n\n[Why this exists](#why-this-exists) · [Not a sandbox](#not-a-sandbox) · [Install](#install) · [0.6 migration](docs/migrating-to-0.6.md) · [Python migration](#migrating-from-the-python-helper) · [Quick start](#quick-start) · [Reading](#reading) · [Subpaths](#subpaths) · [Failure semantics](#failure-semantics-in-the-name) · [Directory durability](#directory-durability) · [Atomic writes](#atomic-writes) · [External outputs](#external-outputs) · [Stores](#stores) · [Secure absolute reads](#secure-absolute-file-reads) · [Walking](#directory-walking) · [Archive extraction](#archive-extraction) · [Path scopes](#advanced-path-scopes) · [Errors](#errors) · [Safety model](#safety-model) · [Limitations](#limitations)\n\n## Why this exists\n\nMost Node code that has to touch caller-controlled paths reaches for:\n\n```ts\npath.resolve(root, input).startsWith(root)\n```\n\nThat validates a *string*. It does not pin the file you opened, defend against a symlink retarget between check and use, reject hardlinked aliases of out-of-tree inodes, or verify that a write landed where you intended after a rename. The pieces to do those things exist scattered across the ecosystem — [`write-file-atomic`](https://www.npmjs.com/package/write-file-atomic) for atomic writes, `tar` / `jszip` for archive extraction, various `safefs`-style convenience wrappers — but none of them give you one root handle with traversal-resistant semantics across every operation.\n\nThe same idea has landed in other languages. Go [added `os.Root` and `OpenInRoot`](https://go.dev/blog/osroot); Rust has had [`cap-std`](https://github.com/bytecodealliance/cap-std) for years. Node's `fs` is path-string-oriented and exposes flags like `O_NOFOLLOW` but not an ergonomic \"operate inside this root\" API. `fs-safe` fills that gap.\n\n| | Root boundary | Atomic writes | Symlink/hardlink defense | TOCTOU resistance | Archive extraction |\n|---|---|---|---|---|---|\n| `path.resolve().startsWith()` | string check only | – | – | – | – |\n| [`write-file-atomic`](https://www.npmjs.com/package/write-file-atomic) | – | ✓ | – | – | – |\n| Go [`os.Root`](https://go.dev/blog/osroot) / Rust [`cap-std`](https://github.com/bytecodealliance/cap-std) | ✓ | platform | ✓ | ✓ | – |\n| **`@openclaw/fs-safe`** | **✓** | **✓** | **✓** | **Linux atomic; others best-effort** | **✓ (ZIP/TAR/gzip/zstd/bzip2)** |\n\n## Not a sandbox\n\nThis is a **library-level guardrail**, not OS-level isolation. It does not replace containers, seccomp, AppArmor, or filesystem permissions. It is for code that already runs with the privileges of its workspace and wants to stop trivial path tricks from escaping it. If your threat model is a hostile process, you need OS isolation; if your threat model is \"an agent, plugin, upload handler, or CLI will eventually be tricked into writing somewhere it shouldn't,\" `fs-safe` catches that. The [security model](docs/security-model.md) describes the exact Linux, macOS, Windows, and JavaScript fallback guarantees and race boundaries.\n\n## Install\n\n```sh\npnpm add @openclaw/fs-safe\n```\n\nNode 22 or newer. Core root/path/json/temp helpers avoid framework dependencies. With all optional dependencies omitted, public subpaths remain safe to import and fallback-capable operations work in `auto` or `off`. Native-only features, including no-clobber `Root.move()` and [`private: true` creation on macOS](docs/creation.md#permission-options), remain unavailable and fail with `helper-unavailable`. TAR, gzip, zstd, and bzip2 extraction and bounded entry reads use the same Rust TAR parser through bundled WASM when native support is disabled or absent. Zstd/bzip2 codecs are bundled too; gzip uses Node's built-in decoder. ZIP fallback still needs optional `jszip`. See the [0.6 migration guide](docs/migrating-to-0.6.md).\n\nBun 1.4.2 is also supported with the [Bun runtime requirements](docs/install.md#bun-runtime), including the matching Rust addon on macOS and Linux. JIT-disabled Bun works too.\n\nThe package installs one prebuilt native binding for the current supported target. It\nsupplies fd-relative and atomic no-replace primitives that Node does not expose\ndirectly. Configure the lazy loader before first use when you need a strict\nenvironment policy:\n\n```ts\nimport { configureFsSafeNative } from \"@openclaw/fs-safe\";\n\nconfigureFsSafeNative({ mode: \"auto\" });    // default: native when available\nconfigureFsSafeNative({ mode: \"off\" });     // disable the addon; use supported fallbacks\nconfigureFsSafeNative({ mode: \"require\" }); // fail closed if the binding is unavailable\n```\n\nNative mode performs `write()`, `create()`, and `copyIn()` parent creation and\npublication relative to pinned directory descriptors, including atomic\nreplacement. The JavaScript path selected by `off`, or by `auto` when no\nbinding can load, is explicitly best-effort: a same-privilege peer that can\nreplace a writable parent between its identity check and Node's pathname\nmutation can redirect that mutation outside the root before the post-check\nreports the escape. Use `require` when hostile concurrent mutation is in scope.\n\nEquivalent env var: `FS_SAFE_NATIVE_MODE=auto|off|require`. The seven bindings\nship as exact-version optional packages filtered by OS, CPU, and Linux libc, so\na normal install receives only its matching binary. There are no postinstall\nsteps, runtime downloads, or consumer Rust builds. On a platform without a\npublished binding, or when optional dependencies are omitted, `auto` silently retains lexical and canonical root\nchecks, no-follow opens, guarded temp+rename writes, and post-write identity\nverification. See the [native\nhelper policy](docs/native-helper.md) for the exact boundary and deployment\ntradeoff, and [native architecture](docs/native.md) for the platform mechanisms\nand policy ownership model.\n\nOpen results report the mechanism's containment class as `\"kernel-atomic\"` or\n`\"best-effort\"`. Linux native `openBeneath()` is kernel-atomic; macOS, Windows,\nand guarded JavaScript results are best-effort. See the [security model](docs/security-model.md#containment-guarantees-by-platform) before using that fact in higher-level policy.\n\n## Migrating from the Python helper\n\nVersion 0.5 replaces the persistent Python worker with prebuilt native\nbindings. The modes map directly: `configureFsSafePython({ mode: \"auto\" })`\nbecomes `configureFsSafeNative({ mode: \"auto\" })`, and likewise for `off` and\n`require`. Replace `FS_SAFE_PYTHON_MODE` with `FS_SAFE_NATIVE_MODE`; remove\n`pythonPath`, `FS_SAFE_PYTHON`, and interpreter provisioning because the native\nloader does not spawn Python.\n\nVersion 0.5 retains the old function and documented `FS_SAFE_PYTHON*`\nand OpenClaw Python environment names emit one `FS_SAFE_PYTHON_DEPRECATED`\nwarning and map the old mode to its native equivalent. They are migration\nbridges for shipped 0.4 consumers, not an alternate helper contract. Update\nstartup configuration as part of the 0.5 upgrade rather than relying on the\nwarning path. Follow the [0.5 migration checklist](docs/migrating-to-0.5.md).\n\n## Quick start\n\n```ts\nimport { root } from \"@openclaw/fs-safe\";\n\nconst fs = await root(\"/safe/workspace\", {\n  hardlinks: \"reject\",\n  symlinks: \"reject\",\n  mkdir: true,\n  mode: 0o600,\n});\n\nawait fs.write(\"notes/today.txt\", \"hello\\n\");\nconst text = await fs.readText(\"notes/today.txt\");\nconst config = await fs.readJson(\"config.json\");\nawait fs.copyIn(\"uploads/upload.png\", \"/tmp/upload.png\");\nawait fs.move(\"notes/today.txt\", \"notes/archive/today.txt\", { overwrite: true });\nawait fs.remove(\"notes/archive/today.txt\");\n```\n\nUse `remove(path, { recursive: true, maxEntries: 20_000, maxDepth: 32 })` for\nbounded tree cleanup. It streams directory entries, checks mutation authority\nbefore every removal, and supports cancellation. See [removal options and partial\nfailure semantics](docs/writing.md).\n\n`root()` takes the trusted directory; relative paths in subsequent calls are resolved against it. Defaults you pass to `root()` apply to every call below; per-call options override them.\n\n`copyIn()` also accepts `{ root: sourceRoot, relativePath }`, `overwrite: false`,\nand `clone: \"auto\"` for guarded, exclusive file copies with optional native\ncopy-on-write acceleration. Byte limits, cancellation, and publication receipts\nare described in the [Root copy contract](docs/root.md#writes).\n\nWhen you need metadata or a `FileHandle`:\n\n```ts\nconst { buffer, realPath, stat } = await fs.read(\"notes/today.txt\");\nconst opened = await fs.open(\"notes/today.txt\");\n```\n\n`create()` is the don't-clobber variant of `write()` and throws `already-exists` when the target already exists:\n\n```ts\nawait fs.create(\"notes/README.md\", \"seed\\n\"); // throws if it already exists\n```\n\nUse `private: true` on `mkdir()`, `ensureRoot()`, `create()`, or `createJson()`\nfor private creation. On macOS, this requires native ACL inspection before\ncreating parents or stages and verifies owner-only permissions with no ACL\nbefore writing payload bytes. Native `off` or a missing ACL capability rejects\nwith `helper-unavailable`; nonprivate creation is unchanged. See the\n[creation contract](docs/creation.md#permission-options) for parent ACL handling\nand platform support.\n\nPass `{ atomic: true }` to buffered `create()` or `createJson()` to keep the\ndestination absent until complete content is ready, including with native support\ndisabled. The JavaScript fallback requires hardlinks and never downgrades to a\npartial visible file. Omitted or `false` retains the existing buffered behavior.\nAtomic visibility is separate from the existing `durable` synchronization policy.\nUse `durable: \"file\"` on `create()` or `createJson()` when file-flush errors,\nincluding `EPERM`, must propagate. It combines with `atomic: true` without\nrequiring strict parent-directory synchronization.\n\n`create()` also accepts an `AsyncIterable<Uint8Array>` for large or incrementally\nproduced files. Streamed creates keep the destination absent until all chunks\nare written, support `maxBytes` and `signal`, and recheck mutation authority\nbefore writes and publication. See [streamed creation](docs/writing.md#streamed-creation)\nfor producer ownership and cancellation semantics.\n\n`write()` replaces file contents by default; pass `{ overwrite: false }` or use `create()` when an existing file should be an error. `move()` defaults to no clobber because it can otherwise delete an unrelated target while also consuming the source. No-clobber moves require the native helper so the collision decision and rename are one descriptor-relative operation; they fail with `helper-unavailable` rather than falling back to a replacing rename. Pass `{ overwrite: true }` when replacing the target is intended.\n\nMutating methods accept `assertBeforeMutation: () => void` for live lease or\ncancellation checks immediately before filesystem dispatch. Root defaults and\nper-call checks compose; cleanup and already-dispatched work still settle.\nSee [live mutation authority](docs/root.md#live-mutation-authority) for the exact\nscope, including raw writable handles and lock bookkeeping.\nFor workspaces with directory aliases, use `symlinks: \"follow-parents-within-root\"`\non reads and `mutationSymlinks: \"follow-parents-within-root\"` on mutations or root\ndefaults. Contained parent symlinks are resolved by the library, while a final\nsymlink is rejected. Read policy and mutation policy are separate; omitting\n`mutationSymlinks` preserves the existing mutation behavior. See [root policies](docs/root.md#defaults-vs-per-call-options).\n\nUse `ensureRoot()` when a computed relative directory target resolves to the root itself (`\"\"` or `\".\"`) and you want the operation to be accepted. `root()` still requires the trusted root directory to already exist.\n\n## Reading\n\nPick the narrowest read shape that gives you what you need:\n\n```ts\nawait fs.readJson(\"config.json\"); // parsed value; validate it at your boundary\nawait fs.readText(\"notes/today.txt\");\nawait fs.readBytes(\"image.png\");\nawait fs.read(\"notes/today.txt\"); // { buffer, realPath, stat }\nconst opened = await fs.open(\"large.log\"); // FileHandle for streaming\n```\n\nFor streams, use `open()` and the returned `FileHandle`:\n\n```ts\nawait using opened = await fs.open(\"large.log\");\n{\n  const stream = opened.handle.createReadStream();\n  // consume stream\n}\n```\n\nRoot reads default to `DEFAULT_ROOT_MAX_BYTES` (16 MiB). Pass a larger `maxBytes`\nfor expected large reads, or `Number.POSITIVE_INFINITY` when the caller has a\nseparate size budget.\n\n`reader()` returns a callback that reads absolute or relative paths through the same root boundary. It is useful for APIs that accept a `(path) => Promise<Buffer>` loader. For roots configured through a directory symlink or Windows junction, absolute inputs may use either the configured spelling or the canonical real path. Absolute paths outside the root are rejected with `outside-workspace`. `readAbsolute()` has the same absolute-path behavior directly.\n\nWhen you need a writable `FileHandle`, use `openWritable()` and prefer `await using` for cleanup:\n\n```ts\nawait using opened = await fs.openWritable(\"logs/current.log\", { writeMode: \"append\" });\n{\n  await opened.handle.appendFile(\"line\\n\");\n}\n```\n\n`nonBlockingRead` remains as a compatibility hint in `RootDefaults`. Safe read/open operations already use nonblocking descriptor opens where the platform supports them so a raced FIFO cannot pin a worker; filesystem safety policy remains explicit through `hardlinks`, `symlinks`, and `denyMutations`.\n\nOn POSIX, `openWritable()` also uses nonblocking admission for existing targets\nso a no-reader FIFO cannot stall validation. Ordinary regular-file write\nsemantics are unchanged; see [writing](docs/writing.md#openwritable-for-streaming).\n\n```ts\nconst locked = await root(\"/srv/workspace\", {\n  denyMutations: {\n    paths: [\"/srv/workspace/.env\"],\n    prefixes: [\"/srv/workspace/.ssh\"],\n  },\n});\n\nawait locked.write(\".env\", \"token\"); // FsSafeError code \"denied-path\"\n```\n\n`stat()`, `exists()`, `list()`, and `entries()` check the exact selected objects while collecting their advisory results, but they cannot pin a later operation to the same filesystem object. Use `read()`, `open()`, `write()`, `create()`, `copyIn()`, `move()`, or `remove()` for operation-local identity checks, and inspect `containment` when the platform distinction matters.\n\n## Subpaths\n\nThe main entry point collects the common root, config, output, lock, native-mode,\nand error exports. Prefer focused subpaths when a consumer needs a narrower\ncontract. Low-level helpers that OpenClaw needs to compose higher-level APIs are grouped under\n`@openclaw/fs-safe/advanced` instead of being separate public leaf contracts.\n\n| Subpath | Contents |\n|---|---|\n| `@openclaw/fs-safe/root` | `root()`, `Root`, `RootDefaults`, and root-bounded walking with pruning/error markers |\n| `@openclaw/fs-safe/config` | process-global native helper and lock defaults |\n| `@openclaw/fs-safe/path` | canonical path checks: `isPathInside`, `safeRealpathSync`, `isNotFoundPathError`, `isSymlinkOpenError` |\n| `@openclaw/fs-safe/json` | `tryReadJson`, `readJson`, `readJsonIfExists`, `writeJson`, sync variants |\n| `@openclaw/fs-safe/output` | `writeExternalFileWithinRoot` for external libraries that need a temp output path |\n| `@openclaw/fs-safe/store` | `fileStore`, `fileStoreSync`, and `jsonStore` |\n| `@openclaw/fs-safe/secret` | sync/async strict and try-style secret reads, atomic replace, and create-only secret writes |\n| `@openclaw/fs-safe/atomic` | `replaceFileAtomic`, `replaceFileAtomicSync`, `replaceDirectoryAtomic`, `movePathWithCopyFallback` |\n| `@openclaw/fs-safe/durability` | pinned directory identities, strict directory sync, durable nested-directory creation, exclusive publication, streaming and synchronous SHA-256, provenance receipts, and sync-failure policy |\n| `@openclaw/fs-safe/temp` | `tempWorkspace`, `tempWorkspaceSync`, `withTempWorkspace`, `resolveSecureTempRoot` |\n| `@openclaw/fs-safe/secure-file` | fd-pinned absolute file reads with owner, mode, ACL, trusted-dir, size, and timeout checks |\n| `@openclaw/fs-safe/file-lock` | async/sync sidecar locks, root-bounded sidecars, ownership verification, and stale policy |\n| `@openclaw/fs-safe/permissions` | POSIX mode and Windows ACL inspection, raw owner/ACE facts, private-directory creation, and remediation helpers |\n| `@openclaw/fs-safe/walk` | budget-bounded directory walking with symlink policy, filters, and truncation accounting; not root-bounded |\n| `@openclaw/fs-safe/copy` | directory copying with `clone: \"auto\"`, `\"always\"`, or `\"never\"`; native APFS, Btrfs, ReFS, XFS, and ZFS cloning, portable byte copying, and clone metadata; see [directory copying](docs/copy.md) |\n| `@openclaw/fs-safe/archive` | policy-driven ZIP/TAR extraction, clamp/filter policy, metadata/path-depth limits, gzip/zstd/bzip2 support, and bounded entry reads |\n| `@openclaw/fs-safe/advanced` | lower-level composition helpers such as path scopes, root-file open, bounded descriptor reads, [borrowed-handle and descriptor copying](docs/copy.md#borrowed-filehandle-transfers), [complete byte-window writes](docs/advanced.md#borrowed-handle-writes), [exact directory identity](docs/directory-identity.md), [case probing](docs/path-case.md), [suffix-alias probing](docs/path-suffix-aliases.md), [in-place writes](docs/in-place-write.md), [versioned install-ID encoding](docs/install-path.md#safepathsegmenthashedv2), filename sanitizing, temp-file targets, sibling-temp writes, local-root readers, regular-file helpers, `pathExists`, and `withTimeout`; less stable than focused public subpaths |\n| `@openclaw/fs-safe/errors` | `FsSafeError`, closed codes/categories, causes, and operation-specific details receipts |\n| `@openclaw/fs-safe/types` | shared types: `DirEntry`, `PathStat`, … |\n| `@openclaw/fs-safe/test-hooks` | hooks the test suite uses to inject races; registration requires `NODE_ENV=test` or `VITEST=true` |\n| `@openclaw/fs-safe/guest` | Python source and exit constants for caller-launched filesystem operations in Linux/macOS guests without Node; see the [guest protocol and trust boundary](docs/guest.md) |\n\n## Failure semantics in the name\n\nWhen two helpers behave differently on the same input, the difference is in the name, not the docs.\n\n```ts\nimport { readJson, tryReadJson } from \"@openclaw/fs-safe/json\";\n\nawait tryReadJson(\"./config.json\"); // returns null on missing or invalid\nawait readJson(\"./manifest.json\");  // throws on missing or invalid\n```\n\nFor one-off structured reads under a trusted root, `readRootJsonObjectSync()`\nperforms the root-bounded open and JSON object validation in one step. Use\n`readRootStructuredFileSync()` when the parser lives outside fs-safe, such as\nJSON5-backed plugin manifests.\n\n## Directory durability\n\n```ts\nimport { ensureDurableDirectory, pinDirectory } from \"@openclaw/fs-safe/durability\";\n\nconst receipt = await ensureDurableDirectory({\n  directoryPath: \"/srv/backups/sqlite\",\n  mode: 0o700,\n});\nconst pinned = await pinDirectory(receipt);\ntry {\n  await publishSnapshot();\n  const outcome = await pinned.sync();\n  // `unsupported` is explicit on platforms without directory flushing.\n  console.log(outcome.status);\n} finally {\n  await pinned.close();\n}\n```\n\nThe durability subpath pins a directory descriptor to its pathname identity,\ndetects symlink/FIFO/replacement races, and synchronizes every new parent edge\nwhen creating a nested directory. Strict sync propagates real I/O failures and\nreports known Windows directory-flush limitations explicitly. Separate\nbest-effort helpers preserve operations that do not promise crash durability.\n\n`publishFileExclusive()` adds no-clobber hardlink/copy/rename strategies and a\ntyped post-creation receipt. Its `onSyncFailure` policy defaults to\n`\"rollback\"`; backup writers can choose `\"preserve\"` to keep a complete target\nwhen parent-directory sync fails, then inspect `details.directorySync` and\nretry or record the weaker durability state.\n\nSee [Directory durability](docs/durability.md) for the receipt, pin lifecycle,\npublication policy, creation callback, and platform contract.\n\n## Atomic writes\n\nFor preparation that must survive a parent rename until abort cleanup, use\n[`stageFileInDirectory()`](docs/staged-file.md) from `advanced`. It retains the\noriginal directory on Linux/macOS and requires native support for this operation.\nIt offers atomic replace/no-replace publication, not expected-inode replacement\nor a crash-durability promise; application checks and coordination remain yours.\n\n`replaceFileAtomic()` writes a sibling temp file, applies its exact mode through the still-open descriptor, optionally fsyncs it, and renames it over the destination. It never follows the published destination path to set file permissions. Mode preservation inherits only rwx bits from an existing non-symlink regular file; special bits, ownership, ACLs, and extended attributes are not copied. Pinned-destination hardlink rejection, rename retry / copy fallback on `EPERM`, bounded original-content restoration after a torn fallback, parent-directory fsync, and a `beforeRename` hook for backup or observer flows are all opt-in. `movePathWithCopyFallback()` stages cross-device moves before commit and removes only the copied source entries, so concurrent source additions or replacements are preserved. Its optional synchronous `assertBeforeMutation` hook rechecks caller authority before renames and each source removal; `onDestinationPublished` reports an exact bigint destination identity before later checks or cleanup can fail. See [mutation authority and publication receipts](docs/atomic.md#mutation-authority-and-publication-receipts).\n\n```ts\nimport { replaceFileAtomic } from \"@openclaw/fs-safe/atomic\";\n\nawait replaceFileAtomic({\n  filePath: \"/safe/workspace/state.json\",\n  content: JSON.stringify(state, null, 2),\n  mode: 0o600,\n  syncTempFile: true,\n  syncParentDir: true,\n});\n```\n\n`replaceFileAtomicSync()` covers the synchronous case with the same options shape. Both accept an injectable `fileSystem` for tests. Async adapters use `chmod()` on the `FileHandle` returned by their required `open()` operation; custom sync adapters using `mode` or `preserveExistingMode` provide the optional descriptor-bound `fchmodSync` operation.\n\n## External outputs\n\nUse `writeExternalFileWithinRoot()` when a browser download, renderer, media\ntool, or native library needs an absolute path to write to:\n\n```ts\nimport { writeExternalFileWithinRoot } from \"@openclaw/fs-safe/output\";\n\nawait writeExternalFileWithinRoot({\n  rootDir: \"/safe/workspace/downloads\",\n  path: \"reports/today.pdf\",\n  staging: \"sibling\",\n  write: async (filePath) => {\n    await download.saveAs(filePath);\n  },\n});\n```\n\nThe callback receives a staged path, not the final destination. The default\n`\"workspace\"` mode uses private temp storage plus `Root.copyIn()` for\ncross-device-tolerant finalization. `\"sibling\"` stages in the target directory,\nfsyncs the completed file, and atomically renames it over the target. Choose it\nwhen the destination directory is itself the writable boundary and atomic\nreplacement matters.\n\nFor sibling producers that can leave partial output before throwing, opt in to\n`producerIsolation: \"private-directory\"`. The callback writes inside an owned\nprivate workspace on the target filesystem, allowing cleanup after producer\nfailure while preserving sibling publication behavior. See [external outputs](docs/output.md)\nfor the identity checks and cleanup limits.\n\nUse it when the final filename is known before the external writer runs. If the\nfilename depends on sniffing the produced bytes, write to a private temp\nworkspace first, then finalize through the normal root APIs after validation.\n\n## Stores\n\nUse `fileStore().json()` for small state files that need explicit fallback\nreads, atomic writes, and optional sidecar locking around read-modify-write\nupdates:\n\n```ts\nimport { fileStore } from \"@openclaw/fs-safe/store\";\n\nconst files = fileStore({ rootDir: \"/safe/workspace/state\", private: true });\nconst store = files.json(\"settings.json\", { lock: true });\n\nawait store.updateOr({ enabled: false }, (current) => ({ ...current, enabled: true }));\n```\n\n`jsonStore({ filePath })` is the single-path convenience wrapper for the same\nprimitive and exposes its resolved absolute path.\n\nUse `update()` when missing state is part of your model; use `updateOr()` for\nthe common merge-into-defaults case. Standalone helpers use options bags\nbecause they do not carry a bound root and often need multiple authority, path,\nand policy knobs.\n\nSidecar locks fail closed on stale holders by default. Opt-in `remove-if-unchanged`\nrecovery requires caller approval and serializes snapshot verification and unlink\nwith an exclusive reclaim guard so a replacement lock cannot be deleted; see the\n[file lock docs](docs/sidecar-lock.md).\n\nUse `fileStore()` for cache/blob/media-style directories where callers\nneed safe relative paths, size limits, atomic replacement, stream writes, and\nTTL cleanup behind one root. Pass `private: true` for credentials, auth\nprofiles, tokens, and per-agent private state; private mode keeps the same\nstore shape while routing writes through the secret-file atomic path.\n\n```ts\nimport { fileStore } from \"@openclaw/fs-safe/store\";\n\nconst media = fileStore({\n  rootDir: \"/safe/workspace/media\",\n  maxBytes: 5 * 1024 * 1024,\n  mode: 0o600,\n});\n\nawait media.write(\"inbound/photo.jpg\", bytes);\nawait media.writeJson(\"state/photo.json\", { id: \"photo\" });\nconst cached = await media.readJsonIfExists(\"state/photo.json\");\nconst opened = await media.open(\"inbound/photo.jpg\");\nawait media.pruneExpired({ ttlMs: 10 * 60 * 1000, recursive: true });\n```\n\nThe `store` subpath also includes durable JSON queue helpers for the common\n\"one JSON file per work item\" pattern: atomic entry writes, pending-entry loads,\nacknowledgement via `.delivered` markers, failed-entry moves, and stale temp\ncleanup. On Windows, every independently supplied queue path rejects NTFS\nalternate-stream and directory-index namespace spellings before reads, locks,\nor mutations. Retry, dedupe, and transport semantics stay with the caller.\n\n`tempWorkspace()` exposes `write()`, `writeText()`, `writeJson()`, `copyIn()`, and `read()` for\nsingle-file scratch workflows without hand-rolled path joins, plus a `store: FileStore` view of\nthe workspace dir for the richer cases (`writeStream`, `readJsonIfExists`, `store.json<T>(rel)`).\nCompatible creation and cleanup remain available without native support.\nSet `cleanupSafety: \"require-bounded\"` to require collision-safe quarantine and\ndescriptor-bounded recursive cleanup before creating a child. See the\n[temp workspace contract](docs/temp.md).\nOn POSIX, bounded cleanup requires owner read and search in the final `dirMode`\n(`0o500`); restrictive modes select compatible fallback or reject `require-bounded`\nbefore child creation.\nLinux bounded cleanup requires the exact `openat2`/`RESOLVE_NO_XDEV` capability\nat runtime; compatible mode falls back when unavailable, while `require-bounded`\nrejects before child creation.\n\n`tempFile()` is the smaller one-file temp helper. It is intentionally an\nadvanced primitive: use `tempWorkspace()` for the stable temp surface and reach\nfor `tempFile()` only when you need a raw file target.\n\n```ts\nimport { tempFile } from \"@openclaw/fs-safe/advanced\";\n\nawait using target = await tempFile({ prefix: \"download\", fileName: \"payload.bin\" });\nawait fs.promises.writeFile(target.path, bytes);\nconst checksumPath = target.file(\"payload.sha256\");\n```\n\n## Exact file comparison\n\nFor exact comparison of already-open files, use\n[`sameFileContentsSync()`](docs/file-contents.md) from `advanced`. It compares\nbytes through both EOFs with bounded memory and preserves the borrowed\ndescriptors' positions and ownership.\n\n## Secure absolute file reads\n\nUse `readSecureFile()` when the caller gives you an absolute credential path\ninstead of a root-relative workspace path. It opens the file first, validates the\nsame handle it will read from, checks trusted directories, owner, POSIX mode or\nWindows ACLs, hardlink count, size, and optional timeout, then reads through the\npinned handle. On Windows, both the bytes and the owner/DACL facts come from that\nhandle. In native `auto` or `off` mode, a packaged, readable PowerShell script can\ninspect that borrowed handle when the native capability is unavailable, subject\nto the [Windows security fallback prerequisites](docs/install.md#windows-security-fallback).\nIt emits one fallback warning per process for secure reads and adds PowerShell\nstartup and compilation overhead per call. Native `require` remains strict, and\nnative operation failures are terminal. Neither route reopens the pathname to\ninspect its ACL.\n\n```ts\nimport { readSecureFile } from \"@openclaw/fs-safe/secure-file\";\n\nconst { buffer } = await readSecureFile({\n  filePath: \"/var/lib/app/token\",\n  label: \"auth token\",\n  trust: { trustedDirs: [\"/var/lib/app\"] },\n  io: { maxBytes: 16 * 1024, timeoutMs: 5_000 },\n});\n```\n\nUse `permissions: { allowInsecure: true }` only for migration or explicit local-development\nflows where a warning is preferable to refusing the file.\n\n## Directory walking\n\n[`Root.entries()`](docs/entries.md) observes one directory without descending or\nfollowing child symlinks. It streams in filesystem order by default and supports\ncancellation, entry limits that throw on overflow, and bounded sorted-name\ncollection. Use it when the caller owns traversal or symlink validation:\n\n```ts\nfor await (const entry of fs.entries(\"plugins\", { maxEntries: 1_000 })) {\n  console.log(entry.name, entry.isSymbolicLink);\n}\n```\n\n`walkDirectory()` and `walkDirectorySync()` replace ad-hoc recursive\n`readdir()` loops with entry and depth budgets, a symlink policy, and stable\nrelative paths.\n\n```ts\nimport { walkDirectory } from \"@openclaw/fs-safe/walk\";\n\nconst scan = await walkDirectory(\"/safe/workspace\", {\n  maxDepth: 4,\n  maxEntries: 10_000,\n  symlinks: \"skip\",\n  include: (entry) => entry.kind === \"file\",\n});\n\nfor (const file of scan.entries) {\n  console.log(file.relativePath);\n}\n```\n\nCheck `scan.truncated` before treating the result as complete, and `scan.failedDirs` to tell an incomplete scan (a directory that could not be read) from an empty one before pruning state from the listing.\n\n`walkDirectory()` accepts asynchronous `include` and `descend` callbacks through `AsyncWalkDirectoryOptions`, so a marker lookup can prune a directory before its children are read. Decisions remain serial and retain the options object as their `this` receiver; `walkDirectorySync()` and its options remain synchronous. See [Directory walking](docs/walk.md) for callback timing, JavaScript result compatibility, and error handling.\n\nFor caller-controlled paths, `Root.walk()` is the root-bounded async iterator.\nIt supports entry/depth budgets, in-root symlink following, cancellation, and a\ntruncation marker (or typed error) when a budget is reached. Its `entryFilter`\naccepts `\"include\"`, `\"skip\"`, or `\"skip-subtree\"`, directly or through a Promise.\nAfter an awaited decision resolves, the walk rechecks cancellation and the\ncurrent listing directory and Root identities before using it. Pending callbacks\nsettle before cancellation or iterator disposal completes. Callback failures\nreject the walk. `onDirectoryError: \"skip-and-report\"` yields typed `\"directory-error\"` markers\nfor directory read or identity-check failures while preserving entries from\nreadable subtrees.\n\n## Archive extraction\n\n`extractArchive()` handles ZIP and TAR behind one API, with traversal checks, blocked-link-type rejection, and entry-count and byte budgets.\n\n```ts\nimport { extractArchive, resolveArchiveKind } from \"@openclaw/fs-safe/archive\";\n\nconst kind = resolveArchiveKind(uploadPath);\nif (!kind) throw new Error(`unsupported archive: ${uploadPath}`);\n\nawait extractArchive({\n  archivePath: uploadPath,\n  destDir: \"/safe/workspace/plugin\",\n  kind,\n  timeoutMs: 15_000,\n  limits: {\n    maxArchiveBytes: 256 * 1024 * 1024,\n    maxEntries: 50_000,\n    maxExtractedBytes: 512 * 1024 * 1024,\n    maxEntryBytes: 256 * 1024 * 1024,\n    maxEntryPathComponents: 64,\n  },\n});\n```\n\nExtraction stages into a private directory and merges through the same safe-open boundary used by direct writes, so a symlinked entry can't trick the merge into following an out-of-tree path.\n\n## Advanced path scopes\n\nFor code that already has a trusted absolute path and wants lower-level boundary\nvalidation without going through `root()`:\n\n```ts\nimport { pathScope } from \"@openclaw/fs-safe/advanced\";\n\nconst uploads = pathScope(\"/safe/uploads\", { label: \"uploads directory\" });\nconst files = await uploads.files([\"photo.jpg\"]);\nconst target = await uploads.writable(\"report.pdf\");\n```\n\n## Errors\n\nEvery failure surfaces as an `FsSafeError` with a closed `code` union you can branch on:\n\n```ts\nimport { FsSafeError } from \"@openclaw/fs-safe/errors\";\n\ntry {\n  await fs.write(\"../escape.txt\", \"x\");\n} catch (err) {\n  if (err instanceof FsSafeError && err.code === \"outside-workspace\") {\n    // handle\n  }\n  throw err;\n}\n```\n\nCodes are grouped by category:\n\n```ts\nif (err instanceof FsSafeError) {\n  if (err.category === \"policy\") {\n    // Unsafe caller input or filesystem state rejected by a safety policy.\n  } else {\n    // Routine filesystem outcome or runtime/environment problem.\n  }\n}\n```\n\nRoutine filesystem outcomes such as `not-found`, `not-empty`, and\n`not-removable`, plus runtime failures such as `read-failed`, are operational;\nthey do not indicate that a filesystem\nboundary policy was violated.\n\nCurrent `FsSafeErrorCode` values are `already-exists`, `denied-path`, `device-path`, `hardlink`, `helper-failed`, `helper-unavailable`, `invalid-path`, `insecure-permissions`, `not-empty`, `not-file`, `not-found`, `not-owned`, `not-removable`, `outside-workspace`, `path-alias`, `path-mismatch`, `permission-unverified`, `read-failed`, `secret-exists`, `store-reentrant-update`, `symlink`, `timeout`, `too-large`, and `unsupported-platform`.\n\n## Safety model\n\n- root-bounded APIs resolve paths against a configured root and reject canonical escapes\n- reads reject known unsafe device paths, open with `O_NOFOLLOW` where available, then verify fd identity matches the path identity before returning the buffer or handle\n- create-only writes, sidecar acquisition, and exclusive publication prefer fd-relative native primitives, with verified guarded JavaScript fallbacks\n- `remove`, `mkdir`, `move`, `stat`, and `list` retain guarded JavaScript implementations with pre/post identity checks\n- archive extraction stages into a private directory and merges through the same boundary checks used by direct writes\n\n## Limitations\n\n- Windows native opens are handle-relative and reject reparse points; operations without native wiring use the guarded Node implementation.\n- Hardlink rejection depends on platform metadata. Treat it as defense-in-depth, not authorization.\n- `fs-safe` does not validate file contents or archive payload semantics beyond filesystem safety constraints. Schemas, signatures, and authorization belong in the layer above.\n\n## License\n\nMIT.\n","readmeFilename":"README.md"}