@bcts/frost-hubert 1.0.0-alpha.21 → 1.0.0-alpha.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/bin/frost.cjs +3 -5
  2. package/dist/bin/frost.cjs.map +1 -1
  3. package/dist/bin/frost.mjs +3 -5
  4. package/dist/bin/frost.mjs.map +1 -1
  5. package/dist/{chunk-uaV2rQ02.cjs → chunk-CZWwpsFl.cjs} +22 -32
  6. package/dist/{chunk-ClPoSABd.mjs → chunk-CjcI7cDX.mjs} +6 -12
  7. package/dist/cmd/index.cjs +40 -43
  8. package/dist/cmd/index.d.cts +1 -3
  9. package/dist/cmd/index.d.mts +1 -3
  10. package/dist/cmd/index.mjs +3 -6
  11. package/dist/{sign-D8C3HJ4B.mjs → cmd-5yLeC_QL.mjs} +16 -44
  12. package/dist/cmd-5yLeC_QL.mjs.map +1 -0
  13. package/dist/{sign-2bOp18Fs.cjs → cmd-BfZjC3Uh.cjs} +182 -210
  14. package/dist/cmd-BfZjC3Uh.cjs.map +1 -0
  15. package/dist/dkg/index.cjs +341 -7
  16. package/dist/dkg/index.cjs.map +1 -0
  17. package/dist/dkg/index.d.cts +1 -1
  18. package/dist/dkg/index.d.mts +1 -1
  19. package/dist/dkg/index.mjs +335 -2
  20. package/dist/dkg/index.mjs.map +1 -0
  21. package/dist/frost/index.cjs +8 -9
  22. package/dist/frost/index.cjs.map +1 -1
  23. package/dist/frost/index.mjs +2 -3
  24. package/dist/frost/index.mjs.map +1 -1
  25. package/dist/{index-CcvTi5EA.d.cts → index-BJlwbPYu.d.cts} +3 -3
  26. package/dist/{index-CcvTi5EA.d.cts.map → index-BJlwbPYu.d.cts.map} +1 -1
  27. package/dist/{registry-impl-CE76sTXQ.d.cts → index-BMbPgH0W.d.cts} +1 -1
  28. package/dist/index-BMbPgH0W.d.cts.map +1 -0
  29. package/dist/{group-invite-Dz1Jmiky.d.cts → index-BkqLimZT.d.mts} +2 -2
  30. package/dist/index-BkqLimZT.d.mts.map +1 -0
  31. package/dist/{group-invite-Wk9CIbHL.d.mts → index-DmxfT59Y.d.cts} +2 -2
  32. package/dist/index-DmxfT59Y.d.cts.map +1 -0
  33. package/dist/{registry-impl-BETn_lEO.d.mts → index-DoV5HFvV.d.mts} +1 -1
  34. package/dist/index-DoV5HFvV.d.mts.map +1 -0
  35. package/dist/{index-DNCPeLNM.d.mts → index-Dzm1v4_4.d.mts} +3 -3
  36. package/dist/{index-DNCPeLNM.d.mts.map → index-Dzm1v4_4.d.mts.map} +1 -1
  37. package/dist/index.cjs +64 -68
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.d.cts +3 -6
  40. package/dist/index.d.cts.map +1 -1
  41. package/dist/index.d.mts +3 -6
  42. package/dist/index.d.mts.map +1 -1
  43. package/dist/index.mjs +5 -9
  44. package/dist/index.mjs.map +1 -1
  45. package/dist/registry/index.cjs +806 -13
  46. package/dist/registry/index.cjs.map +1 -0
  47. package/dist/registry/index.d.cts +1 -1
  48. package/dist/registry/index.d.mts +1 -1
  49. package/dist/registry/index.mjs +792 -2
  50. package/dist/registry/index.mjs.map +1 -0
  51. package/dist/{registry-BDnNV1Rk.mjs → registry-CgrCZ4En.mjs} +7 -10
  52. package/dist/{registry-BDnNV1Rk.mjs.map → registry-CgrCZ4En.mjs.map} +1 -1
  53. package/dist/{registry-FMU-ec5K.cjs → registry-loI1_Mh1.cjs} +28 -31
  54. package/dist/registry-loI1_Mh1.cjs.map +1 -0
  55. package/package.json +17 -17
  56. package/src/cmd/dkg/participant/finalize.ts +1 -1
  57. package/src/dkg/proposed-participant.ts +1 -2
  58. package/src/frost/index.ts +1 -1
  59. package/src/registry/owner-record.ts +1 -2
  60. package/src/registry/participant-record.ts +1 -2
  61. package/dist/group-invite-CrbOabFL.cjs +0 -368
  62. package/dist/group-invite-CrbOabFL.cjs.map +0 -1
  63. package/dist/group-invite-Dz1Jmiky.d.cts.map +0 -1
  64. package/dist/group-invite-RPElq-fm.mjs +0 -338
  65. package/dist/group-invite-RPElq-fm.mjs.map +0 -1
  66. package/dist/group-invite-Wk9CIbHL.d.mts.map +0 -1
  67. package/dist/registry-FMU-ec5K.cjs.map +0 -1
  68. package/dist/registry-impl-BETn_lEO.d.mts.map +0 -1
  69. package/dist/registry-impl-C7w4awTv.cjs +0 -865
  70. package/dist/registry-impl-C7w4awTv.cjs.map +0 -1
  71. package/dist/registry-impl-CE76sTXQ.d.cts.map +0 -1
  72. package/dist/registry-impl-eYXVSPwM.mjs +0 -797
  73. package/dist/registry-impl-eYXVSPwM.mjs.map +0 -1
  74. package/dist/sign-2bOp18Fs.cjs.map +0 -1
  75. package/dist/sign-D8C3HJ4B.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["sanitizeXidUr"],"sources":["../../src/registry/group-record.ts","../../src/registry/owner-record.ts","../../src/registry/participant-record.ts","../../src/registry/registry-impl.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Group record for the registry.\n *\n * Port of registry/group_record.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport { ARID, SigningPublicKey, XID } from \"@bcts/components\";\n\n/**\n * A participant in a group.\n *\n * Port of `struct GroupParticipant` from group_record.rs lines 9-13.\n */\nexport class GroupParticipant {\n private readonly _xid: XID;\n\n constructor(xid: XID) {\n this._xid = xid;\n }\n\n xid(): XID {\n return this._xid;\n }\n\n toJSON(): string {\n return this._xid.urString();\n }\n\n static fromJSON(value: string): GroupParticipant {\n const xid = XID.fromURString(value);\n return new GroupParticipant(xid);\n }\n}\n\n/**\n * Contribution paths for DKG state files.\n *\n * Port of `struct ContributionPaths` from group_record.rs lines 21-29.\n */\nexport class ContributionPaths {\n round1Secret?: string | undefined;\n round1Package?: string | undefined;\n round2Secret?: string | undefined;\n keyPackage?: string | undefined;\n\n constructor(init?: Partial<ContributionPaths>) {\n if (init !== undefined) {\n this.round1Secret = init.round1Secret;\n this.round1Package = init.round1Package;\n this.round2Secret = init.round2Secret;\n this.keyPackage = init.keyPackage;\n }\n }\n\n /**\n * Merge missing fields from another ContributionPaths.\n *\n * Port of `ContributionPaths::merge_missing()` from group_record.rs lines 32-45.\n */\n mergeMissing(other: ContributionPaths): void {\n this.round1Secret ??= other.round1Secret;\n this.round1Package ??= other.round1Package;\n this.round2Secret ??= other.round2Secret;\n this.keyPackage ??= other.keyPackage;\n }\n\n /**\n * Check if all fields are empty.\n *\n * Port of `ContributionPaths::is_empty()` from group_record.rs lines 47-53.\n */\n isEmpty(): boolean {\n return (\n this.round1Secret === undefined &&\n this.round1Package === undefined &&\n this.round2Secret === undefined &&\n this.keyPackage === undefined\n );\n }\n\n toJSON(): Record<string, string> {\n const obj: Record<string, string> = {};\n if (this.round1Secret !== undefined) obj[\"round1_secret\"] = this.round1Secret;\n if (this.round1Package !== undefined) obj[\"round1_package\"] = this.round1Package;\n if (this.round2Secret !== undefined) obj[\"round2_secret\"] = this.round2Secret;\n if (this.keyPackage !== undefined) obj[\"key_package\"] = this.keyPackage;\n return obj;\n }\n\n static fromJSON(json: Record<string, string>): ContributionPaths {\n return new ContributionPaths({\n round1Secret: json[\"round1_secret\"],\n round1Package: json[\"round1_package\"],\n round2Secret: json[\"round2_secret\"],\n keyPackage: json[\"key_package\"],\n });\n }\n}\n\n/**\n * A pending request entry.\n */\ninterface PendingRequestEntry {\n participant: XID;\n sendToArid?: ARID | undefined;\n collectFromArid: ARID;\n}\n\n/**\n * Tracks pending communication with participants (coordinator-side).\n *\n * Port of `struct PendingRequests` from group_record.rs lines 71-75.\n */\nexport class PendingRequests {\n private readonly requests: PendingRequestEntry[] = [];\n\n /**\n * Add a pending request where we only know where to collect from.\n *\n * Port of `PendingRequests::add_collect_only()` from group_record.rs lines 90-99.\n */\n addCollectOnly(participant: XID, collectFromArid: ARID): void {\n this.requests.push({\n participant,\n sendToArid: undefined,\n collectFromArid,\n });\n }\n\n /**\n * Add a pending request where we know where to send AND where to collect.\n *\n * Port of `PendingRequests::add_send_and_collect()` from group_record.rs lines 103-115.\n */\n addSendAndCollect(participant: XID, sendToArid: ARID, collectFromArid: ARID): void {\n this.requests.push({\n participant,\n sendToArid,\n collectFromArid,\n });\n }\n\n /**\n * Add a pending request where we only know where to send.\n *\n * Port of `PendingRequests::add_send_only()` from group_record.rs lines 118-127.\n */\n addSendOnly(participant: XID, sendToArid: ARID): void {\n this.requests.push({\n participant,\n sendToArid,\n collectFromArid: sendToArid, // Placeholder\n });\n }\n\n /**\n * Check if there are no pending requests.\n *\n * Port of `PendingRequests::is_empty()` from group_record.rs line 129.\n */\n isEmpty(): boolean {\n return this.requests.length === 0;\n }\n\n /**\n * Get the number of pending requests.\n *\n * Port of `PendingRequests::len()` from group_record.rs line 165.\n */\n len(): number {\n return this.requests.length;\n }\n\n /**\n * Iterate over (participant, collectFromArid) pairs.\n *\n * Port of `PendingRequests::iter_collect()` from group_record.rs lines 132-138.\n */\n *iterCollect(): Generator<[XID, ARID]> {\n for (const r of this.requests) {\n yield [r.participant, r.collectFromArid];\n }\n }\n\n /**\n * Iterate over (participant, sendToArid) pairs.\n *\n * Port of `PendingRequests::iter_send()` from group_record.rs lines 141-150.\n */\n *iterSend(): Generator<[XID, ARID]> {\n for (const r of this.requests) {\n if (r.sendToArid === undefined) {\n throw new Error(\"send_to_arid not set for this request\");\n }\n yield [r.participant, r.sendToArid];\n }\n }\n\n /**\n * Iterate over full (participant, sendToArid, collectFromArid) tuples.\n *\n * Port of `PendingRequests::iter_full()` from group_record.rs lines 153-163.\n */\n *iterFull(): Generator<[XID, ARID | undefined, ARID]> {\n for (const r of this.requests) {\n yield [r.participant, r.sendToArid, r.collectFromArid];\n }\n }\n\n toJSON(): unknown[] {\n return this.requests.map((r) => ({\n participant: r.participant.urString(),\n send_to_arid: r.sendToArid?.urString(),\n collect_from_arid: r.collectFromArid.urString(),\n }));\n }\n\n static fromJSON(json: unknown[]): PendingRequests {\n const pr = new PendingRequests();\n for (const entry of json as Record<string, string>[]) {\n const participant = XID.fromURString(entry[\"participant\"]);\n const sendToArid =\n entry[\"send_to_arid\"] !== undefined && entry[\"send_to_arid\"] !== \"\"\n ? ARID.fromURString(entry[\"send_to_arid\"])\n : undefined;\n const collectFromArid = ARID.fromURString(entry[\"collect_from_arid\"]);\n pr.requests.push({ participant, sendToArid, collectFromArid });\n }\n return pr;\n }\n}\n\n/**\n * Record of a DKG group.\n *\n * Port of `struct GroupRecord` from group_record.rs lines 168-186.\n */\nexport class GroupRecord {\n private readonly _charter: string;\n private readonly _minSigners: number;\n private readonly _coordinator: GroupParticipant;\n private readonly _participants: GroupParticipant[];\n private _contributions: ContributionPaths;\n private _listeningAtArid?: ARID | undefined;\n private _pendingRequests: PendingRequests;\n private _verifyingKey?: SigningPublicKey | undefined;\n\n constructor(\n charter: string,\n minSigners: number,\n coordinator: GroupParticipant,\n participants: GroupParticipant[],\n ) {\n this._charter = charter;\n this._minSigners = minSigners;\n this._coordinator = coordinator;\n this._participants = participants;\n this._contributions = new ContributionPaths();\n this._listeningAtArid = undefined;\n this._pendingRequests = new PendingRequests();\n this._verifyingKey = undefined;\n }\n\n coordinator(): GroupParticipant {\n return this._coordinator;\n }\n\n participants(): GroupParticipant[] {\n return this._participants;\n }\n\n minSigners(): number {\n return this._minSigners;\n }\n\n charter(): string {\n return this._charter;\n }\n\n contributions(): ContributionPaths {\n return this._contributions;\n }\n\n setContributions(contributions: ContributionPaths): void {\n this._contributions = contributions;\n }\n\n mergeContributions(other: ContributionPaths): void {\n this._contributions.mergeMissing(other);\n }\n\n listeningAtArid(): ARID | undefined {\n return this._listeningAtArid;\n }\n\n setListeningAtArid(arid: ARID): void {\n this._listeningAtArid = arid;\n }\n\n clearListeningAtArid(): void {\n this._listeningAtArid = undefined;\n }\n\n pendingRequests(): PendingRequests {\n return this._pendingRequests;\n }\n\n setPendingRequests(requests: PendingRequests): void {\n this._pendingRequests = requests;\n }\n\n clearPendingRequests(): void {\n this._pendingRequests = new PendingRequests();\n }\n\n /**\n * Check if the config matches another group record.\n *\n * Port of `GroupRecord::config_matches()` from group_record.rs lines 247-253.\n */\n configMatches(other: GroupRecord): boolean {\n return (\n this._charter === other._charter &&\n this._minSigners === other._minSigners &&\n this._coordinator.xid().toString() === other._coordinator.xid().toString() &&\n this._participants.length === other._participants.length &&\n this._participants.every(\n (p, i) => p.xid().toString() === other._participants[i].xid().toString(),\n )\n );\n }\n\n verifyingKey(): SigningPublicKey | undefined {\n return this._verifyingKey;\n }\n\n setVerifyingKey(key: SigningPublicKey): void {\n this._verifyingKey = key;\n }\n\n toJSON(): Record<string, unknown> {\n const obj: Record<string, unknown> = {\n charter: this._charter,\n min_signers: this._minSigners,\n coordinator: this._coordinator.toJSON(),\n participants: this._participants.map((p) => p.toJSON()),\n };\n if (!this._contributions.isEmpty()) {\n obj[\"contributions\"] = this._contributions.toJSON();\n }\n if (this._listeningAtArid !== undefined) {\n obj[\"listening_at_arid\"] = this._listeningAtArid.urString();\n }\n if (!this._pendingRequests.isEmpty()) {\n obj[\"pending_requests\"] = this._pendingRequests.toJSON();\n }\n if (this._verifyingKey !== undefined) {\n obj[\"verifying_key\"] = this._verifyingKey.urString();\n }\n return obj;\n }\n\n static fromJSON(json: Record<string, unknown>): GroupRecord {\n const charter = json[\"charter\"] as string;\n const minSigners = json[\"min_signers\"] as number;\n const coordinator = GroupParticipant.fromJSON(json[\"coordinator\"] as string);\n const participants = (json[\"participants\"] as string[]).map((p) =>\n GroupParticipant.fromJSON(p),\n );\n\n const record = new GroupRecord(charter, minSigners, coordinator, participants);\n\n if (json[\"contributions\"] !== undefined) {\n record._contributions = ContributionPaths.fromJSON(\n json[\"contributions\"] as Record<string, string>,\n );\n }\n if (json[\"listening_at_arid\"] !== undefined) {\n record._listeningAtArid = ARID.fromURString(json[\"listening_at_arid\"] as string);\n }\n if (json[\"pending_requests\"] !== undefined) {\n record._pendingRequests = PendingRequests.fromJSON(json[\"pending_requests\"] as unknown[]);\n }\n if (json[\"verifying_key\"] !== undefined) {\n record._verifyingKey = SigningPublicKey.fromURString(json[\"verifying_key\"] as string);\n }\n\n return record;\n }\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Owner record for the registry.\n *\n * Port of registry/owner_record.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport { type XID } from \"@bcts/components\";\nimport { Envelope } from \"@bcts/envelope\";\nimport { UR } from \"@bcts/uniform-resources\";\nimport { XIDDocument, XIDVerifySignature } from \"@bcts/xid\";\n\n/**\n * Record of the registry owner (coordinator).\n *\n * Port of `struct OwnerRecord` from owner_record.rs lines 13-17.\n */\nexport class OwnerRecord {\n private readonly _xidDocumentUr: string;\n private readonly _xidDocument: XIDDocument;\n private readonly _petName: string | undefined;\n\n private constructor(\n xidDocumentUr: string,\n xidDocument: XIDDocument,\n petName: string | undefined,\n ) {\n this._xidDocumentUr = xidDocumentUr;\n this._xidDocument = xidDocument;\n this._petName = petName;\n }\n\n /**\n * Create an owner record from a signed XID UR string.\n *\n * Port of `OwnerRecord::from_signed_xid_ur()` from owner_record.rs lines 20-32.\n */\n static fromSignedXidUr(xidDocumentUr: string, petName?: string): OwnerRecord {\n const [raw, document] = parseRelaxedXidDocument(xidDocumentUr);\n\n if (document.inceptionPrivateKeys() === undefined) {\n throw new Error(\"Owner XID document must include private keys\");\n }\n\n return new OwnerRecord(raw, document, petName);\n }\n\n /**\n * Get the XID of the owner.\n *\n * Port of `OwnerRecord::xid()` from owner_record.rs line 34.\n */\n xid(): XID {\n return this._xidDocument.xid();\n }\n\n /**\n * Get the XID document of the owner.\n *\n * Port of `OwnerRecord::xid_document()` from owner_record.rs line 36.\n */\n xidDocument(): XIDDocument {\n return this._xidDocument;\n }\n\n /**\n * Get the UR string of the XID document.\n *\n * Port of `OwnerRecord::xid_document_ur()` from owner_record.rs line 38.\n */\n xidDocumentUr(): string {\n return this._xidDocumentUr;\n }\n\n /**\n * Get the pet name of the owner.\n *\n * Port of `OwnerRecord::pet_name()` from owner_record.rs line 40.\n */\n petName(): string | undefined {\n return this._petName;\n }\n\n /**\n * Serialize to JSON object.\n */\n toJSON(): Record<string, unknown> {\n const obj: Record<string, unknown> = {\n xid_document: this._xidDocumentUr,\n };\n if (this._petName !== undefined) {\n obj[\"pet_name\"] = this._petName;\n }\n return obj;\n }\n\n /**\n * Deserialize from JSON object.\n */\n static fromJSON(json: Record<string, unknown>): OwnerRecord {\n const xidDocumentUr = json[\"xid_document\"] as string;\n const petName = json[\"pet_name\"] as string | undefined;\n return OwnerRecord.fromSignedXidUr(xidDocumentUr, petName);\n }\n}\n\n/**\n * Parse a XID document with relaxed validation (no signature verification).\n *\n * Port of `parse_relaxed_xid_document()` from owner_record.rs lines 144-165.\n */\nfunction parseRelaxedXidDocument(xidDocumentUr: string): [string, XIDDocument] {\n const sanitized = sanitizeXidUr(xidDocumentUr);\n const ur = UR.fromURString(sanitized);\n\n if (ur.urTypeStr() !== \"xid\" && ur.urTypeStr() !== \"envelope\") {\n throw new Error(`Expected a ur:xid document, found ur:${ur.urTypeStr()}`);\n }\n\n const envelopeCbor = ur.cbor();\n let envelope: Envelope;\n try {\n envelope = Envelope.fromTaggedCbor(envelopeCbor);\n } catch {\n envelope = Envelope.fromUntaggedCbor(envelopeCbor);\n }\n\n const document = XIDDocument.fromEnvelope(envelope, undefined, XIDVerifySignature.None);\n\n return [sanitized, document];\n}\n\n/**\n * Sanitize XID UR input.\n *\n * Port of `sanitize_xid_ur()` from owner_record.rs lines 167-174.\n */\nfunction sanitizeXidUr(input: string): string {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n throw new Error(\"XID document is required\");\n }\n return trimmed;\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Participant record for the registry.\n *\n * Port of registry/participant_record.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport { type PublicKeys, type XID } from \"@bcts/components\";\nimport { Envelope } from \"@bcts/envelope\";\nimport { UR } from \"@bcts/uniform-resources\";\nimport { XIDDocument, XIDVerifySignature } from \"@bcts/xid\";\n\n/**\n * Record of a participant in the registry.\n *\n * Port of `struct ParticipantRecord` from participant_record.rs lines 12-17.\n */\nexport class ParticipantRecord {\n private readonly _xidDocumentUr: string;\n private readonly _xidDocument: XIDDocument;\n private readonly _publicKeys: PublicKeys;\n private readonly _petName: string | undefined;\n\n private constructor(\n xidDocumentUr: string,\n xidDocument: XIDDocument,\n publicKeys: PublicKeys,\n petName: string | undefined,\n ) {\n this._xidDocumentUr = xidDocumentUr;\n this._xidDocument = xidDocument;\n this._publicKeys = publicKeys;\n this._petName = petName;\n }\n\n /**\n * Create a participant record from a signed XID UR string.\n *\n * Port of `ParticipantRecord::from_signed_xid_ur()` from participant_record.rs lines 20-26.\n */\n static fromSignedXidUr(xidDocumentUr: string, petName?: string): ParticipantRecord {\n const [raw, document] = parseSignedXidDocument(xidDocumentUr);\n return ParticipantRecord.buildFromParts(document, raw, petName);\n }\n\n /**\n * Get the pet name of the participant.\n *\n * Port of `ParticipantRecord::pet_name()` from participant_record.rs line 28.\n */\n petName(): string | undefined {\n return this._petName;\n }\n\n /**\n * Get the public keys of the participant.\n *\n * Port of `ParticipantRecord::public_keys()` from participant_record.rs line 29.\n */\n publicKeys(): PublicKeys {\n return this._publicKeys;\n }\n\n /**\n * Get the XID of the participant.\n *\n * Port of `ParticipantRecord::xid()` from participant_record.rs line 30.\n */\n xid(): XID {\n return this._xidDocument.xid();\n }\n\n /**\n * Get the XID document of the participant.\n *\n * Port of `ParticipantRecord::xid_document()` from participant_record.rs line 31.\n */\n xidDocument(): XIDDocument {\n return this._xidDocument;\n }\n\n /**\n * Get the UR string of the XID document.\n *\n * Port of `ParticipantRecord::xid_document_ur()` from participant_record.rs line 32.\n */\n xidDocumentUr(): string {\n return this._xidDocumentUr;\n }\n\n /**\n * Build from constituent parts.\n *\n * Port of `ParticipantRecord::build_from_parts()` from participant_record.rs lines 34-49.\n */\n private static buildFromParts(\n document: XIDDocument,\n xidDocumentUr: string,\n petName: string | undefined,\n ): ParticipantRecord {\n const inceptionKey = document.inceptionKey();\n if (inceptionKey === undefined) {\n throw new Error(\"XID document missing inception key\");\n }\n\n const publicKeys = inceptionKey.publicKeys();\n\n return new ParticipantRecord(xidDocumentUr, document, publicKeys, petName);\n }\n\n /**\n * Recreate from serialized data.\n *\n * Port of `ParticipantRecord::recreate_from_serialized()` from participant_record.rs lines 51-57.\n */\n private static recreateFromSerialized(\n xidDocumentUr: string,\n petName: string | undefined,\n ): ParticipantRecord {\n const [raw, document] = parseSignedXidDocument(xidDocumentUr);\n return ParticipantRecord.buildFromParts(document, raw, petName);\n }\n\n /**\n * Serialize to JSON object.\n */\n toJSON(): Record<string, unknown> {\n const obj: Record<string, unknown> = {\n xid_document: this._xidDocumentUr,\n };\n if (this._petName !== undefined) {\n obj[\"pet_name\"] = this._petName;\n }\n return obj;\n }\n\n /**\n * Deserialize from JSON object.\n */\n static fromJSON(json: Record<string, unknown>): ParticipantRecord {\n const xidDocumentUr = json[\"xid_document\"] as string;\n const petName = json[\"pet_name\"] as string | undefined;\n return ParticipantRecord.recreateFromSerialized(xidDocumentUr, petName);\n }\n}\n\n/**\n * Parse a signed XID document from a UR string.\n *\n * Port of `parse_signed_xid_document()` from participant_record.rs lines 170-194.\n */\nfunction parseSignedXidDocument(xidDocumentUr: string): [string, XIDDocument] {\n const sanitized = sanitizeXidUr(xidDocumentUr);\n const ur = UR.fromURString(sanitized);\n\n if (ur.urTypeStr() !== \"xid\" && ur.urTypeStr() !== \"envelope\") {\n throw new Error(`Expected a ur:xid document, found ur:${ur.urTypeStr()}`);\n }\n\n const envelopeCbor = ur.cbor();\n let envelope: Envelope;\n try {\n envelope = Envelope.fromTaggedCbor(envelopeCbor);\n } catch {\n envelope = Envelope.fromUntaggedCbor(envelopeCbor);\n }\n\n const document = XIDDocument.fromEnvelope(envelope, undefined, XIDVerifySignature.Inception);\n\n return [sanitized, document];\n}\n\n/**\n * Sanitize XID UR input.\n *\n * Port of `sanitize_xid_ur()` from participant_record.rs lines 196-203.\n */\nfunction sanitizeXidUr(input: string): string {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n throw new Error(\"XID document is required\");\n }\n return trimmed;\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Registry implementation for managing participants and groups.\n *\n * Port of registry/registry_impl.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport { type ARID, type XID } from \"@bcts/components\";\n\nimport { GroupRecord } from \"./group-record.js\";\nimport { OwnerRecord } from \"./owner-record.js\";\nimport { ParticipantRecord } from \"./participant-record.js\";\n\n/**\n * Outcome of adding a participant to the registry.\n *\n * Port of `enum AddOutcome` from registry_impl.rs.\n */\nexport enum AddOutcome {\n /** Participant was already present in the registry */\n AlreadyPresent = \"already_present\",\n /** Participant was successfully inserted */\n Inserted = \"inserted\",\n}\n\n/**\n * Outcome of setting the owner in the registry.\n *\n * Port of `enum OwnerOutcome` from registry_impl.rs.\n */\nexport enum OwnerOutcome {\n /** Owner was already present in the registry */\n AlreadyPresent = \"already_present\",\n /** Owner was successfully inserted */\n Inserted = \"inserted\",\n}\n\n/**\n * Outcome of recording a group in the registry.\n *\n * Port of `enum GroupOutcome` from registry_impl.rs.\n */\nexport enum GroupOutcome {\n /** Group was successfully inserted as new */\n Inserted = \"inserted\",\n /** Group already existed and was updated (contributions merged) */\n Updated = \"updated\",\n}\n\n/**\n * Registry for managing participants and groups.\n *\n * Port of `struct Registry` from registry_impl.rs lines 22-26.\n */\nexport class Registry {\n private _owner?: OwnerRecord | undefined;\n private readonly _participants: Map<string, ParticipantRecord>; // Map by XID UR string\n private readonly _groups: Map<string, GroupRecord>; // Map by ARID hex\n\n constructor() {\n this._owner = undefined;\n this._participants = new Map();\n this._groups = new Map();\n }\n\n /**\n * Get the owner record.\n */\n owner(): OwnerRecord | undefined {\n return this._owner;\n }\n\n /**\n * Set the owner record.\n *\n * Returns the outcome indicating whether the owner was already present or newly inserted.\n *\n * Port of `Registry::set_owner()` from registry_impl.rs.\n */\n setOwner(owner: OwnerRecord): OwnerOutcome {\n // Check for pet name conflicts with participants\n const petName = owner.petName();\n if (petName !== undefined) {\n const conflicting = this.participantByPetName(petName);\n if (conflicting?.[1].petName() === petName) {\n throw new Error(`Pet name '${petName}' already used by a participant`);\n }\n }\n\n if (this._owner === undefined) {\n this._owner = owner;\n return OwnerOutcome.Inserted;\n }\n\n const existing = this._owner;\n const existingXidUr = existing.xid().urString();\n const ownerXidUr = owner.xid().urString();\n\n if (\n existingXidUr === ownerXidUr &&\n existing.xidDocumentUr() === owner.xidDocumentUr() &&\n existing.petName() === owner.petName()\n ) {\n return OwnerOutcome.AlreadyPresent;\n }\n\n if (existingXidUr === ownerXidUr) {\n if (existing.xidDocumentUr() !== owner.xidDocumentUr()) {\n throw new Error(\"Owner already exists with different keys\");\n }\n this._owner = owner;\n return OwnerOutcome.Inserted;\n }\n\n throw new Error(`Owner already recorded for ${existing.xid().toString()}`);\n }\n\n /**\n * Get all participants.\n */\n participants(): Map<string, ParticipantRecord> {\n return this._participants;\n }\n\n /**\n * Get a participant by XID.\n */\n participant(xid: XID): ParticipantRecord | undefined {\n return this._participants.get(xid.urString());\n }\n\n /**\n * Add a participant.\n *\n * Returns the outcome indicating whether the participant was already present or newly inserted.\n */\n addParticipant(xid: XID, record: ParticipantRecord): AddOutcome {\n const xidUr = xid.urString();\n\n // Check if already present\n if (this._participants.has(xidUr)) {\n return AddOutcome.AlreadyPresent;\n }\n\n // Check for conflicting pet name\n const petName = record.petName();\n if (petName !== undefined && this.petNameExists(petName)) {\n throw new Error(`Pet name \"${petName}\" is already used by another participant`);\n }\n\n this._participants.set(xidUr, record);\n return AddOutcome.Inserted;\n }\n\n /**\n * Check if a pet name is already used.\n */\n petNameExists(petName: string): boolean {\n for (const record of this._participants.values()) {\n if (record.petName() === petName) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Find a participant by pet name.\n *\n * Port of `Registry::participant_by_pet_name()` from registry_impl.rs.\n */\n participantByPetName(petName: string): [XID, ParticipantRecord] | undefined {\n for (const record of this._participants.values()) {\n if (record.petName() === petName) {\n return [record.xid(), record];\n }\n }\n return undefined;\n }\n\n /**\n * Get all groups.\n */\n groups(): Map<string, GroupRecord> {\n return this._groups;\n }\n\n /**\n * Get a group by ARID.\n */\n group(arid: ARID): GroupRecord | undefined {\n return this._groups.get(arid.hex());\n }\n\n /**\n * Get a mutable reference to a group by ARID.\n */\n groupMut(arid: ARID): GroupRecord | undefined {\n return this._groups.get(arid.hex());\n }\n\n /**\n * Record a group in the registry.\n *\n * If the group already exists:\n * - Validates that the config matches\n * - Merges contributions from the new record\n * - Updates verifying key if not already set\n *\n * Port of `Registry::record_group()` from registry_impl.rs.\n */\n recordGroup(groupId: ARID, record: GroupRecord): GroupOutcome {\n const key = groupId.hex();\n const existing = this._groups.get(key);\n\n if (existing !== undefined) {\n // Validate config matches\n if (!existing.configMatches(record)) {\n throw new Error(`Group ${groupId.hex()} already exists with a different configuration`);\n }\n\n // Merge contributions\n existing.mergeContributions(record.contributions());\n\n // Update verifying key if not already set\n const existingKey = existing.verifyingKey();\n const recordKey = record.verifyingKey();\n if (existingKey === undefined && recordKey !== undefined) {\n existing.setVerifyingKey(recordKey);\n } else if (\n existingKey !== undefined &&\n recordKey !== undefined &&\n existingKey.urString() !== recordKey.urString()\n ) {\n throw new Error(`Group ${groupId.hex()} already exists with a different verifying key`);\n }\n\n return GroupOutcome.Updated;\n }\n\n this._groups.set(key, record);\n return GroupOutcome.Inserted;\n }\n\n /**\n * Add a group (simple variant without merge logic).\n *\n * @deprecated Use recordGroup() for proper merge behavior.\n */\n addGroup(arid: ARID, record: GroupRecord): void {\n this._groups.set(arid.hex(), record);\n }\n\n /**\n * Load a registry from a file.\n */\n static load(filePath: string): Registry {\n if (!fs.existsSync(filePath)) {\n return new Registry();\n }\n\n const content = fs.readFileSync(filePath, \"utf-8\");\n const json = JSON.parse(content) as Record<string, unknown>;\n return Registry.fromJSON(json);\n }\n\n /**\n * Save the registry to a file.\n */\n save(filePath: string): void {\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const json = this.toJSON();\n fs.writeFileSync(filePath, JSON.stringify(json, null, 2));\n }\n\n /**\n * Serialize to JSON object.\n */\n toJSON(): Record<string, unknown> {\n const participants: Record<string, unknown> = {};\n for (const [xidUr, record] of this._participants) {\n participants[xidUr] = record.toJSON();\n }\n\n const groups: Record<string, unknown> = {};\n for (const [aridHex, record] of this._groups) {\n groups[aridHex] = record.toJSON();\n }\n\n const obj: Record<string, unknown> = {\n groups,\n participants,\n };\n\n if (this._owner !== undefined) {\n obj[\"owner\"] = this._owner.toJSON();\n }\n\n return obj;\n }\n\n /**\n * Deserialize from JSON object.\n */\n static fromJSON(json: Record<string, unknown>): Registry {\n const registry = new Registry();\n\n if (json[\"owner\"] !== undefined) {\n registry._owner = OwnerRecord.fromJSON(json[\"owner\"] as Record<string, unknown>);\n }\n\n const participantsJson = json[\"participants\"] as\n | Record<string, Record<string, unknown>>\n | undefined;\n if (participantsJson !== undefined) {\n for (const [, recordJson] of Object.entries(participantsJson)) {\n const record = ParticipantRecord.fromJSON(recordJson);\n registry._participants.set(record.xid().urString(), record);\n }\n }\n\n const groupsJson = json[\"groups\"] as Record<string, Record<string, unknown>> | undefined;\n if (groupsJson !== undefined) {\n for (const [aridHex, recordJson] of Object.entries(groupsJson)) {\n const record = GroupRecord.fromJSON(recordJson);\n registry._groups.set(aridHex, record);\n }\n }\n\n return registry;\n }\n}\n\n/**\n * Resolve the registry file path from a given argument.\n *\n * Port of `resolve_registry_path()` from registry/mod.rs lines 49-78.\n */\nexport function resolveRegistryPath(registryArg: string | undefined, cwd: string): string {\n if (registryArg === undefined || registryArg === \"\") {\n return path.join(cwd, \"registry.json\");\n }\n\n // If it ends with / or is a directory, append registry.json\n if (registryArg.endsWith(\"/\") || registryArg.endsWith(path.sep)) {\n return path.join(cwd, registryArg, \"registry.json\");\n }\n\n // If it's just a filename, put it in cwd\n if (!registryArg.includes(\"/\") && !registryArg.includes(path.sep)) {\n return path.join(cwd, registryArg);\n }\n\n // Otherwise, treat as relative path\n return path.resolve(cwd, registryArg);\n}\n"],"mappings":"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"}
@@ -1,8 +1,7 @@
1
- import { t as __exportAll } from "./chunk-ClPoSABd.mjs";
2
- import { i as Registry, o as ParticipantRecord, r as OwnerOutcome, s as OwnerRecord, t as AddOutcome } from "./registry-impl-eYXVSPwM.mjs";
1
+ import { t as __exportAll } from "./chunk-CjcI7cDX.mjs";
2
+ import { OwnerRecord, ParticipantRecord, Registry } from "./registry/index.mjs";
3
3
  import * as fs from "node:fs";
4
4
  import * as path from "node:path";
5
-
6
5
  //#region src/cmd/registry/owner/set.ts
7
6
  /**
8
7
  * Copyright © 2023-2026 Blockchain Commons, LLC
@@ -37,11 +36,10 @@ function ownerSet(options, cwd) {
37
36
  const path = participantsFilePath(options.registryPath, cwd);
38
37
  const registry = Registry.load(path);
39
38
  const outcome = registry.setOwner(owner);
40
- if (outcome === OwnerOutcome.AlreadyPresent) console.log("Owner already recorded");
39
+ if (outcome === "already_present") console.log("Owner already recorded");
41
40
  registry.save(path);
42
41
  return { outcome };
43
42
  }
44
-
45
43
  //#endregion
46
44
  //#region src/cmd/registry/participant/add.ts
47
45
  /**
@@ -78,11 +76,10 @@ function participantAdd(options, cwd) {
78
76
  const path = participantsFilePath(options.registryPath, cwd);
79
77
  const registry = Registry.load(path);
80
78
  const outcome = registry.addParticipant(xid, participant);
81
- if (outcome === AddOutcome.AlreadyPresent) console.log("Participant already recorded");
82
- else if (outcome === AddOutcome.Inserted) registry.save(path);
79
+ if (outcome === "already_present") console.log("Participant already recorded");
80
+ else if (outcome === "inserted") registry.save(path);
83
81
  return { outcome };
84
82
  }
85
-
86
83
  //#endregion
87
84
  //#region src/cmd/registry/index.ts
88
85
  /**
@@ -150,7 +147,7 @@ function isDirectoryHint(input, pathStr) {
150
147
  function endsWithSeparator(input) {
151
148
  return input.endsWith("/") || input.endsWith("\\");
152
149
  }
153
-
154
150
  //#endregion
155
151
  export { participantAdd as n, ownerSet as r, registry_exports as t };
156
- //# sourceMappingURL=registry-BDnNV1Rk.mjs.map
152
+
153
+ //# sourceMappingURL=registry-CgrCZ4En.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry-BDnNV1Rk.mjs","names":["normalizePetName"],"sources":["../src/cmd/registry/owner/set.ts","../src/cmd/registry/participant/add.ts","../src/cmd/registry/index.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Registry owner set command.\n *\n * Port of cmd/registry/owner/set.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport { Registry, OwnerRecord, OwnerOutcome } from \"../../../registry/index.js\";\nimport { participantsFilePath } from \"../index.js\";\n\n/**\n * Options for the owner set command.\n */\nexport interface OwnerSetOptions {\n /** Signed ur:xid document containing the owner's XID document (must include private keys) */\n xidDocument: string;\n /** Optional human readable alias for the owner */\n petName?: string | undefined;\n /** Optional registry path or filename override */\n registryPath?: string | undefined;\n}\n\n/**\n * Result of the owner set command.\n */\nexport interface OwnerSetResult {\n outcome: OwnerOutcome;\n}\n\n/**\n * Normalize pet name, trimming whitespace and validating non-empty.\n */\nfunction normalizePetName(petName?: string): string | undefined {\n if (petName === undefined) {\n return undefined;\n }\n\n const trimmed = petName.trim();\n if (trimmed.length === 0) {\n throw new Error(\"Pet name cannot be empty\");\n }\n\n return trimmed;\n}\n\n/**\n * Execute the owner set command.\n *\n * Sets the registry owner using an ur:xid document that includes private keys.\n *\n * Port of `CommandArgs.exec()` from cmd/registry/owner/set.rs.\n */\nexport function ownerSet(options: OwnerSetOptions, cwd: string): OwnerSetResult {\n const petName = normalizePetName(options.petName);\n const owner = OwnerRecord.fromSignedXidUr(options.xidDocument, petName);\n const path = participantsFilePath(options.registryPath, cwd);\n const registry = Registry.load(path);\n\n const outcome = registry.setOwner(owner);\n\n if (outcome === OwnerOutcome.AlreadyPresent) {\n console.log(\"Owner already recorded\");\n }\n\n // Always save to persist pet name updates on existing owner records.\n registry.save(path);\n\n return { outcome };\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Registry participant add command.\n *\n * Port of cmd/registry/participant/add.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport { Registry, ParticipantRecord, AddOutcome } from \"../../../registry/index.js\";\nimport { participantsFilePath } from \"../index.js\";\n\n/**\n * Options for the participant add command.\n */\nexport interface ParticipantAddOptions {\n /** Signed ur:xid document containing the participant's XID document */\n xidDocument: string;\n /** Optional human readable alias */\n petName?: string | undefined;\n /** Optional registry path or filename override */\n registryPath?: string | undefined;\n}\n\n/**\n * Result of the participant add command.\n */\nexport interface ParticipantAddResult {\n outcome: AddOutcome;\n}\n\n/**\n * Normalize pet name, trimming whitespace and validating non-empty.\n */\nfunction normalizePetName(petName?: string): string | undefined {\n if (petName === undefined) {\n return undefined;\n }\n\n const trimmed = petName.trim();\n if (trimmed.length === 0) {\n throw new Error(\"Pet name cannot be empty\");\n }\n\n return trimmed;\n}\n\n/**\n * Execute the participant add command.\n *\n * Adds a participant using an ur:xid document.\n *\n * Port of `CommandArgs.exec()` from cmd/registry/participant/add.rs.\n */\nexport function participantAdd(options: ParticipantAddOptions, cwd: string): ParticipantAddResult {\n const petName = normalizePetName(options.petName);\n const participant = ParticipantRecord.fromSignedXidUr(options.xidDocument, petName);\n const xid = participant.xid();\n const path = participantsFilePath(options.registryPath, cwd);\n const registry = Registry.load(path);\n\n const outcome = registry.addParticipant(xid, participant);\n\n if (outcome === AddOutcome.AlreadyPresent) {\n console.log(\"Participant already recorded\");\n } else if (outcome === AddOutcome.Inserted) {\n registry.save(path);\n }\n\n return { outcome };\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Registry commands.\n *\n * Port of cmd/registry/mod.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport * from \"./owner/index.js\";\nexport * from \"./participant/index.js\";\n\nconst DEFAULT_FILENAME = \"registry.json\";\n\n/**\n * Resolve the participants registry path, defaulting to `registry.json` in the\n * current working directory.\n *\n * Port of `participants_file_path()` from cmd/registry/mod.rs.\n */\nexport function participantsFilePath(registry: string | undefined, cwd: string): string {\n if (registry === undefined) {\n return path.join(cwd, DEFAULT_FILENAME);\n }\n\n return resolveRegistryPath(cwd, DEFAULT_FILENAME, registry);\n}\n\n/**\n * Resolve registry path with smart directory detection.\n *\n * Port of `resolve_registry_path()` from cmd/registry/mod.rs.\n */\nfunction resolveRegistryPath(cwd: string, defaultFilename: string, raw: string): string {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n throw new Error(\"Registry path cannot be empty\");\n }\n\n const provided = trimmed;\n const treatAsDirectory = isDirectoryHint(trimmed, provided);\n\n let resolved: string;\n if (path.isAbsolute(provided)) {\n resolved = provided;\n } else {\n resolved = path.join(cwd, provided);\n }\n\n if (treatAsDirectory) {\n // Ensure the directory exists\n if (!fs.existsSync(resolved)) {\n fs.mkdirSync(resolved, { recursive: true });\n }\n resolved = path.join(resolved, defaultFilename);\n }\n\n return resolved;\n}\n\n/**\n * Check if the input should be treated as a directory path.\n *\n * Port of `is_directory_hint()` from cmd/registry/mod.rs.\n */\nfunction isDirectoryHint(input: string, pathStr: string): boolean {\n if (endsWithSeparator(input)) {\n return true;\n }\n\n const basename = path.basename(pathStr);\n if (basename === \"\" || basename === \".\" || basename === \"..\") {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if input ends with a path separator.\n *\n * Port of `ends_with_separator()` from cmd/registry/mod.rs.\n */\nfunction endsWithSeparator(input: string): boolean {\n return input.endsWith(\"/\") || input.endsWith(\"\\\\\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAqCA,SAASA,mBAAiB,SAAsC;AAC9D,KAAI,YAAY,OACd;CAGF,MAAM,UAAU,QAAQ,MAAM;AAC9B,KAAI,QAAQ,WAAW,EACrB,OAAM,IAAI,MAAM,2BAA2B;AAG7C,QAAO;;;;;;;;;AAUT,SAAgB,SAAS,SAA0B,KAA6B;CAC9E,MAAM,UAAUA,mBAAiB,QAAQ,QAAQ;CACjD,MAAM,QAAQ,YAAY,gBAAgB,QAAQ,aAAa,QAAQ;CACvE,MAAM,OAAO,qBAAqB,QAAQ,cAAc,IAAI;CAC5D,MAAM,WAAW,SAAS,KAAK,KAAK;CAEpC,MAAM,UAAU,SAAS,SAAS,MAAM;AAExC,KAAI,YAAY,aAAa,eAC3B,SAAQ,IAAI,yBAAyB;AAIvC,UAAS,KAAK,KAAK;AAEnB,QAAO,EAAE,SAAS;;;;;;;;;;;;;;;;;;;ACnCpB,SAAS,iBAAiB,SAAsC;AAC9D,KAAI,YAAY,OACd;CAGF,MAAM,UAAU,QAAQ,MAAM;AAC9B,KAAI,QAAQ,WAAW,EACrB,OAAM,IAAI,MAAM,2BAA2B;AAG7C,QAAO;;;;;;;;;AAUT,SAAgB,eAAe,SAAgC,KAAmC;CAChG,MAAM,UAAU,iBAAiB,QAAQ,QAAQ;CACjD,MAAM,cAAc,kBAAkB,gBAAgB,QAAQ,aAAa,QAAQ;CACnF,MAAM,MAAM,YAAY,KAAK;CAC7B,MAAM,OAAO,qBAAqB,QAAQ,cAAc,IAAI;CAC5D,MAAM,WAAW,SAAS,KAAK,KAAK;CAEpC,MAAM,UAAU,SAAS,eAAe,KAAK,YAAY;AAEzD,KAAI,YAAY,WAAW,eACzB,SAAQ,IAAI,+BAA+B;UAClC,YAAY,WAAW,SAChC,UAAS,KAAK,KAAK;AAGrB,QAAO,EAAE,SAAS;;;;;;;;;;;;;;;;;;;;;ACtDpB,MAAM,mBAAmB;;;;;;;AAQzB,SAAgB,qBAAqB,UAA8B,KAAqB;AACtF,KAAI,aAAa,OACf,QAAO,KAAK,KAAK,KAAK,iBAAiB;AAGzC,QAAO,oBAAoB,KAAK,kBAAkB,SAAS;;;;;;;AAQ7D,SAAS,oBAAoB,KAAa,iBAAyB,KAAqB;CACtF,MAAM,UAAU,IAAI,MAAM;AAC1B,KAAI,QAAQ,WAAW,EACrB,OAAM,IAAI,MAAM,gCAAgC;CAGlD,MAAM,WAAW;CACjB,MAAM,mBAAmB,gBAAgB,SAAS,SAAS;CAE3D,IAAI;AACJ,KAAI,KAAK,WAAW,SAAS,CAC3B,YAAW;KAEX,YAAW,KAAK,KAAK,KAAK,SAAS;AAGrC,KAAI,kBAAkB;AAEpB,MAAI,CAAC,GAAG,WAAW,SAAS,CAC1B,IAAG,UAAU,UAAU,EAAE,WAAW,MAAM,CAAC;AAE7C,aAAW,KAAK,KAAK,UAAU,gBAAgB;;AAGjD,QAAO;;;;;;;AAQT,SAAS,gBAAgB,OAAe,SAA0B;AAChE,KAAI,kBAAkB,MAAM,CAC1B,QAAO;CAGT,MAAM,WAAW,KAAK,SAAS,QAAQ;AACvC,KAAI,aAAa,MAAM,aAAa,OAAO,aAAa,KACtD,QAAO;AAGT,QAAO;;;;;;;AAQT,SAAS,kBAAkB,OAAwB;AACjD,QAAO,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,KAAK"}
1
+ {"version":3,"file":"registry-CgrCZ4En.mjs","names":["normalizePetName"],"sources":["../src/cmd/registry/owner/set.ts","../src/cmd/registry/participant/add.ts","../src/cmd/registry/index.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Registry owner set command.\n *\n * Port of cmd/registry/owner/set.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport { Registry, OwnerRecord, OwnerOutcome } from \"../../../registry/index.js\";\nimport { participantsFilePath } from \"../index.js\";\n\n/**\n * Options for the owner set command.\n */\nexport interface OwnerSetOptions {\n /** Signed ur:xid document containing the owner's XID document (must include private keys) */\n xidDocument: string;\n /** Optional human readable alias for the owner */\n petName?: string | undefined;\n /** Optional registry path or filename override */\n registryPath?: string | undefined;\n}\n\n/**\n * Result of the owner set command.\n */\nexport interface OwnerSetResult {\n outcome: OwnerOutcome;\n}\n\n/**\n * Normalize pet name, trimming whitespace and validating non-empty.\n */\nfunction normalizePetName(petName?: string): string | undefined {\n if (petName === undefined) {\n return undefined;\n }\n\n const trimmed = petName.trim();\n if (trimmed.length === 0) {\n throw new Error(\"Pet name cannot be empty\");\n }\n\n return trimmed;\n}\n\n/**\n * Execute the owner set command.\n *\n * Sets the registry owner using an ur:xid document that includes private keys.\n *\n * Port of `CommandArgs.exec()` from cmd/registry/owner/set.rs.\n */\nexport function ownerSet(options: OwnerSetOptions, cwd: string): OwnerSetResult {\n const petName = normalizePetName(options.petName);\n const owner = OwnerRecord.fromSignedXidUr(options.xidDocument, petName);\n const path = participantsFilePath(options.registryPath, cwd);\n const registry = Registry.load(path);\n\n const outcome = registry.setOwner(owner);\n\n if (outcome === OwnerOutcome.AlreadyPresent) {\n console.log(\"Owner already recorded\");\n }\n\n // Always save to persist pet name updates on existing owner records.\n registry.save(path);\n\n return { outcome };\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Registry participant add command.\n *\n * Port of cmd/registry/participant/add.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport { Registry, ParticipantRecord, AddOutcome } from \"../../../registry/index.js\";\nimport { participantsFilePath } from \"../index.js\";\n\n/**\n * Options for the participant add command.\n */\nexport interface ParticipantAddOptions {\n /** Signed ur:xid document containing the participant's XID document */\n xidDocument: string;\n /** Optional human readable alias */\n petName?: string | undefined;\n /** Optional registry path or filename override */\n registryPath?: string | undefined;\n}\n\n/**\n * Result of the participant add command.\n */\nexport interface ParticipantAddResult {\n outcome: AddOutcome;\n}\n\n/**\n * Normalize pet name, trimming whitespace and validating non-empty.\n */\nfunction normalizePetName(petName?: string): string | undefined {\n if (petName === undefined) {\n return undefined;\n }\n\n const trimmed = petName.trim();\n if (trimmed.length === 0) {\n throw new Error(\"Pet name cannot be empty\");\n }\n\n return trimmed;\n}\n\n/**\n * Execute the participant add command.\n *\n * Adds a participant using an ur:xid document.\n *\n * Port of `CommandArgs.exec()` from cmd/registry/participant/add.rs.\n */\nexport function participantAdd(options: ParticipantAddOptions, cwd: string): ParticipantAddResult {\n const petName = normalizePetName(options.petName);\n const participant = ParticipantRecord.fromSignedXidUr(options.xidDocument, petName);\n const xid = participant.xid();\n const path = participantsFilePath(options.registryPath, cwd);\n const registry = Registry.load(path);\n\n const outcome = registry.addParticipant(xid, participant);\n\n if (outcome === AddOutcome.AlreadyPresent) {\n console.log(\"Participant already recorded\");\n } else if (outcome === AddOutcome.Inserted) {\n registry.save(path);\n }\n\n return { outcome };\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Registry commands.\n *\n * Port of cmd/registry/mod.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport * from \"./owner/index.js\";\nexport * from \"./participant/index.js\";\n\nconst DEFAULT_FILENAME = \"registry.json\";\n\n/**\n * Resolve the participants registry path, defaulting to `registry.json` in the\n * current working directory.\n *\n * Port of `participants_file_path()` from cmd/registry/mod.rs.\n */\nexport function participantsFilePath(registry: string | undefined, cwd: string): string {\n if (registry === undefined) {\n return path.join(cwd, DEFAULT_FILENAME);\n }\n\n return resolveRegistryPath(cwd, DEFAULT_FILENAME, registry);\n}\n\n/**\n * Resolve registry path with smart directory detection.\n *\n * Port of `resolve_registry_path()` from cmd/registry/mod.rs.\n */\nfunction resolveRegistryPath(cwd: string, defaultFilename: string, raw: string): string {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n throw new Error(\"Registry path cannot be empty\");\n }\n\n const provided = trimmed;\n const treatAsDirectory = isDirectoryHint(trimmed, provided);\n\n let resolved: string;\n if (path.isAbsolute(provided)) {\n resolved = provided;\n } else {\n resolved = path.join(cwd, provided);\n }\n\n if (treatAsDirectory) {\n // Ensure the directory exists\n if (!fs.existsSync(resolved)) {\n fs.mkdirSync(resolved, { recursive: true });\n }\n resolved = path.join(resolved, defaultFilename);\n }\n\n return resolved;\n}\n\n/**\n * Check if the input should be treated as a directory path.\n *\n * Port of `is_directory_hint()` from cmd/registry/mod.rs.\n */\nfunction isDirectoryHint(input: string, pathStr: string): boolean {\n if (endsWithSeparator(input)) {\n return true;\n }\n\n const basename = path.basename(pathStr);\n if (basename === \"\" || basename === \".\" || basename === \"..\") {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if input ends with a path separator.\n *\n * Port of `ends_with_separator()` from cmd/registry/mod.rs.\n */\nfunction endsWithSeparator(input: string): boolean {\n return input.endsWith(\"/\") || input.endsWith(\"\\\\\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAqCA,SAASA,mBAAiB,SAAsC;AAC9D,KAAI,YAAY,KAAA,EACd;CAGF,MAAM,UAAU,QAAQ,MAAM;AAC9B,KAAI,QAAQ,WAAW,EACrB,OAAM,IAAI,MAAM,2BAA2B;AAG7C,QAAO;;;;;;;;;AAUT,SAAgB,SAAS,SAA0B,KAA6B;CAC9E,MAAM,UAAUA,mBAAiB,QAAQ,QAAQ;CACjD,MAAM,QAAQ,YAAY,gBAAgB,QAAQ,aAAa,QAAQ;CACvE,MAAM,OAAO,qBAAqB,QAAQ,cAAc,IAAI;CAC5D,MAAM,WAAW,SAAS,KAAK,KAAK;CAEpC,MAAM,UAAU,SAAS,SAAS,MAAM;AAExC,KAAI,YAAA,kBACF,SAAQ,IAAI,yBAAyB;AAIvC,UAAS,KAAK,KAAK;AAEnB,QAAO,EAAE,SAAS;;;;;;;;;;;;;;;;;;ACnCpB,SAAS,iBAAiB,SAAsC;AAC9D,KAAI,YAAY,KAAA,EACd;CAGF,MAAM,UAAU,QAAQ,MAAM;AAC9B,KAAI,QAAQ,WAAW,EACrB,OAAM,IAAI,MAAM,2BAA2B;AAG7C,QAAO;;;;;;;;;AAUT,SAAgB,eAAe,SAAgC,KAAmC;CAChG,MAAM,UAAU,iBAAiB,QAAQ,QAAQ;CACjD,MAAM,cAAc,kBAAkB,gBAAgB,QAAQ,aAAa,QAAQ;CACnF,MAAM,MAAM,YAAY,KAAK;CAC7B,MAAM,OAAO,qBAAqB,QAAQ,cAAc,IAAI;CAC5D,MAAM,WAAW,SAAS,KAAK,KAAK;CAEpC,MAAM,UAAU,SAAS,eAAe,KAAK,YAAY;AAEzD,KAAI,YAAA,kBACF,SAAQ,IAAI,+BAA+B;UAClC,YAAA,WACT,UAAS,KAAK,KAAK;AAGrB,QAAO,EAAE,SAAS;;;;;;;;;;;;;;;;;;;;ACtDpB,MAAM,mBAAmB;;;;;;;AAQzB,SAAgB,qBAAqB,UAA8B,KAAqB;AACtF,KAAI,aAAa,KAAA,EACf,QAAO,KAAK,KAAK,KAAK,iBAAiB;AAGzC,QAAO,oBAAoB,KAAK,kBAAkB,SAAS;;;;;;;AAQ7D,SAAS,oBAAoB,KAAa,iBAAyB,KAAqB;CACtF,MAAM,UAAU,IAAI,MAAM;AAC1B,KAAI,QAAQ,WAAW,EACrB,OAAM,IAAI,MAAM,gCAAgC;CAGlD,MAAM,WAAW;CACjB,MAAM,mBAAmB,gBAAgB,SAAS,SAAS;CAE3D,IAAI;AACJ,KAAI,KAAK,WAAW,SAAS,CAC3B,YAAW;KAEX,YAAW,KAAK,KAAK,KAAK,SAAS;AAGrC,KAAI,kBAAkB;AAEpB,MAAI,CAAC,GAAG,WAAW,SAAS,CAC1B,IAAG,UAAU,UAAU,EAAE,WAAW,MAAM,CAAC;AAE7C,aAAW,KAAK,KAAK,UAAU,gBAAgB;;AAGjD,QAAO;;;;;;;AAQT,SAAS,gBAAgB,OAAe,SAA0B;AAChE,KAAI,kBAAkB,MAAM,CAC1B,QAAO;CAGT,MAAM,WAAW,KAAK,SAAS,QAAQ;AACvC,KAAI,aAAa,MAAM,aAAa,OAAO,aAAa,KACtD,QAAO;AAGT,QAAO;;;;;;;AAQT,SAAS,kBAAkB,OAAwB;AACjD,QAAO,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,KAAK"}
@@ -1,10 +1,9 @@
1
- const require_chunk = require('./chunk-uaV2rQ02.cjs');
2
- const require_registry_impl = require('./registry-impl-C7w4awTv.cjs');
1
+ const require_chunk = require("./chunk-CZWwpsFl.cjs");
2
+ const require_registry_index = require("./registry/index.cjs");
3
3
  let node_fs = require("node:fs");
4
- node_fs = require_chunk.__toESM(node_fs);
4
+ node_fs = require_chunk.__toESM(node_fs, 1);
5
5
  let node_path = require("node:path");
6
- node_path = require_chunk.__toESM(node_path);
7
-
6
+ node_path = require_chunk.__toESM(node_path, 1);
8
7
  //#region src/cmd/registry/owner/set.ts
9
8
  /**
10
9
  * Copyright © 2023-2026 Blockchain Commons, LLC
@@ -35,15 +34,14 @@ function normalizePetName$1(petName) {
35
34
  */
36
35
  function ownerSet(options, cwd) {
37
36
  const petName = normalizePetName$1(options.petName);
38
- const owner = require_registry_impl.OwnerRecord.fromSignedXidUr(options.xidDocument, petName);
37
+ const owner = require_registry_index.OwnerRecord.fromSignedXidUr(options.xidDocument, petName);
39
38
  const path = participantsFilePath(options.registryPath, cwd);
40
- const registry = require_registry_impl.Registry.load(path);
39
+ const registry = require_registry_index.Registry.load(path);
41
40
  const outcome = registry.setOwner(owner);
42
- if (outcome === require_registry_impl.OwnerOutcome.AlreadyPresent) console.log("Owner already recorded");
41
+ if (outcome === "already_present") console.log("Owner already recorded");
43
42
  registry.save(path);
44
43
  return { outcome };
45
44
  }
46
-
47
45
  //#endregion
48
46
  //#region src/cmd/registry/participant/add.ts
49
47
  /**
@@ -75,16 +73,15 @@ function normalizePetName(petName) {
75
73
  */
76
74
  function participantAdd(options, cwd) {
77
75
  const petName = normalizePetName(options.petName);
78
- const participant = require_registry_impl.ParticipantRecord.fromSignedXidUr(options.xidDocument, petName);
76
+ const participant = require_registry_index.ParticipantRecord.fromSignedXidUr(options.xidDocument, petName);
79
77
  const xid = participant.xid();
80
78
  const path = participantsFilePath(options.registryPath, cwd);
81
- const registry = require_registry_impl.Registry.load(path);
79
+ const registry = require_registry_index.Registry.load(path);
82
80
  const outcome = registry.addParticipant(xid, participant);
83
- if (outcome === require_registry_impl.AddOutcome.AlreadyPresent) console.log("Participant already recorded");
84
- else if (outcome === require_registry_impl.AddOutcome.Inserted) registry.save(path);
81
+ if (outcome === "already_present") console.log("Participant already recorded");
82
+ else if (outcome === "inserted") registry.save(path);
85
83
  return { outcome };
86
84
  }
87
-
88
85
  //#endregion
89
86
  //#region src/cmd/registry/index.ts
90
87
  /**
@@ -152,24 +149,24 @@ function isDirectoryHint(input, pathStr) {
152
149
  function endsWithSeparator(input) {
153
150
  return input.endsWith("/") || input.endsWith("\\");
154
151
  }
155
-
156
152
  //#endregion
157
- Object.defineProperty(exports, 'ownerSet', {
158
- enumerable: true,
159
- get: function () {
160
- return ownerSet;
161
- }
153
+ Object.defineProperty(exports, "ownerSet", {
154
+ enumerable: true,
155
+ get: function() {
156
+ return ownerSet;
157
+ }
162
158
  });
163
- Object.defineProperty(exports, 'participantAdd', {
164
- enumerable: true,
165
- get: function () {
166
- return participantAdd;
167
- }
159
+ Object.defineProperty(exports, "participantAdd", {
160
+ enumerable: true,
161
+ get: function() {
162
+ return participantAdd;
163
+ }
168
164
  });
169
- Object.defineProperty(exports, 'registry_exports', {
170
- enumerable: true,
171
- get: function () {
172
- return registry_exports;
173
- }
165
+ Object.defineProperty(exports, "registry_exports", {
166
+ enumerable: true,
167
+ get: function() {
168
+ return registry_exports;
169
+ }
174
170
  });
175
- //# sourceMappingURL=registry-FMU-ec5K.cjs.map
171
+
172
+ //# sourceMappingURL=registry-loI1_Mh1.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-loI1_Mh1.cjs","names":["normalizePetName","OwnerRecord","Registry","ParticipantRecord","Registry","path","fs"],"sources":["../src/cmd/registry/owner/set.ts","../src/cmd/registry/participant/add.ts","../src/cmd/registry/index.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Registry owner set command.\n *\n * Port of cmd/registry/owner/set.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport { Registry, OwnerRecord, OwnerOutcome } from \"../../../registry/index.js\";\nimport { participantsFilePath } from \"../index.js\";\n\n/**\n * Options for the owner set command.\n */\nexport interface OwnerSetOptions {\n /** Signed ur:xid document containing the owner's XID document (must include private keys) */\n xidDocument: string;\n /** Optional human readable alias for the owner */\n petName?: string | undefined;\n /** Optional registry path or filename override */\n registryPath?: string | undefined;\n}\n\n/**\n * Result of the owner set command.\n */\nexport interface OwnerSetResult {\n outcome: OwnerOutcome;\n}\n\n/**\n * Normalize pet name, trimming whitespace and validating non-empty.\n */\nfunction normalizePetName(petName?: string): string | undefined {\n if (petName === undefined) {\n return undefined;\n }\n\n const trimmed = petName.trim();\n if (trimmed.length === 0) {\n throw new Error(\"Pet name cannot be empty\");\n }\n\n return trimmed;\n}\n\n/**\n * Execute the owner set command.\n *\n * Sets the registry owner using an ur:xid document that includes private keys.\n *\n * Port of `CommandArgs.exec()` from cmd/registry/owner/set.rs.\n */\nexport function ownerSet(options: OwnerSetOptions, cwd: string): OwnerSetResult {\n const petName = normalizePetName(options.petName);\n const owner = OwnerRecord.fromSignedXidUr(options.xidDocument, petName);\n const path = participantsFilePath(options.registryPath, cwd);\n const registry = Registry.load(path);\n\n const outcome = registry.setOwner(owner);\n\n if (outcome === OwnerOutcome.AlreadyPresent) {\n console.log(\"Owner already recorded\");\n }\n\n // Always save to persist pet name updates on existing owner records.\n registry.save(path);\n\n return { outcome };\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Registry participant add command.\n *\n * Port of cmd/registry/participant/add.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport { Registry, ParticipantRecord, AddOutcome } from \"../../../registry/index.js\";\nimport { participantsFilePath } from \"../index.js\";\n\n/**\n * Options for the participant add command.\n */\nexport interface ParticipantAddOptions {\n /** Signed ur:xid document containing the participant's XID document */\n xidDocument: string;\n /** Optional human readable alias */\n petName?: string | undefined;\n /** Optional registry path or filename override */\n registryPath?: string | undefined;\n}\n\n/**\n * Result of the participant add command.\n */\nexport interface ParticipantAddResult {\n outcome: AddOutcome;\n}\n\n/**\n * Normalize pet name, trimming whitespace and validating non-empty.\n */\nfunction normalizePetName(petName?: string): string | undefined {\n if (petName === undefined) {\n return undefined;\n }\n\n const trimmed = petName.trim();\n if (trimmed.length === 0) {\n throw new Error(\"Pet name cannot be empty\");\n }\n\n return trimmed;\n}\n\n/**\n * Execute the participant add command.\n *\n * Adds a participant using an ur:xid document.\n *\n * Port of `CommandArgs.exec()` from cmd/registry/participant/add.rs.\n */\nexport function participantAdd(options: ParticipantAddOptions, cwd: string): ParticipantAddResult {\n const petName = normalizePetName(options.petName);\n const participant = ParticipantRecord.fromSignedXidUr(options.xidDocument, petName);\n const xid = participant.xid();\n const path = participantsFilePath(options.registryPath, cwd);\n const registry = Registry.load(path);\n\n const outcome = registry.addParticipant(xid, participant);\n\n if (outcome === AddOutcome.AlreadyPresent) {\n console.log(\"Participant already recorded\");\n } else if (outcome === AddOutcome.Inserted) {\n registry.save(path);\n }\n\n return { outcome };\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Registry commands.\n *\n * Port of cmd/registry/mod.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport * from \"./owner/index.js\";\nexport * from \"./participant/index.js\";\n\nconst DEFAULT_FILENAME = \"registry.json\";\n\n/**\n * Resolve the participants registry path, defaulting to `registry.json` in the\n * current working directory.\n *\n * Port of `participants_file_path()` from cmd/registry/mod.rs.\n */\nexport function participantsFilePath(registry: string | undefined, cwd: string): string {\n if (registry === undefined) {\n return path.join(cwd, DEFAULT_FILENAME);\n }\n\n return resolveRegistryPath(cwd, DEFAULT_FILENAME, registry);\n}\n\n/**\n * Resolve registry path with smart directory detection.\n *\n * Port of `resolve_registry_path()` from cmd/registry/mod.rs.\n */\nfunction resolveRegistryPath(cwd: string, defaultFilename: string, raw: string): string {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n throw new Error(\"Registry path cannot be empty\");\n }\n\n const provided = trimmed;\n const treatAsDirectory = isDirectoryHint(trimmed, provided);\n\n let resolved: string;\n if (path.isAbsolute(provided)) {\n resolved = provided;\n } else {\n resolved = path.join(cwd, provided);\n }\n\n if (treatAsDirectory) {\n // Ensure the directory exists\n if (!fs.existsSync(resolved)) {\n fs.mkdirSync(resolved, { recursive: true });\n }\n resolved = path.join(resolved, defaultFilename);\n }\n\n return resolved;\n}\n\n/**\n * Check if the input should be treated as a directory path.\n *\n * Port of `is_directory_hint()` from cmd/registry/mod.rs.\n */\nfunction isDirectoryHint(input: string, pathStr: string): boolean {\n if (endsWithSeparator(input)) {\n return true;\n }\n\n const basename = path.basename(pathStr);\n if (basename === \"\" || basename === \".\" || basename === \"..\") {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if input ends with a path separator.\n *\n * Port of `ends_with_separator()` from cmd/registry/mod.rs.\n */\nfunction endsWithSeparator(input: string): boolean {\n return input.endsWith(\"/\") || input.endsWith(\"\\\\\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAqCA,SAASA,mBAAiB,SAAsC;AAC9D,KAAI,YAAY,KAAA,EACd;CAGF,MAAM,UAAU,QAAQ,MAAM;AAC9B,KAAI,QAAQ,WAAW,EACrB,OAAM,IAAI,MAAM,2BAA2B;AAG7C,QAAO;;;;;;;;;AAUT,SAAgB,SAAS,SAA0B,KAA6B;CAC9E,MAAM,UAAUA,mBAAiB,QAAQ,QAAQ;CACjD,MAAM,QAAQC,uBAAAA,YAAY,gBAAgB,QAAQ,aAAa,QAAQ;CACvE,MAAM,OAAO,qBAAqB,QAAQ,cAAc,IAAI;CAC5D,MAAM,WAAWC,uBAAAA,SAAS,KAAK,KAAK;CAEpC,MAAM,UAAU,SAAS,SAAS,MAAM;AAExC,KAAI,YAAA,kBACF,SAAQ,IAAI,yBAAyB;AAIvC,UAAS,KAAK,KAAK;AAEnB,QAAO,EAAE,SAAS;;;;;;;;;;;;;;;;;;ACnCpB,SAAS,iBAAiB,SAAsC;AAC9D,KAAI,YAAY,KAAA,EACd;CAGF,MAAM,UAAU,QAAQ,MAAM;AAC9B,KAAI,QAAQ,WAAW,EACrB,OAAM,IAAI,MAAM,2BAA2B;AAG7C,QAAO;;;;;;;;;AAUT,SAAgB,eAAe,SAAgC,KAAmC;CAChG,MAAM,UAAU,iBAAiB,QAAQ,QAAQ;CACjD,MAAM,cAAcC,uBAAAA,kBAAkB,gBAAgB,QAAQ,aAAa,QAAQ;CACnF,MAAM,MAAM,YAAY,KAAK;CAC7B,MAAM,OAAO,qBAAqB,QAAQ,cAAc,IAAI;CAC5D,MAAM,WAAWC,uBAAAA,SAAS,KAAK,KAAK;CAEpC,MAAM,UAAU,SAAS,eAAe,KAAK,YAAY;AAEzD,KAAI,YAAA,kBACF,SAAQ,IAAI,+BAA+B;UAClC,YAAA,WACT,UAAS,KAAK,KAAK;AAGrB,QAAO,EAAE,SAAS;;;;;;;;;;;;;;;;;;;;ACtDpB,MAAM,mBAAmB;;;;;;;AAQzB,SAAgB,qBAAqB,UAA8B,KAAqB;AACtF,KAAI,aAAa,KAAA,EACf,QAAOC,UAAK,KAAK,KAAK,iBAAiB;AAGzC,QAAO,oBAAoB,KAAK,kBAAkB,SAAS;;;;;;;AAQ7D,SAAS,oBAAoB,KAAa,iBAAyB,KAAqB;CACtF,MAAM,UAAU,IAAI,MAAM;AAC1B,KAAI,QAAQ,WAAW,EACrB,OAAM,IAAI,MAAM,gCAAgC;CAGlD,MAAM,WAAW;CACjB,MAAM,mBAAmB,gBAAgB,SAAS,SAAS;CAE3D,IAAI;AACJ,KAAIA,UAAK,WAAW,SAAS,CAC3B,YAAW;KAEX,YAAWA,UAAK,KAAK,KAAK,SAAS;AAGrC,KAAI,kBAAkB;AAEpB,MAAI,CAACC,QAAG,WAAW,SAAS,CAC1B,SAAG,UAAU,UAAU,EAAE,WAAW,MAAM,CAAC;AAE7C,aAAWD,UAAK,KAAK,UAAU,gBAAgB;;AAGjD,QAAO;;;;;;;AAQT,SAAS,gBAAgB,OAAe,SAA0B;AAChE,KAAI,kBAAkB,MAAM,CAC1B,QAAO;CAGT,MAAM,WAAWA,UAAK,SAAS,QAAQ;AACvC,KAAI,aAAa,MAAM,aAAa,OAAO,aAAa,KACtD,QAAO;AAGT,QAAO;;;;;;;AAQT,SAAS,kBAAkB,OAAwB;AACjD,QAAO,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,KAAK"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bcts/frost-hubert",
3
- "version": "1.0.0-alpha.21",
3
+ "version": "1.0.0-alpha.23",
4
4
  "type": "module",
5
5
  "description": "FROST DKG and signing using Hubert as the distributed substrate",
6
6
  "license": "BSD-2-Clause-Patent",
@@ -79,30 +79,30 @@
79
79
  "node": ">=18.0.0"
80
80
  },
81
81
  "dependencies": {
82
- "@bcts/components": "^1.0.0-alpha.21",
83
- "@bcts/dcbor": "^1.0.0-alpha.21",
84
- "@bcts/envelope": "^1.0.0-alpha.21",
85
- "@bcts/gstp": "^1.0.0-alpha.21",
86
- "@bcts/hubert": "^1.0.0-alpha.21",
87
- "@bcts/provenance-mark": "^1.0.0-alpha.21",
88
- "@bcts/uniform-resources": "^1.0.0-alpha.21",
89
- "@bcts/xid": "^1.0.0-alpha.21",
82
+ "@bcts/components": "^1.0.0-alpha.23",
83
+ "@bcts/dcbor": "^1.0.0-alpha.23",
84
+ "@bcts/envelope": "^1.0.0-alpha.23",
85
+ "@bcts/gstp": "^1.0.0-alpha.23",
86
+ "@bcts/hubert": "^1.0.0-alpha.23",
87
+ "@bcts/provenance-mark": "^1.0.0-alpha.23",
88
+ "@bcts/uniform-resources": "^1.0.0-alpha.23",
89
+ "@bcts/xid": "^1.0.0-alpha.23",
90
90
  "@frosts/core": "0.2.2-alpha.3",
91
91
  "@frosts/ed25519": "0.2.2-alpha.3",
92
92
  "commander": "^14.0.3"
93
93
  },
94
94
  "devDependencies": {
95
95
  "@bcts/eslint": "^0.1.0",
96
- "@bcts/rand": "^1.0.0-alpha.21",
96
+ "@bcts/rand": "^1.0.0-alpha.23",
97
97
  "@bcts/tsconfig": "^0.1.0",
98
98
  "@eslint/js": "^10.0.1",
99
- "@types/node": "^25.3.2",
100
- "eslint": "^10.0.2",
101
- "prettier": "^3.8.1",
99
+ "@types/node": "^25.6.0",
100
+ "eslint": "^10.2.1",
101
+ "prettier": "^3.8.3",
102
102
  "ts-node": "^10.9.2",
103
- "tsdown": "^0.20.3",
104
- "typedoc": "^0.28.17",
105
- "typescript": "^5.9.3",
106
- "vitest": "^4.0.18"
103
+ "tsdown": "^0.21.0",
104
+ "typedoc": "^0.28.19",
105
+ "typescript": "^6.0.3",
106
+ "vitest": "^4.1.5"
107
107
  }
108
108
  }
@@ -447,7 +447,7 @@ export async function finalize(
447
447
  );
448
448
 
449
449
  // Get the group verifying key
450
- const verifyingKeyBytes = publicKeyPackage.verifyingKey as Uint8Array;
450
+ const verifyingKeyBytes = publicKeyPackage.verifyingKey;
451
451
  const groupVerifyingKey = signingKeyFromVerifying(verifyingKeyBytes);
452
452
 
453
453
  if (isVerbose() || options.verbose === true) {
@@ -11,7 +11,6 @@
11
11
  */
12
12
 
13
13
  import { type ARID, type XID } from "@bcts/components";
14
- import { type Cbor } from "@bcts/dcbor";
15
14
  import { Envelope } from "@bcts/envelope";
16
15
  import { UR } from "@bcts/uniform-resources";
17
16
  import { XIDDocument, XIDVerifySignature } from "@bcts/xid";
@@ -121,7 +120,7 @@ function parseXidEnvelope(input: string): [Envelope, XIDDocument] {
121
120
  throw new Error(`Expected a ur:xid document, found ur:${urType}`);
122
121
  }
123
122
 
124
- const envelopeCbor = ur.cbor() as unknown as Cbor;
123
+ const envelopeCbor = ur.cbor();
125
124
  // Try tagged CBOR first, then untagged
126
125
  let envelope: Envelope;
127
126
  try {
@@ -61,7 +61,7 @@ export type DkgRound2SecretPackage = keys.dkg.round2.SecretPackage;
61
61
  */
62
62
  export class SecureRng implements RandomSource {
63
63
  fill(array: Uint8Array): void {
64
- globalThis.crypto.getRandomValues(array);
64
+ globalThis.crypto.getRandomValues(array as Uint8Array<ArrayBuffer>);
65
65
  }
66
66
  }
67
67
 
@@ -11,7 +11,6 @@
11
11
  */
12
12
 
13
13
  import { type XID } from "@bcts/components";
14
- import { type Cbor } from "@bcts/dcbor";
15
14
  import { Envelope } from "@bcts/envelope";
16
15
  import { UR } from "@bcts/uniform-resources";
17
16
  import { XIDDocument, XIDVerifySignature } from "@bcts/xid";
@@ -123,7 +122,7 @@ function parseRelaxedXidDocument(xidDocumentUr: string): [string, XIDDocument] {
123
122
  throw new Error(`Expected a ur:xid document, found ur:${ur.urTypeStr()}`);
124
123
  }
125
124
 
126
- const envelopeCbor = ur.cbor() as unknown as Cbor;
125
+ const envelopeCbor = ur.cbor();
127
126
  let envelope: Envelope;
128
127
  try {
129
128
  envelope = Envelope.fromTaggedCbor(envelopeCbor);
@@ -11,7 +11,6 @@
11
11
  */
12
12
 
13
13
  import { type PublicKeys, type XID } from "@bcts/components";
14
- import { type Cbor } from "@bcts/dcbor";
15
14
  import { Envelope } from "@bcts/envelope";
16
15
  import { UR } from "@bcts/uniform-resources";
17
16
  import { XIDDocument, XIDVerifySignature } from "@bcts/xid";
@@ -163,7 +162,7 @@ function parseSignedXidDocument(xidDocumentUr: string): [string, XIDDocument] {
163
162
  throw new Error(`Expected a ur:xid document, found ur:${ur.urTypeStr()}`);
164
163
  }
165
164
 
166
- const envelopeCbor = ur.cbor() as unknown as Cbor;
165
+ const envelopeCbor = ur.cbor();
167
166
  let envelope: Envelope;
168
167
  try {
169
168
  envelope = Envelope.fromTaggedCbor(envelopeCbor);