@agentdeck/bridge 1.0.24 → 1.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.
Files changed (184) hide show
  1. package/README.md +14 -6
  2. package/assets/fonts/NOTICE-PocketSansWorld.md +10 -0
  3. package/assets/fonts/OFL-PocketSansWorld.txt +93 -0
  4. package/assets/fonts/PocketSansWorld_12.cpfont +0 -0
  5. package/assets/fonts/pocket-sans-world.manifest.json +49 -0
  6. package/assets/learning/LICENSE-CC-BY-SA-4.0.txt +10 -0
  7. package/assets/learning/NOTICE.md +33 -0
  8. package/assets/learning/jp-n3-ko.manifest.json +27 -0
  9. package/assets/learning/jp-n3-ko.pdl +0 -0
  10. package/dist/adapters/openclaw.d.ts +74 -4
  11. package/dist/adapters/openclaw.d.ts.map +1 -1
  12. package/dist/adapters/openclaw.js +235 -43
  13. package/dist/adapters/openclaw.js.map +1 -1
  14. package/dist/agent-cli-diagnostics.d.ts +20 -0
  15. package/dist/agent-cli-diagnostics.d.ts.map +1 -0
  16. package/dist/agent-cli-diagnostics.js +100 -0
  17. package/dist/agent-cli-diagnostics.js.map +1 -0
  18. package/dist/apme/adapters/openclaw-hook.d.ts +38 -10
  19. package/dist/apme/adapters/openclaw-hook.d.ts.map +1 -1
  20. package/dist/apme/adapters/openclaw-hook.js +181 -37
  21. package/dist/apme/adapters/openclaw-hook.js.map +1 -1
  22. package/dist/apme/collector.d.ts +55 -2
  23. package/dist/apme/collector.d.ts.map +1 -1
  24. package/dist/apme/collector.js +324 -37
  25. package/dist/apme/collector.js.map +1 -1
  26. package/dist/apme/dashboard-html.d.ts.map +1 -1
  27. package/dist/apme/dashboard-html.js +275 -35
  28. package/dist/apme/dashboard-html.js.map +1 -1
  29. package/dist/apme/http.d.ts.map +1 -1
  30. package/dist/apme/http.js +33 -5
  31. package/dist/apme/http.js.map +1 -1
  32. package/dist/apme/index.d.ts.map +1 -1
  33. package/dist/apme/index.js +6 -2
  34. package/dist/apme/index.js.map +1 -1
  35. package/dist/apme/pareto.d.ts +2 -1
  36. package/dist/apme/pareto.d.ts.map +1 -1
  37. package/dist/apme/pareto.js +15 -4
  38. package/dist/apme/pareto.js.map +1 -1
  39. package/dist/apme/recommend.d.ts +24 -1
  40. package/dist/apme/recommend.d.ts.map +1 -1
  41. package/dist/apme/recommend.js +43 -7
  42. package/dist/apme/recommend.js.map +1 -1
  43. package/dist/apme/store.d.ts +47 -1
  44. package/dist/apme/store.d.ts.map +1 -1
  45. package/dist/apme/store.js +397 -99
  46. package/dist/apme/store.js.map +1 -1
  47. package/dist/bridge-core.d.ts +25 -1
  48. package/dist/bridge-core.d.ts.map +1 -1
  49. package/dist/bridge-core.js +50 -9
  50. package/dist/bridge-core.js.map +1 -1
  51. package/dist/card-feed.d.ts +46 -1
  52. package/dist/card-feed.d.ts.map +1 -1
  53. package/dist/card-feed.js +166 -6
  54. package/dist/card-feed.js.map +1 -1
  55. package/dist/cli.d.ts +56 -0
  56. package/dist/cli.d.ts.map +1 -1
  57. package/dist/cli.js +442 -34
  58. package/dist/cli.js.map +1 -1
  59. package/dist/codex-rate-limits-live.d.ts +180 -10
  60. package/dist/codex-rate-limits-live.d.ts.map +1 -1
  61. package/dist/codex-rate-limits-live.js +475 -22
  62. package/dist/codex-rate-limits-live.js.map +1 -1
  63. package/dist/daemon-build-identity.d.ts +124 -0
  64. package/dist/daemon-build-identity.d.ts.map +1 -0
  65. package/dist/daemon-build-identity.js +310 -0
  66. package/dist/daemon-build-identity.js.map +1 -0
  67. package/dist/daemon-server.d.ts +34 -6
  68. package/dist/daemon-server.d.ts.map +1 -1
  69. package/dist/daemon-server.js +876 -109
  70. package/dist/daemon-server.js.map +1 -1
  71. package/dist/daemon-takeover.d.ts +11 -0
  72. package/dist/daemon-takeover.d.ts.map +1 -1
  73. package/dist/daemon-takeover.js +62 -17
  74. package/dist/daemon-takeover.js.map +1 -1
  75. package/dist/daemon-ws-client.d.ts +1 -0
  76. package/dist/daemon-ws-client.d.ts.map +1 -1
  77. package/dist/daemon-ws-client.js +25 -16
  78. package/dist/daemon-ws-client.js.map +1 -1
  79. package/dist/daemon.js +1 -1
  80. package/dist/daemon.js.map +1 -1
  81. package/dist/esp32-serial.d.ts +18 -0
  82. package/dist/esp32-serial.d.ts.map +1 -1
  83. package/dist/esp32-serial.js +23 -1
  84. package/dist/esp32-serial.js.map +1 -1
  85. package/dist/font-pack.d.ts +15 -0
  86. package/dist/font-pack.d.ts.map +1 -0
  87. package/dist/font-pack.js +75 -0
  88. package/dist/font-pack.js.map +1 -0
  89. package/dist/glance-frame.d.ts.map +1 -1
  90. package/dist/glance-frame.js +5 -1
  91. package/dist/glance-frame.js.map +1 -1
  92. package/dist/hook-codex-sessions.d.ts +3 -1
  93. package/dist/hook-codex-sessions.d.ts.map +1 -1
  94. package/dist/hook-codex-sessions.js +27 -7
  95. package/dist/hook-codex-sessions.js.map +1 -1
  96. package/dist/http-auth-gate.d.ts.map +1 -1
  97. package/dist/http-auth-gate.js +9 -1
  98. package/dist/http-auth-gate.js.map +1 -1
  99. package/dist/index.js +2 -2
  100. package/dist/index.js.map +1 -1
  101. package/dist/learning-pack.d.ts +24 -0
  102. package/dist/learning-pack.d.ts.map +1 -0
  103. package/dist/learning-pack.js +125 -0
  104. package/dist/learning-pack.js.map +1 -0
  105. package/dist/legacy-rearm-ledger.d.ts +56 -0
  106. package/dist/legacy-rearm-ledger.d.ts.map +1 -0
  107. package/dist/legacy-rearm-ledger.js +66 -0
  108. package/dist/legacy-rearm-ledger.js.map +1 -0
  109. package/dist/mdns.d.ts +33 -0
  110. package/dist/mdns.d.ts.map +1 -1
  111. package/dist/mdns.js +92 -3
  112. package/dist/mdns.js.map +1 -1
  113. package/dist/openclaw-session.d.ts.map +1 -1
  114. package/dist/openclaw-session.js +13 -0
  115. package/dist/openclaw-session.js.map +1 -1
  116. package/dist/openclaw-timeline-feed.d.ts +84 -0
  117. package/dist/openclaw-timeline-feed.d.ts.map +1 -0
  118. package/dist/openclaw-timeline-feed.js +162 -0
  119. package/dist/openclaw-timeline-feed.js.map +1 -0
  120. package/dist/openclaw-transcript-timeline.d.ts +103 -0
  121. package/dist/openclaw-transcript-timeline.d.ts.map +1 -0
  122. package/dist/openclaw-transcript-timeline.js +328 -0
  123. package/dist/openclaw-transcript-timeline.js.map +1 -0
  124. package/dist/pairing-knocks.d.ts +80 -0
  125. package/dist/pairing-knocks.d.ts.map +1 -0
  126. package/dist/pairing-knocks.js +312 -0
  127. package/dist/pairing-knocks.js.map +1 -0
  128. package/dist/passive-observer.d.ts +21 -1
  129. package/dist/passive-observer.d.ts.map +1 -1
  130. package/dist/passive-observer.js +37 -3
  131. package/dist/passive-observer.js.map +1 -1
  132. package/dist/pixoo/micro-glyphs.d.ts +4 -0
  133. package/dist/pixoo/micro-glyphs.d.ts.map +1 -1
  134. package/dist/pixoo/micro-glyphs.js +29 -0
  135. package/dist/pixoo/micro-glyphs.js.map +1 -1
  136. package/dist/pixoo/pixoo-font.d.ts.map +1 -1
  137. package/dist/pixoo/pixoo-font.js +3 -1
  138. package/dist/pixoo/pixoo-font.js.map +1 -1
  139. package/dist/pixoo/pixoo-renderer.d.ts +1 -1
  140. package/dist/pixoo/pixoo-renderer.d.ts.map +1 -1
  141. package/dist/pixoo/pixoo-renderer.js +17 -2
  142. package/dist/pixoo/pixoo-renderer.js.map +1 -1
  143. package/dist/pty-manager.d.ts +9 -0
  144. package/dist/pty-manager.d.ts.map +1 -1
  145. package/dist/pty-manager.js +63 -4
  146. package/dist/pty-manager.js.map +1 -1
  147. package/dist/relayed-usage.d.ts +98 -0
  148. package/dist/relayed-usage.d.ts.map +1 -0
  149. package/dist/relayed-usage.js +103 -0
  150. package/dist/relayed-usage.js.map +1 -0
  151. package/dist/session-aggregator.d.ts +3 -0
  152. package/dist/session-aggregator.d.ts.map +1 -1
  153. package/dist/session-aggregator.js.map +1 -1
  154. package/dist/session-registry.d.ts +1 -0
  155. package/dist/session-registry.d.ts.map +1 -1
  156. package/dist/surface-protocol.d.ts +84 -0
  157. package/dist/surface-protocol.d.ts.map +1 -0
  158. package/dist/surface-protocol.js +237 -0
  159. package/dist/surface-protocol.js.map +1 -0
  160. package/dist/timeline-store.d.ts +1 -1
  161. package/dist/timeline-store.d.ts.map +1 -1
  162. package/dist/timeline-store.js +16 -1
  163. package/dist/timeline-store.js.map +1 -1
  164. package/dist/tui/dashboard.d.ts.map +1 -1
  165. package/dist/tui/dashboard.js +8 -1
  166. package/dist/tui/dashboard.js.map +1 -1
  167. package/dist/tui/renderer.d.ts.map +1 -1
  168. package/dist/tui/renderer.js +35 -0
  169. package/dist/tui/renderer.js.map +1 -1
  170. package/dist/weather-config.d.ts +17 -0
  171. package/dist/weather-config.d.ts.map +1 -0
  172. package/dist/weather-config.js +54 -0
  173. package/dist/weather-config.js.map +1 -0
  174. package/dist/weather.d.ts +44 -4
  175. package/dist/weather.d.ts.map +1 -1
  176. package/dist/weather.js +223 -15
  177. package/dist/weather.js.map +1 -1
  178. package/dist/ws-server.d.ts +18 -0
  179. package/dist/ws-server.d.ts.map +1 -1
  180. package/dist/ws-server.js +95 -7
  181. package/dist/ws-server.js.map +1 -1
  182. package/fm-helper/AgentDeckFMHelper.swift +51 -5
  183. package/package.json +4 -3
  184. package/src/timebox/sync_ble.py +35 -16
package/dist/ws-server.js CHANGED
@@ -2,7 +2,7 @@ import { WebSocketServer, WebSocket } from 'ws';
2
2
  import { isLocalConnection, validateToken } from './auth.js';
3
3
  import { mayAdoptEsp32, noteEsp32Adopted } from './pairing-window.js';
4
4
  import { debug, log } from './logger.js';
5
- import { WS_PING_INTERVAL_MS } from '@agentdeck/shared';
5
+ import { DEVICE_ID_HEADER, normalizeDeviceId, WS_PING_INTERVAL_MS } from '@agentdeck/shared';
6
6
  export class WsServer {
7
7
  wss;
8
8
  commandCallback = null;
@@ -37,6 +37,14 @@ export class WsServer {
37
37
  * has no business provisioning boards.
38
38
  */
39
39
  esp32AdoptionProvider = null;
40
+ /**
41
+ * The operator-approval half of the credential path, or null when this server
42
+ * must not consult it. Injected for the same reason as the provider above: a
43
+ * session bridge shares this class, and an approval roster is the daemon's to
44
+ * own — a bridge answering "is this peer approved?" would be a second, unowned
45
+ * copy of the decision.
46
+ */
47
+ pairingApproval = null;
40
48
  socketRemoteIp = new Map();
41
49
  eventTransformer = null;
42
50
  // Clients that registered as the Ulanzi Studio plugin. Their WebSocket
@@ -80,7 +88,20 @@ export class WsServer {
80
88
  if (!isLocalConnection(remoteIp)) {
81
89
  const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);
82
90
  const token = url.searchParams.get('token') || '';
83
- if (!validateToken(token)) {
91
+ // The id a client offers on the handshake, if it offers one. Read here
92
+ // rather than from a later frame because the decision happens now:
93
+ // `client_register` arrives only after a socket exists, which is after
94
+ // this branch has already accepted or refused.
95
+ const rawDeviceId = req.headers[DEVICE_ID_HEADER];
96
+ const deviceId = normalizeDeviceId(Array.isArray(rawDeviceId) ? rawDeviceId[0] : rawDeviceId);
97
+ // An operator-approved peer authenticates without a token. This is the
98
+ // credential path for a device that can neither scan a QR nor be
99
+ // reached over USB — the approval was granted on the host, against the
100
+ // peer's key, by someone who could see the knock.
101
+ if (!validateToken(token) && this.pairingApproval?.isApproved(remoteIp, deviceId)) {
102
+ debug('WS', `Operator-approved peer at ${remoteIp} admitted without a token`);
103
+ }
104
+ else if (!validateToken(token)) {
84
105
  // Whatever the peer called itself, bounded and sanitized: it is a
85
106
  // string from an unauthenticated peer heading for a terminal.
86
107
  const claimed = url.searchParams.get('clientType')
@@ -97,19 +118,63 @@ export class WsServer {
97
118
  // The socket is still unauthenticated and stays that way: it is never
98
119
  // registered as a client, never added to any roster, and receives this
99
120
  // one frame and nothing else. The board reconnects holding the token.
121
+ // The firmware puts its model in the query of the very connection
122
+ // being refused (`/?clientType=esp32&board=<name>`), so a refusal can
123
+ // say WHICH board it is instead of only its address. Without it an
124
+ // operator has to cross-reference ARP against a DHCP pool to find the
125
+ // one unit that needs a cable — the same cross-referencing by hand
126
+ // that `peerKind` was added to end, left half-done because the second
127
+ // field in the same query string went unread.
128
+ const board = url.searchParams.get('board')?.replace(/[^a-zA-Z0-9._-]/g, '').slice(0, 24);
100
129
  if (peerKind === 'esp32' && this.esp32AdoptionProvider && mayAdoptEsp32(remoteIp)) {
101
130
  const payload = this.esp32AdoptionProvider();
102
131
  if (payload) {
103
- const board = url.searchParams.get('board')?.replace(/[^a-zA-Z0-9._-]/g, '').slice(0, 24);
104
132
  try {
105
133
  ws.send(JSON.stringify({ type: 'auth_provision', ...payload }));
106
134
  }
107
135
  catch { /* peer vanished mid-handshake */ }
136
+ // Listen while the socket is briefly up. Firmware announces
137
+ // `device_info` the instant a WebSocket connects — precisely so a
138
+ // WiFi-only board is not anonymous — and the board that most needs
139
+ // adopting is the one too old to put `board=` in its query string,
140
+ // so hanging up without reading is throwing away the only
141
+ // self-identification such a board can make. It stays a LOG: the
142
+ // peer is unauthenticated, so nothing here registers a client,
143
+ // enters a roster, or is trusted beyond being printed.
144
+ let identified = false;
145
+ const onIdentify = (raw) => {
146
+ if (identified)
147
+ return;
148
+ const text = typeof raw === 'string' ? raw : String(raw);
149
+ // An unauthenticated peer's frame heading for a log line.
150
+ if (text.length > 4096)
151
+ return;
152
+ let msg;
153
+ try {
154
+ msg = JSON.parse(text);
155
+ }
156
+ catch {
157
+ return;
158
+ }
159
+ if (!msg || msg.type !== 'device_info')
160
+ return;
161
+ identified = true;
162
+ const clean = (v, max) => typeof v === 'string' ? v.replace(/[^a-zA-Z0-9._-]/g, '').slice(0, max) || undefined : undefined;
163
+ const named = clean(msg.board, 24);
164
+ const version = clean(msg.version, 16);
165
+ if (named) {
166
+ log(`[agentdeck] Adopted board at ${remoteIp} identifies as ${named}`
167
+ + (version ? ` v${version}` : ''));
168
+ }
169
+ };
170
+ ws.on('message', onIdentify);
108
171
  noteEsp32Adopted(remoteIp, board || undefined);
109
172
  // Normal close, not 4001: the board should redial immediately with
110
173
  // its new credential, not treat this endpoint as one that refused
111
- // it. Delayed so the frame flushes first.
174
+ // it. Delayed so the frame flushes first — and so the announcement
175
+ // above has a moment to arrive.
112
176
  const bye = setTimeout(() => {
177
+ ws.off('message', onIdentify);
113
178
  try {
114
179
  ws.close(1000, 'Re-armed — reconnect with the new token');
115
180
  }
@@ -119,7 +184,15 @@ export class WsServer {
119
184
  return;
120
185
  }
121
186
  }
122
- this.logUnauthorized(remoteIp, token.length > 0, peerKind);
187
+ // Turn the refusal into something an operator can act on. A peer that
188
+ // presented a token we do not accept is recorded as such: that reads
189
+ // very differently to a new device — usually a provisioned one whose
190
+ // credential went stale.
191
+ // Deliberately OUTSIDE `logUnauthorized`'s per-IP 60 s throttle: that
192
+ // throttle exists so a looping device does not flood a terminal, but
193
+ // this counts the attempts the operator is shown.
194
+ this.pairingApproval?.record(remoteIp, deviceId, token.length > 0);
195
+ this.logUnauthorized(remoteIp, token.length > 0, peerKind, board);
123
196
  ws.close(4001, 'Unauthorized');
124
197
  return;
125
198
  }
@@ -316,6 +389,15 @@ export class WsServer {
316
389
  setEsp32AdoptionProvider(provider) {
317
390
  this.esp32AdoptionProvider = provider;
318
391
  }
392
+ /**
393
+ * Enable operator-approval authentication on this server (daemon only).
394
+ *
395
+ * With no hooks the server behaves exactly as before: a peer authenticates by
396
+ * token or not at all, and a refusal is only logged.
397
+ */
398
+ setPairingApprovalHooks(hooks) {
399
+ this.pairingApproval = hooks;
400
+ }
319
401
  onClientConnect(callback) {
320
402
  this.onConnectCallback = callback;
321
403
  }
@@ -363,7 +445,7 @@ export class WsServer {
363
445
  * companion app") was in the rejected request's own query string the whole
364
446
  * time. The firmware tags itself `?clientType=esp32`; log what it said.
365
447
  */
366
- logUnauthorized(ip, presentedToken, peerKind) {
448
+ logUnauthorized(ip, presentedToken, peerKind, board) {
367
449
  const now = Date.now();
368
450
  const prev = this.unauthorizedByIp.get(ip);
369
451
  if (prev && now - prev.loggedAt < WsServer.UNAUTHORIZED_LOG_INTERVAL_MS) {
@@ -376,7 +458,13 @@ export class WsServer {
376
458
  this.unauthorizedByIp.clear();
377
459
  const repeated = prev?.suppressed ? ` — plus ${prev.suppressed} more since the last line` : '';
378
460
  this.unauthorizedByIp.set(ip, { loggedAt: now, suppressed: 0 });
379
- const who = peerKind ? `${ip} (${peerKind})` : ip;
461
+ // `board` is absent on firmware old enough to predate the query parameter,
462
+ // and that absence is itself dating information — say so rather than
463
+ // printing an empty pair of parentheses.
464
+ const what = peerKind && board ? `${peerKind}, ${board}`
465
+ : peerKind ? `${peerKind}, board not reported — firmware predates the board query param`
466
+ : undefined;
467
+ const who = what ? `${ip} (${what})` : ip;
380
468
  // The advice differs by peer: an ESP32 has a USB serial channel that works
381
469
  // precisely when authentication is what is broken, and a companion app or
382
470
  // reader does not — for those, an operator-opened pairing code is the path
@@ -1 +1 @@
1
- {"version":3,"file":"ws-server.js","sourceRoot":"","sources":["../src/ws-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAGhD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,OAAO,QAAQ;IACX,GAAG,CAAkB;IACrB,eAAe,GAA0C,IAAI,CAAC;IAC9D,kBAAkB,GAA0E,IAAI,CAAC;IACjG,cAAc,GAAuD,IAAI,CAAC;IAC1E,cAAc,GAAqC,IAAI,CAAC;IACxD,iBAAiB,GAAqC,IAAI,CAAC;IAC3D,oBAAoB,GAAqC,IAAI,CAAC;IAC9D,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC5C,YAAY,GAAG,IAAI,GAAG,EAAa,CAAC;IAC5C,qEAAqE;IACrE,4EAA4E;IAC5E,0EAA0E;IAC1E,6EAA6E;IAC7E,iDAAiD;IACzC,gBAAgB,GAAG,IAAI,GAAG,EAAoD,CAAC;IAC/E,MAAM,CAAU,4BAA4B,GAAG,MAAM,CAAC;IAC9D,6EAA6E;IACrE,kBAAkB,GAAG,IAAI,GAAG,EAAoB,CAAC;IACjD,eAAe,GAAG,IAAI,GAAG,EAAa,CAAC;IAC/C,yEAAyE;IACzE,4EAA4E;IAC5E,0EAA0E;IAC1E,6EAA6E;IAC7E,yEAAyE;IACzE,+DAA+D;IACvD,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C;;;;;OAKG;IACK,qBAAqB,GAElB,IAAI,CAAC;IACR,cAAc,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC9C,gBAAgB,GAA2E,IAAI,CAAC;IACxG,uEAAuE;IACvE,sDAAsD;IAC9C,aAAa,GAAG,IAAI,GAAG,EAAa,CAAC;IAC7C,6DAA6D;IAC7D,wEAAwE;IACxE,0EAA0E;IAC1E,oDAAoD;IAC5C,UAAU,GAAG,IAAI,GAAG,EAA2C,CAAC;IAChE,SAAS,CAAiC;IAElD,YAAY,MAAc;QACxB,IAAI,CAAC,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAE3C,yEAAyE;QACzE,yEAAyE;QACzE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC3B,KAAK,CAAC,IAAI,EAAE,0BAA0B,GAAG,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,qDAAqD;QACrD,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,MAAM,IAAI,GAAgB,EAAE,CAAC;YAC7B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;oBACvC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACd,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBAChC,EAAE,CAAC,IAAI,EAAE,CAAC;YACZ,CAAC;YACD,qEAAqE;YACrE,qEAAqE;YACrE,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,EAAE,iCAAiC,CAAC,CAAC;gBAC/C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC5B,EAAE,CAAC,SAAS,EAAE,CAAC;YACjB,CAAC;QACH,CAAC,EAAE,mBAAmB,CAAC,CAAC;QAExB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,GAAoB,EAAE,EAAE;YACrD,oCAAoC;YACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;YAChD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;gBACjF,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1B,kEAAkE;oBAClE,8DAA8D;oBAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;2BAC7C,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBAC9D,MAAM,QAAQ,GAAG,OAAO,EAAE,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;2BACjE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;oBAE9D,gEAAgE;oBAChE,qEAAqE;oBACrE,sEAAsE;oBACtE,sEAAsE;oBACtE,uEAAuE;oBACvE,8DAA8D;oBAC9D,EAAE;oBACF,sEAAsE;oBACtE,uEAAuE;oBACvE,sEAAsE;oBACtE,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,qBAAqB,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAClF,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;wBAC7C,IAAI,OAAO,EAAE,CAAC;4BACZ,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BAC1F,IAAI,CAAC;gCACH,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;4BAClE,CAAC;4BAAC,MAAM,CAAC,CAAC,iCAAiC,CAAC,CAAC;4BAC7C,gBAAgB,CAAC,QAAQ,EAAE,KAAK,IAAI,SAAS,CAAC,CAAC;4BAC/C,mEAAmE;4BACnE,kEAAkE;4BAClE,0CAA0C;4BAC1C,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE;gCAC1B,IAAI,CAAC;oCAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,yCAAyC,CAAC,CAAC;gCAAC,CAAC;gCAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;4BACzF,CAAC,EAAE,GAAG,CAAC,CAAC;4BACR,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;4BACd,OAAO;wBACT,CAAC;oBACH,CAAC;oBAED,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;oBAC3D,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;oBAC/B,OAAO;gBACT,CAAC;gBACD,KAAK,CAAC,IAAI,EAAE,oCAAoC,QAAQ,EAAE,CAAC,CAAC;YAC9D,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;YACjF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACtC,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,OAAO,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC5F,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC1B,KAAK,CAAC,IAAI,EAAE,qCAAqC,CAAC,CAAC;YACrD,CAAC;iBAAM,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC1B,KAAK,CAAC,IAAI,EAAE,gDAAgD,QAAQ,EAAE,CAAC,CAAC;YAC1E,CAAC;YAED,wEAAwE;YACxE,wEAAwE;YACxE,sEAAsE;YACtE,sEAAsE;YACtE,wEAAwE;YACxE,qDAAqD;YACrD,CAAC;gBACC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;gBAC7F,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC9C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC7B,KAAK,CAAC,IAAI,EAAE,mBAAmB,QAAQ,KAAK,MAAM,CAAC,MAAM,uCAAuC,CAAC,CAAC;gBACpG,CAAC;YACH,CAAC;YAED,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAE/B,+CAA+C;YAC/C,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC;YAED,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACjB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC/B,sEAAsE;gBACtE,uEAAuE;gBACvE,gEAAgE;gBAChE,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;gBAClC,mEAAmE;gBACnE,sEAAsE;gBACtE,sBAAsB;gBACtB,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAmB,CAAC,CAAC;oBAC5E,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC/B,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAA4B,CAAC;oBACnE,KAAK,CAAC,IAAI,EAAE,aAAa,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;oBACrC,2DAA2D;oBAC3D,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,IAAI,GAAG,CAAC,UAAU,KAAK,eAAe,EAAE,CAAC;wBACzE,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,CAAC;wBACxC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBAC3B,IAAI,CAAC,GAAG,EAAE,CAAC;4BACT,KAAK,CAAC,IAAI,EAAE,4CAA4C,CAAC,CAAC;wBAC5D,CAAC;oBACH,CAAC;oBACD,iEAAiE;oBACjE,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;wBAC/D,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAEvD,CAAC;wBACT,MAAM,IAAI,GAAG,OAAO,GAAG,EAAE,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;wBAC/E,MAAM,EAAE,GAAG,OAAO,GAAG,EAAE,EAAE,KAAK,QAAQ,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;wBACjE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;wBACtC,KAAK,CAAC,IAAI,EAAE,6BAA6B,EAAE,EAAE,CAAC,CAAC;oBACjD,CAAC;oBACD,4EAA4E;oBAC5E,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;wBAChE,OAAO,CAAC,UAAU;oBACpB,CAAC;oBACD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;wBACzB,IAAI,CAAC,eAAe,CAAC,GAA+B,CAAC,CAAC;oBACxD,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,KAAK,CAAC,IAAI,EAAE,4BAA4B,GAAG,EAAE,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAClB,KAAK,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;gBACnC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC5B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC7B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAChC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC/B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC3B,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBACnE,KAAK,CAAC,IAAI,EAAE,yCAAyC,CAAC,CAAC;gBACzD,CAAC;gBACD,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC9B,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACrB,KAAK,CAAC,IAAI,EAAE,oBAAoB,GAAG,EAAE,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,cAAc,GAAwC,EAAE,CAAC;IAEjE,sFAAsF;IACtF,WAAW,CAAC,IAAkC;QAC5C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,mBAAmB,CAAC,WAAmF;QACrG,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC;IACtC,CAAC;IAED,aAAa,CAAC,EAAa;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED;;;sCAGkC;IAClC,gBAAgB,CAAC,EAAa;QAC5B,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,eAAe,CAAC,EAAa;QAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,EAAE;YAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;IAEO,UAAU,CAAC,KAAkB,EAAE,MAAiB,EAAE,aAAsB;QAC9E,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1E,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QAC9B,OAAO,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxG,CAAC;IAED,SAAS,CAAC,KAAkB;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;QAC1C,KAAK,CAAC,IAAI,EAAE,aAAa,KAAK,CAAC,IAAI,QAAQ,WAAW,UAAU,CAAC,CAAC;QAClE,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACtC,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBACzC,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC9D,IAAI,CAAC,aAAa;oBAAE,SAAS;gBAC7B,IAAI,CAAC;oBAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QACD,iDAAiD;QACjD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACvC,IAAI,CAAC;gBAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,SAAS,CAAC,QAAsC;QAC9C,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;IAClC,CAAC;IAED,4DAA4D;IAC5D,MAAM,CAAC,QAAiC;QACtC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;IACjC,CAAC;IAED,QAAQ,CAAC,QAAmD;QAC1D,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;IACjC,CAAC;IAED,kGAAkG;IAClG,YAAY,CAAC,QAAsE;QACjF,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;IACrC,CAAC;IAED,iDAAiD;IACjD,eAAe,CAAC,KAAkB,EAAE,MAAiB;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACtC,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC9D,IAAI,CAAC,aAAa;oBAAE,SAAS;gBAC7B,IAAI,CAAC;oBAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,wBAAwB,CACtB,QAA2F;QAE3F,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC;IACxC,CAAC;IAED,eAAe,CAAC,QAAiC;QAC/C,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;IACpC,CAAC;IAED,kBAAkB,CAAC,QAAiC;QAClD,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,EAAa,EAAE,KAAkB;QACtC,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,IAAI,CAAC;gBAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;IAC/B,CAAC;IAED,oBAAoB;QAClB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;IACjC,CAAC;IAED;;oDAEgD;IAChD,aAAa;QACX,MAAM,IAAI,GAAG,IAAI,GAAG,EAAwC,CAAC;QAC7D,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACK,eAAe,CAAC,EAAU,EAAE,cAAuB,EAAE,QAAiB;QAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,4BAA4B,EAAE,CAAC;YACxE,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,wEAAwE;QACxE,mDAAmD;QACnD,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,EAAE;YAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QACnE,MAAM,QAAQ,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,UAAU,2BAA2B,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/F,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,2EAA2E;QAC3E,0EAA0E;QAC1E,2EAA2E;QAC3E,qCAAqC;QACrC,MAAM,QAAQ,GAAG,QAAQ,KAAK,OAAO;YACnC,CAAC,CAAC,2EAA2E;YAC7E,CAAC,CAAC,yDAAyD,CAAC;QAC9D,GAAG,CAAC,cAAc;YAChB,CAAC,CAAC,wBAAwB,GAAG,+BAA+B,QAAQ,IAAI;kBACpE,6EAA6E;YACjF,CAAC,CAAC,wBAAwB,GAAG,qBAAqB,QAAQ,KAAK,QAAQ,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK;QACH,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,4DAA4D;QAC5D,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC"}
1
+ {"version":3,"file":"ws-server.js","sourceRoot":"","sources":["../src/ws-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAGhD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7F,MAAM,OAAO,QAAQ;IACX,GAAG,CAAkB;IACrB,eAAe,GAA0C,IAAI,CAAC;IAC9D,kBAAkB,GAA0E,IAAI,CAAC;IACjG,cAAc,GAAuD,IAAI,CAAC;IAC1E,cAAc,GAAqC,IAAI,CAAC;IACxD,iBAAiB,GAAqC,IAAI,CAAC;IAC3D,oBAAoB,GAAqC,IAAI,CAAC;IAC9D,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC5C,YAAY,GAAG,IAAI,GAAG,EAAa,CAAC;IAC5C,qEAAqE;IACrE,4EAA4E;IAC5E,0EAA0E;IAC1E,6EAA6E;IAC7E,iDAAiD;IACzC,gBAAgB,GAAG,IAAI,GAAG,EAAoD,CAAC;IAC/E,MAAM,CAAU,4BAA4B,GAAG,MAAM,CAAC;IAC9D,6EAA6E;IACrE,kBAAkB,GAAG,IAAI,GAAG,EAAoB,CAAC;IACjD,eAAe,GAAG,IAAI,GAAG,EAAa,CAAC;IAC/C,yEAAyE;IACzE,4EAA4E;IAC5E,0EAA0E;IAC1E,6EAA6E;IAC7E,yEAAyE;IACzE,+DAA+D;IACvD,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C;;;;;OAKG;IACK,qBAAqB,GAElB,IAAI,CAAC;IAChB;;;;;;OAMG;IACK,eAAe,GAKZ,IAAI,CAAC;IACR,cAAc,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC9C,gBAAgB,GAA2E,IAAI,CAAC;IACxG,uEAAuE;IACvE,sDAAsD;IAC9C,aAAa,GAAG,IAAI,GAAG,EAAa,CAAC;IAC7C,6DAA6D;IAC7D,wEAAwE;IACxE,0EAA0E;IAC1E,oDAAoD;IAC5C,UAAU,GAAG,IAAI,GAAG,EAA2C,CAAC;IAChE,SAAS,CAAiC;IAElD,YAAY,MAAc;QACxB,IAAI,CAAC,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAE3C,yEAAyE;QACzE,yEAAyE;QACzE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC3B,KAAK,CAAC,IAAI,EAAE,0BAA0B,GAAG,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,qDAAqD;QACrD,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,MAAM,IAAI,GAAgB,EAAE,CAAC;YAC7B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;oBACvC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACd,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBAChC,EAAE,CAAC,IAAI,EAAE,CAAC;YACZ,CAAC;YACD,qEAAqE;YACrE,qEAAqE;YACrE,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,EAAE,iCAAiC,CAAC,CAAC;gBAC/C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC5B,EAAE,CAAC,SAAS,EAAE,CAAC;YACjB,CAAC;QACH,CAAC,EAAE,mBAAmB,CAAC,CAAC;QAExB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,GAAoB,EAAE,EAAE;YACrD,oCAAoC;YACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;YAChD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;gBACjF,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClD,uEAAuE;gBACvE,mEAAmE;gBACnE,uEAAuE;gBACvE,+CAA+C;gBAC/C,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;gBAClD,MAAM,QAAQ,GAAG,iBAAiB,CAChC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAC1D,CAAC;gBACF,uEAAuE;gBACvE,iEAAiE;gBACjE,uEAAuE;gBACvE,kDAAkD;gBAClD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;oBAClF,KAAK,CAAC,IAAI,EAAE,6BAA6B,QAAQ,2BAA2B,CAAC,CAAC;gBAChF,CAAC;qBAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjC,kEAAkE;oBAClE,8DAA8D;oBAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;2BAC7C,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBAC9D,MAAM,QAAQ,GAAG,OAAO,EAAE,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;2BACjE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;oBAE9D,gEAAgE;oBAChE,qEAAqE;oBACrE,sEAAsE;oBACtE,sEAAsE;oBACtE,uEAAuE;oBACvE,8DAA8D;oBAC9D,EAAE;oBACF,sEAAsE;oBACtE,uEAAuE;oBACvE,sEAAsE;oBACtE,kEAAkE;oBAClE,sEAAsE;oBACtE,mEAAmE;oBACnE,sEAAsE;oBACtE,mEAAmE;oBACnE,sEAAsE;oBACtE,8CAA8C;oBAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAE1F,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,qBAAqB,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAClF,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;wBAC7C,IAAI,OAAO,EAAE,CAAC;4BACZ,IAAI,CAAC;gCACH,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;4BAClE,CAAC;4BAAC,MAAM,CAAC,CAAC,iCAAiC,CAAC,CAAC;4BAC7C,4DAA4D;4BAC5D,kEAAkE;4BAClE,mEAAmE;4BACnE,mEAAmE;4BACnE,0DAA0D;4BAC1D,iEAAiE;4BACjE,+DAA+D;4BAC/D,uDAAuD;4BACvD,IAAI,UAAU,GAAG,KAAK,CAAC;4BACvB,MAAM,UAAU,GAAG,CAAC,GAAY,EAAQ,EAAE;gCACxC,IAAI,UAAU;oCAAE,OAAO;gCACvB,MAAM,IAAI,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gCACzD,0DAA0D;gCAC1D,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI;oCAAE,OAAO;gCAC/B,IAAI,GAA2D,CAAC;gCAChE,IAAI,CAAC;oCAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gCAAC,CAAC;gCAAC,MAAM,CAAC;oCAAC,OAAO;gCAAC,CAAC;gCACjD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa;oCAAE,OAAO;gCAC/C,UAAU,GAAG,IAAI,CAAC;gCAClB,MAAM,KAAK,GAAG,CAAC,CAAU,EAAE,GAAW,EAAsB,EAAE,CAC5D,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gCACnG,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gCACnC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gCACvC,IAAI,KAAK,EAAE,CAAC;oCACV,GAAG,CAAC,gCAAgC,QAAQ,kBAAkB,KAAK,EAAE;0CACjE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gCACvC,CAAC;4BACH,CAAC,CAAC;4BACF,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;4BAE7B,gBAAgB,CAAC,QAAQ,EAAE,KAAK,IAAI,SAAS,CAAC,CAAC;4BAC/C,mEAAmE;4BACnE,kEAAkE;4BAClE,mEAAmE;4BACnE,gCAAgC;4BAChC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE;gCAC1B,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;gCAC9B,IAAI,CAAC;oCAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,yCAAyC,CAAC,CAAC;gCAAC,CAAC;gCAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;4BACzF,CAAC,EAAE,GAAG,CAAC,CAAC;4BACR,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;4BACd,OAAO;wBACT,CAAC;oBACH,CAAC;oBAED,sEAAsE;oBACtE,qEAAqE;oBACrE,qEAAqE;oBACrE,yBAAyB;oBACzB,sEAAsE;oBACtE,qEAAqE;oBACrE,kDAAkD;oBAClD,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACnE,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;oBAClE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;oBAC/B,OAAO;gBACT,CAAC;gBACD,KAAK,CAAC,IAAI,EAAE,oCAAoC,QAAQ,EAAE,CAAC,CAAC;YAC9D,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;YACjF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACtC,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,OAAO,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC5F,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC1B,KAAK,CAAC,IAAI,EAAE,qCAAqC,CAAC,CAAC;YACrD,CAAC;iBAAM,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC1B,KAAK,CAAC,IAAI,EAAE,gDAAgD,QAAQ,EAAE,CAAC,CAAC;YAC1E,CAAC;YAED,wEAAwE;YACxE,wEAAwE;YACxE,sEAAsE;YACtE,sEAAsE;YACtE,wEAAwE;YACxE,qDAAqD;YACrD,CAAC;gBACC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;gBAC7F,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC9C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC7B,KAAK,CAAC,IAAI,EAAE,mBAAmB,QAAQ,KAAK,MAAM,CAAC,MAAM,uCAAuC,CAAC,CAAC;gBACpG,CAAC;YACH,CAAC;YAED,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAE/B,+CAA+C;YAC/C,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC;YAED,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACjB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC/B,sEAAsE;gBACtE,uEAAuE;gBACvE,gEAAgE;gBAChE,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;gBAClC,mEAAmE;gBACnE,sEAAsE;gBACtE,sBAAsB;gBACtB,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAmB,CAAC,CAAC;oBAC5E,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC/B,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAA4B,CAAC;oBACnE,KAAK,CAAC,IAAI,EAAE,aAAa,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;oBACrC,2DAA2D;oBAC3D,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,IAAI,GAAG,CAAC,UAAU,KAAK,eAAe,EAAE,CAAC;wBACzE,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,CAAC;wBACxC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBAC3B,IAAI,CAAC,GAAG,EAAE,CAAC;4BACT,KAAK,CAAC,IAAI,EAAE,4CAA4C,CAAC,CAAC;wBAC5D,CAAC;oBACH,CAAC;oBACD,iEAAiE;oBACjE,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;wBAC/D,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAEvD,CAAC;wBACT,MAAM,IAAI,GAAG,OAAO,GAAG,EAAE,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;wBAC/E,MAAM,EAAE,GAAG,OAAO,GAAG,EAAE,EAAE,KAAK,QAAQ,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;wBACjE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;wBACtC,KAAK,CAAC,IAAI,EAAE,6BAA6B,EAAE,EAAE,CAAC,CAAC;oBACjD,CAAC;oBACD,4EAA4E;oBAC5E,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;wBAChE,OAAO,CAAC,UAAU;oBACpB,CAAC;oBACD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;wBACzB,IAAI,CAAC,eAAe,CAAC,GAA+B,CAAC,CAAC;oBACxD,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,KAAK,CAAC,IAAI,EAAE,4BAA4B,GAAG,EAAE,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAClB,KAAK,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;gBACnC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC5B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC7B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAChC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC/B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC3B,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBACnE,KAAK,CAAC,IAAI,EAAE,yCAAyC,CAAC,CAAC;gBACzD,CAAC;gBACD,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC9B,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACrB,KAAK,CAAC,IAAI,EAAE,oBAAoB,GAAG,EAAE,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,cAAc,GAAwC,EAAE,CAAC;IAEjE,sFAAsF;IACtF,WAAW,CAAC,IAAkC;QAC5C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,mBAAmB,CAAC,WAAmF;QACrG,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC;IACtC,CAAC;IAED,aAAa,CAAC,EAAa;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED;;;sCAGkC;IAClC,gBAAgB,CAAC,EAAa;QAC5B,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,eAAe,CAAC,EAAa;QAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,EAAE;YAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;IAEO,UAAU,CAAC,KAAkB,EAAE,MAAiB,EAAE,aAAsB;QAC9E,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1E,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QAC9B,OAAO,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxG,CAAC;IAED,SAAS,CAAC,KAAkB;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;QAC1C,KAAK,CAAC,IAAI,EAAE,aAAa,KAAK,CAAC,IAAI,QAAQ,WAAW,UAAU,CAAC,CAAC;QAClE,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACtC,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBACzC,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC9D,IAAI,CAAC,aAAa;oBAAE,SAAS;gBAC7B,IAAI,CAAC;oBAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QACD,iDAAiD;QACjD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACvC,IAAI,CAAC;gBAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,SAAS,CAAC,QAAsC;QAC9C,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;IAClC,CAAC;IAED,4DAA4D;IAC5D,MAAM,CAAC,QAAiC;QACtC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;IACjC,CAAC;IAED,QAAQ,CAAC,QAAmD;QAC1D,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;IACjC,CAAC;IAED,kGAAkG;IAClG,YAAY,CAAC,QAAsE;QACjF,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;IACrC,CAAC;IAED,iDAAiD;IACjD,eAAe,CAAC,KAAkB,EAAE,MAAiB;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACtC,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC9D,IAAI,CAAC,aAAa;oBAAE,SAAS;gBAC7B,IAAI,CAAC;oBAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,wBAAwB,CACtB,QAA2F;QAE3F,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC;IACxC,CAAC;IAED;;;;;OAKG;IACH,uBAAuB,CACrB,KAGQ;QAER,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,eAAe,CAAC,QAAiC;QAC/C,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;IACpC,CAAC;IAED,kBAAkB,CAAC,QAAiC;QAClD,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,EAAa,EAAE,KAAkB;QACtC,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,IAAI,CAAC;gBAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;IAC/B,CAAC;IAED,oBAAoB;QAClB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;IACjC,CAAC;IAED;;oDAEgD;IAChD,aAAa;QACX,MAAM,IAAI,GAAG,IAAI,GAAG,EAAwC,CAAC;QAC7D,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACK,eAAe,CAAC,EAAU,EAAE,cAAuB,EAAE,QAAiB,EAAE,KAAc;QAC5F,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,4BAA4B,EAAE,CAAC;YACxE,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,wEAAwE;QACxE,mDAAmD;QACnD,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,EAAE;YAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QACnE,MAAM,QAAQ,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,UAAU,2BAA2B,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/F,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QAChE,2EAA2E;QAC3E,qEAAqE;QACrE,yCAAyC;QACzC,MAAM,IAAI,GAAG,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,KAAK,EAAE;YACtD,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,gEAAgE;gBACxF,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,2EAA2E;QAC3E,0EAA0E;QAC1E,2EAA2E;QAC3E,qCAAqC;QACrC,MAAM,QAAQ,GAAG,QAAQ,KAAK,OAAO;YACnC,CAAC,CAAC,2EAA2E;YAC7E,CAAC,CAAC,yDAAyD,CAAC;QAC9D,GAAG,CAAC,cAAc;YAChB,CAAC,CAAC,wBAAwB,GAAG,+BAA+B,QAAQ,IAAI;kBACpE,6EAA6E;YACjF,CAAC,CAAC,wBAAwB,GAAG,qBAAqB,QAAQ,KAAK,QAAQ,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK;QACH,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,4DAA4D;QAC5D,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC"}
@@ -10,7 +10,11 @@ struct HelperRequest: Decodable {
10
10
  let type: String?
11
11
  let prompt: String?
12
12
  let instructions: String?
13
+ /// `none` creates a real instruction-less Foundation Models session.
14
+ /// Omitted preserves AgentDeck's strict-JSON evaluator default.
15
+ let instructionsMode: String?
13
16
  let temperature: Double?
17
+ let maximumResponseTokens: Int?
14
18
  /// `transcribe`: absolute path to a WAV file the daemon already wrote.
15
19
  let wav: String?
16
20
  /// BCP-47 locale hint, e.g. "ko-KR". Falls back to the current locale then en-US.
@@ -113,14 +117,25 @@ struct AgentDeckFMHelper {
113
117
  }
114
118
 
115
119
  do {
116
- let session = LanguageModelSession(
117
- instructions: request.instructions ?? "You are an exacting code evaluator. Reply with strict JSON only."
120
+ let instructions: String? = request.instructionsMode == "none"
121
+ ? nil
122
+ : request.instructions ?? "You are an exacting code evaluator. Reply with strict JSON only."
123
+ let session = LanguageModelSession(instructions: instructions)
124
+ let maximumResponseTokens = request.maximumResponseTokens.map {
125
+ max(1, min($0, 4_096))
126
+ }
127
+ let options = GenerationOptions(
128
+ temperature: request.temperature ?? 0,
129
+ maximumResponseTokens: maximumResponseTokens
118
130
  )
119
- let options = GenerationOptions(temperature: request.temperature ?? 0)
120
131
  let response = try await session.respond(to: prompt, options: options)
121
132
  write(["id": request.id, "text": response.content])
122
133
  } catch {
123
- write(["id": request.id, "error": "session_error", "reason": String(describing: error)])
134
+ write([
135
+ "id": request.id,
136
+ "error": generationErrorCode(error),
137
+ "reason": String(describing: error),
138
+ ])
124
139
  }
125
140
  } else {
126
141
  write(["id": request.id, "error": "unavailable", "reason": "macOS 26 or later required"])
@@ -130,6 +145,37 @@ struct AgentDeckFMHelper {
130
145
  #endif
131
146
  }
132
147
 
148
+ #if canImport(FoundationModels)
149
+ @available(macOS 26.0, *)
150
+ private static func generationErrorCode(_ error: Error) -> String {
151
+ guard let generationError = error as? LanguageModelSession.GenerationError else {
152
+ return "session_error"
153
+ }
154
+ switch generationError {
155
+ case .exceededContextWindowSize:
156
+ return "exceededContextWindowSize"
157
+ case .assetsUnavailable:
158
+ return "assetsUnavailable"
159
+ case .guardrailViolation:
160
+ return "guardrailViolation"
161
+ case .unsupportedGuide:
162
+ return "unsupportedGuide"
163
+ case .unsupportedLanguageOrLocale:
164
+ return "unsupportedLanguageOrLocale"
165
+ case .decodingFailure:
166
+ return "decodingFailure"
167
+ case .rateLimited:
168
+ return "rateLimited"
169
+ case .concurrentRequests:
170
+ return "concurrentRequests"
171
+ case .refusal:
172
+ return "refusal"
173
+ @unknown default:
174
+ return "session_error"
175
+ }
176
+ }
177
+ #endif
178
+
133
179
  // MARK: - Speech to text
134
180
 
135
181
  /// On-device transcription of a WAV the daemon already captured (from the
@@ -440,7 +486,7 @@ struct AgentDeckFMHelper {
440
486
  #if canImport(FoundationModels)
441
487
  if #available(macOS 26.0, *) {
442
488
  if case .available = SystemLanguageModel.default.availability {
443
- return ["id": id, "status": "ready"]
489
+ return ["id": id, "status": "ready", "generationProtocol": 2]
444
490
  }
445
491
  return ["id": id, "status": "unavailable", "reason": unavailableReason()]
446
492
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentdeck/bridge",
3
- "version": "1.0.24",
3
+ "version": "1.2.0",
4
4
  "engines": {
5
5
  "node": ">=22"
6
6
  },
@@ -29,6 +29,7 @@
29
29
  "dist",
30
30
  "!dist/__tests__",
31
31
  "assets/fonts",
32
+ "assets/learning",
32
33
  "fm-helper",
33
34
  "scripts/build-fm-helper.mjs",
34
35
  "python",
@@ -49,8 +50,8 @@
49
50
  "start": "node dist/cli.js claude"
50
51
  },
51
52
  "dependencies": {
52
- "@agentdeck/hooks": "1.0.24",
53
- "@agentdeck/shared": "1.0.24",
53
+ "@agentdeck/hooks": "1.2.0",
54
+ "@agentdeck/shared": "1.2.0",
54
55
  "@anthropic-ai/sdk": "^0.111.0",
55
56
  "bonjour-service": "^1.3.0",
56
57
  "commander": "^14.0.3",
@@ -151,12 +151,31 @@ async def write_packet(client, packet: bytes) -> None:
151
151
  await client.write_gatt_char(WRITE_CHAR, packet[i:i + CHUNK_SIZE], response=False)
152
152
 
153
153
 
154
- async def blank_panel(client) -> None:
155
- """Push an all-black 11x11 farewell frame so the stateful LED panel doesn't
156
- freeze on the last dashboard scene after we go away. The Timebox Mini has no
157
- text resolution for an "OFFLINE" label (mirrors the Swift TimeboxModule, which
158
- also blanks to 11x11 black; iDotMatrix/Pixoo can fit an OFFLINE glyph)."""
159
- await write_packet(client, build_static_image_packet(bytes(182)))
154
+ def make_offline_image() -> PilImage.Image:
155
+ """Native 11x11 passive-display OFFLINE badge, mirrored by MicroGlyphs."""
156
+ img = PilImage.new("RGB", (TIMEBOX_W, TIMEBOX_H), (2, 6, 10))
157
+ px = img.load()
158
+ for x, y in (
159
+ (0, 0), (1, 0), (0, 1), (9, 0), (10, 0), (10, 1),
160
+ (0, 9), (0, 10), (1, 10), (10, 9), (9, 10), (10, 10),
161
+ ):
162
+ px[x, y] = (0, 48, 56)
163
+ for x in range(2, 9):
164
+ px[x, 2] = (68, 88, 92)
165
+ px[x, 8] = (68, 88, 92)
166
+ for y in range(3, 8):
167
+ if y != 7:
168
+ px[2, y] = (68, 88, 92)
169
+ px[8, y] = (68, 88, 92)
170
+ for i in range(7):
171
+ px[2 + i, 8 - i] = (68, 88, 92)
172
+ return img
173
+
174
+
175
+ async def offline_panel(client) -> None:
176
+ """Leave a sparse dark badge instead of a stale live dashboard frame."""
177
+ payload = encode_image_bright(make_offline_image(), 100, 1.0, 1.0, 1.0)
178
+ await write_packet(client, build_static_image_packet(payload))
160
179
 
161
180
 
162
181
  async def push_micro_frame(client, url, brightness, gamma, sat, contrast, last_key, force=False) -> tuple[str, bool]:
@@ -190,7 +209,7 @@ async def run(address: str, url: str, brightness: int, gamma: float, sat: float,
190
209
  status = StatusReporter()
191
210
  stop = asyncio.Event()
192
211
  # Why we're stopping — decides the farewell. 'signal' = clean daemon shutdown
193
- # (no successor → blank the panel). 'orphan' = parent died (a successor daemon
212
+ # (no successor → mark the panel OFFLINE). 'orphan' = parent died (a successor daemon
194
213
  # may have taken over → don't clobber its frame). 'bridge_gone' = nobody home.
195
214
  exit_reason = {"v": None}
196
215
 
@@ -352,31 +371,31 @@ async def run(address: str, url: str, brightness: int, gamma: float, sat: float,
352
371
  pass
353
372
 
354
373
  # Inner loop exited. If we're shutting down (SIGTERM, orphaned, or
355
- # bridge gone) and the link is still up, blank the panel before the
374
+ # bridge gone) and the link is still up, mark the panel OFFLINE before the
356
375
  # `async with` drops BLE — otherwise the stateful LED panel freezes
357
376
  # on the last dashboard frame forever (parity with iDotMatrix's
358
- # OFFLINE farewell and the Swift TimeboxModule's 11x11 black blank).
377
+ # OFFLINE farewell and the Swift TimeboxModule's matching 11x11 badge).
359
378
  #
360
379
  # EXCEPT when a successor daemon has already taken over: our parent
361
380
  # died abruptly (orphan) but the bridge is answering again, so a new
362
381
  # daemon restarted and is repainting the panel. Blanking here would
363
- # clobber its fresh frame and the panel would sit blank until a
382
+ # clobber its fresh frame and the panel would sit offline until a
364
383
  # power-cycle — the exact failure this guard prevents.
365
384
  successor_took_over = exit_reason["v"] == "orphan" and bridge_reachable(url)
366
385
  if successor_took_over:
367
- print("Successor daemon detected — skipping farewell blank (it will repaint).")
386
+ print("Successor daemon detected — skipping farewell badge (it will repaint).")
368
387
  if stop.is_set() and client.is_connected and not successor_took_over:
369
388
  try:
370
- await blank_panel(client)
371
- # blank_panel writes WITHOUT response — the await returns once
389
+ await offline_panel(client)
390
+ # offline_panel writes WITHOUT response — the await returns once
372
391
  # the packet is queued to the OS, not once it's transmitted.
373
392
  # The `async with` below drops the BLE link immediately on
374
- # exit; without this beat the queued blank never goes over the
393
+ # exit; without this beat the queued badge never goes over the
375
394
  # air and the panel freezes on its last dashboard frame.
376
395
  await asyncio.sleep(0.5)
377
- print("Shutting down — blanked Timebox panel.")
396
+ print("Shutting down — Timebox panel marked OFFLINE.")
378
397
  except Exception as e:
379
- print(f"Farewell blank failed: {e}", file=sys.stderr)
398
+ print(f"Farewell OFFLINE badge failed: {e}", file=sys.stderr)
380
399
  except Exception as e:
381
400
  print(f"BLE connection error: {e}", file=sys.stderr)
382
401
  status.failed(f"BLE connection error: {e}")