@bcts/frost-hubert 1.0.0-beta.1 → 1.0.0-beta.2

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 (110) hide show
  1. package/dist/bin/frost.cjs +16 -16
  2. package/dist/bin/frost.cjs.map +1 -1
  3. package/dist/bin/frost.mjs +16 -16
  4. package/dist/bin/frost.mjs.map +1 -1
  5. package/dist/cmd/index.cjs +3 -3
  6. package/dist/cmd/index.mjs +3 -3
  7. package/dist/{cmd-CCVhHzG7.cjs → cmd-Cd5Bmjy8.cjs} +26 -26
  8. package/dist/{cmd-DNsHd19v.mjs.map → cmd-Cd5Bmjy8.cjs.map} +1 -1
  9. package/dist/{cmd-DNsHd19v.mjs → cmd-ChW3eHA8.mjs} +20 -20
  10. package/dist/{cmd-CCVhHzG7.cjs.map → cmd-ChW3eHA8.mjs.map} +1 -1
  11. package/dist/{common-DNrD_-EI.mjs → common--IfAHVkl.mjs} +2 -2
  12. package/dist/{common-DNrD_-EI.mjs.map → common--IfAHVkl.mjs.map} +1 -1
  13. package/dist/{common-CnvAUC2b.cjs → common-3msAx7hO.cjs} +3 -3
  14. package/dist/{common-CnvAUC2b.cjs.map → common-3msAx7hO.cjs.map} +1 -1
  15. package/dist/{common-Cf1UvJaP.mjs → common-4spC1kNw.mjs} +2 -2
  16. package/dist/{common-Cf1UvJaP.mjs.map → common-4spC1kNw.mjs.map} +1 -1
  17. package/dist/{common-7-BOgaTt.cjs → common-CeTqMwj0.cjs} +2 -2
  18. package/dist/{common-7-BOgaTt.cjs.map → common-CeTqMwj0.cjs.map} +1 -1
  19. package/dist/dkg/index.cjs.map +1 -1
  20. package/dist/dkg/index.mjs.map +1 -1
  21. package/dist/{finalize-BpC0rz93.mjs → finalize-BAwtGCQW.mjs} +4 -4
  22. package/dist/{finalize-BpC0rz93.mjs.map → finalize-BAwtGCQW.mjs.map} +1 -1
  23. package/dist/{finalize-Cb0obTSo.cjs → finalize-BUUNWqKC.cjs} +7 -7
  24. package/dist/{finalize-Cb0obTSo.cjs.map → finalize-BUUNWqKC.cjs.map} +1 -1
  25. package/dist/{finalize-DtRxHZ7H.mjs → finalize-Bm5RZIox.mjs} +3 -3
  26. package/dist/{finalize-DtRxHZ7H.mjs.map → finalize-Bm5RZIox.mjs.map} +1 -1
  27. package/dist/{finalize-T83Ko8nG.mjs → finalize-CELJsR4C.mjs} +4 -4
  28. package/dist/{finalize-T83Ko8nG.mjs.map → finalize-CELJsR4C.mjs.map} +1 -1
  29. package/dist/{finalize-DQ0VGUHO.cjs → finalize-D091kTVy.cjs} +7 -7
  30. package/dist/{finalize-DQ0VGUHO.cjs.map → finalize-D091kTVy.cjs.map} +1 -1
  31. package/dist/{finalize-DHEnKobp.cjs → finalize-SzzTi9BL.cjs} +6 -6
  32. package/dist/{finalize-DHEnKobp.cjs.map → finalize-SzzTi9BL.cjs.map} +1 -1
  33. package/dist/frost/index.cjs +2 -2
  34. package/dist/frost/index.cjs.map +1 -1
  35. package/dist/frost/index.d.cts.map +1 -1
  36. package/dist/frost/index.d.mts.map +1 -1
  37. package/dist/frost/index.mjs +1 -1
  38. package/dist/frost/index.mjs.map +1 -1
  39. package/dist/index-BErX9AZF.d.cts.map +1 -1
  40. package/dist/index-BaUVw4b1.d.mts.map +1 -1
  41. package/dist/index-CD50Qtgw.d.cts.map +1 -1
  42. package/dist/index-CD50Qtgw.d.mts.map +1 -1
  43. package/dist/index-Drklne-Y.d.mts.map +1 -1
  44. package/dist/index-gkmZzEuD.d.cts.map +1 -1
  45. package/dist/index.cjs +3 -3
  46. package/dist/index.d.cts.map +1 -1
  47. package/dist/index.d.mts.map +1 -1
  48. package/dist/index.mjs +3 -3
  49. package/dist/{invite-BLwtexAu.cjs → invite-5sYctfsS.cjs} +6 -6
  50. package/dist/{invite-BLwtexAu.cjs.map → invite-5sYctfsS.cjs.map} +1 -1
  51. package/dist/{invite-D8mQSnFz.mjs → invite-DNlTkwzM.mjs} +4 -4
  52. package/dist/{invite-D8mQSnFz.mjs.map → invite-DNlTkwzM.mjs.map} +1 -1
  53. package/dist/{invite-1tzg0B0P.cjs → invite-T3L4N2m0.cjs} +7 -7
  54. package/dist/{invite-1tzg0B0P.cjs.map → invite-T3L4N2m0.cjs.map} +1 -1
  55. package/dist/{invite-Be2v2SVc.mjs → invite-vRv9LMEE.mjs} +3 -3
  56. package/dist/{invite-Be2v2SVc.mjs.map → invite-vRv9LMEE.mjs.map} +1 -1
  57. package/dist/parallel-PZiwHZT8.mjs.map +1 -1
  58. package/dist/parallel-szwYx-bi.cjs.map +1 -1
  59. package/dist/proposed-participant-BvHNnpcZ.cjs.map +1 -1
  60. package/dist/proposed-participant-Detb823_.mjs.map +1 -1
  61. package/dist/{receive-g8EhZF2Y.mjs → receive-Bzn87ahI.mjs} +4 -4
  62. package/dist/{receive-g8EhZF2Y.mjs.map → receive-Bzn87ahI.mjs.map} +1 -1
  63. package/dist/{receive-dkSCSGpl.mjs → receive-C2Dwb_FQ.mjs} +4 -4
  64. package/dist/{receive-dkSCSGpl.mjs.map → receive-C2Dwb_FQ.mjs.map} +1 -1
  65. package/dist/{receive-D_r4Mryr.cjs → receive-Coqg6eFx.cjs} +7 -7
  66. package/dist/{receive-D_r4Mryr.cjs.map → receive-Coqg6eFx.cjs.map} +1 -1
  67. package/dist/{receive-BR-knnGv.cjs → receive-DZARudBa.cjs} +7 -7
  68. package/dist/{receive-BR-knnGv.cjs.map → receive-DZARudBa.cjs.map} +1 -1
  69. package/dist/registry/index.cjs +3 -3
  70. package/dist/registry/index.cjs.map +1 -1
  71. package/dist/registry/index.mjs.map +1 -1
  72. package/dist/{registry-CkIbA7nt.cjs → registry-D-rFKk9R.cjs} +5 -5
  73. package/dist/{registry-CkIbA7nt.cjs.map → registry-D-rFKk9R.cjs.map} +1 -1
  74. package/dist/{registry-DGjs4qDK.mjs → registry-ycylEdoc.mjs} +2 -2
  75. package/dist/{registry-DGjs4qDK.mjs.map → registry-ycylEdoc.mjs.map} +1 -1
  76. package/dist/{round1-D8t7EzIo.mjs → round1-BRgDPU4Y.mjs} +4 -4
  77. package/dist/{round1-D8t7EzIo.mjs.map → round1-BRgDPU4Y.mjs.map} +1 -1
  78. package/dist/{round1-CXkXoVQU.cjs → round1-BwNBKLYm.cjs} +8 -8
  79. package/dist/{round1-CXkXoVQU.cjs.map → round1-BwNBKLYm.cjs.map} +1 -1
  80. package/dist/{round1-9FAqFvL5.cjs → round1-C1IlXH-9.cjs} +6 -6
  81. package/dist/{round1-9FAqFvL5.cjs.map → round1-C1IlXH-9.cjs.map} +1 -1
  82. package/dist/{round1-DriPu15x.cjs → round1-CEbz7cnL.cjs} +8 -8
  83. package/dist/{round1-DriPu15x.cjs.map → round1-CEbz7cnL.cjs.map} +1 -1
  84. package/dist/{round1-B8haiMM8.mjs → round1-DL4N2QJ5.mjs} +5 -5
  85. package/dist/{round1-B8haiMM8.mjs.map → round1-DL4N2QJ5.mjs.map} +1 -1
  86. package/dist/{round1-BOIE1E4O.mjs → round1-DSaOFCar.mjs} +3 -3
  87. package/dist/{round1-BOIE1E4O.mjs.map → round1-DSaOFCar.mjs.map} +1 -1
  88. package/dist/{round1-Y2kcVwnR.mjs → round1-_fHip4H1.mjs} +5 -5
  89. package/dist/{round1-Y2kcVwnR.mjs.map → round1-_fHip4H1.mjs.map} +1 -1
  90. package/dist/{round1-Bq0vweyQ.cjs → round1-ek-G6qVi.cjs} +7 -7
  91. package/dist/{round1-Bq0vweyQ.cjs.map → round1-ek-G6qVi.cjs.map} +1 -1
  92. package/dist/{round2-Dk_w97nl.cjs → round2-BD_0N7Ab.cjs} +6 -6
  93. package/dist/{round2-Dk_w97nl.cjs.map → round2-BD_0N7Ab.cjs.map} +1 -1
  94. package/dist/{round2-Z2JhMwxc.mjs → round2-BLOgZeAo.mjs} +4 -4
  95. package/dist/{round2-Z2JhMwxc.mjs.map → round2-BLOgZeAo.mjs.map} +1 -1
  96. package/dist/{round2-BHQKVJFo.cjs → round2-C684Nir0.cjs} +7 -7
  97. package/dist/{round2-BHQKVJFo.cjs.map → round2-C684Nir0.cjs.map} +1 -1
  98. package/dist/{round2-mF6UlkT-.mjs → round2-CU-yTXHT.mjs} +4 -4
  99. package/dist/{round2-mF6UlkT-.mjs.map → round2-CU-yTXHT.mjs.map} +1 -1
  100. package/dist/{round2-BfetYacV.mjs → round2-Cq2SD6F8.mjs} +3 -3
  101. package/dist/{round2-BfetYacV.mjs.map → round2-Cq2SD6F8.mjs.map} +1 -1
  102. package/dist/{round2-AMDYMUIg.cjs → round2-D8l1PUm5.cjs} +7 -7
  103. package/dist/{round2-AMDYMUIg.cjs.map → round2-D8l1PUm5.cjs.map} +1 -1
  104. package/dist/{round2-CvrmylN1.cjs → round2-DhdFarwY.cjs} +7 -7
  105. package/dist/{round2-CvrmylN1.cjs.map → round2-DhdFarwY.cjs.map} +1 -1
  106. package/dist/{round2-Cf5CJc_8.mjs → round2-DmQvJDVj.mjs} +4 -4
  107. package/dist/{round2-Cf5CJc_8.mjs.map → round2-DmQvJDVj.mjs.map} +1 -1
  108. package/package.json +16 -16
  109. /package/dist/{chunk-DakpK96I.cjs → rolldown-runtime-DakpK96I.cjs} +0 -0
  110. /package/dist/{chunk-z9aeyW2b.mjs → rolldown-runtime-z9aeyW2b.mjs} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"proposed-participant-Detb823_.mjs","names":[],"sources":["../src/dkg/proposed-participant.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * DKG Proposed Participant.\n *\n * Port of dkg/proposed_participant.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport { type ARID, 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 * A proposed participant in a DKG session.\n *\n * Port of `struct DkgProposedParticipant` from proposed_participant.rs lines 8-13.\n */\nexport class DkgProposedParticipant {\n private readonly _urString: string;\n private readonly _envelope: Envelope;\n private readonly _document: XIDDocument;\n private readonly _responseArid: ARID;\n\n private constructor(\n urString: string,\n envelope: Envelope,\n document: XIDDocument,\n responseArid: ARID,\n ) {\n this._urString = urString;\n this._envelope = envelope;\n this._document = document;\n this._responseArid = responseArid;\n }\n\n /**\n * Create a new DkgProposedParticipant from a UR string and response ARID.\n *\n * Port of `DkgProposedParticipant::new()` from proposed_participant.rs lines 22-26.\n */\n static create(urString: string, responseArid: ARID): DkgProposedParticipant {\n const [envelope, document] = parseXidEnvelope(urString);\n return new DkgProposedParticipant(urString, envelope, document, responseArid);\n }\n\n /**\n * Get the XID of this participant.\n *\n * Port of `DkgProposedParticipant::xid()` from proposed_participant.rs line 28.\n */\n xid(): XID {\n return this._document.xid();\n }\n\n /**\n * Get the XID document of this participant.\n *\n * Port of `DkgProposedParticipant::xid_document()` from proposed_participant.rs line 30.\n */\n xidDocument(): XIDDocument {\n return this._document;\n }\n\n /**\n * Get the UR string of the XID document.\n *\n * Port of `DkgProposedParticipant::xid_document_ur()` from proposed_participant.rs line 32.\n */\n xidDocumentUr(): string {\n return this._urString;\n }\n\n /**\n * Get the envelope containing the XID document.\n *\n * Port of `DkgProposedParticipant::xid_document_envelope()` from proposed_participant.rs line 34.\n */\n xidDocumentEnvelope(): Envelope {\n return this._envelope;\n }\n\n /**\n * Get the response ARID for this participant.\n *\n * Port of `DkgProposedParticipant::response_arid()` from proposed_participant.rs line 36.\n */\n responseArid(): ARID {\n return this._responseArid;\n }\n\n /**\n * Compare participants by XID for sorting.\n *\n * Mirrors Rust `PartialOrd::partial_cmp` which uses\n * `self.xid().cmp(&other.xid())` — i.e. the underlying 32-byte XID\n * data is compared lexicographically (`Vec<u8>` ordering). The\n * earlier port used `xid.toString().localeCompare(...)`, which (a)\n * compares the UR-encoded base32-ish string, not the bytes, and (b)\n * is locale-aware. Sorting on UR strings differs from the byte\n * order whenever the underlying bytes contain values ≥ 0x80, so\n * Rust and TS would assign different FROST identifiers to the same\n * participant set — producing different secret shares.\n */\n compareTo(other: DkgProposedParticipant): number {\n return compareXidBytes(this.xid().toData(), other.xid().toData());\n }\n}\n\n/**\n * Lexicographic byte compare matching Rust's `Vec<u8>::cmp` /\n * `XID::cmp`. Exported so the cmd-tree call sites (round1 / finalize)\n * can use the same comparator when they sort deduplicated XID lists.\n *\n * `XID` is exactly 32 bytes so this only ever compares two equal-length\n * inputs; the length-tiebreak branch mirrors the generic `Ord` impl on\n * `Vec<u8>` and is included for correctness if ever applied to other\n * byte sequences.\n *\n * @internal\n */\nexport function compareXidBytes(a: Uint8Array, b: Uint8Array): number {\n const minLen = Math.min(a.length, b.length);\n for (let i = 0; i < minLen; i++) {\n if (a[i] !== b[i]) return a[i] < b[i] ? -1 : 1;\n }\n if (a.length !== b.length) return a.length < b.length ? -1 : 1;\n return 0;\n}\n\n/**\n * Parse a XID envelope from a UR string.\n *\n * Port of `parse_xid_envelope()` from proposed_participant.rs lines 39-60.\n */\nfunction parseXidEnvelope(input: string): [Envelope, XIDDocument] {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n throw new Error(\"XID document is required\");\n }\n\n const ur = UR.fromURString(trimmed);\n const urType = ur.urTypeStr();\n if (urType !== \"xid\" && urType !== \"envelope\") {\n throw new Error(`Expected a ur:xid document, found ur:${urType}`);\n }\n\n const envelopeCbor = ur.cbor();\n // Try tagged CBOR first, then untagged\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 [envelope, document];\n}\n"],"mappings":";;;;;;;;;AAsBA,IAAa,yBAAb,MAAa,uBAAuB;CAClC;CACA;CACA;CACA;CAEA,YACE,UACA,UACA,UACA,cACA;EACA,KAAK,YAAY;EACjB,KAAK,YAAY;EACjB,KAAK,YAAY;EACjB,KAAK,gBAAgB;CACvB;;;;;;CAOA,OAAO,OAAO,UAAkB,cAA4C;EAC1E,MAAM,CAAC,UAAU,YAAY,iBAAiB,QAAQ;EACtD,OAAO,IAAI,uBAAuB,UAAU,UAAU,UAAU,YAAY;CAC9E;;;;;;CAOA,MAAW;EACT,OAAO,KAAK,UAAU,IAAI;CAC5B;;;;;;CAOA,cAA2B;EACzB,OAAO,KAAK;CACd;;;;;;CAOA,gBAAwB;EACtB,OAAO,KAAK;CACd;;;;;;CAOA,sBAAgC;EAC9B,OAAO,KAAK;CACd;;;;;;CAOA,eAAqB;EACnB,OAAO,KAAK;CACd;;;;;;;;;;;;;;CAeA,UAAU,OAAuC;EAC/C,OAAO,gBAAgB,KAAK,IAAI,EAAE,OAAO,GAAG,MAAM,IAAI,EAAE,OAAO,CAAC;CAClE;AACF;;;;;;;;;;;;;AAcA,SAAgB,gBAAgB,GAAe,GAAuB;CACpE,MAAM,SAAS,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM;CAC1C,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAC1B,IAAI,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,KAAK,EAAE,KAAK,KAAK;CAE/C,IAAI,EAAE,WAAW,EAAE,QAAQ,OAAO,EAAE,SAAS,EAAE,SAAS,KAAK;CAC7D,OAAO;AACT;;;;;;AAOA,SAAS,iBAAiB,OAAwC;CAChE,MAAM,UAAU,MAAM,KAAK;CAC3B,IAAI,QAAQ,WAAW,GACrB,MAAM,IAAI,MAAM,0BAA0B;CAG5C,MAAM,KAAK,GAAG,aAAa,OAAO;CAClC,MAAM,SAAS,GAAG,UAAU;CAC5B,IAAI,WAAW,SAAS,WAAW,YACjC,MAAM,IAAI,MAAM,wCAAwC,QAAQ;CAGlE,MAAM,eAAe,GAAG,KAAK;CAE7B,IAAI;CACJ,IAAI;EACF,WAAW,SAAS,eAAe,YAAY;CACjD,QAAQ;EACN,WAAW,SAAS,iBAAiB,YAAY;CACnD;CAEA,MAAM,WAAW,YAAY,aAAa,UAAU,KAAA,GAAW,mBAAmB,SAAS;CAE3F,OAAO,CAAC,UAAU,QAAQ;AAC5B"}
1
+ {"version":3,"file":"proposed-participant-Detb823_.mjs","names":[],"sources":["../src/dkg/proposed-participant.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * DKG Proposed Participant.\n *\n * Port of dkg/proposed_participant.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport { type ARID, 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 * A proposed participant in a DKG session.\n *\n * Port of `struct DkgProposedParticipant` from proposed_participant.rs lines 8-13.\n */\nexport class DkgProposedParticipant {\n private readonly _urString: string;\n private readonly _envelope: Envelope;\n private readonly _document: XIDDocument;\n private readonly _responseArid: ARID;\n\n private constructor(\n urString: string,\n envelope: Envelope,\n document: XIDDocument,\n responseArid: ARID,\n ) {\n this._urString = urString;\n this._envelope = envelope;\n this._document = document;\n this._responseArid = responseArid;\n }\n\n /**\n * Create a new DkgProposedParticipant from a UR string and response ARID.\n *\n * Port of `DkgProposedParticipant::new()` from proposed_participant.rs lines 22-26.\n */\n static create(urString: string, responseArid: ARID): DkgProposedParticipant {\n const [envelope, document] = parseXidEnvelope(urString);\n return new DkgProposedParticipant(urString, envelope, document, responseArid);\n }\n\n /**\n * Get the XID of this participant.\n *\n * Port of `DkgProposedParticipant::xid()` from proposed_participant.rs line 28.\n */\n xid(): XID {\n return this._document.xid();\n }\n\n /**\n * Get the XID document of this participant.\n *\n * Port of `DkgProposedParticipant::xid_document()` from proposed_participant.rs line 30.\n */\n xidDocument(): XIDDocument {\n return this._document;\n }\n\n /**\n * Get the UR string of the XID document.\n *\n * Port of `DkgProposedParticipant::xid_document_ur()` from proposed_participant.rs line 32.\n */\n xidDocumentUr(): string {\n return this._urString;\n }\n\n /**\n * Get the envelope containing the XID document.\n *\n * Port of `DkgProposedParticipant::xid_document_envelope()` from proposed_participant.rs line 34.\n */\n xidDocumentEnvelope(): Envelope {\n return this._envelope;\n }\n\n /**\n * Get the response ARID for this participant.\n *\n * Port of `DkgProposedParticipant::response_arid()` from proposed_participant.rs line 36.\n */\n responseArid(): ARID {\n return this._responseArid;\n }\n\n /**\n * Compare participants by XID for sorting.\n *\n * Mirrors Rust `PartialOrd::partial_cmp` which uses\n * `self.xid().cmp(&other.xid())` — i.e. the underlying 32-byte XID\n * data is compared lexicographically (`Vec<u8>` ordering). The\n * earlier port used `xid.toString().localeCompare(...)`, which (a)\n * compares the UR-encoded base32-ish string, not the bytes, and (b)\n * is locale-aware. Sorting on UR strings differs from the byte\n * order whenever the underlying bytes contain values ≥ 0x80, so\n * Rust and TS would assign different FROST identifiers to the same\n * participant set — producing different secret shares.\n */\n compareTo(other: DkgProposedParticipant): number {\n return compareXidBytes(this.xid().toData(), other.xid().toData());\n }\n}\n\n/**\n * Lexicographic byte compare matching Rust's `Vec<u8>::cmp` /\n * `XID::cmp`. Exported so the cmd-tree call sites (round1 / finalize)\n * can use the same comparator when they sort deduplicated XID lists.\n *\n * `XID` is exactly 32 bytes so this only ever compares two equal-length\n * inputs; the length-tiebreak branch mirrors the generic `Ord` impl on\n * `Vec<u8>` and is included for correctness if ever applied to other\n * byte sequences.\n *\n * @internal\n */\nexport function compareXidBytes(a: Uint8Array, b: Uint8Array): number {\n const minLen = Math.min(a.length, b.length);\n for (let i = 0; i < minLen; i++) {\n if (a[i] !== b[i]) return a[i] < b[i] ? -1 : 1;\n }\n if (a.length !== b.length) return a.length < b.length ? -1 : 1;\n return 0;\n}\n\n/**\n * Parse a XID envelope from a UR string.\n *\n * Port of `parse_xid_envelope()` from proposed_participant.rs lines 39-60.\n */\nfunction parseXidEnvelope(input: string): [Envelope, XIDDocument] {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n throw new Error(\"XID document is required\");\n }\n\n const ur = UR.fromURString(trimmed);\n const urType = ur.urTypeStr();\n if (urType !== \"xid\" && urType !== \"envelope\") {\n throw new Error(`Expected a ur:xid document, found ur:${urType}`);\n }\n\n const envelopeCbor = ur.cbor();\n // Try tagged CBOR first, then untagged\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 [envelope, document];\n}\n"],"mappings":";;;;;;;;;AAsBA,IAAa,yBAAb,MAAa,uBAAuB;CAClC;CACA;CACA;CACA;CAEA,YACE,UACA,UACA,UACA,cACA;EACA,KAAK,YAAY;EACjB,KAAK,YAAY;EACjB,KAAK,YAAY;EACjB,KAAK,gBAAgB;CACvB;;;;;;CAOA,OAAO,OAAO,UAAkB,cAA4C;EAC1E,MAAM,CAAC,UAAU,YAAY,iBAAiB,QAAQ;EACtD,OAAO,IAAI,uBAAuB,UAAU,UAAU,UAAU,YAAY;CAC9E;;;;;;CAOA,MAAW;EACT,OAAO,KAAK,UAAU,IAAI;CAC5B;;;;;;CAOA,cAA2B;EACzB,OAAO,KAAK;CACd;;;;;;CAOA,gBAAwB;EACtB,OAAO,KAAK;CACd;;;;;;CAOA,sBAAgC;EAC9B,OAAO,KAAK;CACd;;;;;;CAOA,eAAqB;EACnB,OAAO,KAAK;CACd;;;;;;;;;;;;;;CAeA,UAAU,OAAuC;EAC/C,OAAO,gBAAgB,KAAK,IAAI,CAAC,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC;CAClE;AACF;;;;;;;;;;;;;AAcA,SAAgB,gBAAgB,GAAe,GAAuB;CACpE,MAAM,SAAS,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM;CAC1C,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAC1B,IAAI,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,KAAK,EAAE,KAAK,KAAK;CAE/C,IAAI,EAAE,WAAW,EAAE,QAAQ,OAAO,EAAE,SAAS,EAAE,SAAS,KAAK;CAC7D,OAAO;AACT;;;;;;AAOA,SAAS,iBAAiB,OAAwC;CAChE,MAAM,UAAU,MAAM,KAAK;CAC3B,IAAI,QAAQ,WAAW,GACrB,MAAM,IAAI,MAAM,0BAA0B;CAG5C,MAAM,KAAK,GAAG,aAAa,OAAO;CAClC,MAAM,SAAS,GAAG,UAAU;CAC5B,IAAI,WAAW,SAAS,WAAW,YACjC,MAAM,IAAI,MAAM,wCAAwC,QAAQ;CAGlE,MAAM,eAAe,GAAG,KAAK;CAE7B,IAAI;CACJ,IAAI;EACF,WAAW,SAAS,eAAe,YAAY;CACjD,QAAQ;EACN,WAAW,SAAS,iBAAiB,YAAY;CACnD;CAEA,MAAM,WAAW,YAAY,aAAa,UAAU,KAAA,GAAW,mBAAmB,SAAS;CAE3F,OAAO,CAAC,UAAU,QAAQ;AAC5B"}
@@ -1,9 +1,9 @@
1
- import { n as __require, t as __exportAll } from "./chunk-z9aeyW2b.mjs";
1
+ import { n as __require, t as __exportAll } from "./rolldown-runtime-z9aeyW2b.mjs";
2
2
  import { n as compareXidBytes } from "./proposed-participant-Detb823_.mjs";
3
3
  import { Registry, resolveRegistryPath } from "./registry/index.mjs";
4
- import { c as parseAridUr, l as parseEnvelopeUr, o as formatNameWithOwnerMarker } from "./common-Cf1UvJaP.mjs";
4
+ import { c as parseAridUr, l as parseEnvelopeUr, o as formatNameWithOwnerMarker } from "./common-4spC1kNw.mjs";
5
5
  import { t as getWithIndicator } from "./busy-BlU8_pS2.mjs";
6
- import { n as signingStateDir } from "./common-DNrD_-EI.mjs";
6
+ import { n as signingStateDir } from "./common--IfAHVkl.mjs";
7
7
  import { CborDate } from "@bcts/dcbor";
8
8
  import * as fs from "node:fs";
9
9
  import * as path from "node:path";
@@ -174,4 +174,4 @@ async function receive(client, selection, options, cwd) {
174
174
  //#endregion
175
175
  export { receive_exports as n, receive as t };
176
176
 
177
- //# sourceMappingURL=receive-g8EhZF2Y.mjs.map
177
+ //# sourceMappingURL=receive-Bzn87ahI.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"receive-g8EhZF2Y.mjs","names":[],"sources":["../src/cmd/sign/participant/receive.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Sign participant receive command.\n *\n * Port of cmd/sign/participant/receive.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\";\nimport { compareXidBytes } from \"../../../dkg/proposed-participant.js\";\nimport { CborDate } from \"@bcts/dcbor\";\nimport type { Envelope } from \"@bcts/envelope\";\n\nimport { Registry, resolveRegistryPath, type OwnerRecord } from \"../../../registry/index.js\";\nimport { getWithIndicator } from \"../../busy.js\";\nimport { type StorageClient, type StorageSelection } from \"../../storage.js\";\nimport { parseAridUr, parseEnvelopeUr, formatNameWithOwnerMarker } from \"../../dkg/common.js\";\nimport { signingStateDir } from \"../common.js\";\n\n/**\n * Options for the sign receive command.\n */\nexport interface SignReceiveOptions {\n registryPath?: string;\n /** ARID or envelope UR string */\n request: string;\n timeoutSeconds?: number;\n /** Show request details only (info mode) */\n info?: boolean;\n /** Expected sender (XID UR or pet name) */\n sender?: string;\n}\n\n/**\n * Result of the sign receive command.\n */\nexport interface SignReceiveResult {\n sessionId: string;\n groupId: string;\n targetUr: string;\n coordinatorName: string;\n minSigners: number;\n participantNames: string[];\n}\n\n/**\n * Resolve sender from XID UR or pet name in registry.\n *\n * Port of `resolve_sender()` from cmd/dkg/common.rs lines 76-94.\n */\nfunction resolveSenderFromInput(registry: Registry, input: string): { xid: () => XID } {\n const trimmed = input.trim();\n if (trimmed === \"\") {\n throw new Error(\"Sender is required\");\n }\n\n // Try parsing as XID UR first\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-require-imports, no-undef\n const { XID: XIDClass } = require(\"@bcts/components\");\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n const xid = XIDClass.fromURString(trimmed) as XID;\n const record = registry.participant(xid);\n if (!record) {\n throw new Error(`Sender with XID ${xid.urString()} not found`);\n }\n return record.xidDocument();\n } catch {\n // Try looking up by pet name\n const result = registry.participantByPetName(trimmed);\n if (!result) {\n throw new Error(`Sender with pet name '${trimmed}' not found`);\n }\n return result[1].xidDocument();\n }\n}\n\n/**\n * Resolve sign invite from ARID or envelope UR.\n *\n * Port of `resolve_sign_request()` from cmd/sign/participant/receive.rs lines 250-284.\n */\nasync function resolveSignInviteEnvelope(\n client: StorageClient | undefined,\n selection: StorageSelection | undefined,\n request: string,\n timeout: number | undefined,\n): Promise<Envelope> {\n if (selection !== undefined && client !== undefined) {\n // Try to parse as ARID\n try {\n const arid = parseAridUr(request);\n const envelope = await getWithIndicator(client, arid, \"Sign invite\", timeout, false);\n if (envelope === undefined || envelope === null) {\n throw new Error(\"signInvite request not found in Hubert storage\");\n }\n return envelope;\n } catch {\n // Not an ARID, try as envelope\n }\n\n if (timeout !== undefined) {\n throw new Error(\"--timeout is only valid when retrieving requests from Hubert\");\n }\n return parseEnvelopeUr(request);\n }\n\n // No storage selection\n try {\n parseAridUr(request);\n throw new Error(\"Hubert storage parameters are required to retrieve requests by ARID\");\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"Hubert storage parameters\")) {\n throw e;\n }\n // Not an ARID, parse as envelope\n }\n return parseEnvelopeUr(request);\n}\n\n/**\n * Get display name for sender from registry.\n *\n * Port of `resolve_sender_name()` from cmd/dkg/common.rs lines 96-116.\n */\nfunction resolveSenderName(registry: Registry, senderXid: XID): string | undefined {\n const owner = registry.owner();\n\n // Check if sender is the owner\n if (owner?.xid().urString() === senderXid.urString()) {\n const name = owner.petName() ?? senderXid.urString();\n return formatNameWithOwnerMarker(name, true);\n }\n\n // Look up in participants\n const record = registry.participant(senderXid);\n if (record) {\n const name = record.petName() ?? record.xid().urString();\n return formatNameWithOwnerMarker(name, false);\n }\n\n return undefined;\n}\n\n/**\n * Format participant names with owner marker.\n *\n * Port of `format_participant_names()` from cmd/sign/participant/receive.rs lines 286-309.\n */\nfunction formatParticipantNames(\n registry: Registry,\n participants: XID[],\n owner: OwnerRecord,\n): string[] {\n return participants.map((xid) => {\n const isOwner = xid.urString() === owner.xid().urString();\n let name: string;\n\n if (isOwner) {\n name = owner.petName() ?? xid.urString();\n } else {\n const record = registry.participant(xid);\n name = record?.petName() ?? xid.urString();\n }\n\n return formatNameWithOwnerMarker(name, isOwner);\n });\n}\n\n/**\n * Execute the sign participant receive command.\n *\n * Fetches and validates a sign invite from the coordinator.\n *\n * Port of `CommandArgs::exec()` from cmd/sign/participant/receive.rs lines 56-247.\n */\nexport async function receive(\n client: StorageClient | undefined,\n selection: StorageSelection | undefined,\n options: SignReceiveOptions,\n cwd: string,\n): Promise<SignReceiveResult> {\n // Validate timeout requires storage\n if (selection === undefined && options.timeoutSeconds !== undefined) {\n throw new Error(\"--timeout requires Hubert storage parameters\");\n }\n\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n const owner = registry.owner();\n\n if (!owner) {\n throw new Error(\"Registry owner with private keys is required\");\n }\n\n // Resolve expected sender if provided\n let expectedSender: { xid: () => XID } | undefined;\n if (options.sender !== undefined && options.sender !== \"\") {\n expectedSender = resolveSenderFromInput(registry, options.sender);\n }\n\n // Resolve the invite envelope\n const envelope = await resolveSignInviteEnvelope(\n client,\n selection,\n options.request,\n options.timeoutSeconds,\n );\n\n const now: CborDate = CborDate.now();\n const recipientKeys = owner.xidDocument().inceptionPrivateKeys();\n\n if (recipientKeys === null || recipientKeys === undefined) {\n throw new Error(\"Owner XID document has no inception private keys\");\n }\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports, no-undef\n const { SealedRequest: SealedRequestClass } = require(\"@bcts/gstp\") as {\n SealedRequest: {\n tryFromEnvelope: (\n envelope: Envelope,\n expectedSender: XID | undefined,\n now: CborDate,\n recipientPrivateKeys: unknown,\n ) => SealedRequestInstance;\n };\n };\n\n interface SealedRequestInstance {\n sender: () => { xid: () => XID };\n function: () => { equals?: (other: unknown) => boolean; toString?: () => string };\n extractObjectForParameter: <T>(name: string) => T;\n objectForParameter: (name: string) => Envelope;\n objectsForParameter: (name: string) => ParticipantEntry[];\n }\n\n interface ParticipantEntry {\n extractSubject: () => XID;\n objectForPredicate: (name: string) => {\n decryptToRecipient: (keys: unknown) => {\n extractSubject: () => ARID;\n };\n };\n }\n\n const sealedRequest: SealedRequestInstance = SealedRequestClass.tryFromEnvelope(\n envelope,\n undefined,\n now,\n recipientKeys,\n );\n\n // Validate sender\n const senderXid = sealedRequest.sender().xid();\n\n if (expectedSender !== undefined) {\n if (senderXid.urString() !== expectedSender.xid().urString()) {\n throw new Error(\n `Request sender does not match expected sender (got ${senderXid.urString()}, expected ${expectedSender.xid().urString()})`,\n );\n }\n } else {\n const knownOwner = owner.xid().urString() === senderXid.urString();\n const knownParticipant = registry.participant(senderXid) !== undefined;\n if (!knownOwner && !knownParticipant) {\n throw new Error(`Request sender not found in registry: ${senderXid.urString()}`);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports, no-undef\n const { Function: FunctionClass } = require(\"@bcts/envelope\") as {\n Function: { from: (name: string) => unknown };\n };\n\n // Validate function\n const requestFunction = sealedRequest.function();\n const expectedFunction = FunctionClass.from(\"signInvite\");\n const functionMatches =\n requestFunction.equals !== undefined\n ? requestFunction.equals(expectedFunction)\n : String(requestFunction) === String(expectedFunction);\n\n if (!functionMatches) {\n throw new Error(`Unexpected request function: ${String(requestFunction)}`);\n }\n\n // Extract parameters\n const validUntil = sealedRequest.extractObjectForParameter<CborDate>(\"validUntil\");\n if (validUntil <= now) {\n throw new Error(\"signInvite request has expired\");\n }\n\n const groupId = sealedRequest.extractObjectForParameter<ARID>(\"group\");\n const sessionId = sealedRequest.extractObjectForParameter<ARID>(\"session\");\n const minSigners = Number(sealedRequest.extractObjectForParameter<bigint | number>(\"minSigners\"));\n\n // Extract participants and find our response ARID\n const participantEntries = sealedRequest.objectsForParameter(\"participant\");\n const participants: XID[] = [];\n let responseArid: ARID | undefined;\n\n for (const entry of participantEntries) {\n const xid: XID = entry.extractSubject();\n if (xid.urString() === owner.xid().urString()) {\n const encryptedArid = entry.objectForPredicate(\"response_arid\");\n const aridEnv = encryptedArid.decryptToRecipient(recipientKeys);\n responseArid = aridEnv.extractSubject();\n }\n participants.push(xid);\n }\n\n // Validations\n if (participants.length === 0) {\n throw new Error(\"signInvite request contains no participants\");\n }\n if (minSigners < 2) {\n throw new Error(\"minSigners must be at least 2\");\n }\n if (minSigners > participants.length) {\n throw new Error(\"minSigners exceeds participant count\");\n }\n\n const ownerInParticipants = participants.some((p) => p.urString() === owner.xid().urString());\n if (!ownerInParticipants) {\n throw new Error(\"signInvite request does not include this participant\");\n }\n\n if (responseArid === undefined) {\n throw new Error(\"signInvite request missing response ARID\");\n }\n\n // Sort participants by XID byte order — mirrors Rust `XID::cmp`.\n // The earlier port used `urString().localeCompare(...)`, which\n // diverges from byte order for bytes ≥ 0x80 and is locale-aware.\n participants.sort((a, b) => compareXidBytes(a.toData(), b.toData()));\n\n const targetEnvelope = sealedRequest.objectForParameter(\"target\");\n\n const coordinatorName = resolveSenderName(registry, senderXid) ?? senderXid.urString();\n const participantNames = formatParticipantNames(registry, participants, owner);\n\n // Output\n console.log(`Group: ${groupId.urString()}`);\n console.log(`Coordinator: ${coordinatorName}`);\n console.log(`Min signers: ${minSigners}`);\n console.log(`Participants: ${participantNames.join(\", \")}`);\n console.log(\"Target:\");\n console.log(targetEnvelope.format());\n\n // Primary output for scripting: session ID on its own line (no header)\n console.log(sessionId.urString());\n\n // Persist request details for follow-up commands\n const stateDir = signingStateDir(registryPath, groupId.hex(), sessionId.hex());\n fs.mkdirSync(stateDir, { recursive: true });\n\n const root: Record<string, unknown> = {\n request_envelope: envelope.urString(),\n group: groupId.urString(),\n session: sessionId.urString(),\n coordinator: senderXid.urString(),\n min_signers: minSigners,\n response_arid: responseArid.urString(),\n participants: participants.map((xid) => xid.urString()),\n target: targetEnvelope.urString(),\n };\n\n fs.writeFileSync(path.join(stateDir, \"sign_receive.json\"), JSON.stringify(root, null, 2));\n\n return {\n sessionId: sessionId.urString(),\n groupId: groupId.urString(),\n targetUr: targetEnvelope.urString(),\n coordinatorName,\n minSigners,\n participantNames,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"receive-Bzn87ahI.mjs","names":[],"sources":["../src/cmd/sign/participant/receive.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Sign participant receive command.\n *\n * Port of cmd/sign/participant/receive.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\";\nimport { compareXidBytes } from \"../../../dkg/proposed-participant.js\";\nimport { CborDate } from \"@bcts/dcbor\";\nimport type { Envelope } from \"@bcts/envelope\";\n\nimport { Registry, resolveRegistryPath, type OwnerRecord } from \"../../../registry/index.js\";\nimport { getWithIndicator } from \"../../busy.js\";\nimport { type StorageClient, type StorageSelection } from \"../../storage.js\";\nimport { parseAridUr, parseEnvelopeUr, formatNameWithOwnerMarker } from \"../../dkg/common.js\";\nimport { signingStateDir } from \"../common.js\";\n\n/**\n * Options for the sign receive command.\n */\nexport interface SignReceiveOptions {\n registryPath?: string;\n /** ARID or envelope UR string */\n request: string;\n timeoutSeconds?: number;\n /** Show request details only (info mode) */\n info?: boolean;\n /** Expected sender (XID UR or pet name) */\n sender?: string;\n}\n\n/**\n * Result of the sign receive command.\n */\nexport interface SignReceiveResult {\n sessionId: string;\n groupId: string;\n targetUr: string;\n coordinatorName: string;\n minSigners: number;\n participantNames: string[];\n}\n\n/**\n * Resolve sender from XID UR or pet name in registry.\n *\n * Port of `resolve_sender()` from cmd/dkg/common.rs lines 76-94.\n */\nfunction resolveSenderFromInput(registry: Registry, input: string): { xid: () => XID } {\n const trimmed = input.trim();\n if (trimmed === \"\") {\n throw new Error(\"Sender is required\");\n }\n\n // Try parsing as XID UR first\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-require-imports, no-undef\n const { XID: XIDClass } = require(\"@bcts/components\");\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n const xid = XIDClass.fromURString(trimmed) as XID;\n const record = registry.participant(xid);\n if (!record) {\n throw new Error(`Sender with XID ${xid.urString()} not found`);\n }\n return record.xidDocument();\n } catch {\n // Try looking up by pet name\n const result = registry.participantByPetName(trimmed);\n if (!result) {\n throw new Error(`Sender with pet name '${trimmed}' not found`);\n }\n return result[1].xidDocument();\n }\n}\n\n/**\n * Resolve sign invite from ARID or envelope UR.\n *\n * Port of `resolve_sign_request()` from cmd/sign/participant/receive.rs lines 250-284.\n */\nasync function resolveSignInviteEnvelope(\n client: StorageClient | undefined,\n selection: StorageSelection | undefined,\n request: string,\n timeout: number | undefined,\n): Promise<Envelope> {\n if (selection !== undefined && client !== undefined) {\n // Try to parse as ARID\n try {\n const arid = parseAridUr(request);\n const envelope = await getWithIndicator(client, arid, \"Sign invite\", timeout, false);\n if (envelope === undefined || envelope === null) {\n throw new Error(\"signInvite request not found in Hubert storage\");\n }\n return envelope;\n } catch {\n // Not an ARID, try as envelope\n }\n\n if (timeout !== undefined) {\n throw new Error(\"--timeout is only valid when retrieving requests from Hubert\");\n }\n return parseEnvelopeUr(request);\n }\n\n // No storage selection\n try {\n parseAridUr(request);\n throw new Error(\"Hubert storage parameters are required to retrieve requests by ARID\");\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"Hubert storage parameters\")) {\n throw e;\n }\n // Not an ARID, parse as envelope\n }\n return parseEnvelopeUr(request);\n}\n\n/**\n * Get display name for sender from registry.\n *\n * Port of `resolve_sender_name()` from cmd/dkg/common.rs lines 96-116.\n */\nfunction resolveSenderName(registry: Registry, senderXid: XID): string | undefined {\n const owner = registry.owner();\n\n // Check if sender is the owner\n if (owner?.xid().urString() === senderXid.urString()) {\n const name = owner.petName() ?? senderXid.urString();\n return formatNameWithOwnerMarker(name, true);\n }\n\n // Look up in participants\n const record = registry.participant(senderXid);\n if (record) {\n const name = record.petName() ?? record.xid().urString();\n return formatNameWithOwnerMarker(name, false);\n }\n\n return undefined;\n}\n\n/**\n * Format participant names with owner marker.\n *\n * Port of `format_participant_names()` from cmd/sign/participant/receive.rs lines 286-309.\n */\nfunction formatParticipantNames(\n registry: Registry,\n participants: XID[],\n owner: OwnerRecord,\n): string[] {\n return participants.map((xid) => {\n const isOwner = xid.urString() === owner.xid().urString();\n let name: string;\n\n if (isOwner) {\n name = owner.petName() ?? xid.urString();\n } else {\n const record = registry.participant(xid);\n name = record?.petName() ?? xid.urString();\n }\n\n return formatNameWithOwnerMarker(name, isOwner);\n });\n}\n\n/**\n * Execute the sign participant receive command.\n *\n * Fetches and validates a sign invite from the coordinator.\n *\n * Port of `CommandArgs::exec()` from cmd/sign/participant/receive.rs lines 56-247.\n */\nexport async function receive(\n client: StorageClient | undefined,\n selection: StorageSelection | undefined,\n options: SignReceiveOptions,\n cwd: string,\n): Promise<SignReceiveResult> {\n // Validate timeout requires storage\n if (selection === undefined && options.timeoutSeconds !== undefined) {\n throw new Error(\"--timeout requires Hubert storage parameters\");\n }\n\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n const owner = registry.owner();\n\n if (!owner) {\n throw new Error(\"Registry owner with private keys is required\");\n }\n\n // Resolve expected sender if provided\n let expectedSender: { xid: () => XID } | undefined;\n if (options.sender !== undefined && options.sender !== \"\") {\n expectedSender = resolveSenderFromInput(registry, options.sender);\n }\n\n // Resolve the invite envelope\n const envelope = await resolveSignInviteEnvelope(\n client,\n selection,\n options.request,\n options.timeoutSeconds,\n );\n\n const now: CborDate = CborDate.now();\n const recipientKeys = owner.xidDocument().inceptionPrivateKeys();\n\n if (recipientKeys === null || recipientKeys === undefined) {\n throw new Error(\"Owner XID document has no inception private keys\");\n }\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports, no-undef\n const { SealedRequest: SealedRequestClass } = require(\"@bcts/gstp\") as {\n SealedRequest: {\n tryFromEnvelope: (\n envelope: Envelope,\n expectedSender: XID | undefined,\n now: CborDate,\n recipientPrivateKeys: unknown,\n ) => SealedRequestInstance;\n };\n };\n\n interface SealedRequestInstance {\n sender: () => { xid: () => XID };\n function: () => { equals?: (other: unknown) => boolean; toString?: () => string };\n extractObjectForParameter: <T>(name: string) => T;\n objectForParameter: (name: string) => Envelope;\n objectsForParameter: (name: string) => ParticipantEntry[];\n }\n\n interface ParticipantEntry {\n extractSubject: () => XID;\n objectForPredicate: (name: string) => {\n decryptToRecipient: (keys: unknown) => {\n extractSubject: () => ARID;\n };\n };\n }\n\n const sealedRequest: SealedRequestInstance = SealedRequestClass.tryFromEnvelope(\n envelope,\n undefined,\n now,\n recipientKeys,\n );\n\n // Validate sender\n const senderXid = sealedRequest.sender().xid();\n\n if (expectedSender !== undefined) {\n if (senderXid.urString() !== expectedSender.xid().urString()) {\n throw new Error(\n `Request sender does not match expected sender (got ${senderXid.urString()}, expected ${expectedSender.xid().urString()})`,\n );\n }\n } else {\n const knownOwner = owner.xid().urString() === senderXid.urString();\n const knownParticipant = registry.participant(senderXid) !== undefined;\n if (!knownOwner && !knownParticipant) {\n throw new Error(`Request sender not found in registry: ${senderXid.urString()}`);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports, no-undef\n const { Function: FunctionClass } = require(\"@bcts/envelope\") as {\n Function: { from: (name: string) => unknown };\n };\n\n // Validate function\n const requestFunction = sealedRequest.function();\n const expectedFunction = FunctionClass.from(\"signInvite\");\n const functionMatches =\n requestFunction.equals !== undefined\n ? requestFunction.equals(expectedFunction)\n : String(requestFunction) === String(expectedFunction);\n\n if (!functionMatches) {\n throw new Error(`Unexpected request function: ${String(requestFunction)}`);\n }\n\n // Extract parameters\n const validUntil = sealedRequest.extractObjectForParameter<CborDate>(\"validUntil\");\n if (validUntil <= now) {\n throw new Error(\"signInvite request has expired\");\n }\n\n const groupId = sealedRequest.extractObjectForParameter<ARID>(\"group\");\n const sessionId = sealedRequest.extractObjectForParameter<ARID>(\"session\");\n const minSigners = Number(sealedRequest.extractObjectForParameter<bigint | number>(\"minSigners\"));\n\n // Extract participants and find our response ARID\n const participantEntries = sealedRequest.objectsForParameter(\"participant\");\n const participants: XID[] = [];\n let responseArid: ARID | undefined;\n\n for (const entry of participantEntries) {\n const xid: XID = entry.extractSubject();\n if (xid.urString() === owner.xid().urString()) {\n const encryptedArid = entry.objectForPredicate(\"response_arid\");\n const aridEnv = encryptedArid.decryptToRecipient(recipientKeys);\n responseArid = aridEnv.extractSubject();\n }\n participants.push(xid);\n }\n\n // Validations\n if (participants.length === 0) {\n throw new Error(\"signInvite request contains no participants\");\n }\n if (minSigners < 2) {\n throw new Error(\"minSigners must be at least 2\");\n }\n if (minSigners > participants.length) {\n throw new Error(\"minSigners exceeds participant count\");\n }\n\n const ownerInParticipants = participants.some((p) => p.urString() === owner.xid().urString());\n if (!ownerInParticipants) {\n throw new Error(\"signInvite request does not include this participant\");\n }\n\n if (responseArid === undefined) {\n throw new Error(\"signInvite request missing response ARID\");\n }\n\n // Sort participants by XID byte order — mirrors Rust `XID::cmp`.\n // The earlier port used `urString().localeCompare(...)`, which\n // diverges from byte order for bytes ≥ 0x80 and is locale-aware.\n participants.sort((a, b) => compareXidBytes(a.toData(), b.toData()));\n\n const targetEnvelope = sealedRequest.objectForParameter(\"target\");\n\n const coordinatorName = resolveSenderName(registry, senderXid) ?? senderXid.urString();\n const participantNames = formatParticipantNames(registry, participants, owner);\n\n // Output\n console.log(`Group: ${groupId.urString()}`);\n console.log(`Coordinator: ${coordinatorName}`);\n console.log(`Min signers: ${minSigners}`);\n console.log(`Participants: ${participantNames.join(\", \")}`);\n console.log(\"Target:\");\n console.log(targetEnvelope.format());\n\n // Primary output for scripting: session ID on its own line (no header)\n console.log(sessionId.urString());\n\n // Persist request details for follow-up commands\n const stateDir = signingStateDir(registryPath, groupId.hex(), sessionId.hex());\n fs.mkdirSync(stateDir, { recursive: true });\n\n const root: Record<string, unknown> = {\n request_envelope: envelope.urString(),\n group: groupId.urString(),\n session: sessionId.urString(),\n coordinator: senderXid.urString(),\n min_signers: minSigners,\n response_arid: responseArid.urString(),\n participants: participants.map((xid) => xid.urString()),\n target: targetEnvelope.urString(),\n };\n\n fs.writeFileSync(path.join(stateDir, \"sign_receive.json\"), JSON.stringify(root, null, 2));\n\n return {\n sessionId: sessionId.urString(),\n groupId: groupId.urString(),\n targetUr: targetEnvelope.urString(),\n coordinatorName,\n minSigners,\n participantNames,\n };\n}\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { t as __exportAll } from "./chunk-z9aeyW2b.mjs";
1
+ import { t as __exportAll } from "./rolldown-runtime-z9aeyW2b.mjs";
2
2
  import { DkgInvitation } from "./dkg/index.mjs";
3
3
  import { Registry, resolveRegistryPath } from "./registry/index.mjs";
4
- import { a as dkgStateDir, c as parseAridUr, l as parseEnvelopeUr, m as resolveSenderName, u as participantNamesFromRegistry } from "./common-Cf1UvJaP.mjs";
4
+ import { a as dkgStateDir, c as parseAridUr, l as parseEnvelopeUr, m as resolveSenderName, u as participantNamesFromRegistry } from "./common-4spC1kNw.mjs";
5
5
  import { t as getWithIndicator } from "./busy-BlU8_pS2.mjs";
6
- import { i as createStorageClient } from "./registry-DGjs4qDK.mjs";
6
+ import { i as createStorageClient } from "./registry-ycylEdoc.mjs";
7
7
  import { ARID, XID } from "@bcts/components";
8
8
  import { CborDate } from "@bcts/dcbor";
9
9
  import { Function } from "@bcts/envelope";
@@ -185,4 +185,4 @@ async function receive(_client, options, cwd) {
185
185
  //#endregion
186
186
  export { resolveInviteEnvelope as i, receive as n, receive_exports as r, decodeInviteDetails as t };
187
187
 
188
- //# sourceMappingURL=receive-dkSCSGpl.mjs.map
188
+ //# sourceMappingURL=receive-C2Dwb_FQ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"receive-dkSCSGpl.mjs","names":["EnvelopeFunction"],"sources":["../src/cmd/dkg/participant/receive.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * DKG participant receive command.\n *\n * Port of cmd/dkg/participant/receive.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport { ARID, XID } from \"@bcts/components\";\nimport { CborDate } from \"@bcts/dcbor\";\nimport { type Envelope, Function as EnvelopeFunction } from \"@bcts/envelope\";\nimport { SealedRequest } from \"@bcts/gstp\";\nimport { XIDDocument, XIDVerifySignature } from \"@bcts/xid\";\n\nimport { DkgInvitation } from \"../../../dkg/index.js\";\nimport { Registry, resolveRegistryPath } from \"../../../registry/index.js\";\nimport { getWithIndicator } from \"../../busy.js\";\nimport { createStorageClient, type StorageClient, type StorageSelection } from \"../../storage.js\";\nimport {\n dkgStateDir,\n parseAridUr,\n parseEnvelopeUr,\n participantNamesFromRegistry,\n resolveSenderName,\n} from \"../common.js\";\n\n/**\n * Options for the DKG receive command.\n */\nexport interface DkgReceiveOptions {\n registryPath?: string;\n timeoutSeconds?: number;\n noEnvelope?: boolean;\n info?: boolean;\n sender?: string;\n invite: string;\n storageSelection?: StorageSelection;\n verbose?: boolean;\n}\n\n/**\n * Result of the DKG receive command.\n */\nexport interface DkgReceiveResult {\n groupId: string;\n requestId: string;\n minSigners: number;\n charter: string;\n validUntil: string;\n responseArid: string;\n envelopeUr?: string | undefined;\n coordinatorName?: string | undefined;\n participantNames?: string[] | undefined;\n}\n\n/**\n * Details extracted from a DKG invite.\n *\n * Port of `struct InviteDetails` from cmd/dkg/participant/receive.rs lines 117-120.\n */\nexport interface InviteDetails {\n invitation: DkgInvitation;\n participants: XIDDocument[];\n}\n\n/**\n * Resolve an invite envelope from either storage (ARID) or direct UR.\n *\n * Port of `resolve_invite_envelope()` from cmd/dkg/participant/receive.rs lines 122-152.\n */\nexport async function resolveInviteEnvelope(\n selection: StorageSelection | undefined,\n invite: string,\n timeout?: number,\n): Promise<Envelope> {\n if (selection !== undefined) {\n // Try to parse as ARID\n try {\n const arid = parseAridUr(invite);\n const client = await createStorageClient(selection);\n const envelope = await getWithIndicator(client, arid, \"Invite\", timeout, false);\n if (envelope === null || envelope === undefined) {\n throw new Error(\"Invite not found in Hubert storage\");\n }\n return envelope;\n } catch (e) {\n // Not an ARID, fall through to envelope parsing\n if (e instanceof Error && e.message.includes(\"Invite not found in Hubert storage\")) {\n throw e;\n }\n }\n\n if (timeout !== undefined) {\n throw new Error(\"--timeout is only valid when retrieving invites from Hubert\");\n }\n\n return parseEnvelopeUr(invite);\n }\n\n // No storage selection\n try {\n parseAridUr(invite);\n throw new Error(\"Hubert storage parameters are required to retrieve invites by ARID\");\n } catch (e) {\n // Not an ARID, parse as envelope\n if (e instanceof Error && e.message.includes(\"Hubert storage parameters are required\")) {\n throw e;\n }\n }\n\n return parseEnvelopeUr(invite);\n}\n\n/**\n * Decode and validate invite details from an envelope.\n *\n * Port of `decode_invite_details()` from cmd/dkg/participant/receive.rs lines 154-256.\n */\nexport function decodeInviteDetails(\n invite: Envelope,\n now: Date,\n registry: Registry,\n recipient: XIDDocument,\n expectedSender?: XIDDocument,\n): InviteDetails {\n const recipientPrivateKeys = recipient.inceptionPrivateKeys();\n\n if (recipientPrivateKeys === undefined) {\n throw new Error(\"Recipient XID document has no inception private keys\");\n }\n\n const sealedRequest = SealedRequest.tryFromEnvelope(invite, undefined, now, recipientPrivateKeys);\n\n const senderDocument = sealedRequest.sender();\n if (expectedSender !== undefined) {\n if (senderDocument.xid().urString() !== expectedSender.xid().urString()) {\n throw new Error(\"Invite sender does not match expected sender\");\n }\n } else {\n const senderXid = senderDocument.xid();\n const owner = registry.owner();\n const knownOwner = owner?.xidDocument().xid().urString() === senderXid.urString();\n const knownParticipant = registry.participant(senderXid) !== undefined;\n\n if (!knownOwner && !knownParticipant) {\n throw new Error(`Invite sender not found in registry: ${senderXid.urString()}`);\n }\n }\n\n if (!sealedRequest.request().function().equals(EnvelopeFunction.fromString(\"dkgInvite\"))) {\n throw new Error(\"Unexpected invite function\");\n }\n\n const validUntil = sealedRequest.extractObjectForParameter<Date>(\"validUntil\");\n if (validUntil <= now) {\n throw new Error(\"Invitation expired\");\n }\n\n const minSigners = sealedRequest.extractObjectForParameter<number>(\"minSigners\");\n sealedRequest.extractObjectForParameter<string>(\"charter\");\n sealedRequest.extractObjectForParameter<ARID>(\"group\");\n const participantObjects = sealedRequest.objectsForParameter(\"participant\");\n\n if (minSigners < 2) {\n throw new Error(\"min_signers must be at least 2\");\n }\n\n if (minSigners > participantObjects.length) {\n throw new Error(\"min_signers exceeds participant count\");\n }\n\n const participantDocs: XIDDocument[] = [];\n let responseArid: ARID | undefined;\n const recipientXid = recipient.xid();\n\n for (const participant of participantObjects) {\n const xidDocumentEnvelope = participant.tryUnwrap();\n const xidDocument = XIDDocument.fromEnvelope(\n xidDocumentEnvelope,\n undefined,\n XIDVerifySignature.Inception,\n );\n\n if (xidDocument.xid().urString() === recipientXid.urString()) {\n const encryptedResponseArid = participant.objectForPredicate(\"response_arid\");\n const responseAridEnvelope = encryptedResponseArid.decryptToRecipient(recipientPrivateKeys);\n responseArid = responseAridEnvelope.extractSubject((cbor) => ARID.fromTaggedCbor(cbor));\n }\n\n participantDocs.push(xidDocument);\n }\n\n const invitation = DkgInvitation.fromInvite(invite, now, expectedSender, recipient);\n\n if (responseArid === undefined) {\n throw new Error(\"Invite does not include a response ARID for this recipient\");\n }\n\n return { invitation, participants: participantDocs };\n}\n\n/**\n * Resolve a sender XID document from the registry by UR or pet name.\n *\n * Port of `resolve_sender()` usage in receive.rs for expected sender.\n */\nfunction resolveSenderXidDocument(registry: Registry, raw: string): XIDDocument {\n // Try parsing as XID UR first\n try {\n const xid = XID.fromURString(raw.trim());\n const record = registry.participant(xid);\n if (record) {\n return record.xidDocument();\n }\n const owner = registry.owner();\n if (owner?.xid().urString() === xid.urString()) {\n return owner.xidDocument();\n }\n throw new Error(`Sender with XID ${xid.urString()} not found in registry`);\n } catch {\n // Try looking up by pet name\n const result = registry.participantByPetName(raw.trim());\n if (result) {\n const [, record] = result;\n return record.xidDocument();\n }\n const owner = registry.owner();\n if (owner?.petName() === raw.trim()) {\n return owner.xidDocument();\n }\n throw new Error(`Sender '${raw}' not found in registry`);\n }\n}\n\n/**\n * Execute the DKG participant receive command.\n *\n * Fetches and validates a DKG invite from the coordinator.\n *\n * Port of `receive()` from cmd/dkg/participant/receive.rs.\n */\nexport async function receive(\n _client: StorageClient | undefined,\n options: DkgReceiveOptions,\n cwd: string,\n): Promise<DkgReceiveResult> {\n if (options.storageSelection === undefined && options.timeoutSeconds !== undefined) {\n throw new Error(\"--timeout requires Hubert storage parameters\");\n }\n\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n\n const owner = registry.owner();\n if (!owner) {\n throw new Error(\"Registry owner with private keys is required\");\n }\n\n const expectedSender = options.sender\n ? resolveSenderXidDocument(registry, options.sender)\n : undefined;\n\n const inviteEnvelope = await resolveInviteEnvelope(\n options.storageSelection,\n options.invite,\n options.timeoutSeconds,\n );\n\n const now = CborDate.now().datetime();\n const details = decodeInviteDetails(\n inviteEnvelope,\n now,\n registry,\n owner.xidDocument(),\n expectedSender,\n );\n\n const participantNames = participantNamesFromRegistry(\n registry,\n details.participants,\n owner.xid(),\n owner.petName(),\n );\n\n const coordinatorName = resolveSenderName(registry, details.invitation.sender());\n\n // Save receive state\n const stateDir = dkgStateDir(registryPath, details.invitation.groupId().hex());\n fs.mkdirSync(stateDir, { recursive: true });\n\n const validUntilStr: string = (\n details.invitation.validUntil() as { toString(): string }\n ).toString();\n const receiveState = {\n group: details.invitation.groupId().urString(),\n request_id: details.invitation.requestId().urString(),\n response_arid: details.invitation.responseArid().urString(),\n valid_until: validUntilStr,\n min_signers: details.invitation.minSigners(),\n charter: details.invitation.charter(),\n sender: details.invitation.sender().xid().urString(),\n };\n\n fs.writeFileSync(path.join(stateDir, \"receive.json\"), JSON.stringify(receiveState, null, 2));\n\n // Output based on options\n let envelopeUr: string | undefined;\n if (options.noEnvelope !== true) {\n envelopeUr = inviteEnvelope.urString();\n console.log(envelopeUr);\n }\n\n if (options.info === true) {\n console.error(`Charter: ${details.invitation.charter()}`);\n console.error(`Min signers: ${details.invitation.minSigners()}`);\n if (coordinatorName !== undefined) {\n console.error(`Coordinator: ${coordinatorName}`);\n }\n console.error(`Participants: ${participantNames.join(\", \")}`);\n }\n\n if (options.verbose === true) {\n console.log(`Group ID: ${details.invitation.groupId().urString()}`);\n console.log(`Min signers: ${details.invitation.minSigners()}`);\n console.log(`Charter: ${details.invitation.charter()}`);\n console.log(`Valid until: ${String(details.invitation.validUntil())}`);\n console.log(`Response ARID: ${details.invitation.responseArid().urString()}`);\n }\n\n const resultValidUntilStr: string = (\n details.invitation.validUntil() as { toString(): string }\n ).toString();\n\n return {\n groupId: details.invitation.groupId().urString(),\n requestId: details.invitation.requestId().urString(),\n minSigners: details.invitation.minSigners(),\n charter: details.invitation.charter(),\n validUntil: resultValidUntilStr,\n responseArid: details.invitation.responseArid().urString(),\n envelopeUr,\n coordinatorName,\n participantNames,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"receive-C2Dwb_FQ.mjs","names":["EnvelopeFunction"],"sources":["../src/cmd/dkg/participant/receive.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * DKG participant receive command.\n *\n * Port of cmd/dkg/participant/receive.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport { ARID, XID } from \"@bcts/components\";\nimport { CborDate } from \"@bcts/dcbor\";\nimport { type Envelope, Function as EnvelopeFunction } from \"@bcts/envelope\";\nimport { SealedRequest } from \"@bcts/gstp\";\nimport { XIDDocument, XIDVerifySignature } from \"@bcts/xid\";\n\nimport { DkgInvitation } from \"../../../dkg/index.js\";\nimport { Registry, resolveRegistryPath } from \"../../../registry/index.js\";\nimport { getWithIndicator } from \"../../busy.js\";\nimport { createStorageClient, type StorageClient, type StorageSelection } from \"../../storage.js\";\nimport {\n dkgStateDir,\n parseAridUr,\n parseEnvelopeUr,\n participantNamesFromRegistry,\n resolveSenderName,\n} from \"../common.js\";\n\n/**\n * Options for the DKG receive command.\n */\nexport interface DkgReceiveOptions {\n registryPath?: string;\n timeoutSeconds?: number;\n noEnvelope?: boolean;\n info?: boolean;\n sender?: string;\n invite: string;\n storageSelection?: StorageSelection;\n verbose?: boolean;\n}\n\n/**\n * Result of the DKG receive command.\n */\nexport interface DkgReceiveResult {\n groupId: string;\n requestId: string;\n minSigners: number;\n charter: string;\n validUntil: string;\n responseArid: string;\n envelopeUr?: string | undefined;\n coordinatorName?: string | undefined;\n participantNames?: string[] | undefined;\n}\n\n/**\n * Details extracted from a DKG invite.\n *\n * Port of `struct InviteDetails` from cmd/dkg/participant/receive.rs lines 117-120.\n */\nexport interface InviteDetails {\n invitation: DkgInvitation;\n participants: XIDDocument[];\n}\n\n/**\n * Resolve an invite envelope from either storage (ARID) or direct UR.\n *\n * Port of `resolve_invite_envelope()` from cmd/dkg/participant/receive.rs lines 122-152.\n */\nexport async function resolveInviteEnvelope(\n selection: StorageSelection | undefined,\n invite: string,\n timeout?: number,\n): Promise<Envelope> {\n if (selection !== undefined) {\n // Try to parse as ARID\n try {\n const arid = parseAridUr(invite);\n const client = await createStorageClient(selection);\n const envelope = await getWithIndicator(client, arid, \"Invite\", timeout, false);\n if (envelope === null || envelope === undefined) {\n throw new Error(\"Invite not found in Hubert storage\");\n }\n return envelope;\n } catch (e) {\n // Not an ARID, fall through to envelope parsing\n if (e instanceof Error && e.message.includes(\"Invite not found in Hubert storage\")) {\n throw e;\n }\n }\n\n if (timeout !== undefined) {\n throw new Error(\"--timeout is only valid when retrieving invites from Hubert\");\n }\n\n return parseEnvelopeUr(invite);\n }\n\n // No storage selection\n try {\n parseAridUr(invite);\n throw new Error(\"Hubert storage parameters are required to retrieve invites by ARID\");\n } catch (e) {\n // Not an ARID, parse as envelope\n if (e instanceof Error && e.message.includes(\"Hubert storage parameters are required\")) {\n throw e;\n }\n }\n\n return parseEnvelopeUr(invite);\n}\n\n/**\n * Decode and validate invite details from an envelope.\n *\n * Port of `decode_invite_details()` from cmd/dkg/participant/receive.rs lines 154-256.\n */\nexport function decodeInviteDetails(\n invite: Envelope,\n now: Date,\n registry: Registry,\n recipient: XIDDocument,\n expectedSender?: XIDDocument,\n): InviteDetails {\n const recipientPrivateKeys = recipient.inceptionPrivateKeys();\n\n if (recipientPrivateKeys === undefined) {\n throw new Error(\"Recipient XID document has no inception private keys\");\n }\n\n const sealedRequest = SealedRequest.tryFromEnvelope(invite, undefined, now, recipientPrivateKeys);\n\n const senderDocument = sealedRequest.sender();\n if (expectedSender !== undefined) {\n if (senderDocument.xid().urString() !== expectedSender.xid().urString()) {\n throw new Error(\"Invite sender does not match expected sender\");\n }\n } else {\n const senderXid = senderDocument.xid();\n const owner = registry.owner();\n const knownOwner = owner?.xidDocument().xid().urString() === senderXid.urString();\n const knownParticipant = registry.participant(senderXid) !== undefined;\n\n if (!knownOwner && !knownParticipant) {\n throw new Error(`Invite sender not found in registry: ${senderXid.urString()}`);\n }\n }\n\n if (!sealedRequest.request().function().equals(EnvelopeFunction.fromString(\"dkgInvite\"))) {\n throw new Error(\"Unexpected invite function\");\n }\n\n const validUntil = sealedRequest.extractObjectForParameter<Date>(\"validUntil\");\n if (validUntil <= now) {\n throw new Error(\"Invitation expired\");\n }\n\n const minSigners = sealedRequest.extractObjectForParameter<number>(\"minSigners\");\n sealedRequest.extractObjectForParameter<string>(\"charter\");\n sealedRequest.extractObjectForParameter<ARID>(\"group\");\n const participantObjects = sealedRequest.objectsForParameter(\"participant\");\n\n if (minSigners < 2) {\n throw new Error(\"min_signers must be at least 2\");\n }\n\n if (minSigners > participantObjects.length) {\n throw new Error(\"min_signers exceeds participant count\");\n }\n\n const participantDocs: XIDDocument[] = [];\n let responseArid: ARID | undefined;\n const recipientXid = recipient.xid();\n\n for (const participant of participantObjects) {\n const xidDocumentEnvelope = participant.tryUnwrap();\n const xidDocument = XIDDocument.fromEnvelope(\n xidDocumentEnvelope,\n undefined,\n XIDVerifySignature.Inception,\n );\n\n if (xidDocument.xid().urString() === recipientXid.urString()) {\n const encryptedResponseArid = participant.objectForPredicate(\"response_arid\");\n const responseAridEnvelope = encryptedResponseArid.decryptToRecipient(recipientPrivateKeys);\n responseArid = responseAridEnvelope.extractSubject((cbor) => ARID.fromTaggedCbor(cbor));\n }\n\n participantDocs.push(xidDocument);\n }\n\n const invitation = DkgInvitation.fromInvite(invite, now, expectedSender, recipient);\n\n if (responseArid === undefined) {\n throw new Error(\"Invite does not include a response ARID for this recipient\");\n }\n\n return { invitation, participants: participantDocs };\n}\n\n/**\n * Resolve a sender XID document from the registry by UR or pet name.\n *\n * Port of `resolve_sender()` usage in receive.rs for expected sender.\n */\nfunction resolveSenderXidDocument(registry: Registry, raw: string): XIDDocument {\n // Try parsing as XID UR first\n try {\n const xid = XID.fromURString(raw.trim());\n const record = registry.participant(xid);\n if (record) {\n return record.xidDocument();\n }\n const owner = registry.owner();\n if (owner?.xid().urString() === xid.urString()) {\n return owner.xidDocument();\n }\n throw new Error(`Sender with XID ${xid.urString()} not found in registry`);\n } catch {\n // Try looking up by pet name\n const result = registry.participantByPetName(raw.trim());\n if (result) {\n const [, record] = result;\n return record.xidDocument();\n }\n const owner = registry.owner();\n if (owner?.petName() === raw.trim()) {\n return owner.xidDocument();\n }\n throw new Error(`Sender '${raw}' not found in registry`);\n }\n}\n\n/**\n * Execute the DKG participant receive command.\n *\n * Fetches and validates a DKG invite from the coordinator.\n *\n * Port of `receive()` from cmd/dkg/participant/receive.rs.\n */\nexport async function receive(\n _client: StorageClient | undefined,\n options: DkgReceiveOptions,\n cwd: string,\n): Promise<DkgReceiveResult> {\n if (options.storageSelection === undefined && options.timeoutSeconds !== undefined) {\n throw new Error(\"--timeout requires Hubert storage parameters\");\n }\n\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n\n const owner = registry.owner();\n if (!owner) {\n throw new Error(\"Registry owner with private keys is required\");\n }\n\n const expectedSender = options.sender\n ? resolveSenderXidDocument(registry, options.sender)\n : undefined;\n\n const inviteEnvelope = await resolveInviteEnvelope(\n options.storageSelection,\n options.invite,\n options.timeoutSeconds,\n );\n\n const now = CborDate.now().datetime();\n const details = decodeInviteDetails(\n inviteEnvelope,\n now,\n registry,\n owner.xidDocument(),\n expectedSender,\n );\n\n const participantNames = participantNamesFromRegistry(\n registry,\n details.participants,\n owner.xid(),\n owner.petName(),\n );\n\n const coordinatorName = resolveSenderName(registry, details.invitation.sender());\n\n // Save receive state\n const stateDir = dkgStateDir(registryPath, details.invitation.groupId().hex());\n fs.mkdirSync(stateDir, { recursive: true });\n\n const validUntilStr: string = (\n details.invitation.validUntil() as { toString(): string }\n ).toString();\n const receiveState = {\n group: details.invitation.groupId().urString(),\n request_id: details.invitation.requestId().urString(),\n response_arid: details.invitation.responseArid().urString(),\n valid_until: validUntilStr,\n min_signers: details.invitation.minSigners(),\n charter: details.invitation.charter(),\n sender: details.invitation.sender().xid().urString(),\n };\n\n fs.writeFileSync(path.join(stateDir, \"receive.json\"), JSON.stringify(receiveState, null, 2));\n\n // Output based on options\n let envelopeUr: string | undefined;\n if (options.noEnvelope !== true) {\n envelopeUr = inviteEnvelope.urString();\n console.log(envelopeUr);\n }\n\n if (options.info === true) {\n console.error(`Charter: ${details.invitation.charter()}`);\n console.error(`Min signers: ${details.invitation.minSigners()}`);\n if (coordinatorName !== undefined) {\n console.error(`Coordinator: ${coordinatorName}`);\n }\n console.error(`Participants: ${participantNames.join(\", \")}`);\n }\n\n if (options.verbose === true) {\n console.log(`Group ID: ${details.invitation.groupId().urString()}`);\n console.log(`Min signers: ${details.invitation.minSigners()}`);\n console.log(`Charter: ${details.invitation.charter()}`);\n console.log(`Valid until: ${String(details.invitation.validUntil())}`);\n console.log(`Response ARID: ${details.invitation.responseArid().urString()}`);\n }\n\n const resultValidUntilStr: string = (\n details.invitation.validUntil() as { toString(): string }\n ).toString();\n\n return {\n groupId: details.invitation.groupId().urString(),\n requestId: details.invitation.requestId().urString(),\n minSigners: details.invitation.minSigners(),\n charter: details.invitation.charter(),\n validUntil: resultValidUntilStr,\n responseArid: details.invitation.responseArid().urString(),\n envelopeUr,\n coordinatorName,\n participantNames,\n };\n}\n"],"mappings":"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"}
@@ -1,14 +1,14 @@
1
- const require_chunk = require("./chunk-DakpK96I.cjs");
1
+ const require_rolldown_runtime = require("./rolldown-runtime-DakpK96I.cjs");
2
2
  const require_proposed_participant = require("./proposed-participant-BvHNnpcZ.cjs");
3
3
  const require_registry_index = require("./registry/index.cjs");
4
- const require_common = require("./common-CnvAUC2b.cjs");
4
+ const require_common = require("./common-3msAx7hO.cjs");
5
5
  const require_busy = require("./busy-B_h0bNAJ.cjs");
6
- const require_common$1 = require("./common-7-BOgaTt.cjs");
6
+ const require_common$1 = require("./common-CeTqMwj0.cjs");
7
7
  let _bcts_dcbor = require("@bcts/dcbor");
8
8
  let node_fs = require("node:fs");
9
- node_fs = require_chunk.__toESM(node_fs, 1);
9
+ node_fs = require_rolldown_runtime.__toESM(node_fs, 1);
10
10
  let node_path = require("node:path");
11
- node_path = require_chunk.__toESM(node_path, 1);
11
+ node_path = require_rolldown_runtime.__toESM(node_path, 1);
12
12
  //#region src/cmd/sign/participant/receive.ts
13
13
  /**
14
14
  * Copyright © 2023-2026 Blockchain Commons, LLC
@@ -21,7 +21,7 @@ node_path = require_chunk.__toESM(node_path, 1);
21
21
  *
22
22
  * @module
23
23
  */
24
- var receive_exports = /* @__PURE__ */ require_chunk.__exportAll({ receive: () => receive });
24
+ var receive_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({ receive: () => receive });
25
25
  /**
26
26
  * Resolve sender from XID UR or pet name in registry.
27
27
  *
@@ -187,4 +187,4 @@ Object.defineProperty(exports, "receive_exports", {
187
187
  }
188
188
  });
189
189
 
190
- //# sourceMappingURL=receive-D_r4Mryr.cjs.map
190
+ //# sourceMappingURL=receive-Coqg6eFx.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"receive-D_r4Mryr.cjs","names":["getWithIndicator","parseAridUr","parseEnvelopeUr","formatNameWithOwnerMarker","resolveRegistryPath","Registry","CborDate","compareXidBytes","signingStateDir","path"],"sources":["../src/cmd/sign/participant/receive.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Sign participant receive command.\n *\n * Port of cmd/sign/participant/receive.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\";\nimport { compareXidBytes } from \"../../../dkg/proposed-participant.js\";\nimport { CborDate } from \"@bcts/dcbor\";\nimport type { Envelope } from \"@bcts/envelope\";\n\nimport { Registry, resolveRegistryPath, type OwnerRecord } from \"../../../registry/index.js\";\nimport { getWithIndicator } from \"../../busy.js\";\nimport { type StorageClient, type StorageSelection } from \"../../storage.js\";\nimport { parseAridUr, parseEnvelopeUr, formatNameWithOwnerMarker } from \"../../dkg/common.js\";\nimport { signingStateDir } from \"../common.js\";\n\n/**\n * Options for the sign receive command.\n */\nexport interface SignReceiveOptions {\n registryPath?: string;\n /** ARID or envelope UR string */\n request: string;\n timeoutSeconds?: number;\n /** Show request details only (info mode) */\n info?: boolean;\n /** Expected sender (XID UR or pet name) */\n sender?: string;\n}\n\n/**\n * Result of the sign receive command.\n */\nexport interface SignReceiveResult {\n sessionId: string;\n groupId: string;\n targetUr: string;\n coordinatorName: string;\n minSigners: number;\n participantNames: string[];\n}\n\n/**\n * Resolve sender from XID UR or pet name in registry.\n *\n * Port of `resolve_sender()` from cmd/dkg/common.rs lines 76-94.\n */\nfunction resolveSenderFromInput(registry: Registry, input: string): { xid: () => XID } {\n const trimmed = input.trim();\n if (trimmed === \"\") {\n throw new Error(\"Sender is required\");\n }\n\n // Try parsing as XID UR first\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-require-imports, no-undef\n const { XID: XIDClass } = require(\"@bcts/components\");\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n const xid = XIDClass.fromURString(trimmed) as XID;\n const record = registry.participant(xid);\n if (!record) {\n throw new Error(`Sender with XID ${xid.urString()} not found`);\n }\n return record.xidDocument();\n } catch {\n // Try looking up by pet name\n const result = registry.participantByPetName(trimmed);\n if (!result) {\n throw new Error(`Sender with pet name '${trimmed}' not found`);\n }\n return result[1].xidDocument();\n }\n}\n\n/**\n * Resolve sign invite from ARID or envelope UR.\n *\n * Port of `resolve_sign_request()` from cmd/sign/participant/receive.rs lines 250-284.\n */\nasync function resolveSignInviteEnvelope(\n client: StorageClient | undefined,\n selection: StorageSelection | undefined,\n request: string,\n timeout: number | undefined,\n): Promise<Envelope> {\n if (selection !== undefined && client !== undefined) {\n // Try to parse as ARID\n try {\n const arid = parseAridUr(request);\n const envelope = await getWithIndicator(client, arid, \"Sign invite\", timeout, false);\n if (envelope === undefined || envelope === null) {\n throw new Error(\"signInvite request not found in Hubert storage\");\n }\n return envelope;\n } catch {\n // Not an ARID, try as envelope\n }\n\n if (timeout !== undefined) {\n throw new Error(\"--timeout is only valid when retrieving requests from Hubert\");\n }\n return parseEnvelopeUr(request);\n }\n\n // No storage selection\n try {\n parseAridUr(request);\n throw new Error(\"Hubert storage parameters are required to retrieve requests by ARID\");\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"Hubert storage parameters\")) {\n throw e;\n }\n // Not an ARID, parse as envelope\n }\n return parseEnvelopeUr(request);\n}\n\n/**\n * Get display name for sender from registry.\n *\n * Port of `resolve_sender_name()` from cmd/dkg/common.rs lines 96-116.\n */\nfunction resolveSenderName(registry: Registry, senderXid: XID): string | undefined {\n const owner = registry.owner();\n\n // Check if sender is the owner\n if (owner?.xid().urString() === senderXid.urString()) {\n const name = owner.petName() ?? senderXid.urString();\n return formatNameWithOwnerMarker(name, true);\n }\n\n // Look up in participants\n const record = registry.participant(senderXid);\n if (record) {\n const name = record.petName() ?? record.xid().urString();\n return formatNameWithOwnerMarker(name, false);\n }\n\n return undefined;\n}\n\n/**\n * Format participant names with owner marker.\n *\n * Port of `format_participant_names()` from cmd/sign/participant/receive.rs lines 286-309.\n */\nfunction formatParticipantNames(\n registry: Registry,\n participants: XID[],\n owner: OwnerRecord,\n): string[] {\n return participants.map((xid) => {\n const isOwner = xid.urString() === owner.xid().urString();\n let name: string;\n\n if (isOwner) {\n name = owner.petName() ?? xid.urString();\n } else {\n const record = registry.participant(xid);\n name = record?.petName() ?? xid.urString();\n }\n\n return formatNameWithOwnerMarker(name, isOwner);\n });\n}\n\n/**\n * Execute the sign participant receive command.\n *\n * Fetches and validates a sign invite from the coordinator.\n *\n * Port of `CommandArgs::exec()` from cmd/sign/participant/receive.rs lines 56-247.\n */\nexport async function receive(\n client: StorageClient | undefined,\n selection: StorageSelection | undefined,\n options: SignReceiveOptions,\n cwd: string,\n): Promise<SignReceiveResult> {\n // Validate timeout requires storage\n if (selection === undefined && options.timeoutSeconds !== undefined) {\n throw new Error(\"--timeout requires Hubert storage parameters\");\n }\n\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n const owner = registry.owner();\n\n if (!owner) {\n throw new Error(\"Registry owner with private keys is required\");\n }\n\n // Resolve expected sender if provided\n let expectedSender: { xid: () => XID } | undefined;\n if (options.sender !== undefined && options.sender !== \"\") {\n expectedSender = resolveSenderFromInput(registry, options.sender);\n }\n\n // Resolve the invite envelope\n const envelope = await resolveSignInviteEnvelope(\n client,\n selection,\n options.request,\n options.timeoutSeconds,\n );\n\n const now: CborDate = CborDate.now();\n const recipientKeys = owner.xidDocument().inceptionPrivateKeys();\n\n if (recipientKeys === null || recipientKeys === undefined) {\n throw new Error(\"Owner XID document has no inception private keys\");\n }\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports, no-undef\n const { SealedRequest: SealedRequestClass } = require(\"@bcts/gstp\") as {\n SealedRequest: {\n tryFromEnvelope: (\n envelope: Envelope,\n expectedSender: XID | undefined,\n now: CborDate,\n recipientPrivateKeys: unknown,\n ) => SealedRequestInstance;\n };\n };\n\n interface SealedRequestInstance {\n sender: () => { xid: () => XID };\n function: () => { equals?: (other: unknown) => boolean; toString?: () => string };\n extractObjectForParameter: <T>(name: string) => T;\n objectForParameter: (name: string) => Envelope;\n objectsForParameter: (name: string) => ParticipantEntry[];\n }\n\n interface ParticipantEntry {\n extractSubject: () => XID;\n objectForPredicate: (name: string) => {\n decryptToRecipient: (keys: unknown) => {\n extractSubject: () => ARID;\n };\n };\n }\n\n const sealedRequest: SealedRequestInstance = SealedRequestClass.tryFromEnvelope(\n envelope,\n undefined,\n now,\n recipientKeys,\n );\n\n // Validate sender\n const senderXid = sealedRequest.sender().xid();\n\n if (expectedSender !== undefined) {\n if (senderXid.urString() !== expectedSender.xid().urString()) {\n throw new Error(\n `Request sender does not match expected sender (got ${senderXid.urString()}, expected ${expectedSender.xid().urString()})`,\n );\n }\n } else {\n const knownOwner = owner.xid().urString() === senderXid.urString();\n const knownParticipant = registry.participant(senderXid) !== undefined;\n if (!knownOwner && !knownParticipant) {\n throw new Error(`Request sender not found in registry: ${senderXid.urString()}`);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports, no-undef\n const { Function: FunctionClass } = require(\"@bcts/envelope\") as {\n Function: { from: (name: string) => unknown };\n };\n\n // Validate function\n const requestFunction = sealedRequest.function();\n const expectedFunction = FunctionClass.from(\"signInvite\");\n const functionMatches =\n requestFunction.equals !== undefined\n ? requestFunction.equals(expectedFunction)\n : String(requestFunction) === String(expectedFunction);\n\n if (!functionMatches) {\n throw new Error(`Unexpected request function: ${String(requestFunction)}`);\n }\n\n // Extract parameters\n const validUntil = sealedRequest.extractObjectForParameter<CborDate>(\"validUntil\");\n if (validUntil <= now) {\n throw new Error(\"signInvite request has expired\");\n }\n\n const groupId = sealedRequest.extractObjectForParameter<ARID>(\"group\");\n const sessionId = sealedRequest.extractObjectForParameter<ARID>(\"session\");\n const minSigners = Number(sealedRequest.extractObjectForParameter<bigint | number>(\"minSigners\"));\n\n // Extract participants and find our response ARID\n const participantEntries = sealedRequest.objectsForParameter(\"participant\");\n const participants: XID[] = [];\n let responseArid: ARID | undefined;\n\n for (const entry of participantEntries) {\n const xid: XID = entry.extractSubject();\n if (xid.urString() === owner.xid().urString()) {\n const encryptedArid = entry.objectForPredicate(\"response_arid\");\n const aridEnv = encryptedArid.decryptToRecipient(recipientKeys);\n responseArid = aridEnv.extractSubject();\n }\n participants.push(xid);\n }\n\n // Validations\n if (participants.length === 0) {\n throw new Error(\"signInvite request contains no participants\");\n }\n if (minSigners < 2) {\n throw new Error(\"minSigners must be at least 2\");\n }\n if (minSigners > participants.length) {\n throw new Error(\"minSigners exceeds participant count\");\n }\n\n const ownerInParticipants = participants.some((p) => p.urString() === owner.xid().urString());\n if (!ownerInParticipants) {\n throw new Error(\"signInvite request does not include this participant\");\n }\n\n if (responseArid === undefined) {\n throw new Error(\"signInvite request missing response ARID\");\n }\n\n // Sort participants by XID byte order — mirrors Rust `XID::cmp`.\n // The earlier port used `urString().localeCompare(...)`, which\n // diverges from byte order for bytes ≥ 0x80 and is locale-aware.\n participants.sort((a, b) => compareXidBytes(a.toData(), b.toData()));\n\n const targetEnvelope = sealedRequest.objectForParameter(\"target\");\n\n const coordinatorName = resolveSenderName(registry, senderXid) ?? senderXid.urString();\n const participantNames = formatParticipantNames(registry, participants, owner);\n\n // Output\n console.log(`Group: ${groupId.urString()}`);\n console.log(`Coordinator: ${coordinatorName}`);\n console.log(`Min signers: ${minSigners}`);\n console.log(`Participants: ${participantNames.join(\", \")}`);\n console.log(\"Target:\");\n console.log(targetEnvelope.format());\n\n // Primary output for scripting: session ID on its own line (no header)\n console.log(sessionId.urString());\n\n // Persist request details for follow-up commands\n const stateDir = signingStateDir(registryPath, groupId.hex(), sessionId.hex());\n fs.mkdirSync(stateDir, { recursive: true });\n\n const root: Record<string, unknown> = {\n request_envelope: envelope.urString(),\n group: groupId.urString(),\n session: sessionId.urString(),\n coordinator: senderXid.urString(),\n min_signers: minSigners,\n response_arid: responseArid.urString(),\n participants: participants.map((xid) => xid.urString()),\n target: targetEnvelope.urString(),\n };\n\n fs.writeFileSync(path.join(stateDir, \"sign_receive.json\"), JSON.stringify(root, null, 2));\n\n return {\n sessionId: sessionId.urString(),\n groupId: groupId.urString(),\n targetUr: targetEnvelope.urString(),\n coordinatorName,\n minSigners,\n participantNames,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyDA,SAAS,uBAAuB,UAAoB,OAAmC;CACrF,MAAM,UAAU,MAAM,KAAK;CAC3B,IAAI,YAAY,IACd,MAAM,IAAI,MAAM,oBAAoB;CAItC,IAAI;EAEF,MAAM,EAAE,KAAK,aAAa,QAAQ,kBAAkB;EAEpD,MAAM,MAAM,SAAS,aAAa,OAAO;EACzC,MAAM,SAAS,SAAS,YAAY,GAAG;EACvC,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,mBAAmB,IAAI,SAAS,EAAE,WAAW;EAE/D,OAAO,OAAO,YAAY;CAC5B,QAAQ;EAEN,MAAM,SAAS,SAAS,qBAAqB,OAAO;EACpD,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,yBAAyB,QAAQ,YAAY;EAE/D,OAAO,OAAO,GAAG,YAAY;CAC/B;AACF;;;;;;AAOA,eAAe,0BACb,QACA,WACA,SACA,SACmB;CACnB,IAAI,cAAc,KAAA,KAAa,WAAW,KAAA,GAAW;EAEnD,IAAI;GAEF,MAAM,WAAW,MAAMA,aAAAA,iBAAiB,QAD3BC,eAAAA,YAAY,OAC0B,GAAG,eAAe,SAAS,KAAK;GACnF,IAAI,aAAa,KAAA,KAAa,aAAa,MACzC,MAAM,IAAI,MAAM,gDAAgD;GAElE,OAAO;EACT,QAAQ,CAER;EAEA,IAAI,YAAY,KAAA,GACd,MAAM,IAAI,MAAM,8DAA8D;EAEhF,OAAOC,eAAAA,gBAAgB,OAAO;CAChC;CAGA,IAAI;EACF,eAAA,YAAY,OAAO;EACnB,MAAM,IAAI,MAAM,qEAAqE;CACvF,SAAS,GAAG;EACV,IAAI,aAAa,SAAS,EAAE,QAAQ,SAAS,2BAA2B,GACtE,MAAM;CAGV;CACA,OAAOA,eAAAA,gBAAgB,OAAO;AAChC;;;;;;AAOA,SAAS,kBAAkB,UAAoB,WAAoC;CACjF,MAAM,QAAQ,SAAS,MAAM;CAG7B,IAAI,OAAO,IAAI,EAAE,SAAS,MAAM,UAAU,SAAS,GAEjD,OAAOC,eAAAA,0BADM,MAAM,QAAQ,KAAK,UAAU,SAAS,GACZ,IAAI;CAI7C,MAAM,SAAS,SAAS,YAAY,SAAS;CAC7C,IAAI,QAEF,OAAOA,eAAAA,0BADM,OAAO,QAAQ,KAAK,OAAO,IAAI,EAAE,SAAS,GAChB,KAAK;AAIhD;;;;;;AAOA,SAAS,uBACP,UACA,cACA,OACU;CACV,OAAO,aAAa,KAAK,QAAQ;EAC/B,MAAM,UAAU,IAAI,SAAS,MAAM,MAAM,IAAI,EAAE,SAAS;EACxD,IAAI;EAEJ,IAAI,SACF,OAAO,MAAM,QAAQ,KAAK,IAAI,SAAS;OAGvC,OADe,SAAS,YAAY,GACxB,GAAG,QAAQ,KAAK,IAAI,SAAS;EAG3C,OAAOA,eAAAA,0BAA0B,MAAM,OAAO;CAChD,CAAC;AACH;;;;;;;;AASA,eAAsB,QACpB,QACA,WACA,SACA,KAC4B;CAE5B,IAAI,cAAc,KAAA,KAAa,QAAQ,mBAAmB,KAAA,GACxD,MAAM,IAAI,MAAM,8CAA8C;CAGhE,MAAM,eAAeC,uBAAAA,oBAAoB,QAAQ,cAAc,GAAG;CAClE,MAAM,WAAWC,uBAAAA,SAAS,KAAK,YAAY;CAC3C,MAAM,QAAQ,SAAS,MAAM;CAE7B,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,8CAA8C;CAIhE,IAAI;CACJ,IAAI,QAAQ,WAAW,KAAA,KAAa,QAAQ,WAAW,IACrD,iBAAiB,uBAAuB,UAAU,QAAQ,MAAM;CAIlE,MAAM,WAAW,MAAM,0BACrB,QACA,WACA,QAAQ,SACR,QAAQ,cACV;CAEA,MAAM,MAAgBC,YAAAA,SAAS,IAAI;CACnC,MAAM,gBAAgB,MAAM,YAAY,EAAE,qBAAqB;CAE/D,IAAI,kBAAkB,QAAQ,kBAAkB,KAAA,GAC9C,MAAM,IAAI,MAAM,kDAAkD;CAIpE,MAAM,EAAE,eAAe,uBAAuB,QAAQ,YAAY;CA4BlE,MAAM,gBAAuC,mBAAmB,gBAC9D,UACA,KAAA,GACA,KACA,aACF;CAGA,MAAM,YAAY,cAAc,OAAO,EAAE,IAAI;CAE7C,IAAI,mBAAmB,KAAA;MACjB,UAAU,SAAS,MAAM,eAAe,IAAI,EAAE,SAAS,GACzD,MAAM,IAAI,MACR,sDAAsD,UAAU,SAAS,EAAE,aAAa,eAAe,IAAI,EAAE,SAAS,EAAE,EAC1H;CAAA,OAEG;EACL,MAAM,aAAa,MAAM,IAAI,EAAE,SAAS,MAAM,UAAU,SAAS;EACjE,MAAM,mBAAmB,SAAS,YAAY,SAAS,MAAM,KAAA;EAC7D,IAAI,CAAC,cAAc,CAAC,kBAClB,MAAM,IAAI,MAAM,yCAAyC,UAAU,SAAS,GAAG;CAEnF;CAGA,MAAM,EAAE,UAAU,kBAAkB,QAAQ,gBAAgB;CAK5D,MAAM,kBAAkB,cAAc,SAAS;CAC/C,MAAM,mBAAmB,cAAc,KAAK,YAAY;CAMxD,IAAI,EAJF,gBAAgB,WAAW,KAAA,IACvB,gBAAgB,OAAO,gBAAgB,IACvC,OAAO,eAAe,MAAM,OAAO,gBAAgB,IAGvD,MAAM,IAAI,MAAM,gCAAgC,OAAO,eAAe,GAAG;CAK3E,IADmB,cAAc,0BAAoC,YACxD,KAAK,KAChB,MAAM,IAAI,MAAM,gCAAgC;CAGlD,MAAM,UAAU,cAAc,0BAAgC,OAAO;CACrE,MAAM,YAAY,cAAc,0BAAgC,SAAS;CACzE,MAAM,aAAa,OAAO,cAAc,0BAA2C,YAAY,CAAC;CAGhG,MAAM,qBAAqB,cAAc,oBAAoB,aAAa;CAC1E,MAAM,eAAsB,CAAC;CAC7B,IAAI;CAEJ,KAAK,MAAM,SAAS,oBAAoB;EACtC,MAAM,MAAW,MAAM,eAAe;EACtC,IAAI,IAAI,SAAS,MAAM,MAAM,IAAI,EAAE,SAAS,GAG1C,eAFsB,MAAM,mBAAmB,eACnB,EAAE,mBAAmB,aAC5B,EAAE,eAAe;EAExC,aAAa,KAAK,GAAG;CACvB;CAGA,IAAI,aAAa,WAAW,GAC1B,MAAM,IAAI,MAAM,6CAA6C;CAE/D,IAAI,aAAa,GACf,MAAM,IAAI,MAAM,+BAA+B;CAEjD,IAAI,aAAa,aAAa,QAC5B,MAAM,IAAI,MAAM,sCAAsC;CAIxD,IAAI,CADwB,aAAa,MAAM,MAAM,EAAE,SAAS,MAAM,MAAM,IAAI,EAAE,SAAS,CACpE,GACrB,MAAM,IAAI,MAAM,sDAAsD;CAGxE,IAAI,iBAAiB,KAAA,GACnB,MAAM,IAAI,MAAM,0CAA0C;CAM5D,aAAa,MAAM,GAAG,MAAMC,6BAAAA,gBAAgB,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC;CAEnE,MAAM,iBAAiB,cAAc,mBAAmB,QAAQ;CAEhE,MAAM,kBAAkB,kBAAkB,UAAU,SAAS,KAAK,UAAU,SAAS;CACrF,MAAM,mBAAmB,uBAAuB,UAAU,cAAc,KAAK;CAG7E,QAAQ,IAAI,UAAU,QAAQ,SAAS,GAAG;CAC1C,QAAQ,IAAI,gBAAgB,iBAAiB;CAC7C,QAAQ,IAAI,gBAAgB,YAAY;CACxC,QAAQ,IAAI,iBAAiB,iBAAiB,KAAK,IAAI,GAAG;CAC1D,QAAQ,IAAI,SAAS;CACrB,QAAQ,IAAI,eAAe,OAAO,CAAC;CAGnC,QAAQ,IAAI,UAAU,SAAS,CAAC;CAGhC,MAAM,WAAWC,iBAAAA,gBAAgB,cAAc,QAAQ,IAAI,GAAG,UAAU,IAAI,CAAC;CAC7E,QAAG,UAAU,UAAU,EAAE,WAAW,KAAK,CAAC;CAE1C,MAAM,OAAgC;EACpC,kBAAkB,SAAS,SAAS;EACpC,OAAO,QAAQ,SAAS;EACxB,SAAS,UAAU,SAAS;EAC5B,aAAa,UAAU,SAAS;EAChC,aAAa;EACb,eAAe,aAAa,SAAS;EACrC,cAAc,aAAa,KAAK,QAAQ,IAAI,SAAS,CAAC;EACtD,QAAQ,eAAe,SAAS;CAClC;CAEA,QAAG,cAAcC,UAAK,KAAK,UAAU,mBAAmB,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;CAExF,OAAO;EACL,WAAW,UAAU,SAAS;EAC9B,SAAS,QAAQ,SAAS;EAC1B,UAAU,eAAe,SAAS;EAClC;EACA;EACA;CACF;AACF"}
1
+ {"version":3,"file":"receive-Coqg6eFx.cjs","names":["getWithIndicator","parseAridUr","parseEnvelopeUr","formatNameWithOwnerMarker","resolveRegistryPath","Registry","CborDate","compareXidBytes","signingStateDir","path"],"sources":["../src/cmd/sign/participant/receive.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Sign participant receive command.\n *\n * Port of cmd/sign/participant/receive.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\";\nimport { compareXidBytes } from \"../../../dkg/proposed-participant.js\";\nimport { CborDate } from \"@bcts/dcbor\";\nimport type { Envelope } from \"@bcts/envelope\";\n\nimport { Registry, resolveRegistryPath, type OwnerRecord } from \"../../../registry/index.js\";\nimport { getWithIndicator } from \"../../busy.js\";\nimport { type StorageClient, type StorageSelection } from \"../../storage.js\";\nimport { parseAridUr, parseEnvelopeUr, formatNameWithOwnerMarker } from \"../../dkg/common.js\";\nimport { signingStateDir } from \"../common.js\";\n\n/**\n * Options for the sign receive command.\n */\nexport interface SignReceiveOptions {\n registryPath?: string;\n /** ARID or envelope UR string */\n request: string;\n timeoutSeconds?: number;\n /** Show request details only (info mode) */\n info?: boolean;\n /** Expected sender (XID UR or pet name) */\n sender?: string;\n}\n\n/**\n * Result of the sign receive command.\n */\nexport interface SignReceiveResult {\n sessionId: string;\n groupId: string;\n targetUr: string;\n coordinatorName: string;\n minSigners: number;\n participantNames: string[];\n}\n\n/**\n * Resolve sender from XID UR or pet name in registry.\n *\n * Port of `resolve_sender()` from cmd/dkg/common.rs lines 76-94.\n */\nfunction resolveSenderFromInput(registry: Registry, input: string): { xid: () => XID } {\n const trimmed = input.trim();\n if (trimmed === \"\") {\n throw new Error(\"Sender is required\");\n }\n\n // Try parsing as XID UR first\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-require-imports, no-undef\n const { XID: XIDClass } = require(\"@bcts/components\");\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n const xid = XIDClass.fromURString(trimmed) as XID;\n const record = registry.participant(xid);\n if (!record) {\n throw new Error(`Sender with XID ${xid.urString()} not found`);\n }\n return record.xidDocument();\n } catch {\n // Try looking up by pet name\n const result = registry.participantByPetName(trimmed);\n if (!result) {\n throw new Error(`Sender with pet name '${trimmed}' not found`);\n }\n return result[1].xidDocument();\n }\n}\n\n/**\n * Resolve sign invite from ARID or envelope UR.\n *\n * Port of `resolve_sign_request()` from cmd/sign/participant/receive.rs lines 250-284.\n */\nasync function resolveSignInviteEnvelope(\n client: StorageClient | undefined,\n selection: StorageSelection | undefined,\n request: string,\n timeout: number | undefined,\n): Promise<Envelope> {\n if (selection !== undefined && client !== undefined) {\n // Try to parse as ARID\n try {\n const arid = parseAridUr(request);\n const envelope = await getWithIndicator(client, arid, \"Sign invite\", timeout, false);\n if (envelope === undefined || envelope === null) {\n throw new Error(\"signInvite request not found in Hubert storage\");\n }\n return envelope;\n } catch {\n // Not an ARID, try as envelope\n }\n\n if (timeout !== undefined) {\n throw new Error(\"--timeout is only valid when retrieving requests from Hubert\");\n }\n return parseEnvelopeUr(request);\n }\n\n // No storage selection\n try {\n parseAridUr(request);\n throw new Error(\"Hubert storage parameters are required to retrieve requests by ARID\");\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"Hubert storage parameters\")) {\n throw e;\n }\n // Not an ARID, parse as envelope\n }\n return parseEnvelopeUr(request);\n}\n\n/**\n * Get display name for sender from registry.\n *\n * Port of `resolve_sender_name()` from cmd/dkg/common.rs lines 96-116.\n */\nfunction resolveSenderName(registry: Registry, senderXid: XID): string | undefined {\n const owner = registry.owner();\n\n // Check if sender is the owner\n if (owner?.xid().urString() === senderXid.urString()) {\n const name = owner.petName() ?? senderXid.urString();\n return formatNameWithOwnerMarker(name, true);\n }\n\n // Look up in participants\n const record = registry.participant(senderXid);\n if (record) {\n const name = record.petName() ?? record.xid().urString();\n return formatNameWithOwnerMarker(name, false);\n }\n\n return undefined;\n}\n\n/**\n * Format participant names with owner marker.\n *\n * Port of `format_participant_names()` from cmd/sign/participant/receive.rs lines 286-309.\n */\nfunction formatParticipantNames(\n registry: Registry,\n participants: XID[],\n owner: OwnerRecord,\n): string[] {\n return participants.map((xid) => {\n const isOwner = xid.urString() === owner.xid().urString();\n let name: string;\n\n if (isOwner) {\n name = owner.petName() ?? xid.urString();\n } else {\n const record = registry.participant(xid);\n name = record?.petName() ?? xid.urString();\n }\n\n return formatNameWithOwnerMarker(name, isOwner);\n });\n}\n\n/**\n * Execute the sign participant receive command.\n *\n * Fetches and validates a sign invite from the coordinator.\n *\n * Port of `CommandArgs::exec()` from cmd/sign/participant/receive.rs lines 56-247.\n */\nexport async function receive(\n client: StorageClient | undefined,\n selection: StorageSelection | undefined,\n options: SignReceiveOptions,\n cwd: string,\n): Promise<SignReceiveResult> {\n // Validate timeout requires storage\n if (selection === undefined && options.timeoutSeconds !== undefined) {\n throw new Error(\"--timeout requires Hubert storage parameters\");\n }\n\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n const owner = registry.owner();\n\n if (!owner) {\n throw new Error(\"Registry owner with private keys is required\");\n }\n\n // Resolve expected sender if provided\n let expectedSender: { xid: () => XID } | undefined;\n if (options.sender !== undefined && options.sender !== \"\") {\n expectedSender = resolveSenderFromInput(registry, options.sender);\n }\n\n // Resolve the invite envelope\n const envelope = await resolveSignInviteEnvelope(\n client,\n selection,\n options.request,\n options.timeoutSeconds,\n );\n\n const now: CborDate = CborDate.now();\n const recipientKeys = owner.xidDocument().inceptionPrivateKeys();\n\n if (recipientKeys === null || recipientKeys === undefined) {\n throw new Error(\"Owner XID document has no inception private keys\");\n }\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports, no-undef\n const { SealedRequest: SealedRequestClass } = require(\"@bcts/gstp\") as {\n SealedRequest: {\n tryFromEnvelope: (\n envelope: Envelope,\n expectedSender: XID | undefined,\n now: CborDate,\n recipientPrivateKeys: unknown,\n ) => SealedRequestInstance;\n };\n };\n\n interface SealedRequestInstance {\n sender: () => { xid: () => XID };\n function: () => { equals?: (other: unknown) => boolean; toString?: () => string };\n extractObjectForParameter: <T>(name: string) => T;\n objectForParameter: (name: string) => Envelope;\n objectsForParameter: (name: string) => ParticipantEntry[];\n }\n\n interface ParticipantEntry {\n extractSubject: () => XID;\n objectForPredicate: (name: string) => {\n decryptToRecipient: (keys: unknown) => {\n extractSubject: () => ARID;\n };\n };\n }\n\n const sealedRequest: SealedRequestInstance = SealedRequestClass.tryFromEnvelope(\n envelope,\n undefined,\n now,\n recipientKeys,\n );\n\n // Validate sender\n const senderXid = sealedRequest.sender().xid();\n\n if (expectedSender !== undefined) {\n if (senderXid.urString() !== expectedSender.xid().urString()) {\n throw new Error(\n `Request sender does not match expected sender (got ${senderXid.urString()}, expected ${expectedSender.xid().urString()})`,\n );\n }\n } else {\n const knownOwner = owner.xid().urString() === senderXid.urString();\n const knownParticipant = registry.participant(senderXid) !== undefined;\n if (!knownOwner && !knownParticipant) {\n throw new Error(`Request sender not found in registry: ${senderXid.urString()}`);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports, no-undef\n const { Function: FunctionClass } = require(\"@bcts/envelope\") as {\n Function: { from: (name: string) => unknown };\n };\n\n // Validate function\n const requestFunction = sealedRequest.function();\n const expectedFunction = FunctionClass.from(\"signInvite\");\n const functionMatches =\n requestFunction.equals !== undefined\n ? requestFunction.equals(expectedFunction)\n : String(requestFunction) === String(expectedFunction);\n\n if (!functionMatches) {\n throw new Error(`Unexpected request function: ${String(requestFunction)}`);\n }\n\n // Extract parameters\n const validUntil = sealedRequest.extractObjectForParameter<CborDate>(\"validUntil\");\n if (validUntil <= now) {\n throw new Error(\"signInvite request has expired\");\n }\n\n const groupId = sealedRequest.extractObjectForParameter<ARID>(\"group\");\n const sessionId = sealedRequest.extractObjectForParameter<ARID>(\"session\");\n const minSigners = Number(sealedRequest.extractObjectForParameter<bigint | number>(\"minSigners\"));\n\n // Extract participants and find our response ARID\n const participantEntries = sealedRequest.objectsForParameter(\"participant\");\n const participants: XID[] = [];\n let responseArid: ARID | undefined;\n\n for (const entry of participantEntries) {\n const xid: XID = entry.extractSubject();\n if (xid.urString() === owner.xid().urString()) {\n const encryptedArid = entry.objectForPredicate(\"response_arid\");\n const aridEnv = encryptedArid.decryptToRecipient(recipientKeys);\n responseArid = aridEnv.extractSubject();\n }\n participants.push(xid);\n }\n\n // Validations\n if (participants.length === 0) {\n throw new Error(\"signInvite request contains no participants\");\n }\n if (minSigners < 2) {\n throw new Error(\"minSigners must be at least 2\");\n }\n if (minSigners > participants.length) {\n throw new Error(\"minSigners exceeds participant count\");\n }\n\n const ownerInParticipants = participants.some((p) => p.urString() === owner.xid().urString());\n if (!ownerInParticipants) {\n throw new Error(\"signInvite request does not include this participant\");\n }\n\n if (responseArid === undefined) {\n throw new Error(\"signInvite request missing response ARID\");\n }\n\n // Sort participants by XID byte order — mirrors Rust `XID::cmp`.\n // The earlier port used `urString().localeCompare(...)`, which\n // diverges from byte order for bytes ≥ 0x80 and is locale-aware.\n participants.sort((a, b) => compareXidBytes(a.toData(), b.toData()));\n\n const targetEnvelope = sealedRequest.objectForParameter(\"target\");\n\n const coordinatorName = resolveSenderName(registry, senderXid) ?? senderXid.urString();\n const participantNames = formatParticipantNames(registry, participants, owner);\n\n // Output\n console.log(`Group: ${groupId.urString()}`);\n console.log(`Coordinator: ${coordinatorName}`);\n console.log(`Min signers: ${minSigners}`);\n console.log(`Participants: ${participantNames.join(\", \")}`);\n console.log(\"Target:\");\n console.log(targetEnvelope.format());\n\n // Primary output for scripting: session ID on its own line (no header)\n console.log(sessionId.urString());\n\n // Persist request details for follow-up commands\n const stateDir = signingStateDir(registryPath, groupId.hex(), sessionId.hex());\n fs.mkdirSync(stateDir, { recursive: true });\n\n const root: Record<string, unknown> = {\n request_envelope: envelope.urString(),\n group: groupId.urString(),\n session: sessionId.urString(),\n coordinator: senderXid.urString(),\n min_signers: minSigners,\n response_arid: responseArid.urString(),\n participants: participants.map((xid) => xid.urString()),\n target: targetEnvelope.urString(),\n };\n\n fs.writeFileSync(path.join(stateDir, \"sign_receive.json\"), JSON.stringify(root, null, 2));\n\n return {\n sessionId: sessionId.urString(),\n groupId: groupId.urString(),\n targetUr: targetEnvelope.urString(),\n coordinatorName,\n minSigners,\n participantNames,\n };\n}\n"],"mappings":"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"}
@@ -1,18 +1,18 @@
1
- const require_chunk = require("./chunk-DakpK96I.cjs");
1
+ const require_rolldown_runtime = require("./rolldown-runtime-DakpK96I.cjs");
2
2
  const require_dkg_index = require("./dkg/index.cjs");
3
3
  const require_registry_index = require("./registry/index.cjs");
4
- const require_common = require("./common-CnvAUC2b.cjs");
4
+ const require_common = require("./common-3msAx7hO.cjs");
5
5
  const require_busy = require("./busy-B_h0bNAJ.cjs");
6
- const require_registry = require("./registry-CkIbA7nt.cjs");
6
+ const require_registry = require("./registry-D-rFKk9R.cjs");
7
7
  let _bcts_components = require("@bcts/components");
8
8
  let _bcts_dcbor = require("@bcts/dcbor");
9
9
  let _bcts_envelope = require("@bcts/envelope");
10
10
  let _bcts_gstp = require("@bcts/gstp");
11
11
  let _bcts_xid = require("@bcts/xid");
12
12
  let node_fs = require("node:fs");
13
- node_fs = require_chunk.__toESM(node_fs, 1);
13
+ node_fs = require_rolldown_runtime.__toESM(node_fs, 1);
14
14
  let node_path = require("node:path");
15
- node_path = require_chunk.__toESM(node_path, 1);
15
+ node_path = require_rolldown_runtime.__toESM(node_path, 1);
16
16
  //#region src/cmd/dkg/participant/receive.ts
17
17
  /**
18
18
  * Copyright © 2023-2026 Blockchain Commons, LLC
@@ -25,7 +25,7 @@ node_path = require_chunk.__toESM(node_path, 1);
25
25
  *
26
26
  * @module
27
27
  */
28
- var receive_exports = /* @__PURE__ */ require_chunk.__exportAll({
28
+ var receive_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
29
29
  decodeInviteDetails: () => decodeInviteDetails,
30
30
  receive: () => receive,
31
31
  resolveInviteEnvelope: () => resolveInviteEnvelope
@@ -210,4 +210,4 @@ Object.defineProperty(exports, "resolveInviteEnvelope", {
210
210
  }
211
211
  });
212
212
 
213
- //# sourceMappingURL=receive-BR-knnGv.cjs.map
213
+ //# sourceMappingURL=receive-DZARudBa.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"receive-BR-knnGv.cjs","names":["parseAridUr","getWithIndicator","createStorageClient","parseEnvelopeUr","SealedRequest","EnvelopeFunction","XIDDocument","XIDVerifySignature","ARID","DkgInvitation","XID","resolveRegistryPath","Registry","CborDate","participantNamesFromRegistry","resolveSenderName","dkgStateDir","path"],"sources":["../src/cmd/dkg/participant/receive.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * DKG participant receive command.\n *\n * Port of cmd/dkg/participant/receive.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport { ARID, XID } from \"@bcts/components\";\nimport { CborDate } from \"@bcts/dcbor\";\nimport { type Envelope, Function as EnvelopeFunction } from \"@bcts/envelope\";\nimport { SealedRequest } from \"@bcts/gstp\";\nimport { XIDDocument, XIDVerifySignature } from \"@bcts/xid\";\n\nimport { DkgInvitation } from \"../../../dkg/index.js\";\nimport { Registry, resolveRegistryPath } from \"../../../registry/index.js\";\nimport { getWithIndicator } from \"../../busy.js\";\nimport { createStorageClient, type StorageClient, type StorageSelection } from \"../../storage.js\";\nimport {\n dkgStateDir,\n parseAridUr,\n parseEnvelopeUr,\n participantNamesFromRegistry,\n resolveSenderName,\n} from \"../common.js\";\n\n/**\n * Options for the DKG receive command.\n */\nexport interface DkgReceiveOptions {\n registryPath?: string;\n timeoutSeconds?: number;\n noEnvelope?: boolean;\n info?: boolean;\n sender?: string;\n invite: string;\n storageSelection?: StorageSelection;\n verbose?: boolean;\n}\n\n/**\n * Result of the DKG receive command.\n */\nexport interface DkgReceiveResult {\n groupId: string;\n requestId: string;\n minSigners: number;\n charter: string;\n validUntil: string;\n responseArid: string;\n envelopeUr?: string | undefined;\n coordinatorName?: string | undefined;\n participantNames?: string[] | undefined;\n}\n\n/**\n * Details extracted from a DKG invite.\n *\n * Port of `struct InviteDetails` from cmd/dkg/participant/receive.rs lines 117-120.\n */\nexport interface InviteDetails {\n invitation: DkgInvitation;\n participants: XIDDocument[];\n}\n\n/**\n * Resolve an invite envelope from either storage (ARID) or direct UR.\n *\n * Port of `resolve_invite_envelope()` from cmd/dkg/participant/receive.rs lines 122-152.\n */\nexport async function resolveInviteEnvelope(\n selection: StorageSelection | undefined,\n invite: string,\n timeout?: number,\n): Promise<Envelope> {\n if (selection !== undefined) {\n // Try to parse as ARID\n try {\n const arid = parseAridUr(invite);\n const client = await createStorageClient(selection);\n const envelope = await getWithIndicator(client, arid, \"Invite\", timeout, false);\n if (envelope === null || envelope === undefined) {\n throw new Error(\"Invite not found in Hubert storage\");\n }\n return envelope;\n } catch (e) {\n // Not an ARID, fall through to envelope parsing\n if (e instanceof Error && e.message.includes(\"Invite not found in Hubert storage\")) {\n throw e;\n }\n }\n\n if (timeout !== undefined) {\n throw new Error(\"--timeout is only valid when retrieving invites from Hubert\");\n }\n\n return parseEnvelopeUr(invite);\n }\n\n // No storage selection\n try {\n parseAridUr(invite);\n throw new Error(\"Hubert storage parameters are required to retrieve invites by ARID\");\n } catch (e) {\n // Not an ARID, parse as envelope\n if (e instanceof Error && e.message.includes(\"Hubert storage parameters are required\")) {\n throw e;\n }\n }\n\n return parseEnvelopeUr(invite);\n}\n\n/**\n * Decode and validate invite details from an envelope.\n *\n * Port of `decode_invite_details()` from cmd/dkg/participant/receive.rs lines 154-256.\n */\nexport function decodeInviteDetails(\n invite: Envelope,\n now: Date,\n registry: Registry,\n recipient: XIDDocument,\n expectedSender?: XIDDocument,\n): InviteDetails {\n const recipientPrivateKeys = recipient.inceptionPrivateKeys();\n\n if (recipientPrivateKeys === undefined) {\n throw new Error(\"Recipient XID document has no inception private keys\");\n }\n\n const sealedRequest = SealedRequest.tryFromEnvelope(invite, undefined, now, recipientPrivateKeys);\n\n const senderDocument = sealedRequest.sender();\n if (expectedSender !== undefined) {\n if (senderDocument.xid().urString() !== expectedSender.xid().urString()) {\n throw new Error(\"Invite sender does not match expected sender\");\n }\n } else {\n const senderXid = senderDocument.xid();\n const owner = registry.owner();\n const knownOwner = owner?.xidDocument().xid().urString() === senderXid.urString();\n const knownParticipant = registry.participant(senderXid) !== undefined;\n\n if (!knownOwner && !knownParticipant) {\n throw new Error(`Invite sender not found in registry: ${senderXid.urString()}`);\n }\n }\n\n if (!sealedRequest.request().function().equals(EnvelopeFunction.fromString(\"dkgInvite\"))) {\n throw new Error(\"Unexpected invite function\");\n }\n\n const validUntil = sealedRequest.extractObjectForParameter<Date>(\"validUntil\");\n if (validUntil <= now) {\n throw new Error(\"Invitation expired\");\n }\n\n const minSigners = sealedRequest.extractObjectForParameter<number>(\"minSigners\");\n sealedRequest.extractObjectForParameter<string>(\"charter\");\n sealedRequest.extractObjectForParameter<ARID>(\"group\");\n const participantObjects = sealedRequest.objectsForParameter(\"participant\");\n\n if (minSigners < 2) {\n throw new Error(\"min_signers must be at least 2\");\n }\n\n if (minSigners > participantObjects.length) {\n throw new Error(\"min_signers exceeds participant count\");\n }\n\n const participantDocs: XIDDocument[] = [];\n let responseArid: ARID | undefined;\n const recipientXid = recipient.xid();\n\n for (const participant of participantObjects) {\n const xidDocumentEnvelope = participant.tryUnwrap();\n const xidDocument = XIDDocument.fromEnvelope(\n xidDocumentEnvelope,\n undefined,\n XIDVerifySignature.Inception,\n );\n\n if (xidDocument.xid().urString() === recipientXid.urString()) {\n const encryptedResponseArid = participant.objectForPredicate(\"response_arid\");\n const responseAridEnvelope = encryptedResponseArid.decryptToRecipient(recipientPrivateKeys);\n responseArid = responseAridEnvelope.extractSubject((cbor) => ARID.fromTaggedCbor(cbor));\n }\n\n participantDocs.push(xidDocument);\n }\n\n const invitation = DkgInvitation.fromInvite(invite, now, expectedSender, recipient);\n\n if (responseArid === undefined) {\n throw new Error(\"Invite does not include a response ARID for this recipient\");\n }\n\n return { invitation, participants: participantDocs };\n}\n\n/**\n * Resolve a sender XID document from the registry by UR or pet name.\n *\n * Port of `resolve_sender()` usage in receive.rs for expected sender.\n */\nfunction resolveSenderXidDocument(registry: Registry, raw: string): XIDDocument {\n // Try parsing as XID UR first\n try {\n const xid = XID.fromURString(raw.trim());\n const record = registry.participant(xid);\n if (record) {\n return record.xidDocument();\n }\n const owner = registry.owner();\n if (owner?.xid().urString() === xid.urString()) {\n return owner.xidDocument();\n }\n throw new Error(`Sender with XID ${xid.urString()} not found in registry`);\n } catch {\n // Try looking up by pet name\n const result = registry.participantByPetName(raw.trim());\n if (result) {\n const [, record] = result;\n return record.xidDocument();\n }\n const owner = registry.owner();\n if (owner?.petName() === raw.trim()) {\n return owner.xidDocument();\n }\n throw new Error(`Sender '${raw}' not found in registry`);\n }\n}\n\n/**\n * Execute the DKG participant receive command.\n *\n * Fetches and validates a DKG invite from the coordinator.\n *\n * Port of `receive()` from cmd/dkg/participant/receive.rs.\n */\nexport async function receive(\n _client: StorageClient | undefined,\n options: DkgReceiveOptions,\n cwd: string,\n): Promise<DkgReceiveResult> {\n if (options.storageSelection === undefined && options.timeoutSeconds !== undefined) {\n throw new Error(\"--timeout requires Hubert storage parameters\");\n }\n\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n\n const owner = registry.owner();\n if (!owner) {\n throw new Error(\"Registry owner with private keys is required\");\n }\n\n const expectedSender = options.sender\n ? resolveSenderXidDocument(registry, options.sender)\n : undefined;\n\n const inviteEnvelope = await resolveInviteEnvelope(\n options.storageSelection,\n options.invite,\n options.timeoutSeconds,\n );\n\n const now = CborDate.now().datetime();\n const details = decodeInviteDetails(\n inviteEnvelope,\n now,\n registry,\n owner.xidDocument(),\n expectedSender,\n );\n\n const participantNames = participantNamesFromRegistry(\n registry,\n details.participants,\n owner.xid(),\n owner.petName(),\n );\n\n const coordinatorName = resolveSenderName(registry, details.invitation.sender());\n\n // Save receive state\n const stateDir = dkgStateDir(registryPath, details.invitation.groupId().hex());\n fs.mkdirSync(stateDir, { recursive: true });\n\n const validUntilStr: string = (\n details.invitation.validUntil() as { toString(): string }\n ).toString();\n const receiveState = {\n group: details.invitation.groupId().urString(),\n request_id: details.invitation.requestId().urString(),\n response_arid: details.invitation.responseArid().urString(),\n valid_until: validUntilStr,\n min_signers: details.invitation.minSigners(),\n charter: details.invitation.charter(),\n sender: details.invitation.sender().xid().urString(),\n };\n\n fs.writeFileSync(path.join(stateDir, \"receive.json\"), JSON.stringify(receiveState, null, 2));\n\n // Output based on options\n let envelopeUr: string | undefined;\n if (options.noEnvelope !== true) {\n envelopeUr = inviteEnvelope.urString();\n console.log(envelopeUr);\n }\n\n if (options.info === true) {\n console.error(`Charter: ${details.invitation.charter()}`);\n console.error(`Min signers: ${details.invitation.minSigners()}`);\n if (coordinatorName !== undefined) {\n console.error(`Coordinator: ${coordinatorName}`);\n }\n console.error(`Participants: ${participantNames.join(\", \")}`);\n }\n\n if (options.verbose === true) {\n console.log(`Group ID: ${details.invitation.groupId().urString()}`);\n console.log(`Min signers: ${details.invitation.minSigners()}`);\n console.log(`Charter: ${details.invitation.charter()}`);\n console.log(`Valid until: ${String(details.invitation.validUntil())}`);\n console.log(`Response ARID: ${details.invitation.responseArid().urString()}`);\n }\n\n const resultValidUntilStr: string = (\n details.invitation.validUntil() as { toString(): string }\n ).toString();\n\n return {\n groupId: details.invitation.groupId().urString(),\n requestId: details.invitation.requestId().urString(),\n minSigners: details.invitation.minSigners(),\n charter: details.invitation.charter(),\n validUntil: resultValidUntilStr,\n responseArid: details.invitation.responseArid().urString(),\n envelopeUr,\n coordinatorName,\n participantNames,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"receive-DZARudBa.cjs","names":["parseAridUr","getWithIndicator","createStorageClient","parseEnvelopeUr","SealedRequest","EnvelopeFunction","XIDDocument","XIDVerifySignature","ARID","DkgInvitation","XID","resolveRegistryPath","Registry","CborDate","participantNamesFromRegistry","resolveSenderName","dkgStateDir","path"],"sources":["../src/cmd/dkg/participant/receive.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * DKG participant receive command.\n *\n * Port of cmd/dkg/participant/receive.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport { ARID, XID } from \"@bcts/components\";\nimport { CborDate } from \"@bcts/dcbor\";\nimport { type Envelope, Function as EnvelopeFunction } from \"@bcts/envelope\";\nimport { SealedRequest } from \"@bcts/gstp\";\nimport { XIDDocument, XIDVerifySignature } from \"@bcts/xid\";\n\nimport { DkgInvitation } from \"../../../dkg/index.js\";\nimport { Registry, resolveRegistryPath } from \"../../../registry/index.js\";\nimport { getWithIndicator } from \"../../busy.js\";\nimport { createStorageClient, type StorageClient, type StorageSelection } from \"../../storage.js\";\nimport {\n dkgStateDir,\n parseAridUr,\n parseEnvelopeUr,\n participantNamesFromRegistry,\n resolveSenderName,\n} from \"../common.js\";\n\n/**\n * Options for the DKG receive command.\n */\nexport interface DkgReceiveOptions {\n registryPath?: string;\n timeoutSeconds?: number;\n noEnvelope?: boolean;\n info?: boolean;\n sender?: string;\n invite: string;\n storageSelection?: StorageSelection;\n verbose?: boolean;\n}\n\n/**\n * Result of the DKG receive command.\n */\nexport interface DkgReceiveResult {\n groupId: string;\n requestId: string;\n minSigners: number;\n charter: string;\n validUntil: string;\n responseArid: string;\n envelopeUr?: string | undefined;\n coordinatorName?: string | undefined;\n participantNames?: string[] | undefined;\n}\n\n/**\n * Details extracted from a DKG invite.\n *\n * Port of `struct InviteDetails` from cmd/dkg/participant/receive.rs lines 117-120.\n */\nexport interface InviteDetails {\n invitation: DkgInvitation;\n participants: XIDDocument[];\n}\n\n/**\n * Resolve an invite envelope from either storage (ARID) or direct UR.\n *\n * Port of `resolve_invite_envelope()` from cmd/dkg/participant/receive.rs lines 122-152.\n */\nexport async function resolveInviteEnvelope(\n selection: StorageSelection | undefined,\n invite: string,\n timeout?: number,\n): Promise<Envelope> {\n if (selection !== undefined) {\n // Try to parse as ARID\n try {\n const arid = parseAridUr(invite);\n const client = await createStorageClient(selection);\n const envelope = await getWithIndicator(client, arid, \"Invite\", timeout, false);\n if (envelope === null || envelope === undefined) {\n throw new Error(\"Invite not found in Hubert storage\");\n }\n return envelope;\n } catch (e) {\n // Not an ARID, fall through to envelope parsing\n if (e instanceof Error && e.message.includes(\"Invite not found in Hubert storage\")) {\n throw e;\n }\n }\n\n if (timeout !== undefined) {\n throw new Error(\"--timeout is only valid when retrieving invites from Hubert\");\n }\n\n return parseEnvelopeUr(invite);\n }\n\n // No storage selection\n try {\n parseAridUr(invite);\n throw new Error(\"Hubert storage parameters are required to retrieve invites by ARID\");\n } catch (e) {\n // Not an ARID, parse as envelope\n if (e instanceof Error && e.message.includes(\"Hubert storage parameters are required\")) {\n throw e;\n }\n }\n\n return parseEnvelopeUr(invite);\n}\n\n/**\n * Decode and validate invite details from an envelope.\n *\n * Port of `decode_invite_details()` from cmd/dkg/participant/receive.rs lines 154-256.\n */\nexport function decodeInviteDetails(\n invite: Envelope,\n now: Date,\n registry: Registry,\n recipient: XIDDocument,\n expectedSender?: XIDDocument,\n): InviteDetails {\n const recipientPrivateKeys = recipient.inceptionPrivateKeys();\n\n if (recipientPrivateKeys === undefined) {\n throw new Error(\"Recipient XID document has no inception private keys\");\n }\n\n const sealedRequest = SealedRequest.tryFromEnvelope(invite, undefined, now, recipientPrivateKeys);\n\n const senderDocument = sealedRequest.sender();\n if (expectedSender !== undefined) {\n if (senderDocument.xid().urString() !== expectedSender.xid().urString()) {\n throw new Error(\"Invite sender does not match expected sender\");\n }\n } else {\n const senderXid = senderDocument.xid();\n const owner = registry.owner();\n const knownOwner = owner?.xidDocument().xid().urString() === senderXid.urString();\n const knownParticipant = registry.participant(senderXid) !== undefined;\n\n if (!knownOwner && !knownParticipant) {\n throw new Error(`Invite sender not found in registry: ${senderXid.urString()}`);\n }\n }\n\n if (!sealedRequest.request().function().equals(EnvelopeFunction.fromString(\"dkgInvite\"))) {\n throw new Error(\"Unexpected invite function\");\n }\n\n const validUntil = sealedRequest.extractObjectForParameter<Date>(\"validUntil\");\n if (validUntil <= now) {\n throw new Error(\"Invitation expired\");\n }\n\n const minSigners = sealedRequest.extractObjectForParameter<number>(\"minSigners\");\n sealedRequest.extractObjectForParameter<string>(\"charter\");\n sealedRequest.extractObjectForParameter<ARID>(\"group\");\n const participantObjects = sealedRequest.objectsForParameter(\"participant\");\n\n if (minSigners < 2) {\n throw new Error(\"min_signers must be at least 2\");\n }\n\n if (minSigners > participantObjects.length) {\n throw new Error(\"min_signers exceeds participant count\");\n }\n\n const participantDocs: XIDDocument[] = [];\n let responseArid: ARID | undefined;\n const recipientXid = recipient.xid();\n\n for (const participant of participantObjects) {\n const xidDocumentEnvelope = participant.tryUnwrap();\n const xidDocument = XIDDocument.fromEnvelope(\n xidDocumentEnvelope,\n undefined,\n XIDVerifySignature.Inception,\n );\n\n if (xidDocument.xid().urString() === recipientXid.urString()) {\n const encryptedResponseArid = participant.objectForPredicate(\"response_arid\");\n const responseAridEnvelope = encryptedResponseArid.decryptToRecipient(recipientPrivateKeys);\n responseArid = responseAridEnvelope.extractSubject((cbor) => ARID.fromTaggedCbor(cbor));\n }\n\n participantDocs.push(xidDocument);\n }\n\n const invitation = DkgInvitation.fromInvite(invite, now, expectedSender, recipient);\n\n if (responseArid === undefined) {\n throw new Error(\"Invite does not include a response ARID for this recipient\");\n }\n\n return { invitation, participants: participantDocs };\n}\n\n/**\n * Resolve a sender XID document from the registry by UR or pet name.\n *\n * Port of `resolve_sender()` usage in receive.rs for expected sender.\n */\nfunction resolveSenderXidDocument(registry: Registry, raw: string): XIDDocument {\n // Try parsing as XID UR first\n try {\n const xid = XID.fromURString(raw.trim());\n const record = registry.participant(xid);\n if (record) {\n return record.xidDocument();\n }\n const owner = registry.owner();\n if (owner?.xid().urString() === xid.urString()) {\n return owner.xidDocument();\n }\n throw new Error(`Sender with XID ${xid.urString()} not found in registry`);\n } catch {\n // Try looking up by pet name\n const result = registry.participantByPetName(raw.trim());\n if (result) {\n const [, record] = result;\n return record.xidDocument();\n }\n const owner = registry.owner();\n if (owner?.petName() === raw.trim()) {\n return owner.xidDocument();\n }\n throw new Error(`Sender '${raw}' not found in registry`);\n }\n}\n\n/**\n * Execute the DKG participant receive command.\n *\n * Fetches and validates a DKG invite from the coordinator.\n *\n * Port of `receive()` from cmd/dkg/participant/receive.rs.\n */\nexport async function receive(\n _client: StorageClient | undefined,\n options: DkgReceiveOptions,\n cwd: string,\n): Promise<DkgReceiveResult> {\n if (options.storageSelection === undefined && options.timeoutSeconds !== undefined) {\n throw new Error(\"--timeout requires Hubert storage parameters\");\n }\n\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n\n const owner = registry.owner();\n if (!owner) {\n throw new Error(\"Registry owner with private keys is required\");\n }\n\n const expectedSender = options.sender\n ? resolveSenderXidDocument(registry, options.sender)\n : undefined;\n\n const inviteEnvelope = await resolveInviteEnvelope(\n options.storageSelection,\n options.invite,\n options.timeoutSeconds,\n );\n\n const now = CborDate.now().datetime();\n const details = decodeInviteDetails(\n inviteEnvelope,\n now,\n registry,\n owner.xidDocument(),\n expectedSender,\n );\n\n const participantNames = participantNamesFromRegistry(\n registry,\n details.participants,\n owner.xid(),\n owner.petName(),\n );\n\n const coordinatorName = resolveSenderName(registry, details.invitation.sender());\n\n // Save receive state\n const stateDir = dkgStateDir(registryPath, details.invitation.groupId().hex());\n fs.mkdirSync(stateDir, { recursive: true });\n\n const validUntilStr: string = (\n details.invitation.validUntil() as { toString(): string }\n ).toString();\n const receiveState = {\n group: details.invitation.groupId().urString(),\n request_id: details.invitation.requestId().urString(),\n response_arid: details.invitation.responseArid().urString(),\n valid_until: validUntilStr,\n min_signers: details.invitation.minSigners(),\n charter: details.invitation.charter(),\n sender: details.invitation.sender().xid().urString(),\n };\n\n fs.writeFileSync(path.join(stateDir, \"receive.json\"), JSON.stringify(receiveState, null, 2));\n\n // Output based on options\n let envelopeUr: string | undefined;\n if (options.noEnvelope !== true) {\n envelopeUr = inviteEnvelope.urString();\n console.log(envelopeUr);\n }\n\n if (options.info === true) {\n console.error(`Charter: ${details.invitation.charter()}`);\n console.error(`Min signers: ${details.invitation.minSigners()}`);\n if (coordinatorName !== undefined) {\n console.error(`Coordinator: ${coordinatorName}`);\n }\n console.error(`Participants: ${participantNames.join(\", \")}`);\n }\n\n if (options.verbose === true) {\n console.log(`Group ID: ${details.invitation.groupId().urString()}`);\n console.log(`Min signers: ${details.invitation.minSigners()}`);\n console.log(`Charter: ${details.invitation.charter()}`);\n console.log(`Valid until: ${String(details.invitation.validUntil())}`);\n console.log(`Response ARID: ${details.invitation.responseArid().urString()}`);\n }\n\n const resultValidUntilStr: string = (\n details.invitation.validUntil() as { toString(): string }\n ).toString();\n\n return {\n groupId: details.invitation.groupId().urString(),\n requestId: details.invitation.requestId().urString(),\n minSigners: details.invitation.minSigners(),\n charter: details.invitation.charter(),\n validUntil: resultValidUntilStr,\n responseArid: details.invitation.responseArid().urString(),\n envelopeUr,\n coordinatorName,\n participantNames,\n };\n}\n"],"mappings":"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"}
@@ -1,13 +1,13 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_chunk = require("../chunk-DakpK96I.cjs");
2
+ const require_rolldown_runtime = require("../rolldown-runtime-DakpK96I.cjs");
3
3
  let _bcts_components = require("@bcts/components");
4
4
  let _bcts_envelope = require("@bcts/envelope");
5
5
  let _bcts_xid = require("@bcts/xid");
6
6
  let _bcts_uniform_resources = require("@bcts/uniform-resources");
7
7
  let node_fs = require("node:fs");
8
- node_fs = require_chunk.__toESM(node_fs, 1);
8
+ node_fs = require_rolldown_runtime.__toESM(node_fs, 1);
9
9
  let node_path = require("node:path");
10
- node_path = require_chunk.__toESM(node_path, 1);
10
+ node_path = require_rolldown_runtime.__toESM(node_path, 1);
11
11
  //#region src/registry/group-record.ts
12
12
  /**
13
13
  * Copyright © 2023-2026 Blockchain Commons, LLC