@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.
- package/README.md +2 -2
- package/cordis.patch.yml +30 -30
- package/dist/client.github.js +1 -1
- package/dist/client.js +1 -1
- package/dist/index.js +371 -80
- package/dist/index.js.map +4 -4
- package/dsh-plugin.json +41 -41
- package/package.json +165 -165
- package/dist/acp.d.ts +0 -75
- package/dist/acp.d.ts.map +0 -1
- package/dist/acp.js +0 -61
- package/dist/acp.js.map +0 -1
- package/dist/api-proxy-switch.d.ts +0 -33
- package/dist/api-proxy-switch.d.ts.map +0 -1
- package/dist/api-proxy-switch.js +0 -109
- package/dist/api-proxy-switch.js.map +0 -1
- package/dist/atomic-file.d.ts +0 -16
- package/dist/atomic-file.d.ts.map +0 -1
- package/dist/atomic-file.js +0 -81
- package/dist/atomic-file.js.map +0 -1
- package/dist/bin/doctor.d.ts +0 -3
- package/dist/bin/doctor.d.ts.map +0 -1
- package/dist/bin/doctor.js +0 -13
- package/dist/bin/doctor.js.map +0 -1
- package/dist/cli.d.ts +0 -32
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -289
- package/dist/cli.js.map +0 -1
- package/dist/client-runtime.d.ts +0 -375
- package/dist/client-runtime.d.ts.map +0 -1
- package/dist/client-runtime.js +0 -1768
- package/dist/client-runtime.js.map +0 -1
- package/dist/client-secure-transport.d.ts +0 -23
- package/dist/client-secure-transport.d.ts.map +0 -1
- package/dist/client-secure-transport.js +0 -144
- package/dist/client-secure-transport.js.map +0 -1
- package/dist/client-target-store.d.ts +0 -40
- package/dist/client-target-store.d.ts.map +0 -1
- package/dist/client-target-store.js +0 -79
- package/dist/client-target-store.js.map +0 -1
- package/dist/client.d.ts +0 -13
- package/dist/client.d.ts.map +0 -1
- package/dist/codex/app-server.d.ts +0 -71
- package/dist/codex/app-server.d.ts.map +0 -1
- package/dist/codex/app-server.js +0 -268
- package/dist/codex/app-server.js.map +0 -1
- package/dist/codex/codex-image-codec.d.ts +0 -7
- package/dist/codex/codex-image-codec.d.ts.map +0 -1
- package/dist/codex/codex-image-codec.js +0 -288
- package/dist/codex/codex-image-codec.js.map +0 -1
- package/dist/codex/domain.d.ts +0 -102
- package/dist/codex/domain.d.ts.map +0 -1
- package/dist/codex/domain.js +0 -1323
- package/dist/codex/domain.js.map +0 -1
- package/dist/codex/method-policy.d.ts +0 -338
- package/dist/codex/method-policy.d.ts.map +0 -1
- package/dist/codex/method-policy.js +0 -141
- package/dist/codex/method-policy.js.map +0 -1
- package/dist/codex/peer-bridge.d.ts +0 -57
- package/dist/codex/peer-bridge.d.ts.map +0 -1
- package/dist/codex/peer-bridge.js +0 -299
- package/dist/codex/peer-bridge.js.map +0 -1
- package/dist/codex/permissions.d.ts +0 -4
- package/dist/codex/permissions.d.ts.map +0 -1
- package/dist/codex/permissions.js +0 -21
- package/dist/codex/permissions.js.map +0 -1
- package/dist/codex/session-id.d.ts +0 -10
- package/dist/codex/session-id.d.ts.map +0 -1
- package/dist/codex/session-id.js +0 -15
- package/dist/codex/session-id.js.map +0 -1
- package/dist/codex/virtual-harness.d.ts +0 -209
- package/dist/codex/virtual-harness.d.ts.map +0 -1
- package/dist/codex/virtual-harness.js +0 -2650
- package/dist/codex/virtual-harness.js.map +0 -1
- package/dist/codex-workspace-bridge.d.ts +0 -108
- package/dist/codex-workspace-bridge.d.ts.map +0 -1
- package/dist/codex-workspace-bridge.js +0 -502
- package/dist/codex-workspace-bridge.js.map +0 -1
- package/dist/config.d.ts +0 -99
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -127
- package/dist/config.js.map +0 -1
- package/dist/connection-controller.d.ts +0 -44
- package/dist/connection-controller.d.ts.map +0 -1
- package/dist/connection-controller.js +0 -185
- package/dist/connection-controller.js.map +0 -1
- package/dist/control-route.d.ts +0 -34
- package/dist/control-route.d.ts.map +0 -1
- package/dist/control-route.js +0 -136
- package/dist/control-route.js.map +0 -1
- package/dist/control-runtime.d.ts +0 -138
- package/dist/control-runtime.d.ts.map +0 -1
- package/dist/control-runtime.js +0 -543
- package/dist/control-runtime.js.map +0 -1
- package/dist/control-stream.d.ts +0 -67
- package/dist/control-stream.d.ts.map +0 -1
- package/dist/control-stream.js +0 -179
- package/dist/control-stream.js.map +0 -1
- package/dist/defaults.d.ts +0 -9
- package/dist/defaults.d.ts.map +0 -1
- package/dist/defaults.js +0 -9
- package/dist/defaults.js.map +0 -1
- package/dist/file-viewer-bridge.d.ts +0 -30
- package/dist/file-viewer-bridge.d.ts.map +0 -1
- package/dist/file-viewer-bridge.js +0 -128
- package/dist/file-viewer-bridge.js.map +0 -1
- package/dist/file-viewer-contract.d.ts +0 -5
- package/dist/file-viewer-contract.d.ts.map +0 -1
- package/dist/file-viewer-contract.js +0 -4
- package/dist/file-viewer-contract.js.map +0 -1
- package/dist/harness-api-bridge.d.ts +0 -81
- package/dist/harness-api-bridge.d.ts.map +0 -1
- package/dist/harness-api-bridge.js +0 -862
- package/dist/harness-api-bridge.js.map +0 -1
- package/dist/harness-api-history.d.ts +0 -3
- package/dist/harness-api-history.d.ts.map +0 -1
- package/dist/harness-api-history.js +0 -59
- package/dist/harness-api-history.js.map +0 -1
- package/dist/harness-remote-bridge.d.ts +0 -60
- package/dist/harness-remote-bridge.d.ts.map +0 -1
- package/dist/harness-remote-bridge.js +0 -540
- package/dist/harness-remote-bridge.js.map +0 -1
- package/dist/harness-version.d.ts +0 -23
- package/dist/harness-version.d.ts.map +0 -1
- package/dist/harness-version.js +0 -95
- package/dist/harness-version.js.map +0 -1
- package/dist/identity-store.d.ts +0 -45
- package/dist/identity-store.d.ts.map +0 -1
- package/dist/identity-store.js +0 -186
- package/dist/identity-store.js.map +0 -1
- package/dist/ids.d.ts +0 -2
- package/dist/ids.d.ts.map +0 -1
- package/dist/ids.js +0 -17
- package/dist/ids.js.map +0 -1
- package/dist/index.d.ts +0 -78
- package/dist/index.d.ts.map +0 -1
- package/dist/logging.d.ts +0 -18
- package/dist/logging.d.ts.map +0 -1
- package/dist/logging.js +0 -30
- package/dist/logging.js.map +0 -1
- package/dist/loopback-host.d.ts +0 -20
- package/dist/loopback-host.d.ts.map +0 -1
- package/dist/loopback-host.js +0 -245
- package/dist/loopback-host.js.map +0 -1
- package/dist/loopback-preview.d.ts +0 -19
- package/dist/loopback-preview.d.ts.map +0 -1
- package/dist/loopback-preview.js +0 -232
- package/dist/loopback-preview.js.map +0 -1
- package/dist/native-rtc-helper.d.ts +0 -14
- package/dist/native-rtc-helper.d.ts.map +0 -1
- package/dist/native-rtc-helper.js +0 -575
- package/dist/native-rtc-helper.js.map +0 -1
- package/dist/remote-api-proxy.d.ts +0 -17
- package/dist/remote-api-proxy.d.ts.map +0 -1
- package/dist/remote-api-proxy.js +0 -451
- package/dist/remote-api-proxy.js.map +0 -1
- package/dist/remote-directory-browser.d.ts +0 -16
- package/dist/remote-directory-browser.d.ts.map +0 -1
- package/dist/remote-directory-browser.js +0 -48
- package/dist/remote-directory-browser.js.map +0 -1
- package/dist/remote-file-content-provider.d.ts +0 -48
- package/dist/remote-file-content-provider.d.ts.map +0 -1
- package/dist/remote-file-content-provider.js +0 -93
- package/dist/remote-file-content-provider.js.map +0 -1
- package/dist/remote-typert-gateway.d.ts +0 -20
- package/dist/remote-typert-gateway.d.ts.map +0 -1
- package/dist/remote-typert-gateway.js +0 -334
- package/dist/remote-typert-gateway.js.map +0 -1
- package/dist/rpc-binary-attachments.d.ts +0 -33
- package/dist/rpc-binary-attachments.d.ts.map +0 -1
- package/dist/rpc-binary-attachments.js +0 -142
- package/dist/rpc-binary-attachments.js.map +0 -1
- package/dist/rpc-router.d.ts +0 -31
- package/dist/rpc-router.d.ts.map +0 -1
- package/dist/rpc-router.js +0 -201
- package/dist/rpc-router.js.map +0 -1
- package/dist/safe-error.d.ts +0 -8
- package/dist/safe-error.d.ts.map +0 -1
- package/dist/safe-error.js +0 -20
- package/dist/safe-error.js.map +0 -1
- package/dist/server-api.d.ts +0 -109
- package/dist/server-api.d.ts.map +0 -1
- package/dist/server-api.js +0 -520
- package/dist/server-api.js.map +0 -1
- package/dist/server-connection.d.ts +0 -79
- package/dist/server-connection.d.ts.map +0 -1
- package/dist/server-connection.js +0 -1023
- package/dist/server-connection.js.map +0 -1
- package/dist/server-credentials.d.ts +0 -55
- package/dist/server-credentials.d.ts.map +0 -1
- package/dist/server-credentials.js +0 -108
- package/dist/server-credentials.js.map +0 -1
- package/dist/service.d.ts +0 -151
- package/dist/service.d.ts.map +0 -1
- package/dist/service.js +0 -448
- package/dist/service.js.map +0 -1
- package/dist/session-format-compat.d.ts +0 -3
- package/dist/session-format-compat.d.ts.map +0 -1
- package/dist/session-format-compat.js +0 -183
- package/dist/session-format-compat.js.map +0 -1
- package/dist/status-stream.d.ts +0 -48
- package/dist/status-stream.d.ts.map +0 -1
- package/dist/status-stream.js +0 -133
- package/dist/status-stream.js.map +0 -1
- package/dist/terminal-policy.d.ts +0 -21
- package/dist/terminal-policy.d.ts.map +0 -1
- package/dist/terminal-policy.js +0 -68
- package/dist/terminal-policy.js.map +0 -1
- package/dist/tui-command.d.ts +0 -13
- package/dist/tui-command.d.ts.map +0 -1
- package/dist/tui-command.js +0 -392
- package/dist/tui-command.js.map +0 -1
- package/dist/typert-gateway-contract.d.ts +0 -59
- package/dist/typert-gateway-contract.d.ts.map +0 -1
- package/dist/typert-gateway-contract.js +0 -2
- package/dist/typert-gateway-contract.js.map +0 -1
- package/dist/typert-gateway-switch.d.ts +0 -85
- package/dist/typert-gateway-switch.d.ts.map +0 -1
- package/dist/typert-gateway-switch.js +0 -448
- package/dist/typert-gateway-switch.js.map +0 -1
- package/dist/types.d.ts +0 -20
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/version.d.ts +0 -12
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js +0 -12
- package/dist/version.js.map +0 -1
- package/dist/werift-rtc.d.ts +0 -121
- package/dist/werift-rtc.d.ts.map +0 -1
- package/dist/werift-rtc.js +0 -490
- package/dist/werift-rtc.js.map +0 -1
package/dist/remote-api-proxy.js
DELETED
|
@@ -1,451 +0,0 @@
|
|
|
1
|
-
import { RemoteClientError } from '@dsh-remote/client-core';
|
|
2
|
-
import { decodeByteValue, hydrateRpcAttachments } from './rpc-binary-attachments.js';
|
|
3
|
-
import { HARNESS_API_TRANSFER_CHUNK_BYTES, MAX_HARNESS_API_TRANSFER_BYTES, } from '@dsh-remote/protocol';
|
|
4
|
-
import { uuidV7 } from './ids.js';
|
|
5
|
-
const DIRECT_API_CALL_BYTES = 2 * 1024 * 1024;
|
|
6
|
-
const AGENT_PRESET_SETTINGS_NS = 'agent-presets';
|
|
7
|
-
const LEGACY_AGENT_PRESET_ALIASES = {
|
|
8
|
-
code: 'ptc',
|
|
9
|
-
};
|
|
10
|
-
const WELCOME_NOTICE_NAMESPACE = 'ui-settings-general';
|
|
11
|
-
const WELCOME_NOTICE_FIELD = 'welcomeNoticeVersion';
|
|
12
|
-
const WELCOME_NOTICE_VERSION = '2026-08-13.1';
|
|
13
|
-
/** ApiProxy-compatible face that preserves the native Harness envelopes over Remote RPC. */
|
|
14
|
-
export class RemoteHarnessApiProxy {
|
|
15
|
-
client;
|
|
16
|
-
harnessVersion;
|
|
17
|
-
api;
|
|
18
|
-
legacyWelcomeAcknowledged = false;
|
|
19
|
-
settingsDescribeValue;
|
|
20
|
-
constructor(client, harnessVersion) {
|
|
21
|
-
this.client = client;
|
|
22
|
-
this.harnessVersion = harnessVersion;
|
|
23
|
-
const call = (method) => (request, signal) => this.call(method, request, signal);
|
|
24
|
-
this.api = {
|
|
25
|
-
sessions: {
|
|
26
|
-
list: call('session.list'),
|
|
27
|
-
search: call('session.search'),
|
|
28
|
-
create: call('session.create'),
|
|
29
|
-
history: call('session.history'),
|
|
30
|
-
models: call('session.models'),
|
|
31
|
-
selectModel: call('session.selectModel'),
|
|
32
|
-
rename: call('session.rename'),
|
|
33
|
-
fork: call('session.fork'),
|
|
34
|
-
prompt: call('session.prompt'),
|
|
35
|
-
attachment: call('session.attachment'),
|
|
36
|
-
updateQueue: call('session.updateQueue'),
|
|
37
|
-
cancel: call('session.cancel'),
|
|
38
|
-
},
|
|
39
|
-
subagents: {
|
|
40
|
-
list: call('subagent.list'),
|
|
41
|
-
history: call('subagent.history'),
|
|
42
|
-
prompt: call('subagent.prompt'),
|
|
43
|
-
interrupt: call('subagent.interrupt'),
|
|
44
|
-
},
|
|
45
|
-
host: {
|
|
46
|
-
describe: call('host.describe'),
|
|
47
|
-
pickDirectory: call('host.pickDirectory'),
|
|
48
|
-
listDirectory: call('host.listDirectory'),
|
|
49
|
-
createDirectory: call('host.createDirectory'),
|
|
50
|
-
openPath: call('host.openPath'),
|
|
51
|
-
},
|
|
52
|
-
workspace: {
|
|
53
|
-
list: call('workspace.list'),
|
|
54
|
-
create: call('workspace.create'),
|
|
55
|
-
rename: call('workspace.rename'),
|
|
56
|
-
delete: call('workspace.delete'),
|
|
57
|
-
insertBefore: call('workspace.insertBefore'),
|
|
58
|
-
insertSessionBefore: call('workspace.insertSessionBefore'),
|
|
59
|
-
archiveSession: call('workspace.archiveSession'),
|
|
60
|
-
},
|
|
61
|
-
skills: { list: call('skill.list') },
|
|
62
|
-
agentPresets: {
|
|
63
|
-
list: call('agentPreset.list'),
|
|
64
|
-
select: call('agentPreset.select'),
|
|
65
|
-
read: call('agentPreset.read'),
|
|
66
|
-
copy: call('agentPreset.copy'),
|
|
67
|
-
openDocument: call('agentPreset.openDocument'),
|
|
68
|
-
remove: call('agentPreset.remove'),
|
|
69
|
-
},
|
|
70
|
-
goals: {
|
|
71
|
-
create: call('goal.create'),
|
|
72
|
-
edit: call('goal.edit'),
|
|
73
|
-
pause: call('goal.pause'),
|
|
74
|
-
resume: call('goal.resume'),
|
|
75
|
-
complete: call('goal.complete'),
|
|
76
|
-
clear: call('goal.clear'),
|
|
77
|
-
},
|
|
78
|
-
settings: {
|
|
79
|
-
describe: call('settings.describe'),
|
|
80
|
-
openDocument: call('settings.openDocument'),
|
|
81
|
-
update: call('settings.update'),
|
|
82
|
-
replace: call('settings.replace'),
|
|
83
|
-
mutate: call('settings.mutate'),
|
|
84
|
-
},
|
|
85
|
-
credentials: {
|
|
86
|
-
describe: call('credentials.describe'),
|
|
87
|
-
set: call('credentials.set'),
|
|
88
|
-
unset: call('credentials.unset'),
|
|
89
|
-
},
|
|
90
|
-
llm: {
|
|
91
|
-
providers: call('llm.providers'),
|
|
92
|
-
models: call('llm.models'),
|
|
93
|
-
discoverModels: call('llm.discoverModels'),
|
|
94
|
-
},
|
|
95
|
-
events: {
|
|
96
|
-
mux: (request, signal) => this.stream('mux', request, signal),
|
|
97
|
-
host: (request, signal) => this.stream('host', request, signal),
|
|
98
|
-
},
|
|
99
|
-
downloads: {},
|
|
100
|
-
respond: message => this.respond(message),
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
async call(method, request, signal) {
|
|
104
|
-
const params = {
|
|
105
|
-
method,
|
|
106
|
-
rpcId: String(request.rpcId),
|
|
107
|
-
payload: normalizeLegacyRequest(method, request.payload),
|
|
108
|
-
};
|
|
109
|
-
const encoded = new TextEncoder().encode(JSON.stringify(params));
|
|
110
|
-
const response = method === 'session.attachment' || encoded.byteLength > DIRECT_API_CALL_BYTES
|
|
111
|
-
? await this.callTransferred(encoded, signal)
|
|
112
|
-
: await this.client.rpc('harness.api.call', params, signal);
|
|
113
|
-
if (String(response.rpcId) !== String(request.rpcId) || typeof response.result !== 'object' || response.result === null) {
|
|
114
|
-
throw new Error('The remote Host returned an invalid Harness API response.');
|
|
115
|
-
}
|
|
116
|
-
// The Host sends bytes beside the result (see collectRpcAttachments); DSH's own connection layer
|
|
117
|
-
// would copy them back before validation, so restore them here.
|
|
118
|
-
const hydrated = { ...response, result: hydrateRpcAttachments(response.result) };
|
|
119
|
-
const normalized = normalizeLegacyResponse(method, normalizeByteResult(method, hydrated));
|
|
120
|
-
return this.normalizeLegacyWelcomeSettings(method, params.payload, normalized);
|
|
121
|
-
}
|
|
122
|
-
normalizeLegacyWelcomeSettings(method, payload, response) {
|
|
123
|
-
if (!isLegacyRemoteHost(this.harnessVersion))
|
|
124
|
-
return response;
|
|
125
|
-
if (method === 'settings.describe' && response.result.ok && isRecord(response.result.value)) {
|
|
126
|
-
this.settingsDescribeValue = response.result.value;
|
|
127
|
-
return this.legacyWelcomeAcknowledged ? patchWelcomeDescribe(response) : response;
|
|
128
|
-
}
|
|
129
|
-
if (method !== 'settings.mutate' || !isWelcomeNoticeRequest(payload))
|
|
130
|
-
return response;
|
|
131
|
-
this.legacyWelcomeAcknowledged = true;
|
|
132
|
-
// Older Hosts reject the 0.1.7 onboarding field before returning a usable
|
|
133
|
-
// settings snapshot. Treat the acknowledgement as client-local in that
|
|
134
|
-
// case; a later describe is patched when one becomes available.
|
|
135
|
-
return patchWelcomeMutate(this.settingsDescribeValue ?? { namespaces: [] }, response.rpcId);
|
|
136
|
-
}
|
|
137
|
-
async callTransferred(encoded, signal) {
|
|
138
|
-
if (encoded.byteLength > MAX_HARNESS_API_TRANSFER_BYTES) {
|
|
139
|
-
throw new Error('The Harness API request exceeds the remote image transfer limit.');
|
|
140
|
-
}
|
|
141
|
-
const transferId = uuidV7();
|
|
142
|
-
const totalChunks = Math.ceil(encoded.byteLength / HARNESS_API_TRANSFER_CHUNK_BYTES);
|
|
143
|
-
let opened = false;
|
|
144
|
-
try {
|
|
145
|
-
await this.client.rpc('harness.api.transfer.open', {
|
|
146
|
-
transferId,
|
|
147
|
-
totalBytes: encoded.byteLength,
|
|
148
|
-
totalChunks,
|
|
149
|
-
}, signal);
|
|
150
|
-
opened = true;
|
|
151
|
-
for (let index = 0; index < totalChunks; index += 1) {
|
|
152
|
-
const start = index * HARNESS_API_TRANSFER_CHUNK_BYTES;
|
|
153
|
-
const chunk = encoded.subarray(start, Math.min(start + HARNESS_API_TRANSFER_CHUNK_BYTES, encoded.byteLength));
|
|
154
|
-
await this.client.rpc('harness.api.transfer.chunk', {
|
|
155
|
-
transferId,
|
|
156
|
-
index,
|
|
157
|
-
data: bytesToBase64(chunk),
|
|
158
|
-
}, signal);
|
|
159
|
-
}
|
|
160
|
-
const committed = await this.client.rpc('harness.api.transfer.commit', { transferId }, signal);
|
|
161
|
-
if (committed.kind === 'inline')
|
|
162
|
-
return committed.response;
|
|
163
|
-
if (committed.transferId !== transferId
|
|
164
|
-
|| committed.totalBytes <= 0
|
|
165
|
-
|| committed.totalBytes > MAX_HARNESS_API_TRANSFER_BYTES
|
|
166
|
-
|| committed.totalChunks !== Math.ceil(committed.totalBytes / HARNESS_API_TRANSFER_CHUNK_BYTES)) {
|
|
167
|
-
throw new Error('The remote Host returned an invalid Harness API transfer descriptor.');
|
|
168
|
-
}
|
|
169
|
-
const responseBytes = new Uint8Array(committed.totalBytes);
|
|
170
|
-
let offset = 0;
|
|
171
|
-
for (let index = 0; index < committed.totalChunks; index += 1) {
|
|
172
|
-
const result = await this.client.rpc('harness.api.transfer.read', { transferId, index }, signal);
|
|
173
|
-
if (result.transferId !== transferId || result.index !== index) {
|
|
174
|
-
throw new Error('The remote Host returned an out-of-order Harness API transfer chunk.');
|
|
175
|
-
}
|
|
176
|
-
const chunk = base64ToBytes(result.data);
|
|
177
|
-
const expectedBytes = Math.min(HARNESS_API_TRANSFER_CHUNK_BYTES, committed.totalBytes - offset);
|
|
178
|
-
if (chunk.byteLength !== expectedBytes) {
|
|
179
|
-
throw new Error('The remote Host returned an invalid Harness API transfer chunk.');
|
|
180
|
-
}
|
|
181
|
-
responseBytes.set(chunk, offset);
|
|
182
|
-
offset += chunk.byteLength;
|
|
183
|
-
}
|
|
184
|
-
return JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(responseBytes));
|
|
185
|
-
}
|
|
186
|
-
finally {
|
|
187
|
-
if (opened) {
|
|
188
|
-
await this.client.rpc('harness.api.transfer.close', { transferId }).catch(() => undefined);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
async respond(message) {
|
|
193
|
-
return this.client.rpc('harness.api.respond', { message });
|
|
194
|
-
}
|
|
195
|
-
async *stream(stream, request, signal) {
|
|
196
|
-
const streamId = uuidV7();
|
|
197
|
-
const queue = new AsyncFrameQueue();
|
|
198
|
-
const unsubscribe = this.client.onEvent(event => routeStreamEvent(event, streamId, queue));
|
|
199
|
-
const unsubscribeClose = this.client.onClose(() => queue.close());
|
|
200
|
-
const onAbort = () => queue.close();
|
|
201
|
-
signal.addEventListener('abort', onAbort, { once: true });
|
|
202
|
-
try {
|
|
203
|
-
try {
|
|
204
|
-
await this.client.rpc('harness.api.stream.open', {
|
|
205
|
-
streamId,
|
|
206
|
-
stream,
|
|
207
|
-
rpcId: String(request.rpcId),
|
|
208
|
-
payload: request.payload,
|
|
209
|
-
}, signal);
|
|
210
|
-
for await (const frame of queue)
|
|
211
|
-
yield frame;
|
|
212
|
-
}
|
|
213
|
-
catch (error) {
|
|
214
|
-
// Native Harness event consumers treat a thrown stream iterator as a
|
|
215
|
-
// fatal load failure. A remote disconnect is normal lifecycle here:
|
|
216
|
-
// ClientModeRuntime has already switched ApiProxy back to local mode,
|
|
217
|
-
// so finish this old iterator cleanly instead of terminating Harness.
|
|
218
|
-
if (!isRemoteDisconnect(error))
|
|
219
|
-
throw error;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
finally {
|
|
223
|
-
signal.removeEventListener('abort', onAbort);
|
|
224
|
-
unsubscribe();
|
|
225
|
-
unsubscribeClose();
|
|
226
|
-
queue.close();
|
|
227
|
-
await this.client.rpc('harness.api.stream.close', { streamId }).catch(() => undefined);
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
/** RC7 host.describe did not include the home field made mandatory by RC8. */
|
|
232
|
-
function normalizeLegacyResponse(method, response) {
|
|
233
|
-
if (method !== 'host.describe' || !response.result.ok)
|
|
234
|
-
return response;
|
|
235
|
-
const value = response.result.value;
|
|
236
|
-
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
237
|
-
return response;
|
|
238
|
-
const description = value;
|
|
239
|
-
if (typeof description.home === 'string' || typeof description.cwd !== 'string')
|
|
240
|
-
return response;
|
|
241
|
-
return {
|
|
242
|
-
...response,
|
|
243
|
-
result: {
|
|
244
|
-
...response.result,
|
|
245
|
-
value: { ...description, home: description.cwd },
|
|
246
|
-
},
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
/** Older Remote Web clients persisted the pre-rc.1 coding preset id as `code`. */
|
|
250
|
-
function normalizeLegacyRequest(method, payload) {
|
|
251
|
-
if (!isRecord(payload))
|
|
252
|
-
return payload;
|
|
253
|
-
if (method === 'agentPreset.read')
|
|
254
|
-
return replaceAgentPreset(payload, 'agentPreset');
|
|
255
|
-
if (method === 'agentPreset.select')
|
|
256
|
-
return replaceAgentPreset(payload, 'agentPreset');
|
|
257
|
-
if (method === 'agentPreset.copy')
|
|
258
|
-
return replaceAgentPreset(payload, 'from');
|
|
259
|
-
if (method === 'settings.update' || method === 'settings.replace' || method === 'settings.mutate') {
|
|
260
|
-
return replaceAgentPresetSettings(payload);
|
|
261
|
-
}
|
|
262
|
-
return payload;
|
|
263
|
-
}
|
|
264
|
-
function replaceAgentPreset(payload, key) {
|
|
265
|
-
const value = payload[key];
|
|
266
|
-
const replacement = typeof value === 'string' ? LEGACY_AGENT_PRESET_ALIASES[value] : undefined;
|
|
267
|
-
return replacement === undefined ? payload : { ...payload, [key]: replacement };
|
|
268
|
-
}
|
|
269
|
-
function replaceAgentPresetSettings(payload) {
|
|
270
|
-
if (payload.ns !== AGENT_PRESET_SETTINGS_NS || !isRecord(payload.patch))
|
|
271
|
-
return payload;
|
|
272
|
-
const patch = replaceAgentPreset(payload.patch, 'default');
|
|
273
|
-
return patch === payload.patch ? payload : { ...payload, patch };
|
|
274
|
-
}
|
|
275
|
-
function isLegacyRemoteHost(version) {
|
|
276
|
-
if (version === undefined)
|
|
277
|
-
return false;
|
|
278
|
-
const match = /^(?:dsh-)?v?(\d+)\.(\d+)\.(\d+)(?:-|$)/u.exec(version.trim());
|
|
279
|
-
return match !== null && Number(match[1]) === 0 && Number(match[2]) === 1 && Number(match[3]) < 7;
|
|
280
|
-
}
|
|
281
|
-
function isWelcomeNoticeRequest(payload) {
|
|
282
|
-
if (!isRecord(payload) || payload.ns !== WELCOME_NOTICE_NAMESPACE || !Array.isArray(payload.ops))
|
|
283
|
-
return false;
|
|
284
|
-
return payload.ops.some(operation => isRecord(operation)
|
|
285
|
-
&& operation.op === 'set'
|
|
286
|
-
&& Array.isArray(operation.path)
|
|
287
|
-
&& operation.path.length === 1
|
|
288
|
-
&& operation.path[0] === WELCOME_NOTICE_FIELD
|
|
289
|
-
&& operation.value === WELCOME_NOTICE_VERSION);
|
|
290
|
-
}
|
|
291
|
-
function patchWelcomeDescribe(response) {
|
|
292
|
-
if (!response.result.ok || !isRecord(response.result.value) || !Array.isArray(response.result.value.namespaces))
|
|
293
|
-
return response;
|
|
294
|
-
return {
|
|
295
|
-
...response,
|
|
296
|
-
result: {
|
|
297
|
-
...response.result,
|
|
298
|
-
value: {
|
|
299
|
-
...response.result.value,
|
|
300
|
-
namespaces: response.result.value.namespaces.map(namespace => {
|
|
301
|
-
if (!isRecord(namespace) || namespace.ns !== WELCOME_NOTICE_NAMESPACE)
|
|
302
|
-
return namespace;
|
|
303
|
-
const value = isRecord(namespace.value) ? namespace.value : {};
|
|
304
|
-
return { ...namespace, value: { ...value, [WELCOME_NOTICE_FIELD]: WELCOME_NOTICE_VERSION } };
|
|
305
|
-
}),
|
|
306
|
-
},
|
|
307
|
-
},
|
|
308
|
-
};
|
|
309
|
-
}
|
|
310
|
-
function patchWelcomeMutate(value, rpcId) {
|
|
311
|
-
const response = {
|
|
312
|
-
rpcId,
|
|
313
|
-
result: { ok: true, value: { ...value, namespaces: [] } },
|
|
314
|
-
};
|
|
315
|
-
const namespaces = Array.isArray(value.namespaces) ? value.namespaces : [];
|
|
316
|
-
response.result.value.namespaces = namespaces.map(namespace => {
|
|
317
|
-
if (!isRecord(namespace) || namespace.ns !== WELCOME_NOTICE_NAMESPACE)
|
|
318
|
-
return namespace;
|
|
319
|
-
const current = isRecord(namespace.value) ? namespace.value : {};
|
|
320
|
-
return { ...namespace, value: { ...current, [WELCOME_NOTICE_FIELD]: WELCOME_NOTICE_VERSION } };
|
|
321
|
-
});
|
|
322
|
-
return response;
|
|
323
|
-
}
|
|
324
|
-
function isRemoteDisconnect(error) {
|
|
325
|
-
return error instanceof RemoteClientError
|
|
326
|
-
&& (error.code === 'TRANSPORT_CLOSED' || error.code === 'CLIENT_CLOSED');
|
|
327
|
-
}
|
|
328
|
-
function isRecord(value) {
|
|
329
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
330
|
-
}
|
|
331
|
-
class AsyncFrameQueue {
|
|
332
|
-
values = [];
|
|
333
|
-
waiters = [];
|
|
334
|
-
closed = false;
|
|
335
|
-
push(value) {
|
|
336
|
-
if (this.closed)
|
|
337
|
-
return;
|
|
338
|
-
const waiter = this.waiters.shift();
|
|
339
|
-
if (waiter === undefined)
|
|
340
|
-
this.values.push(value);
|
|
341
|
-
else
|
|
342
|
-
waiter({ done: false, value });
|
|
343
|
-
}
|
|
344
|
-
close() {
|
|
345
|
-
if (this.closed)
|
|
346
|
-
return;
|
|
347
|
-
this.closed = true;
|
|
348
|
-
for (const waiter of this.waiters.splice(0))
|
|
349
|
-
waiter({ done: true, value: undefined });
|
|
350
|
-
}
|
|
351
|
-
async *[Symbol.asyncIterator]() {
|
|
352
|
-
while (true) {
|
|
353
|
-
const value = this.values.shift();
|
|
354
|
-
if (value !== undefined) {
|
|
355
|
-
yield value;
|
|
356
|
-
continue;
|
|
357
|
-
}
|
|
358
|
-
if (this.closed)
|
|
359
|
-
return;
|
|
360
|
-
const next = await new Promise(resolve => this.waiters.push(resolve));
|
|
361
|
-
if (next.done)
|
|
362
|
-
return;
|
|
363
|
-
yield next.value;
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
function routeStreamEvent(event, streamId, queue) {
|
|
368
|
-
if (event.event === 'harness.api.frame') {
|
|
369
|
-
const data = event.data;
|
|
370
|
-
if (data.streamId !== streamId || typeof data.frame !== 'object' || data.frame === null
|
|
371
|
-
|| typeof data.frame.rpcId !== 'string' || !('payload' in data.frame))
|
|
372
|
-
return;
|
|
373
|
-
queue.push(data.frame);
|
|
374
|
-
}
|
|
375
|
-
if (event.event === 'harness.api.stream.closed') {
|
|
376
|
-
const data = event.data;
|
|
377
|
-
if (data.streamId === streamId)
|
|
378
|
-
queue.close();
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
function bytesToBase64(bytes) {
|
|
382
|
-
let binary = '';
|
|
383
|
-
for (let offset = 0; offset < bytes.byteLength; offset += 0x8000) {
|
|
384
|
-
binary += String.fromCharCode(...bytes.subarray(offset, Math.min(offset + 0x8000, bytes.byteLength)));
|
|
385
|
-
}
|
|
386
|
-
return btoa(binary);
|
|
387
|
-
}
|
|
388
|
-
function base64ToBytes(value) {
|
|
389
|
-
let binary;
|
|
390
|
-
try {
|
|
391
|
-
binary = atob(value);
|
|
392
|
-
}
|
|
393
|
-
catch {
|
|
394
|
-
throw new Error('The remote Host returned a malformed Harness API transfer chunk.');
|
|
395
|
-
}
|
|
396
|
-
const bytes = new Uint8Array(binary.length);
|
|
397
|
-
for (let index = 0; index < binary.length; index += 1)
|
|
398
|
-
bytes[index] = binary.charCodeAt(index);
|
|
399
|
-
if (bytesToBase64(bytes) !== value) {
|
|
400
|
-
throw new Error('The remote Host returned a non-canonical Harness API transfer chunk.');
|
|
401
|
-
}
|
|
402
|
-
return bytes;
|
|
403
|
-
}
|
|
404
|
-
/**
|
|
405
|
-
* \`workspaceFiles.readBytes\` must reach the native UI as a \`Uint8Array\`.
|
|
406
|
-
*
|
|
407
|
-
* The CodeX workspace projection answers it with base64 for its own consumers, and the generated schema
|
|
408
|
-
* on the native side rejects that with \`expected "Uint8Array", path: ["data"]\`. This carrier uses the
|
|
409
|
-
* dotted method name, so the check is separate from the Typert one. A shape warning (type and key count
|
|
410
|
-
* only) makes a value that still cannot be decoded identifiable instead of invisible.
|
|
411
|
-
*
|
|
412
|
-
* @param method - ApiProxy method name.
|
|
413
|
-
* @param response - the peer's response.
|
|
414
|
-
* @returns the response with byte-valued fields restored.
|
|
415
|
-
*/
|
|
416
|
-
/** Shapes only: what a byte field looks like where it crosses a seam (never the content). */
|
|
417
|
-
function describeBytes(data) {
|
|
418
|
-
return {
|
|
419
|
-
dataIsBytes: data instanceof Uint8Array,
|
|
420
|
-
dataType: typeof data,
|
|
421
|
-
dataKeys: typeof data === 'object' && data !== null ? Object.keys(data).length : 0,
|
|
422
|
-
preview: typeof data === 'string' ? data.slice(0, 12) : undefined,
|
|
423
|
-
};
|
|
424
|
-
}
|
|
425
|
-
function normalizeByteResult(method, response) {
|
|
426
|
-
if (method !== 'workspaceFiles.readBytes')
|
|
427
|
-
return response;
|
|
428
|
-
const result = response.result;
|
|
429
|
-
if (result === undefined || result.ok !== true)
|
|
430
|
-
return response;
|
|
431
|
-
const value = result.value;
|
|
432
|
-
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
433
|
-
return response;
|
|
434
|
-
const data = value.data;
|
|
435
|
-
console.warn('[dsh-remote] workspaceFiles/readBytes at the ApiProxy exit', describeBytes(data));
|
|
436
|
-
if (data instanceof Uint8Array)
|
|
437
|
-
return response;
|
|
438
|
-
const bytes = decodeByteValue(data);
|
|
439
|
-
// Shapes only; never the content itself. This is the seam that faces the local shell.
|
|
440
|
-
console.warn('[dsh-remote] workspace probe', {
|
|
441
|
-
where: 'apiproxy.exit',
|
|
442
|
-
endpoint: method,
|
|
443
|
-
dataType: typeof data,
|
|
444
|
-
dataKeys: typeof data === 'object' && data !== null ? Object.keys(data).length : 0,
|
|
445
|
-
decoded: bytes !== undefined,
|
|
446
|
-
});
|
|
447
|
-
if (bytes === undefined)
|
|
448
|
-
return response;
|
|
449
|
-
return { ...response, result: { ...result, value: { ...value, data: bytes } } };
|
|
450
|
-
}
|
|
451
|
-
//# sourceMappingURL=remote-api-proxy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"remote-api-proxy.js","sourceRoot":"","sources":["../src/remote-api-proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
interface DirectoryEntry {
|
|
2
|
-
name: string;
|
|
3
|
-
path: string;
|
|
4
|
-
hidden: boolean;
|
|
5
|
-
}
|
|
6
|
-
export interface DirectoryListing {
|
|
7
|
-
path: string;
|
|
8
|
-
home: string;
|
|
9
|
-
crumbs: DirectoryEntry[];
|
|
10
|
-
entries: DirectoryEntry[];
|
|
11
|
-
truncated: boolean;
|
|
12
|
-
}
|
|
13
|
-
/** Read-only fallback used only over an authenticated Host channel when Harness has a native-only picker. */
|
|
14
|
-
export declare function listRemoteDirectory(path?: string, signal?: AbortSignal): Promise<DirectoryListing>;
|
|
15
|
-
export {};
|
|
16
|
-
//# sourceMappingURL=remote-directory-browser.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"remote-directory-browser.d.ts","sourceRoot":"","sources":["../src/remote-directory-browser.ts"],"names":[],"mappings":"AAIA,UAAU,cAAc;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE;AACxE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,SAAS,EAAE,OAAO,CAAA;CACnB;AAID,6GAA6G;AAC7G,wBAAsB,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuBxG"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { readdir, stat } from 'node:fs/promises';
|
|
2
|
-
import { homedir, platform } from 'node:os';
|
|
3
|
-
import { basename, dirname, isAbsolute, parse, resolve } from 'node:path';
|
|
4
|
-
const MAX_ENTRIES = 500;
|
|
5
|
-
/** Read-only fallback used only over an authenticated Host channel when Harness has a native-only picker. */
|
|
6
|
-
export async function listRemoteDirectory(path, signal) {
|
|
7
|
-
signal?.throwIfAborted();
|
|
8
|
-
const home = resolve(homedir());
|
|
9
|
-
const target = path === undefined || path.trim() === '' ? home : resolve(path);
|
|
10
|
-
if (!isAbsolute(target))
|
|
11
|
-
throw new Error('The remote directory path must be absolute.');
|
|
12
|
-
const rows = await readdir(target, { withFileTypes: true });
|
|
13
|
-
const directories = [];
|
|
14
|
-
for (const row of rows) {
|
|
15
|
-
signal?.throwIfAborted();
|
|
16
|
-
const child = resolve(target, row.name);
|
|
17
|
-
let directory = row.isDirectory();
|
|
18
|
-
if (!directory && row.isSymbolicLink())
|
|
19
|
-
directory = await stat(child).then(value => value.isDirectory()).catch(() => false);
|
|
20
|
-
if (!directory)
|
|
21
|
-
continue;
|
|
22
|
-
directories.push({ name: row.name, path: child, hidden: platform() !== 'win32' && row.name.startsWith('.') });
|
|
23
|
-
}
|
|
24
|
-
directories.sort((left, right) => left.name.localeCompare(right.name, undefined, { sensitivity: 'base' }));
|
|
25
|
-
return {
|
|
26
|
-
path: target,
|
|
27
|
-
home,
|
|
28
|
-
crumbs: crumbs(target),
|
|
29
|
-
entries: directories.slice(0, MAX_ENTRIES),
|
|
30
|
-
truncated: directories.length > MAX_ENTRIES,
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
function crumbs(path) {
|
|
34
|
-
const root = parse(path).root;
|
|
35
|
-
const result = [{ name: root, path: root, hidden: false }];
|
|
36
|
-
const segments = [];
|
|
37
|
-
let current = path;
|
|
38
|
-
while (current !== root) {
|
|
39
|
-
segments.unshift(basename(current));
|
|
40
|
-
current = dirname(current);
|
|
41
|
-
}
|
|
42
|
-
for (const segment of segments) {
|
|
43
|
-
current = resolve(current, segment);
|
|
44
|
-
result.push({ name: segment, path: current, hidden: false });
|
|
45
|
-
}
|
|
46
|
-
return result;
|
|
47
|
-
}
|
|
48
|
-
//# sourceMappingURL=remote-directory-browser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"remote-directory-browser.js","sourceRoot":"","sources":["../src/remote-directory-browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
export interface RemoteFileContentMeta {
|
|
2
|
-
name: string;
|
|
3
|
-
size: number;
|
|
4
|
-
mime?: string;
|
|
5
|
-
mtimeMs?: number;
|
|
6
|
-
isDirectory?: boolean;
|
|
7
|
-
}
|
|
8
|
-
export interface RemoteFileContentEntry extends RemoteFileContentMeta {
|
|
9
|
-
locator: string;
|
|
10
|
-
}
|
|
11
|
-
export interface RemoteFileReadRequest {
|
|
12
|
-
offset: number;
|
|
13
|
-
length: number;
|
|
14
|
-
signal: AbortSignal;
|
|
15
|
-
}
|
|
16
|
-
export interface RemoteFileContentProvider {
|
|
17
|
-
id: string;
|
|
18
|
-
priority: number;
|
|
19
|
-
supports(locator: string): boolean;
|
|
20
|
-
stat(locator: string, signal: AbortSignal): Promise<RemoteFileContentMeta | undefined>;
|
|
21
|
-
read(locator: string, request: RemoteFileReadRequest): Promise<Uint8Array>;
|
|
22
|
-
list(locator: string, signal: AbortSignal): Promise<RemoteFileContentEntry[]>;
|
|
23
|
-
openExternal?: (locator: string, signal: AbortSignal) => Promise<void>;
|
|
24
|
-
saveAsAllowed?: (locator: string) => boolean | {
|
|
25
|
-
allowed: boolean;
|
|
26
|
-
maxBytes?: number;
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
export type RemoteFileControlCall = <T>(endpoint: 'fileviewer.stat' | 'fileviewer.readRange' | 'fileviewer.list', payload: Record<string, unknown>, signal?: AbortSignal) => Promise<T>;
|
|
30
|
-
export interface RemoteFileViewerStatus {
|
|
31
|
-
mode: 'local' | 'remote';
|
|
32
|
-
transport?: 'LAN' | 'P2P' | 'TURN' | 'Relay' | 'Disconnected';
|
|
33
|
-
remoteFeatures?: {
|
|
34
|
-
fileViewer: boolean;
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
/** Fail closed for legacy/unknown Hosts that predate remote file-viewer support. */
|
|
38
|
-
export declare function shouldUseRemoteFileViewer(status: RemoteFileViewerStatus): boolean;
|
|
39
|
-
export declare const REMOTE_FILE_SAVE_AS_MAX_BYTES: number;
|
|
40
|
-
export declare const REMOTE_FILE_FAST_SAVE_AS_MAX_BYTES: number;
|
|
41
|
-
export declare function shouldAllowRemoteFileSaveAs(status: RemoteFileViewerStatus): boolean;
|
|
42
|
-
export declare function remoteFileSaveAsMaxBytes(status: RemoteFileViewerStatus): number;
|
|
43
|
-
/** Browser-side provider registered into dsh-file-viewer's `fileViewer` service. */
|
|
44
|
-
export declare function createRemoteFileContentProvider(call: RemoteFileControlCall, options?: {
|
|
45
|
-
saveAsAllowed?: boolean | (() => boolean);
|
|
46
|
-
saveAsMaxBytes?: number | (() => number);
|
|
47
|
-
}): RemoteFileContentProvider;
|
|
48
|
-
//# sourceMappingURL=remote-file-content-provider.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"remote-file-content-provider.d.ts","sourceRoot":"","sources":["../src/remote-file-content-provider.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,sBAAuB,SAAQ,qBAAqB;IACnE,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,WAAW,CAAA;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAA;IAClC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAAA;IACtF,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IAC1E,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAA;IAC7E,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACtE,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACvF;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,EACpC,QAAQ,EAAE,iBAAiB,GAAG,sBAAsB,GAAG,iBAAiB,EACxE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,CAAC,CAAC,CAAA;AAEf,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAA;IACxB,SAAS,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,cAAc,CAAA;IAC7D,cAAc,CAAC,EAAE;QAAE,UAAU,EAAE,OAAO,CAAA;KAAE,CAAA;CACzC;AAED,oFAAoF;AACpF,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAEjF;AAED,eAAO,MAAM,6BAA6B,QAAoB,CAAA;AAC9D,eAAO,MAAM,kCAAkC,QAAqB,CAAA;AAEpE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAEnF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAI/E;AA+BD,oFAAoF;AACpF,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,qBAAqB,EAAE,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAA;CAAO,GAAG,yBAAyB,CAwD7M"}
|