@snap-protocol/core 0.1.0

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 (141) hide show
  1. package/dist/agent/AgentCardBuilder.d.ts +26 -0
  2. package/dist/agent/AgentCardBuilder.d.ts.map +1 -0
  3. package/dist/agent/AgentCardBuilder.js +99 -0
  4. package/dist/agent/AgentCardBuilder.js.map +1 -0
  5. package/dist/agent/SnapAgent.d.ts +61 -0
  6. package/dist/agent/SnapAgent.d.ts.map +1 -0
  7. package/dist/agent/SnapAgent.js +245 -0
  8. package/dist/agent/SnapAgent.js.map +1 -0
  9. package/dist/agent/index.d.ts +4 -0
  10. package/dist/agent/index.d.ts.map +1 -0
  11. package/dist/agent/index.js +3 -0
  12. package/dist/agent/index.js.map +1 -0
  13. package/dist/crypto/Canonicalizer.d.ts +9 -0
  14. package/dist/crypto/Canonicalizer.d.ts.map +1 -0
  15. package/dist/crypto/Canonicalizer.js +18 -0
  16. package/dist/crypto/Canonicalizer.js.map +1 -0
  17. package/dist/crypto/KeyManager.d.ts +31 -0
  18. package/dist/crypto/KeyManager.d.ts.map +1 -0
  19. package/dist/crypto/KeyManager.js +79 -0
  20. package/dist/crypto/KeyManager.js.map +1 -0
  21. package/dist/crypto/Signer.d.ts +31 -0
  22. package/dist/crypto/Signer.d.ts.map +1 -0
  23. package/dist/crypto/Signer.js +64 -0
  24. package/dist/crypto/Signer.js.map +1 -0
  25. package/dist/crypto/index.d.ts +5 -0
  26. package/dist/crypto/index.d.ts.map +1 -0
  27. package/dist/crypto/index.js +4 -0
  28. package/dist/crypto/index.js.map +1 -0
  29. package/dist/errors/SnapError.d.ts +15 -0
  30. package/dist/errors/SnapError.d.ts.map +1 -0
  31. package/dist/errors/SnapError.js +44 -0
  32. package/dist/errors/SnapError.js.map +1 -0
  33. package/dist/errors/index.d.ts +2 -0
  34. package/dist/errors/index.d.ts.map +1 -0
  35. package/dist/errors/index.js +2 -0
  36. package/dist/errors/index.js.map +1 -0
  37. package/dist/index.d.ts +34 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +24 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/messaging/MessageBuilder.d.ts +25 -0
  42. package/dist/messaging/MessageBuilder.d.ts.map +1 -0
  43. package/dist/messaging/MessageBuilder.js +68 -0
  44. package/dist/messaging/MessageBuilder.js.map +1 -0
  45. package/dist/messaging/MessageSigner.d.ts +24 -0
  46. package/dist/messaging/MessageSigner.d.ts.map +1 -0
  47. package/dist/messaging/MessageSigner.js +34 -0
  48. package/dist/messaging/MessageSigner.js.map +1 -0
  49. package/dist/messaging/MessageValidator.d.ts +32 -0
  50. package/dist/messaging/MessageValidator.d.ts.map +1 -0
  51. package/dist/messaging/MessageValidator.js +82 -0
  52. package/dist/messaging/MessageValidator.js.map +1 -0
  53. package/dist/messaging/index.d.ts +5 -0
  54. package/dist/messaging/index.d.ts.map +1 -0
  55. package/dist/messaging/index.js +4 -0
  56. package/dist/messaging/index.js.map +1 -0
  57. package/dist/plugins/PluginRegistry.d.ts +17 -0
  58. package/dist/plugins/PluginRegistry.d.ts.map +1 -0
  59. package/dist/plugins/PluginRegistry.js +34 -0
  60. package/dist/plugins/PluginRegistry.js.map +1 -0
  61. package/dist/plugins/index.d.ts +2 -0
  62. package/dist/plugins/index.d.ts.map +1 -0
  63. package/dist/plugins/index.js +2 -0
  64. package/dist/plugins/index.js.map +1 -0
  65. package/dist/stores/InMemoryReplayStore.d.ts +21 -0
  66. package/dist/stores/InMemoryReplayStore.d.ts.map +1 -0
  67. package/dist/stores/InMemoryReplayStore.js +39 -0
  68. package/dist/stores/InMemoryReplayStore.js.map +1 -0
  69. package/dist/stores/InMemoryTaskStore.d.ts +14 -0
  70. package/dist/stores/InMemoryTaskStore.d.ts.map +1 -0
  71. package/dist/stores/InMemoryTaskStore.js +22 -0
  72. package/dist/stores/InMemoryTaskStore.js.map +1 -0
  73. package/dist/stores/index.d.ts +3 -0
  74. package/dist/stores/index.d.ts.map +1 -0
  75. package/dist/stores/index.js +3 -0
  76. package/dist/stores/index.js.map +1 -0
  77. package/dist/transport/HttpTransport.d.ts +41 -0
  78. package/dist/transport/HttpTransport.d.ts.map +1 -0
  79. package/dist/transport/HttpTransport.js +196 -0
  80. package/dist/transport/HttpTransport.js.map +1 -0
  81. package/dist/transport/NostrTransport.d.ts +55 -0
  82. package/dist/transport/NostrTransport.d.ts.map +1 -0
  83. package/dist/transport/NostrTransport.js +211 -0
  84. package/dist/transport/NostrTransport.js.map +1 -0
  85. package/dist/transport/WebSocketTransport.d.ts +41 -0
  86. package/dist/transport/WebSocketTransport.d.ts.map +1 -0
  87. package/dist/transport/WebSocketTransport.js +206 -0
  88. package/dist/transport/WebSocketTransport.js.map +1 -0
  89. package/dist/transport/index.d.ts +7 -0
  90. package/dist/transport/index.d.ts.map +1 -0
  91. package/dist/transport/index.js +4 -0
  92. package/dist/transport/index.js.map +1 -0
  93. package/dist/types/agent-card.d.ts +53 -0
  94. package/dist/types/agent-card.d.ts.map +1 -0
  95. package/dist/types/agent-card.js +2 -0
  96. package/dist/types/agent-card.js.map +1 -0
  97. package/dist/types/artifact.d.ts +8 -0
  98. package/dist/types/artifact.d.ts.map +1 -0
  99. package/dist/types/artifact.js +2 -0
  100. package/dist/types/artifact.js.map +1 -0
  101. package/dist/types/errors.d.ts +25 -0
  102. package/dist/types/errors.d.ts.map +1 -0
  103. package/dist/types/errors.js +24 -0
  104. package/dist/types/errors.js.map +1 -0
  105. package/dist/types/handler.d.ts +38 -0
  106. package/dist/types/handler.d.ts.map +1 -0
  107. package/dist/types/handler.js +2 -0
  108. package/dist/types/handler.js.map +1 -0
  109. package/dist/types/index.d.ts +13 -0
  110. package/dist/types/index.d.ts.map +1 -0
  111. package/dist/types/index.js +2 -0
  112. package/dist/types/index.js.map +1 -0
  113. package/dist/types/keys.d.ts +15 -0
  114. package/dist/types/keys.d.ts.map +1 -0
  115. package/dist/types/keys.js +2 -0
  116. package/dist/types/keys.js.map +1 -0
  117. package/dist/types/message.d.ts +29 -0
  118. package/dist/types/message.d.ts.map +1 -0
  119. package/dist/types/message.js +2 -0
  120. package/dist/types/message.js.map +1 -0
  121. package/dist/types/part.d.ts +25 -0
  122. package/dist/types/part.d.ts.map +1 -0
  123. package/dist/types/part.js +2 -0
  124. package/dist/types/part.js.map +1 -0
  125. package/dist/types/payloads.d.ts +34 -0
  126. package/dist/types/payloads.d.ts.map +1 -0
  127. package/dist/types/payloads.js +2 -0
  128. package/dist/types/payloads.js.map +1 -0
  129. package/dist/types/plugin.d.ts +33 -0
  130. package/dist/types/plugin.d.ts.map +1 -0
  131. package/dist/types/plugin.js +2 -0
  132. package/dist/types/plugin.js.map +1 -0
  133. package/dist/types/task.d.ts +26 -0
  134. package/dist/types/task.d.ts.map +1 -0
  135. package/dist/types/task.js +2 -0
  136. package/dist/types/task.js.map +1 -0
  137. package/dist/types/transport.d.ts +24 -0
  138. package/dist/types/transport.d.ts.map +1 -0
  139. package/dist/types/transport.js +2 -0
  140. package/dist/types/transport.js.map +1 -0
  141. package/package.json +38 -0
@@ -0,0 +1,211 @@
1
+ import { SimplePool, finalizeEvent, getPublicKey, } from 'nostr-tools';
2
+ import * as nip44 from 'nostr-tools/nip44';
3
+ import { hexToBytes } from '@noble/hashes/utils';
4
+ import { KeyManager } from '../crypto/KeyManager.js';
5
+ /** Default Nostr event kind for encrypted SNAP messages. */
6
+ export const SNAP_MESSAGE_KIND = 21339;
7
+ /** Default Nostr event kind for agent card publication (replaceable). */
8
+ export const SNAP_AGENT_CARD_KIND = 31337;
9
+ /** Nostr transport: encrypted messaging via relays + agent card discovery. */
10
+ export class NostrTransport {
11
+ name = 'nostr';
12
+ config;
13
+ pool;
14
+ pubkey;
15
+ secretKeyBytes;
16
+ subscriptionCloser = null;
17
+ constructor(config) {
18
+ this.config = {
19
+ ...config,
20
+ timeout: config.timeout ?? 30_000,
21
+ messageKind: config.messageKind ?? SNAP_MESSAGE_KIND,
22
+ agentCardKind: config.agentCardKind ?? SNAP_AGENT_CARD_KIND,
23
+ responseLookbackSeconds: config.responseLookbackSeconds ?? 5,
24
+ logger: config.logger,
25
+ };
26
+ this.pool = new SimplePool();
27
+ this.secretKeyBytes = hexToBytes(config.privateKey);
28
+ this.pubkey = getPublicKey(this.secretKeyBytes);
29
+ }
30
+ /**
31
+ * Send an encrypted SNAP message to another agent via Nostr.
32
+ * The recipient is determined by converting message.to (P2TR) to a hex pubkey.
33
+ */
34
+ async send(message, options) {
35
+ const recipientPubkey = KeyManager.p2trToPublicKey(message.to);
36
+ const conversationKey = nip44.v2.utils.getConversationKey(this.secretKeyBytes, recipientPubkey);
37
+ const encrypted = nip44.v2.encrypt(JSON.stringify(message), conversationKey);
38
+ const eventTemplate = {
39
+ kind: this.config.messageKind,
40
+ tags: [['p', recipientPubkey]],
41
+ content: encrypted,
42
+ created_at: Math.floor(Date.now() / 1000),
43
+ };
44
+ const signed = finalizeEvent(eventTemplate, this.secretKeyBytes);
45
+ // Publish to all relays
46
+ await Promise.allSettled(this.pool.publish(this.config.relays, signed));
47
+ // Wait for response
48
+ return new Promise((resolve, reject) => {
49
+ const timeout = setTimeout(() => {
50
+ sub.close();
51
+ reject(new Error('Nostr response timed out'));
52
+ }, options.timeout ?? this.config.timeout);
53
+ const filter = {
54
+ kinds: [this.config.messageKind],
55
+ '#p': [this.pubkey],
56
+ since: Math.floor(Date.now() / 1000) - this.config.responseLookbackSeconds,
57
+ };
58
+ const sub = this.pool.subscribeMany(this.config.relays, filter, {
59
+ onevent: (event) => {
60
+ try {
61
+ const senderConvKey = nip44.v2.utils.getConversationKey(this.secretKeyBytes, event.pubkey);
62
+ const decrypted = nip44.v2.decrypt(event.content, senderConvKey);
63
+ const response = JSON.parse(decrypted);
64
+ // Verify that the SNAP message `from` matches the Nostr event pubkey
65
+ const expectedAddress = KeyManager.publicKeyToP2TR(event.pubkey);
66
+ if (response.from !== expectedAddress) {
67
+ this.config.logger?.('warn', `Identity mismatch in response: SNAP from=${response.from} but Nostr pubkey maps to ${expectedAddress}`);
68
+ return;
69
+ }
70
+ // Check if this is a response to our message
71
+ if (response.type === 'response' && response.method === message.method) {
72
+ clearTimeout(timeout);
73
+ sub.close();
74
+ resolve(response);
75
+ }
76
+ }
77
+ catch (err) {
78
+ this.config.logger?.('debug', 'Failed to decrypt/parse Nostr event in send()', err);
79
+ }
80
+ },
81
+ });
82
+ });
83
+ }
84
+ /** Subscribe to incoming SNAP messages. */
85
+ async listen(handler) {
86
+ const filter = {
87
+ kinds: [this.config.messageKind],
88
+ '#p': [this.pubkey],
89
+ since: Math.floor(Date.now() / 1000),
90
+ };
91
+ this.subscriptionCloser = this.pool.subscribeMany(this.config.relays, filter, {
92
+ onevent: async (event) => {
93
+ try {
94
+ const conversationKey = nip44.v2.utils.getConversationKey(this.secretKeyBytes, event.pubkey);
95
+ const decrypted = nip44.v2.decrypt(event.content, conversationKey);
96
+ const inbound = JSON.parse(decrypted);
97
+ // Verify that the SNAP message `from` matches the Nostr event pubkey
98
+ const expectedAddress = KeyManager.publicKeyToP2TR(event.pubkey);
99
+ if (inbound.from !== expectedAddress) {
100
+ this.config.logger?.('warn', `Identity mismatch: SNAP from=${inbound.from} but Nostr pubkey maps to ${expectedAddress}`);
101
+ return;
102
+ }
103
+ const response = await handler(inbound);
104
+ if (response) {
105
+ const respEncrypted = nip44.v2.encrypt(JSON.stringify(response), conversationKey);
106
+ const respEvent = {
107
+ kind: this.config.messageKind,
108
+ tags: [['p', event.pubkey]],
109
+ content: respEncrypted,
110
+ created_at: Math.floor(Date.now() / 1000),
111
+ };
112
+ const signed = finalizeEvent(respEvent, this.secretKeyBytes);
113
+ await Promise.allSettled(this.pool.publish(this.config.relays, signed));
114
+ }
115
+ }
116
+ catch (err) {
117
+ this.config.logger?.('warn', 'Failed to process inbound Nostr message', err);
118
+ }
119
+ },
120
+ });
121
+ }
122
+ /** Publish an agent card as a Nostr replaceable event (kind 31337). */
123
+ async publishAgentCard(card) {
124
+ const tags = [
125
+ ['d', card.identity],
126
+ ['name', card.name],
127
+ ['version', card.version],
128
+ ];
129
+ for (const skill of card.skills) {
130
+ tags.push(['skill', skill.id, skill.name]);
131
+ }
132
+ if (card.endpoints) {
133
+ for (const ep of card.endpoints) {
134
+ tags.push(['endpoint', ep.protocol, ep.url]);
135
+ }
136
+ }
137
+ if (card.nostrRelays) {
138
+ for (const relay of card.nostrRelays) {
139
+ tags.push(['relay', relay]);
140
+ }
141
+ }
142
+ const eventTemplate = {
143
+ kind: this.config.agentCardKind,
144
+ tags,
145
+ content: JSON.stringify(card),
146
+ created_at: Math.floor(Date.now() / 1000),
147
+ };
148
+ const signed = finalizeEvent(eventTemplate, this.secretKeyBytes);
149
+ await Promise.allSettled(this.pool.publish(this.config.relays, signed));
150
+ }
151
+ /** Query Nostr relays for agent cards matching the filter. */
152
+ async discoverAgents(filter) {
153
+ const nostrFilter = {
154
+ kinds: [this.config.agentCardKind],
155
+ };
156
+ if (filter.identity) {
157
+ nostrFilter['#d'] = [filter.identity];
158
+ }
159
+ if (filter.skills) {
160
+ nostrFilter['#skill'] = filter.skills;
161
+ }
162
+ if (filter.name) {
163
+ nostrFilter['#name'] = [filter.name];
164
+ }
165
+ const events = await this.pool.querySync(this.config.relays, nostrFilter);
166
+ return events.map((event) => {
167
+ try {
168
+ return JSON.parse(event.content);
169
+ }
170
+ catch (err) {
171
+ this.config.logger?.('warn', 'Failed to parse agent card from Nostr event', err);
172
+ return null;
173
+ }
174
+ }).filter((card) => card !== null);
175
+ }
176
+ /** Fetch offline messages since a given unix timestamp. */
177
+ async fetchOfflineMessages(since) {
178
+ const filter = {
179
+ kinds: [this.config.messageKind],
180
+ '#p': [this.pubkey],
181
+ since,
182
+ };
183
+ const events = await this.pool.querySync(this.config.relays, filter);
184
+ const messages = [];
185
+ for (const event of events) {
186
+ try {
187
+ const conversationKey = nip44.v2.utils.getConversationKey(this.secretKeyBytes, event.pubkey);
188
+ const decrypted = nip44.v2.decrypt(event.content, conversationKey);
189
+ const parsed = JSON.parse(decrypted);
190
+ // Verify that the SNAP message `from` matches the Nostr event pubkey
191
+ const expectedAddress = KeyManager.publicKeyToP2TR(event.pubkey);
192
+ if (parsed.from !== expectedAddress) {
193
+ this.config.logger?.('warn', `Identity mismatch in offline message: SNAP from=${parsed.from} but Nostr pubkey maps to ${expectedAddress}`);
194
+ continue;
195
+ }
196
+ messages.push(parsed);
197
+ }
198
+ catch (err) {
199
+ this.config.logger?.('debug', 'Skipping undecryptable offline message', err);
200
+ }
201
+ }
202
+ return messages;
203
+ }
204
+ /** Close all relay connections and subscriptions. */
205
+ async close() {
206
+ this.subscriptionCloser?.close();
207
+ this.subscriptionCloser = null;
208
+ this.pool.destroy();
209
+ }
210
+ }
211
+ //# sourceMappingURL=NostrTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NostrTransport.js","sourceRoot":"","sources":["../../src/transport/NostrTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,aAAa,EACb,YAAY,GAIb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKjD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,4DAA4D;AAC5D,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEvC,yEAAyE;AACzE,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAyB1C,8EAA8E;AAC9E,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,OAAO,CAAC;IAEP,MAAM,CAAyK;IAC/K,IAAI,CAAa;IACjB,MAAM,CAAS;IACf,cAAc,CAAa;IACpC,kBAAkB,GAAiC,IAAI,CAAC;IAEhE,YAAY,MAA4B;QACtC,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,MAAM;YACT,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM;YACjC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,iBAAiB;YACpD,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,oBAAoB;YAC3D,uBAAuB,EAAE,MAAM,CAAC,uBAAuB,IAAI,CAAC;YAC5D,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,OAAoB,EAAE,OAA6B;QAC5D,MAAM,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,eAAe,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;QAChG,MAAM,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC;QAE7E,MAAM,aAAa,GAAkB;YACnC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YAC7B,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YAC9B,OAAO,EAAE,SAAS;YAClB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;SAC1C,CAAC;QAEF,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAEjE,wBAAwB;QACxB,MAAM,OAAO,CAAC,UAAU,CACtB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAC9C,CAAC;QAEF,oBAAoB;QACpB,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,GAAG,CAAC,KAAK,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;YAChD,CAAC,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAW;gBACrB,KAAK,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;gBAChC,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,uBAAuB;aAC3E,CAAC;YAEF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE;gBAC9D,OAAO,EAAE,CAAC,KAAiB,EAAE,EAAE;oBAC7B,IAAI,CAAC;wBACH,MAAM,aAAa,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CACrD,IAAI,CAAC,cAAc,EACnB,KAAK,CAAC,MAAM,CACb,CAAC;wBACF,MAAM,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;wBACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAgB,CAAC;wBAEtD,qEAAqE;wBACrE,MAAM,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;wBACjE,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;4BACtC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,4CAA4C,QAAQ,CAAC,IAAI,6BAA6B,eAAe,EAAE,CAAC,CAAC;4BACtI,OAAO;wBACT,CAAC;wBAED,6CAA6C;wBAC7C,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;4BACvE,YAAY,CAAC,OAAO,CAAC,CAAC;4BACtB,GAAG,CAAC,KAAK,EAAE,CAAC;4BACZ,OAAO,CAAC,QAAQ,CAAC,CAAC;wBACpB,CAAC;oBACH,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,+CAA+C,EAAE,GAAG,CAAC,CAAC;oBACtF,CAAC;gBACH,CAAC;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,2CAA2C;IAC3C,KAAK,CAAC,MAAM,CACV,OAA8D;QAE9D,MAAM,MAAM,GAAW;YACrB,KAAK,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YAChC,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;SACrC,CAAC;QAEF,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE;YAC5E,OAAO,EAAE,KAAK,EAAE,KAAiB,EAAE,EAAE;gBACnC,IAAI,CAAC;oBACH,MAAM,eAAe,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CACvD,IAAI,CAAC,cAAc,EACnB,KAAK,CAAC,MAAM,CACb,CAAC;oBACF,MAAM,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;oBACnE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAgB,CAAC;oBAErD,qEAAqE;oBACrE,MAAM,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACjE,IAAI,OAAO,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;wBACrC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,gCAAgC,OAAO,CAAC,IAAI,6BAA6B,eAAe,EAAE,CAAC,CAAC;wBACzH,OAAO;oBACT,CAAC;oBAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;oBAExC,IAAI,QAAQ,EAAE,CAAC;wBACb,MAAM,aAAa,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC,CAAC;wBAElF,MAAM,SAAS,GAAkB;4BAC/B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;4BAC7B,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;4BAC3B,OAAO,EAAE,aAAa;4BACtB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;yBAC1C,CAAC;wBAEF,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;wBAC7D,MAAM,OAAO,CAAC,UAAU,CACtB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAC9C,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,yCAAyC,EAAE,GAAG,CAAC,CAAC;gBAC/E,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,gBAAgB,CAAC,IAAe;QACpC,MAAM,IAAI,GAAe;YACvB,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC;YACpB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;YACnB,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;SAC1B,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAChC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAkB;YACnC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;YAC/B,IAAI;YACJ,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC7B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;SAC1C,CAAC;QAEF,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACjE,MAAM,OAAO,CAAC,UAAU,CACtB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAC9C,CAAC;IACJ,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,cAAc,CAAC,MAA4B;QAC/C,MAAM,WAAW,GAAW;YAC1B,KAAK,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;SACnC,CAAC;QAEF,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,WAAW,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACxC,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAE1E,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC1B,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;YAChD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,6CAA6C,EAAE,GAAG,CAAC,CAAC;gBACjF,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAqB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,oBAAoB,CAAC,KAAa;QACtC,MAAM,MAAM,GAAW;YACrB,KAAK,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YAChC,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;YACnB,KAAK;SACN,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAkB,EAAE,CAAC;QAEnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,eAAe,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CACvD,IAAI,CAAC,cAAc,EACnB,KAAK,CAAC,MAAM,CACb,CAAC;gBACF,MAAM,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;gBACnE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAgB,CAAC;gBAEpD,qEAAqE;gBACrE,MAAM,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACjE,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;oBACpC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,mDAAmD,MAAM,CAAC,IAAI,6BAA6B,eAAe,EAAE,CAAC,CAAC;oBAC3I,SAAS;gBACX,CAAC;gBAED,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,wCAAwC,EAAE,GAAG,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC;CACF"}
@@ -0,0 +1,41 @@
1
+ import type { SnapMessage } from '../types/message.js';
2
+ import type { TransportSendOptions, TransportLogger } from '../types/plugin.js';
3
+ import type { StreamTransportPlugin } from '../types/transport.js';
4
+ export interface WebSocketTransportConfig {
5
+ /** Port to listen on (default: 8080). */
6
+ port?: number;
7
+ /** Hostname to bind to (default: '0.0.0.0'). */
8
+ host?: string;
9
+ /** Heartbeat interval in ms (default: 30000). Set to 0 to disable. */
10
+ heartbeatInterval?: number;
11
+ /** Request timeout in ms (default: 30000). */
12
+ timeout?: number;
13
+ /** Optional logger for diagnostic events. */
14
+ logger?: TransportLogger;
15
+ }
16
+ /** WebSocket transport: full-duplex request-response and streaming. */
17
+ export declare class WebSocketTransport implements StreamTransportPlugin {
18
+ readonly name = "websocket";
19
+ private readonly config;
20
+ private httpServer;
21
+ private wss;
22
+ private handler;
23
+ private streamHandler;
24
+ private heartbeatTimer;
25
+ constructor(config?: WebSocketTransportConfig);
26
+ /** Send a request and wait for a single response. */
27
+ send(message: SnapMessage, options: TransportSendOptions): Promise<SnapMessage>;
28
+ /** Send a request and receive a stream of responses. */
29
+ sendStream(message: SnapMessage, options: TransportSendOptions): AsyncIterable<SnapMessage>;
30
+ /** Start the WebSocket server and handle incoming messages. */
31
+ listen(handler: (message: SnapMessage) => Promise<SnapMessage | void>): Promise<void>;
32
+ /** Register a stream handler for incoming requests. */
33
+ listenStream(handler: (message: SnapMessage) => AsyncIterable<SnapMessage>): Promise<void>;
34
+ /** Stop the WebSocket server. */
35
+ close(): Promise<void>;
36
+ /** The port the server is listening on (undefined if not started). */
37
+ get port(): number | undefined;
38
+ private connect;
39
+ private ensureServer;
40
+ }
41
+ //# sourceMappingURL=WebSocketTransport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketTransport.d.ts","sourceRoot":"","sources":["../../src/transport/WebSocketTransport.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,WAAW,wBAAwB;IACvC,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAeD,uEAAuE;AACvE,qBAAa,kBAAmB,YAAW,qBAAqB;IAC9D,QAAQ,CAAC,IAAI,eAAe;IAE5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoF;IAC3G,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,OAAO,CAAwE;IACvF,OAAO,CAAC,aAAa,CAAuE;IAC5F,OAAO,CAAC,cAAc,CAA+C;gBAEzD,MAAM,CAAC,EAAE,wBAAwB;IAU7C,qDAAqD;IAC/C,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC;IAiCrF,wDAAwD;IACjD,UAAU,CACf,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,oBAAoB,GAC5B,aAAa,CAAC,WAAW,CAAC;IAiE7B,+DAA+D;IACzD,MAAM,CACV,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,GAC7D,OAAO,CAAC,IAAI,CAAC;IAKhB,uDAAuD;IACjD,YAAY,CAChB,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,aAAa,CAAC,WAAW,CAAC,GAC5D,OAAO,CAAC,IAAI,CAAC;IAKhB,iCAAiC;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB5B,sEAAsE;IACtE,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAI7B;IAED,OAAO,CAAC,OAAO;YAQD,YAAY;CAmD3B"}
@@ -0,0 +1,206 @@
1
+ import { WebSocketServer, WebSocket as WsWebSocket } from 'ws';
2
+ import { createServer } from 'node:http';
3
+ /** WebSocket transport: full-duplex request-response and streaming. */
4
+ export class WebSocketTransport {
5
+ name = 'websocket';
6
+ config;
7
+ httpServer = null;
8
+ wss = null;
9
+ handler = null;
10
+ streamHandler = null;
11
+ heartbeatTimer = null;
12
+ constructor(config) {
13
+ this.config = {
14
+ port: config?.port ?? 8080,
15
+ host: config?.host ?? '0.0.0.0',
16
+ heartbeatInterval: config?.heartbeatInterval ?? 30_000,
17
+ timeout: config?.timeout ?? 30_000,
18
+ logger: config?.logger,
19
+ };
20
+ }
21
+ /** Send a request and wait for a single response. */
22
+ async send(message, options) {
23
+ const ws = await this.connect(options.endpoint);
24
+ const timeout = options.timeout ?? this.config.timeout;
25
+ try {
26
+ return await new Promise((resolve, reject) => {
27
+ const timer = setTimeout(() => {
28
+ reject(new Error('WebSocket request timed out'));
29
+ }, timeout);
30
+ const onMessage = (data) => {
31
+ clearTimeout(timer);
32
+ ws.off('message', onMessage);
33
+ try {
34
+ resolve(JSON.parse(data.toString()));
35
+ }
36
+ catch (err) {
37
+ reject(err);
38
+ }
39
+ };
40
+ ws.on('message', onMessage);
41
+ ws.on('error', (err) => {
42
+ clearTimeout(timer);
43
+ reject(err);
44
+ });
45
+ ws.send(JSON.stringify(message));
46
+ });
47
+ }
48
+ finally {
49
+ ws.close();
50
+ }
51
+ }
52
+ /** Send a request and receive a stream of responses. */
53
+ async *sendStream(message, options) {
54
+ const ws = await this.connect(options.endpoint);
55
+ const timeout = options.timeout ?? this.config.timeout;
56
+ const queue = [];
57
+ let done = false;
58
+ let error = null;
59
+ let resolveWait = null;
60
+ const resetTimer = () => {
61
+ clearTimeout(timer);
62
+ timer = setTimeout(() => {
63
+ error = new Error('WebSocket stream timed out');
64
+ done = true;
65
+ resolveWait?.();
66
+ }, timeout);
67
+ };
68
+ let timer = setTimeout(() => {
69
+ error = new Error('WebSocket stream timed out');
70
+ done = true;
71
+ resolveWait?.();
72
+ }, timeout);
73
+ ws.on('message', (data) => {
74
+ resetTimer();
75
+ const msg = JSON.parse(data.toString());
76
+ queue.push(msg);
77
+ if (msg.type === 'response') {
78
+ done = true;
79
+ }
80
+ resolveWait?.();
81
+ });
82
+ ws.on('error', (err) => {
83
+ clearTimeout(timer);
84
+ error = err instanceof Error ? err : new Error(String(err));
85
+ done = true;
86
+ resolveWait?.();
87
+ });
88
+ ws.on('close', () => {
89
+ clearTimeout(timer);
90
+ done = true;
91
+ resolveWait?.();
92
+ });
93
+ ws.send(JSON.stringify(message));
94
+ try {
95
+ while (true) {
96
+ while (queue.length > 0) {
97
+ yield queue.shift();
98
+ }
99
+ if (error)
100
+ throw error;
101
+ if (done)
102
+ break;
103
+ await new Promise((r) => { resolveWait = r; });
104
+ resolveWait = null;
105
+ }
106
+ }
107
+ finally {
108
+ clearTimeout(timer);
109
+ ws.close();
110
+ }
111
+ }
112
+ /** Start the WebSocket server and handle incoming messages. */
113
+ async listen(handler) {
114
+ this.handler = handler;
115
+ await this.ensureServer();
116
+ }
117
+ /** Register a stream handler for incoming requests. */
118
+ async listenStream(handler) {
119
+ this.streamHandler = handler;
120
+ await this.ensureServer();
121
+ }
122
+ /** Stop the WebSocket server. */
123
+ async close() {
124
+ if (this.heartbeatTimer) {
125
+ clearInterval(this.heartbeatTimer);
126
+ this.heartbeatTimer = null;
127
+ }
128
+ if (this.wss) {
129
+ const wss = this.wss;
130
+ this.wss = null;
131
+ for (const client of wss.clients) {
132
+ client.close();
133
+ }
134
+ await new Promise((resolve) => wss.close(() => resolve()));
135
+ }
136
+ if (this.httpServer) {
137
+ const server = this.httpServer;
138
+ this.httpServer = null;
139
+ await new Promise((resolve, reject) => {
140
+ server.close((err) => (err ? reject(err) : resolve()));
141
+ });
142
+ }
143
+ }
144
+ /** The port the server is listening on (undefined if not started). */
145
+ get port() {
146
+ const addr = this.httpServer?.address();
147
+ if (addr && typeof addr === 'object')
148
+ return addr.port;
149
+ return undefined;
150
+ }
151
+ connect(endpoint) {
152
+ return new Promise((resolve, reject) => {
153
+ const ws = new WsWebSocket(endpoint);
154
+ ws.once('open', () => resolve(ws));
155
+ ws.once('error', reject);
156
+ });
157
+ }
158
+ async ensureServer() {
159
+ if (this.wss)
160
+ return;
161
+ this.httpServer = createServer();
162
+ this.wss = new WebSocketServer({ server: this.httpServer });
163
+ this.wss.on('connection', (ws) => {
164
+ ws.isAlive = true;
165
+ ws.on('pong', () => { ws.isAlive = true; });
166
+ ws.on('message', async (data) => {
167
+ try {
168
+ const message = JSON.parse(data.toString());
169
+ const isStreamRequest = message.method === 'message/stream' ||
170
+ message.method === 'tasks/resubscribe';
171
+ if (isStreamRequest && this.streamHandler) {
172
+ for await (const event of this.streamHandler(message)) {
173
+ ws.send(JSON.stringify(event));
174
+ }
175
+ }
176
+ else if (this.handler) {
177
+ const response = await this.handler(message);
178
+ if (response) {
179
+ ws.send(JSON.stringify(response));
180
+ }
181
+ }
182
+ }
183
+ catch (err) {
184
+ this.config.logger?.('warn', 'Failed to process WebSocket message', err);
185
+ }
186
+ });
187
+ });
188
+ // Heartbeat
189
+ if (this.config.heartbeatInterval > 0) {
190
+ this.heartbeatTimer = setInterval(() => {
191
+ this.wss?.clients.forEach((ws) => {
192
+ if (ws.isAlive === false) {
193
+ ws.terminate();
194
+ return;
195
+ }
196
+ ws.isAlive = false;
197
+ ws.ping();
198
+ });
199
+ }, this.config.heartbeatInterval);
200
+ }
201
+ await new Promise((resolve) => {
202
+ this.httpServer.listen(this.config.port, this.config.host, () => resolve());
203
+ });
204
+ }
205
+ }
206
+ //# sourceMappingURL=WebSocketTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketTransport.js","sourceRoot":"","sources":["../../src/transport/WebSocketTransport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { HttpTransport } from './HttpTransport.js';
2
+ export type { HttpTransportConfig } from './HttpTransport.js';
3
+ export { WebSocketTransport } from './WebSocketTransport.js';
4
+ export type { WebSocketTransportConfig } from './WebSocketTransport.js';
5
+ export { NostrTransport, SNAP_MESSAGE_KIND, SNAP_AGENT_CARD_KIND } from './NostrTransport.js';
6
+ export type { NostrTransportConfig, AgentDiscoveryFilter } from './NostrTransport.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC9F,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { HttpTransport } from './HttpTransport.js';
2
+ export { WebSocketTransport } from './WebSocketTransport.js';
3
+ export { NostrTransport, SNAP_MESSAGE_KIND, SNAP_AGENT_CARD_KIND } from './NostrTransport.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { P2TRAddress } from './keys.js';
2
+ import type { MediaType } from './part.js';
3
+ /** A capability that the agent provides. */
4
+ export interface Skill {
5
+ id: string;
6
+ name: string;
7
+ description: string;
8
+ tags: string[];
9
+ examples?: string[];
10
+ inputModes?: MediaType[];
11
+ outputModes?: MediaType[];
12
+ }
13
+ /** Optional feature flags for an agent. */
14
+ export interface Capabilities {
15
+ streaming?: boolean;
16
+ pushNotifications?: boolean;
17
+ }
18
+ /** Domain verification for trust anchoring. */
19
+ export interface Trust {
20
+ domain: string;
21
+ }
22
+ /** Organization operating the agent. */
23
+ export interface Provider {
24
+ organization?: string;
25
+ url?: string;
26
+ }
27
+ /** Transport protocol type for an agent endpoint. */
28
+ export type EndpointProtocol = 'http' | 'wss';
29
+ /** A transport endpoint declared in the Agent Card. */
30
+ export interface AgentEndpoint {
31
+ protocol: EndpointProtocol;
32
+ url: string;
33
+ }
34
+ /** Describes an agent's identity, capabilities, and how to communicate with it. */
35
+ export interface AgentCard {
36
+ name: string;
37
+ description: string;
38
+ version: string;
39
+ identity: P2TRAddress;
40
+ endpoints?: AgentEndpoint[];
41
+ nostrRelays?: string[];
42
+ protocolVersion?: string;
43
+ supportedVersions?: string[];
44
+ capabilities?: Capabilities;
45
+ skills: Skill[];
46
+ defaultInputModes: MediaType[];
47
+ defaultOutputModes: MediaType[];
48
+ trust?: Trust;
49
+ provider?: Provider;
50
+ iconUrl?: string;
51
+ documentationUrl?: string;
52
+ }
53
+ //# sourceMappingURL=agent-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-card.d.ts","sourceRoot":"","sources":["../../src/types/agent-card.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,4CAA4C;AAC5C,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC;CAC3B;AAED,2CAA2C;AAC3C,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,+CAA+C;AAC/C,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wCAAwC;AACxC,MAAM,WAAW,QAAQ;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qDAAqD;AACrD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,KAAK,CAAC;AAE9C,uDAAuD;AACvD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,mFAAmF;AACnF,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,WAAW,CAAC;IACtB,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,iBAAiB,EAAE,SAAS,EAAE,CAAC;IAC/B,kBAAkB,EAAE,SAAS,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-card.js","sourceRoot":"","sources":["../../src/types/agent-card.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import type { Part } from './part.js';
2
+ /** Output produced by a task. Contains one or more parts. */
3
+ export interface Artifact {
4
+ artifactId: string;
5
+ name?: string;
6
+ parts: Part[];
7
+ }
8
+ //# sourceMappingURL=artifact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact.d.ts","sourceRoot":"","sources":["../../src/types/artifact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,6DAA6D;AAC7D,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;CACf"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=artifact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact.js","sourceRoot":"","sources":["../../src/types/artifact.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ export interface SnapErrorData {
2
+ code: number;
3
+ message: string;
4
+ data?: Record<string, unknown>;
5
+ }
6
+ export declare const ErrorCodes: {
7
+ readonly TASK_NOT_FOUND: 1001;
8
+ readonly TASK_NOT_CANCELABLE: 1002;
9
+ readonly INVALID_MESSAGE: 1003;
10
+ readonly INVALID_PAYLOAD: 1004;
11
+ readonly CONTENT_TYPE_NOT_SUPPORTED: 1005;
12
+ readonly PUSH_NOTIFICATION_ERROR: 1006;
13
+ readonly METHOD_NOT_FOUND: 1007;
14
+ readonly SIGNATURE_INVALID: 2001;
15
+ readonly SIGNATURE_MISSING: 2002;
16
+ readonly IDENTITY_MISMATCH: 2003;
17
+ readonly TIMESTAMP_EXPIRED: 2004;
18
+ readonly IDENTITY_INVALID: 2005;
19
+ readonly DUPLICATE_MESSAGE: 2006;
20
+ readonly RATE_LIMIT_EXCEEDED: 3001;
21
+ readonly TRANSPORT_ERROR: 4001;
22
+ readonly INTERNAL_ERROR: 5001;
23
+ };
24
+ export type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];
25
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;CA0Bb,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC"}