@nority/bridge-sdk 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 (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +164 -0
  3. package/dist/agent.d.ts +101 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +6 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/auth/jwt.d.ts +38 -0
  8. package/dist/auth/jwt.d.ts.map +1 -0
  9. package/dist/auth/jwt.js +83 -0
  10. package/dist/auth/jwt.js.map +1 -0
  11. package/dist/auth/pairing.d.ts +14 -0
  12. package/dist/auth/pairing.d.ts.map +1 -0
  13. package/dist/auth/pairing.js +34 -0
  14. package/dist/auth/pairing.js.map +1 -0
  15. package/dist/auth/reconnect.d.ts +28 -0
  16. package/dist/auth/reconnect.d.ts.map +1 -0
  17. package/dist/auth/reconnect.js +110 -0
  18. package/dist/auth/reconnect.js.map +1 -0
  19. package/dist/bridge.d.ts +44 -0
  20. package/dist/bridge.d.ts.map +1 -0
  21. package/dist/bridge.js +311 -0
  22. package/dist/bridge.js.map +1 -0
  23. package/dist/config.d.ts +6 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js +47 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/conversation/replay.d.ts +30 -0
  28. package/dist/conversation/replay.d.ts.map +1 -0
  29. package/dist/conversation/replay.js +85 -0
  30. package/dist/conversation/replay.js.map +1 -0
  31. package/dist/conversation/runtime.d.ts +43 -0
  32. package/dist/conversation/runtime.d.ts.map +1 -0
  33. package/dist/conversation/runtime.js +481 -0
  34. package/dist/conversation/runtime.js.map +1 -0
  35. package/dist/conversation/state.d.ts +25 -0
  36. package/dist/conversation/state.d.ts.map +1 -0
  37. package/dist/conversation/state.js +130 -0
  38. package/dist/conversation/state.js.map +1 -0
  39. package/dist/crypto/conversation.d.ts +20 -0
  40. package/dist/crypto/conversation.d.ts.map +1 -0
  41. package/dist/crypto/conversation.js +134 -0
  42. package/dist/crypto/conversation.js.map +1 -0
  43. package/dist/crypto/hkdf-sha3.d.ts +5 -0
  44. package/dist/crypto/hkdf-sha3.d.ts.map +1 -0
  45. package/dist/crypto/hkdf-sha3.js +8 -0
  46. package/dist/crypto/hkdf-sha3.js.map +1 -0
  47. package/dist/crypto/identity.d.ts +21 -0
  48. package/dist/crypto/identity.d.ts.map +1 -0
  49. package/dist/crypto/identity.js +70 -0
  50. package/dist/crypto/identity.js.map +1 -0
  51. package/dist/crypto/payload.d.ts +10 -0
  52. package/dist/crypto/payload.d.ts.map +1 -0
  53. package/dist/crypto/payload.js +28 -0
  54. package/dist/crypto/payload.js.map +1 -0
  55. package/dist/crypto/x25519.d.ts +16 -0
  56. package/dist/crypto/x25519.d.ts.map +1 -0
  57. package/dist/crypto/x25519.js +44 -0
  58. package/dist/crypto/x25519.js.map +1 -0
  59. package/dist/index.d.ts +27 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +18 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/protocol/frames.d.ts +27 -0
  64. package/dist/protocol/frames.d.ts.map +1 -0
  65. package/dist/protocol/frames.js +43 -0
  66. package/dist/protocol/frames.js.map +1 -0
  67. package/dist/protocol/validation.d.ts +6 -0
  68. package/dist/protocol/validation.d.ts.map +1 -0
  69. package/dist/protocol/validation.js +33 -0
  70. package/dist/protocol/validation.js.map +1 -0
  71. package/dist/runtime/proactive.d.ts +14 -0
  72. package/dist/runtime/proactive.d.ts.map +1 -0
  73. package/dist/runtime/proactive.js +36 -0
  74. package/dist/runtime/proactive.js.map +1 -0
  75. package/dist/storage/conversation-store.d.ts +15 -0
  76. package/dist/storage/conversation-store.d.ts.map +1 -0
  77. package/dist/storage/conversation-store.js +75 -0
  78. package/dist/storage/conversation-store.js.map +1 -0
  79. package/dist/storage/state-store.d.ts +20 -0
  80. package/dist/storage/state-store.d.ts.map +1 -0
  81. package/dist/storage/state-store.js +74 -0
  82. package/dist/storage/state-store.js.map +1 -0
  83. package/dist/transport/outbound-queue.d.ts +18 -0
  84. package/dist/transport/outbound-queue.d.ts.map +1 -0
  85. package/dist/transport/outbound-queue.js +37 -0
  86. package/dist/transport/outbound-queue.js.map +1 -0
  87. package/dist/transport/websocket.d.ts +109 -0
  88. package/dist/transport/websocket.d.ts.map +1 -0
  89. package/dist/transport/websocket.js +346 -0
  90. package/dist/transport/websocket.js.map +1 -0
  91. package/package.json +37 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/conversation/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type KeyObject } from "node:crypto";
2
+ /**
3
+ * Derive the per-conversation AES-256-GCM key from an X25519 ECDH exchange.
4
+ *
5
+ * 1. Compute the shared secret via X25519 ECDH
6
+ * 2. Derive 32-byte key via HKDF-SHA3-256 with info="nority-conv-v1"
7
+ */
8
+ export declare function deriveConversationKey(localPrivateKeyPem: string, remotePublicKeyPem: string): Promise<Buffer>;
9
+ export declare function deriveConversationKeyFromKeyObjects(privateKey: KeyObject, publicKey: KeyObject): Buffer;
10
+ export declare function deriveConversationKeyFromSharedSecret(sharedSecret: Buffer): Buffer;
11
+ /**
12
+ * Encrypt a plaintext payload using AES-256-GCM.
13
+ * Returns wire format: nonce || ciphertext || tag
14
+ */
15
+ export declare function encryptPayload(key: Buffer, plaintext: Buffer): Buffer;
16
+ /**
17
+ * Decrypt a wire-format payload (nonce || ciphertext || tag) using AES-256-GCM.
18
+ */
19
+ export declare function decryptPayload(key: Buffer, wirePayload: Buffer): Buffer;
20
+ //# sourceMappingURL=conversation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/crypto/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AAQrB;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,kBAAkB,EAAE,MAAM,EAC1B,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,MAAM,CAAC,CAsBjB;AAED,wBAAgB,mCAAmC,CACjD,UAAU,EAAE,SAAS,EACrB,SAAS,EAAE,SAAS,GACnB,MAAM,CAmBR;AAED,wBAAgB,qCAAqC,CACnD,YAAY,EAAE,MAAM,GACnB,MAAM,CAsBR;AA6DD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAuBrE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAyBvE"}
@@ -0,0 +1,134 @@
1
+ import { createPrivateKey, createPublicKey, diffieHellman, randomBytes, createCipheriv, createDecipheriv, } from "node:crypto";
2
+ import { sha3_256 } from "./hkdf-sha3.js";
3
+ const HKDF_INFO = "nority-conv-v1";
4
+ const AES_KEY_LENGTH = 32;
5
+ const NONCE_LENGTH = 12;
6
+ const TAG_LENGTH = 16;
7
+ /**
8
+ * Derive the per-conversation AES-256-GCM key from an X25519 ECDH exchange.
9
+ *
10
+ * 1. Compute the shared secret via X25519 ECDH
11
+ * 2. Derive 32-byte key via HKDF-SHA3-256 with info="nority-conv-v1"
12
+ */
13
+ export async function deriveConversationKey(localPrivateKeyPem, remotePublicKeyPem) {
14
+ if (!localPrivateKeyPem || !remotePublicKeyPem) {
15
+ throw new Error("deriveConversationKey: both localPrivateKeyPem and remotePublicKeyPem are required");
16
+ }
17
+ const privateKey = createPrivateKey(localPrivateKeyPem);
18
+ const publicKey = createPublicKey(remotePublicKeyPem);
19
+ if (privateKey.asymmetricKeyType !== "x25519") {
20
+ throw new Error(`deriveConversationKey: expected x25519 private key, got ${privateKey.asymmetricKeyType}`);
21
+ }
22
+ if (publicKey.asymmetricKeyType !== "x25519") {
23
+ throw new Error(`deriveConversationKey: expected x25519 public key, got ${publicKey.asymmetricKeyType}`);
24
+ }
25
+ return deriveConversationKeyFromKeyObjects(privateKey, publicKey);
26
+ }
27
+ export function deriveConversationKeyFromKeyObjects(privateKey, publicKey) {
28
+ if (!privateKey || !publicKey) {
29
+ throw new Error("deriveConversationKeyFromKeyObjects: privateKey and publicKey are required");
30
+ }
31
+ if (privateKey.asymmetricKeyType !== "x25519") {
32
+ throw new Error(`deriveConversationKeyFromKeyObjects: expected x25519 private key, got ${privateKey.asymmetricKeyType}`);
33
+ }
34
+ if (publicKey.asymmetricKeyType !== "x25519") {
35
+ throw new Error(`deriveConversationKeyFromKeyObjects: expected x25519 public key, got ${publicKey.asymmetricKeyType}`);
36
+ }
37
+ const sharedSecret = diffieHellman({ privateKey, publicKey });
38
+ return deriveConversationKeyFromSharedSecret(sharedSecret);
39
+ }
40
+ export function deriveConversationKeyFromSharedSecret(sharedSecret) {
41
+ if (!sharedSecret || sharedSecret.length === 0) {
42
+ throw new Error("deriveConversationKeyFromSharedSecret: sharedSecret is required");
43
+ }
44
+ const infoBytes = Buffer.from(HKDF_INFO, "utf-8");
45
+ const derivedKey = hkdfSha3256(sharedSecret, Buffer.alloc(0), infoBytes, AES_KEY_LENGTH);
46
+ if (derivedKey.length !== AES_KEY_LENGTH) {
47
+ throw new Error(`deriveConversationKeyFromSharedSecret: derived key length ${derivedKey.length} !== ${AES_KEY_LENGTH}`);
48
+ }
49
+ return derivedKey;
50
+ }
51
+ /**
52
+ * HKDF using SHA3-256 as the hash function.
53
+ * Node's built-in hkdf only supports standard hash names, so we implement HKDF manually.
54
+ */
55
+ function hkdfSha3256(ikm, salt, info, length) {
56
+ // Extract: PRK = HMAC-SHA3-256(salt, IKM)
57
+ // For HKDF, if salt is empty, use a hash-length zero buffer
58
+ const hashLen = 32; // SHA3-256 output
59
+ const effectiveSalt = salt.length > 0 ? salt : Buffer.alloc(hashLen, 0);
60
+ const prk = hmacSha3256(effectiveSalt, ikm);
61
+ // Expand: OKM = T(1) || T(2) || ...
62
+ const n = Math.ceil(length / hashLen);
63
+ if (n > 255) {
64
+ throw new Error("hkdfSha3256: requested length too large");
65
+ }
66
+ const okm = Buffer.alloc(n * hashLen);
67
+ let prev = Buffer.alloc(0);
68
+ for (let i = 1; i <= n; i++) {
69
+ const input = Buffer.concat([prev, info, Buffer.from([i])]);
70
+ prev = hmacSha3256(prk, input);
71
+ prev.copy(okm, (i - 1) * hashLen);
72
+ }
73
+ return okm.subarray(0, length);
74
+ }
75
+ /**
76
+ * HMAC-SHA3-256 implementation.
77
+ */
78
+ function hmacSha3256(key, data) {
79
+ const blockSize = 136; // SHA3-256 block size (rate)
80
+ let k = key;
81
+ if (k.length > blockSize) {
82
+ k = sha3_256(k);
83
+ }
84
+ if (k.length < blockSize) {
85
+ k = Buffer.concat([k, Buffer.alloc(blockSize - k.length, 0)]);
86
+ }
87
+ const iPad = Buffer.alloc(blockSize);
88
+ const oPad = Buffer.alloc(blockSize);
89
+ for (let i = 0; i < blockSize; i++) {
90
+ iPad[i] = k[i] ^ 0x36;
91
+ oPad[i] = k[i] ^ 0x5c;
92
+ }
93
+ const inner = sha3_256(Buffer.concat([iPad, data]));
94
+ return sha3_256(Buffer.concat([oPad, inner]));
95
+ }
96
+ /**
97
+ * Encrypt a plaintext payload using AES-256-GCM.
98
+ * Returns wire format: nonce || ciphertext || tag
99
+ */
100
+ export function encryptPayload(key, plaintext) {
101
+ if (key.length !== AES_KEY_LENGTH) {
102
+ throw new Error(`encryptPayload: key must be ${AES_KEY_LENGTH} bytes, got ${key.length}`);
103
+ }
104
+ const nonce = randomBytes(NONCE_LENGTH);
105
+ const cipher = createCipheriv("aes-256-gcm", key, nonce);
106
+ const ciphertext = Buffer.concat([
107
+ cipher.update(plaintext),
108
+ cipher.final(),
109
+ ]);
110
+ const tag = cipher.getAuthTag();
111
+ if (tag.length !== TAG_LENGTH) {
112
+ throw new Error(`encryptPayload: auth tag length ${tag.length} !== ${TAG_LENGTH}`);
113
+ }
114
+ return Buffer.concat([nonce, ciphertext, tag]);
115
+ }
116
+ /**
117
+ * Decrypt a wire-format payload (nonce || ciphertext || tag) using AES-256-GCM.
118
+ */
119
+ export function decryptPayload(key, wirePayload) {
120
+ if (key.length !== AES_KEY_LENGTH) {
121
+ throw new Error(`decryptPayload: key must be ${AES_KEY_LENGTH} bytes, got ${key.length}`);
122
+ }
123
+ const minLength = NONCE_LENGTH + TAG_LENGTH;
124
+ if (wirePayload.length < minLength) {
125
+ throw new Error(`decryptPayload: wire payload too short (${wirePayload.length} < ${minLength})`);
126
+ }
127
+ const nonce = wirePayload.subarray(0, NONCE_LENGTH);
128
+ const ciphertext = wirePayload.subarray(NONCE_LENGTH, wirePayload.length - TAG_LENGTH);
129
+ const tag = wirePayload.subarray(wirePayload.length - TAG_LENGTH);
130
+ const decipher = createDecipheriv("aes-256-gcm", key, nonce);
131
+ decipher.setAuthTag(tag);
132
+ return Buffer.concat([decipher.update(ciphertext), decipher.final()]);
133
+ }
134
+ //# sourceMappingURL=conversation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../src/crypto/conversation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * SHA3-256 hash using Node's built-in crypto.
3
+ */
4
+ export declare function sha3_256(data: Buffer): Buffer<ArrayBuffer>;
5
+ //# sourceMappingURL=hkdf-sha3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hkdf-sha3.d.ts","sourceRoot":"","sources":["../../src/crypto/hkdf-sha3.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAE1D"}
@@ -0,0 +1,8 @@
1
+ import { createHash } from "node:crypto";
2
+ /**
3
+ * SHA3-256 hash using Node's built-in crypto.
4
+ */
5
+ export function sha3_256(data) {
6
+ return createHash("sha3-256").update(data).digest();
7
+ }
8
+ //# sourceMappingURL=hkdf-sha3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hkdf-sha3.js","sourceRoot":"","sources":["../../src/crypto/hkdf-sha3.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAyB,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface Ed25519Identity {
2
+ privateKeyPem: string;
3
+ publicKeyPem: string;
4
+ }
5
+ /**
6
+ * Generate a new Ed25519 identity for bridge proof-of-possession.
7
+ */
8
+ export declare function generateEd25519Identity(): Ed25519Identity;
9
+ /**
10
+ * Return the raw Ed25519 public key encoded as standard base64.
11
+ */
12
+ export declare function getEd25519PublicKeyBase64(publicKeyPem: string): string;
13
+ /**
14
+ * Sign data with an Ed25519 private key.
15
+ */
16
+ export declare function signEd25519(privateKeyPem: string, data: Buffer): Promise<Buffer>;
17
+ /**
18
+ * Verify an Ed25519 signature against a public key.
19
+ */
20
+ export declare function verifyEd25519Signature(publicKeyPem: string, data: Buffer, signature: Buffer): Promise<boolean>;
21
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/crypto/identity.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,eAAe,CAoBzD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAkBtE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAajB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAelB"}
@@ -0,0 +1,70 @@
1
+ import { createPublicKey, createPrivateKey, generateKeyPairSync, sign, verify, } from "node:crypto";
2
+ /**
3
+ * Generate a new Ed25519 identity for bridge proof-of-possession.
4
+ */
5
+ export function generateEd25519Identity() {
6
+ const { privateKey, publicKey } = generateKeyPairSync("ed25519");
7
+ const privateKeyPem = privateKey.export({
8
+ format: "pem",
9
+ type: "pkcs8",
10
+ });
11
+ const publicKeyPem = publicKey.export({
12
+ format: "pem",
13
+ type: "spki",
14
+ });
15
+ if (typeof privateKeyPem !== "string") {
16
+ throw new Error("generateEd25519Identity: private key export must be PEM");
17
+ }
18
+ if (typeof publicKeyPem !== "string") {
19
+ throw new Error("generateEd25519Identity: public key export must be PEM");
20
+ }
21
+ return { privateKeyPem, publicKeyPem };
22
+ }
23
+ /**
24
+ * Return the raw Ed25519 public key encoded as standard base64.
25
+ */
26
+ export function getEd25519PublicKeyBase64(publicKeyPem) {
27
+ if (!publicKeyPem) {
28
+ throw new Error("getEd25519PublicKeyBase64: publicKeyPem is required");
29
+ }
30
+ const publicKey = createPublicKey(publicKeyPem);
31
+ if (publicKey.asymmetricKeyType !== "ed25519") {
32
+ throw new Error(`getEd25519PublicKeyBase64: expected ed25519 key, got ${publicKey.asymmetricKeyType}`);
33
+ }
34
+ const jwk = publicKey.export({ format: "jwk" });
35
+ if (typeof jwk.x !== "string") {
36
+ throw new Error("getEd25519PublicKeyBase64: JWK x coordinate is required");
37
+ }
38
+ return base64UrlToBase64(jwk.x);
39
+ }
40
+ /**
41
+ * Sign data with an Ed25519 private key.
42
+ */
43
+ export async function signEd25519(privateKeyPem, data) {
44
+ if (!privateKeyPem || !data) {
45
+ throw new Error("signEd25519: privateKeyPem and data are required");
46
+ }
47
+ const privateKey = createPrivateKey(privateKeyPem);
48
+ if (privateKey.asymmetricKeyType !== "ed25519") {
49
+ throw new Error(`signEd25519: expected ed25519 key, got ${privateKey.asymmetricKeyType}`);
50
+ }
51
+ return sign(null, data, privateKey);
52
+ }
53
+ /**
54
+ * Verify an Ed25519 signature against a public key.
55
+ */
56
+ export async function verifyEd25519Signature(publicKeyPem, data, signature) {
57
+ if (!publicKeyPem || !data || !signature) {
58
+ throw new Error("verifyEd25519Signature: publicKeyPem, data, and signature are required");
59
+ }
60
+ const publicKey = createPublicKey(publicKeyPem);
61
+ if (publicKey.asymmetricKeyType !== "ed25519") {
62
+ throw new Error(`verifyEd25519Signature: expected ed25519 key, got ${publicKey.asymmetricKeyType}`);
63
+ }
64
+ return verify(null, data, publicKey, signature);
65
+ }
66
+ function base64UrlToBase64(value) {
67
+ const paddingLength = (4 - (value.length % 4)) % 4;
68
+ return `${value.replace(/-/g, "+").replace(/_/g, "/")}${"=".repeat(paddingLength)}`;
69
+ }
70
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/crypto/identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Encrypt a JSON-serializable object for wire transmission.
3
+ * Returns base64-encoded wire payload (nonce || ciphertext || tag).
4
+ */
5
+ export declare function encryptJsonPayload(key: Buffer, payload: unknown): string;
6
+ /**
7
+ * Decrypt a base64-encoded wire payload back to a parsed JSON object.
8
+ */
9
+ export declare function decryptJsonPayload(key: Buffer, base64Wire: string): unknown;
10
+ //# sourceMappingURL=payload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../../src/crypto/payload.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,OAAO,GACf,MAAM,CAQR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GACjB,OAAO,CAWT"}
@@ -0,0 +1,28 @@
1
+ import { encryptPayload, decryptPayload } from "./conversation.js";
2
+ /**
3
+ * Encrypt a JSON-serializable object for wire transmission.
4
+ * Returns base64-encoded wire payload (nonce || ciphertext || tag).
5
+ */
6
+ export function encryptJsonPayload(key, payload) {
7
+ if (!key || key.length !== 32) {
8
+ throw new Error("encryptJsonPayload: key must be a 32-byte Buffer");
9
+ }
10
+ const plaintext = Buffer.from(JSON.stringify(payload), "utf-8");
11
+ const wire = encryptPayload(key, plaintext);
12
+ return wire.toString("base64");
13
+ }
14
+ /**
15
+ * Decrypt a base64-encoded wire payload back to a parsed JSON object.
16
+ */
17
+ export function decryptJsonPayload(key, base64Wire) {
18
+ if (!key || key.length !== 32) {
19
+ throw new Error("decryptJsonPayload: key must be a 32-byte Buffer");
20
+ }
21
+ if (!base64Wire) {
22
+ throw new Error("decryptJsonPayload: base64Wire is required");
23
+ }
24
+ const wire = Buffer.from(base64Wire, "base64");
25
+ const plaintext = decryptPayload(key, wire);
26
+ return JSON.parse(plaintext.toString("utf-8"));
27
+ }
28
+ //# sourceMappingURL=payload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload.js","sourceRoot":"","sources":["../../src/crypto/payload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnE;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,GAAW,EACX,OAAgB;IAEhB,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,GAAW,EACX,UAAkB;IAElB,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type KeyObject } from "node:crypto";
2
+ interface X25519PrivateJwk {
3
+ kty: "OKP";
4
+ crv: "X25519";
5
+ x: string;
6
+ d: string;
7
+ }
8
+ export interface X25519EphemeralKeyPair {
9
+ privateKey: KeyObject;
10
+ publicKeyBase64: string;
11
+ }
12
+ export declare function generateX25519EphemeralKeyPair(): X25519EphemeralKeyPair;
13
+ export declare function deriveConversationKeyFromBase64(privateKey: KeyObject, remotePublicKeyBase64: string): Buffer;
14
+ export declare function importX25519PrivateKeyFromJwk(privateKeyJwk: X25519PrivateJwk): KeyObject;
15
+ export {};
16
+ //# sourceMappingURL=x25519.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x25519.d.ts","sourceRoot":"","sources":["../../src/crypto/x25519.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AAGrB,UAAU,gBAAgB;IACxB,GAAG,EAAE,KAAK,CAAC;IACX,GAAG,EAAE,QAAQ,CAAC;IACd,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAQD,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,SAAS,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,8BAA8B,IAAI,sBAAsB,CAavE;AAED,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,SAAS,EACrB,qBAAqB,EAAE,MAAM,GAC5B,MAAM,CAmBR;AAED,wBAAgB,6BAA6B,CAC3C,aAAa,EAAE,gBAAgB,GAC9B,SAAS,CAOX"}
@@ -0,0 +1,44 @@
1
+ import { createPrivateKey, createPublicKey, generateKeyPairSync, } from "node:crypto";
2
+ import { deriveConversationKeyFromKeyObjects } from "./conversation.js";
3
+ export function generateX25519EphemeralKeyPair() {
4
+ const { privateKey, publicKey } = generateKeyPairSync("x25519");
5
+ const publicJwk = publicKey.export({ format: "jwk" });
6
+ if (publicJwk.kty !== "OKP" || publicJwk.crv !== "X25519" || !publicJwk.x) {
7
+ throw new Error("generateX25519EphemeralKeyPair: expected X25519 public JWK export");
8
+ }
9
+ return {
10
+ privateKey,
11
+ publicKeyBase64: base64UrlToBase64(publicJwk.x),
12
+ };
13
+ }
14
+ export function deriveConversationKeyFromBase64(privateKey, remotePublicKeyBase64) {
15
+ if (!privateKey) {
16
+ throw new Error("deriveConversationKeyFromBase64: privateKey is required");
17
+ }
18
+ if (!remotePublicKeyBase64) {
19
+ throw new Error("deriveConversationKeyFromBase64: remotePublicKeyBase64 is required");
20
+ }
21
+ const publicKey = createPublicKey({
22
+ format: "jwk",
23
+ key: {
24
+ kty: "OKP",
25
+ crv: "X25519",
26
+ x: base64ToBase64Url(remotePublicKeyBase64),
27
+ },
28
+ });
29
+ return deriveConversationKeyFromKeyObjects(privateKey, publicKey);
30
+ }
31
+ export function importX25519PrivateKeyFromJwk(privateKeyJwk) {
32
+ if (!privateKeyJwk || !privateKeyJwk.d || !privateKeyJwk.x) {
33
+ throw new Error("importX25519PrivateKeyFromJwk: X25519 private JWK with d and x is required");
34
+ }
35
+ return createPrivateKey({ format: "jwk", key: privateKeyJwk });
36
+ }
37
+ function base64UrlToBase64(value) {
38
+ const paddingLength = (4 - (value.length % 4)) % 4;
39
+ return `${value.replace(/-/g, "+").replace(/_/g, "/")}${"=".repeat(paddingLength)}`;
40
+ }
41
+ function base64ToBase64Url(value) {
42
+ return value.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "");
43
+ }
44
+ //# sourceMappingURL=x25519.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x25519.js","sourceRoot":"","sources":["../../src/crypto/x25519.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mCAAmC,EAAE,MAAM,mBAAmB,CAAC;AAoBxE,MAAM,UAAU,8BAA8B;IAC5C,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAA6B,CAAC;IAClF,IAAI,SAAS,CAAC,GAAG,KAAK,KAAK,IAAI,SAAS,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,UAAU;QACV,eAAe,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;KAChD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,UAAqB,EACrB,qBAA6B;IAE7B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,eAAe,CAAC;QAChC,MAAM,EAAE,KAAK;QACb,GAAG,EAAE;YACH,GAAG,EAAE,KAAK;YACV,GAAG,EAAE,QAAQ;YACb,CAAC,EAAE,iBAAiB,CAAC,qBAAqB,CAAC;SAClB;KAC5B,CAAC,CAAC;IACH,OAAO,mCAAmC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,aAA+B;IAE/B,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IACD,OAAO,gBAAgB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACnD,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;AACtF,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,27 @@
1
+ export type { AgentAdapter, AgentEvent, BridgeConfig, BridgeLogger, ChatTurn, ContentPart, InvokeRequest, MediaReference, PairingInfo, } from "./agent.js";
2
+ export { NorityBridge } from "./bridge.js";
3
+ export type { BridgeState } from "./bridge.js";
4
+ export { validateConfig } from "./config.js";
5
+ export { validateFrame } from "./protocol/validation.js";
6
+ export type { ValidationResult } from "./protocol/validation.js";
7
+ export { createFrame, BRIDGE_FRAME_TYPES, BACKEND_FRAME_TYPES, } from "./protocol/frames.js";
8
+ export type { BridgeFrame, FrameType } from "./protocol/frames.js";
9
+ export { deriveConversationKey, deriveConversationKeyFromKeyObjects, deriveConversationKeyFromSharedSecret, encryptPayload, decryptPayload, } from "./crypto/conversation.js";
10
+ export { generateEd25519Identity, getEd25519PublicKeyBase64, signEd25519, verifyEd25519Signature, } from "./crypto/identity.js";
11
+ export { encryptJsonPayload, decryptJsonPayload, } from "./crypto/payload.js";
12
+ export { deriveConversationKeyFromBase64, generateX25519EphemeralKeyPair, importX25519PrivateKeyFromJwk, } from "./crypto/x25519.js";
13
+ export { rebuildHistory } from "./conversation/replay.js";
14
+ export type { ConversationState, ReplayEvent, Turn, } from "./conversation/replay.js";
15
+ export { PAIRING_TOKEN_TTL_SECONDS, createDeeplinkUrl, createPairingExpiry, createPairingToken, isPairingExpired, } from "./auth/pairing.js";
16
+ export { BRIDGE_JWT_AUDIENCE, BRIDGE_JWT_SCOPES, JwtCache, isJwtExpired, } from "./auth/jwt.js";
17
+ export type { AccessTokenRecord } from "./auth/jwt.js";
18
+ export { BridgeAccessTokenManager, CHALLENGE_ENDPOINT, VERIFY_ENDPOINT, } from "./auth/reconnect.js";
19
+ export { AuthenticatedWebSocketTransport, BACKOFF_BASE_MS, BACKOFF_MAX_MS, BACKOFF_JITTER, calculateBackoff, getCloseCodeAction, } from "./transport/websocket.js";
20
+ export type { CloseCodeAction, TransportState, WebSocketCloseEvent, WebSocketFactory, WebSocketFactoryOptions, WebSocketLike, WebSocketMessageEvent, } from "./transport/websocket.js";
21
+ export { createConversationEntry, deserializeConversationEntry, serializeConversationEntry, } from "./conversation/state.js";
22
+ export type { ConversationEntry, PersistedConversationEntry, } from "./conversation/state.js";
23
+ export { FileConversationStore } from "./storage/conversation-store.js";
24
+ export { ConversationRuntime } from "./conversation/runtime.js";
25
+ export { createProactiveTurnFrame, } from "./runtime/proactive.js";
26
+ export type { ProactiveTurnRequest } from "./runtime/proactive.js";
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,aAAa,EACb,cAAc,EACd,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,EACL,qBAAqB,EACrB,mCAAmC,EACnC,qCAAqC,EACrC,cAAc,EACd,cAAc,GACf,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,WAAW,EACX,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,+BAA+B,EAC/B,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,YAAY,EACV,iBAAiB,EACjB,WAAW,EACX,IAAI,GACL,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,QAAQ,EACR,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,+BAA+B,EAC/B,eAAe,EACf,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EACvB,aAAa,EACb,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,uBAAuB,EACvB,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EACL,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ export { NorityBridge } from "./bridge.js";
2
+ export { validateConfig } from "./config.js";
3
+ export { validateFrame } from "./protocol/validation.js";
4
+ export { createFrame, BRIDGE_FRAME_TYPES, BACKEND_FRAME_TYPES, } from "./protocol/frames.js";
5
+ export { deriveConversationKey, deriveConversationKeyFromKeyObjects, deriveConversationKeyFromSharedSecret, encryptPayload, decryptPayload, } from "./crypto/conversation.js";
6
+ export { generateEd25519Identity, getEd25519PublicKeyBase64, signEd25519, verifyEd25519Signature, } from "./crypto/identity.js";
7
+ export { encryptJsonPayload, decryptJsonPayload, } from "./crypto/payload.js";
8
+ export { deriveConversationKeyFromBase64, generateX25519EphemeralKeyPair, importX25519PrivateKeyFromJwk, } from "./crypto/x25519.js";
9
+ export { rebuildHistory } from "./conversation/replay.js";
10
+ export { PAIRING_TOKEN_TTL_SECONDS, createDeeplinkUrl, createPairingExpiry, createPairingToken, isPairingExpired, } from "./auth/pairing.js";
11
+ export { BRIDGE_JWT_AUDIENCE, BRIDGE_JWT_SCOPES, JwtCache, isJwtExpired, } from "./auth/jwt.js";
12
+ export { BridgeAccessTokenManager, CHALLENGE_ENDPOINT, VERIFY_ENDPOINT, } from "./auth/reconnect.js";
13
+ export { AuthenticatedWebSocketTransport, BACKOFF_BASE_MS, BACKOFF_MAX_MS, BACKOFF_JITTER, calculateBackoff, getCloseCodeAction, } from "./transport/websocket.js";
14
+ export { createConversationEntry, deserializeConversationEntry, serializeConversationEntry, } from "./conversation/state.js";
15
+ export { FileConversationStore } from "./storage/conversation-store.js";
16
+ export { ConversationRuntime } from "./conversation/runtime.js";
17
+ export { createProactiveTurnFrame, } from "./runtime/proactive.js";
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,qBAAqB,EACrB,mCAAmC,EACnC,qCAAqC,EACrC,cAAc,EACd,cAAc,GACf,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,WAAW,EACX,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,+BAA+B,EAC/B,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAO1D,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,QAAQ,EACR,YAAY,GACb,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,+BAA+B,EAC/B,eAAe,EACf,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAWlC,OAAO,EACL,uBAAuB,EACvB,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EACL,wBAAwB,GACzB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Bridge protocol frame types derived from bridge-protocol package.
3
+ *
4
+ * Bridge -> Backend frame types
5
+ */
6
+ export declare const BRIDGE_FRAME_TYPES: readonly ["pair_request", "key_exchange_response", "agent_event", "replay_request", "assistant_turn_start", "pong", "error"];
7
+ /**
8
+ * Backend -> Bridge frame types
9
+ */
10
+ export declare const BACKEND_FRAME_TYPES: readonly ["paired", "key_exchange", "message", "conversation_deleted", "replay", "token_expiring", "error"];
11
+ export type BridgeFrameType = (typeof BRIDGE_FRAME_TYPES)[number];
12
+ export type BackendFrameType = (typeof BACKEND_FRAME_TYPES)[number];
13
+ export type FrameType = BridgeFrameType | BackendFrameType;
14
+ /**
15
+ * Versioned frame envelope as defined by the bridge protocol.
16
+ */
17
+ export interface BridgeFrame<T extends FrameType = FrameType> {
18
+ type: T;
19
+ version: "v1";
20
+ conversation_id?: string;
21
+ payload: Record<string, unknown>;
22
+ }
23
+ /**
24
+ * Create a protocol-conformant frame envelope.
25
+ */
26
+ export declare function createFrame<T extends FrameType>(type: T, payload: Record<string, unknown>, conversationId?: string): BridgeFrame<T>;
27
+ //# sourceMappingURL=frames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.d.ts","sourceRoot":"","sources":["../../src/protocol/frames.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,8HAQrB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,mBAAmB,6GAQtB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAClE,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AACpE,MAAM,MAAM,SAAS,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC1D,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,EAAE,IAAI,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,SAAS,EAC7C,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,cAAc,CAAC,EAAE,MAAM,GACtB,WAAW,CAAC,CAAC,CAAC,CAahB"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Bridge protocol frame types derived from bridge-protocol package.
3
+ *
4
+ * Bridge -> Backend frame types
5
+ */
6
+ export const BRIDGE_FRAME_TYPES = [
7
+ "pair_request",
8
+ "key_exchange_response",
9
+ "agent_event",
10
+ "replay_request",
11
+ "assistant_turn_start",
12
+ "pong",
13
+ "error",
14
+ ];
15
+ /**
16
+ * Backend -> Bridge frame types
17
+ */
18
+ export const BACKEND_FRAME_TYPES = [
19
+ "paired",
20
+ "key_exchange",
21
+ "message",
22
+ "conversation_deleted",
23
+ "replay",
24
+ "token_expiring",
25
+ "error",
26
+ ];
27
+ /**
28
+ * Create a protocol-conformant frame envelope.
29
+ */
30
+ export function createFrame(type, payload, conversationId) {
31
+ if (!type) {
32
+ throw new Error("createFrame: type is required");
33
+ }
34
+ if (!payload || typeof payload !== "object") {
35
+ throw new Error("createFrame: payload must be a non-null object");
36
+ }
37
+ const frame = { type, version: "v1", payload };
38
+ if (conversationId) {
39
+ frame.conversation_id = conversationId;
40
+ }
41
+ return frame;
42
+ }
43
+ //# sourceMappingURL=frames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.js","sourceRoot":"","sources":["../../src/protocol/frames.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,cAAc;IACd,uBAAuB;IACvB,aAAa;IACb,gBAAgB;IAChB,sBAAsB;IACtB,MAAM;IACN,OAAO;CACC,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,QAAQ;IACR,cAAc;IACd,SAAS;IACT,sBAAsB;IACtB,QAAQ;IACR,gBAAgB;IAChB,OAAO;CACC,CAAC;AAgBX;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,IAAO,EACP,OAAgC,EAChC,cAAuB;IAEvB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,KAAK,GAAmB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC/D,IAAI,cAAc,EAAE,CAAC;QACnB,KAAK,CAAC,eAAe,GAAG,cAAc,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface ValidationResult {
2
+ valid: boolean;
3
+ errors: string[];
4
+ }
5
+ export declare function validateFrame(frame: unknown): ValidationResult;
6
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/protocol/validation.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAiB9D"}
@@ -0,0 +1,33 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import Ajv from "ajv";
4
+ const SCHEMA_PATH = join(import.meta.dirname ?? new URL(".", import.meta.url).pathname, "../../../../bridge-protocol/websocket/schemas/bridge-frame.schema.json");
5
+ let cachedValidator = null;
6
+ function getValidator() {
7
+ if (cachedValidator)
8
+ return cachedValidator;
9
+ let raw;
10
+ try {
11
+ raw = readFileSync(SCHEMA_PATH, "utf-8");
12
+ }
13
+ catch (err) {
14
+ throw new Error(`bridge-sdk: failed to load frame schema at ${SCHEMA_PATH}: ${err instanceof Error ? err.message : err}`);
15
+ }
16
+ const schema = JSON.parse(raw);
17
+ const ajv = new Ajv({ strict: false, allErrors: true });
18
+ cachedValidator = ajv.compile(schema);
19
+ return cachedValidator;
20
+ }
21
+ export function validateFrame(frame) {
22
+ if (typeof frame !== "object" || frame === null) {
23
+ return { valid: false, errors: ["Frame must be a non-null object"] };
24
+ }
25
+ const validate = getValidator();
26
+ const valid = validate(frame);
27
+ if (valid) {
28
+ return { valid: true, errors: [] };
29
+ }
30
+ const errors = (validate.errors ?? []).map((e) => `${e.instancePath || "/"}: ${e.message ?? "unknown error"}`);
31
+ return { valid: false, errors };
32
+ }
33
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/protocol/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,GAA8B,MAAM,KAAK,CAAC;AAEjD,MAAM,WAAW,GAAG,IAAI,CACtB,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAC7D,wEAAwE,CACzE,CAAC;AAEF,IAAI,eAAe,GAA4B,IAAI,CAAC;AAEpD,SAAS,YAAY;IACnB,IAAI,eAAe;QAAE,OAAO,eAAe,CAAC;IAE5C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,8CAA8C,WAAW,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CACzG,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,eAAe,CAAC;AACzB,CAAC;AAOD,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,iCAAiC,CAAC,EAAE,CAAC;IACvE,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9B,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,YAAY,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,IAAI,eAAe,EAAE,CACnE,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAClC,CAAC"}