@agentvault/secure-channel 0.1.1 → 0.2.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.
package/dist/channel.js DELETED
@@ -1,325 +0,0 @@
1
- import { EventEmitter } from "node:events";
2
- import sodium from "libsodium-wrappers-sumo";
3
- import WebSocket from "ws";
4
- import { generateIdentityKeypair, generateEphemeralKeypair, computeFingerprint, createProofOfPossession, performX3DH, DoubleRatchet, } from "@agentvault/crypto";
5
- import { hexToBytes, bytesToHex, encryptedMessageToTransport, transportToEncryptedMessage, } from "./crypto-helpers.js";
6
- import { saveState, loadState, clearState } from "./state.js";
7
- import { enrollDevice, pollDeviceStatus, activateDevice, } from "./transport.js";
8
- const POLL_INTERVAL_MS = 5_000;
9
- const RECONNECT_BASE_MS = 1_000;
10
- const RECONNECT_MAX_MS = 30_000;
11
- export class SecureChannel extends EventEmitter {
12
- config;
13
- _state = "idle";
14
- _deviceId = null;
15
- _fingerprint = null;
16
- _conversationId = null;
17
- _deviceJwt = null;
18
- _ratchet = null;
19
- _ws = null;
20
- _pollTimer = null;
21
- _reconnectAttempt = 0;
22
- _reconnectTimer = null;
23
- _stopped = false;
24
- _persisted = null;
25
- constructor(config) {
26
- super();
27
- this.config = config;
28
- }
29
- get state() {
30
- return this._state;
31
- }
32
- get deviceId() {
33
- return this._deviceId;
34
- }
35
- get fingerprint() {
36
- return this._fingerprint;
37
- }
38
- get conversationId() {
39
- return this._conversationId;
40
- }
41
- async start() {
42
- this._stopped = false;
43
- await sodium.ready;
44
- // Check for persisted state
45
- const persisted = await loadState(this.config.dataDir);
46
- if (persisted) {
47
- this._persisted = persisted;
48
- this._deviceId = persisted.deviceId;
49
- this._deviceJwt = persisted.deviceJwt;
50
- this._conversationId = persisted.conversationId;
51
- this._fingerprint = persisted.fingerprint;
52
- this._ratchet = DoubleRatchet.deserialize(persisted.ratchetState);
53
- this._connect();
54
- return;
55
- }
56
- // Full lifecycle: enroll → poll → activate → connect
57
- await this._enroll();
58
- }
59
- async send(plaintext) {
60
- if (this._state !== "ready" || !this._ratchet || !this._ws) {
61
- throw new Error("Channel is not ready");
62
- }
63
- const encrypted = this._ratchet.encrypt(plaintext);
64
- const transport = encryptedMessageToTransport(encrypted);
65
- this._ws.send(JSON.stringify({
66
- event: "message",
67
- data: {
68
- conversation_id: this._conversationId,
69
- header_blob: transport.header_blob,
70
- ciphertext: transport.ciphertext,
71
- },
72
- }));
73
- // Persist ratchet state after encrypt
74
- await this._persistState();
75
- }
76
- async stop() {
77
- this._stopped = true;
78
- if (this._pollTimer) {
79
- clearTimeout(this._pollTimer);
80
- this._pollTimer = null;
81
- }
82
- if (this._reconnectTimer) {
83
- clearTimeout(this._reconnectTimer);
84
- this._reconnectTimer = null;
85
- }
86
- if (this._ws) {
87
- this._ws.removeAllListeners();
88
- this._ws.close();
89
- this._ws = null;
90
- }
91
- this._setState("disconnected");
92
- }
93
- // --- Internal lifecycle ---
94
- async _enroll() {
95
- this._setState("enrolling");
96
- try {
97
- const identity = await generateIdentityKeypair();
98
- const ephemeral = await generateEphemeralKeypair();
99
- const fingerprint = computeFingerprint(identity.publicKey);
100
- const proof = createProofOfPossession(identity.privateKey, identity.publicKey);
101
- const result = await enrollDevice(this.config.apiUrl, this.config.inviteToken, bytesToHex(identity.publicKey), bytesToHex(ephemeral.publicKey), bytesToHex(proof), this.config.platform);
102
- this._deviceId = result.device_id;
103
- this._fingerprint = result.fingerprint;
104
- // Store keypairs temporarily for activation (not persisted yet — no JWT)
105
- this._persisted = {
106
- deviceId: result.device_id,
107
- deviceJwt: "", // set after activation
108
- conversationId: "", // set after activation
109
- identityKeypair: {
110
- publicKey: bytesToHex(identity.publicKey),
111
- privateKey: bytesToHex(identity.privateKey),
112
- },
113
- ephemeralKeypair: {
114
- publicKey: bytesToHex(ephemeral.publicKey),
115
- privateKey: bytesToHex(ephemeral.privateKey),
116
- },
117
- fingerprint: result.fingerprint,
118
- ratchetState: "", // set after activation
119
- };
120
- this._poll();
121
- }
122
- catch (err) {
123
- this._handleError(err);
124
- }
125
- }
126
- _poll() {
127
- if (this._stopped)
128
- return;
129
- this._setState("polling");
130
- const doPoll = async () => {
131
- if (this._stopped)
132
- return;
133
- try {
134
- const status = await pollDeviceStatus(this.config.apiUrl, this._deviceId);
135
- if (status.status === "APPROVED") {
136
- await this._activate();
137
- return;
138
- }
139
- if (status.status === "REVOKED") {
140
- this._handleError(new Error("Device was revoked"));
141
- return;
142
- }
143
- // Still PENDING — poll again
144
- this._pollTimer = setTimeout(doPoll, POLL_INTERVAL_MS);
145
- }
146
- catch (err) {
147
- this._handleError(err);
148
- }
149
- };
150
- this._pollTimer = setTimeout(doPoll, POLL_INTERVAL_MS);
151
- }
152
- async _activate() {
153
- this._setState("activating");
154
- try {
155
- const result = await activateDevice(this.config.apiUrl, this._deviceId);
156
- this._conversationId = result.conversation_id;
157
- this._deviceJwt = result.device_jwt;
158
- // Perform X3DH as receiver (agent side)
159
- const identity = this._persisted.identityKeypair;
160
- const ephemeral = this._persisted.ephemeralKeypair;
161
- const sharedSecret = await performX3DH({
162
- myIdentityPrivate: hexToBytes(identity.privateKey),
163
- myEphemeralPrivate: hexToBytes(ephemeral.privateKey),
164
- theirIdentityPublic: hexToBytes(result.owner_identity_public_key),
165
- theirEphemeralPublic: hexToBytes(result.owner_ephemeral_public_key ?? result.owner_identity_public_key),
166
- isInitiator: false,
167
- });
168
- // Initialize ratchet as receiver
169
- this._ratchet = DoubleRatchet.initReceiver(sharedSecret, {
170
- publicKey: hexToBytes(identity.publicKey),
171
- privateKey: hexToBytes(identity.privateKey),
172
- keyType: "ed25519",
173
- });
174
- // Persist full state
175
- this._persisted = {
176
- ...this._persisted,
177
- deviceJwt: result.device_jwt,
178
- conversationId: result.conversation_id,
179
- ratchetState: this._ratchet.serialize(),
180
- };
181
- await saveState(this.config.dataDir, this._persisted);
182
- this._connect();
183
- }
184
- catch (err) {
185
- this._handleError(err);
186
- }
187
- }
188
- _connect() {
189
- if (this._stopped)
190
- return;
191
- this._setState("connecting");
192
- const wsUrl = this.config.apiUrl.replace(/^http/, "ws");
193
- const url = `${wsUrl}/api/v1/ws?token=${encodeURIComponent(this._deviceJwt)}&device_id=${this._deviceId}`;
194
- const ws = new WebSocket(url);
195
- this._ws = ws;
196
- ws.on("open", async () => {
197
- this._reconnectAttempt = 0;
198
- // Sync missed messages before declaring ready
199
- await this._syncMissedMessages();
200
- this._setState("ready");
201
- this.emit("ready");
202
- });
203
- ws.on("message", async (raw) => {
204
- try {
205
- const data = JSON.parse(raw.toString());
206
- if (data.event === "ping") {
207
- ws.send(JSON.stringify({ event: "pong" }));
208
- return;
209
- }
210
- if (data.event === "device_revoked") {
211
- await clearState(this.config.dataDir);
212
- this._handleError(new Error("Device was revoked"));
213
- return;
214
- }
215
- if (data.event === "message") {
216
- const msgData = data.data;
217
- // Don't decrypt our own messages
218
- if (msgData.sender_device_id === this._deviceId)
219
- return;
220
- const encrypted = transportToEncryptedMessage({
221
- header_blob: msgData.header_blob,
222
- ciphertext: msgData.ciphertext,
223
- });
224
- const plaintext = this._ratchet.decrypt(encrypted);
225
- // Persist ratchet state after decrypt
226
- await this._persistState();
227
- const metadata = {
228
- messageId: msgData.message_id,
229
- conversationId: msgData.conversation_id,
230
- timestamp: msgData.created_at,
231
- };
232
- this.emit("message", plaintext, metadata);
233
- this.config.onMessage?.(plaintext, metadata);
234
- // Track last message timestamp for offline sync
235
- this._persisted.lastMessageTimestamp = msgData.created_at;
236
- }
237
- }
238
- catch (err) {
239
- this.emit("error", err);
240
- }
241
- });
242
- ws.on("close", () => {
243
- if (this._stopped)
244
- return;
245
- this._setState("disconnected");
246
- this._scheduleReconnect();
247
- });
248
- ws.on("error", (err) => {
249
- this.emit("error", err);
250
- // The close event will fire after this and handle reconnection
251
- });
252
- }
253
- async _syncMissedMessages() {
254
- if (!this._persisted?.lastMessageTimestamp || !this._deviceJwt)
255
- return;
256
- try {
257
- const since = encodeURIComponent(this._persisted.lastMessageTimestamp);
258
- const url = `${this.config.apiUrl}/api/v1/devices/${this._deviceId}/messages?since=${since}&limit=200`;
259
- const res = await fetch(url, {
260
- headers: { Authorization: `Bearer ${this._deviceJwt}` },
261
- });
262
- if (!res.ok)
263
- return; // Non-critical — will get new messages via WS
264
- const messages = await res.json();
265
- for (const msg of messages) {
266
- // Skip our own messages
267
- if (msg.sender_device_id === this._deviceId)
268
- continue;
269
- try {
270
- const encrypted = transportToEncryptedMessage({
271
- header_blob: msg.header_blob,
272
- ciphertext: msg.ciphertext,
273
- });
274
- const plaintext = this._ratchet.decrypt(encrypted);
275
- const metadata = {
276
- messageId: msg.id,
277
- conversationId: msg.conversation_id,
278
- timestamp: msg.created_at,
279
- };
280
- this.emit("message", plaintext, metadata);
281
- this.config.onMessage?.(plaintext, metadata);
282
- // Update last message timestamp
283
- this._persisted.lastMessageTimestamp = msg.created_at;
284
- }
285
- catch (err) {
286
- this.emit("error", err);
287
- break; // Ratchet desync — stop processing
288
- }
289
- }
290
- await this._persistState();
291
- }
292
- catch {
293
- // Network error — non-critical, will get messages via WS
294
- }
295
- }
296
- _scheduleReconnect() {
297
- if (this._stopped)
298
- return;
299
- const delay = Math.min(RECONNECT_BASE_MS * Math.pow(2, this._reconnectAttempt), RECONNECT_MAX_MS);
300
- this._reconnectAttempt++;
301
- this._reconnectTimer = setTimeout(() => {
302
- if (!this._stopped) {
303
- this._connect();
304
- }
305
- }, delay);
306
- }
307
- _setState(newState) {
308
- if (this._state === newState)
309
- return;
310
- this._state = newState;
311
- this.emit("state", newState);
312
- this.config.onStateChange?.(newState);
313
- }
314
- _handleError(err) {
315
- this._setState("error");
316
- this.emit("error", err);
317
- }
318
- async _persistState() {
319
- if (!this._persisted || !this._ratchet)
320
- return;
321
- this._persisted.ratchetState = this._ratchet.serialize();
322
- await saveState(this.config.dataDir, this._persisted);
323
- }
324
- }
325
- //# sourceMappingURL=channel.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"channel.js","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"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"}
@@ -1,44 +0,0 @@
1
- import sodium from "libsodium-wrappers-sumo";
2
- // --- Encoding helpers ---
3
- export function hexToBytes(hex) {
4
- return sodium.from_hex(hex);
5
- }
6
- export function bytesToHex(bytes) {
7
- return sodium.to_hex(bytes);
8
- }
9
- export function base64ToBytes(b64) {
10
- return sodium.from_base64(b64, sodium.base64_variants.ORIGINAL);
11
- }
12
- export function bytesToBase64(bytes) {
13
- return sodium.to_base64(bytes, sodium.base64_variants.ORIGINAL);
14
- }
15
- export function encryptedMessageToTransport(msg) {
16
- const headerObj = {
17
- dhPublicKey: bytesToBase64(msg.header.dhPublicKey),
18
- previousChainLength: msg.header.previousChainLength,
19
- messageNumber: msg.header.messageNumber,
20
- headerSignature: bytesToBase64(msg.headerSignature),
21
- nonce: bytesToBase64(msg.nonce),
22
- };
23
- const headerJson = JSON.stringify(headerObj);
24
- const headerBlob = bytesToBase64(new TextEncoder().encode(headerJson));
25
- return {
26
- header_blob: headerBlob,
27
- ciphertext: bytesToBase64(msg.ciphertext),
28
- };
29
- }
30
- export function transportToEncryptedMessage(transport) {
31
- const headerJson = new TextDecoder().decode(base64ToBytes(transport.header_blob));
32
- const headerObj = JSON.parse(headerJson);
33
- return {
34
- header: {
35
- dhPublicKey: base64ToBytes(headerObj.dhPublicKey),
36
- previousChainLength: headerObj.previousChainLength,
37
- messageNumber: headerObj.messageNumber,
38
- },
39
- headerSignature: base64ToBytes(headerObj.headerSignature),
40
- nonce: base64ToBytes(headerObj.nonce),
41
- ciphertext: base64ToBytes(transport.ciphertext),
42
- };
43
- }
44
- //# sourceMappingURL=crypto-helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"crypto-helpers.js","sourceRoot":"","sources":["../src/crypto-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAG7C,2BAA2B;AAE3B,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAiB;IAC1C,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAiB;IAC7C,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AAClE,CAAC;AAUD,MAAM,UAAU,2BAA2B,CACzC,GAAqB;IAErB,MAAM,SAAS,GAAG;QAChB,WAAW,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC;QAClD,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,mBAAmB;QACnD,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa;QACvC,eAAe,EAAE,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC;QACnD,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;KAChC,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,aAAa,CAC9B,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CACrC,CAAC;IACF,OAAO;QACL,WAAW,EAAE,UAAU;QACvB,UAAU,EAAE,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,SAA2B;IAE3B,MAAM,UAAU,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CACzC,aAAa,CAAC,SAAS,CAAC,WAAW,CAAC,CACrC,CAAC;IACF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACzC,OAAO;QACL,MAAM,EAAE;YACN,WAAW,EAAE,aAAa,CAAC,SAAS,CAAC,WAAW,CAAC;YACjD,mBAAmB,EAAE,SAAS,CAAC,mBAAmB;YAClD,aAAa,EAAE,SAAS,CAAC,aAAa;SACvC;QACD,eAAe,EAAE,aAAa,CAAC,SAAS,CAAC,eAAe,CAAC;QACzD,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC;QACrC,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC;KAChD,CAAC;AACJ,CAAC"}
package/dist/state.js DELETED
@@ -1,28 +0,0 @@
1
- import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
2
- import { join } from "node:path";
3
- const STATE_FILE = "secure-channel.json";
4
- export async function saveState(dataDir, state) {
5
- await mkdir(dataDir, { recursive: true });
6
- const filePath = join(dataDir, STATE_FILE);
7
- await writeFile(filePath, JSON.stringify(state, null, 2), "utf-8");
8
- }
9
- export async function loadState(dataDir) {
10
- const filePath = join(dataDir, STATE_FILE);
11
- try {
12
- const raw = await readFile(filePath, "utf-8");
13
- return JSON.parse(raw);
14
- }
15
- catch {
16
- return null;
17
- }
18
- }
19
- export async function clearState(dataDir) {
20
- const filePath = join(dataDir, STATE_FILE);
21
- try {
22
- await rm(filePath);
23
- }
24
- catch {
25
- // File doesn't exist — nothing to clear
26
- }
27
- }
28
- //# sourceMappingURL=state.js.map
package/dist/state.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,UAAU,GAAG,qBAAqB,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAe,EACf,KAAqB;IAErB,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC3C,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAe;IAEf,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;IAC1C,CAAC;AACH,CAAC"}
package/dist/transport.js DELETED
@@ -1,39 +0,0 @@
1
- export async function enrollDevice(apiUrl, inviteToken, identityPkHex, ephemeralPkHex, proofHex, platform) {
2
- const res = await fetch(`${apiUrl}/api/v1/enroll`, {
3
- method: "POST",
4
- headers: { "Content-Type": "application/json" },
5
- body: JSON.stringify({
6
- invite_token: inviteToken,
7
- identity_public_key: identityPkHex,
8
- ephemeral_public_key: ephemeralPkHex,
9
- proof_of_possession: proofHex,
10
- platform: platform ?? "node",
11
- }),
12
- });
13
- if (!res.ok) {
14
- const detail = await res.text();
15
- throw new Error(`Enrollment failed (${res.status}): ${detail}`);
16
- }
17
- return res.json();
18
- }
19
- export async function pollDeviceStatus(apiUrl, deviceId) {
20
- const res = await fetch(`${apiUrl}/api/v1/devices/${deviceId}/status`);
21
- if (!res.ok) {
22
- const detail = await res.text();
23
- throw new Error(`Status poll failed (${res.status}): ${detail}`);
24
- }
25
- return res.json();
26
- }
27
- export async function activateDevice(apiUrl, deviceId) {
28
- const res = await fetch(`${apiUrl}/api/v1/devices/${deviceId}/activate`, {
29
- method: "POST",
30
- headers: { "Content-Type": "application/json" },
31
- body: JSON.stringify({}),
32
- });
33
- if (!res.ok) {
34
- const detail = await res.text();
35
- throw new Error(`Activation failed (${res.status}): ${detail}`);
36
- }
37
- return res.json();
38
- }
39
- //# sourceMappingURL=transport.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,WAAmB,EACnB,aAAqB,EACrB,cAAsB,EACtB,QAAgB,EAChB,QAAiB;IAEjB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,gBAAgB,EAAE;QACjD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,YAAY,EAAE,WAAW;YACzB,mBAAmB,EAAE,aAAa;YAClC,oBAAoB,EAAE,cAAc;YACpC,mBAAmB,EAAE,QAAQ;YAC7B,QAAQ,EAAE,QAAQ,IAAI,MAAM;SAC7B,CAAC;KACH,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,MAAM,MAAM,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAc,EACd,QAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,mBAAmB,QAAQ,SAAS,CAAC,CAAC;IACvE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,MAAM,MAAM,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,QAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,mBAAmB,QAAQ,WAAW,EAAE;QACvE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;KACzB,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,MAAM,MAAM,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC"}
package/dist/types.js DELETED
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
package/dist/types.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}