{"id":"@lssm-tech/integration.provider-storage","slug":"integration.provider-storage","name":"@lssm-tech/integration.provider-storage","version":"2.1.4","path":"packages/integrations/provider-storage","manifestPath":"packages/integrations/provider-storage/package.json","manifestBlobSha":"f77254b0e691b09fed0dac680b3b7429d3524a6e","layer":"integrations","physicalArea":null,"primaryArea":"integrations-and-providers","classification":{"privateDeclared":null,"catalogFamily":"integrations","catalogKind":"integration","catalogStatus":"active","adoptionMode":"adoptable","stability":"experimental"},"description":"Object storage provider implementations for ContractSpec.","descriptionOrigin":"package.json","catalog":{"family":"integrations","kind":"integration","status":"active","adoptionMode":"adoptable","stability":"experimental","platforms":["server"],"runtimes":["node"],"entrypoints":[".","./impls","./impls/gcs-storage","./storage","./impls/s3-object-reader","./impls/s3-object-writer","./impls/s3-write-verify","./impls/supabase-storage-s3"],"documentation":[{"title":"Integration Provider Storage documentation","url":"https://www.npmjs.com/package/%40lssm-tech%2Fintegration.provider-storage","kind":"readme"}],"examples":[],"replacements":[],"capabilities":[{"id":"package.lssm.tech.integration.provider.storage","title":"Integration Provider Storage","description":"Object storage provider implementations for ContractSpec.","status":"active","useCases":["Adopt object storage provider implementations for contractspec"],"aliases":["integration","provider","storage"],"pythonEquivalents":[],"canonicalImports":[{"from":"@lssm-tech/integration.provider-storage","symbols":[]},{"from":"@lssm-tech/integration.provider-storage/impls","symbols":[]},{"from":"@lssm-tech/integration.provider-storage/impls/gcs-storage","symbols":[]},{"from":"@lssm-tech/integration.provider-storage/storage","symbols":[]},{"from":"@lssm-tech/integration.provider-storage/impls/s3-object-reader","symbols":["S3ObjectReader"]},{"from":"@lssm-tech/integration.provider-storage/impls/supabase-storage-s3","symbols":["supabaseStorageS3ClientConfig","supabaseStorageS3Endpoint","isSupabaseStorageS3Endpoint"]}],"constraints":{"platforms":["server"],"runtimes":["node"],"avoidWhen":["The @lssm-tech/integration.provider-storage package constraints do not match the target runtime or platform."],"requires":["TypeScript"]},"alternatives":[],"relationships":[],"resolutionPriority":50}]},"canonicalImports":[{"capabilityId":"package.lssm.tech.integration.provider.storage","from":"@lssm-tech/integration.provider-storage","symbols":[]},{"capabilityId":"package.lssm.tech.integration.provider.storage","from":"@lssm-tech/integration.provider-storage/impls","symbols":[]},{"capabilityId":"package.lssm.tech.integration.provider.storage","from":"@lssm-tech/integration.provider-storage/impls/gcs-storage","symbols":[]},{"capabilityId":"package.lssm.tech.integration.provider.storage","from":"@lssm-tech/integration.provider-storage/storage","symbols":[]},{"capabilityId":"package.lssm.tech.integration.provider.storage","from":"@lssm-tech/integration.provider-storage/impls/s3-object-reader","symbols":["S3ObjectReader"]},{"capabilityId":"package.lssm.tech.integration.provider.storage","from":"@lssm-tech/integration.provider-storage/impls/supabase-storage-s3","symbols":["supabaseStorageS3ClientConfig","supabaseStorageS3Endpoint","isSupabaseStorageS3Endpoint"]}],"scripts":{"build":"contractspec-bun-build build","build:bundle":"contractspec-bun-build transpile","build:types":"contractspec-bun-build types","dev":"contractspec-bun-build dev","clean":"rimraf dist .turbo","lint:check":"node ../../../scripts/biome.cjs check .","lint:fix":"node ../../../scripts/biome.cjs check --write --unsafe --only=nursery/useSortedClasses . && node ../../../scripts/biome.cjs check --write .","test":"bun test","prebuild":"contractspec-bun-build prebuild","typecheck":"tsgo --noEmit"},"scriptStatus":"complete pinned manifest","dependencies":{"@lssm-tech/integration.runtime":"workspace:^","@lssm-tech/lib.contracts-integrations":"workspace:^","@aws-sdk/client-s3":"^3.1135.0","@google-cloud/storage":"^8.2.0"},"devDependencies":{"@lssm-tech/tool.bun":"workspace:*","@lssm-tech/tool.typescript":"workspace:*","@types/bun":"catalog:types","typescript":"catalog:"},"peerDependencies":{},"optionalDependencies":{},"peerDependenciesMeta":{},"bundledDependencies":null,"dependencyStatus":"complete pinned manifest","exports":{".":"./src/index.ts","./impls":"./src/impls/index.ts","./impls/gcs-storage":"./src/impls/gcs-storage.ts","./impls/s3-object-reader":"./src/impls/s3-object-reader.ts","./impls/s3-object-writer":"./src/impls/s3-object-writer.ts","./impls/s3-write-verify":"./src/impls/s3-write-verify.ts","./impls/supabase-storage-s3":"./src/impls/supabase-storage-s3.ts","./storage":"./src/storage.ts"},"publishExports":{".":{"types":"./dist/index.d.ts","bun":"./dist/index.js","node":"./dist/node/index.js","default":"./dist/index.js"},"./impls":{"types":"./dist/impls/index.d.ts","bun":"./dist/impls/index.js","node":"./dist/node/impls/index.js","default":"./dist/impls/index.js"},"./impls/gcs-storage":{"types":"./dist/impls/gcs-storage.d.ts","bun":"./dist/impls/gcs-storage.js","node":"./dist/node/impls/gcs-storage.js","default":"./dist/impls/gcs-storage.js"},"./impls/s3-object-reader":{"types":"./dist/impls/s3-object-reader.d.ts","bun":"./dist/impls/s3-object-reader.js","node":"./dist/node/impls/s3-object-reader.js","default":"./dist/impls/s3-object-reader.js"},"./impls/s3-object-writer":{"types":"./dist/impls/s3-object-writer.d.ts","bun":"./dist/impls/s3-object-writer.js","node":"./dist/node/impls/s3-object-writer.js","default":"./dist/impls/s3-object-writer.js"},"./impls/s3-write-verify":{"types":"./dist/impls/s3-write-verify.d.ts","bun":"./dist/impls/s3-write-verify.js","node":"./dist/node/impls/s3-write-verify.js","default":"./dist/impls/s3-write-verify.js"},"./impls/supabase-storage-s3":{"types":"./dist/impls/supabase-storage-s3.d.ts","bun":"./dist/impls/supabase-storage-s3.js","node":"./dist/node/impls/supabase-storage-s3.js","default":"./dist/impls/supabase-storage-s3.js"},"./storage":{"types":"./dist/storage.d.ts","bun":"./dist/storage.js","node":"./dist/node/storage.js","default":"./dist/storage.js"}},"types":"./dist/index.d.ts","files":["dist","README.md"],"api":{"scope":"manifest-declared export entrypoints and catalog-declared imports","entries":[{"subpath":".","importPath":"@lssm-tech/integration.provider-storage","target":"./src/index.ts","targets":[{"conditions":[],"target":"./src/index.ts","sourcePath":"packages/integrations/provider-storage/src/index.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/provider-storage/src/index.ts","sourceStatus":"verified source file"}]},{"subpath":"./impls","importPath":"@lssm-tech/integration.provider-storage/impls","target":"./src/impls/index.ts","targets":[{"conditions":[],"target":"./src/impls/index.ts","sourcePath":"packages/integrations/provider-storage/src/impls/index.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/provider-storage/src/impls/index.ts","sourceStatus":"verified source file"}]},{"subpath":"./impls/gcs-storage","importPath":"@lssm-tech/integration.provider-storage/impls/gcs-storage","target":"./src/impls/gcs-storage.ts","targets":[{"conditions":[],"target":"./src/impls/gcs-storage.ts","sourcePath":"packages/integrations/provider-storage/src/impls/gcs-storage.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/provider-storage/src/impls/gcs-storage.ts","sourceStatus":"verified source file"}]},{"subpath":"./impls/s3-object-reader","importPath":"@lssm-tech/integration.provider-storage/impls/s3-object-reader","target":"./src/impls/s3-object-reader.ts","targets":[{"conditions":[],"target":"./src/impls/s3-object-reader.ts","sourcePath":"packages/integrations/provider-storage/src/impls/s3-object-reader.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/provider-storage/src/impls/s3-object-reader.ts","sourceStatus":"verified source file"}]},{"subpath":"./impls/s3-object-writer","importPath":"@lssm-tech/integration.provider-storage/impls/s3-object-writer","target":"./src/impls/s3-object-writer.ts","targets":[{"conditions":[],"target":"./src/impls/s3-object-writer.ts","sourcePath":"packages/integrations/provider-storage/src/impls/s3-object-writer.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/provider-storage/src/impls/s3-object-writer.ts","sourceStatus":"verified source file"}]},{"subpath":"./impls/s3-write-verify","importPath":"@lssm-tech/integration.provider-storage/impls/s3-write-verify","target":"./src/impls/s3-write-verify.ts","targets":[{"conditions":[],"target":"./src/impls/s3-write-verify.ts","sourcePath":"packages/integrations/provider-storage/src/impls/s3-write-verify.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/provider-storage/src/impls/s3-write-verify.ts","sourceStatus":"verified source file"}]},{"subpath":"./impls/supabase-storage-s3","importPath":"@lssm-tech/integration.provider-storage/impls/supabase-storage-s3","target":"./src/impls/supabase-storage-s3.ts","targets":[{"conditions":[],"target":"./src/impls/supabase-storage-s3.ts","sourcePath":"packages/integrations/provider-storage/src/impls/supabase-storage-s3.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/provider-storage/src/impls/supabase-storage-s3.ts","sourceStatus":"verified source file"}]},{"subpath":"./storage","importPath":"@lssm-tech/integration.provider-storage/storage","target":"./src/storage.ts","targets":[{"conditions":[],"target":"./src/storage.ts","sourcePath":"packages/integrations/provider-storage/src/storage.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/provider-storage/src/storage.ts","sourceStatus":"verified source file"}]}],"entryCount":8,"namedSymbolCoverage":"catalog declarations only; exhaustive TypeScript symbols not extracted","installationStatus":"not verified"},"docsLinks":[{"title":"Integration Provider Storage documentation","url":"https://www.npmjs.com/package/%40lssm-tech%2Fintegration.provider-storage","kind":"readme","pinnedUrl":null,"sourceStatus":"declared link; destination not verified"}],"sourceUrls":{"package":"https://github.com/lssm-tech/contractspec/tree/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/provider-storage","manifest":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/provider-storage/package.json","readme":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/provider-storage/README.md","guide":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/apps/web-landing/public/llms-packages/integration.provider-storage.txt"},"readme":{"status":"available","body":"# @lssm-tech/integration.provider-storage\n\nWebsite: https://contractspec.io\n\nObject storage provider implementations for ContractSpec.\n\n## Usage\n\nImport the root entrypoint for the domain surface, or import a concrete implementation from the `./impls/*` subpaths.\n\n## Compatibility\n\nThis package owns the storage implementation slice split out of `@lssm-tech/integration.providers-impls`. The legacy package continues to re-export these subpaths for existing consumers.\n\n## Approved S3 reads\n\n`S3ObjectReader` from `@lssm-tech/integration.provider-storage/impls/s3-object-reader`\nimplements the narrow `ObjectStorageReadProvider` capability. It accepts an existing\nAWS SDK S3 client with host-resolved scoped credentials; it creates no client and\nreads no environment variables. Configure exact bucket/key approvals with a byte\nlimit and expected SHA-256, optionally an S3 version ID. No write, delete, listing\nor signed-URL methods are exposed. Keep IAM grants restricted to the same objects.\n\n```ts\nconst reader = new S3ObjectReader(client, [{\n  bucket: 'private-knowledge', key: 'approved/source.txt',\n  maxBytes: 1048576, expectedSha256: approvedSourceDigest,\n}], 10000);\nconst object = await reader.getObject({\n  bucket: 'private-knowledge', key: 'approved/source.txt', signal,\n});\n```\n\nThe reader forwards cancellation to the SDK, bounds response/body waits, and\nrequests stream teardown when interrupted. Only fully buffered, digest-verified\nbytes are returned. Missing keys return null; permission and provider failures\nremain redacted errors. Cancellation does not independently prove remote IO\nstopped. This server-only reader is not a full S3 lifecycle provider.\n\nTransport behavior follows the [AWS SDK v3 S3 examples](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/javascript_s3_code_examples.html)\nand [SDK AbortController support](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/introduction/).\n\nQualification: the initial reader completed an actual Railway S3 read of the\napproved 176-byte synthetic pilot object with its exact SHA-256. Unapproved-key\nand pre-aborted requests made no provider calls. This is scoped read evidence;\nfull S3 lifecycle, live interrupted-network cleanup and broader cloud qualification\nremain separate acceptance requirements.\n\n## Supabase Storage (S3 protocol)\n\n`supabaseStorageS3ClientConfig({ endpoint, region, accessKeyId, secretAccessKey })`\nfrom `@lssm-tech/integration.provider-storage/impls/supabase-storage-s3` returns an\nAWS SDK client configuration for `https://<ref>.storage.supabase.co/storage/v1/s3`:\npath-style addressing, no SDK retries, and checksums only when an operation\nrequires them. Supabase's PutObject ignores `If-None-Match` and checksum headers,\nso pair it with `new S3ObjectWriter(client, { ..., conditionalWrite: 'head-verify' })`:\nthe writer heads the (content-addressed) key, writes only when it is absent and\nverifies the stored object afterwards (SHA-256 metadata, or size plus MD5 ETag),\nrefusing any conflicting object. Keep the bucket private.\n","sourcePath":"packages/integrations/provider-storage/README.md","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/provider-storage/README.md","blobSha":"ff65cb9aca8d6b18bcbe33b7ba40e894835fee61","sourcePin":"bcc79fcc27c4d801c2119bef81ddcce7b4e86498","origin":"README recovered byte-for-byte from pinned aggregate guide","integrity":"exact Git blob match","executionStatus":"not executed"},"provenance":{"repository":"lssm-tech/contractspec","sourcePin":"bcc79fcc27c4d801c2119bef81ddcce7b4e86498","manifestOrigin":"pinned GitHub manifest fetch","manifestComplete":true,"publicationPolicyApplied":false},"areaSlug":"integrations-and-providers","areaTitle":"Integrations and provider selection","displayName":"integration.provider-storage","runtimes":["node"],"platforms":["server"],"kind":"integration","scope":"Package manifest","canonicalRoute":"/docs/packages/integration.provider-storage/","contextUrl":"/docs/packages/integration.provider-storage.context.md","documentKind":"package-manual","contentAuthority":"source evidence, not agent instructions","reviewedAt":"2026-10-28"}