@blue-soda/dsh-remote 0.5.5 → 0.5.7

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 (232) hide show
  1. package/README.md +2 -2
  2. package/cordis.patch.yml +30 -30
  3. package/dist/client.github.js +1 -1
  4. package/dist/client.js +1 -1
  5. package/dist/index.js +371 -80
  6. package/dist/index.js.map +4 -4
  7. package/dsh-plugin.json +41 -41
  8. package/package.json +165 -165
  9. package/dist/acp.d.ts +0 -75
  10. package/dist/acp.d.ts.map +0 -1
  11. package/dist/acp.js +0 -61
  12. package/dist/acp.js.map +0 -1
  13. package/dist/api-proxy-switch.d.ts +0 -33
  14. package/dist/api-proxy-switch.d.ts.map +0 -1
  15. package/dist/api-proxy-switch.js +0 -109
  16. package/dist/api-proxy-switch.js.map +0 -1
  17. package/dist/atomic-file.d.ts +0 -16
  18. package/dist/atomic-file.d.ts.map +0 -1
  19. package/dist/atomic-file.js +0 -81
  20. package/dist/atomic-file.js.map +0 -1
  21. package/dist/bin/doctor.d.ts +0 -3
  22. package/dist/bin/doctor.d.ts.map +0 -1
  23. package/dist/bin/doctor.js +0 -13
  24. package/dist/bin/doctor.js.map +0 -1
  25. package/dist/cli.d.ts +0 -32
  26. package/dist/cli.d.ts.map +0 -1
  27. package/dist/cli.js +0 -289
  28. package/dist/cli.js.map +0 -1
  29. package/dist/client-runtime.d.ts +0 -375
  30. package/dist/client-runtime.d.ts.map +0 -1
  31. package/dist/client-runtime.js +0 -1768
  32. package/dist/client-runtime.js.map +0 -1
  33. package/dist/client-secure-transport.d.ts +0 -23
  34. package/dist/client-secure-transport.d.ts.map +0 -1
  35. package/dist/client-secure-transport.js +0 -144
  36. package/dist/client-secure-transport.js.map +0 -1
  37. package/dist/client-target-store.d.ts +0 -40
  38. package/dist/client-target-store.d.ts.map +0 -1
  39. package/dist/client-target-store.js +0 -79
  40. package/dist/client-target-store.js.map +0 -1
  41. package/dist/client.d.ts +0 -13
  42. package/dist/client.d.ts.map +0 -1
  43. package/dist/codex/app-server.d.ts +0 -71
  44. package/dist/codex/app-server.d.ts.map +0 -1
  45. package/dist/codex/app-server.js +0 -268
  46. package/dist/codex/app-server.js.map +0 -1
  47. package/dist/codex/codex-image-codec.d.ts +0 -7
  48. package/dist/codex/codex-image-codec.d.ts.map +0 -1
  49. package/dist/codex/codex-image-codec.js +0 -288
  50. package/dist/codex/codex-image-codec.js.map +0 -1
  51. package/dist/codex/domain.d.ts +0 -102
  52. package/dist/codex/domain.d.ts.map +0 -1
  53. package/dist/codex/domain.js +0 -1323
  54. package/dist/codex/domain.js.map +0 -1
  55. package/dist/codex/method-policy.d.ts +0 -338
  56. package/dist/codex/method-policy.d.ts.map +0 -1
  57. package/dist/codex/method-policy.js +0 -141
  58. package/dist/codex/method-policy.js.map +0 -1
  59. package/dist/codex/peer-bridge.d.ts +0 -57
  60. package/dist/codex/peer-bridge.d.ts.map +0 -1
  61. package/dist/codex/peer-bridge.js +0 -299
  62. package/dist/codex/peer-bridge.js.map +0 -1
  63. package/dist/codex/permissions.d.ts +0 -4
  64. package/dist/codex/permissions.d.ts.map +0 -1
  65. package/dist/codex/permissions.js +0 -21
  66. package/dist/codex/permissions.js.map +0 -1
  67. package/dist/codex/session-id.d.ts +0 -10
  68. package/dist/codex/session-id.d.ts.map +0 -1
  69. package/dist/codex/session-id.js +0 -15
  70. package/dist/codex/session-id.js.map +0 -1
  71. package/dist/codex/virtual-harness.d.ts +0 -209
  72. package/dist/codex/virtual-harness.d.ts.map +0 -1
  73. package/dist/codex/virtual-harness.js +0 -2650
  74. package/dist/codex/virtual-harness.js.map +0 -1
  75. package/dist/codex-workspace-bridge.d.ts +0 -108
  76. package/dist/codex-workspace-bridge.d.ts.map +0 -1
  77. package/dist/codex-workspace-bridge.js +0 -502
  78. package/dist/codex-workspace-bridge.js.map +0 -1
  79. package/dist/config.d.ts +0 -99
  80. package/dist/config.d.ts.map +0 -1
  81. package/dist/config.js +0 -127
  82. package/dist/config.js.map +0 -1
  83. package/dist/connection-controller.d.ts +0 -44
  84. package/dist/connection-controller.d.ts.map +0 -1
  85. package/dist/connection-controller.js +0 -185
  86. package/dist/connection-controller.js.map +0 -1
  87. package/dist/control-route.d.ts +0 -34
  88. package/dist/control-route.d.ts.map +0 -1
  89. package/dist/control-route.js +0 -136
  90. package/dist/control-route.js.map +0 -1
  91. package/dist/control-runtime.d.ts +0 -138
  92. package/dist/control-runtime.d.ts.map +0 -1
  93. package/dist/control-runtime.js +0 -543
  94. package/dist/control-runtime.js.map +0 -1
  95. package/dist/control-stream.d.ts +0 -67
  96. package/dist/control-stream.d.ts.map +0 -1
  97. package/dist/control-stream.js +0 -179
  98. package/dist/control-stream.js.map +0 -1
  99. package/dist/defaults.d.ts +0 -9
  100. package/dist/defaults.d.ts.map +0 -1
  101. package/dist/defaults.js +0 -9
  102. package/dist/defaults.js.map +0 -1
  103. package/dist/file-viewer-bridge.d.ts +0 -30
  104. package/dist/file-viewer-bridge.d.ts.map +0 -1
  105. package/dist/file-viewer-bridge.js +0 -128
  106. package/dist/file-viewer-bridge.js.map +0 -1
  107. package/dist/file-viewer-contract.d.ts +0 -5
  108. package/dist/file-viewer-contract.d.ts.map +0 -1
  109. package/dist/file-viewer-contract.js +0 -4
  110. package/dist/file-viewer-contract.js.map +0 -1
  111. package/dist/harness-api-bridge.d.ts +0 -81
  112. package/dist/harness-api-bridge.d.ts.map +0 -1
  113. package/dist/harness-api-bridge.js +0 -862
  114. package/dist/harness-api-bridge.js.map +0 -1
  115. package/dist/harness-api-history.d.ts +0 -3
  116. package/dist/harness-api-history.d.ts.map +0 -1
  117. package/dist/harness-api-history.js +0 -59
  118. package/dist/harness-api-history.js.map +0 -1
  119. package/dist/harness-remote-bridge.d.ts +0 -60
  120. package/dist/harness-remote-bridge.d.ts.map +0 -1
  121. package/dist/harness-remote-bridge.js +0 -540
  122. package/dist/harness-remote-bridge.js.map +0 -1
  123. package/dist/harness-version.d.ts +0 -23
  124. package/dist/harness-version.d.ts.map +0 -1
  125. package/dist/harness-version.js +0 -95
  126. package/dist/harness-version.js.map +0 -1
  127. package/dist/identity-store.d.ts +0 -45
  128. package/dist/identity-store.d.ts.map +0 -1
  129. package/dist/identity-store.js +0 -186
  130. package/dist/identity-store.js.map +0 -1
  131. package/dist/ids.d.ts +0 -2
  132. package/dist/ids.d.ts.map +0 -1
  133. package/dist/ids.js +0 -17
  134. package/dist/ids.js.map +0 -1
  135. package/dist/index.d.ts +0 -78
  136. package/dist/index.d.ts.map +0 -1
  137. package/dist/logging.d.ts +0 -18
  138. package/dist/logging.d.ts.map +0 -1
  139. package/dist/logging.js +0 -30
  140. package/dist/logging.js.map +0 -1
  141. package/dist/loopback-host.d.ts +0 -20
  142. package/dist/loopback-host.d.ts.map +0 -1
  143. package/dist/loopback-host.js +0 -245
  144. package/dist/loopback-host.js.map +0 -1
  145. package/dist/loopback-preview.d.ts +0 -19
  146. package/dist/loopback-preview.d.ts.map +0 -1
  147. package/dist/loopback-preview.js +0 -232
  148. package/dist/loopback-preview.js.map +0 -1
  149. package/dist/native-rtc-helper.d.ts +0 -14
  150. package/dist/native-rtc-helper.d.ts.map +0 -1
  151. package/dist/native-rtc-helper.js +0 -575
  152. package/dist/native-rtc-helper.js.map +0 -1
  153. package/dist/remote-api-proxy.d.ts +0 -17
  154. package/dist/remote-api-proxy.d.ts.map +0 -1
  155. package/dist/remote-api-proxy.js +0 -451
  156. package/dist/remote-api-proxy.js.map +0 -1
  157. package/dist/remote-directory-browser.d.ts +0 -16
  158. package/dist/remote-directory-browser.d.ts.map +0 -1
  159. package/dist/remote-directory-browser.js +0 -48
  160. package/dist/remote-directory-browser.js.map +0 -1
  161. package/dist/remote-file-content-provider.d.ts +0 -48
  162. package/dist/remote-file-content-provider.d.ts.map +0 -1
  163. package/dist/remote-file-content-provider.js +0 -93
  164. package/dist/remote-file-content-provider.js.map +0 -1
  165. package/dist/remote-typert-gateway.d.ts +0 -20
  166. package/dist/remote-typert-gateway.d.ts.map +0 -1
  167. package/dist/remote-typert-gateway.js +0 -334
  168. package/dist/remote-typert-gateway.js.map +0 -1
  169. package/dist/rpc-binary-attachments.d.ts +0 -33
  170. package/dist/rpc-binary-attachments.d.ts.map +0 -1
  171. package/dist/rpc-binary-attachments.js +0 -142
  172. package/dist/rpc-binary-attachments.js.map +0 -1
  173. package/dist/rpc-router.d.ts +0 -31
  174. package/dist/rpc-router.d.ts.map +0 -1
  175. package/dist/rpc-router.js +0 -201
  176. package/dist/rpc-router.js.map +0 -1
  177. package/dist/safe-error.d.ts +0 -8
  178. package/dist/safe-error.d.ts.map +0 -1
  179. package/dist/safe-error.js +0 -20
  180. package/dist/safe-error.js.map +0 -1
  181. package/dist/server-api.d.ts +0 -109
  182. package/dist/server-api.d.ts.map +0 -1
  183. package/dist/server-api.js +0 -520
  184. package/dist/server-api.js.map +0 -1
  185. package/dist/server-connection.d.ts +0 -79
  186. package/dist/server-connection.d.ts.map +0 -1
  187. package/dist/server-connection.js +0 -1023
  188. package/dist/server-connection.js.map +0 -1
  189. package/dist/server-credentials.d.ts +0 -55
  190. package/dist/server-credentials.d.ts.map +0 -1
  191. package/dist/server-credentials.js +0 -108
  192. package/dist/server-credentials.js.map +0 -1
  193. package/dist/service.d.ts +0 -151
  194. package/dist/service.d.ts.map +0 -1
  195. package/dist/service.js +0 -448
  196. package/dist/service.js.map +0 -1
  197. package/dist/session-format-compat.d.ts +0 -3
  198. package/dist/session-format-compat.d.ts.map +0 -1
  199. package/dist/session-format-compat.js +0 -183
  200. package/dist/session-format-compat.js.map +0 -1
  201. package/dist/status-stream.d.ts +0 -48
  202. package/dist/status-stream.d.ts.map +0 -1
  203. package/dist/status-stream.js +0 -133
  204. package/dist/status-stream.js.map +0 -1
  205. package/dist/terminal-policy.d.ts +0 -21
  206. package/dist/terminal-policy.d.ts.map +0 -1
  207. package/dist/terminal-policy.js +0 -68
  208. package/dist/terminal-policy.js.map +0 -1
  209. package/dist/tui-command.d.ts +0 -13
  210. package/dist/tui-command.d.ts.map +0 -1
  211. package/dist/tui-command.js +0 -392
  212. package/dist/tui-command.js.map +0 -1
  213. package/dist/typert-gateway-contract.d.ts +0 -59
  214. package/dist/typert-gateway-contract.d.ts.map +0 -1
  215. package/dist/typert-gateway-contract.js +0 -2
  216. package/dist/typert-gateway-contract.js.map +0 -1
  217. package/dist/typert-gateway-switch.d.ts +0 -85
  218. package/dist/typert-gateway-switch.d.ts.map +0 -1
  219. package/dist/typert-gateway-switch.js +0 -448
  220. package/dist/typert-gateway-switch.js.map +0 -1
  221. package/dist/types.d.ts +0 -20
  222. package/dist/types.d.ts.map +0 -1
  223. package/dist/types.js +0 -2
  224. package/dist/types.js.map +0 -1
  225. package/dist/version.d.ts +0 -12
  226. package/dist/version.d.ts.map +0 -1
  227. package/dist/version.js +0 -12
  228. package/dist/version.js.map +0 -1
  229. package/dist/werift-rtc.d.ts +0 -121
  230. package/dist/werift-rtc.d.ts.map +0 -1
  231. package/dist/werift-rtc.js +0 -490
  232. package/dist/werift-rtc.js.map +0 -1
package/dist/service.js DELETED
@@ -1,448 +0,0 @@
1
- import { LoopbackHost } from './loopback-host.js';
2
- import { TerminalPolicy } from './terminal-policy.js';
3
- import { randomUUID } from 'node:crypto';
4
- import { createEvent } from '@dsh-remote/protocol';
5
- import { ConnectionController } from './connection-controller.js';
6
- import { harnessSessionGeneration, normalizeHarnessVersion, readHarnessDistributionVersion, selectHarnessVersion, } from './harness-version.js';
7
- import { RpcRouter } from './rpc-router.js';
8
- import { RemoteFileViewerBridge } from './file-viewer-bridge.js';
9
- import { HostServerApi, ServerApiError, } from './server-api.js';
10
- import { HostServerConnection } from './server-connection.js';
11
- import { ServerCredentialStore } from './server-credentials.js';
12
- import { HarnessApiBridge } from './harness-api-bridge.js';
13
- import { HarnessRemoteBridge } from './harness-remote-bridge.js';
14
- import { loadNodeRtcFactory } from './werift-rtc.js';
15
- import { CodexRemoteDomain } from './codex/domain.js';
16
- import { AcpGateway, StdioAcpAdapter } from './acp.js';
17
- import { execFileSync } from 'node:child_process';
18
- import { RpcError } from './safe-error.js';
19
- import { CodexWorkspaceBridge, CodexWorkspaceState } from './codex-workspace-bridge.js';
20
- export class HostPluginRuntime {
21
- config;
22
- identities;
23
- apiProxy;
24
- logger;
25
- localGateway;
26
- fileViewerHost;
27
- terminalSpawner;
28
- connections;
29
- terminalOwners = new Map();
30
- loopbackHosts = new Set();
31
- terminalEnabled;
32
- loopbackPorts;
33
- identity;
34
- serverApi;
35
- serverConnection;
36
- /**
37
- * Whether the user asked this machine to stay unreachable.
38
- *
39
- * Pausing keeps the credentials and the device identity: it only stops the
40
- * outbound connection, so resuming needs no re-authorization and consumes no
41
- * device identity, unlike clearing the authorization.
42
- */
43
- paused;
44
- /**
45
- * Whether start() has finished wiring the Server connection.
46
- *
47
- * The Codex domain is optional business that waits on an external binary, so it runs in the
48
- * background; without this flag a Host that is merely still starting would report itself as
49
- * offline and look broken to the user and to other clients.
50
- */
51
- starting = true;
52
- harnessVersion;
53
- closed = false;
54
- codex;
55
- codexWorkspaceState = new CodexWorkspaceState();
56
- localCodexPeer;
57
- localCodexPublish = async () => undefined;
58
- constructor(config, identities, apiProxy, logger, localGateway, fileViewerHost,
59
- /** PTY-backed terminal provider from the Host `subprocess` service, when present. */
60
- terminalSpawner) {
61
- this.config = config;
62
- this.identities = identities;
63
- this.apiProxy = apiProxy;
64
- this.logger = logger;
65
- this.localGateway = localGateway;
66
- this.fileViewerHost = fileViewerHost;
67
- this.terminalSpawner = terminalSpawner;
68
- this.terminalEnabled = config.terminal.enabled;
69
- this.loopbackPorts = [...config.loopback.ports];
70
- // Honour a pause recorded by an earlier run, so "do not connect me" is not
71
- // silently undone by restarting DSH.
72
- this.paused = config.hostControl?.paused === true;
73
- this.codex = new CodexRemoteDomain(config.codex, logger);
74
- this.connections = new ConnectionController(this.identities, (context, send) => {
75
- const harnessApi = this.apiProxy === undefined
76
- ? undefined
77
- : new HarnessApiBridge(this.apiProxy, (event, data) => send(createEvent(event, data)), undefined, this.logger, this.localGateway, this.harnessVersion);
78
- const harnessRemote = this.localGateway?.supportsCarrier === true
79
- ? new HarnessRemoteBridge(this.localGateway, (event, data) => send(createEvent(event, data)), this.logger, this.harnessVersion, new TerminalPolicy(() => this.terminalEnabled, context.peerDeviceId, this.terminalOwners), new CodexWorkspaceBridge((threadId, signal) => this.codex.resolveThreadWorkspace(context.connectionId, threadId), () => this.terminalEnabled, this.codexWorkspaceState, this.terminalSpawner))
80
- : undefined;
81
- const fileViewer = new RemoteFileViewerBridge(() => this.fileViewerHost?.(), this.logger);
82
- const codex = this.codex.createPeer(context, (event, data) => send(createEvent(event, data)));
83
- const adapters = (config.acp?.backends ?? []).filter(item => item.enabled && this.acpAvailable(item.command)).map(item => new StdioAcpAdapter(item));
84
- const acp = config.acp?.enabled && adapters.length > 0 ? new AcpGateway(adapters) : undefined;
85
- return new RpcRouter(harnessApi, undefined, this.logger, fileViewer, harnessRemote, () => this.hostCapabilities(), codex, acp,
86
- // Handles and their lifetime belong to this connection; only policy is shared.
87
- this.createLoopbackHost());
88
- }, this.logger);
89
- if (config.serverUrl !== undefined) {
90
- this.serverApi = new HostServerApi(config.serverUrl, new ServerCredentialStore(identities.directory));
91
- }
92
- }
93
- setTerminalEnabled(enabled) {
94
- this.terminalEnabled = enabled;
95
- }
96
- setLoopbackPorts(ports) {
97
- this.loopbackPorts = [...ports];
98
- for (const loopback of this.loopbackHosts)
99
- loopback.setPorts(this.loopbackPorts);
100
- }
101
- createLoopbackHost() {
102
- let loopback;
103
- loopback = new LoopbackHost(() => this.loopbackPorts, () => this.loopbackHosts.delete(loopback));
104
- this.loopbackHosts.add(loopback);
105
- return loopback;
106
- }
107
- async start() {
108
- if (this.closed)
109
- throw new Error('remote runtime is closed');
110
- this.identity = await this.identities.loadOrCreate(this.config.deviceName);
111
- this.logger.info('host identity ready', {
112
- deviceId: shortId(this.identity.deviceId),
113
- fingerprint: this.identity.fingerprint,
114
- server: this.config.serverUrl ?? 'not configured',
115
- });
116
- if (this.serverApi !== undefined) {
117
- this.harnessVersion = await this.readHarnessVersion();
118
- this.serverApi.setHarnessVersion(this.harnessVersion);
119
- this.serverApi.bindIdentity(this.identity);
120
- this.serverConnection = this.createServerConnection(this.identity);
121
- // A paused installation stays quiet until the user resumes it; a restart
122
- // must not turn a paused machine reachable again.
123
- if (!this.paused)
124
- this.serverConnection.start();
125
- }
126
- this.starting = false;
127
- // Awaiting the Codex domain here used to delay the Server connection - and with it every
128
- // remote client - by the whole Codex start budget on a machine whose Codex install is missing
129
- // or broken. It is optional business, so it starts in the background and reports through
130
- // codex.status(); its failure never prevents this Host from being reachable.
131
- void this.codex.start().catch(() => {
132
- // start() already records its own failure in the domain status.
133
- });
134
- }
135
- currentIdentity() {
136
- if (this.identity === undefined)
137
- throw new Error('remote runtime has not started');
138
- return this.identity;
139
- }
140
- acceptAuthenticatedPeer(channel) {
141
- this.currentIdentity();
142
- return this.connections.accept(channel);
143
- }
144
- hostStatus() {
145
- const error = this.serverConnection?.lastError();
146
- const authorization = this.serverApi?.currentAuthorization();
147
- return {
148
- ...(this.identity === undefined ? {} : { deviceId: this.identity.deviceId }),
149
- configured: this.serverApi !== undefined,
150
- online: this.serverConnection?.isOnline() ?? false,
151
- reconnecting: this.serverConnection?.isReconnecting() ?? false,
152
- starting: this.starting,
153
- ...(this.serverConnection?.lastActivity() === undefined
154
- ? {}
155
- : { lastActiveAt: this.serverConnection.lastActivity() }),
156
- ...(error === undefined ? {} : { error }),
157
- ...(authorization?.account === undefined ? {} : { account: authorization.account }),
158
- authorized: authorization !== undefined,
159
- accountRequired: error === 'ACCOUNT_AUTH_REQUIRED' || error === 'AUTH_INVALID' || error === 'TOKEN_EXPIRED',
160
- paused: this.paused,
161
- connectedClients: this.listConnectedClients(),
162
- };
163
- }
164
- async hasStoredAuthorization() {
165
- return this.serverApi?.hasStoredAuthorization() ?? false;
166
- }
167
- listConnectedClients() {
168
- return this.connections.connectedPeers().map(peer => {
169
- const trusted = this.identities.trustedPeer(peer.deviceId);
170
- return {
171
- deviceId: peer.deviceId,
172
- name: trusted?.name.trim() ?? '',
173
- ...(trusted === undefined ? {} : { platform: trusted.platform }),
174
- ...(peer.mode === undefined ? {} : { mode: peer.mode }),
175
- };
176
- });
177
- }
178
- localHarnessVersion() {
179
- return this.harnessVersion;
180
- }
181
- /**
182
- * Stop this machine from being reachable without releasing its authorization.
183
- *
184
- * Clearing the authorization revokes the device and rotates its identity, so a
185
- * user who only wants to stop being remotely reachable would have to authorize
186
- * again and would consume a device identity. Pausing closes the connection and
187
- * keeps both.
188
- */
189
- async pauseHostConnection() {
190
- this.paused = true;
191
- await this.serverConnection?.stop();
192
- this.logger.info('Host connection paused');
193
- }
194
- /** Resume a paused connection with the same credentials and identity. */
195
- async resumeHostConnection() {
196
- const wasPaused = this.paused;
197
- this.paused = false;
198
- this.serverConnection?.resume();
199
- if (wasPaused)
200
- this.logger.info('Host connection resumed');
201
- }
202
- isPaused() { return this.paused; }
203
- reconnectHost() {
204
- if (this.closed)
205
- throw new Error('remote runtime is closed');
206
- if (this.serverConnection === undefined) {
207
- throw new ServerApiError('SERVER_NOT_CONFIGURED', 'Configure serverUrl before reconnecting.', false);
208
- }
209
- // Asking to reconnect is explicit: it lifts a pause rather than being
210
- // swallowed by it, so the button always has an effect.
211
- this.paused = false;
212
- this.serverConnection.reconnect();
213
- }
214
- async startHostOAuthQrLogin(provider) {
215
- if (this.serverApi === undefined) {
216
- throw new ServerApiError('SERVER_NOT_CONFIGURED', 'Remote Host Server is unavailable.', false);
217
- }
218
- return this.serverApi.startOAuthQrLogin(provider);
219
- }
220
- async pollHostOAuthQrLogin(qrId) {
221
- if (this.serverApi === undefined) {
222
- throw new ServerApiError('SERVER_NOT_CONFIGURED', 'Remote Host Server is unavailable.', false);
223
- }
224
- const result = await this.serverApi.pollOAuthQrLogin(this.currentIdentity(), qrId, async () => {
225
- await this.serverConnection?.stop();
226
- this.identity = await this.identities.reset(this.config.deviceName);
227
- this.serverApi.bindIdentity(this.identity);
228
- this.serverConnection = this.createServerConnection(this.identity);
229
- return this.identity;
230
- });
231
- if (result.status === 'complete') {
232
- this.serverConnection?.reconnect();
233
- this.logger.info('Host account authorized through OAuth QR login');
234
- }
235
- return result;
236
- }
237
- /**
238
- * Stop this Host from being authorized, keeping its device identity.
239
- *
240
- * Revoking the device here would force a new identity on the next sign-in and
241
- * register a second device for the same installation. An account holds at most
242
- * 256 devices and the count only grows for new identities, so signing out
243
- * often enough could exhaust it. The credentials themselves are cleared by the
244
- * caller; this device simply stops authenticating.
245
- */
246
- async clearHostAuthorization() {
247
- await this.serverConnection?.stop();
248
- // Clearing the stored credential is not enough: this API caches the
249
- // authorization in memory too, and the stale copy keeps reporting the Host as
250
- // authorized. That makes `authorizeHostByDefault()` skip re-authorization and
251
- // leaves the connection retrying tokens the Server no longer accepts.
252
- await this.serverApi?.clearAuthorization();
253
- // The connection survives, bound to the identity it keeps.
254
- if (this.serverApi !== undefined && this.identity !== undefined) {
255
- this.serverConnection = this.createServerConnection(this.identity);
256
- }
257
- this.logger.info('Host authorization cleared');
258
- }
259
- async authorizeHostAsOwned(accessToken, account) {
260
- if (this.serverApi === undefined) {
261
- throw new ServerApiError('SERVER_NOT_CONFIGURED', 'Configure serverUrl before enabling Host access.', false);
262
- }
263
- let result;
264
- try {
265
- result = await this.serverApi.authorizeOwnedRole(this.currentIdentity(), accessToken, account);
266
- }
267
- catch (error) {
268
- if (!(error instanceof ServerApiError) || error.code !== 'DEVICE_REVOKED')
269
- throw error;
270
- await this.serverConnection?.stop();
271
- this.identity = await this.identities.reset(this.config.deviceName);
272
- this.serverApi.bindIdentity(this.identity);
273
- this.serverConnection = this.createServerConnection(this.identity);
274
- result = await this.serverApi.authorizeOwnedRole(this.identity, accessToken, account);
275
- this.logger.info('Rotated revoked Host identity before owned-device authorization');
276
- }
277
- // An authorization does not lift an explicit pause: the UI shows the paused
278
- // state with its own resume action, so the user's choice stays in force.
279
- if (!this.paused)
280
- this.serverConnection?.resume();
281
- this.logger.info('Host authorized as an owned device');
282
- return result;
283
- }
284
- async authorizeHostWithAccount(email, password) {
285
- if (this.serverApi === undefined) {
286
- throw new ServerApiError('SERVER_NOT_CONFIGURED', 'Configure serverUrl before signing in.', false);
287
- }
288
- const result = await this.serverApi.authorizeWithAccount(this.currentIdentity(), email, password);
289
- // An authorization does not lift an explicit pause: the UI shows the paused
290
- // state with its own resume action, so the user's choice stays in force.
291
- if (!this.paused)
292
- this.serverConnection?.resume();
293
- this.logger.info('Host account authorized');
294
- return result;
295
- }
296
- async authorizeHostWithCode(code) {
297
- if (this.serverApi === undefined) {
298
- throw new ServerApiError('SERVER_NOT_CONFIGURED', 'Configure serverUrl before entering a Host registration code.', false);
299
- }
300
- const result = await this.serverApi.authorizeHostWithCode(this.currentIdentity(), code);
301
- // An authorization does not lift an explicit pause: the UI shows the paused
302
- // state with its own resume action, so the user's choice stays in force.
303
- if (!this.paused)
304
- this.serverConnection?.resume();
305
- this.logger.info('Host registration code authorized');
306
- return result;
307
- }
308
- async revokePeer(deviceId) {
309
- const revoked = await this.identities.revokePeer(deviceId);
310
- if (revoked)
311
- await this.connections.revoke(deviceId);
312
- return revoked;
313
- }
314
- codexStatus() {
315
- return this.codex.status();
316
- }
317
- codexCall(input) {
318
- return this.requireLocalCodexPeer().call(input);
319
- }
320
- codexRespond(input) {
321
- return this.requireLocalCodexPeer().respond(input);
322
- }
323
- codexOpenStream(input, publish) {
324
- this.localCodexPublish = publish;
325
- return this.requireLocalCodexPeer().openStream(input);
326
- }
327
- async codexCloseStream(input) {
328
- const peer = this.localCodexPeer;
329
- if (peer !== undefined)
330
- return peer.closeStream(input);
331
- const streamId = isPlainRecord(input) && typeof input.streamId === 'string' ? input.streamId : undefined;
332
- if (streamId === undefined)
333
- throw new RpcError('INVALID_MESSAGE', 'A Codex stream is required.');
334
- return { closed: false, streamId };
335
- }
336
- async close() {
337
- if (this.closed)
338
- return;
339
- this.closed = true;
340
- await this.serverConnection?.stop();
341
- await this.connections.close();
342
- await this.localCodexPeer?.closeAll();
343
- this.localCodexPeer = undefined;
344
- await this.codex.close();
345
- this.logger.info('host runtime stopped');
346
- }
347
- diagnostics() {
348
- return {
349
- loaded: this.identity !== undefined,
350
- deviceId: this.identity === undefined ? undefined : shortId(this.identity.deviceId),
351
- identityValid: this.identity !== undefined,
352
- serverConfigured: this.config.serverUrl !== undefined,
353
- serverOnline: this.serverConnection?.isOnline() ?? false,
354
- serverError: this.serverConnection?.lastError(),
355
- online: this.connections.isOnline(),
356
- activeConnections: this.connections.connectionCount(),
357
- peerDeviceId: this.connections.peerDeviceId() === undefined ? undefined : shortId(this.connections.peerDeviceId()),
358
- peerDeviceIds: this.connections.peerDeviceIds().map(shortId),
359
- trustedPeers: this.identities.listTrustedPeers().length,
360
- capabilities: this.hostCapabilities(),
361
- codex: this.codex.status(),
362
- };
363
- }
364
- createServerConnection(identity) {
365
- return new HostServerConnection(this.config, identity, this.identities, this.serverApi, this.connections, this.logger, undefined, this.config.forceRelay
366
- ? undefined
367
- : () => loadNodeRtcFactory({ routeTargets: this.config.serverUrl === undefined ? [] : [this.config.serverUrl] }), () => this.hostCapabilities(), this.harnessVersion);
368
- }
369
- async readHarnessVersion() {
370
- let reportedVersion;
371
- let errorCode;
372
- try {
373
- const response = await this.apiProxy?.host.describe({ rpcId: randomUUID(), payload: {} });
374
- if (response === undefined)
375
- throw new Error('ApiProxy is unavailable');
376
- if (!response.result.ok) {
377
- errorCode = response.result.error.code;
378
- }
379
- else {
380
- reportedVersion = normalizeHarnessVersion(response.result.value.version);
381
- }
382
- }
383
- catch {
384
- // Older Harness builds may not expose host.describe.
385
- }
386
- const distributionVersion = reportedVersion === undefined || reportedVersion === '0.0.1'
387
- ? await readHarnessDistributionVersion()
388
- : undefined;
389
- const version = selectHarnessVersion(reportedVersion, distributionVersion);
390
- if (version !== undefined)
391
- return version;
392
- this.logger.warn('Harness version is unavailable', errorCode === undefined ? undefined : { code: errorCode });
393
- return undefined;
394
- }
395
- hostCapabilities() {
396
- const capabilities = [];
397
- if (this.loopbackPorts.length > 0)
398
- capabilities.push('loopback.http-ws.v1');
399
- if (this.localGateway?.supportsCarrier === true) {
400
- capabilities.push(harnessSessionGeneration(this.harnessVersion) === 'v3' ? 'harness.remote.v3' : 'harness.remote.v1', 'harness.remote.transfer.v1');
401
- }
402
- if (this.localGateway?.supportsCarrier && this.terminalEnabled)
403
- capabilities.push('harness.terminal.v1');
404
- if (this.apiProxy !== undefined) {
405
- capabilities.push('harness.api.v1', 'harness.api.transfer.v1');
406
- }
407
- if (this.fileViewerHost?.() !== undefined)
408
- capabilities.push('fileviewer.read.v1');
409
- if (this.codex.isAvailable())
410
- capabilities.push('codex.appserver.v1', 'codex.appserver.transfer.v1');
411
- if (this.config.acp?.enabled)
412
- for (const item of this.config.acp.backends)
413
- if (item.enabled && this.acpAvailable(item.command))
414
- capabilities.push(`agent.acp.v1.${item.id}`);
415
- return capabilities;
416
- }
417
- acpAvailable(command) {
418
- try {
419
- execFileSync(process.platform === 'win32' ? 'where' : 'which', [command], { stdio: 'ignore' });
420
- return true;
421
- }
422
- catch {
423
- return false;
424
- }
425
- }
426
- requireLocalCodexPeer() {
427
- if (!this.codex.isAvailable()) {
428
- throw new RpcError('CODEX_UNAVAILABLE', 'Local CodeX is disabled or unavailable on this Host.');
429
- }
430
- if (this.localCodexPeer !== undefined)
431
- return this.localCodexPeer;
432
- const identity = this.currentIdentity();
433
- const peer = this.codex.createPeer({
434
- connectionId: `loopback:${identity.deviceId}`,
435
- peerDeviceId: identity.deviceId,
436
- }, (event, data) => this.localCodexPublish(event, data));
437
- if (peer === undefined) {
438
- throw new RpcError('CODEX_UNAVAILABLE', 'Local CodeX is disabled or unavailable on this Host.');
439
- }
440
- this.localCodexPeer = peer;
441
- return peer;
442
- }
443
- }
444
- function shortId(value) { return value.length <= 12 ? value : `${value.slice(0, 8)}…${value.slice(-4)}`; }
445
- function isPlainRecord(value) {
446
- return typeof value === 'object' && value !== null && !Array.isArray(value);
447
- }
448
- //# sourceMappingURL=service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAGjE,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,8BAA8B,EAC9B,oBAAoB,GACrB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,sBAAsB,EAAkC,MAAM,yBAAyB,CAAA;AAChG,OAAO,EACL,aAAa,EACb,cAAc,GAKf,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAA0B,MAAM,yBAAyB,CAAA;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAA8B,MAAM,6BAA6B,CAAA;AA0BnH,MAAM,OAAO,iBAAiB;IAiCT;IACA;IACA;IACA;IACA;IACA;IAEA;IAvCV,WAAW,CAAsB;IACzB,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC1C,aAAa,GAAG,IAAI,GAAG,EAAgB,CAAA;IAChD,eAAe,CAAS;IACxB,aAAa,CAAmB;IAChC,QAAQ,CAAe;IACd,SAAS,CAAgB;IAClC,gBAAgB,CAAuB;IAC/C;;;;;;OAMG;IACK,MAAM,CAAS;IACvB;;;;;;OAMG;IACK,QAAQ,GAAG,IAAI,CAAA;IACf,cAAc,CAAS;IACvB,MAAM,GAAG,KAAK,CAAA;IACL,KAAK,CAAmB;IACxB,mBAAmB,GAAG,IAAI,mBAAmB,EAAE,CAAA;IACxD,cAAc,CAAkB;IAChC,iBAAiB,GAAsB,KAAK,IAAI,EAAE,CAAC,SAAS,CAAA;IAEpE,YACmB,MAAsB,EACtB,UAAyB,EACzB,QAA8B,EAC9B,MAAkB,EAClB,YAAiC,EACjC,cAA4D;IAC7E,qFAAqF;IACpE,eAAuC;QAPvC,WAAM,GAAN,MAAM,CAAgB;QACtB,eAAU,GAAV,UAAU,CAAe;QACzB,aAAQ,GAAR,QAAQ,CAAsB;QAC9B,WAAM,GAAN,MAAM,CAAY;QAClB,iBAAY,GAAZ,YAAY,CAAqB;QACjC,mBAAc,GAAd,cAAc,CAA8C;QAE5D,oBAAe,GAAf,eAAe,CAAwB;QAExD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAA;QAC9C,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC/C,2EAA2E;QAC3E,qCAAqC;QACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;QACjD,IAAI,CAAC,KAAK,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACxD,IAAI,CAAC,WAAW,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;YAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,KAAK,SAAS;gBAC5C,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,IAAI,gBAAgB,CAClB,IAAI,CAAC,QAAQ,EACb,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAC/C,SAAS,EACT,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,YAA6C,EAClD,IAAI,CAAC,cAAc,CACpB,CAAA;YACL,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,eAAe,KAAK,IAAI;gBAC/D,CAAC,CAAC,IAAI,mBAAmB,CACrB,IAAI,CAAC,YAAY,EACjB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAC/C,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,cAAc,EACnB,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,EACzF,IAAI,oBAAoB,CACtB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,EACvF,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAC1B,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,eAAe,CACrB,CACF;gBACH,CAAC,CAAC,SAAS,CAAA;YACb,MAAM,UAAU,GAAG,IAAI,sBAAsB,CAC3C,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,EAC7B,IAAI,CAAC,MAAM,CACZ,CAAA;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CACjC,OAAO,EACP,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAChD,CAAA;YACD,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAA;YACpJ,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,OAAO,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAC7F,OAAO,IAAI,SAAS,CAClB,UAAU,EACV,SAAS,EACT,IAAI,CAAC,MAAM,EACX,UAAU,EACV,aAAa,EACb,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAC7B,KAAK,EACL,GAAG;YACH,+EAA+E;YAC/E,IAAI,CAAC,kBAAkB,EAAE,CAC1B,CAAA;QACH,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACf,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,qBAAqB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAA;QACvG,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,OAAgB;QACjC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAA;IAChC,CAAC;IAED,gBAAgB,CAAC,KAAwB;QACvC,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,KAAK,CAAC,CAAA;QAC/B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,aAAa;YAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAClF,CAAC;IAEO,kBAAkB;QACxB,IAAI,QAAsB,CAAA;QAC1B,QAAQ,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;QAChG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAChC,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;QAC5D,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAC1E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE;YACtC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACzC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW;YACtC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,gBAAgB;SAClD,CAAC,CAAA;QACF,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,cAAc,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAA;YACrD,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;YACrD,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC1C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClE,yEAAyE;YACzE,kDAAkD;YAClD,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAA;QACjD,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAA;QACrB,yFAAyF;QACzF,8FAA8F;QAC9F,yFAAyF;QACzF,6EAA6E;QAC7E,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;YACjC,gEAAgE;QAClE,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,eAAe;QACb,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QAClF,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED,uBAAuB,CAAC,OAAiC;QACvD,IAAI,CAAC,eAAe,EAAE,CAAA;QACtB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACzC,CAAC;IAED,UAAU;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,SAAS,EAAE,CAAA;QAChD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,EAAE,CAAA;QAC5D,OAAO;YACL,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAC5E,UAAU,EAAE,IAAI,CAAC,SAAS,KAAK,SAAS;YACxC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,EAAE,IAAI,KAAK;YAClD,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,cAAc,EAAE,IAAI,KAAK;YAC9D,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,YAAY,EAAE,KAAK,SAAS;gBACrD,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,EAAE,CAAC;YAC3D,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;YACzC,GAAG,CAAC,aAAa,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,CAAC;YACnF,UAAU,EAAE,aAAa,KAAK,SAAS;YACvC,eAAe,EAAE,KAAK,KAAK,uBAAuB,IAAI,KAAK,KAAK,cAAc,IAAI,KAAK,KAAK,eAAe;YAC3G,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,gBAAgB,EAAE,IAAI,CAAC,oBAAoB,EAAE;SAC9C,CAAA;IACH,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,OAAO,IAAI,CAAC,SAAS,EAAE,sBAAsB,EAAE,IAAI,KAAK,CAAA;IAC1D,CAAC;IAEO,oBAAoB;QAC1B,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAClD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC1D,OAAO;gBACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;gBAChC,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAChE,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;aACxD,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC,cAAc,CAAA;IAC5B,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,mBAAmB;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,MAAM,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAA;QACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;IAC5C,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,oBAAoB;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAA;QAC7B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;QAC/B,IAAI,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;IAC5D,CAAC;IAED,QAAQ,KAAc,OAAO,IAAI,CAAC,MAAM,CAAA,CAAC,CAAC;IAE1C,aAAa;QACX,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;QAC5D,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACxC,MAAM,IAAI,cAAc,CAAC,uBAAuB,EAAE,0CAA0C,EAAE,KAAK,CAAC,CAAA;QACtG,CAAC;QACD,sEAAsE;QACtE,uDAAuD;QACvD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,QAAuB;QACjD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,cAAc,CAAC,uBAAuB,EAAE,oCAAoC,EAAE,KAAK,CAAC,CAAA;QAChG,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACnD,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAY;QACrC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,cAAc,CAAC,uBAAuB,EAAE,oCAAoC,EAAE,KAAK,CAAC,CAAA;QAChG,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;YAC5F,MAAM,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAA;YACnC,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;YACnE,IAAI,CAAC,SAAU,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC3C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClE,OAAO,IAAI,CAAC,QAAQ,CAAA;QACtB,CAAC,CAAC,CAAA;QACF,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,IAAI,CAAC,gBAAgB,EAAE,SAAS,EAAE,CAAA;YAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;QACpE,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,sBAAsB;QAC1B,MAAM,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAA;QACnC,oEAAoE;QACpE,8EAA8E;QAC9E,8EAA8E;QAC9E,sEAAsE;QACtE,MAAM,IAAI,CAAC,SAAS,EAAE,kBAAkB,EAAE,CAAA;QAC1C,2DAA2D;QAC3D,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACpE,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;IAChD,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,WAAmB,EAAE,OAAgB;QAC9D,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,cAAc,CAAC,uBAAuB,EAAE,kDAAkD,EAAE,KAAK,CAAC,CAAA;QAC9G,CAAC;QACD,IAAI,MAAM,CAAA;QACV,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;QAChG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,cAAc,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;gBAAE,MAAM,KAAK,CAAA;YACtF,MAAM,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAA;YACnC,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;YACnE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC1C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClE,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;YACrF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAA;QACrF,CAAC;QACD,4EAA4E;QAC5E,yEAAyE;QACzE,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;QACtD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,KAAa,EAAE,QAAgB;QAC5D,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,cAAc,CAAC,uBAAuB,EAAE,wCAAwC,EAAE,KAAK,CAAC,CAAA;QACpG,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;QACjG,4EAA4E;QAC5E,yEAAyE;QACzE,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;QAC3C,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,IAAY;QACtC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,cAAc,CAAC,uBAAuB,EAAE,+DAA+D,EAAE,KAAK,CAAC,CAAA;QAC3H,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,CAAA;QACvF,4EAA4E;QAC5E,yEAAyE;QACzE,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;QACrD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QAC1D,IAAI,OAAO;YAAE,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACpD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAA;IAC5B,CAAC;IAED,SAAS,CAAC,KAAc;QACtB,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACjD,CAAC;IAED,YAAY,CAAC,KAAc;QACzB,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACpD,CAAC;IAED,eAAe,CAAC,KAAc,EAAE,OAA0B;QACxD,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAA;QAChC,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;IACvD,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,KAAc;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAA;QAChC,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QACtD,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;QACxG,IAAI,QAAQ,KAAK,SAAS;YAAE,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,6BAA6B,CAAC,CAAA;QAChG,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM;YAAE,OAAM;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,MAAM,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAA;QACnC,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAA;QAC9B,MAAM,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,CAAA;QACrC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAA;QAC/B,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;IAC1C,CAAC;IAED,WAAW;QACT,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,QAAQ,KAAK,SAAS;YACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACnF,aAAa,EAAE,IAAI,CAAC,QAAQ,KAAK,SAAS;YAC1C,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS;YACrD,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,EAAE,IAAI,KAAK;YACxD,WAAW,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,EAAE;YAC/C,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;YACnC,iBAAiB,EAAE,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;YACrD,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,EAAG,CAAC;YACnH,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC;YAC5D,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,MAAM;YACvD,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE;YACrC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;SAC3B,CAAA;IACH,CAAC;IAEO,sBAAsB,CAAC,QAAsB;QACnD,OAAO,IAAI,oBAAoB,CAC7B,IAAI,CAAC,MAAM,EACX,QAAQ,EACR,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,SAAU,EACf,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,MAAM,EACX,SAAS,EACT,IAAI,CAAC,MAAM,CAAC,UAAU;YACpB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EAClH,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAC7B,IAAI,CAAC,cAAc,CACpB,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,kBAAkB;QAC9B,IAAI,eAAmC,CAAA;QACvC,IAAI,SAA6B,CAAA;QACjC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,UAAU,EAAW,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;YAClG,IAAI,QAAQ,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;YACtE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACxB,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAA;YACxC,CAAC;iBAAM,CAAC;gBACN,eAAe,GAAG,uBAAuB,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC1E,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qDAAqD;QACvD,CAAC;QACD,MAAM,mBAAmB,GAAG,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,OAAO;YACtF,CAAC,CAAC,MAAM,8BAA8B,EAAE;YACxC,CAAC,CAAC,SAAS,CAAA;QACb,MAAM,OAAO,GAAG,oBAAoB,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAA;QAC1E,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,OAAO,CAAA;QACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;QAC7G,OAAO,SAAS,CAAA;IAClB,CAAC;IAEO,gBAAgB;QACtB,MAAM,YAAY,GAAa,EAAE,CAAA;QACjC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;YAAE,YAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;QAC3E,IAAI,IAAI,CAAC,YAAY,EAAE,eAAe,KAAK,IAAI,EAAE,CAAC;YAChD,YAAY,CAAC,IAAI,CACf,wBAAwB,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,EAClG,4BAA4B,CAC7B,CAAA;QACH,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,EAAE,eAAe,IAAI,IAAI,CAAC,eAAe;YAAE,YAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;QACxG,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE,yBAAyB,CAAC,CAAA;QAChE,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,KAAK,SAAS;YAAE,YAAY,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;QAClF,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,YAAY,CAAC,IAAI,CAAC,oBAAoB,EAAE,6BAA6B,CAAC,CAAA;QACpG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO;YAAE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ;gBAAE,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;oBAAE,YAAY,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;QAC5K,OAAO,YAAY,CAAA;IACrB,CAAC;IAEO,YAAY,CAAC,OAAe;QAClC,IAAI,CAAC;YAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAAC,OAAO,IAAI,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,KAAK,CAAA;QAAC,CAAC;IAC5I,CAAC;IAEO,qBAAqB;QAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YAC9B,MAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE,sDAAsD,CAAC,CAAA;QACjG,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,cAAc,CAAA;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;YACjC,YAAY,EAAE,YAAY,QAAQ,CAAC,QAAQ,EAAE;YAC7C,YAAY,EAAE,QAAQ,CAAC,QAAQ;SAChC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;QACxD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE,sDAAsD,CAAC,CAAA;QACjG,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAED,SAAS,OAAO,CAAC,KAAa,IAAY,OAAO,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA,CAAC,CAAC;AAEzH,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC"}
@@ -1,3 +0,0 @@
1
- export type SessionFormatCompatibility = 'legacy-to-v3';
2
- export declare function normalizeLegacySessionGatewayValue(endpoint: string, value: unknown): unknown;
3
- //# sourceMappingURL=session-format-compat.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-format-compat.d.ts","sourceRoot":"","sources":["../src/session-format-compat.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,0BAA0B,GAAG,cAAc,CAAA;AAEvD,wBAAgB,kCAAkC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAI5F"}
@@ -1,183 +0,0 @@
1
- export function normalizeLegacySessionGatewayValue(endpoint, value) {
2
- if (endpoint === 'session/page')
3
- return normalizePage(value);
4
- if (endpoint === 'session/follow')
5
- return normalizeFollowFrame(value);
6
- return value;
7
- }
8
- function normalizeFollowFrame(value) {
9
- if (!isRecord(value))
10
- return value;
11
- if (value.type === 'snapshot') {
12
- return {
13
- ...value,
14
- header: normalizeHeader(value.header),
15
- records: normalizeRecords(value.records),
16
- ...(value.assistantStream === undefined ? { assistantStream: { revision: 0 } } : {}),
17
- };
18
- }
19
- return normalizeEntry(value);
20
- }
21
- function normalizePage(value) {
22
- if (!isRecord(value))
23
- return value;
24
- return { ...value, records: normalizeRecords(value.records) };
25
- }
26
- function normalizeRecords(value) {
27
- if (!Array.isArray(value))
28
- return value;
29
- const records = [];
30
- let previousSeq;
31
- for (const record of value) {
32
- if (!isEventEntry(record))
33
- continue;
34
- const seq = entrySeq(record);
35
- if (previousSeq !== undefined && seq !== undefined && seq > previousSeq + 1) {
36
- for (let fillerSeq = previousSeq + 1; fillerSeq < seq; fillerSeq += 1) {
37
- records.push(createLegacyGapRecord(fillerSeq, record));
38
- }
39
- }
40
- records.push(normalizeEntry(record));
41
- if (seq !== undefined)
42
- previousSeq = seq;
43
- }
44
- return records;
45
- }
46
- function normalizeEntry(value) {
47
- if (!isEventEntry(value))
48
- return value;
49
- return { ...value, event: normalizeEvent(value.event) };
50
- }
51
- function entrySeq(value) {
52
- if (!isEventEntry(value))
53
- return undefined;
54
- return isEventSeq(value.event.seq) ? value.event.seq : undefined;
55
- }
56
- function createLegacyGapRecord(seq, nextRecord) {
57
- return {
58
- type: 'event',
59
- event: {
60
- type: 'legacy/session-gap',
61
- seq,
62
- time: eventTime(nextRecord),
63
- ignorable: true,
64
- data: {},
65
- },
66
- };
67
- }
68
- function eventTime(value) {
69
- if (!isEventEntry(value))
70
- return 0;
71
- return typeof value.event.time === 'number' && Number.isSafeInteger(value.event.time)
72
- ? value.event.time
73
- : 0;
74
- }
75
- function isEventEntry(value) {
76
- return isRecord(value) && value.type === 'event' && isRecord(value.event);
77
- }
78
- function normalizeHeader(value) {
79
- if (!isRecord(value))
80
- return value;
81
- const next = {
82
- ...value,
83
- version: 3,
84
- ...(value.delegationDepth === undefined ? { delegationDepth: 0 } : {}),
85
- };
86
- return next.agentPreset === 'code' ? { ...next, agentPreset: 'ptc' } : next;
87
- }
88
- function normalizeEvent(value) {
89
- if (!isRecord(value))
90
- return value;
91
- let next = value;
92
- const type = normalizeEventType(value.type);
93
- if (type !== value.type)
94
- next = { ...next, type };
95
- if (type === 'assistant/message' && Object.hasOwn(next, 'sourceEventSeqs')) {
96
- const { sourceEventSeqs: _sourceEventSeqs, ...rest } = next;
97
- next = rest;
98
- }
99
- const data = normalizeEventData(type, next.data);
100
- if (data !== next.data)
101
- next = { ...next, data };
102
- const surfaceOp = normalizeSurfaceOp(next.surfaceOp);
103
- if (surfaceOp !== next.surfaceOp)
104
- next = { ...next, surfaceOp };
105
- return next;
106
- }
107
- function normalizeEventType(value) {
108
- if (value === 'tool/code-dispatch-start')
109
- return 'tool/ptc-dispatch-start';
110
- if (value === 'tool/code-dispatch')
111
- return 'tool/ptc-dispatch';
112
- return value;
113
- }
114
- function normalizeEventData(type, value) {
115
- if (!isRecord(value))
116
- return value;
117
- if (type === 'request/header')
118
- return normalizeRequestHeaderData(value);
119
- if (type === 'agent-preset/selected' && value.agentPreset === 'code')
120
- return { ...value, agentPreset: 'ptc' };
121
- if (type === 'user/message')
122
- return normalizeMessage(value);
123
- if (type === 'agent/inbox/spliced' && Array.isArray(value.inserted)) {
124
- return { ...value, inserted: value.inserted.map(item => normalizeMessage(item)) };
125
- }
126
- if (type === 'session/title-llm-request' && Array.isArray(value.messages)) {
127
- return { ...value, messages: value.messages.map(item => normalizeMessage(item)) };
128
- }
129
- return value;
130
- }
131
- function normalizeRequestHeaderData(value) {
132
- if (!isRecord(value.header))
133
- return value;
134
- const header = normalizeRequestHeader(value.header);
135
- return header === value.header ? value : { ...value, header };
136
- }
137
- function normalizeRequestHeader(value) {
138
- let changed = false;
139
- const next = {};
140
- for (const [key, field] of Object.entries(value)) {
141
- if (key === 'system') {
142
- changed = true;
143
- continue;
144
- }
145
- if (key === 'tools' && Array.isArray(field) && field.length === 0) {
146
- changed = true;
147
- continue;
148
- }
149
- if (key === 'adapterDefaults' && isRecord(field) && Object.keys(field).length === 0) {
150
- changed = true;
151
- continue;
152
- }
153
- next[key] = field;
154
- }
155
- return changed ? next : value;
156
- }
157
- function normalizeMessage(value) {
158
- if (!isRecord(value) || !isRecord(value.source))
159
- return value;
160
- if (value.source.kind !== 'plugin' || value.source.plugin !== 'tools-code-mode')
161
- return value;
162
- return { ...value, source: { ...value.source, plugin: 'tools-ptc' } };
163
- }
164
- function normalizeSurfaceOp(value) {
165
- if (!isRecord(value) || value.op !== 'replace')
166
- return value;
167
- const { start, end, ...rest } = value;
168
- if (start === undefined && end === undefined)
169
- return value;
170
- return {
171
- ...rest,
172
- op: 'replace',
173
- ...(start === undefined ? {} : { startSeq: start }),
174
- ...(end === undefined ? {} : { endSeq: end }),
175
- };
176
- }
177
- function isRecord(value) {
178
- return typeof value === 'object' && value !== null && !Array.isArray(value);
179
- }
180
- function isEventSeq(value) {
181
- return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 && !Object.is(value, -0);
182
- }
183
- //# sourceMappingURL=session-format-compat.js.map