{"_id":"hazo_files","_rev":"27-5b82d233550c3d8cb1e7e3727e0f83a3","name":"hazo_files","dist-tags":{"latest":"3.4.0"},"versions":{"1.0.0":{"name":"hazo_files","version":"1.0.0","keywords":["file","management","google-drive","local-storage","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@1.0.0","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"4b8155cc23ff1952712edb35dbcb5b67803b33d3","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-1.0.0.tgz","fileCount":21,"integrity":"sha512-WpGwgSrXv7DSkQwArXGkMQ4sR3GoQYlWE0Th5QzP4RueWKK2GD0Y6ZT/cHmPxsFovFtHCpBzVauYzMoe0PfTEA==","signatures":[{"sig":"MEUCIHMCG0qlm8dl128/t9HslMiqm36UbtGft1Lo5IFsI2e1AiEAhxIM2P4pNe1DSrEe8D4wJPW/qm2Yv11rLPt4kCCI0us=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1453883},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"}},"gitHead":"73e254e23a933b49ffd4e2482372781a3b6d9969","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"tsup","typecheck":"tsc --noEmit","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","install:test-app":"cd test-app && npm install"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"10.9.3","description":"File management including integration to cloud files","directories":{},"_nodeVersion":"22.19.0","dependencies":{"ini":"^4.1.3","googleapis":"^140.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","react":"^18.2.0","vitest":"^4.0.15","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.3.3","@types/node":"^20.10.0","@types/react":"^18.2.45","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.2.18","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2"},"peerDependencies":{"react":"^18.0.0","react-dom":"^18.0.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_1.0.0_1765357491463_0.49356582049362463","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"hazo_files","version":"1.0.1","keywords":["file","management","google-drive","local-storage","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@1.0.1","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"6f5172823742cf7b54443da2f647e0f92cb12e2c","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-1.0.1.tgz","fileCount":21,"integrity":"sha512-x4/tTKEx9gdg4jiY8snKM1BBU3Xp6ArN+8Mg2Rao7GAb+nzFtkXrD7+s2kvHNqOQc34hWnyBWOxusxIWwIMawg==","signatures":[{"sig":"MEYCIQDHmyoIrC6tlzDTVvcwZeHCA55m0EHYMvcaVCw2RN+RhQIhAMBm/UTDKug8sXlJP82AvmrK9irfT9GJtQ0N+FR7qiSM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1454028},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"}},"gitHead":"7f242d5aa54d6e0c6ccd8df4c50b1f1838e12f31","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"tsup","typecheck":"tsc --noEmit","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","install:test-app":"cd test-app && npm install"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"10.9.3","description":"File management including integration to cloud files","directories":{},"_nodeVersion":"22.19.0","dependencies":{"ini":"^4.1.3","googleapis":"^140.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","react":"^18.2.0","vitest":"^4.0.15","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.3.3","@types/node":"^20.10.0","@types/react":"^18.2.45","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.2.18","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2"},"peerDependencies":{"react":"^18.0.0","react-dom":"^18.0.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_1.0.1_1765365101340_0.673088537094851","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"hazo_files","version":"1.0.2","keywords":["file","management","google-drive","local-storage","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@1.0.2","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"f6037e94f83b4b76f46be85759bb7e8dd740bae4","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-1.0.2.tgz","fileCount":21,"integrity":"sha512-ZecHbcROqPemj7u9tsLYIjQ+q3bImgCYv6mG6bHDtQ6GZ4S59kr8T2+Mpq0kQXDBe1VsWMqaTViDrZQz5SJwjA==","signatures":[{"sig":"MEUCIFsS1vdZowDCFy9lZTtNUhfHaTSBb1qs826Si2NfcnkcAiEAkFo/HGJQCvWRoghSXBiT6DqSvR24wF2cNoPZ24SBIT8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1454028},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"}},"gitHead":"16c5893a5da0effe2cfdde0e5ef3fc0cc8ff7167","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"tsup","typecheck":"tsc --noEmit","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","install:test-app":"cd test-app && npm install"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"10.9.3","description":"File management including integration to cloud files","directories":{},"_nodeVersion":"22.19.0","dependencies":{"ini":"^4.1.3","googleapis":"^140.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","react":"^18.2.0","vitest":"^4.0.15","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.3.3","@types/node":"^20.10.0","@types/react":"^18.2.45","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.2.18","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2"},"peerDependencies":{"react":"^18.0.0","react-dom":"^18.0.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_1.0.2_1765503001037_0.9829126084415138","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"hazo_files","version":"1.1.0","keywords":["file","management","google-drive","local-storage","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@1.1.0","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"26ea265339ac1bd8095057385e3b4808f88ae324","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-1.1.0.tgz","fileCount":13,"integrity":"sha512-J7DHT+ns8dM9Hr2QkByihTIUoTQrJTsJvIVzuRZEetYDF3ltBR4m109p0D3TmDoOzT/K6Vnwg/syyYP87R7gnQ==","signatures":[{"sig":"MEUCIEcUG27xlD3myGqt4wDbRziohm2hRJNSLM78zeR0WxqGAiEA3ImiaOrxxMENPh//1xB7lQ/QyMbLgRnOguxCZTitxf0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":708896},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"}},"gitHead":"492962e0f7411e1a01b19550a1e3307c6f953ef0","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","install:test-app":"cd test-app && npm install"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3","googleapis":"^140.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","react":"^18.2.0","vitest":"^4.0.15","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.3.3","@types/node":"^20.10.0","@types/react":"^18.2.45","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.2.18","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2"},"peerDependencies":{"react":"^18.0.0","react-dom":"^18.0.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_1.1.0_1768775555006_0.7731191222254974","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"hazo_files","version":"1.2.0","keywords":["file","management","google-drive","local-storage","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@1.2.0","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"b6e3fee42d9c5cd65bf75f13baadb94aea1d6278","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-1.2.0.tgz","fileCount":13,"integrity":"sha512-VFBoMJBNvymJexvjsT7VkT0LPLEkRyDxQHDCt6nr3I5+aZDMD2Tey+6Mxu+LEKYJu5ta+j/0kRritYM+jjpHgA==","signatures":[{"sig":"MEUCIQCdq0W2lep2xnPXVbspxAt1VIiCuPHGe3mr9Ao++YKrAAIgEDVsSXwj1fK4ELFIw0OlCexMX1N4E9zVuIHeE7QKsgE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":713517},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"}},"gitHead":"6a31b13b7ac23fcb4c222ea653a8bd45adb6b6be","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","install:test-app":"cd test-app && npm install"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3","googleapis":"^140.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","react":"^18.2.0","vitest":"^4.0.15","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.3.3","@types/node":"^20.10.0","@types/react":"^18.2.45","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.2.18","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2"},"peerDependencies":{"react":"^18.0.0","react-dom":"^18.0.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_1.2.0_1768815087374_0.28288387105800017","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"hazo_files","version":"1.3.0","keywords":["file","management","google-drive","local-storage","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@1.3.0","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"ed66274da5b401f0755a9a5810e8b66938672320","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-1.3.0.tgz","fileCount":13,"integrity":"sha512-s6WeNwi4taxdt/GBTq5XSnb95eQjffRG4+1gjMPNbnO5hAa91D7kI8J5gn0RC+xucHiP99YOUsB/YDnLBILc9g==","signatures":[{"sig":"MEUCIQCiddN2L7yQezLrhiQYhCBtf/DOHqTmdbFd6dg+map38wIgc7L/4qHl7w3JSHisbzLMXdrhyrAVdiOYD6UKVNLTvgU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":753769},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"}},"gitHead":"e3b402ba1c489dd22c1c0e7e95b4e8a8884736ca","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","install:test-app":"cd test-app && npm install"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3","googleapis":"^140.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","react":"^18.2.0","vitest":"^4.0.15","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.3.3","@types/node":"^20.10.0","@types/react":"^18.2.45","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.2.18","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2"},"peerDependencies":{"react":"^18.0.0","react-dom":"^18.0.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_1.3.0_1768900417213_0.2968495234564519","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"hazo_files","version":"1.3.1","keywords":["file","management","google-drive","local-storage","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@1.3.1","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"f690e5cccf903886b153180396420e85651e497a","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-1.3.1.tgz","fileCount":13,"integrity":"sha512-7sAXfYpUKK/U0zW+5x2eIYWDBj34d8IFgkW5K6YDCPybyyPhNQ92tJ0OU5ipiaXxf4Hbpn8gwilLsWFcRKecaw==","signatures":[{"sig":"MEQCIHJ5P1F3b6oQU+V9iOjQs28sGQn8e1vMTwimExkHEXr/AiA96+xNQQEpZUHTe0YovSiNASALtvsfUwfEYFIR4474Vg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":767783},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"}},"gitHead":"b3d641f29038b0656d9fcb6004eb1852d0589c08","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","install:test-app":"cd test-app && npm install"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3","googleapis":"^140.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","react":"^18.2.0","vitest":"^4.0.15","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.3.3","@types/node":"^20.10.0","@types/react":"^18.2.45","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.2.18","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2"},"peerDependencies":{"react":"^18.0.0","react-dom":"^18.0.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_1.3.1_1768905262067_0.6440982319024628","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"hazo_files","version":"1.4.0","keywords":["file","management","google-drive","local-storage","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@1.4.0","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"e72526b03efd70c299a6f8a4f32b70da1eebe076","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-1.4.0.tgz","fileCount":18,"integrity":"sha512-PgjNVtMQeHd3UrIZlDd5lI1mdMalZs2FLS4nDCrA2g1JG4q+ZRAYfrqb/OnQxKeiA3d/m+iwocq7mfP5wQWB4Q==","signatures":[{"sig":"MEUCIQD6NV1EVVLPPX6Ic+qB1plrWTezb/rHIv85QChXkf2RCwIgA8xUM7AFcyYriHU0eZgZnrUbf3sf7HXkQ+KqT4p8y3g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1427388},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"}},"gitHead":"f53839d3d48f03c2092aa2fc4bf74e4253b772b5","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","install:test-app":"cd test-app && npm install"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3","googleapis":"^140.0.1","xxhash-wasm":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","react":"^18.2.0","vitest":"^4.0.15","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.3.3","@types/node":"^20.10.0","@types/react":"^18.2.45","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.2.18","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2"},"peerDependencies":{"react":"^18.0.0","hazo_logs":">=1.0.0","react-dom":"^18.0.0","hazo_config":">=2.0.0","server-only":">=0.0.1","hazo_connect":">=2.0.0","hazo_llm_api":">=1.0.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"hazo_logs":{"optional":true},"hazo_config":{"optional":true},"server-only":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true},"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_1.4.0_1770121770213_0.5294690395205586","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"hazo_files","version":"1.4.1","keywords":["file","management","google-drive","local-storage","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@1.4.1","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"5f13ea41d4593fe6a8c14853c9c96295f68899a7","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-1.4.1.tgz","fileCount":18,"integrity":"sha512-UuCf/xL0mMAtv2hcNOgc3sbSt+QNMC08UecWVXouXyaFDY5esGYPTo9fzpsukv7UYuHMUFfMsvvRlsCyEEaGHA==","signatures":[{"sig":"MEYCIQCuNKh9Suo3tPnMz+qgUc6ZWxCzv1/jFVAU76logJBobwIhAKb3UOYY9ZvQgcQCOAcbDQlqs1MzWabo4L6pyKQVRCQy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1428592},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"}},"gitHead":"0662d708a5c922b65871f4781b1259d629b752fb","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","install:test-app":"cd test-app && npm install"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3","googleapis":"^140.0.1","xxhash-wasm":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","react":"^18.2.0","vitest":"^4.0.15","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.3.3","@types/node":"^20.10.0","@types/react":"^18.2.45","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.2.18","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2"},"peerDependencies":{"react":"^18.0.0","hazo_logs":">=1.0.0","react-dom":"^18.0.0","hazo_config":">=2.0.0","server-only":">=0.0.1","hazo_connect":">=2.0.0","hazo_llm_api":">=1.0.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"hazo_logs":{"optional":true},"hazo_config":{"optional":true},"server-only":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true},"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_1.4.1_1770640755588_0.553796792452552","host":"s3://npm-registry-packages-npm-production"}},"1.4.2":{"name":"hazo_files","version":"1.4.2","keywords":["file","management","google-drive","local-storage","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@1.4.2","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"83aecd275693e9e03c0fb25d5343f652146ecc30","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-1.4.2.tgz","fileCount":18,"integrity":"sha512-f8QqtT7ORH6ZP+aOWoja4J05FvCeCt+kK/mdeeQ59Afy3yA4l2QAHRSF3bW/fFxCqlQ7/VpHDgTcpPJlDNZDxw==","signatures":[{"sig":"MEYCIQD+VivJsj6Dt0xKsDsXHJFVOyaSN3s7mgGY6yeiovGo/QIhAIGJ+vKx4DA2xkvZgY8vy4aXeNvXvuYKR+G1btaMR5+H","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1565358},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"}},"gitHead":"9d9b8d5f70edb3f55f6adbb4683df8032f1d8210","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","install:test-app":"cd test-app && npm install"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3","googleapis":"^140.0.1","xxhash-wasm":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","react":"^18.2.0","vitest":"^4.0.15","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.3.3","@types/node":"^20.10.0","@types/react":"^18.2.45","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.2.18","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2"},"peerDependencies":{"react":"^18.0.0","hazo_logs":">=1.0.0","react-dom":"^18.0.0","hazo_config":">=2.0.0","server-only":">=0.0.1","hazo_connect":">=2.0.0","hazo_llm_api":">=1.0.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"hazo_logs":{"optional":true},"hazo_config":{"optional":true},"server-only":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true},"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_1.4.2_1771071899594_0.7639744644393642","host":"s3://npm-registry-packages-npm-production"}},"1.4.3":{"name":"hazo_files","version":"1.4.3","keywords":["file","management","google-drive","local-storage","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@1.4.3","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"20797c07bef24cd6533ea6b063961b355fb6252b","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-1.4.3.tgz","fileCount":18,"integrity":"sha512-443u3i5vhf3IzRD4dj0cCXFxeEXlpW9SfbxNLeHsEJT/qgPP92TEcGZBMrdXakWpCctD5Wa5rFQs3EbYGfYhIA==","signatures":[{"sig":"MEUCIH3WXG6erGuNTNUM15ZcOGtrt4nITDv5rCCz0PGi0JFUAiEAiBhukJA9t/qFIKMACt40pezpcCCj2XQ/Ri32dZXYnFg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1608109},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"}},"gitHead":"531c543ae682d00b8f568d81fe48bf88379cfa17","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","install:test-app":"cd test-app && npm install"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3","googleapis":"^140.0.1","xxhash-wasm":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","react":"^18.2.0","vitest":"^4.0.15","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.3.3","@types/node":"^20.10.0","@types/react":"^18.2.45","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.2.18","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2"},"peerDependencies":{"react":"^18.0.0","hazo_logs":">=1.0.0","react-dom":"^18.0.0","server-only":">=0.0.1","hazo_connect":">=2.0.0","hazo_llm_api":">=1.0.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":">=8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"hazo_logs":{"optional":true},"server-only":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true},"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_1.4.3_1772461047600_0.09892235511790326","host":"s3://npm-registry-packages-npm-production"}},"1.4.4":{"name":"hazo_files","version":"1.4.4","keywords":["file","management","google-drive","local-storage","dropbox","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@1.4.4","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"9e8a251be9faede085e445d55a9b7eff60d11cc6","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-1.4.4.tgz","fileCount":18,"integrity":"sha512-26ToIcx9ezGWoofi/qw6FPCIjEDcRNy0JIjvmN0JZKqDh+baFcUVL+fe3WrZRi5JuFtGksj4hx1t9yOgWW105Q==","signatures":[{"sig":"MEUCIFyhYVG1vGO4HXWF7qaTX8TIQ4VN43eomS/nBqv2j5JxAiEAtHx7gNE7YMxhMxQi3CXfuMs9DSj5Tw01pkFVZgQ4E3Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1720276},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"}},"gitHead":"4e58f5c5dfc09a71380bf268054053db45d6617a","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","install:test-app":"cd test-app && npm install"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3","dropbox":"^10.34.0","googleapis":"^140.0.1","xxhash-wasm":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","react":"^18.2.0","vitest":"^4.0.15","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.3.3","@types/node":"^20.10.0","@types/react":"^18.2.45","hazo_llm_api":"^1.2.7","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.2.18","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2"},"peerDependencies":{"react":"^18.0.0","hazo_logs":">=1.0.0","react-dom":"^18.0.0","server-only":">=0.0.1","hazo_connect":">=2.0.0","hazo_llm_api":">=1.0.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":">=8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"hazo_logs":{"optional":true},"server-only":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true},"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_1.4.4_1773574130649_0.7796130170238456","host":"s3://npm-registry-packages-npm-production"}},"1.4.5":{"name":"hazo_files","version":"1.4.5","keywords":["file","management","google-drive","local-storage","dropbox","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@1.4.5","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"005c933687042dd12a295c2617b9d52d1b92f652","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-1.4.5.tgz","fileCount":21,"integrity":"sha512-5QfDhB42s4zBPXbHJcsYE+3jiMclB3iiB5ywYAJG+YNYF+7ys7CN+lS3qdCy5EPKnqVWvM/QhKqOqEu7L7cKZg==","signatures":[{"sig":"MEUCICAe9K8TTa8z0kTeFJ/AxcHzy9Ff9XDoVhiU/v81R1J3AiEAnKCBdFKqY8Dr7ru5QCMcjDsFQiK9zpDmlTvNedUJyqs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1730696},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"}},"gitHead":"3ab5a00063923c52397ff8ae594ec774fbb86989","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","install:test-app":"cd test-app && npm install"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","react":"^18.2.0","vitest":"^4.0.15","dropbox":"^10.34.0","react-dom":"^18.2.0","@types/ini":"^4.1.1","googleapis":"^140.0.1","typescript":"^5.3.3","@types/node":"^20.10.0","xxhash-wasm":"^1.1.0","@types/react":"^18.2.45","hazo_llm_api":"^1.2.7","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.2.18","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2"},"peerDependencies":{"react":"^18.0.0","dropbox":"^10.0.0","hazo_logs":">=1.0.0","react-dom":"^18.0.0","googleapis":"^140.0.0","server-only":">=0.0.1","xxhash-wasm":"^1.0.0","hazo_connect":">=2.0.0","hazo_llm_api":">=1.0.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":">=8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"dropbox":{"optional":true},"hazo_logs":{"optional":true},"googleapis":{"optional":true},"server-only":{"optional":true},"xxhash-wasm":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true},"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_1.4.5_1774615492327_0.7286405546633605","host":"s3://npm-registry-packages-npm-production"}},"1.4.6":{"name":"hazo_files","version":"1.4.6","keywords":["file","management","google-drive","local-storage","dropbox","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@1.4.6","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"7666f116df6896be4e0fc7daee6e35ddd7702da9","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-1.4.6.tgz","fileCount":21,"integrity":"sha512-YJ8bJyCaFA01sY7+IxL//TX/TEUg4z8i82b3EVP73TFoUjbTlllle/TG/DOBFNnL1PfBR4JyDngplYcaLY/pMA==","signatures":[{"sig":"MEQCIFDwwQiuzADIf+A9WKKpUswqcWR5yVctidoxDXAe0kXtAiAbvhqQnaD4akad80Bk1DMtez8yL6CTxmWgRigNYc3PWQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1765476},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"}},"gitHead":"f1709cf95f26c5d9ee574ced1fbb73f3eb2ca51d","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","install:test-app":"cd test-app && npm install"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","react":"^18.2.0","vitest":"^4.0.15","dropbox":"^10.34.0","react-dom":"^18.2.0","@types/ini":"^4.1.1","googleapis":"^140.0.1","typescript":"^5.3.3","@types/node":"^20.10.0","xxhash-wasm":"^1.1.0","@types/react":"^18.2.45","hazo_llm_api":"^1.2.7","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.2.18","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2"},"peerDependencies":{"react":"^18.0.0","dropbox":"^10.0.0","hazo_logs":">=1.0.0","react-dom":"^18.0.0","googleapis":"^140.0.0","hazo_debug":">=1.0.0","server-only":">=0.0.1","xxhash-wasm":"^1.0.0","hazo_connect":">=2.0.0","hazo_llm_api":">=1.0.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":">=8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"dropbox":{"optional":true},"hazo_logs":{"optional":true},"googleapis":{"optional":true},"hazo_debug":{"optional":true},"server-only":{"optional":true},"xxhash-wasm":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true},"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_1.4.6_1774843199319_0.5049620261353303","host":"s3://npm-registry-packages-npm-production"}},"1.4.7":{"name":"hazo_files","version":"1.4.7","keywords":["file","management","google-drive","local-storage","dropbox","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@1.4.7","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"ffa13b1b909ab5c9c5e759a1873e60250a01d0a8","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-1.4.7.tgz","fileCount":21,"integrity":"sha512-JQzjr6j7wcvOEQragw/G8WfPMmvRRMVvG1N53snAcCIlX8oFXbKDRudE2p+m1R6CnDYRbZiLTh3kkBR8mpaEjA==","signatures":[{"sig":"MEYCIQDuf0QlAZEYDNIIRgFzPiCcxXsBZur5GXPFjHIayjhgcQIhAIji+UAm5slagkeSE+iQUDVR9YnD9fm8YX8BnsUJfGau","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1771335},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"}},"gitHead":"e86f4c7df001158587be7de7765f4380b9821d39","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","install:test-app":"cd test-app && npm install"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","react":"^18.2.0","vitest":"^4.0.15","dropbox":"^10.34.0","react-dom":"^18.2.0","@types/ini":"^4.1.1","googleapis":"^140.0.1","typescript":"^5.7.2","@types/node":"^20.14.10","xxhash-wasm":"^1.1.0","@types/react":"^18.3.3","hazo_llm_api":"^1.2.7","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2"},"peerDependencies":{"react":"^18.0.0","dropbox":"^10.0.0","hazo_logs":"^1.0.13","react-dom":"^18.0.0","googleapis":"^140.0.0","hazo_debug":"^2.0.0","server-only":">=0.0.1","xxhash-wasm":"^1.0.0","hazo_connect":"^2.4.0","hazo_llm_api":"^1.2.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":">=8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"dropbox":{"optional":true},"hazo_logs":{"optional":true},"googleapis":{"optional":true},"hazo_debug":{"optional":true},"server-only":{"optional":true},"xxhash-wasm":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true},"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_1.4.7_1778418834460_0.4525752640357916","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"hazo_files","version":"1.5.1","keywords":["file","management","google-drive","local-storage","dropbox","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@1.5.1","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"3ac4531e7c0e7a66edee3e38c26c22fac98f4928","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-1.5.1.tgz","fileCount":30,"integrity":"sha512-g5wcWGFBVGl2MGqLO9F13iLCIVqLqUkgeSNpAsq+J1C7m57QK6C0Cn6i3cxoDK6k5d7OZDDFu+HnEbrPWqr6YQ==","signatures":[{"sig":"MEUCIAIUpAdcVt9EMJl+1JStOAyU8/iDMcrMcXMlc0kNA1+KAiEA/krV06lB57xwW/Y+s6oE01aof30yBbvnTmQCi5mhtXQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1898026},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"},"./background-upload":{"types":"./dist/background-upload/index.d.ts","import":"./dist/background-upload/index.mjs","require":"./dist/background-upload/index.js"},"./background-upload/react":{"types":"./dist/background-upload/react/index.d.ts","import":"./dist/background-upload/react/index.mjs","require":"./dist/background-upload/react/index.js"}},"gitHead":"655c9b7ed443caf7bf67f73d0d09729f469f441e","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server && npm run build:bg-upload && npm run build:bg-upload-react","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","build:bg-upload":"tsup src/background_upload/index.ts --outDir dist/background-upload --dts --format cjs,esm --no-clean","install:test-app":"cd test-app && npm install","build:bg-upload-react":"tsup src/background_upload/react/index.ts --outDir dist/background-upload/react --dts --format cjs,esm --no-clean --external react --external react-dom --external sonner"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","jsdom":"^28.1.0","react":"^18.2.0","sonner":"^2.0.7","vitest":"^4.1.6","dropbox":"^10.34.0","react-dom":"^18.2.0","@types/ini":"^4.1.1","googleapis":"^140.0.1","typescript":"^5.7.2","@types/node":"^20.14.10","xxhash-wasm":"^1.1.0","@types/react":"^18.3.3","hazo_llm_api":"^1.2.7","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@testing-library/react":"^14.3.1","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":"^18.0.0","sonner":">=1.0.0","dropbox":"^10.0.0","hazo_logs":"^1.0.13","react-dom":"^18.0.0","googleapis":"^140.0.0","hazo_debug":"^2.0.0","server-only":">=0.0.1","xxhash-wasm":"^1.0.0","hazo_connect":"^2.6.0","hazo_llm_api":"^1.2.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":">=8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"sonner":{"optional":true},"dropbox":{"optional":true},"hazo_logs":{"optional":true},"googleapis":{"optional":true},"hazo_debug":{"optional":true},"server-only":{"optional":true},"xxhash-wasm":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true},"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_1.5.1_1779008757279_0.9950921523482923","host":"s3://npm-registry-packages-npm-production"}},"1.5.2":{"name":"hazo_files","version":"1.5.2","keywords":["file","management","google-drive","local-storage","dropbox","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@1.5.2","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"46c711eb3a165dd9f1732d24b3618ceaa59f5cec","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-1.5.2.tgz","fileCount":30,"integrity":"sha512-81ezbZnKJ+YkyTWgkYjs9LUMSq1Tss2CxypAbWAJ0ZHpQKIFTBn0zkrESLKJWwvkmnNm0nAWLHCReU791+c7sw==","signatures":[{"sig":"MEUCIHOdaAtO1GZALNCqxZfYIBqi50w+3edDFpiUptHm9CeVAiEAxWqeYRUBXFT826Sx8fVbvILpUvQ/60Cmu40Vbdk2iHE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1898527},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"},"./background-upload":{"types":"./dist/background-upload/index.d.ts","import":"./dist/background-upload/index.mjs","require":"./dist/background-upload/index.js"},"./background-upload/react":{"types":"./dist/background-upload/react/index.d.ts","import":"./dist/background-upload/react/index.mjs","require":"./dist/background-upload/react/index.js"}},"gitHead":"52391d4ad7d1fda771fe0d7359c4d7bab5531455","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server && npm run build:bg-upload && npm run build:bg-upload-react","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","build:bg-upload":"tsup src/background_upload/index.ts --outDir dist/background-upload --dts --format cjs,esm --no-clean","install:test-app":"cd test-app && npm install","build:bg-upload-react":"tsup src/background_upload/react/index.ts --outDir dist/background-upload/react --dts --format cjs,esm --no-clean --external react --external react-dom --external sonner"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","jsdom":"^28.1.0","react":"^18.2.0","sonner":"^2.0.7","vitest":"^4.1.6","dropbox":"^10.34.0","react-dom":"^18.2.0","@types/ini":"^4.1.1","googleapis":"^140.0.1","typescript":"^5.7.2","@types/node":"^20.14.10","xxhash-wasm":"^1.1.0","@types/react":"^18.3.3","hazo_llm_api":"^1.2.7","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@testing-library/react":"^14.3.1","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":"^18.0.0","sonner":">=1.0.0","dropbox":"^10.0.0","hazo_logs":"^1.0.13","react-dom":"^18.0.0","googleapis":"^140.0.0","hazo_debug":"^2.0.0","server-only":">=0.0.1","xxhash-wasm":"^1.0.0","hazo_connect":"^2.6.0","hazo_llm_api":"^1.2.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":">=8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"sonner":{"optional":true},"dropbox":{"optional":true},"hazo_logs":{"optional":true},"googleapis":{"optional":true},"hazo_debug":{"optional":true},"server-only":{"optional":true},"xxhash-wasm":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true},"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_1.5.2_1779107705707_0.32112006212943744","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"hazo_files","version":"1.6.0","keywords":["file","management","google-drive","local-storage","dropbox","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@1.6.0","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"fe57924908aa51f4da270a46a9018294e543495a","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-1.6.0.tgz","fileCount":33,"integrity":"sha512-I5A+USFkbDrosQlZo7DhAFCIawYbiSKIWMGleyLDxToTH5BwQW2lGJhJWKDX8ZgdsbvPi7Mo7IxQl3X+DVHwFQ==","signatures":[{"sig":"MEUCIBpX1ZLryKi/lj6aDh6GHTm4AH64Ff9LzX5TRjjPc3hTAiEA2dUMr4tHreRA6BFOMbyQLbZXWi/tyRLdl/P7zMIHwsw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2021275},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"},"./background-upload":{"types":"./dist/background-upload/index.d.ts","import":"./dist/background-upload/index.mjs","require":"./dist/background-upload/index.js"},"./background-upload/react":{"types":"./dist/background-upload/react/index.d.ts","import":"./dist/background-upload/react/index.mjs","require":"./dist/background-upload/react/index.js"}},"gitHead":"dc8b743872c440049b2193f7bb5642f767183bc9","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server && npm run build:bg-upload && npm run build:bg-upload-react","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","build:bg-upload":"tsup src/background_upload/index.ts --outDir dist/background-upload --dts --format cjs,esm --no-clean","install:test-app":"cd test-app && npm install","build:bg-upload-react":"tsup src/background_upload/react/index.ts --outDir dist/background-upload/react --dts --format cjs,esm --no-clean --external react --external react-dom --external sonner"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","jsdom":"^28.1.0","react":"^18.2.0","sonner":"^2.0.7","vitest":"^4.1.6","dropbox":"^10.34.0","hazo_jobs":"^0.8.0","react-dom":"^18.2.0","@types/ini":"^4.1.1","googleapis":"^140.0.1","typescript":"^5.7.2","@types/node":"^20.14.10","xxhash-wasm":"^1.1.0","@types/react":"^18.3.3","hazo_llm_api":"^1.2.7","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@testing-library/react":"^14.3.1","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":"^18.0.0","sonner":">=1.0.0","dropbox":"^10.0.0","hazo_jobs":"^0.8.0","hazo_logs":"^1.0.13","react-dom":"^18.0.0","googleapis":"^140.0.0","hazo_debug":"^2.0.0","hazo_secure":"^0.5.0","server-only":">=0.0.1","xxhash-wasm":"^1.0.0","hazo_connect":"^2.6.0","hazo_llm_api":"^1.2.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":">=8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"sonner":{"optional":true},"dropbox":{"optional":true},"hazo_jobs":{"optional":true},"hazo_logs":{"optional":true},"googleapis":{"optional":true},"hazo_debug":{"optional":true},"hazo_secure":{"optional":true},"server-only":{"optional":true},"xxhash-wasm":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true},"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_1.6.0_1779370721815_0.9681658857771358","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"hazo_files","version":"2.0.0","keywords":["file","management","google-drive","local-storage","dropbox","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@2.0.0","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"71013cbee320eaad0919c6b23da3e34588d5df9e","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-2.0.0.tgz","fileCount":34,"integrity":"sha512-rFmAnC+9hx1F9FIpf/ebm5/m0SYV/M/8RoiXyww9yO/WXw+/svi55uqgKP3lNwG69RNmcWsFNqtLleEn9mvACg==","signatures":[{"sig":"MEUCIQDnHkRGuyQVHKnNzKRb5mmLhew//2taLTrK2jlqm1G80AIgQ9G6bW93SYDhV/fO0Mxvgk1DCV6qMJJt5fXXp7pZA5E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2067897},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"},"./background-upload":{"types":"./dist/background-upload/index.d.ts","import":"./dist/background-upload/index.mjs","require":"./dist/background-upload/index.js"},"./background-upload/react":{"types":"./dist/background-upload/react/index.d.ts","import":"./dist/background-upload/react/index.mjs","require":"./dist/background-upload/react/index.js"}},"gitHead":"6bec0fba366c37d92b1e6777a63ea0c731ce92e8","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server && npm run build:bg-upload && npm run build:bg-upload-react","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:test-app":"npm run build && cd test-app && npm run build","build:bg-upload":"tsup src/background_upload/index.ts --outDir dist/background-upload --dts --format cjs,esm --no-clean","install:test-app":"cd test-app && npm install","build:bg-upload-react":"tsup src/background_upload/react/index.ts --outDir dist/background-upload/react --dts --format cjs,esm --no-clean --external react --external react-dom --external sonner"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3","googleapis":"^140","mime-types":"^2.1.35"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","jsdom":"^28.1.0","react":"^18.2.0","sonner":"^2.0.7","vitest":"^4.1.6","dropbox":"^10.34.0","hazo_jobs":"^0.8.0","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.7.2","@types/node":"^20.14.10","xxhash-wasm":"^1.1.0","@types/react":"^18.3.3","hazo_llm_api":"^1.2.7","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.3.0","@dnd-kit/sortable":"^10.0.0","@types/mime-types":"^2.1.4","@dnd-kit/utilities":"^3.2.2","@testing-library/react":"^14.3.1","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":"^18.0.0","sonner":">=1.0.0","dropbox":"^10.0.0","hazo_jobs":"^0.8.0","hazo_logs":"^1.0.13","react-dom":"^18.0.0","googleapis":"^140.0.0","hazo_debug":"^2.0.0","hazo_secure":"^0.5.0","server-only":">=0.0.1","xxhash-wasm":"^1.0.0","hazo_connect":"^2.6.0","hazo_llm_api":"^1.2.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":">=8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"sonner":{"optional":true},"dropbox":{"optional":true},"hazo_jobs":{"optional":true},"hazo_logs":{"optional":true},"googleapis":{"optional":true},"hazo_debug":{"optional":true},"hazo_secure":{"optional":true},"server-only":{"optional":true},"xxhash-wasm":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true},"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_2.0.0_1779533659657_0.5046930895616601","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"hazo_files","version":"2.0.1","keywords":["file","management","google-drive","local-storage","dropbox","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@2.0.1","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"207ae053b8618456f05f047707bdd2db43ca404c","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-2.0.1.tgz","fileCount":38,"integrity":"sha512-S/Z/9Xci99p4RHWzIwwWil/pWFlXHYYFMPS/JB2hH3o4Jh5LxaMgMEkCSeMiyYBvhITf1Mt5WaNdUwWqPL0olA==","signatures":[{"sig":"MEUCIAQIpoxy/f7uakAGPuoeE9ymCvQwvYHXtNvwx+evgfHXAiEAnw/WF1XwrwPSRK+QLCVBQq7fAY65XzZFmjcTwWc1WLs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2101040},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.mjs","require":"./dist/testing/index.js"},"./background-upload":{"types":"./dist/background-upload/index.d.ts","import":"./dist/background-upload/index.mjs","require":"./dist/background-upload/index.js"},"./background-upload/react":{"types":"./dist/background-upload/react/index.d.ts","import":"./dist/background-upload/react/index.mjs","require":"./dist/background-upload/react/index.js"}},"gitHead":"96382b90fb48dba7f188c5a7613d59b007558822","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server && npm run build:bg-upload && npm run build:bg-upload-react && npm run build:testing","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:testing":"tsup src/testing/index.ts --outDir dist/testing --dts --format cjs,esm --no-clean","build:test-app":"npm run build && cd test-app && npm run build","build:bg-upload":"tsup src/background_upload/index.ts --outDir dist/background-upload --dts --format cjs,esm --no-clean","install:test-app":"cd test-app && npm install","build:bg-upload-react":"tsup src/background_upload/react/index.ts --outDir dist/background-upload/react --dts --format cjs,esm --no-clean --external react --external react-dom --external sonner"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3","googleapis":"^140","mime-types":"^2.1.35"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","jsdom":"^28.1.0","react":"^18.2.0","sonner":"^2.0.7","vitest":"^4.1.6","dropbox":"^10.34.0","hazo_jobs":"^0.8.0","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.7.2","@types/node":"^20.14.10","xxhash-wasm":"^1.1.0","@types/react":"^18.3.3","hazo_llm_api":"^1.2.7","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.3.0","@dnd-kit/sortable":"^10.0.0","@types/mime-types":"^2.1.4","@dnd-kit/utilities":"^3.2.2","@testing-library/react":"^14.3.1","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":"^18.0.0","sonner":">=1.0.0","dropbox":"^10.0.0","hazo_jobs":"^0.8.0","hazo_logs":"^1.0.13","react-dom":"^18.0.0","googleapis":"^140.0.0","hazo_debug":"^2.0.0","hazo_secure":"^0.5.0","server-only":">=0.0.1","xxhash-wasm":"^1.0.0","hazo_connect":"^2.6.0","hazo_llm_api":"^1.2.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":">=8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"sonner":{"optional":true},"dropbox":{"optional":true},"hazo_jobs":{"optional":true},"hazo_logs":{"optional":true},"googleapis":{"optional":true},"hazo_debug":{"optional":true},"hazo_secure":{"optional":true},"server-only":{"optional":true},"xxhash-wasm":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true},"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_2.0.1_1779537407953_0.03665598382006441","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"hazo_files","version":"2.1.1","keywords":["file","management","google-drive","local-storage","dropbox","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@2.1.1","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"5de04b3d62f72b1ac9985e475e5aa155f45a8e5a","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-2.1.1.tgz","fileCount":38,"integrity":"sha512-M3vVwqWX02kfrUzjcTgrEH4BT3dubZ3TbUC8HlPXg6OnoUALWlcCXhx1zVdb/MVAG8IP9iRYzOYGkmtuF3iMZg==","signatures":[{"sig":"MEUCIBzL7EQ0VxpCLwaGQA+/+mc5MF1/g5cWgudZVgyYioBNAiEA9di0evMq6/6ER4R9wmBXGtOPdo/VdczfWxPZymBE8G4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2121030},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.mjs","require":"./dist/testing/index.js"},"./background-upload":{"types":"./dist/background-upload/index.d.ts","import":"./dist/background-upload/index.mjs","require":"./dist/background-upload/index.js"},"./background-upload/react":{"types":"./dist/background-upload/react/index.d.ts","import":"./dist/background-upload/react/index.mjs","require":"./dist/background-upload/react/index.js"}},"gitHead":"c4d70bedbcfec7134a400a8385da7b9d124dfaf4","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server && npm run build:bg-upload && npm run build:bg-upload-react && npm run build:testing","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:testing":"tsup src/testing/index.ts --outDir dist/testing --dts --format cjs,esm --no-clean","build:test-app":"npm run build && cd test-app && npm run build","build:bg-upload":"tsup src/background_upload/index.ts --outDir dist/background-upload --dts --format cjs,esm --no-clean","install:test-app":"cd test-app && npm install","build:bg-upload-react":"tsup src/background_upload/react/index.ts --outDir dist/background-upload/react --dts --format cjs,esm --no-clean --external react --external react-dom --external sonner"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3","googleapis":"^140","mime-types":"^2.1.35"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","jsdom":"^28.1.0","react":"^18.2.0","sonner":"^2.0.7","vitest":"^4.1.6","dropbox":"^10.34.0","hazo_jobs":"^0.8.0","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.7.2","@types/node":"^20.14.10","xxhash-wasm":"^1.1.0","@types/react":"^18.3.3","hazo_llm_api":"^1.2.7","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.3.0","@dnd-kit/sortable":"^10.0.0","@types/mime-types":"^2.1.4","@dnd-kit/utilities":"^3.2.2","@testing-library/react":"^14.3.1","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":"^18.0.0","sonner":">=1.0.0","dropbox":"^10.0.0","hazo_jobs":"^0.8.0","hazo_logs":"^1.0.13","react-dom":"^18.0.0","googleapis":"^140.0.0","hazo_debug":"^2.0.0","hazo_secure":"^0.5.0","server-only":">=0.0.1","xxhash-wasm":"^1.0.0","hazo_connect":"^2.6.0","hazo_llm_api":"^1.2.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":">=8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"sonner":{"optional":true},"dropbox":{"optional":true},"hazo_jobs":{"optional":true},"hazo_logs":{"optional":true},"googleapis":{"optional":true},"hazo_debug":{"optional":true},"hazo_secure":{"optional":true},"server-only":{"optional":true},"xxhash-wasm":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true},"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_2.1.1_1779625797732_0.08672175873825805","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"hazo_files","version":"3.0.0","keywords":["file","management","google-drive","local-storage","dropbox","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@3.0.0","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"13db3d06f200374dc5408cbfdaec97865ee838bf","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-3.0.0.tgz","fileCount":38,"integrity":"sha512-MBNBGYafiKBjZptQ3Px9XrhCrIaGHl1lpNQ475Gir/mg42CM7XXM6y6Sr+kd7EAbPS92AbPPO8Ylg5+ju/4/6A==","signatures":[{"sig":"MEUCIGeIQ/Ja2O3xrmge/4wjUeyCdZsG6W3hJn56gXsJ+PHUAiEAiUZVttM3XqWHQo8H7QTornmcJYJZP+jKSJ1Oey3Pf7s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4301451},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.mjs","require":"./dist/testing/index.js"},"./background-upload":{"types":"./dist/background-upload/index.d.ts","import":"./dist/background-upload/index.mjs","require":"./dist/background-upload/index.js"},"./background-upload/react":{"types":"./dist/background-upload/react/index.d.ts","import":"./dist/background-upload/react/index.mjs","require":"./dist/background-upload/react/index.js"}},"gitHead":"304447ab047ea16abd2fd820559edc02b9cba02a","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server && npm run build:bg-upload && npm run build:bg-upload-react && npm run build:testing","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:testing":"tsup src/testing/index.ts --outDir dist/testing --dts --format cjs,esm --no-clean","build:test-app":"npm run build && cd test-app && npm run build","build:bg-upload":"tsup src/background_upload/index.ts --outDir dist/background-upload --dts --format cjs,esm --no-clean","install:test-app":"cd test-app && npm install","build:bg-upload-react":"tsup src/background_upload/react/index.ts --outDir dist/background-upload/react --dts --format cjs,esm --no-clean --external react --external react-dom --external sonner"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3","googleapis":"^140","mime-types":"^2.1.35"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","jsdom":"^28.1.0","react":"^18.2.0","sonner":"^2.0.7","vitest":"^4.1.6","dropbox":"^10.34.0","hazo_core":"^1.0.0","hazo_jobs":"^0.12.0","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.7.2","@types/node":"^20.14.10","xxhash-wasm":"^1.1.0","@types/react":"^18.3.3","hazo_llm_api":"^2.0.0","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.3.0","@dnd-kit/sortable":"^10.0.0","@types/mime-types":"^2.1.4","@dnd-kit/utilities":"^3.2.2","@testing-library/react":"^14.3.1","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":"^18.0.0","sonner":"^2.0.7","dropbox":"^10.0.0","hazo_ui":"^3.0.1","hazo_core":"^1.0.0","hazo_jobs":"^0.12.0","hazo_logs":"^2.0.0","react-dom":"^18.0.0","googleapis":"^140.0.0","hazo_debug":"^3.1.0","hazo_secure":"^1.0.1","server-only":"^0.0.1","xxhash-wasm":"^1.0.0","hazo_connect":"^3.0.0","hazo_llm_api":"^2.0.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"sonner":{"optional":true},"dropbox":{"optional":true},"hazo_ui":{"optional":true},"hazo_core":{"optional":true},"hazo_jobs":{"optional":true},"hazo_logs":{"optional":true},"googleapis":{"optional":true},"hazo_debug":{"optional":true},"hazo_secure":{"optional":true},"server-only":{"optional":true},"xxhash-wasm":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true},"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_3.0.0_1780067074283_0.1477556891874694","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"hazo_files","version":"3.1.0","keywords":["file","management","google-drive","local-storage","dropbox","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@3.1.0","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"a2328b000029afd104c804682df82b01b938be43","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-3.1.0.tgz","fileCount":38,"integrity":"sha512-sJEhE4uP07L8cSbFrbzSpFrfxu9zdYBhsASabFHmL+KXo8e8A9hfx33ggefgPqpy1k7ZNC4D0nyfMxoOeouh7Q==","signatures":[{"sig":"MEUCIFfJvDlG/IM8lrT2M5/CFGcojFBJpim396luFlktzt73AiEA/vtBCM7bTnc3iTw9ynQTZ6LpnnwkHpuU/wzrDgCtwTk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4376823},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.mjs","require":"./dist/testing/index.js"},"./background-upload":{"types":"./dist/background-upload/index.d.ts","import":"./dist/background-upload/index.mjs","require":"./dist/background-upload/index.js"},"./background-upload/react":{"types":"./dist/background-upload/react/index.d.ts","import":"./dist/background-upload/react/index.mjs","require":"./dist/background-upload/react/index.js"}},"gitHead":"0038e0f62445656e22e8405f7534a4b722ad7ac3","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server && npm run build:bg-upload && npm run build:bg-upload-react && npm run build:testing","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:testing":"tsup src/testing/index.ts --outDir dist/testing --dts --format cjs,esm --no-clean","build:test-app":"npm run build && cd test-app && npm run build","build:bg-upload":"tsup src/background_upload/index.ts --outDir dist/background-upload --dts --format cjs,esm --no-clean","install:test-app":"cd test-app && npm install","build:bg-upload-react":"tsup src/background_upload/react/index.ts --outDir dist/background-upload/react --dts --format cjs,esm --no-clean --external react --external react-dom --external sonner"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"11.6.2","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"ini":"^4.1.3","googleapis":"^140","mime-types":"^2.1.35"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","jsdom":"^28.1.0","react":"^18.2.0","sonner":"^2.0.7","vitest":"^4.1.6","dropbox":"^10.34.0","hazo_core":"^1.1.0","hazo_jobs":"^0.12.0","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.7.2","@types/node":"^20.14.10","xxhash-wasm":"^1.1.0","@types/react":"^18.3.3","hazo_llm_api":"^2.1.0","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.3.0","@dnd-kit/sortable":"^10.0.0","@types/mime-types":"^2.1.4","@dnd-kit/utilities":"^3.2.2","@testing-library/react":"^14.3.1","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":"^18.0.0","sonner":"^2.0.7","dropbox":"^10.0.0","hazo_ui":"^3.2.1","hazo_core":"^1.1.0","hazo_jobs":"^0.12.0","hazo_logs":"^2.0.3","react-dom":"^18.0.0","googleapis":"^140.0.0","hazo_debug":"^3.1.1","hazo_secure":"^1.2.0","server-only":"^0.0.1","xxhash-wasm":"^1.0.0","hazo_connect":"^3.4.1","hazo_llm_api":"^2.1.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"sonner":{"optional":true},"dropbox":{"optional":true},"hazo_ui":{"optional":true},"hazo_core":{"optional":true},"hazo_jobs":{"optional":true},"hazo_logs":{"optional":true},"googleapis":{"optional":true},"hazo_debug":{"optional":true},"hazo_secure":{"optional":true},"server-only":{"optional":true},"xxhash-wasm":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true},"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_3.1.0_1781173553085_0.6224378451087762","host":"s3://npm-registry-packages-npm-production"}},"3.1.1":{"name":"hazo_files","version":"3.1.1","keywords":["file","management","google-drive","local-storage","dropbox","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@3.1.1","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"f6c81025ec2562257a48f087c22e8b857a76d395","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-3.1.1.tgz","fileCount":38,"integrity":"sha512-iknMyeI7KThc4S+nksy/3U4xuETcgVUR8FPBVPVQFBxI/t5BSFQ/CDcoa4asWliCv+bRfoaNfp9g8cs1Wzo6AA==","signatures":[{"sig":"MEYCIQDPmFQf2VCxkD6BOlDhmj/H5V/4G7jsEQ+SFgdnAxKljgIhAMwU02Ja88s6p3NtYHd5C/zkxQl1oUE6BRqa+2EZ2/Sq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4382676},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.mjs","require":"./dist/testing/index.js"},"./background-upload":{"types":"./dist/background-upload/index.d.ts","import":"./dist/background-upload/index.mjs","require":"./dist/background-upload/index.js"},"./background-upload/react":{"types":"./dist/background-upload/react/index.d.ts","import":"./dist/background-upload/react/index.mjs","require":"./dist/background-upload/react/index.js"}},"gitHead":"de466c924ed4f114bb9fe3fbaea6ac365dd06b42","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server && npm run build:bg-upload && npm run build:bg-upload-react && npm run build:testing","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:testing":"tsup src/testing/index.ts --outDir dist/testing --dts --format cjs,esm --no-clean","build:test-app":"npm run build && cd test-app && npm run build","build:bg-upload":"tsup src/background_upload/index.ts --outDir dist/background-upload --dts --format cjs,esm --no-clean","install:test-app":"cd test-app && npm install","build:bg-upload-react":"tsup src/background_upload/react/index.ts --outDir dist/background-upload/react --dts --format cjs,esm --no-clean --external react --external react-dom --external sonner"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"10.9.8","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","dependencies":{"ini":"^4.1.3","googleapis":"^140","mime-types":"^2.1.35"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","jsdom":"^28.1.0","react":"^18.2.0","sonner":"^2.0.7","vitest":"^4.1.6","dropbox":"^10.34.0","hazo_core":"^1.2.1","hazo_jobs":"^0.14.0","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.7.2","@types/node":"^20.14.10","xxhash-wasm":"^1.1.0","@types/react":"^18.3.3","hazo_llm_api":"^2.1.0","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.3.0","@dnd-kit/sortable":"^10.0.0","@types/mime-types":"^2.1.4","@dnd-kit/utilities":"^3.2.2","@testing-library/react":"^14.3.1","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":"^18.0.0","sonner":"^2.0.7","dropbox":"^10.0.0","hazo_ui":"^4.10.0","hazo_core":"^1.2.1","hazo_jobs":"^0.14.0","hazo_logs":"^2.1.1","react-dom":"^18.0.0","googleapis":"^140.0.0","hazo_debug":"^3.1.1","hazo_secure":"^1.3.0","server-only":"^0.0.1","xxhash-wasm":"^1.0.0","hazo_connect":"^3.9.2","hazo_llm_api":"^2.1.0","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.0.0"},"peerDependenciesMeta":{"sonner":{"optional":true},"dropbox":{"optional":true},"hazo_ui":{"optional":true},"hazo_core":{"optional":true},"hazo_jobs":{"optional":true},"hazo_logs":{"optional":true},"googleapis":{"optional":true},"hazo_debug":{"optional":true},"hazo_secure":{"optional":true},"server-only":{"optional":true},"xxhash-wasm":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true},"@dnd-kit/core":{"optional":true},"@dnd-kit/sortable":{"optional":true},"@dnd-kit/utilities":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_3.1.1_1783581028581_0.05588587555789437","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"hazo_files","version":"3.2.0","keywords":["file","management","google-drive","local-storage","dropbox","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@3.2.0","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"a187109b1ba1384c190ab3b4df8e1adb23bdfb20","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-3.2.0.tgz","fileCount":38,"integrity":"sha512-J/wdrxbLBxRTLFA0Zh2t27RBfSwGTV97bgUxHF4UdwqxuSRtuTZiIA6zIQraeMv1znCjgUGJ2AyVKJtaYmeLjQ==","signatures":[{"sig":"MEUCIDTzLML0H9XNzf6OSIIlbH0SCDOZfhqIO+Dq0DABQKA8AiEAplNoFtT9G/zpq3J61j5PI5QMPS12U3ritD4a4Rr6XCo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4383444},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.mjs","require":"./dist/testing/index.js"},"./background-upload":{"types":"./dist/background-upload/index.d.ts","import":"./dist/background-upload/index.mjs","require":"./dist/background-upload/index.js"},"./background-upload/react":{"types":"./dist/background-upload/react/index.d.ts","import":"./dist/background-upload/react/index.mjs","require":"./dist/background-upload/react/index.js"}},"gitHead":"9c1b443b0d5c5cf85790d1393cf967602171ac99","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server && npm run build:bg-upload && npm run build:bg-upload-react && npm run build:testing","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:testing":"tsup src/testing/index.ts --outDir dist/testing --dts --format cjs,esm --no-clean","build:test-app":"npm run build && cd test-app && npm run build","build:bg-upload":"tsup src/background_upload/index.ts --outDir dist/background-upload --dts --format cjs,esm --no-clean","install:test-app":"cd test-app && npm install","build:bg-upload-react":"tsup src/background_upload/react/index.ts --outDir dist/background-upload/react --dts --format cjs,esm --no-clean --external react --external react-dom --external sonner"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"10.9.8","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","dependencies":{"ini":"^4.1.3","googleapis":"^140","mime-types":"^2.1.35","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","jsdom":"^28.1.0","react":"^18.2.0","sonner":"^2.0.7","vitest":"^4.1.6","dropbox":"^10.34.0","hazo_core":"^2.0.0","hazo_jobs":"^0.17.0","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.7.2","@types/node":"^20.14.10","xxhash-wasm":"^1.1.0","@types/react":"^18.3.3","hazo_llm_api":"^2.3.0","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.3.0","@dnd-kit/sortable":"^10.0.0","@types/mime-types":"^2.1.4","@dnd-kit/utilities":"^3.2.2","@testing-library/react":"^14.3.1","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","sonner":"^2.0.7","dropbox":"^10.0.0","hazo_ui":"^6.8.0","hazo_core":"^2.0.0","hazo_jobs":"^0.17.0","hazo_logs":"^2.2.0","react-dom":"^18.0.0 || ^19.0.0","googleapis":"^140.0.0","hazo_debug":"^3.2.0","hazo_secure":"^1.7.1","server-only":"^0.0.1","xxhash-wasm":"^1.0.0","hazo_connect":"^4.0.0","hazo_llm_api":"^2.3.0"},"peerDependenciesMeta":{"sonner":{"optional":true},"dropbox":{"optional":true},"hazo_ui":{"optional":true},"hazo_core":{"optional":true},"hazo_jobs":{"optional":true},"hazo_logs":{"optional":true},"googleapis":{"optional":true},"hazo_debug":{"optional":true},"hazo_secure":{"optional":true},"server-only":{"optional":true},"xxhash-wasm":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_3.2.0_1785936338851_0.30170855530588536","host":"s3://npm-registry-packages-npm-production"}},"3.3.0":{"name":"hazo_files","version":"3.3.0","keywords":["file","management","google-drive","local-storage","dropbox","file-browser"],"author":{"name":"Pubs Abayasiri"},"license":"MIT","_id":"hazo_files@3.3.0","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"homepage":"https://github.com/pub12/hazo_files#readme","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"a063694a2507390e81efa374e5499c660020a895","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-3.3.0.tgz","fileCount":38,"integrity":"sha512-1RB/Ulks1jgFSNcFb5sLsQQYlC81Sncha+sfdFde07PoYSdddPkSwz2p22LJQaSz1rkL1yhizIIuYW6vBa97Rw==","signatures":[{"sig":"MEYCIQDO4Qe4FQhOLHBbvCrFsfAkUUzk2YwFrQrjAydn7ON8VQIhAN5eTWzVQvpJymK64nS3fbfuDCGtkSnBTH/yOmp2DjLo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4384932},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.mjs","require":"./dist/testing/index.js"},"./background-upload":{"types":"./dist/background-upload/index.d.ts","import":"./dist/background-upload/index.mjs","require":"./dist/background-upload/index.js"},"./background-upload/react":{"types":"./dist/background-upload/react/index.d.ts","import":"./dist/background-upload/react/index.mjs","require":"./dist/background-upload/react/index.js"}},"gitHead":"4f360c809c63edefcb95182f7cbeddab3f83e612","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server && npm run build:bg-upload && npm run build:bg-upload-react && npm run build:testing","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:testing":"tsup src/testing/index.ts --outDir dist/testing --dts --format cjs,esm --no-clean","build:test-app":"npm run build && cd test-app && npm run build","build:bg-upload":"tsup src/background_upload/index.ts --outDir dist/background-upload --dts --format cjs,esm --no-clean","install:test-app":"cd test-app && npm install","build:bg-upload-react":"tsup src/background_upload/react/index.ts --outDir dist/background-upload/react --dts --format cjs,esm --no-clean --external react --external react-dom --external sonner"},"_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"10.9.8","description":"File management including integration to cloud files","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","dependencies":{"ini":"^4.1.3","googleapis":"^140","mime-types":"^2.1.35","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","jsdom":"^28.1.0","react":"^18.2.0","sonner":"^2.0.7","vitest":"^4.1.6","dropbox":"^10.34.0","hazo_core":"^2.0.0","hazo_jobs":"^0.18.0","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.7.2","@types/node":"^20.14.10","xxhash-wasm":"^1.1.0","@types/react":"^18.3.3","hazo_llm_api":"^2.3.0","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.3.0","@dnd-kit/sortable":"^10.0.0","@types/mime-types":"^2.1.4","@dnd-kit/utilities":"^3.2.2","@testing-library/react":"^14.3.1","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","sonner":"^2.0.7","dropbox":"^10.0.0","hazo_ui":"^6.9.0","hazo_core":"^2.0.0","hazo_jobs":"^0.18.0","hazo_logs":"^2.2.1","react-dom":"^18.0.0 || ^19.0.0","googleapis":"^140.0.0","hazo_debug":"^3.2.0","hazo_secure":"^1.7.2","server-only":"^0.0.1","xxhash-wasm":"^1.0.0","hazo_connect":"^4.0.2","hazo_llm_api":"^2.3.0"},"peerDependenciesMeta":{"sonner":{"optional":true},"dropbox":{"optional":true},"hazo_ui":{"optional":true},"hazo_core":{"optional":true},"hazo_jobs":{"optional":true},"hazo_logs":{"optional":true},"googleapis":{"optional":true},"hazo_debug":{"optional":true},"hazo_secure":{"optional":true},"server-only":{"optional":true},"xxhash-wasm":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hazo_files_3.3.0_1786619461382_0.050845832033534544","host":"s3://npm-registry-packages-npm-production"}},"3.4.0":{"_id":"hazo_files@3.4.0","bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"dist":{"shasum":"fc3dc6742a60331a405b54a4c0377f0f043d65ba","tarball":"https://registry.npmjs.org/hazo_files/-/hazo_files-3.4.0.tgz","fileCount":38,"integrity":"sha512-VuV1IG3aqqNNPmpCXjYUXsyeptq378ChSvNgtUZP2Ao8gKeiOYFKApu7ptDJ318zMd+GMZRTE6D6A7uYmPhDUQ==","signatures":[{"sig":"MEUCIA5TcnmSlT5MkY0nRpCb3gx6JnuFs4lmNxFDxnf2pXIIAiEA1wOvbjZXdKMUKd7sqtInBrEGXR29UAGIM32j+xGn5N4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGIIPCeOl99FhQ1hMakS9ZJ63ZZvM5I6jrNWsYDutSQxAiEAyUCBGYqjgFERViElOO9hKm76FQKjbdlsnO1OECWnSZs="}],"unpackedSize":4414154},"main":"dist/index.js","name":"hazo_files","types":"dist/index.d.ts","author":{"name":"Pubs Abayasiri"},"module":"dist/index.mjs","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.mjs","require":"./dist/ui/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.mjs","require":"./dist/testing/index.js"},"./background-upload":{"types":"./dist/background-upload/index.d.ts","import":"./dist/background-upload/index.mjs","require":"./dist/background-upload/index.js"},"./background-upload/react":{"types":"./dist/background-upload/react/index.d.ts","import":"./dist/background-upload/react/index.mjs","require":"./dist/background-upload/react/index.js"}},"gitHead":"ab38a4d33a2e8fb2670814312fa3655400b57ff0","license":"MIT","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"npm run build:main && npm run build:ui && npm run build:server && npm run build:bg-upload && npm run build:bg-upload-react && npm run build:testing","build:ui":"tsup src/ui/index.ts --outDir dist/ui --dts --format cjs,esm --no-clean --external react --external react-dom --external @dnd-kit/core --external @dnd-kit/sortable --external @dnd-kit/utilities","typecheck":"tsc --noEmit","build:main":"tsup src/index.ts --dts --format cjs,esm --clean","build:server":"tsup src/server/index.ts --outDir dist/server --dts --format cjs,esm --no-clean","dev:test-app":"npm run build && cd test-app && npm run dev","build:testing":"tsup src/testing/index.ts --outDir dist/testing --dts --format cjs,esm --no-clean","build:test-app":"npm run build && cd test-app && npm run build","build:bg-upload":"tsup src/background_upload/index.ts --outDir dist/background-upload --dts --format cjs,esm --no-clean","install:test-app":"cd test-app && npm install","build:bg-upload-react":"tsup src/background_upload/react/index.ts --outDir dist/background-upload/react --dts --format cjs,esm --no-clean --external react --external react-dom --external sonner"},"version":"3.4.0","_npmUser":{"name":"pubs12","email":"pubudu79@gmail.com"},"homepage":"https://github.com/pub12/hazo_files#readme","keywords":["file","management","google-drive","local-storage","dropbox","file-browser"],"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"_npmVersion":"10.9.8","description":"File management including integration to cloud files","directories":{},"maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"sideEffects":false,"_nodeVersion":"22.23.1","dependencies":{"ini":"^4.1.3","googleapis":"^140.0.0","mime-types":"^2.1.35","@dnd-kit/core":"^6.0.0","@dnd-kit/sortable":"^8.0.0","@dnd-kit/utilities":"^3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.1","jsdom":"^28.1.0","react":"^18.2.0","sonner":"^2.0.7","vitest":"^4.1.6","dropbox":"^10.34.0","hazo_core":"^2.4.0","hazo_jobs":"^0.19.0","react-dom":"^18.2.0","@types/ini":"^4.1.1","typescript":"^5.7.2","@types/node":"^20.14.10","xxhash-wasm":"^1.1.0","@types/react":"^18.3.3","hazo_llm_api":"^2.6.0","@dnd-kit/core":"^6.3.1","@types/react-dom":"^18.3.0","@dnd-kit/sortable":"^10.0.0","@types/mime-types":"^2.1.4","@dnd-kit/utilities":"^3.2.2","@testing-library/react":"^14.3.1","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","sonner":"^2.0.7","dropbox":"^10.0.0","hazo_ui":"^6.12.0","hazo_core":"^2.4.0","hazo_i18n":"^0.5.0","hazo_jobs":"^0.19.0","hazo_logs":"^2.3.0","react-dom":"^18.0.0 || ^19.0.0","googleapis":"^140.0.0","hazo_debug":"^3.3.0","hazo_secure":"^1.8.1","server-only":"^0.0.1","xxhash-wasm":"^1.0.0","hazo_connect":"^4.3.0","hazo_llm_api":"^2.6.0"},"peerDependenciesMeta":{"sonner":{"optional":true},"dropbox":{"optional":true},"hazo_ui":{"optional":true},"hazo_core":{"optional":true},"hazo_i18n":{"optional":true},"hazo_jobs":{"optional":true},"hazo_logs":{"optional":true},"googleapis":{"optional":true},"hazo_debug":{"optional":true},"hazo_secure":{"optional":true},"server-only":{"optional":true},"xxhash-wasm":{"optional":true},"hazo_connect":{"optional":true},"hazo_llm_api":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/hazo_files_3.4.0_1789998403133_0.5614582909080146"}}},"time":{"created":"2025-12-10T09:04:51.372Z","modified":"2026-09-21T13:46:43.430Z","1.0.0":"2025-12-10T09:04:51.678Z","1.0.1":"2025-12-10T11:11:41.502Z","1.0.2":"2025-12-12T01:30:01.367Z","1.1.0":"2026-01-18T22:32:35.206Z","1.2.0":"2026-01-19T09:31:27.549Z","1.3.0":"2026-01-20T09:13:37.365Z","1.3.1":"2026-01-20T10:34:22.253Z","1.4.0":"2026-02-03T12:29:30.427Z","1.4.1":"2026-02-09T12:39:15.759Z","1.4.2":"2026-02-14T12:24:59.793Z","1.4.3":"2026-03-02T14:17:27.750Z","1.4.4":"2026-03-15T11:28:50.881Z","1.4.5":"2026-03-27T12:44:52.561Z","1.4.6":"2026-03-30T03:59:59.590Z","1.4.7":"2026-05-10T13:13:54.696Z","1.5.1":"2026-05-17T09:05:57.434Z","1.5.2":"2026-05-18T12:35:05.896Z","1.6.0":"2026-05-21T13:38:42.012Z","2.0.0":"2026-05-23T10:54:19.835Z","2.0.1":"2026-05-23T11:56:48.183Z","2.1.1":"2026-05-24T12:29:57.998Z","3.0.0":"2026-05-29T15:04:34.478Z","3.1.0":"2026-06-11T10:25:53.279Z","3.1.1":"2026-07-09T07:10:28.757Z","3.2.0":"2026-08-05T13:25:39.062Z","3.3.0":"2026-08-13T11:11:01.557Z","3.4.0":"2026-09-21T13:46:43.251Z"},"bugs":{"url":"https://github.com/pub12/hazo_files/issues"},"author":{"name":"Pubs Abayasiri"},"license":"MIT","homepage":"https://github.com/pub12/hazo_files#readme","keywords":["file","management","google-drive","local-storage","dropbox","file-browser"],"repository":{"url":"git+https://github.com/pub12/hazo_files.git","type":"git"},"description":"File management including integration to cloud files","maintainers":[{"name":"pubs12","email":"pubudu79@gmail.com"}],"readme":"# hazo_files\n\n[![npm version](https://img.shields.io/npm/v/hazo_files.svg)](https://www.npmjs.com/package/hazo_files)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nA powerful, modular file management package for Node.js and React applications with support for local filesystem and Google Drive storage. Built with TypeScript for type safety and developer experience.\n\n## Features\n\n- **`FileStorageProvider` Interface**: Lightweight `put/get/delete/exists/getSignedUrl/probe/list/move/rename` abstraction for simpler use cases\n- **`AppFileServerProvider`**: Local filesystem + HMAC-signed download URLs — no cloud account required\n- **`GoogleDriveProvider`**: Service-account Google Drive for Shared Drives with lazy path-cache\n- **`InMemoryProvider`**: Zero-dependency in-memory store for unit tests (via `hazo_files/testing`)\n- **Multiple Storage Providers**: Local filesystem, Google Drive, and Dropbox support out of the box\n- **Modular Architecture**: Easily add custom storage providers\n- **Unified API**: Single consistent interface across all storage providers\n- **React UI Components**: Drop-in FileBrowser component with folder tree, file list, and preview\n- **Naming Rules System**: Visual configurator and utilities for generating consistent file/folder names\n- **Naming Convention Management**: Full CRUD with UI components for managing naming conventions in database\n- **Extraction Data Management**: Track and manage LLM-extracted metadata with merge strategies\n- **LLM Integration**: Built-in support for hazo_llm_api document/image extraction\n- **Upload + Extract Workflow**: Combined service for uploading files with automatic LLM extraction and naming\n- **File Reference Tracking**: Multi-entity file references with orphan detection, soft delete, and lifecycle management\n- **File Change Detection**: xxHash-based content hashing for efficient change detection\n- **Content Tagging**: Optional LLM-based content classification at upload time or on-demand via `content_tag` field\n- **Schema Migrations**: Built-in V2/V3 migration utilities for adding reference tracking and content tagging to existing databases\n- **Background Upload Pipelines**: Framework-agnostic `UploadManager` + React `HazoFileUploadProvider` for multi-step upload pipelines that survive component unmount, with optional sonner toast bridge\n- **Quota Tracking**: Per-scope opt-in quota with threshold callbacks and fail-open semantics\n- **URL Import**: `importFromUrl` with SSRF protection, streaming size cap, and `source_url` provenance tracking\n- **Actor Tracking**: Optional `actor_id` on all mutations, written to `uploaded_by` and `changed_by` columns\n- **Purge Scheduler**: `createPurgeJobHandlers` factory for integrating with hazo_jobs cron workers\n- **TypeScript**: Full type safety and IntelliSense support\n- **OAuth Integration**: Built-in Google Drive and Dropbox OAuth authentication\n- **Prompt Cache Invalidation**: Passthrough for hazo_llm_api prompt cache management via server instance\n- **Progress Tracking**: Upload/download progress callbacks\n- **File Validation**: Extension filtering and file size limits\n- **Error Handling**: Comprehensive error types and handling\n\n## Installation\n\n```bash\nnpm install hazo_files\n```\n\nFor React UI components, ensure you have React 18+ installed:\n\n```bash\nnpm install react react-dom\n```\n\nFor the NamingRuleConfigurator component (drag-and-drop interface), also install:\n\n```bash\nnpm install @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities\n```\n\nFor cloud storage providers (install only what you need):\n\n```bash\nnpm install googleapis        # Google Drive support\nnpm install dropbox           # Dropbox support\n```\n\nFor database tracking and LLM extraction features (optional):\n\n```bash\nnpm install hazo_core         # Error classes, logger, config (peer of all hazo_* packages)\nnpm install hazo_connect      # Database tracking\nnpm install hazo_llm_api      # LLM document extraction\nnpm install server-only       # Server-side safety (recommended)\nnpm install xxhash-wasm       # File change detection (optional)\n```\n\nFor the background-upload sonner toast bridge (optional):\n\n```bash\nnpm install sonner            # Toast notifications for background upload pipelines\n```\n\n### Subpath exports\n\n| Import | Contents |\n|--------|---------|\n| `hazo_files` | Core types, utilities, naming helpers |\n| `hazo_files/ui` | React components (FileBrowser, NamingRuleConfigurator, etc.) |\n| `hazo_files/server` | Server-only: FileManager, TrackedFileManager, FileStorageProvider providers, schema exports |\n| `hazo_files/background-upload` | Framework-agnostic UploadManager pipeline engine |\n| `hazo_files/background-upload/react` | React bindings for background uploads |\n| `hazo_files/testing` | `InMemoryProvider` — import in test suites, safe to use without `server-only` |\n\n### Tailwind CSS v4 Setup (Required for UI Components)\n\nIf you're using Tailwind CSS v4 with the UI components, you must add a `@source` directive to your CSS file to ensure Tailwind scans the package's files for utility classes.\n\nAdd this to your `globals.css` or main CSS file AFTER the tailwindcss import:\n\n```css\n@import \"tailwindcss\";\n\n/* Required: Enable Tailwind to scan hazo_files package for utility classes */\n@source \"../node_modules/hazo_files/dist/ui\";\n```\n\nWithout this directive, Tailwind v4's JIT compiler will not generate CSS for the utility classes used in hazo_files components (like `hover:bg-gray-100`, `text-sm`, `rounded-md`, etc.), resulting in broken styling.\n\n**Note**: This is only required for Tailwind v4. Earlier versions of Tailwind automatically scan `node_modules` and do not need this configuration.\n\n## Quick Start\n\n### Basic Usage (Server-side)\n\n```typescript\nimport { createInitializedFileManager } from 'hazo_files';\n\n// Create and initialize file manager\nconst fileManager = await createInitializedFileManager({\n  config: {\n    provider: 'local',\n    local: {\n      basePath: './files',\n      maxFileSize: 10 * 1024 * 1024, // 10MB\n      allowedExtensions: ['jpg', 'png', 'pdf', 'txt']\n    }\n  }\n});\n\n// Create a directory\nawait fileManager.createDirectory('/documents');\n\n// Upload a file\nawait fileManager.uploadFile(\n  './local-file.pdf',\n  '/documents/file.pdf',\n  {\n    onProgress: (progress, bytes, total) => {\n      console.log(`Upload progress: ${progress}%`);\n    }\n  }\n);\n\n// List directory contents\nconst result = await fileManager.listDirectory('/documents');\nif (result.success) {\n  console.log(result.data);\n}\n\n// Download a file\nawait fileManager.downloadFile('/documents/file.pdf', './downloaded.pdf');\n```\n\n### Using Configuration File\n\nCreate `hazo_files_config.ini` in your project root:\n\n```ini\n[general]\nprovider = local\n\n[local]\nbase_path = ./files\nmax_file_size = 10485760\nallowed_extensions = jpg,png,pdf,txt\n```\n\nThen initialize without config object:\n\n```typescript\nimport { createInitializedFileManager } from 'hazo_files';\n\nconst fileManager = await createInitializedFileManager();\n```\n\n### React UI Component\n\n```typescript\nimport { FileBrowser } from 'hazo_files/ui';\nimport type { FileBrowserAPI } from 'hazo_files/ui';\n\n// Create an API adapter that calls your server endpoints\nconst api: FileBrowserAPI = {\n  async listDirectory(path: string) {\n    const res = await fetch(`/api/files?action=list&path=${path}`);\n    return res.json();\n  },\n  async getFolderTree(path = '/', depth = 3) {\n    const res = await fetch(`/api/files?action=tree&path=${path}&depth=${depth}`);\n    return res.json();\n  },\n  async uploadFile(file: File, remotePath: string) {\n    const formData = new FormData();\n    formData.append('file', file);\n    formData.append('path', remotePath);\n    const res = await fetch('/api/files/upload', { method: 'POST', body: formData });\n    return res.json();\n  },\n  // ... implement other methods\n};\n\nfunction MyFileBrowser() {\n  return (\n    <FileBrowser\n      api={api}\n      initialPath=\"/\"\n      showPreview={true}\n      showTree={true}\n      viewMode=\"grid\"\n    />\n  );\n}\n```\n\n## Advanced Usage\n\n### Google Drive Integration\n\n#### 1. Set up Google Cloud Console\n\n1. Go to [Google Cloud Console](https://console.cloud.google.com)\n2. Create a new project or select an existing one\n3. Enable the Google Drive API\n4. Create OAuth 2.0 credentials\n5. Add authorized redirect URIs (e.g., `http://localhost:3000/api/auth/callback/google`)\n\n#### 2. Configure Environment Variables\n\nCreate `.env.local`:\n\n```env\nHAZO_GOOGLE_DRIVE_CLIENT_ID=your-client-id.apps.googleusercontent.com\nHAZO_GOOGLE_DRIVE_CLIENT_SECRET=your-client-secret\nHAZO_GOOGLE_DRIVE_REDIRECT_URI=http://localhost:3000/api/auth/callback/google\n```\n\n#### 3. Configure hazo_files\n\n```ini\n[general]\nprovider = google_drive\n\n[google_drive]\nclient_id =\nclient_secret =\nredirect_uri = http://localhost:3000/api/auth/callback/google\nrefresh_token =\n```\n\nEnvironment variables will automatically override empty values.\n\n#### 4. Implement OAuth Flow\n\n```typescript\nimport { createFileManager, GoogleDriveModule } from 'hazo_files';\n\n// Initialize with Google Drive\nconst fileManager = createFileManager({\n  config: {\n    provider: 'google_drive',\n    google_drive: {\n      clientId: process.env.HAZO_GOOGLE_DRIVE_CLIENT_ID!,\n      clientSecret: process.env.HAZO_GOOGLE_DRIVE_CLIENT_SECRET!,\n      redirectUri: process.env.HAZO_GOOGLE_DRIVE_REDIRECT_URI!,\n    }\n  }\n});\n\nawait fileManager.initialize();\n\n// Get the Google Drive module to access auth methods\nconst module = fileManager.getModule() as GoogleDriveModule;\nconst auth = module.getAuth();\n\n// Generate auth URL\nconst authUrl = auth.getAuthUrl();\nconsole.log('Visit:', authUrl);\n\n// After user authorizes, exchange code for tokens\nconst tokens = await auth.exchangeCodeForTokens(authCode);\n\n// Authenticate the module\nawait module.authenticate(tokens);\n\n// Now you can use the file manager\nawait fileManager.createDirectory('/MyFolder');\n```\n\n### Next.js API Route Example\n\n```typescript\n// app/api/files/route.ts\nimport { NextRequest, NextResponse } from 'next/server';\nimport { createInitializedFileManager } from 'hazo_files';\n\nasync function getFileManager() {\n  return createInitializedFileManager({\n    config: {\n      provider: 'local',\n      local: {\n        basePath: process.env.LOCAL_STORAGE_BASE_PATH || './files',\n      }\n    }\n  });\n}\n\nexport async function GET(request: NextRequest) {\n  const { searchParams } = new URL(request.url);\n  const action = searchParams.get('action');\n  const path = searchParams.get('path') || '/';\n\n  const fm = await getFileManager();\n\n  switch (action) {\n    case 'list':\n      return NextResponse.json(await fm.listDirectory(path));\n    case 'tree':\n      const depth = parseInt(searchParams.get('depth') || '3', 10);\n      return NextResponse.json(await fm.getFolderTree(path, depth));\n    default:\n      return NextResponse.json({ success: false, error: 'Invalid action' });\n  }\n}\n\nexport async function POST(request: NextRequest) {\n  const body = await request.json();\n  const { action, ...params } = body;\n\n  const fm = await getFileManager();\n\n  switch (action) {\n    case 'createDirectory':\n      return NextResponse.json(await fm.createDirectory(params.path));\n    case 'deleteFile':\n      return NextResponse.json(await fm.deleteFile(params.path));\n    case 'renameFile':\n      return NextResponse.json(await fm.renameFile(params.path, params.newName));\n    default:\n      return NextResponse.json({ success: false, error: 'Invalid action' });\n  }\n}\n```\n\n### File Upload API Route\n\n```typescript\n// app/api/files/upload/route.ts\nimport { NextRequest, NextResponse } from 'next/server';\nimport { createInitializedFileManager } from 'hazo_files';\n\nexport async function POST(request: NextRequest) {\n  const formData = await request.formData();\n  const file = formData.get('file') as File;\n  const path = formData.get('path') as string;\n\n  const fm = await getFileManager();\n\n  // Convert File to Buffer\n  const arrayBuffer = await file.arrayBuffer();\n  const buffer = Buffer.from(arrayBuffer);\n\n  const result = await fm.uploadFile(buffer, path);\n  return NextResponse.json(result);\n}\n```\n\n### Progress Tracking\n\n```typescript\n// Upload with progress tracking\nawait fileManager.uploadFile(\n  './large-file.zip',\n  '/uploads/large-file.zip',\n  {\n    onProgress: (progress, bytesTransferred, totalBytes) => {\n      console.log(`Progress: ${progress.toFixed(2)}%`);\n      console.log(`${bytesTransferred} / ${totalBytes} bytes`);\n    }\n  }\n);\n\n// Download with progress tracking\nawait fileManager.downloadFile(\n  '/uploads/large-file.zip',\n  './downloaded-file.zip',\n  {\n    onProgress: (progress, bytesTransferred, totalBytes) => {\n      console.log(`Download: ${progress.toFixed(2)}%`);\n    }\n  }\n);\n```\n\n### File Operations\n\n```typescript\n// Create directory structure\nawait fileManager.createDirectory('/projects/2024/docs');\n\n// Upload file\nconst uploadResult = await fileManager.uploadFile(\n  buffer,\n  '/projects/2024/docs/report.pdf'\n);\n\n// Move file\nawait fileManager.moveItem(\n  '/projects/2024/docs/report.pdf',\n  '/archive/2024/report.pdf'\n);\n\n// Rename file\nawait fileManager.renameFile(\n  '/archive/2024/report.pdf',\n  'annual-report.pdf'\n);\n\n// Copy file (convenience method)\nawait fileManager.copyFile(\n  '/archive/2024/annual-report.pdf',\n  '/backup/annual-report.pdf'\n);\n\n// Delete file\nawait fileManager.deleteFile('/backup/annual-report.pdf');\n\n// Remove directory (recursive)\nawait fileManager.removeDirectory('/archive/2024', true);\n\n// Check if file exists\nconst exists = await fileManager.exists('/projects/2024/docs');\n\n// Get file/folder information\nconst itemResult = await fileManager.getItem('/projects/2024/docs/report.pdf');\nif (itemResult.success && itemResult.data) {\n  console.log('File:', itemResult.data.name);\n  console.log('Size:', itemResult.data.size);\n  console.log('Modified:', itemResult.data.modifiedAt);\n}\n\n// List directory with options\nconst listResult = await fileManager.listDirectory('/projects', {\n  recursive: true,\n  includeHidden: false,\n  filter: (item) => !item.isDirectory && item.name.endsWith('.pdf')\n});\n```\n\n### Working with Text Files\n\n```typescript\n// Write text file\nawait fileManager.writeFile('/notes/readme.txt', 'Hello, World!');\n\n// Read text file\nconst readResult = await fileManager.readFile('/notes/readme.txt');\nif (readResult.success) {\n  console.log(readResult.data); // \"Hello, World!\"\n}\n```\n\n### Folder Tree\n\n```typescript\n// Get folder tree (3 levels deep by default)\nconst treeResult = await fileManager.getFolderTree('/projects', 3);\nif (treeResult.success && treeResult.data) {\n  console.log(JSON.stringify(treeResult.data, null, 2));\n}\n\n// Output:\n// [\n//   {\n//     \"id\": \"abc123\",\n//     \"name\": \"2024\",\n//     \"path\": \"/projects/2024\",\n//     \"children\": [\n//       {\n//         \"id\": \"def456\",\n//         \"name\": \"docs\",\n//         \"path\": \"/projects/2024/docs\",\n//         \"children\": []\n//       }\n//     ]\n//   }\n// ]\n```\n\n## Configuration\n\n### Configuration File (`hazo_files_config.ini`)\n\n```ini\n[general]\nprovider = local\n\n[local]\nbase_path = ./files\nallowed_extensions = jpg,png,pdf,txt,doc,docx\nmax_file_size = 10485760\n\n[google_drive]\nclient_id = your-client-id.apps.googleusercontent.com\nclient_secret = your-client-secret\nredirect_uri = http://localhost:3000/api/auth/callback/google\nrefresh_token =\naccess_token =\nroot_folder_id =\n\n[naming]\n; Supported date format tokens for naming rules\ndate_formats = YYYY,YY,MM,M,DD,D,MMM,MMMM,YYYY-MM-DD,YYYY-MMM-DD,DD-MM-YYYY,MM-DD-YYYY\n```\n\n### Environment Variables\n\nThe following environment variables can override configuration file values:\n\n- `HAZO_GOOGLE_DRIVE_CLIENT_ID`\n- `HAZO_GOOGLE_DRIVE_CLIENT_SECRET`\n- `HAZO_GOOGLE_DRIVE_REDIRECT_URI`\n- `HAZO_GOOGLE_DRIVE_REFRESH_TOKEN`\n- `HAZO_GOOGLE_DRIVE_ACCESS_TOKEN`\n- `HAZO_GOOGLE_DRIVE_ROOT_FOLDER_ID`\n\n### Configuration via Code\n\n```typescript\nimport { createInitializedFileManager } from 'hazo_files';\n\nconst fileManager = await createInitializedFileManager({\n  config: {\n    provider: 'local',\n    local: {\n      basePath: './storage',\n      allowedExtensions: ['jpg', 'png', 'gif', 'pdf'],\n      maxFileSize: 5 * 1024 * 1024 // 5MB\n    }\n  }\n});\n```\n\n## Database Schema\n\nDatabase tables are only required if you use `TrackedFileManager`, `FileMetadataService`, `NamingConventionService`, or `UploadExtractService`. Plain `FileManager` (filesystem only) needs no tables.\n\nThere are two tables:\n\n- **`hazo_files`** — file metadata, hashes, references, content tags\n- **`hazo_files_naming`** — saved naming conventions\n\nThe DDL below is also exposed programmatically via `HAZO_FILES_TABLE_SCHEMA` and `HAZO_FILES_NAMING_TABLE_SCHEMA` (see [Programmatic Setup](#programmatic-setup) below). Run the raw SQL if you prefer to manage migrations with your existing tooling (psql, sqlite3, Flyway, Knex, etc.).\n\n### `hazo_files` Table\n\n#### PostgreSQL\n\n```sql\nCREATE TABLE IF NOT EXISTS hazo_files (\n  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n  filename TEXT NOT NULL,\n  file_type TEXT NOT NULL,\n  file_data TEXT DEFAULT '{}',\n  created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),\n  changed_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),\n  file_path TEXT NOT NULL,\n  storage_type TEXT NOT NULL,\n  file_hash TEXT,\n  file_size BIGINT,\n  file_changed_at TIMESTAMP WITH TIME ZONE,\n  file_refs TEXT DEFAULT '[]',\n  ref_count INTEGER DEFAULT 0,\n  status TEXT DEFAULT 'active',\n  scope_id UUID,\n  uploaded_by UUID,\n  storage_verified_at TIMESTAMP WITH TIME ZONE,\n  deleted_at TIMESTAMP WITH TIME ZONE,\n  original_filename TEXT,\n  content_tag TEXT\n);\n\nCREATE INDEX IF NOT EXISTS idx_hazo_files_path ON hazo_files (file_path);\nCREATE INDEX IF NOT EXISTS idx_hazo_files_storage ON hazo_files (storage_type);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_hazo_files_path_storage ON hazo_files (file_path, storage_type);\nCREATE INDEX IF NOT EXISTS idx_hazo_files_hash ON hazo_files (file_hash);\nCREATE INDEX IF NOT EXISTS idx_hazo_files_status ON hazo_files (status);\nCREATE INDEX IF NOT EXISTS idx_hazo_files_scope ON hazo_files (scope_id);\nCREATE INDEX IF NOT EXISTS idx_hazo_files_ref_count ON hazo_files (ref_count);\nCREATE INDEX IF NOT EXISTS idx_hazo_files_deleted ON hazo_files (deleted_at);\nCREATE INDEX IF NOT EXISTS idx_hazo_files_content_tag ON hazo_files (content_tag);\n```\n\n#### SQLite\n\n```sql\nCREATE TABLE IF NOT EXISTS hazo_files (\n  id TEXT PRIMARY KEY,\n  filename TEXT NOT NULL,\n  file_type TEXT NOT NULL,\n  file_data TEXT DEFAULT '{}',\n  created_at TEXT NOT NULL,\n  changed_at TEXT NOT NULL,\n  file_path TEXT NOT NULL,\n  storage_type TEXT NOT NULL,\n  file_hash TEXT,\n  file_size INTEGER,\n  file_changed_at TEXT,\n  file_refs TEXT DEFAULT '[]',\n  ref_count INTEGER DEFAULT 0,\n  status TEXT DEFAULT 'active',\n  scope_id TEXT,\n  uploaded_by TEXT,\n  storage_verified_at TEXT,\n  deleted_at TEXT,\n  original_filename TEXT,\n  content_tag TEXT\n);\n\nCREATE INDEX IF NOT EXISTS idx_hazo_files_path ON hazo_files (file_path);\nCREATE INDEX IF NOT EXISTS idx_hazo_files_storage ON hazo_files (storage_type);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_hazo_files_path_storage ON hazo_files (file_path, storage_type);\nCREATE INDEX IF NOT EXISTS idx_hazo_files_hash ON hazo_files (file_hash);\nCREATE INDEX IF NOT EXISTS idx_hazo_files_status ON hazo_files (status);\nCREATE INDEX IF NOT EXISTS idx_hazo_files_scope ON hazo_files (scope_id);\nCREATE INDEX IF NOT EXISTS idx_hazo_files_ref_count ON hazo_files (ref_count);\nCREATE INDEX IF NOT EXISTS idx_hazo_files_deleted ON hazo_files (deleted_at);\nCREATE INDEX IF NOT EXISTS idx_hazo_files_content_tag ON hazo_files (content_tag);\n```\n\n### `hazo_files_naming` Table\n\nRequired only if you use `NamingConventionService` to persist saved naming rules.\n\n#### PostgreSQL\n\n```sql\nCREATE TABLE IF NOT EXISTS hazo_files_naming (\n  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n  scope_id UUID,\n  naming_title TEXT NOT NULL,\n  naming_type TEXT NOT NULL CHECK(naming_type IN ('file', 'folder', 'both')),\n  naming_value TEXT NOT NULL,\n  created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),\n  changed_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),\n  variables TEXT DEFAULT '[]'\n);\n\nCREATE INDEX IF NOT EXISTS idx_hazo_files_naming_scope ON hazo_files_naming (scope_id);\nCREATE INDEX IF NOT EXISTS idx_hazo_files_naming_type ON hazo_files_naming (naming_type);\n```\n\n#### SQLite\n\n```sql\nCREATE TABLE IF NOT EXISTS hazo_files_naming (\n  id TEXT PRIMARY KEY,\n  scope_id TEXT,\n  naming_title TEXT NOT NULL,\n  naming_type TEXT NOT NULL CHECK(naming_type IN ('file', 'folder', 'both')),\n  naming_value TEXT NOT NULL,\n  created_at TEXT NOT NULL,\n  changed_at TEXT NOT NULL,\n  variables TEXT DEFAULT '[]'\n);\n\nCREATE INDEX IF NOT EXISTS idx_hazo_files_naming_scope ON hazo_files_naming (scope_id);\nCREATE INDEX IF NOT EXISTS idx_hazo_files_naming_type ON hazo_files_naming (naming_type);\n```\n\n### Programmatic Setup\n\nThe same DDL is available as exported constants so you can run it from your app's startup or migration script without hand-copying SQL:\n\n```typescript\nimport {\n  HAZO_FILES_TABLE_SCHEMA,\n  HAZO_FILES_NAMING_TABLE_SCHEMA,\n} from 'hazo_files';\n\n// Pick 'sqlite' or 'postgres'\nconst dbType: 'sqlite' | 'postgres' = 'sqlite';\n\n// Create hazo_files table\nawait db.run(HAZO_FILES_TABLE_SCHEMA[dbType].ddl);\nfor (const idx of HAZO_FILES_TABLE_SCHEMA[dbType].indexes) {\n  await db.run(idx);\n}\n\n// Create hazo_files_naming table (only if using NamingConventionService)\nawait db.run(HAZO_FILES_NAMING_TABLE_SCHEMA[dbType].ddl);\nfor (const idx of HAZO_FILES_NAMING_TABLE_SCHEMA[dbType].indexes) {\n  await db.run(idx);\n}\n```\n\nFor PostgreSQL, swap `db.run(...)` for `client.query(...)`.\n\nTo use a custom table name, see `getSchemaForTable(name, dbType)` and `getNamingSchemaForTable(name, dbType)`.\n\n### Upgrading Existing Tables\n\nIf you already have a pre-V2 or pre-V3 `hazo_files` table, see [Database Migration (Existing Databases)](#database-migration-existing-databases) and [V3 Database Migration](#v3-database-migration) for the `ALTER TABLE` scripts and migration helpers.\n\n## UI Components\n\n### FileBrowser Component\n\nThe `FileBrowser` is a complete, drop-in file management UI with:\n\n- Folder tree navigation\n- File list (grid or list view)\n- Breadcrumb navigation\n- File preview (images, text, PDFs)\n- Context menus and actions\n- Upload, download, rename, delete operations\n- Drag-and-drop file moving between folders\n\n```typescript\nimport { FileBrowser } from 'hazo_files/ui';\n\n<FileBrowser\n  api={api}\n  initialPath=\"/\"\n  showPreview={true}\n  showTree={true}\n  viewMode=\"grid\"\n  treeWidth={250}\n  previewHeight={300}\n  onError={(error) => console.error(error)}\n  onNavigate={(path) => console.log('Navigated to:', path)}\n  onSelect={(item) => console.log('Selected:', item)}\n/>\n```\n\n#### Drag-and-Drop File Moving\n\nThe FileBrowser includes built-in drag-and-drop functionality for moving files and folders:\n\n**Features**:\n- Drag files/folders from the file list\n- Drop onto folders in the sidebar tree or main file list\n- Visual feedback with opacity and colored borders during drag\n- Prevents invalid operations (dropping on self, into current parent, folder into descendant)\n- Shows dragged item preview during drag operation\n\n**How to use**:\n1. Click and hold on any file or folder in the file list\n2. Drag it over a folder in either the tree sidebar or file list\n3. Valid drop targets show a green ring/background\n4. Release to move the item to the new location\n\n**Technical requirements**:\n- Requires `@dnd-kit/core` peer dependency (already included for NamingRuleConfigurator)\n- API must implement `moveItem(sourcePath, destinationPath)` method\n- Automatically validates drop targets to prevent invalid moves\n\n**Visual feedback**:\n- **Dragging**: Item becomes semi-transparent (opacity-50)\n- **Valid drop target**: Green ring (`ring-2 ring-green-500`) and background (`bg-green-50`)\n- **Drag preview**: Shows file/folder icon and name following cursor\n\n**ID patterns used**:\n- File items: `file-item-{path}` (draggable)\n- Folder tree drops: `folder-drop-tree-{path}` (droppable)\n- Folder list drops: `folder-drop-list-{path}` (droppable)\n\n### Individual Components\n\nYou can also use individual components:\n\n```typescript\nimport {\n  PathBreadcrumb,\n  FolderTree,\n  FileList,\n  FilePreview,\n  FileActions,\n  FileInfoPanel\n} from 'hazo_files/ui';\n\n// Use individually with your own layout\n```\n\n### FileInfoPanel Component\n\nThe `FileInfoPanel` displays file metadata in a structured format and can be used standalone in sidebars, custom dialogs, or inline panels:\n\n```typescript\nimport { FileInfoPanel } from 'hazo_files/ui';\n\n// In a sidebar\nfunction Sidebar({ selectedFile, metadata, isLoading }) {\n  return (\n    <div className=\"sidebar p-4\">\n      <h3 className=\"font-bold mb-4\">File Info</h3>\n      <FileInfoPanel\n        item={selectedFile}\n        metadata={metadata}\n        isLoading={isLoading}\n      />\n    </div>\n  );\n}\n\n// Without custom metadata section\n<FileInfoPanel\n  item={file}\n  showCustomMetadata={false}\n  className=\"bg-gray-50 rounded-lg p-4\"\n/>\n\n// In a custom dialog\nfunction MyCustomDialog({ file }) {\n  return (\n    <dialog>\n      <FileInfoPanel item={file} showCustomMetadata={false} />\n    </dialog>\n  );\n}\n```\n\n**Props:**\n- `item: FileSystemItem | null` - The file or folder to display info for\n- `metadata?: FileMetadata | null` - Additional metadata from database\n- `isLoading?: boolean` - Show loading state for custom metadata\n- `showCustomMetadata?: boolean` - Whether to show the JSON metadata section (default: true)\n- `className?: string` - Additional CSS classes for custom styling\n\n### Hooks\n\n```typescript\nimport { useFileBrowser, useFileOperations } from 'hazo_files/ui';\n\nfunction MyCustomFileBrowser() {\n  const {\n    currentPath,\n    files,\n    tree,\n    selectedItem,\n    isLoading,\n    navigate,\n    refresh,\n    selectItem\n  } = useFileBrowser(api, '/');\n\n  const {\n    createFolder,\n    uploadFiles,\n    deleteItem,\n    renameItem\n  } = useFileOperations(api, currentPath);\n\n  // Build your custom UI\n}\n```\n\n### Naming Rule Configurator\n\nBuild consistent file/folder naming patterns with a visual drag-and-drop interface:\n\n```typescript\nimport { NamingRuleConfigurator } from 'hazo_files/ui';\nimport type { NamingVariable } from 'hazo_files/ui';\n\nfunction NamingConfig() {\n  // Define user-specific variables\n  const userVariables: NamingVariable[] = [\n    {\n      variable_name: 'project_name',\n      description: 'Name of the project',\n      example_value: 'WebApp',\n      category: 'user'\n    },\n    {\n      variable_name: 'client_id',\n      description: 'Client identifier',\n      example_value: 'ACME',\n      category: 'user'\n    },\n  ];\n\n  const handleSchemaChange = (schema) => {\n    console.log('New schema:', schema);\n    // Save to database or state\n  };\n\n  const handleExport = (schema) => {\n    // Export as JSON file\n    const blob = new Blob([JSON.stringify(schema, null, 2)], { type: 'application/json' });\n    const url = URL.createObjectURL(blob);\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = 'naming-rule.json';\n    a.click();\n  };\n\n  return (\n    <NamingRuleConfigurator\n      variables={userVariables}\n      onChange={handleSchemaChange}\n      onExport={handleExport}\n      sampleFileName=\"proposal.pdf\"\n    />\n  );\n}\n```\n\nThe configurator provides:\n- **Category Tabs**: User, Date, File, Counter variables\n- **Drag & Drop**: Build patterns by dragging variables into file/folder patterns\n- **Segment Reordering**: Drag segments within patterns to reorder them\n- **Live Preview**: See generated names in real-time with example values\n- **Undo/Redo**: Full history with keyboard shortcuts (Ctrl+Z, Ctrl+Y)\n- **Import/Export**: Save and load naming rules as JSON\n- **Scrollable Layout**: Works in fixed-height containers with scrollable content area\n\nSystem variables included:\n- **Date**: YYYY, YY, MM, DD, YYYY-MM-DD, MMM, MMMM, etc.\n- **File**: original_name, extension, ext\n- **Counter**: counter (auto-incrementing with padding)\n\n### Naming Convention Management Components\n\nFull UI for managing naming conventions stored in the database:\n\n```tsx\nimport {\n  NamingConventionManager,\n  NamingConventionList,\n  NamingConventionEditor,\n} from 'hazo_files/ui';\n\n// Full management UI (list + editor combined)\n<NamingConventionManager\n  api={namingAPI}\n  onSelect={(convention) => applyConvention(convention)}\n/>\n\n// Or use components separately\n<NamingConventionList\n  api={namingAPI}\n  selectedId={selectedId}\n  onSelect={setSelectedId}\n  onEdit={(id) => openEditor(id)}\n  onDelete={(id) => confirmDelete(id)}\n/>\n\n<NamingConventionEditor\n  api={namingAPI}\n  conventionId={editingId}\n  userVariables={customVariables}\n  onSave={(convention) => handleSave(convention)}\n  onCancel={() => closeEditor()}\n/>\n```\n\n## Naming Rules API\n\nGenerate file and folder names programmatically from naming schemas:\n\n```typescript\nimport {\n  hazo_files_generate_file_name,\n  hazo_files_generate_folder_name,\n  createVariableSegment,\n  createLiteralSegment,\n  type NamingRuleSchema\n} from 'hazo_files';\n\n// Create a naming schema\nconst schema: NamingRuleSchema = {\n  version: 1,\n  filePattern: [\n    createVariableSegment('client_id'),\n    createLiteralSegment('_'),\n    createVariableSegment('project_name'),\n    createLiteralSegment('_'),\n    createVariableSegment('YYYY-MM-DD'),\n    createLiteralSegment('_'),\n    createVariableSegment('counter'),\n  ],\n  folderPattern: [\n    createVariableSegment('YYYY'),\n    createLiteralSegment('/'),\n    createVariableSegment('client_id'),\n    createLiteralSegment('/'),\n    createVariableSegment('project_name'),\n  ],\n};\n\n// Define variable values\nconst variables = {\n  client_id: 'ACME',\n  project_name: 'Website',\n};\n\n// Generate file name\nconst fileResult = hazo_files_generate_file_name(\n  schema,\n  variables,\n  'original-document.pdf',\n  {\n    counterValue: 42,\n    preserveExtension: true,  // Keep original .pdf extension\n    date: new Date('2024-12-09'),\n  }\n);\n\nif (fileResult.success) {\n  console.log(fileResult.name);\n  // Output: \"ACME_Website_2024-12-09_042.pdf\"\n}\n\n// Generate folder path\nconst folderResult = hazo_files_generate_folder_name(schema, variables);\n\nif (folderResult.success) {\n  console.log(folderResult.name);\n  // Output: \"2024/ACME/Website\"\n}\n\n// Use with FileManager\nconst uploadPath = `/${folderResult.name}/${fileResult.name}`;\nawait fileManager.uploadFile(buffer, uploadPath);\n```\n\n### Available System Variables\n\n**Date Variables** (use current date unless overridden):\n- `YYYY` - Full year (2024)\n- `YY` - Two-digit year (24)\n- `MM` - Month with zero padding (01-12)\n- `M` - Month without padding (1-12)\n- `DD` - Day with zero padding (01-31)\n- `D` - Day without padding (1-31)\n- `MMM` - Short month name (Jan, Feb, etc.)\n- `MMMM` - Full month name (January, February, etc.)\n- `YYYY-MM-DD` - ISO date format (2024-01-15)\n- `YYYY-MMM-DD` - Date with month name (2024-Jan-15)\n- `DD-MM-YYYY` - European format (15-01-2024)\n- `MM-DD-YYYY` - US format (01-15-2024)\n\n**File Metadata Variables** (from original filename):\n- `original_name` - Filename without extension\n- `extension` - File extension with dot (.pdf)\n- `ext` - Extension without dot (pdf)\n\n**Counter Variable**:\n- `counter` - Auto-incrementing number with zero padding (001, 042, 123)\n\n### Parsing Pattern Strings\n\nYou can also parse pattern strings directly:\n\n```typescript\nimport { parsePatternString, patternToString } from 'hazo_files';\n\n// Parse string to segments\nconst segments = parsePatternString('{client_id}_{YYYY-MM-DD}_{counter}');\nconsole.log(segments);\n// [\n//   { id: '...', type: 'variable', value: 'client_id' },\n//   { id: '...', type: 'literal', value: '_' },\n//   { id: '...', type: 'variable', value: 'YYYY-MM-DD' },\n//   { id: '...', type: 'literal', value: '_' },\n//   { id: '...', type: 'variable', value: 'counter' },\n// ]\n\n// Convert back to string\nconst patternStr = patternToString(segments);\n// \"{client_id}_{YYYY-MM-DD}_{counter}\"\n```\n\n## Extraction Data Management\n\nManage LLM-extracted data stored within the `file_data` JSON field. The system maintains both raw extraction history and merged results.\n\n### Data Structure\n\n```typescript\ninterface FileDataStructure {\n  merged_data: Record<string, unknown>;  // Combined data from all extractions\n  raw_data: ExtractionData[];            // Individual extraction entries\n}\n\ninterface ExtractionData {\n  id: string;           // Unique extraction ID\n  extracted_at: string; // ISO timestamp\n  source?: string;      // Optional source identifier (e.g., model name)\n  data: Record<string, unknown>;  // The extracted data\n}\n```\n\n### Using with FileMetadataService\n\n```typescript\nimport { FileMetadataService, createFileMetadataService } from 'hazo_files';\n\n// Create service with your CRUD provider\nconst metadataService = createFileMetadataService(crudService);\n\n// Add an extraction\nconst extraction = await metadataService.addExtraction(\n  '/documents/report.pdf',\n  'local',\n  { title: 'Annual Report', author: 'John Doe', pages: 42 },\n  { source: 'gpt-4', mergeStrategy: 'shallow' }\n);\nconsole.log('Added extraction:', extraction?.id);\n\n// Get merged data (combined from all extractions)\nconst merged = await metadataService.getMergedData('/documents/report.pdf', 'local');\nconsole.log('Merged data:', merged);\n\n// Get all extractions\nconst extractions = await metadataService.getExtractions('/documents/report.pdf', 'local');\nconsole.log('All extractions:', extractions);\n\n// Get a specific extraction\nconst specific = await metadataService.getExtractionById(\n  '/documents/report.pdf',\n  'local',\n  extraction?.id\n);\n\n// Remove an extraction (recalculates merged_data by default)\nawait metadataService.removeExtractionById(\n  '/documents/report.pdf',\n  'local',\n  extraction?.id,\n  { recalculateMerged: true, mergeStrategy: 'deep' }\n);\n\n// Clear all extractions\nawait metadataService.clearExtractions('/documents/report.pdf', 'local');\n```\n\n### Using Utility Functions Directly\n\nFor working with parsed data structures without database operations:\n\n```typescript\nimport {\n  parseFileData,\n  addExtractionToFileData,\n  removeExtractionById,\n  getMergedData,\n  getExtractions,\n  deepMerge,\n  createEmptyFileDataStructure,\n} from 'hazo_files';\n\n// Parse existing JSON (auto-migrates old format)\nconst fileData = parseFileData(existingJsonString);\n\n// Add an extraction (returns new structure, immutable)\nconst result = addExtractionToFileData(\n  fileData,\n  { category: 'finance', summary: 'Q4 results' },\n  { source: 'claude-3', mergeStrategy: 'deep' }\n);\n\nif (result.success) {\n  const newFileData = result.data;\n  console.log('New merged data:', newFileData.merged_data);\n  console.log('Extraction count:', newFileData.raw_data.length);\n}\n\n// Remove an extraction by ID\nconst removeResult = removeExtractionById(fileData, 'ext_12345', {\n  recalculateMerged: true,\n  mergeStrategy: 'shallow'\n});\n\n// Get copies of data\nconst mergedCopy = getMergedData(fileData);\nconst extractionsCopy = getExtractions(fileData);\n```\n\n### Merge Strategies\n\n- **Shallow** (default): Spreads top-level properties, later values overwrite earlier\n  ```typescript\n  // { a: 1, b: 2 } + { b: 3, c: 4 } = { a: 1, b: 3, c: 4 }\n  ```\n\n- **Deep**: Recursively merges nested objects, concatenates arrays\n  ```typescript\n  // { a: { x: 1 }, arr: [1] } + { a: { y: 2 }, arr: [2] } = { a: { x: 1, y: 2 }, arr: [1, 2] }\n  ```\n\n### Migration from Old Format\n\nThe `parseFileData` function automatically migrates old plain-object format to the new structure:\n\n```typescript\n// Old format: { title: 'Report', author: 'John' }\n// Becomes: { merged_data: { title: 'Report', author: 'John' }, raw_data: [] }\n```\n\n## Naming Convention Management\n\nStore and manage naming conventions in your database with full CRUD operations.\n\n### NamingConventionService\n\n```typescript\nimport { NamingConventionService, HAZO_FILES_NAMING_TABLE_SCHEMA } from 'hazo_files';\nimport { createCrudService } from 'hazo_connect/server';\n\n// Create CRUD service for naming conventions table\nconst namingCrud = createCrudService(adapter, HAZO_FILES_NAMING_TABLE_SCHEMA.tableName);\nconst namingService = new NamingConventionService(namingCrud);\n\n// Create a naming convention\nconst convention = await namingService.create({\n  naming_title: 'Tax Documents',\n  naming_type: 'both', // 'file', 'folder', or 'both'\n  naming_value: {\n    version: 1,\n    filePattern: [\n      { id: '1', type: 'variable', value: 'client_id' },\n      { id: '2', type: 'literal', value: '_' },\n      { id: '3', type: 'variable', value: 'YYYY-MM-DD' },\n    ],\n    folderPattern: [\n      { id: '4', type: 'variable', value: 'YYYY' },\n      { id: '5', type: 'literal', value: '/' },\n      { id: '6', type: 'variable', value: 'client_id' },\n    ],\n  },\n  variables: [\n    { variable_name: 'client_id', description: 'Client ID', example_value: 'ACME', category: 'user' }\n  ],\n  scope_id: 'optional-scope-uuid', // Link to hazo_scopes for organization\n});\n\n// Get all conventions\nconst allConventions = await namingService.list();\n\n// Get parsed conventions (with schema and variables as objects)\nconst parsed = await namingService.listParsed();\n\n// Get by scope (e.g., for a specific organization)\nconst scopedConventions = await namingService.getByScope('scope-uuid');\n\n// Update\nawait namingService.update(convention.id, {\n  naming_title: 'Updated Tax Documents',\n});\n\n// Duplicate\nconst copy = await namingService.duplicate(convention.id, 'Tax Documents Copy');\n\n// Delete\nawait namingService.delete(convention.id);\n```\n\n### NamingConventionManager UI Component\n\n```tsx\nimport { NamingConventionManager } from 'hazo_files/ui';\nimport type { NamingConventionAPI } from 'hazo_files/ui';\n\n// Create API adapter for your backend\nconst namingAPI: NamingConventionAPI = {\n  list: () => fetch('/api/naming-conventions').then(r => r.json()),\n  create: (input) => fetch('/api/naming-conventions', {\n    method: 'POST',\n    body: JSON.stringify(input),\n  }).then(r => r.json()),\n  update: (id, input) => fetch(`/api/naming-conventions/${id}`, {\n    method: 'PATCH',\n    body: JSON.stringify(input),\n  }).then(r => r.json()),\n  delete: (id) => fetch(`/api/naming-conventions/${id}`, {\n    method: 'DELETE',\n  }).then(r => r.json()),\n};\n\nfunction NamingConventionsPage() {\n  return (\n    <NamingConventionManager\n      api={namingAPI}\n      onSelect={(convention) => console.log('Selected:', convention)}\n    />\n  );\n}\n```\n\n## Upload with LLM Extraction\n\nCombine file uploads with automatic LLM extraction and naming convention application.\n\n### UploadExtractService\n\n```typescript\nimport {\n  TrackedFileManager,\n  NamingConventionService,\n  LLMExtractionService,\n  UploadExtractService,\n} from 'hazo_files';\nimport { createLLM } from 'hazo_llm_api';\n\n// Create LLM extraction service\nconst extractionService = new LLMExtractionService((provider, options) => {\n  return createLLM({ provider, ...options });\n}, 'gemini');\n\n// Create upload + extract service (with optional content tag config)\nconst uploadExtract = new UploadExtractService(\n  trackedFileManager,\n  namingService,\n  extractionService,\n  {\n    content_tag_set_by_llm: true,\n    content_tag_prompt_area: 'classification',\n    content_tag_prompt_key: 'classify_document',\n    content_tag_prompt_return_fieldname: 'document_type',\n  }\n);\n\n// Upload with extraction and naming convention\nconst result = await uploadExtract.uploadWithExtract(\n  pdfBuffer,\n  'quarterly-report.pdf',\n  {\n    // Enable LLM extraction\n    extract: true,\n    extractionOptions: {\n      promptArea: 'reports',\n      promptKey: 'extract_summary',\n      llmProvider: 'gemini',\n    },\n    // Apply naming convention\n    namingConventionId: 'convention-uuid',\n    namingVariables: { client_id: 'ACME', project: 'Q4' },\n    basePath: '/documents',\n    createFolders: true,\n    counterValue: 1,\n  }\n);\n\nif (result.success) {\n  console.log('Uploaded to:', result.generatedPath);\n  // e.g., '/documents/2024/ACME/ACME_Q4_2024-12-09_001.pdf'\n  console.log('Extracted data:', result.extraction?.data);\n  console.log('Content tag:', result.contentTag);\n  // e.g., 'invoice', 'report', 'contract'\n}\n\n// Generate path preview without uploading\nconst preview = await uploadExtract.generatePath(\n  'document.pdf',\n  'convention-uuid',\n  { client_id: 'ACME' },\n  { basePath: '/docs', counterValue: 5 }\n);\nconsole.log('Would upload to:', preview.fullPath);\n\n// Create folder from naming convention\nconst folderResult = await uploadExtract.createFolderFromConvention(\n  'convention-uuid',\n  { client_id: 'ACME', project: 'Website' },\n  { basePath: '/projects' }\n);\n```\n\n### LLMExtractionService Standalone\n\n```typescript\nimport { LLMExtractionService } from 'hazo_files';\n\nconst extractionService = new LLMExtractionService({\n  create: llmFactory,\n  invalidateCache: (area, key) => invalidate_prompt_cache(area, key), // optional\n}, 'gemini');\n\n// Extract from document\nconst result = await extractionService.extractFromDocument(\n  pdfBuffer,\n  'application/pdf',\n  {\n    customPrompt: 'Extract all financial figures and dates',\n    llmProvider: 'qwen',\n  }\n);\n\n// Extract from image\nconst imageResult = await extractionService.extractFromImage(\n  imageBuffer,\n  'image/jpeg',\n  {\n    promptArea: 'receipts',\n    promptKey: 'extract_receipt',\n  }\n);\n\n// Auto-detect based on MIME type\nconst autoResult = await extractionService.extract(\n  buffer,\n  mimeType,\n  extractionOptions\n);\n```\n\n## Content Tagging\n\nAutomatically classify uploaded files using LLM-based content analysis. The `content_tag` field stores a classification string (e.g., \"invoice\", \"report\", \"contract\") determined by an LLM prompt.\n\n### Configuration\n\n```typescript\nimport type { ContentTagConfig } from 'hazo_files';\n\nconst contentTagConfig: ContentTagConfig = {\n  content_tag_set_by_llm: true,\n  content_tag_prompt_area: 'classification',\n  content_tag_prompt_key: 'classify_document',\n  content_tag_prompt_return_fieldname: 'document_type',\n  content_tag_prompt_variables: { language: 'en' }, // optional\n};\n```\n\n### Automatic Tagging at Upload\n\nPass `contentTagConfig` to `UploadExtractService` constructor (default for all uploads) or per-upload via options:\n\n```typescript\n// Per-upload override\nconst result = await uploadExtract.uploadWithExtract(buffer, 'file.pdf', {\n  basePath: '/docs',\n  contentTagConfig: {\n    content_tag_set_by_llm: true,\n    content_tag_prompt_area: 'classification',\n    content_tag_prompt_key: 'classify_document',\n    content_tag_prompt_return_fieldname: 'document_type',\n  },\n});\nconsole.log(result.contentTag); // e.g., 'invoice'\n```\n\n### Manual Tagging\n\nTag existing files by their database record ID:\n\n```typescript\nconst tagResult = await uploadExtract.tagFileContent('file-record-id');\nif (tagResult.success) {\n  console.log('Tagged as:', tagResult.data);\n}\n```\n\n### V3 Database Migration\n\nIf you have an existing `hazo_files` table, run the V3 migration to add the `content_tag` column:\n\n```typescript\nimport { migrateToV3, HAZO_FILES_MIGRATION_V3 } from 'hazo_files';\n\n// Using the migration helper\nawait migrateToV3(\n  { run: (sql) => db.run(sql) },\n  'sqlite'\n);\n\n// Or run statements manually\nfor (const stmt of HAZO_FILES_MIGRATION_V3.sqlite.alterStatements) {\n  try { await db.run(stmt); } catch { /* column exists */ }\n}\n```\n\nNew tables created with `HAZO_FILES_TABLE_SCHEMA` already include the `content_tag` column.\n\n## File Reference Tracking\n\nTrack which entities (form fields, chat messages, etc.) reference each file. Multiple entities can reference the same file, enabling shared files without duplication.\n\n### Adding and Removing References\n\n```typescript\nimport { TrackedFileManager } from 'hazo_files';\n\n// Upload a file with an initial reference\nconst result = await trackedManager.uploadFileWithRef(buffer, '/docs/report.pdf', {\n  scope_id: 'workspace-123',\n  uploaded_by: 'user-456',\n  ref: {\n    entity_type: 'form_field',\n    entity_id: 'field-789',\n    created_by: 'user-456',\n  },\n});\n// result.data.file_id, result.data.ref_id\n\n// Add another reference to the same file\nawait trackedManager.addRef(fileId, {\n  entity_type: 'chat_message',\n  entity_id: 'msg-abc',\n});\n\n// Remove a specific reference\nconst { remaining_refs } = await trackedManager.removeRef(fileId, refId);\n\n// Get file with status info\nconst fileStatus = await trackedManager.getFileById(fileId);\n// { record, refs: FileRef[], is_orphaned: boolean }\n```\n\n### Orphan Detection and Cleanup\n\n```typescript\n// Find files with zero references\nconst orphans = await trackedManager.findOrphanedFiles({\n  olderThanMs: 7 * 24 * 60 * 60 * 1000, // 7 days old\n  scope_id: 'workspace-123',\n});\n\n// Clean up orphaned files (delete physical files + DB records)\nconst { cleaned, errors } = await trackedManager.cleanupOrphanedFiles({\n  olderThanMs: 30 * 24 * 60 * 60 * 1000,\n  softDeleteOnly: false, // true to only mark as soft_deleted\n});\n\n// Soft-delete a specific file\nawait trackedManager.softDeleteFile(fileId);\n\n// Verify physical file existence\nconst exists = await trackedManager.verifyFileExistence(fileId);\n```\n\n### Database Migration (Existing Databases)\n\nIf you have an existing `hazo_files` table, run the V2 migration to add reference tracking columns:\n\n```typescript\nimport { migrateToV2, backfillV2Defaults, HAZO_FILES_MIGRATION_V2 } from 'hazo_files';\n\n// Using the migration helper\nawait migrateToV2(\n  { run: (sql) => db.exec(sql) }, // SQLite\n  'sqlite'\n);\nawait backfillV2Defaults({ run: (sql) => db.exec(sql) }, 'sqlite');\n\n// Or run statements manually\nfor (const stmt of HAZO_FILES_MIGRATION_V2.sqlite.alterStatements) {\n  try { await db.run(stmt); } catch { /* column exists */ }\n}\nfor (const idx of HAZO_FILES_MIGRATION_V2.sqlite.indexes) {\n  await db.run(idx);\n}\n```\n\nNew tables created with `HAZO_FILES_TABLE_SCHEMA` already include V2 columns. For V3 content tagging migration, see [Content Tagging](#content-tagging) above.\n\n### Reference Tracking Types\n\n```typescript\nimport type {\n  FileRef,           // Individual reference from entity to file\n  FileMetadataRecordV2,  // Extended record with refs, status, scope\n  FileWithStatus,    // Rich view: record + parsed refs + is_orphaned\n  FileStatus,        // 'active' | 'orphaned' | 'soft_deleted' | 'missing'\n  AddRefOptions,     // Options for adding a reference\n  RemoveRefsCriteria, // Criteria for bulk ref removal\n} from 'hazo_files';\n```\n\n### Pure Reference Helpers (v2.1.0)\n\nFunctional helpers for manipulating `{ file_refs, ref_count }` objects without a database. Useful for in-memory state management or building your own persistence layer.\n\n```typescript\nimport { addRef, removeRef, countRefs } from 'hazo_files';\nimport type { FileWithRefs, FileRef } from 'hazo_files';\n\n// addRef — idempotent on same ref_id; returns updated object\nconst updated = addRef(file, {\n  ref_id: 'ref-123',\n  ref_type: 'form_field',\n  ref_source: 'form-abc',\n  created_at: new Date().toISOString(),\n});\n// updated.ref_count === countRefs(updated)\n\n// removeRef — soft-tombstones by setting removed_at; returns updated object\nconst released = removeRef(file, 'ref-123', new Date().toISOString());\n// released.ref_count decremented; original ref_id still present with removed_at set\n\n// countRefs — count active (non-tombstoned) references\nconst active = countRefs(file); // number\n```\n\nThese helpers are **pure functions** — they never write to a database. Pair them with `TrackedFileManager.addRef` / `removeRef` when you need DB persistence.\n\n## Naming Templates (v2.1.0)\n\n`NamingTemplate` is a lightweight DSL for generating filenames and folder paths from string templates with variable substitution and pipe formatters.\n\n### Basic Usage\n\n```typescript\nimport { NamingTemplate } from 'hazo_files';\n\nconst name = NamingTemplate.render(\n  '{client_name|slug}_{date|date:YYYY-MM-DD}_{index|pad:3}.pdf',\n  { client_name: 'Acme Corp', date: '2026-05-24T00:00:00Z', index: 7 }\n);\n// → \"acme-corp_2026-05-24_007.pdf\"\n```\n\n### Template Syntax\n\n- **`{variable}`** — substitutes `variable` from the vars object\n- **`{variable|formatter}`** — applies a formatter after substitution\n- **`{variable|formatter:arg}`** — formatter with argument\n- **`{obj.nested.key}`** — dotted-path resolution into nested objects\n- Output is capped at **200 characters**; `/\\:*?\"<>|` are sanitised to `_`\n\n### Formatters\n\n| Formatter | Example | Description |\n|---|---|---|\n| `slug` | `{name\\|slug}` | Lowercase, replace non-alphanumeric with `-`, strip leading/trailing `-` |\n| `upper` | `{code\\|upper}` | Uppercase |\n| `lower` | `{code\\|lower}` | Lowercase |\n| `pad:N` | `{index\\|pad:3}` | Zero-pad to N digits (7 → `007`) |\n| `truncate:N` | `{title\\|truncate:20}` | Trim to N characters |\n| `date:FMT` | `{ts\\|date:YYYY-MM-DD}` | Format ISO date string; tokens: `YYYY`, `MM`, `DD`, `HH`, `mm`, `ss` |\n\n### Error Conditions\n\n- Missing variable → throws `Error: missing variable: <name>`\n- `pad` / `truncate` without numeric arg → throws\n- `date` formatter on empty/invalid value → throws\n- Unknown formatter → throws\n\n## Collision-Safe Writes (v2.1.0)\n\n`writeWithCollisionRetry` writes a file to any `FileStorageProvider`, automatically incrementing an `{index}` variable in the template until a free path is found.\n\n### Usage\n\n```typescript\nimport { writeWithCollisionRetry, StorageCollisionExhausted } from 'hazo_files';\n\ntry {\n  const result = await writeWithCollisionRetry({\n    provider,          // FileStorageProvider\n    template: '{client|slug}_{date|date:YYYY-MM-DD}_{index|pad:3}.pdf',\n    vars: { client: 'Acme Corp', date: new Date().toISOString() },\n    body: pdfBuffer,\n    path_prefix: 'uploads/forms',   // optional — prepended to rendered name\n    max_attempts: 999,              // optional, default 999\n    put_opts: { metadata: { ... } } // optional extra PutOpts (ifNotExists always set)\n  });\n\n  console.log(result.logical_path);\n  // → \"uploads/forms/acme-corp_2026-05-24_001.pdf\"\n  //   (or _002, _003, … if earlier slots were taken)\n} catch (err) {\n  if (err instanceof StorageCollisionExhausted) {\n    // All 999 attempts collided\n    console.error(`Could not write after ${err.attempts} attempts`);\n  }\n  throw err;\n}\n```\n\n### How It Works\n\n1. Renders the template with `{ ...vars, index: 1 }` for the first attempt\n2. Calls `provider.put(path, body, { ifNotExists: true })`\n3. If the file exists, increments `index` and retries\n4. Returns `PutResult & { logical_path: string }` on the first successful write\n5. Throws `StorageCollisionExhausted` if all attempts are exhausted\n\nThe `{index}` variable is **automatically injected** — you don't need to supply it in `vars`.\n\n## File Change Detection\n\nDetect file content changes using fast xxHash hashing.\n\n```typescript\nimport { TrackedFileManager, computeFileHash, hasFileContentChanged } from 'hazo_files';\n\n// TrackedFileManager automatically tracks file hashes on upload\nconst result = await trackedManager.uploadFile(buffer, '/docs/report.pdf', {\n  skipHash: false, // Hash is computed by default\n  awaitRecording: true, // Wait for DB record before returning\n});\n\n// Check if a file has changed since it was tracked\nconst hasChanged = await trackedManager.hasFileChanged('/docs/report.pdf');\nif (hasChanged) {\n  console.log('File has been modified since last upload');\n}\n\n// Get stored hash and size\nconst hash = await trackedManager.getStoredHash('/docs/report.pdf');\nconst size = await trackedManager.getStoredSize('/docs/report.pdf');\n\n// Use hash utilities directly\nconst fileHash = await computeFileHash(buffer);\nconst changed = await hasFileContentChanged(oldHash, newBuffer);\n```\n\n### Server Entry Point\n\nFor server-side applications, use the `/server` entry point which includes a factory function:\n\n```typescript\nimport { createHazoFilesServer } from 'hazo_files/server';\n\nconst hazoFiles = await createHazoFilesServer({\n  crudService: fileCrud,\n  namingCrudService: namingCrud,\n  config: {\n    provider: 'local',\n    local: { basePath: './storage' },\n  },\n  enableTracking: true,\n  llmFactory: {\n    create: (provider) => createLLM({ provider }),\n    invalidateCache: (area, key) => invalidate_prompt_cache(area, key), // optional\n  },\n  // Optional: enable automatic content tagging for all uploads\n  defaultContentTagConfig: {\n    content_tag_set_by_llm: true,\n    content_tag_prompt_area: 'classification',\n    content_tag_prompt_key: 'classify_document',\n    content_tag_prompt_return_fieldname: 'document_type',\n  },\n});\n\n// Access all services\nconst { fileManager, metadataService, namingService, extractionService, uploadExtractService, invalidatePromptCache } = hazoFiles;\n\n// Invalidate prompt cache without importing hazo_llm_api directly\ninvalidatePromptCache?.('classification', 'classify_document');\n```\n\n## Background Upload Pipelines\n\nA framework-agnostic upload pipeline engine that survives React component unmount. Useful when uploads include multi-step server work (upload → LLM extract → user confirmation → DB commit) and the user may navigate away mid-flight.\n\nTwo subpath exports:\n\n- `hazo_files/background-upload` — core, no React dependency (`UploadManager`, `Job`, `PipelineExecutor`, `TypedEventEmitter`, all types)\n- `hazo_files/background-upload/react` — React bindings (`HazoFileUploadProvider`, `useFileUpload`, `useJobStatus`, `useFileUploadToasts`)\n\n### Core API (framework-agnostic)\n\n```typescript\nimport { UploadManager } from 'hazo_files/background-upload';\nimport type { PipelineStep, PipelineContext, JobHandle } from 'hazo_files/background-upload';\n\nconst uploadStep: PipelineStep = {\n  name: 'upload',\n  async execute(ctx: PipelineContext, handle: JobHandle) {\n    handle.set_status('uploading');\n    for (let i = 0; i < ctx.files.length; i++) {\n      // ... POST file to your /api/files/upload route\n      handle.set_progress(i + 1, ctx.files.length);\n    }\n  },\n};\n\nconst extractStep: PipelineStep = {\n  name: 'extract',\n  async execute(ctx, handle) {\n    handle.set_status('processing');\n    const extracted = await fetch('/api/extract', { /* ... */ }).then(r => r.json());\n    ctx.extracted_data = extracted;\n  },\n};\n\nconst manager = new UploadManager({\n  max_concurrent: 2,\n  default_pipeline_steps: [uploadStep, extractStep],\n});\n\nmanager.on('job:completed', ({ job }) => console.log('done', job.job_id));\n\nconst batch_id = manager.submit_batch({\n  files: [file1, file2],\n  group_id: 'project-123',\n  group_label: 'Q4 Tax Documents',\n});\n```\n\n### React Provider + Hooks\n\n```tsx\n// app/layout.tsx (Next.js) or your app root\n'use client';\nimport { HazoFileUploadProvider } from 'hazo_files/background-upload/react';\nimport { Toaster } from 'sonner';\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n  return (\n    <HazoFileUploadProvider config={{ max_concurrent: 2 }}>\n      <Toaster richColors />\n      {children}\n    </HazoFileUploadProvider>\n  );\n}\n```\n\n```tsx\n'use client';\nimport { useFileUpload, useJobStatus } from 'hazo_files/background-upload/react';\n\nexport function UploadButton() {\n  const { submit_batch, active_jobs } = useFileUpload();\n\n  function onPick(files: FileList) {\n    submit_batch({\n      files: Array.from(files),\n      group_id: 'project-123',\n      group_label: 'Project 123',\n      pipeline_steps: [/* your PipelineStep[] */],\n    });\n  }\n\n  return (\n    <>\n      <input type=\"file\" multiple onChange={(e) => onPick(e.target.files!)} />\n      <ul>\n        {active_jobs.map((j) => (\n          <li key={j.job_id}>{j.group_label}: {j.status}</li>\n        ))}\n      </ul>\n    </>\n  );\n}\n\n// Track a single job\nexport function JobBadge({ job_id }: { job_id: string }) {\n  const job = useJobStatus(job_id);\n  if (!job) return null;\n  return <span>{job.status} {job.progress && `${job.progress.current}/${job.progress.total}`}</span>;\n}\n```\n\n### Confirmation Steps (user-in-the-loop)\n\n```typescript\nconst confirmStep: PipelineStep = {\n  name: 'confirm',\n  async execute(ctx, handle) {\n    handle.set_status('awaiting_confirmation');\n    const result = await handle.request_confirmation({\n      conflicts: ctx.extracted_data.conflicts,\n    });\n    if (!result.confirmed) throw new Error('User cancelled');\n    // ctx.extracted_data now reflects user choices via result.data\n  },\n};\n```\n\nIn the UI, subscribe to `job:confirmation_needed` (or read jobs in `awaiting_confirmation` status), render a dialog, then:\n\n```typescript\nconst { resolve_confirmation } = useFileUpload();\nresolve_confirmation(job_id, { confirmed: true, data: userChoices });\n```\n\n### Sonner Toast Bridge\n\nThe provider mounts a `ToastBridge` by default (`enable_toasts={true}`) that uses sonner to notify on `job:completed`, `job:error`, `job:confirmation_needed`, and `batch:completed`. Sonner is a soft optional peer dependency — if it isn't installed, the bridge is a no-op. Set `enable_toasts={false}` on the provider to opt out, or wire `useFileUploadToasts(manager)` yourself for custom toast behavior.\n\n### Events\n\n| Event | Payload | Fired when |\n|-------|---------|------------|\n| `job:created` | `{ job }` | Job enters the queue |\n| `job:status_changed` | `{ job, previous_status }` | Status transitions (queued → uploading → processing → ...) |\n| `job:progress` | `{ job }` | `handle.set_progress` called inside a pipeline step |\n| `job:completed` | `{ job }` | All pipeline steps finished successfully |\n| `job:error` | `{ job, error }` | A pipeline step threw |\n| `job:confirmation_needed` | `{ job, payload }` | `handle.request_confirmation` called |\n| `job:confirmation_resolved` | `{ job, result }` | `resolve_confirmation` called |\n| `batch:progress` | `{ batch }` | Any job in the batch settles |\n| `batch:completed` | `{ batch }` | All jobs in the batch are `done` or `error` |\n\n### Design Notes\n\n- **Survives unmount**: `UploadManager` lives on a `useRef`; pipelines run on the manager, not on React state. Navigating away does not abort uploads.\n- **Single source of truth**: `useFileUpload` / `useJobStatus` subscribe via `useSyncExternalStore` against the manager's event emitter, so multiple components stay consistent.\n- **Concurrency**: `max_concurrent` controls how many jobs the executor runs in parallel; the rest wait in the FIFO queue.\n- **No DB writes**: This module is purely an in-memory pipeline runner — your pipeline steps own all server I/O.\n\n## API Reference\n\n### FileManager\n\nMain service class providing unified file operations.\n\n#### Methods\n\n- `initialize(config?: HazoFilesConfig): Promise<void>` - Initialize the file manager\n- `createDirectory(path: string): Promise<OperationResult<FolderItem>>` - Create directory\n- `removeDirectory(path: string, recursive?: boolean): Promise<OperationResult>` - Remove directory\n- `uploadFile(source, remotePath, options?): Promise<OperationResult<FileItem>>` - Upload file\n- `downloadFile(remotePath, localPath?, options?): Promise<OperationResult<Buffer | string>>` - Download file\n- `moveItem(sourcePath, destinationPath, options?): Promise<OperationResult<FileSystemItem>>` - Move file/folder\n- `deleteFile(path: string): Promise<OperationResult>` - Delete file\n- `renameFile(path, newName, options?): Promise<OperationResult<FileItem>>` - Rename file\n- `renameFolder(path, newName, options?): Promise<OperationResult<FolderItem>>` - Rename folder\n- `listDirectory(path, options?): Promise<OperationResult<FileSystemItem[]>>` - List directory contents\n- `getItem(path: string): Promise<OperationResult<FileSystemItem>>` - Get file/folder info\n- `exists(path: string): Promise<boolean>` - Check if file/folder exists\n- `getFolderTree(path?, depth?): Promise<OperationResult<TreeNode[]>>` - Get folder tree\n- `writeFile(path, content, options?): Promise<OperationResult<FileItem>>` - Write text file\n- `readFile(path: string): Promise<OperationResult<string>>` - Read text file\n- `copyFile(sourcePath, destinationPath, options?): Promise<OperationResult<FileItem>>` - Copy file\n- `ensureDirectory(path: string): Promise<OperationResult<FolderItem>>` - Ensure directory exists\n\n### Types\n\n```typescript\ntype StorageProvider = 'local' | 'google_drive';\n\ninterface FileItem {\n  id: string;\n  name: string;\n  path: string;\n  size: number;\n  mimeType: string;\n  createdAt: Date;\n  modifiedAt: Date;\n  isDirectory: false;\n  parentId?: string;\n  metadata?: Record<string, unknown>;\n}\n\ninterface FolderItem {\n  id: string;\n  name: string;\n  path: string;\n  createdAt: Date;\n  modifiedAt: Date;\n  isDirectory: true;\n  parentId?: string;\n  children?: (FileItem | FolderItem)[];\n  metadata?: Record<string, unknown>;\n}\n\ninterface OperationResult<T = void> {\n  success: boolean;\n  data?: T;\n  error?: string;\n}\n\ninterface UploadOptions {\n  overwrite?: boolean;\n  onProgress?: (progress: number, bytesTransferred: number, totalBytes: number) => void;\n  metadata?: Record<string, unknown>;\n}\n```\n\nSee `src/types/index.ts` for complete type definitions.\n\n## Error Handling\n\nhazo_files provides comprehensive error types:\n\n```typescript\nimport {\n  FileNotFoundError,\n  DirectoryNotFoundError,\n  FileExistsError,\n  DirectoryExistsError,\n  DirectoryNotEmptyError,\n  PermissionDeniedError,\n  InvalidPathError,\n  FileTooLargeError,\n  InvalidExtensionError,\n  AuthenticationError,\n  ConfigurationError,\n  OperationError\n} from 'hazo_files';\n\n// Use in try-catch\ntry {\n  await fileManager.uploadFile(buffer, '/files/test.exe');\n} catch (error) {\n  if (error instanceof InvalidExtensionError) {\n    console.error('File type not allowed');\n  } else if (error instanceof FileTooLargeError) {\n    console.error('File is too large');\n  }\n}\n```\n\n## FileStorageProvider (v2 Provider API)\n\nv2 introduces a slimmer storage abstraction — `FileStorageProvider` — that sits alongside (not replacing) the existing `FileManager`/`StorageModule` stack. Use it when you don't need folder trees, metadata tracking, or naming conventions, and just want put/get/signed-URL semantics.\n\n### Interface\n\n```typescript\nimport type { FileStorageProvider, FileEntry } from 'hazo_files/server';\n\ninterface FileStorageProvider {\n  // Core CRUD\n  put(path: string, body: Buffer | Readable, opts?: PutOpts): Promise<PutResult>;\n  get(path: string): Promise<Buffer | Readable>;\n  delete(path: string): Promise<void>;\n  exists(path: string): Promise<boolean>;\n  getSignedUrl(path: string, opts?: SignedUrlOpts): Promise<string>;\n  probe(): Promise<ProbeResult>;\n\n  // v3.1 — parity methods\n  /** List all files and sub-directories under a prefix (recursive). */\n  list(prefix: string): Promise<FileEntry[]>;\n  /** Move bytes from `from` to `to`, removing the source on success. */\n  move(from: string, to: string): Promise<void>;\n  /** Rename — equivalent to move when the parent directory stays the same. */\n  rename(from: string, to: string): Promise<void>;\n}\n\ninterface FileEntry {\n  path: string;       // logical path (same namespace as put/get)\n  name: string;       // bare filename or directory name\n  size: number;       // bytes; 0 for directories\n  isDirectory: boolean;\n}\n```\n\n### AppFileServerProvider\n\nLocal filesystem with HMAC-signed download URLs. Ideal for self-hosted apps where files are served through an API route.\n\n```typescript\nimport { AppFileServerProvider } from 'hazo_files/server';\n\nconst provider = new AppFileServerProvider({\n  root: './storage',          // filesystem root\n  hmac_secret: process.env.FILE_HMAC_SECRET!,\n  default_ttl_seconds: 300,   // default 5 min\n});\n\n// Store a file\nconst result = await provider.put('uploads/report.pdf', buffer, {\n  contentType: 'application/pdf',\n});\n// { provider: 'app_file_server', native_id: 'uploads/report.pdf', size: 12345 }\n\n// Generate a signed URL (expires in 5 min)\nconst url = await provider.getSignedUrl('uploads/report.pdf');\n// '/api/files/serve/1748080800.ABC123.../uploads/report.pdf'\n```\n\n#### Serving signed URLs (Next.js API route)\n\n```typescript\n// app/api/files/serve/[...token]/route.ts\nimport { NextRequest, NextResponse } from 'next/server';\nimport { AppFileServerProvider } from 'hazo_files/server';\n\nconst provider = new AppFileServerProvider({\n  root: './storage',\n  hmac_secret: process.env.FILE_HMAC_SECRET!,\n});\n\nexport async function GET(\n  _req: NextRequest,\n  { params }: { params: { token: string[] } }\n) {\n  // token = ['<exp>.<sig>', 'uploads', 'report.pdf']\n  const [token, ...pathParts] = params.token;\n  const filePath = pathParts.join('/');\n\n  if (!provider.verifySignedUrl(token, filePath)) {\n    return new NextResponse('Forbidden', { status: 403 });\n  }\n\n  const buf = await provider.get(filePath) as Buffer;\n  return new NextResponse(buf, {\n    headers: { 'Content-Type': 'application/octet-stream' },\n  });\n}\n```\n\n### GoogleDriveProvider\n\nService-account Google Drive for Shared Drives. No OAuth flow — configure a GCP service account with Shared Drive access.\n\n```typescript\nimport { GoogleDriveProvider } from 'hazo_files/server';\nimport type { DrivePathCache } from 'hazo_files/server';\n\n// Implement the path cache (e.g., backed by your hazo_connect adapter)\nconst pathCache: DrivePathCache = {\n  lookup: async (key) => redis.get(`gdrive:${key}`),\n  write:  async (key, id) => redis.set(`gdrive:${key}`, id),\n  invalidate: async (key) => redis.del(`gdrive:${key}`),\n};\n\nconst provider = new GoogleDriveProvider({\n  service_account_json: process.env.GOOGLE_SERVICE_ACCOUNT_JSON!,\n  shared_drive_id: 'your-shared-drive-id',\n  path_cache: pathCache,\n});\n\n// Upload a file (folders are created lazily)\nconst result = await provider.put('2026/ACME/invoice.pdf', buffer, {\n  contentType: 'application/pdf',\n});\n// { provider: 'gdrive', native_id: '<drive-file-id>', size: 12345 }\n\n// Check connectivity\nconst health = await provider.probe();\n// { ok: true } or { ok: false, error: 'drive_n","readmeFilename":"README.md"}