@essentialai/cogent-bridge 1.0.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 (156) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +311 -0
  3. package/dist/backend/backend-provider.d.ts +28 -0
  4. package/dist/backend/backend-provider.d.ts.map +1 -0
  5. package/dist/backend/backend-provider.js +60 -0
  6. package/dist/backend/backend-provider.js.map +1 -0
  7. package/dist/backend/file-backend.d.ts +22 -0
  8. package/dist/backend/file-backend.d.ts.map +1 -0
  9. package/dist/backend/file-backend.js +46 -0
  10. package/dist/backend/file-backend.js.map +1 -0
  11. package/dist/backend/http-backend.d.ts +94 -0
  12. package/dist/backend/http-backend.d.ts.map +1 -0
  13. package/dist/backend/http-backend.js +185 -0
  14. package/dist/backend/http-backend.js.map +1 -0
  15. package/dist/backend/index.d.ts +5 -0
  16. package/dist/backend/index.d.ts.map +1 -0
  17. package/dist/backend/index.js +4 -0
  18. package/dist/backend/index.js.map +1 -0
  19. package/dist/backend/storage-backend.d.ts +22 -0
  20. package/dist/backend/storage-backend.d.ts.map +1 -0
  21. package/dist/backend/storage-backend.js +2 -0
  22. package/dist/backend/storage-backend.js.map +1 -0
  23. package/dist/cli.d.ts +3 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +18 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/cloud/backoff.d.ts +19 -0
  28. package/dist/cloud/backoff.d.ts.map +1 -0
  29. package/dist/cloud/backoff.js +32 -0
  30. package/dist/cloud/backoff.js.map +1 -0
  31. package/dist/cloud/credential-store.d.ts +29 -0
  32. package/dist/cloud/credential-store.d.ts.map +1 -0
  33. package/dist/cloud/credential-store.js +38 -0
  34. package/dist/cloud/credential-store.js.map +1 -0
  35. package/dist/cloud/http-client.d.ts +36 -0
  36. package/dist/cloud/http-client.d.ts.map +1 -0
  37. package/dist/cloud/http-client.js +94 -0
  38. package/dist/cloud/http-client.js.map +1 -0
  39. package/dist/cloud/index.d.ts +10 -0
  40. package/dist/cloud/index.d.ts.map +1 -0
  41. package/dist/cloud/index.js +7 -0
  42. package/dist/cloud/index.js.map +1 -0
  43. package/dist/cloud/message-inbox.d.ts +49 -0
  44. package/dist/cloud/message-inbox.d.ts.map +1 -0
  45. package/dist/cloud/message-inbox.js +109 -0
  46. package/dist/cloud/message-inbox.js.map +1 -0
  47. package/dist/cloud/ws-client.d.ts +112 -0
  48. package/dist/cloud/ws-client.d.ts.map +1 -0
  49. package/dist/cloud/ws-client.js +241 -0
  50. package/dist/cloud/ws-client.js.map +1 -0
  51. package/dist/cloud/ws-frames.d.ts +66 -0
  52. package/dist/cloud/ws-frames.d.ts.map +1 -0
  53. package/dist/cloud/ws-frames.js +19 -0
  54. package/dist/cloud/ws-frames.js.map +1 -0
  55. package/dist/config.d.ts +40 -0
  56. package/dist/config.d.ts.map +1 -0
  57. package/dist/config.js +39 -0
  58. package/dist/config.js.map +1 -0
  59. package/dist/constants.d.ts +3 -0
  60. package/dist/constants.d.ts.map +1 -0
  61. package/dist/constants.js +6 -0
  62. package/dist/constants.js.map +1 -0
  63. package/dist/e2e/helpers.d.ts +101 -0
  64. package/dist/e2e/helpers.d.ts.map +1 -0
  65. package/dist/e2e/helpers.js +228 -0
  66. package/dist/e2e/helpers.js.map +1 -0
  67. package/dist/errors.d.ts +40 -0
  68. package/dist/errors.d.ts.map +1 -0
  69. package/dist/errors.js +53 -0
  70. package/dist/errors.js.map +1 -0
  71. package/dist/index.d.ts +2 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +108 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/logger.d.ts +22 -0
  76. package/dist/logger.d.ts.map +1 -0
  77. package/dist/logger.js +79 -0
  78. package/dist/logger.js.map +1 -0
  79. package/dist/services/cc-cli.d.ts +8 -0
  80. package/dist/services/cc-cli.d.ts.map +1 -0
  81. package/dist/services/cc-cli.js +104 -0
  82. package/dist/services/cc-cli.js.map +1 -0
  83. package/dist/services/health-check.d.ts +33 -0
  84. package/dist/services/health-check.d.ts.map +1 -0
  85. package/dist/services/health-check.js +96 -0
  86. package/dist/services/health-check.js.map +1 -0
  87. package/dist/services/peer-registry.d.ts +9 -0
  88. package/dist/services/peer-registry.d.ts.map +1 -0
  89. package/dist/services/peer-registry.js +207 -0
  90. package/dist/services/peer-registry.js.map +1 -0
  91. package/dist/startup.d.ts +18 -0
  92. package/dist/startup.d.ts.map +1 -0
  93. package/dist/startup.js +270 -0
  94. package/dist/startup.js.map +1 -0
  95. package/dist/tools/create-session.d.ts +12 -0
  96. package/dist/tools/create-session.d.ts.map +1 -0
  97. package/dist/tools/create-session.js +113 -0
  98. package/dist/tools/create-session.js.map +1 -0
  99. package/dist/tools/deregister-peer.d.ts +3 -0
  100. package/dist/tools/deregister-peer.d.ts.map +1 -0
  101. package/dist/tools/deregister-peer.js +38 -0
  102. package/dist/tools/deregister-peer.js.map +1 -0
  103. package/dist/tools/get-history.d.ts +3 -0
  104. package/dist/tools/get-history.d.ts.map +1 -0
  105. package/dist/tools/get-history.js +40 -0
  106. package/dist/tools/get-history.js.map +1 -0
  107. package/dist/tools/health-check.d.ts +3 -0
  108. package/dist/tools/health-check.d.ts.map +1 -0
  109. package/dist/tools/health-check.js +28 -0
  110. package/dist/tools/health-check.js.map +1 -0
  111. package/dist/tools/join-session.d.ts +12 -0
  112. package/dist/tools/join-session.d.ts.map +1 -0
  113. package/dist/tools/join-session.js +90 -0
  114. package/dist/tools/join-session.js.map +1 -0
  115. package/dist/tools/list-peers.d.ts +3 -0
  116. package/dist/tools/list-peers.d.ts.map +1 -0
  117. package/dist/tools/list-peers.js +36 -0
  118. package/dist/tools/list-peers.js.map +1 -0
  119. package/dist/tools/register-peer.d.ts +3 -0
  120. package/dist/tools/register-peer.d.ts.map +1 -0
  121. package/dist/tools/register-peer.js +155 -0
  122. package/dist/tools/register-peer.js.map +1 -0
  123. package/dist/tools/send-message.d.ts +3 -0
  124. package/dist/tools/send-message.d.ts.map +1 -0
  125. package/dist/tools/send-message.js +121 -0
  126. package/dist/tools/send-message.js.map +1 -0
  127. package/dist/types.d.ts +31 -0
  128. package/dist/types.d.ts.map +1 -0
  129. package/dist/types.js +2 -0
  130. package/dist/types.js.map +1 -0
  131. package/dist/wizard/detect.d.ts +4 -0
  132. package/dist/wizard/detect.d.ts.map +1 -0
  133. package/dist/wizard/detect.js +21 -0
  134. package/dist/wizard/detect.js.map +1 -0
  135. package/dist/wizard/index.d.ts +5 -0
  136. package/dist/wizard/index.d.ts.map +1 -0
  137. package/dist/wizard/index.js +140 -0
  138. package/dist/wizard/index.js.map +1 -0
  139. package/dist/wizard/prompts.d.ts +18 -0
  140. package/dist/wizard/prompts.d.ts.map +1 -0
  141. package/dist/wizard/prompts.js +66 -0
  142. package/dist/wizard/prompts.js.map +1 -0
  143. package/dist/wizard/scaffold-demo.d.ts +6 -0
  144. package/dist/wizard/scaffold-demo.d.ts.map +1 -0
  145. package/dist/wizard/scaffold-demo.js +37 -0
  146. package/dist/wizard/scaffold-demo.js.map +1 -0
  147. package/dist/wizard/scaffold-real.d.ts +16 -0
  148. package/dist/wizard/scaffold-real.d.ts.map +1 -0
  149. package/dist/wizard/scaffold-real.js +64 -0
  150. package/dist/wizard/scaffold-real.js.map +1 -0
  151. package/dist/wizard/templates.d.ts +9 -0
  152. package/dist/wizard/templates.d.ts.map +1 -0
  153. package/dist/wizard/templates.js +182 -0
  154. package/dist/wizard/templates.js.map +1 -0
  155. package/package.json +71 -0
  156. package/server.json +60 -0
@@ -0,0 +1,185 @@
1
+ import { SERVER_VERSION } from "../constants.js";
2
+ /**
3
+ * API path patterns matching @essentialai/cogent PATHS constants.
4
+ * Defined locally because cogent is not a dependency of the main package.
5
+ */
6
+ const PATHS = {
7
+ peers: "/api/sessions/:sessionId/peers",
8
+ peer: "/api/sessions/:sessionId/peers/:peerId",
9
+ messages: "/api/sessions/:sessionId/messages",
10
+ health: "/api/health",
11
+ };
12
+ /**
13
+ * Cloud-mode storage backend.
14
+ *
15
+ * Implements StorageBackend by translating all state operations into REST
16
+ * API calls to the cloud relay server. Used when COGENT_ENDPOINT is
17
+ * set to an HTTP/HTTPS URL.
18
+ *
19
+ * Cloud-specific behavior differences from FileBackend:
20
+ * - updateLastSeen is a no-op (server tracks activity automatically)
21
+ * - validateSession always returns true (server validates on every request)
22
+ * - execClaude returns a synthetic result (no CLI subprocess in cloud mode)
23
+ * - checkHealth queries the server health endpoint instead of local checks
24
+ */
25
+ export class HttpBackend {
26
+ http;
27
+ sessionId;
28
+ constructor(http, sessionId) {
29
+ this.http = http;
30
+ this.sessionId = sessionId;
31
+ }
32
+ /**
33
+ * Register a peer in the cloud session.
34
+ * POST /api/sessions/:sessionId/peers
35
+ *
36
+ * The sessionId parameter from StorageBackend is the local CC sessionId;
37
+ * in cloud mode we ignore it and use this.sessionId (the cloud session).
38
+ */
39
+ async registerPeer(peerId, _sessionId, cwd, label) {
40
+ const path = PATHS.peers.replace(":sessionId", this.sessionId);
41
+ return this.http.post(path, { peerId, cwd, label });
42
+ }
43
+ /**
44
+ * Deregister a peer from the cloud session.
45
+ * DELETE /api/sessions/:sessionId/peers/:peerId
46
+ *
47
+ * Returns true on success, false if the peer was not found.
48
+ */
49
+ async deregisterPeer(peerId) {
50
+ const path = PATHS.peer
51
+ .replace(":sessionId", this.sessionId)
52
+ .replace(":peerId", peerId);
53
+ try {
54
+ await this.http.delete(path, {});
55
+ return true;
56
+ }
57
+ catch {
58
+ // Server returns 404 if peer not found, which HttpClient throws as BridgeError
59
+ return false;
60
+ }
61
+ }
62
+ /**
63
+ * Get a single peer by ID.
64
+ * No dedicated single-peer REST endpoint exists, so we list all peers
65
+ * and filter client-side.
66
+ */
67
+ async getPeer(peerId) {
68
+ const peers = await this.listPeers();
69
+ return peers.find((p) => p.peerId === peerId);
70
+ }
71
+ /**
72
+ * List all peers in the cloud session.
73
+ * GET /api/sessions/:sessionId/peers
74
+ */
75
+ async listPeers() {
76
+ const path = PATHS.peers.replace(":sessionId", this.sessionId);
77
+ const result = await this.http.get(path);
78
+ return result.peers;
79
+ }
80
+ /**
81
+ * Update last-seen timestamp for a peer.
82
+ * In cloud mode, the server updates lastSeenAt automatically on
83
+ * authenticated requests, so this is a no-op.
84
+ */
85
+ async updateLastSeen(_peerId) {
86
+ /* Server tracks activity automatically */
87
+ }
88
+ /**
89
+ * Record a message in the cloud session.
90
+ * POST /api/sessions/:sessionId/messages
91
+ *
92
+ * Sends the message to the server which stores it and returns
93
+ * { id, success, timestamp }. We merge the server response with
94
+ * the input record to construct a full MessageRecord.
95
+ */
96
+ async recordMessage(record) {
97
+ const path = PATHS.messages.replace(":sessionId", this.sessionId);
98
+ const resp = await this.http.post(path, {
99
+ fromPeerId: record.fromPeerId,
100
+ toPeerId: record.toPeerId,
101
+ message: record.message,
102
+ });
103
+ return {
104
+ ...record,
105
+ id: resp.id,
106
+ timestamp: resp.timestamp,
107
+ };
108
+ }
109
+ /**
110
+ * Get message history from the cloud session.
111
+ * GET /api/sessions/:sessionId/messages
112
+ *
113
+ * Supports optional peerId filter and limit (default 100).
114
+ */
115
+ async getHistory(peerId, limit) {
116
+ const path = PATHS.messages.replace(":sessionId", this.sessionId);
117
+ const query = {};
118
+ if (peerId) {
119
+ query.peerId = peerId;
120
+ }
121
+ query.limit = String(limit ?? 100);
122
+ const result = await this.http.get(path, query);
123
+ return result.messages;
124
+ }
125
+ /**
126
+ * Validate a session.
127
+ * In cloud mode, the server validates session authenticity on every
128
+ * authenticated request, so this always returns true.
129
+ */
130
+ async validateSession(_sessionId, _cwd) {
131
+ return true;
132
+ }
133
+ /**
134
+ * Execute a Claude CLI command.
135
+ * In cloud mode, there is no CLI subprocess. Message delivery is
136
+ * handled by recordMessage() via REST. The send-message tool handler
137
+ * calls execClaude() after validating peers, then calls recordMessage()
138
+ * separately. In cloud mode, execClaude simply returns a synthetic
139
+ * result indicating the message was delivered via the cloud relay.
140
+ */
141
+ async execClaude(_sessionId, _message, _cwd, _timeoutMs) {
142
+ return {
143
+ stdout: "Message delivered via cloud relay.",
144
+ stderr: "",
145
+ exitCode: 0,
146
+ };
147
+ }
148
+ /**
149
+ * Check health of the cloud relay server.
150
+ * GET /api/health
151
+ *
152
+ * Maps the server's HealthResponse into the local HealthCheckResult
153
+ * format with cloud-mode-specific diagnostics.
154
+ */
155
+ async checkHealth() {
156
+ const resp = await this.http.get(PATHS.health);
157
+ return {
158
+ healthy: resp.status === "ok",
159
+ serverVersion: SERVER_VERSION,
160
+ statePath: "cloud:" + this.sessionId,
161
+ claudePath: "N/A (cloud mode)",
162
+ checks: {
163
+ stateFile: {
164
+ ok: true,
165
+ message: "Cloud mode -- state managed by server",
166
+ },
167
+ lockMechanism: {
168
+ ok: true,
169
+ message: "Cloud mode -- no local locks needed",
170
+ },
171
+ claudeCli: {
172
+ ok: true,
173
+ message: "Cloud mode -- no CLI needed",
174
+ },
175
+ },
176
+ timestamp: new Date().toISOString(),
177
+ mode: "cloud",
178
+ serverStatus: resp.status,
179
+ activeSessions: resp.activeSessions,
180
+ connectedPeers: resp.connectedPeers,
181
+ serverUptime: resp.uptime,
182
+ };
183
+ }
184
+ }
185
+ //# sourceMappingURL=http-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-backend.js","sourceRoot":"","sources":["../../src/backend/http-backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type { StorageBackend } from "./storage-backend.js";
2
+ export { FileBackend } from "./file-backend.js";
3
+ export { HttpBackend } from "./http-backend.js";
4
+ export { initBackend, getBackend, resetBackend, createBackend, isCloudEndpoint } from "./backend-provider.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backend/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { FileBackend } from "./file-backend.js";
2
+ export { HttpBackend } from "./http-backend.js";
3
+ export { initBackend, getBackend, resetBackend, createBackend, isCloudEndpoint } from "./backend-provider.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/backend/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { PeerInfo, MessageRecord, CliExecResult } from "../types.js";
2
+ import { HealthCheckResult } from "../services/health-check.js";
3
+ /**
4
+ * Abstract storage backend interface.
5
+ *
6
+ * Mirrors the exact signatures of the free functions in peer-registry.ts,
7
+ * cc-cli.ts, and health-check.ts. Implementations can delegate to local
8
+ * file-based state (FileBackend) or to a remote HTTP server (future).
9
+ */
10
+ export interface StorageBackend {
11
+ registerPeer(peerId: string, sessionId: string, cwd: string, label: string): Promise<PeerInfo>;
12
+ deregisterPeer(peerId: string): Promise<boolean>;
13
+ getPeer(peerId: string): Promise<PeerInfo | undefined>;
14
+ listPeers(): Promise<PeerInfo[]>;
15
+ updateLastSeen(peerId: string): Promise<void>;
16
+ recordMessage(record: Omit<MessageRecord, "id" | "timestamp">): Promise<MessageRecord>;
17
+ getHistory(peerId?: string, limit?: number): Promise<MessageRecord[]>;
18
+ validateSession(sessionId: string, cwd: string): Promise<boolean>;
19
+ execClaude(sessionId: string, message: string, cwd: string, timeoutMs?: number): Promise<CliExecResult>;
20
+ checkHealth(): Promise<HealthCheckResult>;
21
+ }
22
+ //# sourceMappingURL=storage-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-backend.d.ts","sourceRoot":"","sources":["../../src/backend/storage-backend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAE7B,YAAY,CACV,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,QAAQ,CAAC,CAAC;IAErB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjD,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;IAEvD,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEjC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAG9C,aAAa,CACX,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,CAAC,GAC9C,OAAO,CAAC,aAAa,CAAC,CAAC;IAE1B,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAGtE,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAElE,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC,CAAC;IAG1B,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC3C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=storage-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-backend.js","sourceRoot":"","sources":["../../src/backend/storage-backend.ts"],"names":[],"mappings":""}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare function runCli(): Promise<void>;
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAU5C"}
package/dist/cli.js ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ export async function runCli() {
3
+ const command = process.argv[2];
4
+ if (command === "init") {
5
+ const { runWizard } = await import("./wizard/index.js");
6
+ await runWizard();
7
+ }
8
+ else {
9
+ // Default: start MCP server (existing behavior)
10
+ await import("./index.js");
11
+ }
12
+ }
13
+ runCli().catch((err) => {
14
+ const msg = err instanceof Error ? err.message : String(err);
15
+ process.stderr.write(`Fatal error: ${msg}\n`);
16
+ process.exit(1);
17
+ });
18
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEhC,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACxD,MAAM,SAAS,EAAE,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,gDAAgD;QAChD,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC9B,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Exponential backoff utility for reconnection delays.
3
+ * Produces delays from baseMs (default 1s) doubling up to maxMs (default 30s)
4
+ * with configurable jitter to prevent thundering herd.
5
+ */
6
+ export declare class ExponentialBackoff {
7
+ private readonly baseMs;
8
+ private readonly maxMs;
9
+ private readonly jitterFactor;
10
+ private attempt;
11
+ constructor(baseMs?: number, maxMs?: number, jitterFactor?: number);
12
+ /** Get the next delay in ms and increment attempt counter. */
13
+ next(): number;
14
+ /** Reset after successful connection. */
15
+ reset(): void;
16
+ /** Current attempt number (0-based). */
17
+ get attempts(): number;
18
+ }
19
+ //# sourceMappingURL=backoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backoff.d.ts","sourceRoot":"","sources":["../../src/cloud/backoff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,kBAAkB;IAI3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAL/B,OAAO,CAAC,OAAO,CAAK;gBAGD,MAAM,GAAE,MAAa,EACrB,KAAK,GAAE,MAAe,EACtB,YAAY,GAAE,MAAY;IAG7C,8DAA8D;IAC9D,IAAI,IAAI,MAAM;IAOd,yCAAyC;IACzC,KAAK,IAAI,IAAI;IAIb,wCAAwC;IACxC,IAAI,QAAQ,IAAI,MAAM,CAErB;CACF"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Exponential backoff utility for reconnection delays.
3
+ * Produces delays from baseMs (default 1s) doubling up to maxMs (default 30s)
4
+ * with configurable jitter to prevent thundering herd.
5
+ */
6
+ export class ExponentialBackoff {
7
+ baseMs;
8
+ maxMs;
9
+ jitterFactor;
10
+ attempt = 0;
11
+ constructor(baseMs = 1000, maxMs = 30_000, jitterFactor = 0.1) {
12
+ this.baseMs = baseMs;
13
+ this.maxMs = maxMs;
14
+ this.jitterFactor = jitterFactor;
15
+ }
16
+ /** Get the next delay in ms and increment attempt counter. */
17
+ next() {
18
+ const expDelay = Math.min(this.baseMs * 2 ** this.attempt, this.maxMs);
19
+ const jitter = expDelay * this.jitterFactor * (Math.random() * 2 - 1);
20
+ this.attempt++;
21
+ return Math.max(0, expDelay + jitter);
22
+ }
23
+ /** Reset after successful connection. */
24
+ reset() {
25
+ this.attempt = 0;
26
+ }
27
+ /** Current attempt number (0-based). */
28
+ get attempts() {
29
+ return this.attempt;
30
+ }
31
+ }
32
+ //# sourceMappingURL=backoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backoff.js","sourceRoot":"","sources":["../../src/cloud/backoff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,kBAAkB;IAIV;IACA;IACA;IALX,OAAO,GAAG,CAAC,CAAC;IAEpB,YACmB,SAAiB,IAAI,EACrB,QAAgB,MAAM,EACtB,eAAuB,GAAG;QAF1B,WAAM,GAAN,MAAM,CAAe;QACrB,UAAK,GAAL,KAAK,CAAiB;QACtB,iBAAY,GAAZ,YAAY,CAAc;IAC1C,CAAC;IAEJ,8DAA8D;IAC9D,IAAI;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,yCAAyC;IACzC,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,wCAAwC;IACxC,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Shape of persisted cloud session credentials.
3
+ * Stored in ~/.cogent-credentials.json.
4
+ *
5
+ * Per anti-pattern guidance: stores the bearer token (not the secret).
6
+ * The secret is only used during create/join -- the token authenticates
7
+ * subsequent requests.
8
+ */
9
+ export interface PersistedCredentials {
10
+ endpoint: string;
11
+ sessionId: string;
12
+ token: string;
13
+ savedAt: string;
14
+ }
15
+ /**
16
+ * Load persisted credentials from disk.
17
+ * Returns null on any error (file not found, JSON parse failure, etc.).
18
+ */
19
+ export declare function loadCredentials(credentialPath?: string): Promise<PersistedCredentials | null>;
20
+ /**
21
+ * Save credentials to disk as pretty-printed JSON.
22
+ */
23
+ export declare function saveCredentials(creds: PersistedCredentials, credentialPath?: string): Promise<void>;
24
+ /**
25
+ * Delete the credential file from disk.
26
+ * Silently ignores ENOENT (file already absent).
27
+ */
28
+ export declare function clearCredentials(credentialPath?: string): Promise<void>;
29
+ //# sourceMappingURL=credential-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../../src/cloud/credential-store.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAsB,eAAe,CACnC,cAAc,GAAE,MAAwB,GACvC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAOtC;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,oBAAoB,EAC3B,cAAc,GAAE,MAAwB,GACvC,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,cAAc,GAAE,MAAwB,GACvC,OAAO,CAAC,IAAI,CAAC,CAQf"}
@@ -0,0 +1,38 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ const CREDENTIAL_PATH = path.join(os.homedir(), ".cogent-credentials.json");
5
+ /**
6
+ * Load persisted credentials from disk.
7
+ * Returns null on any error (file not found, JSON parse failure, etc.).
8
+ */
9
+ export async function loadCredentials(credentialPath = CREDENTIAL_PATH) {
10
+ try {
11
+ const raw = await fs.readFile(credentialPath, "utf-8");
12
+ return JSON.parse(raw);
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ }
18
+ /**
19
+ * Save credentials to disk as pretty-printed JSON.
20
+ */
21
+ export async function saveCredentials(creds, credentialPath = CREDENTIAL_PATH) {
22
+ await fs.writeFile(credentialPath, JSON.stringify(creds, null, 2) + "\n", "utf-8");
23
+ }
24
+ /**
25
+ * Delete the credential file from disk.
26
+ * Silently ignores ENOENT (file already absent).
27
+ */
28
+ export async function clearCredentials(credentialPath = CREDENTIAL_PATH) {
29
+ try {
30
+ await fs.unlink(credentialPath);
31
+ }
32
+ catch (err) {
33
+ if (err.code !== "ENOENT") {
34
+ throw err;
35
+ }
36
+ }
37
+ }
38
+ //# sourceMappingURL=credential-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../../src/cloud/credential-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAiBzB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,0BAA0B,CAAC,CAAC;AAE5E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,iBAAyB,eAAe;IAExC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAA2B,EAC3B,iBAAyB,eAAe;IAExC,MAAM,EAAE,CAAC,SAAS,CAChB,cAAc,EACd,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EACrC,OAAO,CACR,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,iBAAyB,eAAe;IAExC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Authenticated HTTP client for cloud relay server communication.
3
+ * Uses Node built-in fetch() (Node 18+) with Bearer token auth.
4
+ * Maps HTTP error responses to BridgeError for consistent error handling.
5
+ */
6
+ export declare class HttpClient {
7
+ private readonly baseUrl;
8
+ private token;
9
+ constructor(baseUrl: string, token: string);
10
+ private headers;
11
+ /**
12
+ * Perform an authenticated GET request.
13
+ * Appends query parameters to the URL if provided.
14
+ */
15
+ get<T>(path: string, query?: Record<string, string>): Promise<T>;
16
+ /**
17
+ * Perform an authenticated POST request with a JSON body.
18
+ */
19
+ post<T>(path: string, body: unknown): Promise<T>;
20
+ /**
21
+ * Perform an authenticated DELETE request.
22
+ * Returns void; ignores 204 No Content responses.
23
+ */
24
+ delete(path: string, body?: unknown): Promise<void>;
25
+ /**
26
+ * Update the Bearer token (e.g., after join-session returns a new token).
27
+ */
28
+ updateToken(newToken: string): void;
29
+ /**
30
+ * Parse an error response from the server and throw a BridgeError.
31
+ * If the server returns a cogent ErrorCode, it is passed through.
32
+ * For non-JSON error responses, STARTUP_FAILED is used as a fallback code.
33
+ */
34
+ private throwMappedError;
35
+ }
36
+ //# sourceMappingURL=http-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/cloud/http-client.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,qBAAa,UAAU;IAInB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAH1B,OAAO,CAAC,KAAK,CAAS;gBAGH,OAAO,EAAE,MAAM,EAChC,KAAK,EAAE,MAAM;IAKf,OAAO,CAAC,OAAO;IAOf;;;OAGG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IActE;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAatD;;;OAGG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzD;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAInC;;;;OAIG;YACW,gBAAgB;CAyB/B"}
@@ -0,0 +1,94 @@
1
+ import { BridgeError, BridgeErrorCode } from "../errors.js";
2
+ /**
3
+ * Authenticated HTTP client for cloud relay server communication.
4
+ * Uses Node built-in fetch() (Node 18+) with Bearer token auth.
5
+ * Maps HTTP error responses to BridgeError for consistent error handling.
6
+ */
7
+ export class HttpClient {
8
+ baseUrl;
9
+ token;
10
+ constructor(baseUrl, token) {
11
+ this.baseUrl = baseUrl;
12
+ this.token = token;
13
+ }
14
+ headers() {
15
+ return {
16
+ "Content-Type": "application/json",
17
+ "Authorization": `Bearer ${this.token}`,
18
+ };
19
+ }
20
+ /**
21
+ * Perform an authenticated GET request.
22
+ * Appends query parameters to the URL if provided.
23
+ */
24
+ async get(path, query) {
25
+ const url = new URL(path, this.baseUrl);
26
+ if (query) {
27
+ for (const [k, v] of Object.entries(query)) {
28
+ url.searchParams.set(k, v);
29
+ }
30
+ }
31
+ const resp = await fetch(url, { headers: this.headers() });
32
+ if (!resp.ok) {
33
+ await this.throwMappedError(resp);
34
+ }
35
+ return resp.json();
36
+ }
37
+ /**
38
+ * Perform an authenticated POST request with a JSON body.
39
+ */
40
+ async post(path, body) {
41
+ const url = new URL(path, this.baseUrl);
42
+ const resp = await fetch(url, {
43
+ method: "POST",
44
+ headers: this.headers(),
45
+ body: JSON.stringify(body),
46
+ });
47
+ if (!resp.ok) {
48
+ await this.throwMappedError(resp);
49
+ }
50
+ return resp.json();
51
+ }
52
+ /**
53
+ * Perform an authenticated DELETE request.
54
+ * Returns void; ignores 204 No Content responses.
55
+ */
56
+ async delete(path, body) {
57
+ const url = new URL(path, this.baseUrl);
58
+ const resp = await fetch(url, {
59
+ method: "DELETE",
60
+ headers: this.headers(),
61
+ body: body ? JSON.stringify(body) : undefined,
62
+ });
63
+ if (!resp.ok && resp.status !== 204) {
64
+ await this.throwMappedError(resp);
65
+ }
66
+ }
67
+ /**
68
+ * Update the Bearer token (e.g., after join-session returns a new token).
69
+ */
70
+ updateToken(newToken) {
71
+ this.token = newToken;
72
+ }
73
+ /**
74
+ * Parse an error response from the server and throw a BridgeError.
75
+ * If the server returns a cogent ErrorCode, it is passed through.
76
+ * For non-JSON error responses, STARTUP_FAILED is used as a fallback code.
77
+ */
78
+ async throwMappedError(resp) {
79
+ let errorBody;
80
+ try {
81
+ errorBody = (await resp.json());
82
+ }
83
+ catch {
84
+ errorBody = { message: resp.statusText };
85
+ }
86
+ // Try to use the server's error code if it maps to a BridgeErrorCode,
87
+ // otherwise fall back to STARTUP_FAILED as the most generic code.
88
+ const code = errorBody.code && errorBody.code in BridgeErrorCode
89
+ ? errorBody.code
90
+ : BridgeErrorCode.STARTUP_FAILED;
91
+ throw new BridgeError(code, errorBody.message ?? `HTTP ${resp.status}`, errorBody.suggestion);
92
+ }
93
+ }
94
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/cloud/http-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { HttpClient } from "./http-client.js";
2
+ export { ExponentialBackoff } from "./backoff.js";
3
+ export { loadCredentials, saveCredentials, clearCredentials, } from "./credential-store.js";
4
+ export type { PersistedCredentials } from "./credential-store.js";
5
+ export type { WsServerFrame, MessageFrame, PeerConnectedFrame, PeerDisconnectedFrame, PeersSnapshotFrame, QueuedMessagesFrame, ErrorFrame, } from "./ws-frames.js";
6
+ export { WsCloseCode } from "./ws-frames.js";
7
+ export { MessageInbox } from "./message-inbox.js";
8
+ export { CloudWsClient } from "./ws-client.js";
9
+ export type { WsState } from "./ws-client.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cloud/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EACL,eAAe,EACf,eAAe,EACf,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,YAAY,EACV,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { HttpClient } from "./http-client.js";
2
+ export { ExponentialBackoff } from "./backoff.js";
3
+ export { loadCredentials, saveCredentials, clearCredentials, } from "./credential-store.js";
4
+ export { WsCloseCode } from "./ws-frames.js";
5
+ export { MessageInbox } from "./message-inbox.js";
6
+ export { CloudWsClient } from "./ws-client.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cloud/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EACL,eAAe,EACf,eAAe,EACf,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAW/B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { MessageRecord } from "../types.js";
2
+ /**
3
+ * In-memory message inbox with deduplication and timestamp ordering.
4
+ *
5
+ * Aggregates messages from both WebSocket push and poll fallback channels.
6
+ * Deduplicates by message ID (bounded to last 1000 IDs) and maintains
7
+ * messages ordered by server timestamp for consistent display.
8
+ */
9
+ export declare class MessageInbox {
10
+ private messages;
11
+ private seenIds;
12
+ private seenOrder;
13
+ private listeners;
14
+ private lastMessageId;
15
+ /**
16
+ * Add a single message to the inbox.
17
+ * Returns true if the message was new (not a duplicate).
18
+ */
19
+ addMessage(msg: MessageRecord): boolean;
20
+ /**
21
+ * Add multiple messages at once.
22
+ * Returns the count of new (non-duplicate) messages added.
23
+ */
24
+ addMessages(msgs: MessageRecord[]): number;
25
+ /**
26
+ * Get all unread messages (copy of the internal array).
27
+ */
28
+ getUnread(): MessageRecord[];
29
+ /**
30
+ * Mark messages as read by removing them from the unread list.
31
+ * Does NOT remove from seenIds -- they remain for deduplication.
32
+ */
33
+ markRead(messageIds: string[]): void;
34
+ /**
35
+ * Get the ID of the last message received (by timestamp order).
36
+ * Used for poll sync -- pass as lastMessageId query parameter.
37
+ */
38
+ getLastMessageId(): string | null;
39
+ /**
40
+ * Subscribe to new message notifications.
41
+ * Returns an unsubscribe function.
42
+ */
43
+ onNewMessage(listener: () => void): () => void;
44
+ /**
45
+ * Clear all state: messages, seen IDs, last message ID, and listeners.
46
+ */
47
+ clear(): void;
48
+ }
49
+ //# sourceMappingURL=message-inbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-inbox.d.ts","sourceRoot":"","sources":["../../src/cloud/message-inbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;;GAMG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,aAAa,CAAuB;IAE5C;;;OAGG;IACH,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO;IAuCvC;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,MAAM;IAU1C;;OAEG;IACH,SAAS,IAAI,aAAa,EAAE;IAI5B;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI;IAKpC;;;OAGG;IACH,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAIjC;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAU9C;;OAEG;IACH,KAAK,IAAI,IAAI;CAOd"}