{"_id":"@distilled.cloud/acme","_rev":"4-795903cb0710888cb5b5cdd888174636","name":"@distilled.cloud/acme","dist-tags":{"placeholder":"0.0.0-placeholder","latest":"1.0.0-rc.15"},"versions":{"0.0.0-placeholder":{"name":"@distilled.cloud/acme","version":"0.0.0-placeholder","license":"Apache-2.0","_id":"@distilled.cloud/acme@0.0.0-placeholder","maintainers":[{"name":"pear-alchemy","email":"michael@alchemy.run"},{"name":"sam-goodwin","email":"sam@alchemy.run"},{"name":"blankparticle","email":"blankparticle@gmail.com"}],"homepage":"https://github.com/alchemy-run/distilled#readme","bugs":{"url":"https://github.com/alchemy-run/distilled/issues"},"dist":{"shasum":"c96d536f97861ee689b23f047e9a56e6aa2ba21f","tarball":"https://registry.npmjs.org/@distilled.cloud/acme/-/acme-0.0.0-placeholder.tgz","fileCount":1,"integrity":"sha512-UgQq4ElUKNfSHrRHZ392eX5+brAR2PTiyWE+RfH4EqSHXiBw33YHU7V/otRes7pPDYkEYhxqqrUOms+JvNvyJg==","signatures":[{"sig":"MEUCIQCe57bgliN5eL/DTAc0PaIjRIcQmTGZgMD0YjpMW6Sz4AIgIIIS9Y9N+75Z52PJyGQZ/xMlIGw3kalpHu4mdCCoTys=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":374},"_from":"file:/var/folders/04/dy7yys_174n5gqpcjh0dqw7h0000gn/T/distilled-placeholders-Xhy6Fn/acme/distilled.cloud-acme-0.0.0-placeholder.tgz","_npmUser":{"name":"blankparticle","email":"blankparticle@gmail.com"},"_resolved":"/var/folders/04/dy7yys_174n5gqpcjh0dqw7h0000gn/T/distilled-placeholders-Xhy6Fn/acme/distilled.cloud-acme-0.0.0-placeholder.tgz","_integrity":"sha512-UgQq4ElUKNfSHrRHZ392eX5+brAR2PTiyWE+RfH4EqSHXiBw33YHU7V/otRes7pPDYkEYhxqqrUOms+JvNvyJg==","repository":{"url":"git+https://github.com/alchemy-run/distilled.git","type":"git","directory":"packages/acme"},"_npmVersion":"11.19.0","description":"Placeholder package for initial npm registration.","directories":{},"_nodeVersion":"24.21.0","publishConfig":{"tag":"placeholder","access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/acme_0.0.0-placeholder_1790928987881_0.5310823133280713","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-rc.13":{"name":"@distilled.cloud/acme","version":"1.0.0-rc.13","license":"Apache-2.0","_id":"@distilled.cloud/acme@1.0.0-rc.13","maintainers":[{"name":"pear-alchemy","email":"michael@alchemy.run"},{"name":"sam-goodwin","email":"sam@alchemy.run"},{"name":"blankparticle","email":"blankparticle@gmail.com"}],"dist":{"shasum":"f201a8d6cef1e196915bbdcc35113475171b40b9","tarball":"https://registry.npmjs.org/@distilled.cloud/acme/-/acme-1.0.0-rc.13.tgz","fileCount":53,"integrity":"sha512-3rmzH125jQxk0zpCvXGNEybSaqpAolyCX+8LWDDrXf+wIKs67GflkJyQLjOOh0lKARe29hdUZGgqEbbvpp0LNA==","signatures":[{"sig":"MEUCICCbQhLd4WPGuv4TpIFV1dx3aXuhtuQp3QZ3Jc8XUlpfAiEA/2Le1gfdaLpp6W1tuLTeWMK5/WfHWEbSuTM0fUfem60=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDs9pfwIDkCvLdwgD1gYIiR2GKR4zrhDOEHvRdPpyQmIAiEA3Wk0aehsTOirVR+gQFGl527kAUFOyVY0b9urg+LZbk8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@distilled.cloud%2facme@1.0.0-rc.13","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":248516},"type":"module","module":"src/index.ts","exports":{".":{"bun":"./src/index.ts","types":"./lib/index.d.ts","worker":"./src/index.ts","default":"./lib/index.js"},"./Jose":{"bun":"./src/jose.ts","types":"./lib/jose.d.ts","worker":"./src/jose.ts","default":"./lib/jose.js"},"./acme":{"bun":"./src/services/acme.ts","types":"./lib/services/acme.d.ts","worker":"./src/services/acme.ts","default":"./lib/services/acme.js"},"./Retry":{"bun":"./src/retry.ts","types":"./lib/retry.d.ts","worker":"./src/retry.ts","default":"./lib/retry.js"},"./Errors":{"bun":"./src/errors.ts","types":"./lib/errors.d.ts","worker":"./src/errors.ts","default":"./lib/errors.js"},"./Traits":{"bun":"./src/traits.ts","types":"./lib/traits.d.ts","worker":"./src/traits.ts","default":"./lib/traits.js"},"./Protocol":{"bun":"./src/protocol.ts","types":"./lib/protocol.d.ts","worker":"./src/protocol.ts","default":"./lib/protocol.js"},"./Credentials":{"bun":"./src/credentials.ts","types":"./lib/credentials.d.ts","worker":"./src/credentials.ts","default":"./lib/credentials.js"}},"scripts":{"build":"tsc -b","generate":"bun scripts/generate.ts","typecheck":"tsc -p tsconfig.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"465b1534-e13a-480e-bb28-37546ed3dbcf"}},"repository":{"url":"https://github.com/alchemy-run/distilled","type":"git","directory":"packages/acme"},"directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","dependencies":{"@distilled.cloud/core":"1.0.0-rc.13"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"1.3.14","@types/node":"26.2.0","@effect/platform-bun":"^4.0.0"},"peerDependencies":{"effect":"^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/acme_1.0.0-rc.13_1790929618239_0.01802330683443798","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-rc.14":{"name":"@distilled.cloud/acme","version":"1.0.0-rc.14","license":"Apache-2.0","_id":"@distilled.cloud/acme@1.0.0-rc.14","maintainers":[{"name":"pear-alchemy","email":"michael@alchemy.run"},{"name":"sam-goodwin","email":"sam@alchemy.run"},{"name":"blankparticle","email":"blankparticle@gmail.com"}],"dist":{"shasum":"abdfb68105ee09be6c236762662f273e48e8e580","tarball":"https://registry.npmjs.org/@distilled.cloud/acme/-/acme-1.0.0-rc.14.tgz","fileCount":53,"integrity":"sha512-GxATPydEdKbHZJ81rIS8a5Q2IDO3vWgUCRNH345sddQoc8b45JAoSeW7haDW0lLc/aFYK+Z8wiPnclPYtqhu1w==","signatures":[{"sig":"MEQCIBecQv4kVRB9p12XAKerAW1xZr8FLKUeeCGnHmzMaU2mAiAwab4tnvpSpBe/5zgk5Ynh8GEc6T6pm3E/wTSMg7Xfrg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQC9mNgVjOykXmZXE57pao1w18advyIor1utXgEHwNw93AIgahakIXzI9TMPsN3UjVaR8yuzIIquCraXhqSCCXv2AhQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@distilled.cloud%2facme@1.0.0-rc.14","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":353146},"type":"module","module":"src/index.ts","exports":{".":{"bun":"./src/index.ts","types":"./lib/index.d.ts","worker":"./src/index.ts","default":"./lib/index.js"},"./Jose":{"bun":"./src/jose.ts","types":"./lib/jose.d.ts","worker":"./src/jose.ts","default":"./lib/jose.js"},"./acme":{"bun":"./src/services/acme.ts","types":"./lib/services/acme.d.ts","worker":"./src/services/acme.ts","default":"./lib/services/acme.js"},"./Retry":{"bun":"./src/retry.ts","types":"./lib/retry.d.ts","worker":"./src/retry.ts","default":"./lib/retry.js"},"./Errors":{"bun":"./src/errors.ts","types":"./lib/errors.d.ts","worker":"./src/errors.ts","default":"./lib/errors.js"},"./Traits":{"bun":"./src/traits.ts","types":"./lib/traits.d.ts","worker":"./src/traits.ts","default":"./lib/traits.js"},"./Protocol":{"bun":"./src/protocol.ts","types":"./lib/protocol.d.ts","worker":"./src/protocol.ts","default":"./lib/protocol.js"},"./Credentials":{"bun":"./src/credentials.ts","types":"./lib/credentials.d.ts","worker":"./src/credentials.ts","default":"./lib/credentials.js"}},"scripts":{"build":"tsc -b","convert":"node --conditions=bun scripts/convert.ts","generate":"node --conditions=bun scripts/generate.ts","typecheck":"tsc -p tsconfig.json","specs:fetch":"git submodule update --force --init --depth=1 specs/spec-mirror-acme","specs:update":"git submodule update --remote --force --depth=1 specs/spec-mirror-acme"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"465b1534-e13a-480e-bb28-37546ed3dbcf"}},"distilled":{"generatedAt":"2026-10-08","specUpdatedAt":"2026-10-08"},"repository":{"url":"https://github.com/alchemy-run/distilled","type":"git","directory":"packages/acme"},"directories":{},"sideEffects":false,"dependencies":{"@distilled.cloud/core":"1.0.0-rc.14"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"26.2.0"},"peerDependencies":{"effect":"^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/acme_1.0.0-rc.14_1791829994833_0.7365859501015795","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-rc.15":{"_id":"@distilled.cloud/acme@1.0.0-rc.15","dist":{"shasum":"d38861ce31b23dec7e39c145664b98d695bf297c","tarball":"https://registry.npmjs.org/@distilled.cloud/acme/-/acme-1.0.0-rc.15.tgz","fileCount":53,"integrity":"sha512-SzQZoPTonWolW6yHartHKIc1sEOlrnq3XdCfCT6RUXb1iAK0YyboRE0BgROzhg4FfxqSypb1BBB0D0vwhm+qjQ==","signatures":[{"sig":"MEQCIDXZwzgSGJzl0izWU1mDQL6d2lj5ni7p0fUDLNZiJDvmAiAi/oaVx0+3S6pfxegAaplFF36JXWDiIiDNt24ENVwA6Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIF6WXadcrGF4bi9F8X/XHyiKjlYE8IuNPbVMHS6Su7itAiEA59At6SUZtSeDVX+HBfUT66iqqPvT+tejMgyR8P/pC9U="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@distilled.cloud%2facme@1.0.0-rc.15","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":353146},"name":"@distilled.cloud/acme","type":"module","module":"src/index.ts","exports":{".":{"bun":"./src/index.ts","types":"./lib/index.d.ts","worker":"./src/index.ts","default":"./lib/index.js"},"./Jose":{"bun":"./src/jose.ts","types":"./lib/jose.d.ts","worker":"./src/jose.ts","default":"./lib/jose.js"},"./acme":{"bun":"./src/services/acme.ts","types":"./lib/services/acme.d.ts","worker":"./src/services/acme.ts","default":"./lib/services/acme.js"},"./Retry":{"bun":"./src/retry.ts","types":"./lib/retry.d.ts","worker":"./src/retry.ts","default":"./lib/retry.js"},"./Errors":{"bun":"./src/errors.ts","types":"./lib/errors.d.ts","worker":"./src/errors.ts","default":"./lib/errors.js"},"./Traits":{"bun":"./src/traits.ts","types":"./lib/traits.d.ts","worker":"./src/traits.ts","default":"./lib/traits.js"},"./Protocol":{"bun":"./src/protocol.ts","types":"./lib/protocol.d.ts","worker":"./src/protocol.ts","default":"./lib/protocol.js"},"./Credentials":{"bun":"./src/credentials.ts","types":"./lib/credentials.d.ts","worker":"./src/credentials.ts","default":"./lib/credentials.js"}},"license":"Apache-2.0","scripts":{"build":"tsc -b","convert":"node --conditions=bun scripts/convert.ts","generate":"node --conditions=bun scripts/generate.ts","typecheck":"tsc -p tsconfig.json","specs:fetch":"git submodule update --force --init --depth=1 specs/spec-mirror-acme","specs:update":"git submodule update --remote --force --depth=1 specs/spec-mirror-acme"},"version":"1.0.0-rc.15","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"465b1534-e13a-480e-bb28-37546ed3dbcf"}},"distilled":{"generatedAt":"2026-10-08","specUpdatedAt":"2026-10-08"},"repository":{"url":"https://github.com/alchemy-run/distilled","type":"git","directory":"packages/acme"},"directories":{},"maintainers":[{"name":"pear-alchemy","email":"michael@alchemy.run"},{"name":"sam-goodwin","email":"sam@alchemy.run"},{"name":"blankparticle","email":"blankparticle@gmail.com"}],"sideEffects":false,"dependencies":{"@distilled.cloud/core":"1.0.0-rc.15"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"26.2.0"},"peerDependencies":{"effect":"^4.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/acme_1.0.0-rc.15_1791833381768_0.2396390618059816"}}},"time":{"created":"2026-10-02T08:16:27.648Z","modified":"2026-10-12T19:29:42.275Z","0.0.0-placeholder":"2026-10-02T08:16:28.011Z","1.0.0-rc.13":"2026-10-02T08:26:58.324Z","1.0.0-rc.14":"2026-10-12T18:33:14.953Z","1.0.0-rc.15":"2026-10-12T19:29:41.862Z"},"license":"Apache-2.0","repository":{"url":"https://github.com/alchemy-run/distilled","type":"git","directory":"packages/acme"},"maintainers":[{"name":"pear-alchemy","email":"michael@alchemy.run"},{"name":"sam-goodwin","email":"sam@alchemy.run"},{"name":"blankparticle","email":"blankparticle@gmail.com"}],"readme":"# ACME for Effect\n\n`@distilled.cloud/acme` implements the ACME account and certificate lifecycle\nwith Effect and WebCrypto. Install it alongside `effect`, save this as\n`example.ts`, and run `node example.ts` to read Let's Encrypt's staging directory:\n\n```ts\nimport * as Acme from \"@distilled.cloud/acme\";\nimport * as Effect from \"effect/Effect\";\nimport * as FetchHttpClient from \"effect/http/FetchHttpClient\";\n\nconst program = Effect.gen(function* () {\n  const accountKey = yield* Acme.Jose.generateAccountKey();\n  return yield* Acme.acme.getDirectory({}).pipe(\n    Effect.provide(Acme.layer({\n      directoryUrl: Acme.Directories.LetsEncryptStaging,\n      accountKey,\n    })),\n  );\n});\n\nconst directory = await Effect.runPromise(\n  program.pipe(Effect.provide(FetchHttpClient.layer)),\n);\nconsole.log(directory.newOrder);\n```\n\n## Authentication\n\nSigned requests use a private JWK (`Redacted<string>`), supporting ES256/P-256\nand RS256. Persist your account key securely; do not generate a new key per\nissuance. After `acme.newAccount`, supply its `location` as `accountUrl` to\n`Acme.layer`. CAs requiring External Account Binding also need\n`externalAccountBinding: { keyId, hmacKey }`; `hmacKey` is redacted.\n\n`CredentialsFromEnv` reads `ACME_ACCOUNT_KEY`, `ACME_ACCOUNT_URL`,\n`ACME_DIRECTORY_URL`, and the optional `ACME_EAB_KID` / `ACME_EAB_HMAC_KEY` pair.\nThe default directory is Let's Encrypt **production**; explicitly choose staging\nwhen testing. A staging certificate is not publicly trusted.\n\n## Responses and retries\n\nOperations remain under `Acme.acme` (or the `@distilled.cloud/acme/acme`\nsubpath). JSON outputs are schema-validated; HEAD nonce, PEM chain, and empty\nrevocation responses retain their respective output shapes. Parse errors omit\nraw bodies and parser diagnostics that could contain secrets.\n\nThe protocol retries `badNonce` at most twice, re-signing with the nonce on that\nrequest's rejection. These nonces never enter the shared cache; ordinary nonces\nare cached by the full directory URL. Exhausted recovery surfaces\n`AcmeBadNonce`, not an indefinitely retryable server fault. Typed rate-limit\nerrors expose `retryAfter` as an optional Effect `Duration`. Other retries use\nthe shared SDK policy, configurable through `Acme.Retry`.\n\nUnrecognized problem URNs surface as `UnknownAcmeError` with `type`, `status`,\n`detail`, and `subproblems`, plus a redacted body; they are not classified as\nserver errors merely because their URN is unknown.\n\n## Source and limitations\n\n`scripts/convert.ts` builds the Smithy model from\n[RFC 8555](https://www.rfc-editor.org/rfc/rfc8555), which the spec mirror\n`specs/spec-mirror-acme` snapshots: every member's name, type, requiredness\nand documentation comes from the RFC's field definitions, and the typed errors\nfrom its §6.7 registry. Where CAs differ from the RFC, `patches/` says so. Edit\nthe converter, patches and handwritten protocol, never generated service files;\nregenerate with `pnpm generate acme` from the workspace root.\n\nThe SDK covers directory discovery, nonces, accounts, orders, authorizations,\nchallenge responses, certificate downloads, and revocation. It does not deploy\nDNS/HTTP challenges, generate CSRs, schedule renewal, implement account-key\nrollover, or implement ACME Renewal Information. Callers own those workflows,\nCA terms acceptance, polling limits, and certificate/key storage. Directory\nmetadata is cached in-process; `resetProtocolCaches` from the `Protocol` subpath\nclears directory and nonce caches.\n","readmeFilename":""}