uxnan-bridge 0.0.1-alpha.20260621

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 (255) hide show
  1. package/README.md +150 -0
  2. package/dist/src/account-status.d.ts +13 -0
  3. package/dist/src/account-status.js +78 -0
  4. package/dist/src/account-status.js.map +1 -0
  5. package/dist/src/adapters/base-adapter.d.ts +18 -0
  6. package/dist/src/adapters/base-adapter.js +15 -0
  7. package/dist/src/adapters/base-adapter.js.map +1 -0
  8. package/dist/src/adapters/claude-adapter.d.ts +102 -0
  9. package/dist/src/adapters/claude-adapter.js +486 -0
  10. package/dist/src/adapters/claude-adapter.js.map +1 -0
  11. package/dist/src/adapters/claude-tools.d.ts +25 -0
  12. package/dist/src/adapters/claude-tools.js +146 -0
  13. package/dist/src/adapters/claude-tools.js.map +1 -0
  14. package/dist/src/adapters/codex-adapter.d.ts +116 -0
  15. package/dist/src/adapters/codex-adapter.js +912 -0
  16. package/dist/src/adapters/codex-adapter.js.map +1 -0
  17. package/dist/src/adapters/codex-app-server.d.ts +74 -0
  18. package/dist/src/adapters/codex-app-server.js +225 -0
  19. package/dist/src/adapters/codex-app-server.js.map +1 -0
  20. package/dist/src/adapters/codex-approval.d.ts +88 -0
  21. package/dist/src/adapters/codex-approval.js +160 -0
  22. package/dist/src/adapters/codex-approval.js.map +1 -0
  23. package/dist/src/adapters/codex-tools.d.ts +18 -0
  24. package/dist/src/adapters/codex-tools.js +106 -0
  25. package/dist/src/adapters/codex-tools.js.map +1 -0
  26. package/dist/src/adapters/content-blocks.d.ts +68 -0
  27. package/dist/src/adapters/content-blocks.js +205 -0
  28. package/dist/src/adapters/content-blocks.js.map +1 -0
  29. package/dist/src/adapters/echo-agent-adapter.d.ts +23 -0
  30. package/dist/src/adapters/echo-agent-adapter.js +72 -0
  31. package/dist/src/adapters/echo-agent-adapter.js.map +1 -0
  32. package/dist/src/adapters/gemini-adapter.d.ts +87 -0
  33. package/dist/src/adapters/gemini-adapter.js +594 -0
  34. package/dist/src/adapters/gemini-adapter.js.map +1 -0
  35. package/dist/src/adapters/gemini-tools.d.ts +4 -0
  36. package/dist/src/adapters/gemini-tools.js +48 -0
  37. package/dist/src/adapters/gemini-tools.js.map +1 -0
  38. package/dist/src/adapters/opencode-adapter.d.ts +74 -0
  39. package/dist/src/adapters/opencode-adapter.js +418 -0
  40. package/dist/src/adapters/opencode-adapter.js.map +1 -0
  41. package/dist/src/adapters/opencode-tools.d.ts +2 -0
  42. package/dist/src/adapters/opencode-tools.js +41 -0
  43. package/dist/src/adapters/opencode-tools.js.map +1 -0
  44. package/dist/src/adapters/pi-adapter.d.ts +92 -0
  45. package/dist/src/adapters/pi-adapter.js +467 -0
  46. package/dist/src/adapters/pi-adapter.js.map +1 -0
  47. package/dist/src/adapters/pi-tools.d.ts +10 -0
  48. package/dist/src/adapters/pi-tools.js +72 -0
  49. package/dist/src/adapters/pi-tools.js.map +1 -0
  50. package/dist/src/adapters/process-agent-adapter.d.ts +24 -0
  51. package/dist/src/adapters/process-agent-adapter.js +111 -0
  52. package/dist/src/adapters/process-agent-adapter.js.map +1 -0
  53. package/dist/src/adapters/resolve-claude.d.ts +13 -0
  54. package/dist/src/adapters/resolve-claude.js +57 -0
  55. package/dist/src/adapters/resolve-claude.js.map +1 -0
  56. package/dist/src/adapters/resolve-codex.d.ts +13 -0
  57. package/dist/src/adapters/resolve-codex.js +48 -0
  58. package/dist/src/adapters/resolve-codex.js.map +1 -0
  59. package/dist/src/adapters/resolve-gemini.d.ts +13 -0
  60. package/dist/src/adapters/resolve-gemini.js +47 -0
  61. package/dist/src/adapters/resolve-gemini.js.map +1 -0
  62. package/dist/src/adapters/resolve-opencode.d.ts +11 -0
  63. package/dist/src/adapters/resolve-opencode.js +49 -0
  64. package/dist/src/adapters/resolve-opencode.js.map +1 -0
  65. package/dist/src/adapters/resolve-pi.d.ts +13 -0
  66. package/dist/src/adapters/resolve-pi.js +46 -0
  67. package/dist/src/adapters/resolve-pi.js.map +1 -0
  68. package/dist/src/adapters/run-options.d.ts +22 -0
  69. package/dist/src/adapters/run-options.js +48 -0
  70. package/dist/src/adapters/run-options.js.map +1 -0
  71. package/dist/src/adapters/spawn.d.ts +20 -0
  72. package/dist/src/adapters/spawn.js +16 -0
  73. package/dist/src/adapters/spawn.js.map +1 -0
  74. package/dist/src/agents/agent-manager.d.ts +98 -0
  75. package/dist/src/agents/agent-manager.js +433 -0
  76. package/dist/src/agents/agent-manager.js.map +1 -0
  77. package/dist/src/agents/attachments.d.ts +28 -0
  78. package/dist/src/agents/attachments.js +121 -0
  79. package/dist/src/agents/attachments.js.map +1 -0
  80. package/dist/src/bridge-context.d.ts +45 -0
  81. package/dist/src/bridge-context.js +2 -0
  82. package/dist/src/bridge-context.js.map +1 -0
  83. package/dist/src/bridge-status.d.ts +12 -0
  84. package/dist/src/bridge-status.js +17 -0
  85. package/dist/src/bridge-status.js.map +1 -0
  86. package/dist/src/bridge.d.ts +37 -0
  87. package/dist/src/bridge.js +446 -0
  88. package/dist/src/bridge.js.map +1 -0
  89. package/dist/src/cli.d.ts +2 -0
  90. package/dist/src/cli.js +194 -0
  91. package/dist/src/cli.js.map +1 -0
  92. package/dist/src/conversation/session-history.d.ts +27 -0
  93. package/dist/src/conversation/session-history.js +1082 -0
  94. package/dist/src/conversation/session-history.js.map +1 -0
  95. package/dist/src/conversation/thread-store.d.ts +74 -0
  96. package/dist/src/conversation/thread-store.js +366 -0
  97. package/dist/src/conversation/thread-store.js.map +1 -0
  98. package/dist/src/daemon-config.d.ts +123 -0
  99. package/dist/src/daemon-config.js +64 -0
  100. package/dist/src/daemon-config.js.map +1 -0
  101. package/dist/src/daemon-state.d.ts +27 -0
  102. package/dist/src/daemon-state.js +76 -0
  103. package/dist/src/daemon-state.js.map +1 -0
  104. package/dist/src/git/git-runner.d.ts +24 -0
  105. package/dist/src/git/git-runner.js +63 -0
  106. package/dist/src/git/git-runner.js.map +1 -0
  107. package/dist/src/git/git-service.d.ts +76 -0
  108. package/dist/src/git/git-service.js +435 -0
  109. package/dist/src/git/git-service.js.map +1 -0
  110. package/dist/src/handler-router.d.ts +34 -0
  111. package/dist/src/handler-router.js +67 -0
  112. package/dist/src/handler-router.js.map +1 -0
  113. package/dist/src/handlers/account-handler.d.ts +4 -0
  114. package/dist/src/handlers/account-handler.js +27 -0
  115. package/dist/src/handlers/account-handler.js.map +1 -0
  116. package/dist/src/handlers/agent-handler.d.ts +2 -0
  117. package/dist/src/handlers/agent-handler.js +8 -0
  118. package/dist/src/handlers/agent-handler.js.map +1 -0
  119. package/dist/src/handlers/bridge-control-handler.d.ts +2 -0
  120. package/dist/src/handlers/bridge-control-handler.js +64 -0
  121. package/dist/src/handlers/bridge-control-handler.js.map +1 -0
  122. package/dist/src/handlers/desktop-handler.d.ts +12 -0
  123. package/dist/src/handlers/desktop-handler.js +5 -0
  124. package/dist/src/handlers/desktop-handler.js.map +1 -0
  125. package/dist/src/handlers/git-handler.d.ts +2 -0
  126. package/dist/src/handlers/git-handler.js +82 -0
  127. package/dist/src/handlers/git-handler.js.map +1 -0
  128. package/dist/src/handlers/index.d.ts +8 -0
  129. package/dist/src/handlers/index.js +22 -0
  130. package/dist/src/handlers/index.js.map +1 -0
  131. package/dist/src/handlers/not-implemented.d.ts +10 -0
  132. package/dist/src/handlers/not-implemented.js +21 -0
  133. package/dist/src/handlers/not-implemented.js.map +1 -0
  134. package/dist/src/handlers/notifications-handler.d.ts +2 -0
  135. package/dist/src/handlers/notifications-handler.js +62 -0
  136. package/dist/src/handlers/notifications-handler.js.map +1 -0
  137. package/dist/src/handlers/params.d.ts +11 -0
  138. package/dist/src/handlers/params.js +72 -0
  139. package/dist/src/handlers/params.js.map +1 -0
  140. package/dist/src/handlers/project-handler.d.ts +2 -0
  141. package/dist/src/handlers/project-handler.js +6 -0
  142. package/dist/src/handlers/project-handler.js.map +1 -0
  143. package/dist/src/handlers/thread-context-handler.d.ts +2 -0
  144. package/dist/src/handlers/thread-context-handler.js +211 -0
  145. package/dist/src/handlers/thread-context-handler.js.map +1 -0
  146. package/dist/src/handlers/workspace-handler.d.ts +2 -0
  147. package/dist/src/handlers/workspace-handler.js +101 -0
  148. package/dist/src/handlers/workspace-handler.js.map +1 -0
  149. package/dist/src/hooks/claude-approval-hook.d.ts +7 -0
  150. package/dist/src/hooks/claude-approval-hook.js +95 -0
  151. package/dist/src/hooks/claude-approval-hook.js.map +1 -0
  152. package/dist/src/hooks/gemini-approval-hook.d.ts +7 -0
  153. package/dist/src/hooks/gemini-approval-hook.js +113 -0
  154. package/dist/src/hooks/gemini-approval-hook.js.map +1 -0
  155. package/dist/src/index.d.ts +62 -0
  156. package/dist/src/index.js +65 -0
  157. package/dist/src/index.js.map +1 -0
  158. package/dist/src/keyring-secret-store.d.ts +36 -0
  159. package/dist/src/keyring-secret-store.js +70 -0
  160. package/dist/src/keyring-secret-store.js.map +1 -0
  161. package/dist/src/lock-file.d.ts +18 -0
  162. package/dist/src/lock-file.js +60 -0
  163. package/dist/src/lock-file.js.map +1 -0
  164. package/dist/src/logger.d.ts +28 -0
  165. package/dist/src/logger.js +99 -0
  166. package/dist/src/logger.js.map +1 -0
  167. package/dist/src/pairing/pairing-code-service.d.ts +45 -0
  168. package/dist/src/pairing/pairing-code-service.js +183 -0
  169. package/dist/src/pairing/pairing-code-service.js.map +1 -0
  170. package/dist/src/projects/project-registry.d.ts +14 -0
  171. package/dist/src/projects/project-registry.js +60 -0
  172. package/dist/src/projects/project-registry.js.map +1 -0
  173. package/dist/src/push/push-sender.d.ts +21 -0
  174. package/dist/src/push/push-sender.js +96 -0
  175. package/dist/src/push/push-sender.js.map +1 -0
  176. package/dist/src/push/push-service.d.ts +122 -0
  177. package/dist/src/push/push-service.js +260 -0
  178. package/dist/src/push/push-service.js.map +1 -0
  179. package/dist/src/qr.d.ts +17 -0
  180. package/dist/src/qr.js +31 -0
  181. package/dist/src/qr.js.map +1 -0
  182. package/dist/src/secret-store.d.ts +23 -0
  183. package/dist/src/secret-store.js +27 -0
  184. package/dist/src/secret-store.js.map +1 -0
  185. package/dist/src/secure-device-state.d.ts +16 -0
  186. package/dist/src/secure-device-state.js +63 -0
  187. package/dist/src/secure-device-state.js.map +1 -0
  188. package/dist/src/service-installer.d.ts +57 -0
  189. package/dist/src/service-installer.js +254 -0
  190. package/dist/src/service-installer.js.map +1 -0
  191. package/dist/src/session-state.d.ts +14 -0
  192. package/dist/src/session-state.js +19 -0
  193. package/dist/src/session-state.js.map +1 -0
  194. package/dist/src/transport/crypto.d.ts +43 -0
  195. package/dist/src/transport/crypto.js +78 -0
  196. package/dist/src/transport/crypto.js.map +1 -0
  197. package/dist/src/transport/lan-server.d.ts +33 -0
  198. package/dist/src/transport/lan-server.js +105 -0
  199. package/dist/src/transport/lan-server.js.map +1 -0
  200. package/dist/src/transport/local-hosts.d.ts +17 -0
  201. package/dist/src/transport/local-hosts.js +30 -0
  202. package/dist/src/transport/local-hosts.js.map +1 -0
  203. package/dist/src/transport/mdns-advertiser.d.ts +83 -0
  204. package/dist/src/transport/mdns-advertiser.js +282 -0
  205. package/dist/src/transport/mdns-advertiser.js.map +1 -0
  206. package/dist/src/transport/message-io.d.ts +33 -0
  207. package/dist/src/transport/message-io.js +87 -0
  208. package/dist/src/transport/message-io.js.map +1 -0
  209. package/dist/src/transport/outbound-log.d.ts +24 -0
  210. package/dist/src/transport/outbound-log.js +78 -0
  211. package/dist/src/transport/outbound-log.js.map +1 -0
  212. package/dist/src/transport/relay-client.d.ts +19 -0
  213. package/dist/src/transport/relay-client.js +27 -0
  214. package/dist/src/transport/relay-client.js.map +1 -0
  215. package/dist/src/transport/secure-channel.d.ts +33 -0
  216. package/dist/src/transport/secure-channel.js +81 -0
  217. package/dist/src/transport/secure-channel.js.map +1 -0
  218. package/dist/src/transport/server-handshake.d.ts +49 -0
  219. package/dist/src/transport/server-handshake.js +137 -0
  220. package/dist/src/transport/server-handshake.js.map +1 -0
  221. package/dist/src/transport/session-handler.d.ts +19 -0
  222. package/dist/src/transport/session-handler.js +134 -0
  223. package/dist/src/transport/session-handler.js.map +1 -0
  224. package/dist/src/transport/session-registry.d.ts +58 -0
  225. package/dist/src/transport/session-registry.js +91 -0
  226. package/dist/src/transport/session-registry.js.map +1 -0
  227. package/dist/src/transport/trust-store.d.ts +23 -0
  228. package/dist/src/transport/trust-store.js +33 -0
  229. package/dist/src/transport/trust-store.js.map +1 -0
  230. package/dist/src/transport/ws-adapter.d.ts +7 -0
  231. package/dist/src/transport/ws-adapter.js +16 -0
  232. package/dist/src/transport/ws-adapter.js.map +1 -0
  233. package/dist/src/version.d.ts +1 -0
  234. package/dist/src/version.js +13 -0
  235. package/dist/src/version.js.map +1 -0
  236. package/dist/src/workspace/browse-service.d.ts +10 -0
  237. package/dist/src/workspace/browse-service.js +97 -0
  238. package/dist/src/workspace/browse-service.js.map +1 -0
  239. package/dist/src/workspace/checkpoint-service.d.ts +21 -0
  240. package/dist/src/workspace/checkpoint-service.js +219 -0
  241. package/dist/src/workspace/checkpoint-service.js.map +1 -0
  242. package/dist/src/workspace/path-guard.d.ts +7 -0
  243. package/dist/src/workspace/path-guard.js +51 -0
  244. package/dist/src/workspace/path-guard.js.map +1 -0
  245. package/dist/src/workspace/workspace-service.d.ts +8 -0
  246. package/dist/src/workspace/workspace-service.js +111 -0
  247. package/dist/src/workspace/workspace-service.js.map +1 -0
  248. package/package.json +46 -0
  249. package/scripts/extract-gemini-hook.mjs +16 -0
  250. package/scripts/fake-approval-bridge.mjs +23 -0
  251. package/scripts/install-service-linux.sh +38 -0
  252. package/scripts/install-service-macos.sh +38 -0
  253. package/scripts/install-service-windows.ps1 +26 -0
  254. package/scripts/test-gemini-hook-e2e.mjs +168 -0
  255. package/scripts/write-gemini-settings.mjs +31 -0
@@ -0,0 +1,446 @@
1
+ /**
2
+ * Bridge daemon orchestration: wires daemon state, identity, config, the
3
+ * JSON-RPC router and handlers, and the live E2EE transport (relay + LAN).
4
+ *
5
+ * Agent runtimes and the outbound catch-up buffer remain deferred (see FOR-DEV).
6
+ *
7
+ * Source: architecture/02a-system-architecture.md §5.8.2 (bridge entrypoint).
8
+ */
9
+ import { hostname } from 'node:os';
10
+ import { join } from 'node:path';
11
+ import { randomUUID } from 'node:crypto';
12
+ import { makeNotification } from '@uxnan/shared';
13
+ import { HandlerRouter } from './handler-router.js';
14
+ import { registerAllHandlers } from './handlers/index.js';
15
+ import { DaemonState, DAEMON_FILES } from './daemon-state.js';
16
+ import { SecureDeviceState } from './secure-device-state.js';
17
+ import { createDefaultSecretStore } from './keyring-secret-store.js';
18
+ import { SessionState } from './session-state.js';
19
+ import { buildBridgeStatus } from './bridge-status.js';
20
+ import { generatePairingPayload } from './qr.js';
21
+ import { PairingCodeService } from './pairing/pairing-code-service.js';
22
+ import { createFileLogger } from './logger.js';
23
+ import { BRIDGE_VERSION } from './version.js';
24
+ import { FileTrustStore } from './transport/trust-store.js';
25
+ import { handleSecureConnection } from './transport/session-handler.js';
26
+ import { connectRelayAsMac } from './transport/relay-client.js';
27
+ import { startLanServer } from './transport/lan-server.js';
28
+ import { localHostPorts, localIPv4s } from './transport/local-hosts.js';
29
+ import { MdnsAdvertiser } from './transport/mdns-advertiser.js';
30
+ import { SessionRegistry } from './transport/session-registry.js';
31
+ import { ThreadStore } from './conversation/thread-store.js';
32
+ import { AgentManager } from './agents/agent-manager.js';
33
+ import { writeClaudeApprovalHook } from './hooks/claude-approval-hook.js';
34
+ import { writeGeminiApprovalHook } from './hooks/gemini-approval-hook.js';
35
+ import { EchoAgentAdapter } from './adapters/echo-agent-adapter.js';
36
+ import { OpenCodeAdapter } from './adapters/opencode-adapter.js';
37
+ import { resolveOpenCodeBinary } from './adapters/resolve-opencode.js';
38
+ import { ClaudeCodeAdapter } from './adapters/claude-adapter.js';
39
+ import { resolveClaudeBinary } from './adapters/resolve-claude.js';
40
+ import { CodexAdapter } from './adapters/codex-adapter.js';
41
+ import { resolveCodexBinary } from './adapters/resolve-codex.js';
42
+ import { PiAdapter } from './adapters/pi-adapter.js';
43
+ import { resolvePiBinary } from './adapters/resolve-pi.js';
44
+ import { GeminiAdapter } from './adapters/gemini-adapter.js';
45
+ import { resolveGeminiBinary } from './adapters/resolve-gemini.js';
46
+ import { ProjectRegistry } from './projects/project-registry.js';
47
+ import { BrowseService } from './workspace/browse-service.js';
48
+ import { PushService } from './push/push-service.js';
49
+ import { createBridgePushSender } from './push/push-sender.js';
50
+ import { SessionHistoryReader } from './conversation/session-history.js';
51
+ export async function startBridge(options = {}) {
52
+ const now = options.now ?? (() => Date.now());
53
+ const state = new DaemonState(options.baseDir);
54
+ const logger = createFileLogger({
55
+ scope: 'bridge',
56
+ minLevel: options.logLevel ?? 'info',
57
+ logDir: state.logsDir,
58
+ });
59
+ const config = await state.initConfig();
60
+ // Persist the pairing sessionId so it is STABLE across bridge restarts. The
61
+ // relay pairs phone↔bridge by sessionId; if we regenerated it every start,
62
+ // the phone's trusted-reconnect (which reuses the stored sessionId) would no
63
+ // longer find the bridge on the relay and would require re-scanning the QR.
64
+ const persistedPairing = await state.readJson(DAEMON_FILES.pairing);
65
+ let pairingSessionId = persistedPairing?.sessionId;
66
+ if (!pairingSessionId) {
67
+ pairingSessionId = randomUUID();
68
+ await state.writeJson(DAEMON_FILES.pairing, { sessionId: pairingSessionId });
69
+ }
70
+ const secretStore = options.secretStore ?? (await createDefaultSecretStore(logger));
71
+ const deviceState = new SecureDeviceState(secretStore);
72
+ await deviceState.loadOrCreate();
73
+ const sessions = new SessionState();
74
+ const sessionRegistry = new SessionRegistry();
75
+ const trustStore = new FileTrustStore(state);
76
+ const threadStore = new ThreadStore(state);
77
+ // Reads agent on-disk session logs when the store has no turns (§5.8.8).
78
+ const sessionHistory = new SessionHistoryReader();
79
+ // Single source of the pairing payload — shared by the QR and the manual-code
80
+ // resolve endpoint, so both hand out identical pairing data.
81
+ const buildPairingPayload = () => generatePairingPayload({
82
+ ...(config.relayEnabled ? { relayUrl: config.relayUrl } : {}),
83
+ ...(config.lanEnabled ? { hosts: localHostPorts(config.lanPort) } : {}),
84
+ macDeviceId: deviceState.identity.macDeviceId,
85
+ macIdentityPublicKey: deviceState.identity.macIdentityPublicKey,
86
+ displayName: hostname(),
87
+ now: now(),
88
+ sessionId: pairingSessionId,
89
+ });
90
+ const pairingCodeService = new PairingCodeService({
91
+ buildPayload: buildPairingPayload,
92
+ now,
93
+ // Persist the code so the running daemon (which serves `/pair/resolve`) and a
94
+ // separate `qr` command — or an autostarted, console-less daemon — agree on it.
95
+ statePath: state.pathFor(DAEMON_FILES.pairingCode),
96
+ });
97
+ const projects = new ProjectRegistry(config.workspaceRoots, process.cwd(), config.projectAgents);
98
+ // Browse roots fall back to the project roots, then the bridge's launch
99
+ // directory (`process.cwd()`) — so an unconfigured install browses from
100
+ // wherever the bridge was started, no `browseRoots`/`workspaceRoots` needed.
101
+ const browse = new BrowseService(config.browseRoots.length > 0 ? config.browseRoots : config.workspaceRoots);
102
+ // Direct FCM is the PRIMARY push path: when a Firebase service account is present
103
+ // the bridge delivers straight to FCM on any transport (LAN/Tailscale/relay). With
104
+ // no credential this is null and the bridge uses the relay fallback (FOR-DEV).
105
+ const pushSender = await createBridgePushSender(logger);
106
+ const pushService = new PushService({
107
+ relayUrl: config.relayUrl,
108
+ config,
109
+ logger,
110
+ state,
111
+ ...(pushSender ? { pushSender } : {}),
112
+ });
113
+ // Restore persisted push registrations so background push survives a restart.
114
+ await pushService.load();
115
+ const agentManager = new AgentManager({
116
+ store: threadStore,
117
+ notify: (message) => sessionRegistry.broadcast(message),
118
+ now,
119
+ logger,
120
+ defaultAgent: config.defaultAgent,
121
+ onTurnEnd: (info) => pushService.onTurnEnd(info),
122
+ });
123
+ // Echo: built-in reference agent (no external CLI), useful for development.
124
+ agentManager.register(new EchoAgentAdapter(), { displayName: 'Echo (dev)' });
125
+ // OpenCode: real agent driven via `opencode run --format json` (see FOR-DEV.md).
126
+ const openCodeSettings = config.agents.opencode ?? {};
127
+ const openCode = resolveOpenCodeBinary(openCodeSettings.binaryPath);
128
+ agentManager.register(new OpenCodeAdapter({
129
+ binaryPath: openCode.binaryPath,
130
+ ...(openCodeSettings.model !== undefined ? { defaultModel: openCodeSettings.model } : {}),
131
+ }), {
132
+ displayName: 'OpenCode',
133
+ available: openCode.available,
134
+ ...(openCodeSettings.model !== undefined ? { defaultModel: openCodeSettings.model } : {}),
135
+ });
136
+ // Claude Code: real agent driven via `claude -p --output-format stream-json` (see FOR-DEV.md).
137
+ const claudeSettings = config.agents['claude-code'] ?? {};
138
+ const claude = resolveClaudeBinary(claudeSettings.binaryPath);
139
+ // Interactive approvals (opt-in): the Claude adapter injects a PreToolUse hook
140
+ // that round-trips each tool to this bridge's local HTTP endpoint. The hook
141
+ // URL is lazy (the LAN port is known only after `startLan`); the token guards
142
+ // the endpoint and the script is written under `~/.uxnan/hooks/`.
143
+ const claudeInteractiveApprovals = (claudeSettings.interactiveApprovals ?? false) && config.lanEnabled;
144
+ const hookState = { token: randomUUID() };
145
+ const claudeHookScriptPath = state.pathFor(join('hooks', 'claude-approval-hook.cjs'));
146
+ const geminiHookScriptPath = state.pathFor(join('hooks', 'gemini-approval-hook.cjs'));
147
+ if (claudeInteractiveApprovals) {
148
+ void writeClaudeApprovalHook(claudeHookScriptPath).catch((err) => logger.warn(`failed to write the Claude approval hook: ${String(err)}`));
149
+ }
150
+ // Normalize the configured extra models (bare id strings or {id,...} specs)
151
+ // into the adapter's spec shape; they appear in the picker alongside the
152
+ // auto-updating opus/sonnet/haiku aliases. See docs/agents.md.
153
+ const claudePinnedModels = (claudeSettings.models ?? []).map((m) => typeof m === 'string' ? { id: m } : m);
154
+ agentManager.register(new ClaudeCodeAdapter({
155
+ binaryPath: claude.binaryPath,
156
+ prependArgs: claude.prependArgs,
157
+ permissionMode: claudeSettings.permissionMode ?? 'acceptEdits',
158
+ ...(claudeInteractiveApprovals
159
+ ? {
160
+ interactiveApprovals: true,
161
+ approvalHook: {
162
+ token: hookState.token,
163
+ scriptPath: claudeHookScriptPath,
164
+ url: () => hookState.port !== undefined
165
+ ? `http://127.0.0.1:${hookState.port}/agent-hook/approval`
166
+ : undefined,
167
+ },
168
+ }
169
+ : {}),
170
+ ...(claudeSettings.model !== undefined ? { defaultModel: claudeSettings.model } : {}),
171
+ ...(claudePinnedModels.length > 0 ? { pinnedModels: claudePinnedModels } : {}),
172
+ }), {
173
+ displayName: 'Claude Code',
174
+ available: claude.available,
175
+ ...(claudeSettings.model !== undefined ? { defaultModel: claudeSettings.model } : {}),
176
+ });
177
+ // Codex: real agent driven via the `codex app-server` turn protocol
178
+ // (the bridge speaks JSON-RPC over the child's stdio; approvals go through
179
+ // the bridge's `requestApproval` flow — see `codex-approval.ts`).
180
+ const codexSettings = config.agents['codex'] ?? {};
181
+ const codex = resolveCodexBinary(codexSettings.binaryPath);
182
+ agentManager.register(new CodexAdapter({
183
+ binaryPath: codex.binaryPath,
184
+ prependArgs: codex.prependArgs,
185
+ // The app-server has its own approval channel; default to `interactive`
186
+ // so every tool gating is surfaced to the phone (the previous
187
+ // `acceptEdits` default silently auto-approved everything via
188
+ // `codex exec -s workspace-write`). `acceptEdits` is still accepted
189
+ // for back-compat and maps to the same no-prompt behavior.
190
+ permissionMode: codexSettings.permissionMode ?? 'interactive',
191
+ // Route app-server approval elicitations to the bridge's shared
192
+ // approval round-trip (the same one the Claude PreToolUse hook and
193
+ // the Echo demo use).
194
+ onApprovalRequest: (threadId, info) => agentManager.requestApproval(threadId, info),
195
+ ...(codexSettings.model !== undefined ? { defaultModel: codexSettings.model } : {}),
196
+ }), {
197
+ displayName: 'Codex',
198
+ available: codex.available,
199
+ ...(codexSettings.model !== undefined ? { defaultModel: codexSettings.model } : {}),
200
+ });
201
+ // pi: real agent driven via `pi -p --mode json` (see FOR-DEV.md).
202
+ const piSettings = config.agents['pi-agent'] ?? {};
203
+ const pi = resolvePiBinary(piSettings.binaryPath);
204
+ agentManager.register(new PiAdapter({
205
+ binaryPath: pi.binaryPath,
206
+ prependArgs: pi.prependArgs,
207
+ permissionMode: piSettings.permissionMode ?? 'acceptEdits',
208
+ ...(piSettings.model !== undefined ? { defaultModel: piSettings.model } : {}),
209
+ }), {
210
+ displayName: 'pi',
211
+ available: pi.available,
212
+ ...(piSettings.model !== undefined ? { defaultModel: piSettings.model } : {}),
213
+ });
214
+ // Gemini: real agent driven via `gemini -p --output-format stream-json` (see FOR-DEV.md).
215
+ const geminiSettings = config.agents['gemini-cli'] ?? {};
216
+ const gemini = resolveGeminiBinary(geminiSettings.binaryPath);
217
+ // Interactive approvals for Gemini: opt-in (`agents['gemini-cli'].
218
+ // interactiveApprovals: true`) and only when the LAN server is enabled (the
219
+ // hook POSTs to the bridge's local HTTP endpoint). The adapter writes a
220
+ // `<cwd>/.gemini/settings.json` with a `BeforeTool` hook — Gemini uses the
221
+ // same hook contract as Claude Code (the CLI ships `gemini hooks migrate`
222
+ // for that).
223
+ const geminiInteractiveApprovals = (geminiSettings.interactiveApprovals ?? false) && config.lanEnabled;
224
+ if (geminiInteractiveApprovals) {
225
+ void writeGeminiApprovalHook(geminiHookScriptPath).catch((err) => logger.warn(`failed to write the Gemini approval hook: ${String(err)}`));
226
+ }
227
+ agentManager.register(new GeminiAdapter({
228
+ binaryPath: gemini.binaryPath,
229
+ prependArgs: gemini.prependArgs,
230
+ permissionMode: geminiSettings.permissionMode ?? 'acceptEdits',
231
+ ...(geminiInteractiveApprovals
232
+ ? {
233
+ approvalHook: {
234
+ token: hookState.token,
235
+ scriptPath: geminiHookScriptPath,
236
+ url: () => hookState.port !== undefined
237
+ ? `http://127.0.0.1:${hookState.port}/agent-hook/approval`
238
+ : undefined,
239
+ },
240
+ }
241
+ : {}),
242
+ ...(geminiSettings.model !== undefined ? { defaultModel: geminiSettings.model } : {}),
243
+ }), {
244
+ displayName: 'Gemini',
245
+ available: gemini.available,
246
+ ...(geminiSettings.model !== undefined ? { defaultModel: geminiSettings.model } : {}),
247
+ });
248
+ const startedAt = now();
249
+ // Live relay-connection state, mutated by the relay serve loop below and read
250
+ // by both the CLI `status()` and the `bridge/status` handler (via the context).
251
+ const relayState = { connected: false };
252
+ const context = {
253
+ version: BRIDGE_VERSION,
254
+ startedAt,
255
+ config,
256
+ state,
257
+ deviceState,
258
+ sessions,
259
+ sessionRegistry,
260
+ trustStore,
261
+ threadStore,
262
+ sessionHistory,
263
+ agentManager,
264
+ projects,
265
+ browse,
266
+ pushService,
267
+ logger,
268
+ relayConnected: () => relayState.connected,
269
+ now,
270
+ };
271
+ const router = new HandlerRouter(context);
272
+ registerAllHandlers(router);
273
+ const relayConnections = [];
274
+ let lanHandle;
275
+ let mdns;
276
+ let stopping = false;
277
+ const RELAY_RECONNECT_DELAY_MS = 2000;
278
+ const delay = (ms) => new Promise((resolve) => {
279
+ const timer = setTimeout(resolve, ms);
280
+ timer.unref?.();
281
+ });
282
+ logger.info(`bridge ready (v${BRIDGE_VERSION})`);
283
+ return {
284
+ context,
285
+ router,
286
+ trustStore,
287
+ status: () => buildBridgeStatus({
288
+ version: BRIDGE_VERSION,
289
+ relayConnected: relayState.connected,
290
+ lanEnabled: config.lanEnabled,
291
+ activeSessions: sessions.count,
292
+ startedAt,
293
+ now: now(),
294
+ }),
295
+ generatePairingQr: () => buildPairingPayload(),
296
+ currentPairingCode: () => pairingCodeService.currentCode(),
297
+ connectRelay: async (sessionId) => {
298
+ const dial = () => connectRelayAsMac({
299
+ relayUrl: config.relayUrl,
300
+ sessionId,
301
+ macDeviceId: deviceState.identity.macDeviceId,
302
+ macIdentityPublicKey: deviceState.identity.macIdentityPublicKey,
303
+ machineName: hostname(),
304
+ });
305
+ // Serve exactly one phone session over `connection`; resolves when the
306
+ // connection closes (the relay closes our socket when the phone drops).
307
+ const serve = async (connection) => {
308
+ relayConnections.push(connection);
309
+ relayState.connected = true;
310
+ try {
311
+ await handleSecureConnection({
312
+ io: connection.io,
313
+ ctx: context,
314
+ router,
315
+ deviceState,
316
+ trustStore,
317
+ displayName: hostname(),
318
+ expectedSessionId: sessionId,
319
+ });
320
+ }
321
+ finally {
322
+ const idx = relayConnections.indexOf(connection);
323
+ if (idx >= 0)
324
+ relayConnections.splice(idx, 1);
325
+ try {
326
+ connection.ws.close();
327
+ }
328
+ catch {
329
+ /* already closed */
330
+ }
331
+ relayState.connected = relayConnections.length > 0;
332
+ }
333
+ };
334
+ // Initial connect (awaited so the caller knows the relay is reachable).
335
+ const initial = await dial();
336
+ // Background loop: after each session ends, reconnect to the relay and
337
+ // wait for the phone again. This lets the phone trusted-reconnect after a
338
+ // drop (or a bridge/relay restart) WITHOUT re-scanning the QR — the old
339
+ // one-shot handler treated a reconnecting phone's handshake as encrypted
340
+ // traffic and dropped it.
341
+ void (async () => {
342
+ let current = initial;
343
+ while (!stopping) {
344
+ if (!current) {
345
+ try {
346
+ current = await dial();
347
+ }
348
+ catch (err) {
349
+ logger.warn(`relay reconnect failed: ${err instanceof Error ? err.message : String(err)}`);
350
+ await delay(RELAY_RECONNECT_DELAY_MS);
351
+ continue;
352
+ }
353
+ }
354
+ // Serve one phone session, then immediately re-arm on the relay (no
355
+ // delay) so a reconnecting phone always finds the bridge paired.
356
+ await serve(current);
357
+ current = undefined;
358
+ }
359
+ })();
360
+ },
361
+ startLan: async () => {
362
+ if (lanHandle)
363
+ return { port: lanHandle.port };
364
+ lanHandle = await startLanServer({
365
+ port: config.lanPort,
366
+ onConnection: (io) => {
367
+ void handleSecureConnection({
368
+ io,
369
+ ctx: context,
370
+ router,
371
+ deviceState,
372
+ trustStore,
373
+ displayName: hostname(),
374
+ });
375
+ },
376
+ // Manual-code pairing: trade a code shown on the PC for the pairing payload.
377
+ onPairResolve: (code, ip) => {
378
+ if (pairingCodeService.rateLimited(ip)) {
379
+ return { status: 429, json: { error: 'rate_limited' } };
380
+ }
381
+ const payload = pairingCodeService.resolve(code);
382
+ if (!payload)
383
+ return { status: 403, json: { error: 'invalid_or_expired_code' } };
384
+ return { status: 200, json: payload };
385
+ },
386
+ // Claude PreToolUse approval hook: ask the user (on the phone) whether a
387
+ // tool may run; hold the response until they answer (or it times out).
388
+ onHookApproval: async (body, token) => {
389
+ if (token !== hookState.token)
390
+ return { status: 403, json: { error: 'bad_token' } };
391
+ const b = body && typeof body === 'object' ? body : {};
392
+ const threadId = typeof b['threadId'] === 'string' ? b['threadId'] : '';
393
+ if (!threadId)
394
+ return { status: 400, json: { error: 'missing_thread' } };
395
+ const toolName = typeof b['toolName'] === 'string' ? b['toolName'] : 'tool';
396
+ const input = b['input'] && typeof b['input'] === 'object'
397
+ ? b['input']
398
+ : {};
399
+ // The hook script consumes `'allow' | 'deny'`; translate from the
400
+ // generic `ApprovalDecision` (the Codex app-server uses the same
401
+ // generic decision, so the same route serves both backends).
402
+ const decision = await agentManager.requestApproval(threadId, { toolName, input });
403
+ const hookDecision = decision === 'reject' ? 'deny' : 'allow';
404
+ return { status: 200, json: { decision: hookDecision } };
405
+ },
406
+ });
407
+ hookState.port = lanHandle.port;
408
+ logger.info(`LAN server listening on port ${lanHandle.port}`);
409
+ // Advertise on the LAN via mDNS so the phone can discover the bridge for
410
+ // manual-code pairing (best-effort; degrades silently if it can't bind).
411
+ if (config.mdnsEnabled && !mdns) {
412
+ const name = hostname();
413
+ mdns = new MdnsAdvertiser({
414
+ instanceName: name,
415
+ hostName: name.replace(/[^A-Za-z0-9-]/g, '-'),
416
+ port: lanHandle.port,
417
+ addresses: localIPv4s(),
418
+ txt: { id: deviceState.identity.macDeviceId },
419
+ logger,
420
+ });
421
+ mdns.start();
422
+ }
423
+ return { port: lanHandle.port };
424
+ },
425
+ notify: (deviceId, method, params) => sessionRegistry.notify(deviceId, makeNotification(method, params)),
426
+ stop: async () => {
427
+ logger.info('bridge stopping');
428
+ stopping = true;
429
+ await agentManager.stopAll();
430
+ for (const connection of relayConnections) {
431
+ connection.ws.close();
432
+ }
433
+ relayConnections.length = 0;
434
+ relayState.connected = false;
435
+ if (mdns) {
436
+ mdns.stop();
437
+ mdns = undefined;
438
+ }
439
+ if (lanHandle) {
440
+ await lanHandle.close();
441
+ lanHandle = undefined;
442
+ }
443
+ },
444
+ };
445
+ }
446
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAA0C,MAAM,eAAe,CAAC;AAEzF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAiB,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAmB,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAwB,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,cAAc,EAAwB,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAgCzE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAA8B,EAAE;IAChE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,gBAAgB,CAAC;QAC9B,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,MAAM;QACpC,MAAM,EAAE,KAAK,CAAC,OAAO;KACtB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;IAExC,4EAA4E;IAC5E,2EAA2E;IAC3E,6EAA6E;IAC7E,4EAA4E;IAC5E,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAwB,YAAY,CAAC,OAAO,CAAC,CAAC;IAC3F,IAAI,gBAAgB,GAAG,gBAAgB,EAAE,SAAS,CAAC;IACnD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,gBAAgB,GAAG,UAAU,EAAE,CAAC;QAChC,MAAM,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,MAAM,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC;IACpF,MAAM,WAAW,GAAG,IAAI,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,WAAW,CAAC,YAAY,EAAE,CAAC;IAEjC,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;IACpC,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;IAC3C,yEAAyE;IACzE,MAAM,cAAc,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAClD,8EAA8E;IAC9E,6DAA6D;IAC7D,MAAM,mBAAmB,GAAG,GAAmB,EAAE,CAC/C,sBAAsB,CAAC;QACrB,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,WAAW,EAAE,WAAW,CAAC,QAAQ,CAAC,WAAW;QAC7C,oBAAoB,EAAE,WAAW,CAAC,QAAQ,CAAC,oBAAoB;QAC/D,WAAW,EAAE,QAAQ,EAAE;QACvB,GAAG,EAAE,GAAG,EAAE;QACV,SAAS,EAAE,gBAAgB;KAC5B,CAAC,CAAC;IACL,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,CAAC;QAChD,YAAY,EAAE,mBAAmB;QACjC,GAAG;QACH,8EAA8E;QAC9E,gFAAgF;QAChF,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC;KACnD,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACjG,wEAAwE;IACxE,wEAAwE;IACxE,6EAA6E;IAC7E,MAAM,MAAM,GAAG,IAAI,aAAa,CAC9B,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAC3E,CAAC;IACF,kFAAkF;IAClF,mFAAmF;IACnF,+EAA+E;IAC/E,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;QAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM;QACN,MAAM;QACN,KAAK;QACL,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtC,CAAC,CAAC;IACH,8EAA8E;IAC9E,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;IACzB,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC;QACpC,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC;QACvD,GAAG;QACH,MAAM;QACN,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC;KACjD,CAAC,CAAC;IACH,4EAA4E;IAC5E,YAAY,CAAC,QAAQ,CAAC,IAAI,gBAAgB,EAAE,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;IAC7E,iFAAiF;IACjF,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IACtD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACpE,YAAY,CAAC,QAAQ,CACnB,IAAI,eAAe,CAAC;QAClB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,GAAG,CAAC,gBAAgB,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1F,CAAC,EACF;QACE,WAAW,EAAE,UAAU;QACvB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,GAAG,CAAC,gBAAgB,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1F,CACF,CAAC;IACF,+FAA+F;IAC/F,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAC1D,MAAM,MAAM,GAAG,mBAAmB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAC9D,+EAA+E;IAC/E,4EAA4E;IAC5E,8EAA8E;IAC9E,kEAAkE;IAClE,MAAM,0BAA0B,GAC9B,CAAC,cAAc,CAAC,oBAAoB,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC;IACtE,MAAM,SAAS,GAAqC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC;IAC5E,MAAM,oBAAoB,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC,CAAC;IACtF,MAAM,oBAAoB,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC,CAAC;IACtF,IAAI,0BAA0B,EAAE,CAAC;QAC/B,KAAK,uBAAuB,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE,CACxE,MAAM,CAAC,IAAI,CAAC,6CAA6C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CACxE,CAAC;IACJ,CAAC;IACD,4EAA4E;IAC5E,yEAAyE;IACzE,+DAA+D;IAC/D,MAAM,kBAAkB,GAAG,CAAC,cAAc,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACjE,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CACtC,CAAC;IACF,YAAY,CAAC,QAAQ,CACnB,IAAI,iBAAiB,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,cAAc,EAAE,cAAc,CAAC,cAAc,IAAI,aAAa;QAC9D,GAAG,CAAC,0BAA0B;YAC5B,CAAC,CAAC;gBACE,oBAAoB,EAAE,IAAI;gBAC1B,YAAY,EAAE;oBACZ,KAAK,EAAE,SAAS,CAAC,KAAK;oBACtB,UAAU,EAAE,oBAAoB;oBAChC,GAAG,EAAE,GAAG,EAAE,CACR,SAAS,CAAC,IAAI,KAAK,SAAS;wBAC1B,CAAC,CAAC,oBAAoB,SAAS,CAAC,IAAI,sBAAsB;wBAC1D,CAAC,CAAC,SAAS;iBAChB;aACF;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,cAAc,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,GAAG,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/E,CAAC,EACF;QACE,WAAW,EAAE,aAAa;QAC1B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,GAAG,CAAC,cAAc,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtF,CACF,CAAC;IACF,oEAAoE;IACpE,2EAA2E;IAC3E,kEAAkE;IAClE,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACnD,MAAM,KAAK,GAAG,kBAAkB,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAC3D,YAAY,CAAC,QAAQ,CACnB,IAAI,YAAY,CAAC;QACf,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,wEAAwE;QACxE,8DAA8D;QAC9D,8DAA8D;QAC9D,oEAAoE;QACpE,2DAA2D;QAC3D,cAAc,EAAE,aAAa,CAAC,cAAc,IAAI,aAAa;QAC7D,gEAAgE;QAChE,mEAAmE;QACnE,sBAAsB;QACtB,iBAAiB,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC;QACnF,GAAG,CAAC,aAAa,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpF,CAAC,EACF;QACE,WAAW,EAAE,OAAO;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,GAAG,CAAC,aAAa,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpF,CACF,CAAC;IACF,kEAAkE;IAClE,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACnD,MAAM,EAAE,GAAG,eAAe,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAClD,YAAY,CAAC,QAAQ,CACnB,IAAI,SAAS,CAAC;QACZ,UAAU,EAAE,EAAE,CAAC,UAAU;QACzB,WAAW,EAAE,EAAE,CAAC,WAAW;QAC3B,cAAc,EAAE,UAAU,CAAC,cAAc,IAAI,aAAa;QAC1D,GAAG,CAAC,UAAU,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9E,CAAC,EACF;QACE,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,EAAE,CAAC,SAAS;QACvB,GAAG,CAAC,UAAU,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9E,CACF,CAAC;IACF,0FAA0F;IAC1F,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IACzD,MAAM,MAAM,GAAG,mBAAmB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAC9D,mEAAmE;IACnE,4EAA4E;IAC5E,wEAAwE;IACxE,2EAA2E;IAC3E,0EAA0E;IAC1E,aAAa;IACb,MAAM,0BAA0B,GAC9B,CAAC,cAAc,CAAC,oBAAoB,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC;IACtE,IAAI,0BAA0B,EAAE,CAAC;QAC/B,KAAK,uBAAuB,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE,CACxE,MAAM,CAAC,IAAI,CAAC,6CAA6C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CACxE,CAAC;IACJ,CAAC;IACD,YAAY,CAAC,QAAQ,CACnB,IAAI,aAAa,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,cAAc,EAAE,cAAc,CAAC,cAAc,IAAI,aAAa;QAC9D,GAAG,CAAC,0BAA0B;YAC5B,CAAC,CAAC;gBACE,YAAY,EAAE;oBACZ,KAAK,EAAE,SAAS,CAAC,KAAK;oBACtB,UAAU,EAAE,oBAAoB;oBAChC,GAAG,EAAE,GAAG,EAAE,CACR,SAAS,CAAC,IAAI,KAAK,SAAS;wBAC1B,CAAC,CAAC,oBAAoB,SAAS,CAAC,IAAI,sBAAsB;wBAC1D,CAAC,CAAC,SAAS;iBAChB;aACF;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,cAAc,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtF,CAAC,EACF;QACE,WAAW,EAAE,QAAQ;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,GAAG,CAAC,cAAc,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtF,CACF,CAAC;IACF,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;IAExB,8EAA8E;IAC9E,gFAAgF;IAChF,MAAM,UAAU,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAExC,MAAM,OAAO,GAAkB;QAC7B,OAAO,EAAE,cAAc;QACvB,SAAS;QACT,MAAM;QACN,KAAK;QACL,WAAW;QACX,QAAQ;QACR,eAAe;QACf,UAAU;QACV,WAAW;QACX,cAAc;QACd,YAAY;QACZ,QAAQ;QACR,MAAM;QACN,WAAW;QACX,MAAM;QACN,cAAc,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS;QAC1C,GAAG;KACJ,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE5B,MAAM,gBAAgB,GAAsB,EAAE,CAAC;IAC/C,IAAI,SAAsC,CAAC;IAC3C,IAAI,IAAgC,CAAC;IACrC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,wBAAwB,GAAG,IAAI,CAAC;IACtC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAC1C,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACtB,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACtC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEL,MAAM,CAAC,IAAI,CAAC,kBAAkB,cAAc,GAAG,CAAC,CAAC;IAEjD,OAAO;QACL,OAAO;QACP,MAAM;QACN,UAAU;QACV,MAAM,EAAE,GAAG,EAAE,CACX,iBAAiB,CAAC;YAChB,OAAO,EAAE,cAAc;YACvB,cAAc,EAAE,UAAU,CAAC,SAAS;YACpC,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,cAAc,EAAE,QAAQ,CAAC,KAAK;YAC9B,SAAS;YACT,GAAG,EAAE,GAAG,EAAE;SACX,CAAC;QACJ,iBAAiB,EAAE,GAAG,EAAE,CAAC,mBAAmB,EAAE;QAC9C,kBAAkB,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,WAAW,EAAE;QAC1D,YAAY,EAAE,KAAK,EAAE,SAAiB,EAAE,EAAE;YACxC,MAAM,IAAI,GAAG,GAA6B,EAAE,CAC1C,iBAAiB,CAAC;gBAChB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,SAAS;gBACT,WAAW,EAAE,WAAW,CAAC,QAAQ,CAAC,WAAW;gBAC7C,oBAAoB,EAAE,WAAW,CAAC,QAAQ,CAAC,oBAAoB;gBAC/D,WAAW,EAAE,QAAQ,EAAE;aACxB,CAAC,CAAC;YAEL,uEAAuE;YACvE,wEAAwE;YACxE,MAAM,KAAK,GAAG,KAAK,EAAE,UAA2B,EAAiB,EAAE;gBACjE,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC;gBAC5B,IAAI,CAAC;oBACH,MAAM,sBAAsB,CAAC;wBAC3B,EAAE,EAAE,UAAU,CAAC,EAAE;wBACjB,GAAG,EAAE,OAAO;wBACZ,MAAM;wBACN,WAAW;wBACX,UAAU;wBACV,WAAW,EAAE,QAAQ,EAAE;wBACvB,iBAAiB,EAAE,SAAS;qBAC7B,CAAC,CAAC;gBACL,CAAC;wBAAS,CAAC;oBACT,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBACjD,IAAI,GAAG,IAAI,CAAC;wBAAE,gBAAgB,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBAC9C,IAAI,CAAC;wBACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;oBACxB,CAAC;oBAAC,MAAM,CAAC;wBACP,oBAAoB;oBACtB,CAAC;oBACD,UAAU,CAAC,SAAS,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC,CAAC;YAEF,wEAAwE;YACxE,MAAM,OAAO,GAAG,MAAM,IAAI,EAAE,CAAC;YAC7B,uEAAuE;YACvE,0EAA0E;YAC1E,wEAAwE;YACxE,yEAAyE;YACzE,0BAA0B;YAC1B,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,IAAI,OAAO,GAAgC,OAAO,CAAC;gBACnD,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACjB,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,IAAI,CAAC;4BACH,OAAO,GAAG,MAAM,IAAI,EAAE,CAAC;wBACzB,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,MAAM,CAAC,IAAI,CACT,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC9E,CAAC;4BACF,MAAM,KAAK,CAAC,wBAAwB,CAAC,CAAC;4BACtC,SAAS;wBACX,CAAC;oBACH,CAAC;oBACD,oEAAoE;oBACpE,iEAAiE;oBACjE,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;oBACrB,OAAO,GAAG,SAAS,CAAC;gBACtB,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QACD,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnB,IAAI,SAAS;gBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;YAC/C,SAAS,GAAG,MAAM,cAAc,CAAC;gBAC/B,IAAI,EAAE,MAAM,CAAC,OAAO;gBACpB,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE;oBACnB,KAAK,sBAAsB,CAAC;wBAC1B,EAAE;wBACF,GAAG,EAAE,OAAO;wBACZ,MAAM;wBACN,WAAW;wBACX,UAAU;wBACV,WAAW,EAAE,QAAQ,EAAE;qBACxB,CAAC,CAAC;gBACL,CAAC;gBACD,6EAA6E;gBAC7E,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE;oBAC1B,IAAI,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;wBACvC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC;oBAC1D,CAAC;oBACD,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACjD,IAAI,CAAC,OAAO;wBAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE,EAAE,CAAC;oBACjF,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBACxC,CAAC;gBACD,yEAAyE;gBACzE,uEAAuE;gBACvE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;oBACpC,IAAI,KAAK,KAAK,SAAS,CAAC,KAAK;wBAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;oBACpF,MAAM,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAgC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACpF,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC,UAAU,CAAY,CAAC,CAAC,CAAC,EAAE,CAAC;oBACpF,IAAI,CAAC,QAAQ;wBAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,CAAC;oBACzE,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC,UAAU,CAAY,CAAC,CAAC,CAAC,MAAM,CAAC;oBACxF,MAAM,KAAK,GACT,CAAC,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ;wBAC1C,CAAC,CAAE,CAAC,CAAC,OAAO,CAA6B;wBACzC,CAAC,CAAC,EAAE,CAAC;oBACT,kEAAkE;oBAClE,iEAAiE;oBACjE,6DAA6D;oBAC7D,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;oBACnF,MAAM,YAAY,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;oBAC9D,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC;gBAC3D,CAAC;aACF,CAAC,CAAC;YACH,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,gCAAgC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9D,yEAAyE;YACzE,yEAAyE;YACzE,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;gBACxB,IAAI,GAAG,IAAI,cAAc,CAAC;oBACxB,YAAY,EAAE,IAAI;oBAClB,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;oBAC7C,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,SAAS,EAAE,UAAU,EAAE;oBACvB,GAAG,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE;oBAC7C,MAAM;iBACP,CAAC,CAAC;gBACH,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;QAClC,CAAC;QACD,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CACnC,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpE,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC/B,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC;YAC7B,KAAK,MAAM,UAAU,IAAI,gBAAgB,EAAE,CAAC;gBAC1C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;YACD,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;YAC5B,UAAU,CAAC,SAAS,GAAG,KAAK,CAAC;YAC7B,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,IAAI,EAAE,CAAC;gBACZ,IAAI,GAAG,SAAS,CAAC;YACnB,CAAC;YACD,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;gBACxB,SAAS,GAAG,SAAS,CAAC;YACxB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};