From 855891bff4173e7063c77397b0193303e3b52c57 Mon Sep 17 00:00:00 2001 From: maddadder Date: Wed, 27 May 2026 08:14:15 -0700 Subject: [PATCH] fix: forward MarmotClient capabilities to KeyPackageManager The capabilities option on MarmotClient was stored on the instance but never passed to KeyPackageManager, so generateKeyPackage() always fell back to defaultCapabilities(). Custom capabilities (e.g. SelfRemove proposal 0x000A required by Amethyst for MDK interop) were silently ignored. Forward this.capabilities to KeyPackageManager and through to generateKeyPackage() in create() (which also covers rotate()). --- .changeset/forward-client-capabilities-to-key-packages.md | 5 +++++ src/client/key-package-manager.ts | 6 ++++++ src/client/marmot-client.ts | 1 + 3 files changed, 12 insertions(+) create mode 100644 .changeset/forward-client-capabilities-to-key-packages.md diff --git a/.changeset/forward-client-capabilities-to-key-packages.md b/.changeset/forward-client-capabilities-to-key-packages.md new file mode 100644 index 0000000..d3e98a5 --- /dev/null +++ b/.changeset/forward-client-capabilities-to-key-packages.md @@ -0,0 +1,5 @@ +--- +"@internet-privacy/marmot-ts": patch +--- + +Forward the `MarmotClient` `capabilities` option to `KeyPackageManager` so custom capabilities (such as adding SelfRemove proposal type `0x000A` for Amethyst interop) are reflected in generated key packages instead of being silently ignored. diff --git a/src/client/key-package-manager.ts b/src/client/key-package-manager.ts index 7584c71..55deac5 100644 --- a/src/client/key-package-manager.ts +++ b/src/client/key-package-manager.ts @@ -4,6 +4,7 @@ import { EventSigner } from "applesauce-core"; import { NostrEvent } from "applesauce-core/helpers/event"; import { EventEmitter } from "eventemitter3"; import { + Capabilities, CiphersuiteName, ciphersuites, CryptoProvider, @@ -265,6 +266,8 @@ export type KeyPackageManagerOptions = { network: NostrNetworkInterface; /** The crypto provider to use for cryptographic operations */ cryptoProvider?: CryptoProvider; + /** Capabilities to advertise in generated key packages. Falls back to ts-mls `defaultCapabilities()` when omitted. */ + capabilities?: Capabilities; }; /** @@ -287,6 +290,7 @@ export class KeyPackageManager extends EventEmitter { private readonly cryptoProvider: CryptoProvider; private readonly signer: EventSigner; private readonly network: NostrNetworkInterface; + private readonly capabilities: Capabilities | undefined; #log = logger.extend("KeyPackageManager"); @@ -297,6 +301,7 @@ export class KeyPackageManager extends EventEmitter { this.signer = options.signer; this.network = options.network; this.clientId = options.clientId; + this.capabilities = options.capabilities; } // --------------------------------------------------------------------------- @@ -506,6 +511,7 @@ export class KeyPackageManager extends EventEmitter { credential, ciphersuiteImpl: ciphersuite, isLastResort: options.isLastResort, + capabilities: this.capabilities, }); // Store private material locally, including the slot identifier diff --git a/src/client/marmot-client.ts b/src/client/marmot-client.ts index 15344b8..ec8a549 100644 --- a/src/client/marmot-client.ts +++ b/src/client/marmot-client.ts @@ -106,6 +106,7 @@ export class MarmotClient< signer: options.signer, network: options.network, clientId: options.clientId, + capabilities: this.capabilities, }); const historyFactory = (