@contextvm/sdk 0.7.8 → 0.8.0-next.1

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 (57) hide show
  1. package/dist/esm/core/constants.d.ts +4 -0
  2. package/dist/esm/core/constants.d.ts.map +1 -1
  3. package/dist/esm/core/constants.js +4 -0
  4. package/dist/esm/core/constants.js.map +1 -1
  5. package/dist/esm/core/utils/utils.d.ts +3 -0
  6. package/dist/esm/core/utils/utils.d.ts.map +1 -1
  7. package/dist/esm/core/utils/utils.js +7 -0
  8. package/dist/esm/core/utils/utils.js.map +1 -1
  9. package/dist/esm/transport/discovery-tags.d.ts +11 -0
  10. package/dist/esm/transport/discovery-tags.d.ts.map +1 -0
  11. package/dist/esm/transport/discovery-tags.js +39 -0
  12. package/dist/esm/transport/discovery-tags.js.map +1 -0
  13. package/dist/esm/transport/nostr-client-transport.d.ts +33 -0
  14. package/dist/esm/transport/nostr-client-transport.d.ts.map +1 -1
  15. package/dist/esm/transport/nostr-client-transport.js +173 -42
  16. package/dist/esm/transport/nostr-client-transport.js.map +1 -1
  17. package/dist/esm/transport/nostr-server/announcement-manager.d.ts +6 -0
  18. package/dist/esm/transport/nostr-server/announcement-manager.d.ts.map +1 -1
  19. package/dist/esm/transport/nostr-server/announcement-manager.js +12 -0
  20. package/dist/esm/transport/nostr-server/announcement-manager.js.map +1 -1
  21. package/dist/esm/transport/nostr-server/session-store.d.ts +6 -0
  22. package/dist/esm/transport/nostr-server/session-store.d.ts.map +1 -1
  23. package/dist/esm/transport/nostr-server/session-store.js +3 -0
  24. package/dist/esm/transport/nostr-server/session-store.js.map +1 -1
  25. package/dist/esm/transport/nostr-server-transport.d.ts +22 -0
  26. package/dist/esm/transport/nostr-server-transport.d.ts.map +1 -1
  27. package/dist/esm/transport/nostr-server-transport.js +148 -24
  28. package/dist/esm/transport/nostr-server-transport.js.map +1 -1
  29. package/dist/esm/transport/oversized-transfer/constants.d.ts +11 -0
  30. package/dist/esm/transport/oversized-transfer/constants.d.ts.map +1 -0
  31. package/dist/esm/transport/oversized-transfer/constants.js +21 -0
  32. package/dist/esm/transport/oversized-transfer/constants.js.map +1 -0
  33. package/dist/esm/transport/oversized-transfer/errors.d.ts +27 -0
  34. package/dist/esm/transport/oversized-transfer/errors.d.ts.map +1 -0
  35. package/dist/esm/transport/oversized-transfer/errors.js +45 -0
  36. package/dist/esm/transport/oversized-transfer/errors.js.map +1 -0
  37. package/dist/esm/transport/oversized-transfer/index.d.ts +10 -0
  38. package/dist/esm/transport/oversized-transfer/index.d.ts.map +1 -0
  39. package/dist/esm/transport/oversized-transfer/index.js +7 -0
  40. package/dist/esm/transport/oversized-transfer/index.js.map +1 -0
  41. package/dist/esm/transport/oversized-transfer/receiver.d.ts +57 -0
  42. package/dist/esm/transport/oversized-transfer/receiver.d.ts.map +1 -0
  43. package/dist/esm/transport/oversized-transfer/receiver.js +371 -0
  44. package/dist/esm/transport/oversized-transfer/receiver.js.map +1 -0
  45. package/dist/esm/transport/oversized-transfer/sender-session.d.ts +16 -0
  46. package/dist/esm/transport/oversized-transfer/sender-session.d.ts.map +1 -0
  47. package/dist/esm/transport/oversized-transfer/sender-session.js +22 -0
  48. package/dist/esm/transport/oversized-transfer/sender-session.js.map +1 -0
  49. package/dist/esm/transport/oversized-transfer/sender.d.ts +15 -0
  50. package/dist/esm/transport/oversized-transfer/sender.d.ts.map +1 -0
  51. package/dist/esm/transport/oversized-transfer/sender.js +81 -0
  52. package/dist/esm/transport/oversized-transfer/sender.js.map +1 -0
  53. package/dist/esm/transport/oversized-transfer/types.d.ts +39 -0
  54. package/dist/esm/transport/oversized-transfer/types.d.ts.map +1 -0
  55. package/dist/esm/transport/oversized-transfer/types.js +2 -0
  56. package/dist/esm/transport/oversized-transfer/types.js.map +1 -0
  57. package/package.json +2 -1
@@ -86,6 +86,10 @@ export declare const NOSTR_TAGS: {
86
86
  * Support ephemeral gift wrap kind (21059) for encrypted messages.
87
87
  */
88
88
  readonly SUPPORT_ENCRYPTION_EPHEMERAL: "support_encryption_ephemeral";
89
+ /**
90
+ * Support CEP-22 oversized payload transfer via notifications/progress framing.
91
+ */
92
+ readonly SUPPORT_OVERSIZED_TRANSFER: "support_oversized_transfer";
89
93
  };
90
94
  export declare const DEFAULT_LRU_SIZE = 5000;
91
95
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/core/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAEzC;;;GAGG;AACH,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,eAAe,QAAQ,CAAC;AAErC;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAEzC;;GAEG;AACH,eAAO,MAAM,2BAA2B,QAAQ,CAAC;AAEjD;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AAEvC;;GAEG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,wJAO/B,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,UAAU;;;IAGrB;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAGH;;OAEG;;CAEK,CAAC;AAEX,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAEzC,eAAO,MAAM,mBAAmB,EAAE,mBAKxB,CAAC;AAEX,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,eAAO,MAAM,gCAAgC,8BAA8B,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/core/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAEzC;;;GAGG;AACH,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,eAAe,QAAQ,CAAC;AAErC;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAEzC;;GAEG;AACH,eAAO,MAAM,2BAA2B,QAAQ,CAAC;AAEjD;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AAEvC;;GAEG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,wJAO/B,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,UAAU;;;IAGrB;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;CAEK,CAAC;AAEX,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAEzC,eAAO,MAAM,mBAAmB,EAAE,mBAKxB,CAAC;AAEX,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,eAAO,MAAM,gCAAgC,8BAA8B,CAAC"}
@@ -92,6 +92,10 @@ export const NOSTR_TAGS = {
92
92
  * Support ephemeral gift wrap kind (21059) for encrypted messages.
93
93
  */
94
94
  SUPPORT_ENCRYPTION_EPHEMERAL: 'support_encryption_ephemeral',
95
+ /**
96
+ * Support CEP-22 oversized payload transfer via notifications/progress framing.
97
+ */
98
+ SUPPORT_OVERSIZED_TRANSFER: 'support_oversized_transfer',
95
99
  };
96
100
  export const DEFAULT_LRU_SIZE = 5000;
97
101
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/core/constants.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAEzC;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAEnC;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAEzC;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,CAAC;AAEjD;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEvC;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,sBAAsB;IACtB,wBAAwB;IACxB,eAAe;IACf,2BAA2B;IAC3B,kBAAkB;IAClB,uBAAuB;CACf,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,MAAM,EAAE,GAAG;IACX,KAAK,EAAE,GAAG;IACV;;OAEG;IACH,QAAQ,EAAE,GAAG;IACb;;OAEG;IACH,UAAU,EAAE,KAAK;IACjB;;OAEG;IACH,IAAI,EAAE,MAAM;IACZ;;OAEG;IACH,OAAO,EAAE,SAAS;IAClB;;OAEG;IACH,OAAO,EAAE,SAAS;IAClB;;OAEG;IACH,KAAK,EAAE,OAAO;IACd;;OAEG;IACH,kBAAkB,EAAE,oBAAoB;IAExC;;OAEG;IACH,4BAA4B,EAAE,8BAA8B;CACpD,CAAC;AAEX,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAM,CAAC;AAEzC,MAAM,CAAC,MAAM,mBAAmB,GAAwB;IACtD,KAAK,EAAE,YAAY;IACnB,SAAS,EAAE,gBAAgB;IAC3B,iBAAiB,EAAE,0BAA0B;IAC7C,OAAO,EAAE,cAAc;CACf,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAC9C,MAAM,CAAC,MAAM,gCAAgC,GAAG,2BAA2B,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/core/constants.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAEzC;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAEnC;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAEzC;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,CAAC;AAEjD;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEvC;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,sBAAsB;IACtB,wBAAwB;IACxB,eAAe;IACf,2BAA2B;IAC3B,kBAAkB;IAClB,uBAAuB;CACf,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,MAAM,EAAE,GAAG;IACX,KAAK,EAAE,GAAG;IACV;;OAEG;IACH,QAAQ,EAAE,GAAG;IACb;;OAEG;IACH,UAAU,EAAE,KAAK;IACjB;;OAEG;IACH,IAAI,EAAE,MAAM;IACZ;;OAEG;IACH,OAAO,EAAE,SAAS;IAClB;;OAEG;IACH,OAAO,EAAE,SAAS;IAClB;;OAEG;IACH,KAAK,EAAE,OAAO;IACd;;OAEG;IACH,kBAAkB,EAAE,oBAAoB;IAExC;;OAEG;IACH,4BAA4B,EAAE,8BAA8B;IAE5D;;OAEG;IACH,0BAA0B,EAAE,4BAA4B;CAChD,CAAC;AAEX,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAM,CAAC;AAEzC,MAAM,CAAC,MAAM,mBAAmB,GAAwB;IACtD,KAAK,EAAE,YAAY;IACnB,SAAS,EAAE,gBAAgB;IAC3B,iBAAiB,EAAE,0BAA0B;IAC7C,OAAO,EAAE,cAAc;CACf,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAC9C,MAAM,CAAC,MAAM,gCAAgC,GAAG,2BAA2B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { JSONRPCMessage, JSONRPCRequest } from '@modelcontextprotocol/sdk/types.js';
2
+ import { NostrEvent } from 'nostr-tools';
2
3
  /**
3
4
  * Sleeps for a specified number of milliseconds.
4
5
  * @param ms The number of milliseconds to sleep.
@@ -47,4 +48,6 @@ export declare function sleepWithAbort(params: {
47
48
  }): Promise<void>;
48
49
  export declare function getTagValue(tags: string[][], name: string): string | undefined;
49
50
  export declare function getTagValues(tags: string[][], name: string): string[];
51
+ export declare function hasSingleTag(tags: string[][], tag: string): boolean;
52
+ export declare function hasEventTag(event: NostrEvent | undefined, tag: string): boolean;
50
53
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAEd,cAAc,EACf,MAAM,oCAAoC,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,KAAK,GAAI,IAAI,MAAM,qBACmB,CAAC;AAEpD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAMvE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,GACnB,IAAI,CAYN;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,GAAE,MAA8B,GAC3C,OAAO,CAAC,CAAC,CAAC,CAgBZ;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,MAAM,CAElE;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;CACtC,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BhB;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKrE"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAEd,cAAc,EACf,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;GAIG;AACH,eAAO,MAAM,KAAK,GAAI,IAAI,MAAM,qBACmB,CAAC;AAEpD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAMvE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,GACnB,IAAI,CAYN;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,GAAE,MAA8B,GAC3C,OAAO,CAAC,CAAC,CAAC,CAgBZ;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,MAAM,CAElE;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;CACtC,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BhB;AAGD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKrE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,UAAU,GAAG,SAAS,EAC7B,GAAG,EAAE,MAAM,GACV,OAAO,CAIT"}
@@ -105,6 +105,7 @@ export async function sleepWithAbort(params) {
105
105
  abortSignal.addEventListener('abort', onAbort, { once: true });
106
106
  });
107
107
  }
108
+ // TODO: Probably these methods (getTagValue, getTagValues, hasSingleTag, hasEventTag) are bit redundant
108
109
  export function getTagValue(tags, name) {
109
110
  var _a;
110
111
  return (_a = tags.find((t) => t[0] === name)) === null || _a === void 0 ? void 0 : _a[1];
@@ -115,4 +116,10 @@ export function getTagValues(tags, name) {
115
116
  .map((t) => t[1])
116
117
  .filter((v) => typeof v === 'string' && v.length > 0);
117
118
  }
119
+ export function hasSingleTag(tags, tag) {
120
+ return tags.some((t) => t.length === 1 && t[0] === tag);
121
+ }
122
+ export function hasEventTag(event, tag) {
123
+ return (Array.isArray(event === null || event === void 0 ? void 0 : event.tags) && hasSingleTag(event.tags, tag));
124
+ }
118
125
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/core/utils/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/core/utils/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface DiscoveredPeerCapabilities {
2
+ discoveryTags: string[][];
3
+ supportsEncryption: boolean;
4
+ supportsEphemeralEncryption: boolean;
5
+ supportsOversizedTransfer: boolean;
6
+ }
7
+ export declare function getDiscoveryTags(tags: readonly string[][]): string[][];
8
+ export declare function hasDiscoveryTags(tags: readonly string[][]): boolean;
9
+ export declare function parseDiscoveredPeerCapabilities(tags: readonly string[][]): DiscoveredPeerCapabilities;
10
+ export declare function mergeDiscoveryTags(currentTags: readonly string[][], incomingTags: readonly string[][]): string[][];
11
+ //# sourceMappingURL=discovery-tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery-tags.d.ts","sourceRoot":"","sources":["../../../src/transport/discovery-tags.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,2BAA2B,EAAE,OAAO,CAAC;IACrC,yBAAyB,EAAE,OAAO,CAAC;CACpC;AAMD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,CAStE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,OAAO,CAEnE;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,GACxB,0BAA0B,CAiB5B;AAED,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,SAAS,MAAM,EAAE,EAAE,EAChC,YAAY,EAAE,SAAS,MAAM,EAAE,EAAE,GAChC,MAAM,EAAE,EAAE,CAcZ"}
@@ -0,0 +1,39 @@
1
+ import { NOSTR_TAGS } from '../core/constants.js';
2
+ const NON_DISCOVERY_TAG_NAMES = new Set(['e', 'p']);
3
+ function cloneTag(tag) {
4
+ return [...tag];
5
+ }
6
+ export function getDiscoveryTags(tags) {
7
+ return tags
8
+ .filter((tag) => {
9
+ const tagName = tag[0];
10
+ return (typeof tagName === 'string' && !NON_DISCOVERY_TAG_NAMES.has(tagName));
11
+ })
12
+ .map((tag) => cloneTag(tag));
13
+ }
14
+ export function hasDiscoveryTags(tags) {
15
+ return getDiscoveryTags(tags).length > 0;
16
+ }
17
+ export function parseDiscoveredPeerCapabilities(tags) {
18
+ const discoveryTags = getDiscoveryTags(tags);
19
+ return {
20
+ discoveryTags,
21
+ supportsEncryption: discoveryTags.some((tag) => tag.length === 1 && tag[0] === NOSTR_TAGS.SUPPORT_ENCRYPTION),
22
+ supportsEphemeralEncryption: discoveryTags.some((tag) => tag.length === 1 && tag[0] === NOSTR_TAGS.SUPPORT_ENCRYPTION_EPHEMERAL),
23
+ supportsOversizedTransfer: discoveryTags.some((tag) => tag.length === 1 && tag[0] === NOSTR_TAGS.SUPPORT_OVERSIZED_TRANSFER),
24
+ };
25
+ }
26
+ export function mergeDiscoveryTags(currentTags, incomingTags) {
27
+ const mergedTags = currentTags.map((tag) => cloneTag(tag));
28
+ const seen = new Set(mergedTags.map((tag) => JSON.stringify(tag)));
29
+ for (const tag of incomingTags) {
30
+ const key = JSON.stringify(tag);
31
+ if (seen.has(key)) {
32
+ continue;
33
+ }
34
+ mergedTags.push(cloneTag(tag));
35
+ seen.add(key);
36
+ }
37
+ return mergedTags;
38
+ }
39
+ //# sourceMappingURL=discovery-tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery-tags.js","sourceRoot":"","sources":["../../../src/transport/discovery-tags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAS5D,SAAS,QAAQ,CAAC,GAAsB;IACtC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAyB;IACxD,OAAO,IAAI;SACR,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QACd,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACvB,OAAO,CACL,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,CACrE,CAAC;IACJ,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAyB;IACxD,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,IAAyB;IAEzB,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAE7C,OAAO;QACL,aAAa;QACb,kBAAkB,EAAE,aAAa,CAAC,IAAI,CACpC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,kBAAkB,CACtE;QACD,2BAA2B,EAAE,aAAa,CAAC,IAAI,CAC7C,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,4BAA4B,CACzE;QACD,yBAAyB,EAAE,aAAa,CAAC,IAAI,CAC3C,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,0BAA0B,CACvE;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,WAAgC,EAChC,YAAiC;IAEjC,MAAM,UAAU,GAAe,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAE3E,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -5,6 +5,7 @@ import { NostrEvent } from 'nostr-tools';
5
5
  import { LogLevel } from '../core/utils/logger.js';
6
6
  import { ClientCorrelationStore, PendingRequest } from './nostr-client/correlation-store.js';
7
7
  import { StatelessModeHandler } from './nostr-client/stateless-mode-handler.js';
8
+ import { type TransferPolicy } from './oversized-transfer/index.js';
8
9
  /**
9
10
  * Options for configuring the NostrClientTransport.
10
11
  */
@@ -30,6 +31,22 @@ export interface NostrTransportOptions extends Omit<BaseNostrTransportOptions, '
30
31
  isStateless?: boolean;
31
32
  /** Log level for the transport */
32
33
  logLevel?: LogLevel;
34
+ /** Options controlling CEP-22 oversized payload transfer. */
35
+ oversizedTransfer?: {
36
+ /** Whether oversized transfer is enabled. @default true */
37
+ enabled?: boolean;
38
+ /**
39
+ * Byte threshold at which the sender proactively fragments a message.
40
+ * @default DEFAULT_OVERSIZED_THRESHOLD (48 000)
41
+ */
42
+ thresholdBytes?: number;
43
+ /** Per-chunk data size in bytes. @default DEFAULT_CHUNK_SIZE (48 000) */
44
+ chunkSizeBytes?: number;
45
+ /** Timeout while waiting for `accept` when handshake is required. */
46
+ acceptTimeoutMs?: number;
47
+ /** Receiver-side admission policy. */
48
+ policy?: TransferPolicy;
49
+ };
33
50
  }
34
51
  /**
35
52
  * A client transport layer for CTXVM that uses Nostr events for communication.
@@ -73,6 +90,16 @@ export declare class NostrClientTransport extends BaseNostrTransport implements
73
90
  private serverResourceTemplatesListEvent;
74
91
  /** Whether the server has advertised ephemeral gift wrap support via Nostr tags. */
75
92
  private serverSupportsEphemeralGiftWraps;
93
+ /** Whether the server has advertised CEP-22 oversized transfer support. */
94
+ private serverSupportsOversizedTransfer;
95
+ /** Whether this client has already sent its discovery tags to the server. */
96
+ private hasSentDiscoveryTags;
97
+ private readonly oversizedEnabled;
98
+ private readonly oversizedThreshold;
99
+ private readonly oversizedChunkSize;
100
+ private readonly oversizedAcceptTimeoutMs;
101
+ /** Receives inbound oversized-transfer frames from the server (server→client responses). */
102
+ private readonly oversizedReceiver;
76
103
  /**
77
104
  * Deduplicate inbound events to avoid redundant work.
78
105
  *
@@ -91,6 +118,9 @@ export declare class NostrClientTransport extends BaseNostrTransport implements
91
118
  * Intended to be called by payments wrappers (e.g. `withClientPayments()`).
92
119
  */
93
120
  setClientPmis(pmis: readonly string[]): void;
121
+ private getClientCapabilityTags;
122
+ private getClientNegotiationTags;
123
+ private getPendingClientDiscoveryTags;
94
124
  /**
95
125
  * Starts the transport, connecting to the relay and setting up event listeners.
96
126
  */
@@ -111,6 +141,7 @@ export declare class NostrClientTransport extends BaseNostrTransport implements
111
141
  * @returns The ID of the published Nostr event
112
142
  */
113
143
  private sendRequest;
144
+ private sendOversizedRequest;
114
145
  private chooseOutboundGiftWrapKind;
115
146
  private getOriginalRequestContext;
116
147
  /**
@@ -177,6 +208,8 @@ export declare class NostrClientTransport extends BaseNostrTransport implements
177
208
  getServerResourceTemplatesListEvent(): NostrEvent | undefined;
178
209
  /** Gets the server's most recently observed prompts/list event envelope, if any. */
179
210
  getServerPromptsListEvent(): NostrEvent | undefined;
211
+ private learnServerDiscovery;
212
+ private getInitializeResultCandidate;
180
213
  private resolveOperationalRelayHandler;
181
214
  private connectFallbackOperationalRelays;
182
215
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"nostr-client-transport.d.ts","sourceRoot":"","sources":["../../../src/transport/nostr-client-transport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nostr-client-transport.d.ts","sourceRoot":"","sources":["../../../src/transport/nostr-client-transport.ts"],"names":[],"mappings":"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"}
@@ -3,33 +3,16 @@ import { CTXVM_MESSAGES_KIND, DEFAULT_BOOTSTRAP_RELAY_URLS, DEFAULT_TIMEOUT_MS,
3
3
  import { LruCache } from '../core/utils/lru-cache.js';
4
4
  import { BaseNostrTransport, } from './base-nostr-transport.js';
5
5
  import { getNostrEventTag } from '../core/utils/serializers.js';
6
- import { GiftWrapMode } from '../core/interfaces.js';
6
+ import { EncryptionMode, GiftWrapMode } from '../core/interfaces.js';
7
7
  import { ClientCorrelationStore, } from './nostr-client/correlation-store.js';
8
8
  import { parseServerIdentity } from './nostr-client/server-identity.js';
9
9
  import { fetchServerRelayList, selectOperationalRelayUrls, } from './nostr-client/server-relay-discovery.js';
10
10
  import { StatelessModeHandler } from './nostr-client/stateless-mode-handler.js';
11
- import { withTimeout } from '../core/utils/utils.js';
11
+ import { hasEventTag, hasSingleTag, withTimeout } from '../core/utils/utils.js';
12
12
  import { ApplesauceRelayPool } from '../relay/applesauce-relay-pool.js';
13
- function hasSingleTag(tags, tag) {
14
- return tags.some((t) => t.length === 1 && t[0] === tag);
15
- }
16
- function hasEventTag(event, tag) {
17
- return (Array.isArray(event === null || event === void 0 ? void 0 : event.tags) && hasSingleTag(event.tags, tag));
18
- }
19
- function hasKnownDiscoveryTag(event) {
20
- if (!event || !Array.isArray(event.tags)) {
21
- return false;
22
- }
23
- const knownDiscoveryTags = new Set([
24
- NOSTR_TAGS.NAME,
25
- NOSTR_TAGS.ABOUT,
26
- NOSTR_TAGS.WEBSITE,
27
- NOSTR_TAGS.PICTURE,
28
- NOSTR_TAGS.SUPPORT_ENCRYPTION,
29
- NOSTR_TAGS.SUPPORT_ENCRYPTION_EPHEMERAL,
30
- ]);
31
- return event.tags.some((tag) => { var _a; return knownDiscoveryTags.has((_a = tag[0]) !== null && _a !== void 0 ? _a : ''); });
32
- }
13
+ import { OversizedTransferReceiver, sendOversizedTransfer, } from './oversized-transfer/index.js';
14
+ import { hasDiscoveryTags, mergeDiscoveryTags, parseDiscoveredPeerCapabilities, } from './discovery-tags.js';
15
+ import { DEFAULT_CHUNK_SIZE, DEFAULT_OVERSIZED_THRESHOLD, } from './oversized-transfer/constants.js';
33
16
  /**
34
17
  * A client transport layer for CTXVM that uses Nostr events for communication.
35
18
  * Implements the Transport interface from the @modelcontextprotocol/sdk.
@@ -42,7 +25,7 @@ export class NostrClientTransport extends BaseNostrTransport {
42
25
  * @throws Error if serverPubkey is not a valid supported server identifier
43
26
  */
44
27
  constructor(options) {
45
- var _a, _b, _c, _d;
28
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
46
29
  super('nostr-client-transport', {
47
30
  ...options,
48
31
  relayHandler: (_a = options.relayHandler) !== null && _a !== void 0 ? _a : [],
@@ -50,6 +33,10 @@ export class NostrClientTransport extends BaseNostrTransport {
50
33
  this.onmessageWithContext = undefined;
51
34
  /** Whether the server has advertised ephemeral gift wrap support via Nostr tags. */
52
35
  this.serverSupportsEphemeralGiftWraps = false;
36
+ /** Whether the server has advertised CEP-22 oversized transfer support. */
37
+ this.serverSupportsOversizedTransfer = false;
38
+ /** Whether this client has already sent its discovery tags to the server. */
39
+ this.hasSentDiscoveryTags = false;
53
40
  /**
54
41
  * Deduplicate inbound events to avoid redundant work.
55
42
  *
@@ -71,6 +58,12 @@ export class NostrClientTransport extends BaseNostrTransport {
71
58
  },
72
59
  });
73
60
  this.statelessHandler = new StatelessModeHandler();
61
+ const ot = options.oversizedTransfer;
62
+ this.oversizedEnabled = (_e = ot === null || ot === void 0 ? void 0 : ot.enabled) !== null && _e !== void 0 ? _e : true;
63
+ this.oversizedThreshold = (_f = ot === null || ot === void 0 ? void 0 : ot.thresholdBytes) !== null && _f !== void 0 ? _f : DEFAULT_OVERSIZED_THRESHOLD;
64
+ this.oversizedChunkSize = (_g = ot === null || ot === void 0 ? void 0 : ot.chunkSizeBytes) !== null && _g !== void 0 ? _g : DEFAULT_CHUNK_SIZE;
65
+ this.oversizedAcceptTimeoutMs = (_h = ot === null || ot === void 0 ? void 0 : ot.acceptTimeoutMs) !== null && _h !== void 0 ? _h : DEFAULT_TIMEOUT_MS;
66
+ this.oversizedReceiver = new OversizedTransferReceiver((_j = ot === null || ot === void 0 ? void 0 : ot.policy) !== null && _j !== void 0 ? _j : {}, this.logger);
74
67
  }
75
68
  /**
76
69
  * Sets the client PMI preference list used for CEP-8 discovery/negotiation.
@@ -80,6 +73,29 @@ export class NostrClientTransport extends BaseNostrTransport {
80
73
  setClientPmis(pmis) {
81
74
  this.clientPmis = pmis;
82
75
  }
76
+ getClientCapabilityTags() {
77
+ const tags = [];
78
+ if (this.encryptionMode !== EncryptionMode.DISABLED) {
79
+ tags.push([NOSTR_TAGS.SUPPORT_ENCRYPTION]);
80
+ }
81
+ if (this.giftWrapMode === GiftWrapMode.EPHEMERAL) {
82
+ tags.push([NOSTR_TAGS.SUPPORT_ENCRYPTION_EPHEMERAL]);
83
+ }
84
+ if (this.oversizedEnabled) {
85
+ tags.push([NOSTR_TAGS.SUPPORT_OVERSIZED_TRANSFER]);
86
+ }
87
+ return tags;
88
+ }
89
+ getClientNegotiationTags() {
90
+ const tags = [];
91
+ if (this.clientPmis) {
92
+ tags.push(...this.clientPmis.map((pmi) => ['pmi', pmi]));
93
+ }
94
+ return tags;
95
+ }
96
+ getPendingClientDiscoveryTags() {
97
+ return this.hasSentDiscoveryTags ? [] : this.getClientCapabilityTags();
98
+ }
83
99
  /**
84
100
  * Starts the transport, connecting to the relay and setting up event listeners.
85
101
  */
@@ -125,6 +141,7 @@ export class NostrClientTransport extends BaseNostrTransport {
125
141
  await this.disconnect();
126
142
  this.correlationStore.clear();
127
143
  this.seenEventIds.clear();
144
+ this.oversizedReceiver.clear();
128
145
  (_a = this.onclose) === null || _a === void 0 ? void 0 : _a.call(this);
129
146
  }
130
147
  catch (error) {
@@ -171,13 +188,29 @@ export class NostrClientTransport extends BaseNostrTransport {
171
188
  * @returns The ID of the published Nostr event
172
189
  */
173
190
  async sendRequest(message) {
191
+ var _a, _b;
174
192
  const isRequest = isJSONRPCRequest(message);
175
- const pmiTags = isRequest && this.clientPmis
176
- ? this.clientPmis.map((pmi) => ['pmi', pmi])
177
- : [];
178
- const tags = [...this.createRecipientTags(this.serverPubkey), ...pmiTags];
193
+ // --- CEP-22 Oversized Transfer (proactive path) ---
194
+ if (this.oversizedEnabled && isRequest) {
195
+ const progressToken = (_b = (_a = message.params) === null || _a === void 0 ? void 0 : _a._meta) === null || _b === void 0 ? void 0 : _b.progressToken;
196
+ if (progressToken !== undefined) {
197
+ const serialized = JSON.stringify(message);
198
+ const byteLength = new TextEncoder().encode(serialized).byteLength;
199
+ if (byteLength > this.oversizedThreshold) {
200
+ await this.sendOversizedRequest(message, serialized, String(progressToken));
201
+ return 'oversized-transfer';
202
+ }
203
+ }
204
+ }
205
+ const discoveryTags = isRequest ? this.getPendingClientDiscoveryTags() : [];
206
+ const negotiationTags = isRequest ? this.getClientNegotiationTags() : [];
207
+ const tags = [
208
+ ...this.createRecipientTags(this.serverPubkey),
209
+ ...discoveryTags,
210
+ ...negotiationTags,
211
+ ];
179
212
  const giftWrapKind = this.chooseOutboundGiftWrapKind();
180
- return await this.sendMcpMessage(message, this.serverPubkey, CTXVM_MESSAGES_KIND, tags, undefined, (eventId) => {
213
+ const eventId = await this.sendMcpMessage(message, this.serverPubkey, CTXVM_MESSAGES_KIND, tags, undefined, (eventId) => {
181
214
  var _a, _b;
182
215
  const progressToken = isRequest
183
216
  ? (_b = (_a = message.params) === null || _a === void 0 ? void 0 : _a._meta) === null || _b === void 0 ? void 0 : _b.progressToken
@@ -192,6 +225,49 @@ export class NostrClientTransport extends BaseNostrTransport {
192
225
  originalRequestContext,
193
226
  });
194
227
  }, giftWrapKind);
228
+ if (isRequest && discoveryTags.length > 0) {
229
+ this.hasSentDiscoveryTags = true;
230
+ }
231
+ return eventId;
232
+ }
233
+ //Splits an oversized request into CEP-22 transfer frames and sends them sequentially. Waits for an `accept` frame from the server when the server's support is not yet known.
234
+ async sendOversizedRequest(originalMessage, serialized, progressToken) {
235
+ const frameRecipientTags = this.createRecipientTags(this.serverPubkey);
236
+ const discoveryTags = this.getPendingClientDiscoveryTags();
237
+ const startFrameTags = [
238
+ ...frameRecipientTags,
239
+ ...discoveryTags,
240
+ ...this.getClientNegotiationTags(),
241
+ ];
242
+ const giftWrapKind = this.chooseOutboundGiftWrapKind();
243
+ const needsAcceptHandshake = !this.serverSupportsOversizedTransfer;
244
+ const sendFrame = async (params, tags) => {
245
+ const notification = {
246
+ jsonrpc: '2.0',
247
+ method: 'notifications/progress',
248
+ params,
249
+ };
250
+ return await this.sendMcpMessage(notification, this.serverPubkey, CTXVM_MESSAGES_KIND, tags, undefined, undefined, giftWrapKind);
251
+ };
252
+ const endFrameEventId = await sendOversizedTransfer(serialized, {
253
+ progressToken,
254
+ chunkSizeBytes: this.oversizedChunkSize,
255
+ needsAcceptHandshake,
256
+ publishFrame: async (frame, ctx) => await sendFrame(frame, ctx.isStartFrame ? startFrameTags : frameRecipientTags),
257
+ waitForAccept: async (token) => await this.oversizedReceiver.waitForAccept(token, this.oversizedAcceptTimeoutMs),
258
+ });
259
+ // Register the original request for correlating the final response.
260
+ if (endFrameEventId) {
261
+ this.correlationStore.registerRequest(endFrameEventId, {
262
+ originalRequestId: originalMessage.id,
263
+ isInitialize: originalMessage.method === INITIALIZE_METHOD,
264
+ progressToken,
265
+ originalRequestContext: this.getOriginalRequestContext(originalMessage),
266
+ });
267
+ }
268
+ if (discoveryTags.length > 0) {
269
+ this.hasSentDiscoveryTags = true;
270
+ }
195
271
  }
196
272
  chooseOutboundGiftWrapKind() {
197
273
  var _a;
@@ -322,21 +398,8 @@ export class NostrClientTransport extends BaseNostrTransport {
322
398
  });
323
399
  return;
324
400
  }
325
- // Learn server transport capabilities from any inbound server envelope tags.
326
- // This enables ephemeral gift wrap discovery even when clients operate in stateless
327
- // mode (no real initialize handshake observed).
328
- if (!this.serverSupportsEphemeralGiftWraps &&
329
- Array.isArray(nostrEvent.tags) &&
330
- hasSingleTag(nostrEvent.tags, NOSTR_TAGS.SUPPORT_ENCRYPTION_EPHEMERAL)) {
331
- this.serverSupportsEphemeralGiftWraps = true;
332
- }
401
+ this.learnServerDiscovery(nostrEvent);
333
402
  const eTag = getNostrEventTag(nostrEvent.tags, 'e');
334
- if (!this.serverInitializeEvent && hasKnownDiscoveryTag(nostrEvent)) {
335
- this.serverInitializeEvent = nostrEvent;
336
- this.logger.info('Learned server discovery tags from direct response', {
337
- eventId: nostrEvent.id,
338
- });
339
- }
340
403
  if (!this.serverInitializeEvent && eTag) {
341
404
  try {
342
405
  const content = JSON.parse(nostrEvent.content);
@@ -506,6 +569,42 @@ export class NostrClientTransport extends BaseNostrTransport {
506
569
  getServerPromptsListEvent() {
507
570
  return this.serverPromptsListEvent;
508
571
  }
572
+ learnServerDiscovery(event) {
573
+ if (!Array.isArray(event.tags) || !hasDiscoveryTags(event.tags)) {
574
+ return;
575
+ }
576
+ const discovered = parseDiscoveredPeerCapabilities(event.tags);
577
+ this.serverSupportsEphemeralGiftWraps || (this.serverSupportsEphemeralGiftWraps = discovered.supportsEphemeralEncryption);
578
+ this.serverSupportsOversizedTransfer || (this.serverSupportsOversizedTransfer = discovered.supportsOversizedTransfer);
579
+ if (!this.serverInitializeEvent) {
580
+ this.serverInitializeEvent = event;
581
+ this.logger.info('Learned server discovery tags from inbound event', {
582
+ eventId: event.id,
583
+ });
584
+ return;
585
+ }
586
+ const mergedTags = mergeDiscoveryTags(this.serverInitializeEvent.tags, discovered.discoveryTags);
587
+ const currentHasInitializeResult = InitializeResultSchema.safeParse(this.getInitializeResultCandidate(event)).success;
588
+ const existingHasInitializeResult = InitializeResultSchema.safeParse(this.getInitializeResultCandidate(this.serverInitializeEvent)).success;
589
+ this.serverInitializeEvent = {
590
+ ...(currentHasInitializeResult ? event : this.serverInitializeEvent),
591
+ tags: mergedTags,
592
+ };
593
+ if (!existingHasInitializeResult && currentHasInitializeResult) {
594
+ this.logger.info('Upgraded learned server discovery event to initialize response', {
595
+ eventId: event.id,
596
+ });
597
+ }
598
+ }
599
+ getInitializeResultCandidate(event) {
600
+ try {
601
+ const content = JSON.parse(event.content);
602
+ return content.result;
603
+ }
604
+ catch (_a) {
605
+ return undefined;
606
+ }
607
+ }
509
608
  async resolveOperationalRelayHandler() {
510
609
  var _a, _b, _c;
511
610
  const configuredRelayUrls = (_c = (_b = (_a = this.relayHandler).getRelayUrls) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : [];
@@ -627,6 +726,38 @@ export class NostrClientTransport extends BaseNostrTransport {
627
726
  });
628
727
  return;
629
728
  }
729
+ // CEP-22: intercept oversized-transfer frames and do NOT forward raw frames.
730
+ if (isJSONRPCNotification(mcpMessage) &&
731
+ mcpMessage.method === 'notifications/progress' &&
732
+ OversizedTransferReceiver.isOversizedFrame(mcpMessage)) {
733
+ this.oversizedReceiver
734
+ .processFrame(mcpMessage)
735
+ .then((synthetic) => {
736
+ if (synthetic !== null) {
737
+ if (isJSONRPCResultResponse(synthetic) ||
738
+ isJSONRPCErrorResponse(synthetic)) {
739
+ if (correlatedEventId) {
740
+ this.handleResponse(correlatedEventId, synthetic);
741
+ }
742
+ else {
743
+ this.logger.warn('Oversized response completed without correlation `e` tag', {
744
+ eventId,
745
+ });
746
+ }
747
+ return;
748
+ }
749
+ this.handleNotification(eventId, correlatedEventId, synthetic);
750
+ }
751
+ })
752
+ .catch((err) => {
753
+ var _a;
754
+ this.logger.error('Oversized transfer error (client)', {
755
+ error: err instanceof Error ? err.message : String(err),
756
+ });
757
+ (_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, err instanceof Error ? err : new Error(String(err)));
758
+ });
759
+ return;
760
+ }
630
761
  (_a = this.onmessage) === null || _a === void 0 ? void 0 : _a.call(this, mcpMessage);
631
762
  (_b = this.onmessageWithContext) === null || _b === void 0 ? void 0 : _b.call(this, mcpMessage, {
632
763
  eventId,