{"_id":"@allenhutchison/gemini-utils","_rev":"12-610bc7fe996db4a6d718865972e4d985","name":"@allenhutchison/gemini-utils","dist-tags":{"latest":"1.2.0"},"versions":{"0.1.0":{"name":"@allenhutchison/gemini-utils","version":"0.1.0","keywords":["gemini","google","ai","file-upload","rag","file-search"],"author":{"name":"Allen Hutchison"},"license":"MIT","_id":"@allenhutchison/gemini-utils@0.1.0","maintainers":[{"name":"allenhutchison","email":"allen@hutchison.org"}],"homepage":"https://github.com/allenhutchison/gemini-utils#readme","bugs":{"url":"https://github.com/allenhutchison/gemini-utils/issues"},"dist":{"shasum":"d708916c3ddd259630e7dd26acceed42fd74e93e","tarball":"https://registry.npmjs.org/@allenhutchison/gemini-utils/-/gemini-utils-0.1.0.tgz","fileCount":30,"integrity":"sha512-papTvAA0oZFBJn71BpSFIVfA1amvNbbS5hlgFIgvUpLsxXtguiwaCAIhP9kQ7A3mChvzuoio9BeiQfz56SE2tg==","signatures":[{"sig":"MEQCIEu9q8bRAWDPkEwRDFK2K1MOjFpVRpyhIEn1QNaGvr4BAiAu/vRsE9Y6qGM5XtnwiqTyUSYMvxPzGBN0ybCbhjtRKg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71705},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"e72006b3865143cb836e042ffc9292419dfe6540","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"allenhutchison","email":"allen@hutchison.org"},"repository":{"url":"git+https://github.com/allenhutchison/gemini-utils.git","type":"git"},"_npmVersion":"11.6.4","description":"Shared utilities for Google Gemini AI projects - file upload, MIME validation, and operation tracking","directories":{},"_nodeVersion":"22.17.0","dependencies":{"ignore":"^7.0.5"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@google/genai":"^1.34.0"},"peerDependencies":{"@google/genai":">=1.29.0"},"_npmOperationalInternal":{"tmp":"tmp/gemini-utils_0.1.0_1766798846977_0.8700670438733198","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@allenhutchison/gemini-utils","version":"0.2.0","keywords":["gemini","google","ai","file-upload","rag","file-search"],"author":{"name":"Allen Hutchison"},"license":"MIT","_id":"@allenhutchison/gemini-utils@0.2.0","maintainers":[{"name":"allenhutchison","email":"allen@hutchison.org"}],"homepage":"https://github.com/allenhutchison/gemini-utils#readme","bugs":{"url":"https://github.com/allenhutchison/gemini-utils/issues"},"dist":{"shasum":"37b71b0b7349f2e3c2f6df717bd01ee75b9aebf1","tarball":"https://registry.npmjs.org/@allenhutchison/gemini-utils/-/gemini-utils-0.2.0.tgz","fileCount":34,"integrity":"sha512-raGcPjpC/LD4pR2PzI3gcsc535zL1lsUIcLkbxQPxZPgp2CvLLOg/InMrh3S4YAB12j4Eryas2JHzKQB1ROYuA==","signatures":[{"sig":"MEQCIDCvDDjDlxFtQ4naB/WxuWy+bf3i9leSwVAqXmWWkP0zAiBbLCg6qt4/S4ueyignre2EKPumR+6joh/4PuP+wwgWGg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100148},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"55c7b3ca191e00ccbe7a72f2d8f86b4bb87618f5","scripts":{"lint":"eslint src","test":"NODE_OPTIONS='--experimental-vm-modules' jest","build":"tsc","lint:fix":"eslint src --fix","test:coverage":"NODE_OPTIONS='--experimental-vm-modules' jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"allenhutchison","email":"allen@hutchison.org"},"repository":{"url":"git+https://github.com/allenhutchison/gemini-utils.git","type":"git"},"_npmVersion":"11.6.4","description":"Shared utilities for Google Gemini AI projects - file upload, MIME validation, and operation tracking","directories":{},"_nodeVersion":"22.17.0","dependencies":{"ignore":"^7.0.5"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^9.17.0","globals":"^15.14.0","ts-jest":"^29.0.0","@eslint/js":"^9.17.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@google/genai":"^1.34.0","typescript-eslint":"^8.19.0"},"peerDependencies":{"@google/genai":">=1.29.0"},"_npmOperationalInternal":{"tmp":"tmp/gemini-utils_0.2.0_1766947917958_0.49447974461851496","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@allenhutchison/gemini-utils","version":"0.3.0","keywords":["gemini","google","ai","file-upload","rag","file-search","deep-research","research","interactions"],"author":{"name":"Allen Hutchison"},"license":"MIT","_id":"@allenhutchison/gemini-utils@0.3.0","maintainers":[{"name":"allenhutchison","email":"allen@hutchison.org"}],"homepage":"https://github.com/allenhutchison/gemini-utils#readme","bugs":{"url":"https://github.com/allenhutchison/gemini-utils/issues"},"dist":{"shasum":"a1cfa9056e002e369259398b3df9c7073697ad19","tarball":"https://registry.npmjs.org/@allenhutchison/gemini-utils/-/gemini-utils-0.3.0.tgz","fileCount":50,"integrity":"sha512-D8nY/r8o7mpL+x4FXwwApVIIxYGpXruSFhwdbXvNLJQcMHV1O033ChL5gtaRfOiFia75fs5UOzDbIh4MOh0dig==","signatures":[{"sig":"MEUCIDwUo2YIo8ckN5GHvlxfI1ulXDVNm7dutjGoT3sag4XXAiEAoH2TAmVA3seJttPw4wLnWXWNLvpa1fG5xjOL2JTczt0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":113549},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"83fedbc0a9bab45df14f338901274e62fb9aa7b9","scripts":{"lint":"eslint src","test":"NODE_OPTIONS='--experimental-vm-modules' jest","build":"tsc","lint:fix":"eslint src --fix","test:coverage":"NODE_OPTIONS='--experimental-vm-modules' jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"allenhutchison","email":"allen@hutchison.org"},"repository":{"url":"git+https://github.com/allenhutchison/gemini-utils.git","type":"git"},"_npmVersion":"11.6.4","description":"Shared utilities for Google Gemini AI projects - file upload, MIME validation, operation tracking, and deep research","directories":{},"_nodeVersion":"22.17.0","dependencies":{"ignore":"^7.0.5"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^9.17.0","globals":"^15.14.0","ts-jest":"^29.0.0","@eslint/js":"^9.17.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@google/genai":"^1.34.0","typescript-eslint":"^8.19.0"},"peerDependencies":{"@google/genai":">=1.29.0"},"_npmOperationalInternal":{"tmp":"tmp/gemini-utils_0.3.0_1766952366781_0.08404965982557755","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@allenhutchison/gemini-utils","version":"0.4.0","keywords":["gemini","google","ai","file-upload","rag","file-search","deep-research","research","interactions"],"author":{"name":"Allen Hutchison"},"license":"MIT","_id":"@allenhutchison/gemini-utils@0.4.0","maintainers":[{"name":"allenhutchison","email":"allen@hutchison.org"}],"homepage":"https://github.com/allenhutchison/gemini-utils#readme","bugs":{"url":"https://github.com/allenhutchison/gemini-utils/issues"},"bin":{"gemini-utils":"dist/cli/main.js"},"dist":{"shasum":"10c58704556b4180f7531bf2033762f00d9bd042","tarball":"https://registry.npmjs.org/@allenhutchison/gemini-utils/-/gemini-utils-0.4.0.tgz","fileCount":102,"integrity":"sha512-hk1p3eWZVN2MgA1brfGwbapAJLS1gPO3xJXbuhDqa5sknMWJ8VmyNP6Gh3NSi4BJCCjJHoD5Dm+VblthiT5yvA==","signatures":[{"sig":"MEQCIBH9GVLkab5yv/J8zgc1CPMHZ2L7dnoCpAwPdhHi5EKrAiABM3mjqi6sunzbXmq2CMVo0NapW0ZnIcQCSXwnyzVSUg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":182944},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"3ab0d234975bfa831afbbb605269ab066d79777f","scripts":{"lint":"eslint src","test":"NODE_OPTIONS='--experimental-vm-modules' jest","build":"tsc","lint:fix":"eslint src --fix","test:coverage":"NODE_OPTIONS='--experimental-vm-modules' jest --coverage","prepublishOnly":"npm run build","test:mime-types":"tsx scripts/test-mime-types.ts"},"_npmUser":{"name":"allenhutchison","email":"allen@hutchison.org"},"repository":{"url":"git+https://github.com/allenhutchison/gemini-utils.git","type":"git"},"_npmVersion":"11.6.4","description":"Shared utilities for Google Gemini AI projects - file upload, MIME validation, operation tracking, and deep research","directories":{},"_nodeVersion":"22.17.0","dependencies":{"ignore":"^7.0.5","commander":"^14.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","jest":"^29.7.0","eslint":"^9.17.0","globals":"^15.14.0","ts-jest":"^29.0.0","@eslint/js":"^9.17.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@google/genai":"^1.34.0","typescript-eslint":"^8.19.0"},"peerDependencies":{"@google/genai":">=1.29.0"},"_npmOperationalInternal":{"tmp":"tmp/gemini-utils_0.4.0_1767398747451_0.9137893638838788","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@allenhutchison/gemini-utils","version":"0.4.1","keywords":["gemini","google","ai","file-upload","rag","file-search","deep-research","research","interactions"],"author":{"name":"Allen Hutchison"},"license":"MIT","_id":"@allenhutchison/gemini-utils@0.4.1","maintainers":[{"name":"allenhutchison","email":"allen@hutchison.org"}],"homepage":"https://github.com/allenhutchison/gemini-utils#readme","bugs":{"url":"https://github.com/allenhutchison/gemini-utils/issues"},"bin":{"gemini-utils":"dist/cli/main.js"},"dist":{"shasum":"b923caa1b0e203365730272e7e4e232e41e96ce7","tarball":"https://registry.npmjs.org/@allenhutchison/gemini-utils/-/gemini-utils-0.4.1.tgz","fileCount":102,"integrity":"sha512-C9vUEpY+z3GfJmQRLEpT1FqvOCTxQd9K6EAfCWbj8bvHMmPI5AfNtXjy3Dqzun0qCfF292eh+dNjmr63Yh1rew==","signatures":[{"sig":"MEQCIBfzykv55nku6fXlyNvelEDiz5bXGe78dw6jH4i8WBXvAiBz1YrQd2uWBUlpBziFG+WcugdfmEVzPdx0DhuGLQ+uAg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":186217},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"d864483e4924b3944cdec9102ab1d0828ec94f86","scripts":{"lint":"eslint src","test":"NODE_OPTIONS='--experimental-vm-modules' jest","build":"tsc","lint:fix":"eslint src --fix","test:coverage":"NODE_OPTIONS='--experimental-vm-modules' jest --coverage","prepublishOnly":"npm run build","test:mime-types":"tsx scripts/test-mime-types.ts"},"_npmUser":{"name":"allenhutchison","email":"allen@hutchison.org"},"repository":{"url":"git+https://github.com/allenhutchison/gemini-utils.git","type":"git"},"_npmVersion":"11.6.4","description":"Shared utilities for Google Gemini AI projects - file upload, MIME validation, operation tracking, and deep research","directories":{},"_nodeVersion":"22.17.0","dependencies":{"ignore":"^7.0.5","commander":"^14.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","jest":"^29.7.0","eslint":"^9.17.0","globals":"^15.14.0","ts-jest":"^29.0.0","@eslint/js":"^9.17.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@google/genai":"^1.34.0","typescript-eslint":"^8.19.0"},"peerDependencies":{"@google/genai":">=1.29.0"},"_npmOperationalInternal":{"tmp":"tmp/gemini-utils_0.4.1_1767399232891_0.7248804010976966","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@allenhutchison/gemini-utils","version":"0.4.2","keywords":["gemini","google","ai","file-upload","rag","file-search","deep-research","research","interactions"],"author":{"name":"Allen Hutchison"},"license":"MIT","_id":"@allenhutchison/gemini-utils@0.4.2","maintainers":[{"name":"allenhutchison","email":"allen@hutchison.org"}],"homepage":"https://github.com/allenhutchison/gemini-utils#readme","bugs":{"url":"https://github.com/allenhutchison/gemini-utils/issues"},"bin":{"gemini-utils":"dist/cli/main.js"},"dist":{"shasum":"e39214d17c49e859ecd12baf697e0fdbc73eb924","tarball":"https://registry.npmjs.org/@allenhutchison/gemini-utils/-/gemini-utils-0.4.2.tgz","fileCount":102,"integrity":"sha512-7vrf0yoX28FMq07+YKthgbKqUg5Jspn3ckvxHwjNnEEFS7YuYTR3eKL0dJXfzbUM/o6MRimy0NK2ns7/XetUJA==","signatures":[{"sig":"MEYCIQD0EwiA2awupGgYd+4wjjFsukZWL+u8osMpxRss9g1QDwIhAIvOuesm/UYOpfYWuQbgt4TpB6fxfmxjiWWW6w66P9tJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187587},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"fc65c649039fc7a9b83dbe70975a5e136fa374d4","scripts":{"lint":"eslint src","test":"NODE_OPTIONS='--experimental-vm-modules' jest","build":"tsc","lint:fix":"eslint src --fix","test:coverage":"NODE_OPTIONS='--experimental-vm-modules' jest --coverage","prepublishOnly":"npm run build","test:mime-types":"tsx scripts/test-mime-types.ts"},"_npmUser":{"name":"allenhutchison","email":"allen@hutchison.org"},"repository":{"url":"git+https://github.com/allenhutchison/gemini-utils.git","type":"git"},"_npmVersion":"11.6.4","description":"Shared utilities for Google Gemini AI projects - file upload, MIME validation, operation tracking, and deep research","directories":{},"_nodeVersion":"22.17.0","dependencies":{"ignore":"^7.0.5","commander":"^14.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","jest":"^29.7.0","eslint":"^9.17.0","globals":"^15.14.0","ts-jest":"^29.0.0","@eslint/js":"^9.17.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@google/genai":"^1.34.0","typescript-eslint":"^8.19.0"},"peerDependencies":{"@google/genai":">=1.29.0"},"_npmOperationalInternal":{"tmp":"tmp/gemini-utils_0.4.2_1767399749972_0.4783651037335803","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@allenhutchison/gemini-utils","version":"0.4.3","keywords":["gemini","google","ai","file-upload","rag","file-search","deep-research","research","interactions"],"author":{"name":"Allen Hutchison"},"license":"MIT","_id":"@allenhutchison/gemini-utils@0.4.3","maintainers":[{"name":"allenhutchison","email":"allen@hutchison.org"}],"homepage":"https://github.com/allenhutchison/gemini-utils#readme","bugs":{"url":"https://github.com/allenhutchison/gemini-utils/issues"},"bin":{"gemini-utils":"dist/cli/main.js"},"dist":{"shasum":"54cc72d4bcb92dfb80d851da2f17bdb42f4524cd","tarball":"https://registry.npmjs.org/@allenhutchison/gemini-utils/-/gemini-utils-0.4.3.tgz","fileCount":102,"integrity":"sha512-F8SVZ4HX1ZcyMAoBG+wEPT3dU/oSRWvpuh1D5VtiXVL3WDWL7Dd0StCaJ1COIKkpCONMZPFqAK4+2QURiW/o0A==","signatures":[{"sig":"MEUCICLXLcZvCbxRfap3PB00nXVfS7oT3hNGzGwd7vIdbsU1AiEA3AFwUeKPWP6SGtWfHketTufoRMdT+bGOXTKAe9gsvNY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187586},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"911f41140eb04740e636280918588a36e791fb5d","scripts":{"lint":"eslint src","test":"NODE_OPTIONS='--experimental-vm-modules' jest","build":"tsc","lint:fix":"eslint src --fix","test:coverage":"NODE_OPTIONS='--experimental-vm-modules' jest --coverage","prepublishOnly":"npm run build","test:mime-types":"tsx scripts/test-mime-types.ts"},"_npmUser":{"name":"allenhutchison","email":"allen@hutchison.org"},"repository":{"url":"git+https://github.com/allenhutchison/gemini-utils.git","type":"git"},"_npmVersion":"11.6.4","description":"Shared utilities for Google Gemini AI projects - file upload, MIME validation, operation tracking, and deep research","directories":{},"_nodeVersion":"22.17.0","dependencies":{"ignore":"^7.0.5","commander":"^14.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","jest":"^29.7.0","eslint":"^9.17.0","globals":"^15.14.0","ts-jest":"^29.0.0","@eslint/js":"^9.17.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@google/genai":"^1.34.0","typescript-eslint":"^8.19.0"},"peerDependencies":{"@google/genai":">=1.29.0"},"_npmOperationalInternal":{"tmp":"tmp/gemini-utils_0.4.3_1767549574774_0.6873523037182725","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@allenhutchison/gemini-utils","version":"0.5.0","keywords":["gemini","google","ai","file-upload","rag","file-search","deep-research","research","interactions"],"author":{"name":"Allen Hutchison"},"license":"MIT","_id":"@allenhutchison/gemini-utils@0.5.0","maintainers":[{"name":"allenhutchison","email":"allen@hutchison.org"}],"homepage":"https://github.com/allenhutchison/gemini-utils#readme","bugs":{"url":"https://github.com/allenhutchison/gemini-utils/issues"},"bin":{"gemini-utils":"dist/cli/main.js"},"dist":{"shasum":"f8b0cf3544302dd8a53d6ac7b436b3c97183466c","tarball":"https://registry.npmjs.org/@allenhutchison/gemini-utils/-/gemini-utils-0.5.0.tgz","fileCount":130,"integrity":"sha512-xhKXmuFeDTv/MNh+qsXeQidysdUEXg5f7+AVy7JmvVazx6Gyp8XS0/3rYArK7J8OcD9fbw2iqN5qVFh2WO/OCg==","signatures":[{"sig":"MEYCIQDz8ZJEzn4+fj1sE1sma0XrgK69rxUI8to/mxeC5VTkbAIhAOAfMjvBAKuvCqyOrBI9rdKlfEpX2BbWKQ7l8zJXZ0OR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":270260},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"6454f4c09ff60dd24a184f4c630de2390fdb1b9e","scripts":{"lint":"eslint src","test":"NODE_OPTIONS='--experimental-vm-modules' jest","build":"tsc","lint:fix":"eslint src --fix","typecheck":"tsc --noEmit","test:coverage":"NODE_OPTIONS='--experimental-vm-modules' jest --coverage","prepublishOnly":"npm run build","test:mime-types":"tsx scripts/test-mime-types.ts"},"_npmUser":{"name":"allenhutchison","email":"allen@hutchison.org"},"repository":{"url":"git+https://github.com/allenhutchison/gemini-utils.git","type":"git"},"_npmVersion":"11.6.4","description":"Shared utilities for Google Gemini AI projects - file upload, MIME validation, operation tracking, and deep research","directories":{},"_nodeVersion":"22.17.0","dependencies":{"ignore":"^7.0.5","commander":"^14.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","jest":"^30.2.0","eslint":"^9.17.0","globals":"^17.0.0","ts-jest":"^29.0.0","@eslint/js":"^9.17.0","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.0.9","@google/genai":"^1.34.0","typescript-eslint":"^8.19.0"},"peerDependencies":{"@google/genai":">=1.29.0"},"_npmOperationalInternal":{"tmp":"tmp/gemini-utils_0.5.0_1769305415931_0.42382385991553484","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@allenhutchison/gemini-utils","version":"0.6.0","keywords":["gemini","google","ai","file-upload","rag","file-search","deep-research","research","interactions"],"author":{"name":"Allen Hutchison"},"license":"MIT","_id":"@allenhutchison/gemini-utils@0.6.0","maintainers":[{"name":"allenhutchison","email":"allen@hutchison.org"}],"homepage":"https://github.com/allenhutchison/gemini-utils#readme","bugs":{"url":"https://github.com/allenhutchison/gemini-utils/issues"},"bin":{"gemini-utils":"dist/cli/main.js"},"dist":{"shasum":"405ed9f2c3a12c1a8d4acb72f16b07828a30dcf6","tarball":"https://registry.npmjs.org/@allenhutchison/gemini-utils/-/gemini-utils-0.6.0.tgz","fileCount":147,"integrity":"sha512-Fbllxagk9lfpOn7eF9e90CF0xsgNlopd0Cl/gve7NqT5m+iwuWhx7+YE6NkvZ3cE8HYxNaRRiu1ha35FTro9Tg==","signatures":[{"sig":"MEYCIQC4N64zoJ9pZkW/po4d2lg0J9GdwNDXZP7XbLjKFewilQIhAJ4HrWZcsP4h450FNaz+D90izA2vi2dttdkamN5vAI2w","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@allenhutchison%2fgemini-utils@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":346593},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"0652e7ce479e6dacc5593e7c7c9745beb45cba82","scripts":{"lint":"eslint src","test":"NODE_OPTIONS='--experimental-vm-modules' jest","build":"tsc","lint:fix":"eslint src --fix","typecheck":"tsc --noEmit","test:coverage":"NODE_OPTIONS='--experimental-vm-modules' jest --coverage","prepublishOnly":"npm run build","test:mime-types":"tsx scripts/test-mime-types.ts","test:probe-mime-types":"tsx scripts/probe-mime-types.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d578b99e-cdef-401d-8553-98b0abac7af9"}},"repository":{"url":"git+https://github.com/allenhutchison/gemini-utils.git","type":"git"},"_npmVersion":"11.11.0","description":"Shared utilities for Google Gemini AI projects - file upload, MIME validation, operation tracking, and deep research","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ignore":"^7.0.5","commander":"^14.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","jest":"^30.2.0","eslint":"^10.0.0","globals":"^17.0.0","ts-jest":"^29.0.0","@eslint/js":"^10.0.1","typescript":"^6.0.2","@types/jest":"^30.0.0","@types/node":"^25.0.9","@google/genai":"^1.34.0","typescript-eslint":"^8.19.0"},"peerDependencies":{"@google/genai":">=1.29.0"},"_npmOperationalInternal":{"tmp":"tmp/gemini-utils_0.6.0_1777830559276_0.9912653080908702","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@allenhutchison/gemini-utils","version":"1.0.0","keywords":["gemini","google","ai","file-upload","rag","file-search","deep-research","research","interactions"],"author":{"name":"Allen Hutchison"},"license":"MIT","_id":"@allenhutchison/gemini-utils@1.0.0","maintainers":[{"name":"allenhutchison","email":"allen@hutchison.org"}],"homepage":"https://github.com/allenhutchison/gemini-utils#readme","bugs":{"url":"https://github.com/allenhutchison/gemini-utils/issues"},"bin":{"gemini-utils":"dist/cli/main.js"},"dist":{"shasum":"651af90cabcf2b85cb84e39189913b85fceec0d5","tarball":"https://registry.npmjs.org/@allenhutchison/gemini-utils/-/gemini-utils-1.0.0.tgz","fileCount":147,"integrity":"sha512-Q6zCGpVg/uc0amP2GPcWmPJS/xqJ2Z1R1TU7D4sINFj11ShiLbvXLTIW9lkpvhQ6hiGRUHshNF8KsssQ+5Jg7w==","signatures":[{"sig":"MEYCIQCeNfesFtIZMdJrPT9OuYvMAu1BOgp+piz617AoL+VyrgIhAN18ys9C2YrFe9LZMwz7yhFEC9IsBQGwIcit1+AnVK56","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@allenhutchison%2fgemini-utils@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":347820},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"eaa1a0074ef7382a1da3d956c0ef9296310ec06a","scripts":{"lint":"eslint src","test":"NODE_OPTIONS='--experimental-vm-modules' jest","build":"tsc","lint:fix":"eslint src --fix","typecheck":"tsc --noEmit","test:coverage":"NODE_OPTIONS='--experimental-vm-modules' jest --coverage","prepublishOnly":"npm run build","test:mime-types":"tsx scripts/test-mime-types.ts","test:probe-mime-types":"tsx scripts/probe-mime-types.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d578b99e-cdef-401d-8553-98b0abac7af9"}},"repository":{"url":"git+https://github.com/allenhutchison/gemini-utils.git","type":"git"},"_npmVersion":"11.11.0","description":"Shared utilities for Google Gemini AI projects - file upload, MIME validation, operation tracking, and deep research","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ignore":"^7.0.5","commander":"^14.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","jest":"^30.2.0","eslint":"^10.0.0","globals":"^17.0.0","ts-jest":"^29.0.0","@eslint/js":"^10.0.1","typescript":"^6.0.2","@types/jest":"^30.0.0","@types/node":"^25.0.9","@google/genai":"^2.1.0","typescript-eslint":"^8.19.0"},"peerDependencies":{"@google/genai":">=2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gemini-utils_1.0.0_1778633802074_0.2638689528444824","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@allenhutchison/gemini-utils","version":"1.1.0","keywords":["gemini","google","ai","file-upload","rag","file-search","deep-research","research","interactions"],"author":{"name":"Allen Hutchison"},"license":"MIT","_id":"@allenhutchison/gemini-utils@1.1.0","maintainers":[{"name":"allenhutchison","email":"allen@hutchison.org"}],"homepage":"https://github.com/allenhutchison/gemini-utils#readme","bugs":{"url":"https://github.com/allenhutchison/gemini-utils/issues"},"bin":{"gemini-utils":"dist/cli/main.js"},"dist":{"shasum":"b470a0ffd2d5b7aa31595663132e85f8eb02f272","tarball":"https://registry.npmjs.org/@allenhutchison/gemini-utils/-/gemini-utils-1.1.0.tgz","fileCount":147,"integrity":"sha512-0mQdXXro0XXh7qsNlEBR2AoIYg5OJKbIowl2L4NDNqvGC+UBdmFXPBjgwNZ0MUYirTmG7efqErEQZXlNRAUY4Q==","signatures":[{"sig":"MEUCIDUZTfG4gLRsP3Kt7rYyZ5SPr6r7KLZUUyViqHycZQhMAiEA8AqClSb5LU8w2drlgKb+owQ9wmhWetw+eGo/mcAtMdI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@allenhutchison%2fgemini-utils@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":349009},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"1fd5acbed4915094f6814f5cc47359add988c332","scripts":{"lint":"eslint src","test":"NODE_OPTIONS='--experimental-vm-modules' jest","build":"tsc","lint:fix":"eslint src --fix","typecheck":"tsc --noEmit","test:coverage":"NODE_OPTIONS='--experimental-vm-modules' jest --coverage","prepublishOnly":"npm run build","test:mime-types":"tsx scripts/test-mime-types.ts","test:probe-mime-types":"tsx scripts/probe-mime-types.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d578b99e-cdef-401d-8553-98b0abac7af9"}},"repository":{"url":"git+https://github.com/allenhutchison/gemini-utils.git","type":"git"},"_npmVersion":"11.13.0","description":"Shared utilities for Google Gemini AI projects - file upload, MIME validation, operation tracking, and deep research","directories":{},"_nodeVersion":"24.17.0","dependencies":{"ignore":"^7.0.5","commander":"^15.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","jest":"^30.2.0","eslint":"^10.0.0","globals":"^17.0.0","ts-jest":"^29.0.0","@eslint/js":"^10.0.1","typescript":"^6.0.2","@types/jest":"^30.0.0","@types/node":"^26.0.0","@google/genai":"^2.1.0","typescript-eslint":"^8.19.0"},"peerDependencies":{"@google/genai":">=2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gemini-utils_1.1.0_1782499381989_0.29722953261065954","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@allenhutchison/gemini-utils","version":"1.2.0","description":"Shared utilities for Google Gemini AI projects - file upload, MIME validation, operation tracking, and deep research","main":"dist/index.js","types":"dist/index.d.ts","type":"module","sideEffects":false,"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./mime":{"types":"./dist/file-search/mimeTypes.d.ts","import":"./dist/file-search/mimeTypes.js"},"./file-search":{"types":"./dist/file-search/index.d.ts","import":"./dist/file-search/index.js"},"./research":{"types":"./dist/research/index.d.ts","import":"./dist/research/index.js"},"./audio-transcription":{"types":"./dist/audio-transcription/index.d.ts","import":"./dist/audio-transcription/index.js"},"./support-registry":{"types":"./dist/support-registry/index.d.ts","import":"./dist/support-registry/index.js"},"./package.json":"./package.json"},"scripts":{"build":"tsc","test":"NODE_OPTIONS='--experimental-vm-modules' jest","test:coverage":"NODE_OPTIONS='--experimental-vm-modules' jest --coverage","test:mime-types":"tsx scripts/test-mime-types.ts","test:probe-mime-types":"tsx scripts/probe-mime-types.ts","lint":"eslint src","lint:fix":"eslint src --fix","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"repository":{"type":"git","url":"git+https://github.com/allenhutchison/gemini-utils.git"},"keywords":["gemini","google","ai","file-upload","rag","file-search","deep-research","research","interactions"],"author":{"name":"Allen Hutchison"},"license":"MIT","bugs":{"url":"https://github.com/allenhutchison/gemini-utils/issues"},"homepage":"https://github.com/allenhutchison/gemini-utils#readme","peerDependencies":{"@google/genai":">=2.0.0"},"bin":{"gemini-utils":"dist/cli/main.js"},"dependencies":{"commander":"^15.0.0","ignore":"^7.0.5"},"devDependencies":{"@eslint/js":"^10.0.1","@google/genai":"^2.1.0","@types/jest":"^30.0.0","@types/node":"^26.0.0","eslint":"^10.0.0","globals":"^17.0.0","jest":"^30.2.0","ts-jest":"^29.0.0","tsx":"^4.0.0","typescript":"^6.0.2","typescript-eslint":"^8.19.0"},"engines":{"node":">=18.0.0"},"gitHead":"8bced0d73dcaf54edeea4bdb89ca5d8253630b83","_id":"@allenhutchison/gemini-utils@1.2.0","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-8fGIp0fUpQyUoSO6bOuXY/xSAuXxSaJ2f0V2niggyvBDYWciWuEuuGHEHTU0nWGYjF6EsfZ4iN94UgqSdfYMmA==","shasum":"c28713e3bdd33f30ee42618b27afe1ff41de50ba","tarball":"https://registry.npmjs.org/@allenhutchison/gemini-utils/-/gemini-utils-1.2.0.tgz","fileCount":151,"unpackedSize":354450,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@allenhutchison%2fgemini-utils@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIH2GfyX5BGyzmVrBx1MVj42LeLaytRg6VQpHBr3LEAOeAiEA1SlhrUy0wWvb0g9sdJ6UWz7zhFpTglbEd7utpmW3+Bc="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0a35b50f-5d4d-4475-b561-567c3a5aa2c5"}},"directories":{},"maintainers":[{"name":"allenhutchison","email":"allen@hutchison.org"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/gemini-utils_1.2.0_1783699118913_0.5891850348014551"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-27T01:27:26.869Z","modified":"2026-07-10T15:58:39.382Z","0.1.0":"2025-12-27T01:27:27.135Z","0.2.0":"2025-12-28T18:51:58.111Z","0.3.0":"2025-12-28T20:06:06.929Z","0.4.0":"2026-01-03T00:05:47.633Z","0.4.1":"2026-01-03T00:13:53.033Z","0.4.2":"2026-01-03T00:22:30.132Z","0.4.3":"2026-01-04T17:59:34.919Z","0.5.0":"2026-01-25T01:43:36.099Z","0.6.0":"2026-05-03T17:49:19.423Z","1.0.0":"2026-05-13T00:56:42.278Z","1.1.0":"2026-06-26T18:43:02.157Z","1.2.0":"2026-07-10T15:58:39.083Z"},"bugs":{"url":"https://github.com/allenhutchison/gemini-utils/issues"},"author":{"name":"Allen Hutchison"},"license":"MIT","homepage":"https://github.com/allenhutchison/gemini-utils#readme","keywords":["gemini","google","ai","file-upload","rag","file-search","deep-research","research","interactions"],"repository":{"type":"git","url":"git+https://github.com/allenhutchison/gemini-utils.git"},"description":"Shared utilities for Google Gemini AI projects - file upload, MIME validation, operation tracking, and deep research","maintainers":[{"name":"allenhutchison","email":"allen@hutchison.org"}],"readme":"# @allenhutchison/gemini-utils\n\nShared utilities for Google Gemini AI projects. Provides file upload, MIME validation, operation tracking for the Gemini File Search API, deep research capabilities, and audio transcription.\n\n## Installation\n\n```bash\nnpm install @allenhutchison/gemini-utils @google/genai\n```\n\n## Features\n\n- **File Upload**: Upload files and directories to Gemini File Search stores\n- **Smart Sync**: Skip unchanged files using SHA-256 hash comparison\n- **MIME Validation**: Comprehensive MIME type detection with fallback support\n- **Progress Tracking**: Real-time progress callbacks for upload operations\n- **Operation Management**: Track long-running upload operations with customizable storage\n- **Deep Research**: Run long-running research tasks with Gemini's deep research models\n- **Report Generation**: Convert research outputs to formatted Markdown with citations\n- **Audio Transcription**: Transcribe audio files with timestamps, speaker diarization, and multiple output formats (text, SRT, VTT, JSON)\n- **CLI**: Full-featured command-line interface for all operations\n\n## CLI\n\nRun commands directly with npx:\n\n```bash\nnpx @allenhutchison/gemini-utils [command] [options]\n```\n\n### Global Options\n\n```\n-j, --json         Output in JSON format\n-q, --quiet        Suppress non-essential output\n--api-key <key>    API key (overrides GEMINI_API_KEY env var)\n-v, --version      Show version number\n-h, --help         Show help\n```\n\n### Configuration\n\nThe CLI looks for an API key in this order:\n1. `--api-key` command line option\n2. `GEMINI_API_KEY` environment variable\n3. Config file at `~/.config/gemini-utils/config.json`:\n   ```json\n   { \"apiKey\": \"your-api-key\" }\n   ```\n4. Env file at `~/.config/gemini-utils/.env`:\n   ```\n   GEMINI_API_KEY=your-api-key\n   ```\n\n### Commands\n\n#### Stores\n\n```bash\n# List all stores\nnpx @allenhutchison/gemini-utils stores list\n\n# Create a new store\nnpx @allenhutchison/gemini-utils stores create \"My Documents\"\n\n# Get store details\nnpx @allenhutchison/gemini-utils stores get stores/abc123\n\n# Delete a store\nnpx @allenhutchison/gemini-utils stores delete stores/abc123\nnpx @allenhutchison/gemini-utils stores delete stores/abc123 --force\n```\n\n#### Upload\n\n```bash\n# Upload a single file\nnpx @allenhutchison/gemini-utils upload file ./document.pdf stores/abc123\n\n# Upload a directory\nnpx @allenhutchison/gemini-utils upload directory ./docs stores/abc123\n\n# Upload with smart sync (skip unchanged files)\nnpx @allenhutchison/gemini-utils upload directory ./docs stores/abc123 --smart-sync\n\n# Control concurrency\nnpx @allenhutchison/gemini-utils upload directory ./docs stores/abc123 -c 10\n```\n\n#### Documents\n\n```bash\n# List documents in a store\nnpx @allenhutchison/gemini-utils documents list stores/abc123\n\n# Get document details\nnpx @allenhutchison/gemini-utils documents get stores/abc123/documents/xyz789\n\n# Delete a document\nnpx @allenhutchison/gemini-utils documents delete stores/abc123/documents/xyz789\n```\n\n#### Research\n\nThe CLI uses Google's [Deep Research agents](https://ai.google.dev/gemini-api/docs/deep-research)\n(`deep-research-preview-04-2026` by default; `--max` switches to\n`deep-research-max-preview-04-2026` for maximum-quality, longer-running synthesis).\n\n```bash\n# Start research and get ID\nnpx @allenhutchison/gemini-utils research start \"What is quantum computing?\"\n\n# Start and wait for completion\nnpx @allenhutchison/gemini-utils research start \"What is quantum computing?\" --wait\n\n# Use Deep Research Max for the highest-quality, longest-running synthesis\nnpx @allenhutchison/gemini-utils research start \"Competitive landscape of vector DBs\" --max --wait --output report.md\n\n# Start, wait, and save report to file\nnpx @allenhutchison/gemini-utils research start \"What is quantum computing?\" --wait --output report.md\n\n# Use file search stores for grounding\nnpx @allenhutchison/gemini-utils research start \"Summarize the documents\" --stores stores/abc123,stores/def456 --wait\n\n# Enable web tools explicitly (Google Search, URL fetching, code execution for charts)\nnpx @allenhutchison/gemini-utils research start \"Trends in renewable energy\" \\\n  --google-search --url-context --code-execution --wait --output report.md\n\n# Connect a remote MCP server for custom data\nnpx @allenhutchison/gemini-utils research start \"Latest filings for ACME\" \\\n  --mcp \"name=finance,url=https://mcp.example.com,header.Authorization=Bearer XYZ\" --wait\n\n# Check status\nnpx @allenhutchison/gemini-utils research status interactions/abc123\n\n# Poll until complete\nnpx @allenhutchison/gemini-utils research poll interactions/abc123 --output report.md\n\n# Cancel or delete\nnpx @allenhutchison/gemini-utils research cancel interactions/abc123\nnpx @allenhutchison/gemini-utils research delete interactions/abc123\n```\n\n#### Query\n\n```bash\n# Query a store\nnpx @allenhutchison/gemini-utils query stores/abc123 \"What does the documentation say about authentication?\"\n\n# Use a specific model\nnpx @allenhutchison/gemini-utils query stores/abc123 \"Summarize the main points\" --model gemini-2.0-flash\n```\n\n#### Transcribe\n\n```bash\n# Basic transcription\nnpx @allenhutchison/gemini-utils transcribe file recording.mp3\n\n# Save transcript to file\nnpx @allenhutchison/gemini-utils transcribe file recording.mp3 -o transcript.txt\n\n# Transcribe with timestamps\nnpx @allenhutchison/gemini-utils transcribe file recording.mp3 -t -o transcript.txt\n\n# Generate SRT subtitles (SRT output works for both audio transcripts and video subtitles)\nnpx @allenhutchison/gemini-utils transcribe file audio.mp3 -t -f srt -o subtitles.srt\n\n# Generate WebVTT subtitles\nnpx @allenhutchison/gemini-utils transcribe file audio.mp3 -t -f vtt -o subtitles.vtt\n\n# Enable speaker diarization (identifies different speakers)\nnpx @allenhutchison/gemini-utils transcribe file meeting.wav -d -t -o meeting.txt\n\n# Specify language hint\nnpx @allenhutchison/gemini-utils transcribe file spanish-audio.mp3 -l es -o transcript.txt\n\n# Use a different model\nnpx @allenhutchison/gemini-utils transcribe file recording.mp3 -m gemini-3-pro-preview\n\n# Upload transcript to a file search store\nnpx @allenhutchison/gemini-utils transcribe file recording.mp3 -s stores/abc123\n\n# Output formats: text (default), timestamped, srt, vtt, json\nnpx @allenhutchison/gemini-utils transcribe file recording.mp3 -t -f json -o transcript.json\n\n# Manage large audio files (> 20MB)\nnpx @allenhutchison/gemini-utils transcribe upload large-audio.mp3\nnpx @allenhutchison/gemini-utils transcribe list\nnpx @allenhutchison/gemini-utils transcribe delete files/abc123\n```\n\n### JSON Output\n\nUse `--json` for machine-readable output:\n\n```bash\nnpx @allenhutchison/gemini-utils stores list --json | jq '.[] | .name'\n```\n\n## Usage\n\n### Import surface & browser/mobile safety\n\nThe package is marked `\"sideEffects\": false` and exposes granular subpath exports in\naddition to the top-level barrel:\n\n| Entry | Contents | Node built-ins |\n| --- | --- | --- |\n| `@allenhutchison/gemini-utils` | everything (barrel) | pulls in `fs`/`path`/`crypto`/`url` transitively |\n| `@allenhutchison/gemini-utils/mime` | MIME/extension helpers + maps (`getMimeTypeWithFallback`, `EXTENSION_TO_MIME`, …) | **none** |\n| `@allenhutchison/gemini-utils/support-registry` | extension/support registry + comprehensive map | **none** |\n| `@allenhutchison/gemini-utils/file-search` | file upload / search managers | `fs`, `path`, `crypto` |\n| `@allenhutchison/gemini-utils/research` | deep-research managers | (via `@google/genai`) |\n| `@allenhutchison/gemini-utils/audio-transcription` | transcription managers + audio MIME helpers | `fs`, `path`, `url` |\n\nConsumers that must stay free of Node built-ins at load time (browser or mobile bundles,\ne.g. Obsidian plugins) should import MIME/extension helpers from the built-in-free\n`/mime` or `/support-registry` subpaths rather than the barrel, and lazy-load the\nfile-search / research / audio-transcription managers only when a desktop feature runs:\n\n```typescript\n// Safe anywhere — no Node built-ins are evaluated:\nimport { getMimeTypeWithFallback, EXTENSION_TO_MIME } from '@allenhutchison/gemini-utils/mime';\n\n// Desktop-only; defer so the fs/path/crypto requires never run at load:\nconst { FileUploader } = await import('@allenhutchison/gemini-utils/file-search');\n```\n\n### Basic File Upload\n\n```typescript\nimport { GoogleGenAI } from '@google/genai';\nimport { FileUploader, FileSearchManager } from '@allenhutchison/gemini-utils';\n\nconst client = new GoogleGenAI({ apiKey: 'your-api-key' });\n\n// Create a file search store\nconst manager = new FileSearchManager(client);\nconst store = await manager.createStore('My Documents');\n\n// Upload a directory\nconst uploader = new FileUploader(client);\nawait uploader.uploadDirectory('./docs', store.name, {\n  smartSync: true,\n  onProgress: (event) => {\n    console.log(`${event.type}: ${event.currentFile} (${event.percentage}%)`);\n  },\n});\n```\n\n### MIME Type Validation\n\n```typescript\nimport {\n  getMimeTypeWithFallback,\n  isExtensionSupportedWithFallback\n} from '@allenhutchison/gemini-utils';\n\n// Check if a file type is supported\nif (isExtensionSupportedWithFallback('.ts')) {\n  const result = getMimeTypeWithFallback('app.ts');\n  console.log(result); // { mimeType: 'text/plain', isFallback: true }\n}\n```\n\n### Operation Tracking\n\n```typescript\nimport { UploadOperationManager } from '@allenhutchison/gemini-utils';\n\nconst manager = new UploadOperationManager();\n\n// Create an operation\nconst op = manager.createOperation('/path/to/files', 'storeName', true);\n\n// Update progress\nmanager.updateProgress(op.id, 5, 2, 0);\n\n// Mark complete\nmanager.markCompleted(op.id);\n```\n\n### Custom Storage for Operations\n\n```typescript\nimport { UploadOperationManager, OperationStorage, UploadOperation } from '@allenhutchison/gemini-utils';\n\n// Implement your own storage\nclass MyStorage implements OperationStorage {\n  private db: Map<string, UploadOperation> = new Map();\n\n  get(id: string) { return this.db.get(id); }\n  set(id: string, op: UploadOperation) { this.db.set(id, op); }\n  getAll() { return Object.fromEntries(this.db); }\n}\n\nconst manager = new UploadOperationManager(new MyStorage());\n```\n\n### Deep Research\n\n```typescript\nimport { GoogleGenAI } from '@google/genai';\nimport {\n  DEEP_RESEARCH_MAX_MODEL,\n  ReportGenerator,\n  ResearchManager,\n} from '@allenhutchison/gemini-utils';\n\nconst client = new GoogleGenAI({ apiKey: 'your-api-key' });\nconst researcher = new ResearchManager(client);\n\n// Start a research task — defaults to deep-research-preview-04-2026\nconst interaction = await researcher.startResearch({\n  input: 'What are the latest developments in quantum computing?',\n  // Optional: ground with file search stores\n  fileSearchStoreNames: ['stores/my-documents'],\n  // Enable any combination of the agent's built-in tools\n  googleSearch: true,\n  urlContext: true,\n  codeExecution: true,\n  // Connect remote MCP servers exposing custom data\n  mcpServers: [\n    {\n      name: 'finance',\n      url: 'https://mcp.example.com/finance',\n      headers: { Authorization: 'Bearer token' },\n      allowedTools: ['lookup_ticker', 'get_filings'],\n    },\n  ],\n});\n\n// Use Deep Research Max for the highest-quality, longest-running synthesis\nconst deep = await researcher.startResearch({\n  input: 'Comprehensive competitive analysis of vector databases',\n  model: DEEP_RESEARCH_MAX_MODEL,\n});\n\n// Poll until complete\nconst completed = await researcher.poll(interaction.id);\n\n// Generate a markdown report with citations\nconst generator = new ReportGenerator();\nconst report = generator.generateMarkdown(completed.outputs ?? []);\nconsole.log(report);\n```\n\n### Research with Custom Polling\n\n```typescript\nimport { ResearchManager, isTerminalStatus } from '@allenhutchison/gemini-utils';\n\nconst researcher = new ResearchManager(client);\n\nconst interaction = await researcher.startResearch({\n  input: 'Analyze the impact of AI on healthcare',\n});\n\n// Custom polling with status updates\nlet status = await researcher.getStatus(interaction.id);\nwhile (!isTerminalStatus(status.status ?? '')) {\n  console.log(`Status: ${status.status}`);\n  await new Promise(r => setTimeout(r, 10000));\n  status = await researcher.getStatus(interaction.id);\n}\n\nif (status.status === 'completed') {\n  console.log('Research complete!');\n} else if (status.status === 'failed') {\n  console.log('Research failed');\n}\n```\n\n### Audio Transcription\n\n```typescript\nimport { GoogleGenAI } from '@google/genai';\nimport { TranscriptionManager, TranscriptFormatter } from '@allenhutchison/gemini-utils';\n\nconst client = new GoogleGenAI({ apiKey: 'your-api-key' });\nconst transcriber = new TranscriptionManager(client);\n\n// Basic transcription\nconst result = await transcriber.transcribe({\n  audioSource: './recording.mp3',\n});\nconsole.log(result.text);\n\n// Transcription with timestamps and speaker diarization\nconst detailed = await transcriber.transcribe({\n  audioSource: './meeting.wav',\n  timestamps: true,\n  diarization: true,\n  language: 'en',\n  model: 'gemini-3-flash-preview',\n});\n\n// Access timestamped segments\nfor (const segment of detailed.segments ?? []) {\n  console.log(`[${segment.startTime}s] ${segment.speaker}: ${segment.text}`);\n}\n\n// Format output in different formats\nconst formatter = new TranscriptFormatter();\nconst srt = formatter.toSRT(detailed);      // SRT subtitles\nconst vtt = formatter.toVTT(detailed);      // WebVTT subtitles\nconst json = formatter.toJSON(detailed);    // Structured JSON\n```\n\n### Large Audio File Upload\n\n```typescript\nimport { GoogleGenAI } from '@google/genai';\nimport { TranscriptionManager } from '@allenhutchison/gemini-utils';\n\nconst client = new GoogleGenAI({ apiKey: 'your-api-key' });\nconst transcriber = new TranscriptionManager(client);\n\n// Upload large files (> 20MB) to Gemini File API first\nconst metadata = await transcriber.uploadAudioFile('./large-audio.mp3');\nconsole.log(`Uploaded: ${metadata.uri}`);\n\n// Then transcribe using the URI\nconst result = await transcriber.transcribe({\n  audioSource: metadata.uri,\n  timestamps: true,\n});\n\n// List and manage uploaded audio files\nconst files = await transcriber.listAudioFiles();\nawait transcriber.deleteAudioFile(files[0].name);\n```\n\n## API Reference\n\n### FileSearchManager\n\nManages file search stores in Google's Gemini API.\n\n- `createStore(displayName)` - Create a new store\n- `listStores()` - List all stores\n- `getStore(name)` - Get a store by name\n- `deleteStore(name, force?)` - Delete a store\n- `queryStore(storeName, query, model?)` - Query a store\n- `listDocuments(storeName)` - List documents in a store\n- `deleteDocument(documentName)` - Delete a document\n\n### FileUploader\n\nHandles file uploads to Gemini File Search stores.\n\n- `uploadFile(filePath, storeName, config?)` - Upload a single file\n- `uploadDirectory(dirPath, storeName, config?)` - Upload a directory\n- `getExistingFileHashes(storeName)` - Get hashes for smart sync\n- `getFileHash(filePath)` - Compute SHA-256 hash of a file\n\n### MIME Utilities\n\n- `getMimeType(filePath)` - Get validated MIME type\n- `getMimeTypeWithFallback(filePath)` - Get MIME type with text/plain fallback\n- `isExtensionSupported(ext)` - Check if extension is supported\n- `isExtensionSupportedWithFallback(ext)` - Check including fallback extensions\n- `getSupportedExtensions()` - List all supported extensions\n- `getFallbackExtensions()` - List fallback extensions\n\n### ResearchManager\n\nManages deep research interactions with the Gemini API.\n\n- `startResearch(params)` - Start a new research interaction\n- `getStatus(id)` - Get current status and outputs of an interaction\n- `poll(id, intervalMs?)` - Poll until research completes (default: 5s interval)\n- `cancel(id)` - Cancel a running research interaction\n- `delete(id)` - Delete a research interaction\n\n### ReportGenerator\n\nConverts research outputs to formatted documents.\n\n- `generateMarkdown(outputs)` - Generate markdown report with citations\n\n### TranscriptionManager\n\nManages audio transcription interactions with the Gemini API.\n\n- `transcribe(params, onProgress?)` - Transcribe an audio file\n- `uploadAudioFile(filePath)` - Upload large audio files to Gemini File API\n- `listAudioFiles()` - List uploaded audio files\n- `deleteAudioFile(name)` - Delete an uploaded audio file\n- `getStatus(id)` - Get transcription interaction status\n- `poll(id, intervalMs?)` - Poll until transcription completes (default: 2s interval)\n\n### TranscriptFormatter\n\nConverts transcription results to various output formats.\n\n- `format(result, format)` - Format result to specified format\n- `toPlainText(result)` - Plain text output\n- `toTimestampedText(result)` - Text with timestamps `[00:00:05] Hello...`\n- `toSRT(result)` - SRT subtitle format\n- `toVTT(result)` - WebVTT subtitle format\n- `toJSON(result)` - Structured JSON output\n\n### Transcription Types\n\n- `TranscribeParams` - Configuration for transcription (audioSource, language, model, timestamps, diarization)\n- `TranscriptionResult` - Result with text, segments, duration, and metadata\n- `TranscriptSegment` - Timestamped segment with startTime, endTime, text, speaker\n- `TranscriptFormat` - Output formats: `text`, `timestamped`, `srt`, `vtt`, `json`\n- `AudioFormat` - Supported formats: `mp3`, `wav`, `flac`, `aac`, `ogg`, `m4a`, `webm`\n\n### Research Types\n\n- `StartResearchParams` - Configuration for starting research (model, fileSearchStoreNames, googleSearch, urlContext, codeExecution, mcpServers, background)\n- `McpServerConfig` - Remote MCP server configuration (name, url, headers, allowedTools)\n- `DEEP_RESEARCH_MODEL` - Default model: `deep-research-preview-04-2026`\n- `DEEP_RESEARCH_MAX_MODEL` - Max-quality model: `deep-research-max-preview-04-2026`\n- `Interaction` - Research interaction object\n- `InteractionStatus` - Status types: `in_progress`, `requires_action`, `completed`, `failed`, `cancelled`\n- `isTerminalStatus(status)` - Check if status indicates completion\n- `TERMINAL_STATUSES` - Array of terminal status values\n\n### Error Classes\n\n- `UnsupportedFileTypeError` - Thrown for unsupported file types\n- `FileSizeExceededError` - Thrown when file exceeds 100MB limit\n- `FileUploadError` - Wrapper for upload failures\n- `UnsupportedAudioTypeError` - Thrown for unsupported audio file types\n- `AudioFileSizeExceededError` - Thrown when audio file exceeds 2GB limit\n\n## Supported File Types\n\nThe library supports 36 validated MIME types plus 100+ text file extensions via fallback:\n\n**Validated types**: PDF, XML, HTML, Markdown, C, Java, Python, Go, Kotlin, Perl, Lua, Erlang, TCL, BibTeX, diff\n\n**Fallback (as text/plain)**: JavaScript, TypeScript, JSON, CSS, SCSS, YAML, TOML, Shell scripts, Ruby, PHP, Rust, Swift, Scala, and many more.\n\n## Supported Audio Formats\n\nFor audio transcription, the following formats are supported:\n\n- **MP3** (`audio/mpeg`)\n- **WAV** (`audio/wav`)\n- **FLAC** (`audio/flac`)\n- **AAC** (`audio/aac`)\n- **OGG** (`audio/ogg`)\n- **M4A** (`audio/mp4`)\n- **WebM** (`audio/webm`)\n\n**File size limits:**\n- Files ≤ 100MB: Uploaded inline (base64)\n- Files > 100MB or when the total inline request payload exceeds ~20MB: Uploaded via Gemini File API (max 2GB)\n\nNote: The 20MB limit applies to the total inline request payload (including text, system instructions, and all inline content), not individual files. Prefer using the Files API whenever your total inline request size might approach this limit.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}