@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,34 @@
1
+ export class PluginRegistry {
2
+ transports = new Map();
3
+ middlewares = [];
4
+ replayStore;
5
+ taskStore;
6
+ registerTransport(plugin) {
7
+ this.transports.set(plugin.name, plugin);
8
+ }
9
+ getTransport(name) {
10
+ return this.transports.get(name);
11
+ }
12
+ getTransportNames() {
13
+ return [...this.transports.keys()];
14
+ }
15
+ registerMiddleware(middleware) {
16
+ this.middlewares.push(middleware);
17
+ }
18
+ getMiddlewareChain() {
19
+ return this.middlewares;
20
+ }
21
+ setReplayStore(store) {
22
+ this.replayStore = store;
23
+ }
24
+ getReplayStore() {
25
+ return this.replayStore;
26
+ }
27
+ setTaskStore(store) {
28
+ this.taskStore = store;
29
+ }
30
+ getTaskStore() {
31
+ return this.taskStore;
32
+ }
33
+ }
34
+ //# sourceMappingURL=PluginRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginRegistry.js","sourceRoot":"","sources":["../../src/plugins/PluginRegistry.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAc;IACjB,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;IAChD,WAAW,GAAiB,EAAE,CAAC;IAC/B,WAAW,CAAe;IAC1B,SAAS,CAAa;IAE9B,iBAAiB,CAAC,MAAuB;QACvC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,YAAY,CAAC,IAAY;QACvB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,iBAAiB;QACf,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,kBAAkB,CAAC,UAAsB;QACvC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,cAAc,CAAC,KAAkB;QAC/B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,YAAY,CAAC,KAAgB;QAC3B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export { PluginRegistry } from './PluginRegistry.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { PluginRegistry } from './PluginRegistry.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { ReplayStore } from '../types/plugin.js';
2
+ /**
3
+ * In-memory replay store using a Map of Sets.
4
+ * Key format: `${from}:${id}` for efficient lookup.
5
+ */
6
+ export declare class InMemoryReplayStore implements ReplayStore {
7
+ private readonly seen;
8
+ private readonly maxAge;
9
+ /**
10
+ * @param maxAge Maximum age in milliseconds before entries expire.
11
+ * Defaults to 1 hour (3_600_000 ms). Set to 0 to disable expiry.
12
+ */
13
+ constructor(maxAge?: number);
14
+ hasSeen(from: string, id: string): Promise<boolean>;
15
+ markSeen(from: string, id: string, timestamp: number): Promise<void>;
16
+ /** Returns the number of entries currently tracked. */
17
+ get size(): number;
18
+ /** Remove all entries. */
19
+ clear(): void;
20
+ }
21
+ //# sourceMappingURL=InMemoryReplayStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryReplayStore.d.ts","sourceRoot":"","sources":["../../src/stores/InMemoryReplayStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,WAAW;IACrD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6B;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC;;;OAGG;gBACS,MAAM,SAAY;IAIxB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAanD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1E,uDAAuD;IACvD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,0BAA0B;IAC1B,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * In-memory replay store using a Map of Sets.
3
+ * Key format: `${from}:${id}` for efficient lookup.
4
+ */
5
+ export class InMemoryReplayStore {
6
+ seen = new Map();
7
+ maxAge;
8
+ /**
9
+ * @param maxAge Maximum age in milliseconds before entries expire.
10
+ * Defaults to 1 hour (3_600_000 ms). Set to 0 to disable expiry.
11
+ */
12
+ constructor(maxAge = 3_600_000) {
13
+ this.maxAge = maxAge;
14
+ }
15
+ async hasSeen(from, id) {
16
+ const key = `${from}:${id}`;
17
+ const ts = this.seen.get(key);
18
+ if (ts === undefined)
19
+ return false;
20
+ if (this.maxAge > 0 && Date.now() - ts > this.maxAge) {
21
+ this.seen.delete(key);
22
+ return false;
23
+ }
24
+ return true;
25
+ }
26
+ async markSeen(from, id, timestamp) {
27
+ const key = `${from}:${id}`;
28
+ this.seen.set(key, timestamp);
29
+ }
30
+ /** Returns the number of entries currently tracked. */
31
+ get size() {
32
+ return this.seen.size;
33
+ }
34
+ /** Remove all entries. */
35
+ clear() {
36
+ this.seen.clear();
37
+ }
38
+ }
39
+ //# sourceMappingURL=InMemoryReplayStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryReplayStore.js","sourceRoot":"","sources":["../../src/stores/InMemoryReplayStore.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IACb,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACjC,MAAM,CAAS;IAEhC;;;OAGG;IACH,YAAY,MAAM,GAAG,SAAS;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,EAAU;QACpC,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,EAAE,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAEnC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACrD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,EAAU,EAAE,SAAiB;QACxD,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAChC,CAAC;IAED,uDAAuD;IACvD,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;IAED,0BAA0B;IAC1B,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import type { Task } from '../types/task.js';
2
+ import type { TaskStore } from '../types/plugin.js';
3
+ /** In-memory task store backed by a Map. */
4
+ export declare class InMemoryTaskStore implements TaskStore {
5
+ private readonly tasks;
6
+ get(taskId: string): Promise<Task | undefined>;
7
+ set(taskId: string, task: Task): Promise<void>;
8
+ delete(taskId: string): Promise<void>;
9
+ /** Returns the number of tasks currently stored. */
10
+ get size(): number;
11
+ /** Remove all tasks. */
12
+ clear(): void;
13
+ }
14
+ //# sourceMappingURL=InMemoryTaskStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryTaskStore.d.ts","sourceRoot":"","sources":["../../src/stores/InMemoryTaskStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,4CAA4C;AAC5C,qBAAa,iBAAkB,YAAW,SAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;IAE3C,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAI9C,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,oDAAoD;IACpD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,wBAAwB;IACxB,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,22 @@
1
+ /** In-memory task store backed by a Map. */
2
+ export class InMemoryTaskStore {
3
+ tasks = new Map();
4
+ async get(taskId) {
5
+ return this.tasks.get(taskId);
6
+ }
7
+ async set(taskId, task) {
8
+ this.tasks.set(taskId, task);
9
+ }
10
+ async delete(taskId) {
11
+ this.tasks.delete(taskId);
12
+ }
13
+ /** Returns the number of tasks currently stored. */
14
+ get size() {
15
+ return this.tasks.size;
16
+ }
17
+ /** Remove all tasks. */
18
+ clear() {
19
+ this.tasks.clear();
20
+ }
21
+ }
22
+ //# sourceMappingURL=InMemoryTaskStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryTaskStore.js","sourceRoot":"","sources":["../../src/stores/InMemoryTaskStore.ts"],"names":[],"mappings":"AAGA,4CAA4C;AAC5C,MAAM,OAAO,iBAAiB;IACX,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IAEjD,KAAK,CAAC,GAAG,CAAC,MAAc;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,IAAU;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,oDAAoD;IACpD,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,wBAAwB;IACxB,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export { InMemoryReplayStore } from './InMemoryReplayStore.js';
2
+ export { InMemoryTaskStore } from './InMemoryTaskStore.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { InMemoryReplayStore } from './InMemoryReplayStore.js';
2
+ export { InMemoryTaskStore } from './InMemoryTaskStore.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -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 HttpTransportConfig {
5
+ /** Port to listen on (default: 3000). */
6
+ port?: number;
7
+ /** Hostname to bind to (default: '0.0.0.0'). */
8
+ host?: string;
9
+ /** URL path for the handler (default: '/'). */
10
+ path?: string;
11
+ /** Request timeout in milliseconds (default: 30000). */
12
+ timeout?: number;
13
+ /** Optional logger for diagnostic events. */
14
+ logger?: TransportLogger;
15
+ }
16
+ /** HTTP transport: POST for request-response, POST + SSE for streaming. */
17
+ export declare class HttpTransport implements StreamTransportPlugin {
18
+ readonly name = "http";
19
+ private readonly config;
20
+ private server;
21
+ private handler;
22
+ private streamHandler;
23
+ constructor(config?: HttpTransportConfig);
24
+ /** Send a request and receive a response via HTTP POST. */
25
+ send(message: SnapMessage, options: TransportSendOptions): Promise<SnapMessage>;
26
+ /** Send a request and receive an SSE stream of responses. */
27
+ sendStream(message: SnapMessage, options: TransportSendOptions): AsyncIterable<SnapMessage>;
28
+ /** Start the HTTP server and handle incoming requests. */
29
+ listen(handler: (message: SnapMessage) => Promise<SnapMessage | void>): Promise<void>;
30
+ /** Register a stream handler for incoming SSE requests. */
31
+ listenStream(handler: (message: SnapMessage) => AsyncIterable<SnapMessage>): Promise<void>;
32
+ /** Stop the HTTP server. */
33
+ close(): Promise<void>;
34
+ /** The port the server is listening on (undefined if not started). */
35
+ get port(): number | undefined;
36
+ private ensureServer;
37
+ private handleRequest;
38
+ private readBody;
39
+ private parseSSE;
40
+ }
41
+ //# sourceMappingURL=HttpTransport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpTransport.d.ts","sourceRoot":"","sources":["../../src/transport/HttpTransport.ts"],"names":[],"mappings":"AACA,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,mBAAmB;IAClC,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,2EAA2E;AAC3E,qBAAa,aAAc,YAAW,qBAAqB;IACzD,QAAQ,CAAC,IAAI,UAAU;IAEvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+E;IACtG,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,OAAO,CAAwE;IACvF,OAAO,CAAC,aAAa,CAAuE;gBAEhF,MAAM,CAAC,EAAE,mBAAmB;IAUxC,2DAA2D;IACrD,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC;IAyBrF,6DAA6D;IACtD,UAAU,CACf,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,oBAAoB,GAC5B,aAAa,CAAC,WAAW,CAAC;IAmC7B,0DAA0D;IACpD,MAAM,CACV,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,GAC7D,OAAO,CAAC,IAAI,CAAC;IAKhB,2DAA2D;IACrD,YAAY,CAChB,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,aAAa,CAAC,WAAW,CAAC,GAC5D,OAAO,CAAC,IAAI,CAAC;IAKhB,4BAA4B;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B,sEAAsE;IACtE,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAI7B;YAEa,YAAY;YAkBZ,aAAa;IAwC3B,OAAO,CAAC,QAAQ;YASD,QAAQ;CA0CxB"}
@@ -0,0 +1,196 @@
1
+ import { createServer } from 'node:http';
2
+ /** HTTP transport: POST for request-response, POST + SSE for streaming. */
3
+ export class HttpTransport {
4
+ name = 'http';
5
+ config;
6
+ server = null;
7
+ handler = null;
8
+ streamHandler = null;
9
+ constructor(config) {
10
+ this.config = {
11
+ port: config?.port ?? 3000,
12
+ host: config?.host ?? '0.0.0.0',
13
+ path: config?.path ?? '/',
14
+ timeout: config?.timeout ?? 30_000,
15
+ logger: config?.logger,
16
+ };
17
+ }
18
+ /** Send a request and receive a response via HTTP POST. */
19
+ async send(message, options) {
20
+ const controller = new AbortController();
21
+ const timeoutId = setTimeout(() => controller.abort(), options.timeout ?? this.config.timeout);
22
+ try {
23
+ const response = await fetch(options.endpoint, {
24
+ method: 'POST',
25
+ headers: { 'Content-Type': 'application/json' },
26
+ body: JSON.stringify(message),
27
+ signal: controller.signal,
28
+ });
29
+ if (!response.ok) {
30
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
31
+ }
32
+ return (await response.json());
33
+ }
34
+ finally {
35
+ clearTimeout(timeoutId);
36
+ }
37
+ }
38
+ /** Send a request and receive an SSE stream of responses. */
39
+ async *sendStream(message, options) {
40
+ const controller = new AbortController();
41
+ const timeoutMs = options.timeout ?? this.config.timeout;
42
+ const response = await fetch(options.endpoint, {
43
+ method: 'POST',
44
+ headers: {
45
+ 'Content-Type': 'application/json',
46
+ Accept: 'text/event-stream',
47
+ },
48
+ body: JSON.stringify(message),
49
+ signal: controller.signal,
50
+ });
51
+ if (!response.ok) {
52
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
53
+ }
54
+ if (!response.body) {
55
+ throw new Error('Response body is null');
56
+ }
57
+ // Reset timeout on each event
58
+ let timeoutId = setTimeout(() => controller.abort(), timeoutMs);
59
+ try {
60
+ yield* this.parseSSE(response.body, () => {
61
+ clearTimeout(timeoutId);
62
+ timeoutId = setTimeout(() => controller.abort(), timeoutMs);
63
+ });
64
+ }
65
+ finally {
66
+ clearTimeout(timeoutId);
67
+ }
68
+ }
69
+ /** Start the HTTP server and handle incoming requests. */
70
+ async listen(handler) {
71
+ this.handler = handler;
72
+ await this.ensureServer();
73
+ }
74
+ /** Register a stream handler for incoming SSE requests. */
75
+ async listenStream(handler) {
76
+ this.streamHandler = handler;
77
+ await this.ensureServer();
78
+ }
79
+ /** Stop the HTTP server. */
80
+ async close() {
81
+ if (this.server) {
82
+ const server = this.server;
83
+ this.server = null;
84
+ await new Promise((resolve, reject) => {
85
+ server.close((err) => (err ? reject(err) : resolve()));
86
+ });
87
+ }
88
+ }
89
+ /** The port the server is listening on (undefined if not started). */
90
+ get port() {
91
+ const addr = this.server?.address();
92
+ if (addr && typeof addr === 'object')
93
+ return addr.port;
94
+ return undefined;
95
+ }
96
+ async ensureServer() {
97
+ if (this.server)
98
+ return;
99
+ this.server = createServer((req, res) => {
100
+ this.handleRequest(req, res).catch((err) => {
101
+ this.config.logger?.('error', 'HTTP request handler error', err);
102
+ if (!res.headersSent) {
103
+ res.writeHead(500, { 'Content-Type': 'application/json' });
104
+ res.end(JSON.stringify({ error: 'Internal server error' }));
105
+ }
106
+ });
107
+ });
108
+ await new Promise((resolve) => {
109
+ this.server.listen(this.config.port, this.config.host, () => resolve());
110
+ });
111
+ }
112
+ async handleRequest(req, res) {
113
+ if (req.method !== 'POST' || req.url !== this.config.path) {
114
+ res.writeHead(404, { 'Content-Type': 'application/json' });
115
+ res.end(JSON.stringify({ error: 'Not found' }));
116
+ return;
117
+ }
118
+ const body = await this.readBody(req);
119
+ const message = JSON.parse(body);
120
+ const acceptSSE = req.headers.accept?.includes('text/event-stream');
121
+ if (acceptSSE && this.streamHandler) {
122
+ // SSE streaming response
123
+ res.writeHead(200, {
124
+ 'Content-Type': 'text/event-stream',
125
+ 'Cache-Control': 'no-cache',
126
+ Connection: 'keep-alive',
127
+ });
128
+ for await (const event of this.streamHandler(message)) {
129
+ res.write(`data: ${JSON.stringify(event)}\n\n`);
130
+ }
131
+ res.end();
132
+ }
133
+ else if (this.handler) {
134
+ // Standard request-response
135
+ const response = await this.handler(message);
136
+ if (response) {
137
+ res.writeHead(200, { 'Content-Type': 'application/json' });
138
+ res.end(JSON.stringify(response));
139
+ }
140
+ else {
141
+ res.writeHead(204);
142
+ res.end();
143
+ }
144
+ }
145
+ else {
146
+ res.writeHead(501, { 'Content-Type': 'application/json' });
147
+ res.end(JSON.stringify({ error: 'No handler registered' }));
148
+ }
149
+ }
150
+ readBody(req) {
151
+ return new Promise((resolve, reject) => {
152
+ const chunks = [];
153
+ req.on('data', (chunk) => chunks.push(chunk));
154
+ req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));
155
+ req.on('error', reject);
156
+ });
157
+ }
158
+ async *parseSSE(body, onEvent) {
159
+ const reader = body.getReader();
160
+ const decoder = new TextDecoder();
161
+ let buffer = '';
162
+ try {
163
+ while (true) {
164
+ const { done, value } = await reader.read();
165
+ if (done)
166
+ break;
167
+ buffer += decoder.decode(value, { stream: true });
168
+ const parts = buffer.split('\n\n');
169
+ buffer = parts.pop();
170
+ for (const part of parts) {
171
+ const dataLine = part
172
+ .split('\n')
173
+ .find((line) => line.startsWith('data: '));
174
+ if (dataLine) {
175
+ onEvent();
176
+ yield JSON.parse(dataLine.slice(6));
177
+ }
178
+ }
179
+ }
180
+ // Handle any remaining data
181
+ if (buffer.trim()) {
182
+ const dataLine = buffer
183
+ .split('\n')
184
+ .find((line) => line.startsWith('data: '));
185
+ if (dataLine) {
186
+ onEvent();
187
+ yield JSON.parse(dataLine.slice(6));
188
+ }
189
+ }
190
+ }
191
+ finally {
192
+ reader.releaseLock();
193
+ }
194
+ }
195
+ }
196
+ //# sourceMappingURL=HttpTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpTransport.js","sourceRoot":"","sources":["../../src/transport/HttpTransport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { SnapMessage } from '../types/message.js';
2
+ import type { TransportPlugin, TransportSendOptions, TransportLogger } from '../types/plugin.js';
3
+ import type { P2TRAddress } from '../types/keys.js';
4
+ import type { AgentCard } from '../types/agent-card.js';
5
+ /** Default Nostr event kind for encrypted SNAP messages. */
6
+ export declare const SNAP_MESSAGE_KIND = 21339;
7
+ /** Default Nostr event kind for agent card publication (replaceable). */
8
+ export declare const SNAP_AGENT_CARD_KIND = 31337;
9
+ export interface NostrTransportConfig {
10
+ /** Nostr relay URLs to connect to. */
11
+ relays: string[];
12
+ /** Private key (hex) for signing Nostr events and NIP-44 encryption. */
13
+ privateKey: string;
14
+ /** Request timeout in ms (default: 30000). */
15
+ timeout?: number;
16
+ /** Nostr event kind for encrypted messages (default: 21339). */
17
+ messageKind?: number;
18
+ /** Nostr event kind for agent cards (default: 31337). */
19
+ agentCardKind?: number;
20
+ /** Lookback window in seconds for response subscription (default: 5). */
21
+ responseLookbackSeconds?: number;
22
+ /** Optional logger for diagnostic events. */
23
+ logger?: TransportLogger;
24
+ }
25
+ export interface AgentDiscoveryFilter {
26
+ skills?: string[];
27
+ identity?: P2TRAddress;
28
+ name?: string;
29
+ }
30
+ /** Nostr transport: encrypted messaging via relays + agent card discovery. */
31
+ export declare class NostrTransport implements TransportPlugin {
32
+ readonly name = "nostr";
33
+ private readonly config;
34
+ private readonly pool;
35
+ private readonly pubkey;
36
+ private readonly secretKeyBytes;
37
+ private subscriptionCloser;
38
+ constructor(config: NostrTransportConfig);
39
+ /**
40
+ * Send an encrypted SNAP message to another agent via Nostr.
41
+ * The recipient is determined by converting message.to (P2TR) to a hex pubkey.
42
+ */
43
+ send(message: SnapMessage, options: TransportSendOptions): Promise<SnapMessage>;
44
+ /** Subscribe to incoming SNAP messages. */
45
+ listen(handler: (message: SnapMessage) => Promise<SnapMessage | void>): Promise<void>;
46
+ /** Publish an agent card as a Nostr replaceable event (kind 31337). */
47
+ publishAgentCard(card: AgentCard): Promise<void>;
48
+ /** Query Nostr relays for agent cards matching the filter. */
49
+ discoverAgents(filter: AgentDiscoveryFilter): Promise<AgentCard[]>;
50
+ /** Fetch offline messages since a given unix timestamp. */
51
+ fetchOfflineMessages(since: number): Promise<SnapMessage[]>;
52
+ /** Close all relay connections and subscriptions. */
53
+ close(): Promise<void>;
54
+ }
55
+ //# sourceMappingURL=NostrTransport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NostrTransport.d.ts","sourceRoot":"","sources":["../../src/transport/NostrTransport.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACjG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGxD,4DAA4D;AAC5D,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AAEvC,yEAAyE;AACzE,eAAO,MAAM,oBAAoB,QAAQ,CAAC;AAE1C,MAAM,WAAW,oBAAoB;IACnC,sCAAsC;IACtC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,6CAA6C;IAC7C,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,8EAA8E;AAC9E,qBAAa,cAAe,YAAW,eAAe;IACpD,QAAQ,CAAC,IAAI,WAAW;IAExB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyK;IAChM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAa;IAC5C,OAAO,CAAC,kBAAkB,CAAsC;gBAEpD,MAAM,EAAE,oBAAoB;IAcxC;;;OAGG;IACG,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC;IA+DrF,2CAA2C;IACrC,MAAM,CACV,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,GAC7D,OAAO,CAAC,IAAI,CAAC;IAgDhB,uEAAuE;IACjE,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCtD,8DAA8D;IACxD,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA6BxE,2DAA2D;IACrD,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAmCjE,qDAAqD;IAC/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}