@blue-soda/dsh-remote 0.4.28
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/LICENSE +29 -0
- package/README.md +81 -0
- package/bin/ds-harness-remote.js +11 -0
- package/cordis.patch.yml +32 -0
- package/dist/acp.d.ts +75 -0
- package/dist/acp.d.ts.map +1 -0
- package/dist/acp.js +61 -0
- package/dist/acp.js.map +1 -0
- package/dist/api-proxy-switch.d.ts +33 -0
- package/dist/api-proxy-switch.d.ts.map +1 -0
- package/dist/api-proxy-switch.js +109 -0
- package/dist/api-proxy-switch.js.map +1 -0
- package/dist/bin/doctor.d.ts +3 -0
- package/dist/bin/doctor.d.ts.map +1 -0
- package/dist/bin/doctor.js +13 -0
- package/dist/bin/doctor.js.map +1 -0
- package/dist/cli.d.ts +32 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +289 -0
- package/dist/cli.js.map +1 -0
- package/dist/client-runtime.d.ts +239 -0
- package/dist/client-runtime.d.ts.map +1 -0
- package/dist/client-runtime.js +1391 -0
- package/dist/client-runtime.js.map +1 -0
- package/dist/client-secure-transport.d.ts +23 -0
- package/dist/client-secure-transport.d.ts.map +1 -0
- package/dist/client-secure-transport.js +143 -0
- package/dist/client-secure-transport.js.map +1 -0
- package/dist/client.d.ts +13 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.github.js +4231 -0
- package/dist/client.js +4231 -0
- package/dist/codex/app-server.d.ts +71 -0
- package/dist/codex/app-server.d.ts.map +1 -0
- package/dist/codex/app-server.js +268 -0
- package/dist/codex/app-server.js.map +1 -0
- package/dist/codex/codex-image-codec.d.ts +7 -0
- package/dist/codex/codex-image-codec.d.ts.map +1 -0
- package/dist/codex/codex-image-codec.js +288 -0
- package/dist/codex/codex-image-codec.js.map +1 -0
- package/dist/codex/domain.d.ts +93 -0
- package/dist/codex/domain.d.ts.map +1 -0
- package/dist/codex/domain.js +1282 -0
- package/dist/codex/domain.js.map +1 -0
- package/dist/codex/method-policy.d.ts +338 -0
- package/dist/codex/method-policy.d.ts.map +1 -0
- package/dist/codex/method-policy.js +141 -0
- package/dist/codex/method-policy.js.map +1 -0
- package/dist/codex/peer-bridge.d.ts +57 -0
- package/dist/codex/peer-bridge.d.ts.map +1 -0
- package/dist/codex/peer-bridge.js +299 -0
- package/dist/codex/peer-bridge.js.map +1 -0
- package/dist/codex/permissions.d.ts +4 -0
- package/dist/codex/permissions.d.ts.map +1 -0
- package/dist/codex/permissions.js +21 -0
- package/dist/codex/permissions.js.map +1 -0
- package/dist/codex/session-id.d.ts +10 -0
- package/dist/codex/session-id.d.ts.map +1 -0
- package/dist/codex/session-id.js +15 -0
- package/dist/codex/session-id.js.map +1 -0
- package/dist/codex/virtual-harness.d.ts +209 -0
- package/dist/codex/virtual-harness.d.ts.map +1 -0
- package/dist/codex/virtual-harness.js +2616 -0
- package/dist/codex/virtual-harness.js.map +1 -0
- package/dist/codex-workspace-bridge.d.ts +108 -0
- package/dist/codex-workspace-bridge.d.ts.map +1 -0
- package/dist/codex-workspace-bridge.js +502 -0
- package/dist/codex-workspace-bridge.js.map +1 -0
- package/dist/config.d.ts +99 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +127 -0
- package/dist/config.js.map +1 -0
- package/dist/connection-controller.d.ts +44 -0
- package/dist/connection-controller.d.ts.map +1 -0
- package/dist/connection-controller.js +185 -0
- package/dist/connection-controller.js.map +1 -0
- package/dist/control-route.d.ts +34 -0
- package/dist/control-route.d.ts.map +1 -0
- package/dist/control-route.js +136 -0
- package/dist/control-route.js.map +1 -0
- package/dist/control-runtime.d.ts +138 -0
- package/dist/control-runtime.d.ts.map +1 -0
- package/dist/control-runtime.js +543 -0
- package/dist/control-runtime.js.map +1 -0
- package/dist/control-stream.d.ts +67 -0
- package/dist/control-stream.d.ts.map +1 -0
- package/dist/control-stream.js +179 -0
- package/dist/control-stream.js.map +1 -0
- package/dist/defaults.d.ts +9 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +9 -0
- package/dist/defaults.js.map +1 -0
- package/dist/file-viewer-bridge.d.ts +30 -0
- package/dist/file-viewer-bridge.d.ts.map +1 -0
- package/dist/file-viewer-bridge.js +128 -0
- package/dist/file-viewer-bridge.js.map +1 -0
- package/dist/file-viewer-contract.d.ts +5 -0
- package/dist/file-viewer-contract.d.ts.map +1 -0
- package/dist/file-viewer-contract.js +4 -0
- package/dist/file-viewer-contract.js.map +1 -0
- package/dist/harness-api-bridge.d.ts +79 -0
- package/dist/harness-api-bridge.d.ts.map +1 -0
- package/dist/harness-api-bridge.js +852 -0
- package/dist/harness-api-bridge.js.map +1 -0
- package/dist/harness-api-history.d.ts +3 -0
- package/dist/harness-api-history.d.ts.map +1 -0
- package/dist/harness-api-history.js +59 -0
- package/dist/harness-api-history.js.map +1 -0
- package/dist/harness-remote-bridge.d.ts +52 -0
- package/dist/harness-remote-bridge.d.ts.map +1 -0
- package/dist/harness-remote-bridge.js +529 -0
- package/dist/harness-remote-bridge.js.map +1 -0
- package/dist/harness-version.d.ts +23 -0
- package/dist/harness-version.d.ts.map +1 -0
- package/dist/harness-version.js +95 -0
- package/dist/harness-version.js.map +1 -0
- package/dist/identity-store.d.ts +45 -0
- package/dist/identity-store.d.ts.map +1 -0
- package/dist/identity-store.js +183 -0
- package/dist/identity-store.js.map +1 -0
- package/dist/ids.d.ts +2 -0
- package/dist/ids.d.ts.map +1 -0
- package/dist/ids.js +17 -0
- package/dist/ids.js.map +1 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28870 -0
- package/dist/index.js.map +7 -0
- package/dist/logging.d.ts +18 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +30 -0
- package/dist/logging.js.map +1 -0
- package/dist/loopback-host.d.ts +20 -0
- package/dist/loopback-host.d.ts.map +1 -0
- package/dist/loopback-host.js +245 -0
- package/dist/loopback-host.js.map +1 -0
- package/dist/loopback-preview.d.ts +19 -0
- package/dist/loopback-preview.d.ts.map +1 -0
- package/dist/loopback-preview.js +232 -0
- package/dist/loopback-preview.js.map +1 -0
- package/dist/native-rtc-helper.d.ts +14 -0
- package/dist/native-rtc-helper.d.ts.map +1 -0
- package/dist/native-rtc-helper.js +575 -0
- package/dist/native-rtc-helper.js.map +1 -0
- package/dist/remote-api-proxy.d.ts +17 -0
- package/dist/remote-api-proxy.d.ts.map +1 -0
- package/dist/remote-api-proxy.js +400 -0
- package/dist/remote-api-proxy.js.map +1 -0
- package/dist/remote-directory-browser.d.ts +16 -0
- package/dist/remote-directory-browser.d.ts.map +1 -0
- package/dist/remote-directory-browser.js +48 -0
- package/dist/remote-directory-browser.js.map +1 -0
- package/dist/remote-file-content-provider.d.ts +48 -0
- package/dist/remote-file-content-provider.d.ts.map +1 -0
- package/dist/remote-file-content-provider.js +93 -0
- package/dist/remote-file-content-provider.js.map +1 -0
- package/dist/remote-typert-gateway.d.ts +20 -0
- package/dist/remote-typert-gateway.d.ts.map +1 -0
- package/dist/remote-typert-gateway.js +332 -0
- package/dist/remote-typert-gateway.js.map +1 -0
- package/dist/rpc-router.d.ts +31 -0
- package/dist/rpc-router.d.ts.map +1 -0
- package/dist/rpc-router.js +201 -0
- package/dist/rpc-router.js.map +1 -0
- package/dist/safe-error.d.ts +8 -0
- package/dist/safe-error.d.ts.map +1 -0
- package/dist/safe-error.js +20 -0
- package/dist/safe-error.js.map +1 -0
- package/dist/server-api.d.ts +109 -0
- package/dist/server-api.d.ts.map +1 -0
- package/dist/server-api.js +520 -0
- package/dist/server-api.js.map +1 -0
- package/dist/server-connection.d.ts +79 -0
- package/dist/server-connection.d.ts.map +1 -0
- package/dist/server-connection.js +1023 -0
- package/dist/server-connection.js.map +1 -0
- package/dist/server-credentials.d.ts +55 -0
- package/dist/server-credentials.d.ts.map +1 -0
- package/dist/server-credentials.js +105 -0
- package/dist/server-credentials.js.map +1 -0
- package/dist/service.d.ts +141 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +432 -0
- package/dist/service.js.map +1 -0
- package/dist/session-format-compat.d.ts +3 -0
- package/dist/session-format-compat.d.ts.map +1 -0
- package/dist/session-format-compat.js +183 -0
- package/dist/session-format-compat.js.map +1 -0
- package/dist/status-stream.d.ts +48 -0
- package/dist/status-stream.d.ts.map +1 -0
- package/dist/status-stream.js +133 -0
- package/dist/status-stream.js.map +1 -0
- package/dist/terminal-policy.d.ts +21 -0
- package/dist/terminal-policy.d.ts.map +1 -0
- package/dist/terminal-policy.js +68 -0
- package/dist/terminal-policy.js.map +1 -0
- package/dist/tui-command.d.ts +13 -0
- package/dist/tui-command.d.ts.map +1 -0
- package/dist/tui-command.js +390 -0
- package/dist/tui-command.js.map +1 -0
- package/dist/typert-gateway-contract.d.ts +59 -0
- package/dist/typert-gateway-contract.d.ts.map +1 -0
- package/dist/typert-gateway-contract.js +2 -0
- package/dist/typert-gateway-contract.js.map +1 -0
- package/dist/typert-gateway-switch.d.ts +85 -0
- package/dist/typert-gateway-switch.d.ts.map +1 -0
- package/dist/typert-gateway-switch.js +315 -0
- package/dist/typert-gateway-switch.js.map +1 -0
- package/dist/types.d.ts +20 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +12 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +12 -0
- package/dist/version.js.map +1 -0
- package/dist/werift-rtc.d.ts +121 -0
- package/dist/werift-rtc.d.ts.map +1 -0
- package/dist/werift-rtc.js +490 -0
- package/dist/werift-rtc.js.map +1 -0
- package/dsh-plugin.json +41 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +165 -0
- package/public.d.ts +26 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
import { RemoteClientError } from '@dsh-remote/client-core';
|
|
2
|
+
import { HARNESS_API_TRANSFER_CHUNK_BYTES, MAX_HARNESS_API_TRANSFER_BYTES, } from '@dsh-remote/protocol';
|
|
3
|
+
import { uuidV7 } from './ids.js';
|
|
4
|
+
const DIRECT_API_CALL_BYTES = 2 * 1024 * 1024;
|
|
5
|
+
const AGENT_PRESET_SETTINGS_NS = 'agent-presets';
|
|
6
|
+
const LEGACY_AGENT_PRESET_ALIASES = {
|
|
7
|
+
code: 'ptc',
|
|
8
|
+
};
|
|
9
|
+
const WELCOME_NOTICE_NAMESPACE = 'ui-settings-general';
|
|
10
|
+
const WELCOME_NOTICE_FIELD = 'welcomeNoticeVersion';
|
|
11
|
+
const WELCOME_NOTICE_VERSION = '2026-08-13.1';
|
|
12
|
+
/** ApiProxy-compatible face that preserves the native Harness envelopes over Remote RPC. */
|
|
13
|
+
export class RemoteHarnessApiProxy {
|
|
14
|
+
client;
|
|
15
|
+
harnessVersion;
|
|
16
|
+
api;
|
|
17
|
+
legacyWelcomeAcknowledged = false;
|
|
18
|
+
settingsDescribeValue;
|
|
19
|
+
constructor(client, harnessVersion) {
|
|
20
|
+
this.client = client;
|
|
21
|
+
this.harnessVersion = harnessVersion;
|
|
22
|
+
const call = (method) => (request, signal) => this.call(method, request, signal);
|
|
23
|
+
this.api = {
|
|
24
|
+
sessions: {
|
|
25
|
+
list: call('session.list'),
|
|
26
|
+
search: call('session.search'),
|
|
27
|
+
create: call('session.create'),
|
|
28
|
+
history: call('session.history'),
|
|
29
|
+
models: call('session.models'),
|
|
30
|
+
selectModel: call('session.selectModel'),
|
|
31
|
+
rename: call('session.rename'),
|
|
32
|
+
fork: call('session.fork'),
|
|
33
|
+
prompt: call('session.prompt'),
|
|
34
|
+
attachment: call('session.attachment'),
|
|
35
|
+
updateQueue: call('session.updateQueue'),
|
|
36
|
+
cancel: call('session.cancel'),
|
|
37
|
+
},
|
|
38
|
+
subagents: {
|
|
39
|
+
list: call('subagent.list'),
|
|
40
|
+
history: call('subagent.history'),
|
|
41
|
+
prompt: call('subagent.prompt'),
|
|
42
|
+
interrupt: call('subagent.interrupt'),
|
|
43
|
+
},
|
|
44
|
+
host: {
|
|
45
|
+
describe: call('host.describe'),
|
|
46
|
+
pickDirectory: call('host.pickDirectory'),
|
|
47
|
+
listDirectory: call('host.listDirectory'),
|
|
48
|
+
createDirectory: call('host.createDirectory'),
|
|
49
|
+
openPath: call('host.openPath'),
|
|
50
|
+
},
|
|
51
|
+
workspace: {
|
|
52
|
+
list: call('workspace.list'),
|
|
53
|
+
create: call('workspace.create'),
|
|
54
|
+
rename: call('workspace.rename'),
|
|
55
|
+
delete: call('workspace.delete'),
|
|
56
|
+
insertBefore: call('workspace.insertBefore'),
|
|
57
|
+
insertSessionBefore: call('workspace.insertSessionBefore'),
|
|
58
|
+
archiveSession: call('workspace.archiveSession'),
|
|
59
|
+
},
|
|
60
|
+
skills: { list: call('skill.list') },
|
|
61
|
+
agentPresets: {
|
|
62
|
+
list: call('agentPreset.list'),
|
|
63
|
+
select: call('agentPreset.select'),
|
|
64
|
+
read: call('agentPreset.read'),
|
|
65
|
+
copy: call('agentPreset.copy'),
|
|
66
|
+
openDocument: call('agentPreset.openDocument'),
|
|
67
|
+
remove: call('agentPreset.remove'),
|
|
68
|
+
},
|
|
69
|
+
goals: {
|
|
70
|
+
create: call('goal.create'),
|
|
71
|
+
edit: call('goal.edit'),
|
|
72
|
+
pause: call('goal.pause'),
|
|
73
|
+
resume: call('goal.resume'),
|
|
74
|
+
complete: call('goal.complete'),
|
|
75
|
+
clear: call('goal.clear'),
|
|
76
|
+
},
|
|
77
|
+
settings: {
|
|
78
|
+
describe: call('settings.describe'),
|
|
79
|
+
openDocument: call('settings.openDocument'),
|
|
80
|
+
update: call('settings.update'),
|
|
81
|
+
replace: call('settings.replace'),
|
|
82
|
+
mutate: call('settings.mutate'),
|
|
83
|
+
},
|
|
84
|
+
credentials: {
|
|
85
|
+
describe: call('credentials.describe'),
|
|
86
|
+
set: call('credentials.set'),
|
|
87
|
+
unset: call('credentials.unset'),
|
|
88
|
+
},
|
|
89
|
+
llm: {
|
|
90
|
+
providers: call('llm.providers'),
|
|
91
|
+
models: call('llm.models'),
|
|
92
|
+
discoverModels: call('llm.discoverModels'),
|
|
93
|
+
},
|
|
94
|
+
events: {
|
|
95
|
+
mux: (request, signal) => this.stream('mux', request, signal),
|
|
96
|
+
host: (request, signal) => this.stream('host', request, signal),
|
|
97
|
+
},
|
|
98
|
+
downloads: {},
|
|
99
|
+
respond: message => this.respond(message),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
async call(method, request, signal) {
|
|
103
|
+
const params = {
|
|
104
|
+
method,
|
|
105
|
+
rpcId: String(request.rpcId),
|
|
106
|
+
payload: normalizeLegacyRequest(method, request.payload),
|
|
107
|
+
};
|
|
108
|
+
const encoded = new TextEncoder().encode(JSON.stringify(params));
|
|
109
|
+
const response = method === 'session.attachment' || encoded.byteLength > DIRECT_API_CALL_BYTES
|
|
110
|
+
? await this.callTransferred(encoded, signal)
|
|
111
|
+
: await this.client.rpc('harness.api.call', params, signal);
|
|
112
|
+
if (String(response.rpcId) !== String(request.rpcId) || typeof response.result !== 'object' || response.result === null) {
|
|
113
|
+
throw new Error('The remote Host returned an invalid Harness API response.');
|
|
114
|
+
}
|
|
115
|
+
const normalized = normalizeLegacyResponse(method, response);
|
|
116
|
+
return this.normalizeLegacyWelcomeSettings(method, params.payload, normalized);
|
|
117
|
+
}
|
|
118
|
+
normalizeLegacyWelcomeSettings(method, payload, response) {
|
|
119
|
+
if (!isLegacyRemoteHost(this.harnessVersion))
|
|
120
|
+
return response;
|
|
121
|
+
if (method === 'settings.describe' && response.result.ok && isRecord(response.result.value)) {
|
|
122
|
+
this.settingsDescribeValue = response.result.value;
|
|
123
|
+
return this.legacyWelcomeAcknowledged ? patchWelcomeDescribe(response) : response;
|
|
124
|
+
}
|
|
125
|
+
if (method !== 'settings.mutate' || !isWelcomeNoticeRequest(payload))
|
|
126
|
+
return response;
|
|
127
|
+
this.legacyWelcomeAcknowledged = true;
|
|
128
|
+
// Older Hosts reject the 0.1.7 onboarding field before returning a usable
|
|
129
|
+
// settings snapshot. Treat the acknowledgement as client-local in that
|
|
130
|
+
// case; a later describe is patched when one becomes available.
|
|
131
|
+
return patchWelcomeMutate(this.settingsDescribeValue ?? { namespaces: [] }, response.rpcId);
|
|
132
|
+
}
|
|
133
|
+
async callTransferred(encoded, signal) {
|
|
134
|
+
if (encoded.byteLength > MAX_HARNESS_API_TRANSFER_BYTES) {
|
|
135
|
+
throw new Error('The Harness API request exceeds the remote image transfer limit.');
|
|
136
|
+
}
|
|
137
|
+
const transferId = uuidV7();
|
|
138
|
+
const totalChunks = Math.ceil(encoded.byteLength / HARNESS_API_TRANSFER_CHUNK_BYTES);
|
|
139
|
+
let opened = false;
|
|
140
|
+
try {
|
|
141
|
+
await this.client.rpc('harness.api.transfer.open', {
|
|
142
|
+
transferId,
|
|
143
|
+
totalBytes: encoded.byteLength,
|
|
144
|
+
totalChunks,
|
|
145
|
+
}, signal);
|
|
146
|
+
opened = true;
|
|
147
|
+
for (let index = 0; index < totalChunks; index += 1) {
|
|
148
|
+
const start = index * HARNESS_API_TRANSFER_CHUNK_BYTES;
|
|
149
|
+
const chunk = encoded.subarray(start, Math.min(start + HARNESS_API_TRANSFER_CHUNK_BYTES, encoded.byteLength));
|
|
150
|
+
await this.client.rpc('harness.api.transfer.chunk', {
|
|
151
|
+
transferId,
|
|
152
|
+
index,
|
|
153
|
+
data: bytesToBase64(chunk),
|
|
154
|
+
}, signal);
|
|
155
|
+
}
|
|
156
|
+
const committed = await this.client.rpc('harness.api.transfer.commit', { transferId }, signal);
|
|
157
|
+
if (committed.kind === 'inline')
|
|
158
|
+
return committed.response;
|
|
159
|
+
if (committed.transferId !== transferId
|
|
160
|
+
|| committed.totalBytes <= 0
|
|
161
|
+
|| committed.totalBytes > MAX_HARNESS_API_TRANSFER_BYTES
|
|
162
|
+
|| committed.totalChunks !== Math.ceil(committed.totalBytes / HARNESS_API_TRANSFER_CHUNK_BYTES)) {
|
|
163
|
+
throw new Error('The remote Host returned an invalid Harness API transfer descriptor.');
|
|
164
|
+
}
|
|
165
|
+
const responseBytes = new Uint8Array(committed.totalBytes);
|
|
166
|
+
let offset = 0;
|
|
167
|
+
for (let index = 0; index < committed.totalChunks; index += 1) {
|
|
168
|
+
const result = await this.client.rpc('harness.api.transfer.read', { transferId, index }, signal);
|
|
169
|
+
if (result.transferId !== transferId || result.index !== index) {
|
|
170
|
+
throw new Error('The remote Host returned an out-of-order Harness API transfer chunk.');
|
|
171
|
+
}
|
|
172
|
+
const chunk = base64ToBytes(result.data);
|
|
173
|
+
const expectedBytes = Math.min(HARNESS_API_TRANSFER_CHUNK_BYTES, committed.totalBytes - offset);
|
|
174
|
+
if (chunk.byteLength !== expectedBytes) {
|
|
175
|
+
throw new Error('The remote Host returned an invalid Harness API transfer chunk.');
|
|
176
|
+
}
|
|
177
|
+
responseBytes.set(chunk, offset);
|
|
178
|
+
offset += chunk.byteLength;
|
|
179
|
+
}
|
|
180
|
+
return JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(responseBytes));
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
if (opened) {
|
|
184
|
+
await this.client.rpc('harness.api.transfer.close', { transferId }).catch(() => undefined);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
async respond(message) {
|
|
189
|
+
return this.client.rpc('harness.api.respond', { message });
|
|
190
|
+
}
|
|
191
|
+
async *stream(stream, request, signal) {
|
|
192
|
+
const streamId = uuidV7();
|
|
193
|
+
const queue = new AsyncFrameQueue();
|
|
194
|
+
const unsubscribe = this.client.onEvent(event => routeStreamEvent(event, streamId, queue));
|
|
195
|
+
const unsubscribeClose = this.client.onClose(() => queue.close());
|
|
196
|
+
const onAbort = () => queue.close();
|
|
197
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
198
|
+
try {
|
|
199
|
+
try {
|
|
200
|
+
await this.client.rpc('harness.api.stream.open', {
|
|
201
|
+
streamId,
|
|
202
|
+
stream,
|
|
203
|
+
rpcId: String(request.rpcId),
|
|
204
|
+
payload: request.payload,
|
|
205
|
+
}, signal);
|
|
206
|
+
for await (const frame of queue)
|
|
207
|
+
yield frame;
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
// Native Harness event consumers treat a thrown stream iterator as a
|
|
211
|
+
// fatal load failure. A remote disconnect is normal lifecycle here:
|
|
212
|
+
// ClientModeRuntime has already switched ApiProxy back to local mode,
|
|
213
|
+
// so finish this old iterator cleanly instead of terminating Harness.
|
|
214
|
+
if (!isRemoteDisconnect(error))
|
|
215
|
+
throw error;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
finally {
|
|
219
|
+
signal.removeEventListener('abort', onAbort);
|
|
220
|
+
unsubscribe();
|
|
221
|
+
unsubscribeClose();
|
|
222
|
+
queue.close();
|
|
223
|
+
await this.client.rpc('harness.api.stream.close', { streamId }).catch(() => undefined);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/** RC7 host.describe did not include the home field made mandatory by RC8. */
|
|
228
|
+
function normalizeLegacyResponse(method, response) {
|
|
229
|
+
if (method !== 'host.describe' || !response.result.ok)
|
|
230
|
+
return response;
|
|
231
|
+
const value = response.result.value;
|
|
232
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
233
|
+
return response;
|
|
234
|
+
const description = value;
|
|
235
|
+
if (typeof description.home === 'string' || typeof description.cwd !== 'string')
|
|
236
|
+
return response;
|
|
237
|
+
return {
|
|
238
|
+
...response,
|
|
239
|
+
result: {
|
|
240
|
+
...response.result,
|
|
241
|
+
value: { ...description, home: description.cwd },
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/** Older Remote Web clients persisted the pre-rc.1 coding preset id as `code`. */
|
|
246
|
+
function normalizeLegacyRequest(method, payload) {
|
|
247
|
+
if (!isRecord(payload))
|
|
248
|
+
return payload;
|
|
249
|
+
if (method === 'agentPreset.read')
|
|
250
|
+
return replaceAgentPreset(payload, 'agentPreset');
|
|
251
|
+
if (method === 'agentPreset.select')
|
|
252
|
+
return replaceAgentPreset(payload, 'agentPreset');
|
|
253
|
+
if (method === 'agentPreset.copy')
|
|
254
|
+
return replaceAgentPreset(payload, 'from');
|
|
255
|
+
if (method === 'settings.update' || method === 'settings.replace' || method === 'settings.mutate') {
|
|
256
|
+
return replaceAgentPresetSettings(payload);
|
|
257
|
+
}
|
|
258
|
+
return payload;
|
|
259
|
+
}
|
|
260
|
+
function replaceAgentPreset(payload, key) {
|
|
261
|
+
const value = payload[key];
|
|
262
|
+
const replacement = typeof value === 'string' ? LEGACY_AGENT_PRESET_ALIASES[value] : undefined;
|
|
263
|
+
return replacement === undefined ? payload : { ...payload, [key]: replacement };
|
|
264
|
+
}
|
|
265
|
+
function replaceAgentPresetSettings(payload) {
|
|
266
|
+
if (payload.ns !== AGENT_PRESET_SETTINGS_NS || !isRecord(payload.patch))
|
|
267
|
+
return payload;
|
|
268
|
+
const patch = replaceAgentPreset(payload.patch, 'default');
|
|
269
|
+
return patch === payload.patch ? payload : { ...payload, patch };
|
|
270
|
+
}
|
|
271
|
+
function isLegacyRemoteHost(version) {
|
|
272
|
+
if (version === undefined)
|
|
273
|
+
return false;
|
|
274
|
+
const match = /^(?:dsh-)?v?(\d+)\.(\d+)\.(\d+)(?:-|$)/u.exec(version.trim());
|
|
275
|
+
return match !== null && Number(match[1]) === 0 && Number(match[2]) === 1 && Number(match[3]) < 7;
|
|
276
|
+
}
|
|
277
|
+
function isWelcomeNoticeRequest(payload) {
|
|
278
|
+
if (!isRecord(payload) || payload.ns !== WELCOME_NOTICE_NAMESPACE || !Array.isArray(payload.ops))
|
|
279
|
+
return false;
|
|
280
|
+
return payload.ops.some(operation => isRecord(operation)
|
|
281
|
+
&& operation.op === 'set'
|
|
282
|
+
&& Array.isArray(operation.path)
|
|
283
|
+
&& operation.path.length === 1
|
|
284
|
+
&& operation.path[0] === WELCOME_NOTICE_FIELD
|
|
285
|
+
&& operation.value === WELCOME_NOTICE_VERSION);
|
|
286
|
+
}
|
|
287
|
+
function patchWelcomeDescribe(response) {
|
|
288
|
+
if (!response.result.ok || !isRecord(response.result.value) || !Array.isArray(response.result.value.namespaces))
|
|
289
|
+
return response;
|
|
290
|
+
return {
|
|
291
|
+
...response,
|
|
292
|
+
result: {
|
|
293
|
+
...response.result,
|
|
294
|
+
value: {
|
|
295
|
+
...response.result.value,
|
|
296
|
+
namespaces: response.result.value.namespaces.map(namespace => {
|
|
297
|
+
if (!isRecord(namespace) || namespace.ns !== WELCOME_NOTICE_NAMESPACE)
|
|
298
|
+
return namespace;
|
|
299
|
+
const value = isRecord(namespace.value) ? namespace.value : {};
|
|
300
|
+
return { ...namespace, value: { ...value, [WELCOME_NOTICE_FIELD]: WELCOME_NOTICE_VERSION } };
|
|
301
|
+
}),
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
function patchWelcomeMutate(value, rpcId) {
|
|
307
|
+
const response = {
|
|
308
|
+
rpcId,
|
|
309
|
+
result: { ok: true, value: { ...value, namespaces: [] } },
|
|
310
|
+
};
|
|
311
|
+
const namespaces = Array.isArray(value.namespaces) ? value.namespaces : [];
|
|
312
|
+
response.result.value.namespaces = namespaces.map(namespace => {
|
|
313
|
+
if (!isRecord(namespace) || namespace.ns !== WELCOME_NOTICE_NAMESPACE)
|
|
314
|
+
return namespace;
|
|
315
|
+
const current = isRecord(namespace.value) ? namespace.value : {};
|
|
316
|
+
return { ...namespace, value: { ...current, [WELCOME_NOTICE_FIELD]: WELCOME_NOTICE_VERSION } };
|
|
317
|
+
});
|
|
318
|
+
return response;
|
|
319
|
+
}
|
|
320
|
+
function isRemoteDisconnect(error) {
|
|
321
|
+
return error instanceof RemoteClientError
|
|
322
|
+
&& (error.code === 'TRANSPORT_CLOSED' || error.code === 'CLIENT_CLOSED');
|
|
323
|
+
}
|
|
324
|
+
function isRecord(value) {
|
|
325
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
326
|
+
}
|
|
327
|
+
class AsyncFrameQueue {
|
|
328
|
+
values = [];
|
|
329
|
+
waiters = [];
|
|
330
|
+
closed = false;
|
|
331
|
+
push(value) {
|
|
332
|
+
if (this.closed)
|
|
333
|
+
return;
|
|
334
|
+
const waiter = this.waiters.shift();
|
|
335
|
+
if (waiter === undefined)
|
|
336
|
+
this.values.push(value);
|
|
337
|
+
else
|
|
338
|
+
waiter({ done: false, value });
|
|
339
|
+
}
|
|
340
|
+
close() {
|
|
341
|
+
if (this.closed)
|
|
342
|
+
return;
|
|
343
|
+
this.closed = true;
|
|
344
|
+
for (const waiter of this.waiters.splice(0))
|
|
345
|
+
waiter({ done: true, value: undefined });
|
|
346
|
+
}
|
|
347
|
+
async *[Symbol.asyncIterator]() {
|
|
348
|
+
while (true) {
|
|
349
|
+
const value = this.values.shift();
|
|
350
|
+
if (value !== undefined) {
|
|
351
|
+
yield value;
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
354
|
+
if (this.closed)
|
|
355
|
+
return;
|
|
356
|
+
const next = await new Promise(resolve => this.waiters.push(resolve));
|
|
357
|
+
if (next.done)
|
|
358
|
+
return;
|
|
359
|
+
yield next.value;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
function routeStreamEvent(event, streamId, queue) {
|
|
364
|
+
if (event.event === 'harness.api.frame') {
|
|
365
|
+
const data = event.data;
|
|
366
|
+
if (data.streamId !== streamId || typeof data.frame !== 'object' || data.frame === null
|
|
367
|
+
|| typeof data.frame.rpcId !== 'string' || !('payload' in data.frame))
|
|
368
|
+
return;
|
|
369
|
+
queue.push(data.frame);
|
|
370
|
+
}
|
|
371
|
+
if (event.event === 'harness.api.stream.closed') {
|
|
372
|
+
const data = event.data;
|
|
373
|
+
if (data.streamId === streamId)
|
|
374
|
+
queue.close();
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
function bytesToBase64(bytes) {
|
|
378
|
+
let binary = '';
|
|
379
|
+
for (let offset = 0; offset < bytes.byteLength; offset += 0x8000) {
|
|
380
|
+
binary += String.fromCharCode(...bytes.subarray(offset, Math.min(offset + 0x8000, bytes.byteLength)));
|
|
381
|
+
}
|
|
382
|
+
return btoa(binary);
|
|
383
|
+
}
|
|
384
|
+
function base64ToBytes(value) {
|
|
385
|
+
let binary;
|
|
386
|
+
try {
|
|
387
|
+
binary = atob(value);
|
|
388
|
+
}
|
|
389
|
+
catch {
|
|
390
|
+
throw new Error('The remote Host returned a malformed Harness API transfer chunk.');
|
|
391
|
+
}
|
|
392
|
+
const bytes = new Uint8Array(binary.length);
|
|
393
|
+
for (let index = 0; index < binary.length; index += 1)
|
|
394
|
+
bytes[index] = binary.charCodeAt(index);
|
|
395
|
+
if (bytesToBase64(bytes) !== value) {
|
|
396
|
+
throw new Error('The remote Host returned a non-canonical Harness API transfer chunk.');
|
|
397
|
+
}
|
|
398
|
+
return bytes;
|
|
399
|
+
}
|
|
400
|
+
//# sourceMappingURL=remote-api-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-api-proxy.js","sourceRoot":"","sources":["../src/remote-api-proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-directory-browser.js","sourceRoot":"","sources":["../src/remote-directory-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAWzE,MAAM,WAAW,GAAG,GAAG,CAAA;AAEvB,6GAA6G;AAC7G,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAa,EAAE,MAAoB;IAC3E,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IAC/B,MAAM,MAAM,GAAG,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9E,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IACvF,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3D,MAAM,WAAW,GAAqB,EAAE,CAAA;IACxC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,EAAE,cAAc,EAAE,CAAA;QACxB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;QACvC,IAAI,SAAS,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;QACjC,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,cAAc,EAAE;YAAE,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;QAC3H,IAAI,CAAC,SAAS;YAAE,SAAQ;QACxB,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC/G,CAAC;IACD,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IAC1G,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI;QACJ,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;QAC1C,SAAS,EAAE,WAAW,CAAC,MAAM,GAAG,WAAW;KAC5C,CAAA;AACH,CAAC;AAED,SAAS,MAAM,CAAC,IAAY;IAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAA;IAC7B,MAAM,MAAM,GAAqB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IAC5E,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,IAAI,OAAO,GAAG,IAAI,CAAA;IAClB,OAAO,OAAO,KAAK,IAAI,EAAE,CAAC;QACxB,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;QACnC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACnC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IAC9D,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { REMOTE_FILE_CHUNK_BYTES } from './file-viewer-contract.js';
|
|
2
|
+
/** Fail closed for legacy/unknown Hosts that predate remote file-viewer support. */
|
|
3
|
+
export function shouldUseRemoteFileViewer(status) {
|
|
4
|
+
return status.mode === 'remote' && status.remoteFeatures?.fileViewer === true;
|
|
5
|
+
}
|
|
6
|
+
export const REMOTE_FILE_SAVE_AS_MAX_BYTES = 100 * 1024 * 1024;
|
|
7
|
+
export const REMOTE_FILE_FAST_SAVE_AS_MAX_BYTES = 1024 * 1024 * 1024;
|
|
8
|
+
export function shouldAllowRemoteFileSaveAs(status) {
|
|
9
|
+
return shouldUseRemoteFileViewer(status) && (status.transport === 'LAN' || status.transport === 'P2P' || status.transport === 'TURN');
|
|
10
|
+
}
|
|
11
|
+
export function remoteFileSaveAsMaxBytes(status) {
|
|
12
|
+
return status.transport === 'LAN' || status.transport === 'P2P'
|
|
13
|
+
? REMOTE_FILE_FAST_SAVE_AS_MAX_BYTES
|
|
14
|
+
: REMOTE_FILE_SAVE_AS_MAX_BYTES;
|
|
15
|
+
}
|
|
16
|
+
/** Browser-side provider registered into dsh-file-viewer's `fileViewer` service. */
|
|
17
|
+
export function createRemoteFileContentProvider(call, options = {}) {
|
|
18
|
+
return {
|
|
19
|
+
id: 'dsh-remote-files',
|
|
20
|
+
priority: 10_000,
|
|
21
|
+
supports: () => true,
|
|
22
|
+
saveAsAllowed: () => ({
|
|
23
|
+
allowed: currentSaveAsAllowed(options.saveAsAllowed),
|
|
24
|
+
maxBytes: currentSaveAsMaxBytes(options.saveAsMaxBytes),
|
|
25
|
+
}),
|
|
26
|
+
async stat(locator, signal) {
|
|
27
|
+
const value = await call('fileviewer.stat', { path: locator }, signal);
|
|
28
|
+
if (!value.exists)
|
|
29
|
+
return undefined;
|
|
30
|
+
return {
|
|
31
|
+
name: value.name,
|
|
32
|
+
size: value.isDirectory ? 0 : value.size,
|
|
33
|
+
mime: value.mime,
|
|
34
|
+
mtimeMs: value.mtimeMs,
|
|
35
|
+
isDirectory: value.isDirectory,
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
async read(locator, request) {
|
|
39
|
+
if (!Number.isInteger(request.offset) || request.offset < 0)
|
|
40
|
+
throw new Error('A non-negative integer offset is required.');
|
|
41
|
+
if (!Number.isInteger(request.length) || request.length <= 0)
|
|
42
|
+
throw new Error('A positive integer length is required.');
|
|
43
|
+
const chunks = [];
|
|
44
|
+
let received = 0;
|
|
45
|
+
while (received < request.length) {
|
|
46
|
+
request.signal.throwIfAborted();
|
|
47
|
+
const length = Math.min(REMOTE_FILE_CHUNK_BYTES, request.length - received);
|
|
48
|
+
const offset = request.offset + received;
|
|
49
|
+
const range = await call('fileviewer.readRange', { path: locator, offset, length }, request.signal);
|
|
50
|
+
if (range.offset !== offset)
|
|
51
|
+
throw new Error('The Remote Host returned a mismatched file range.');
|
|
52
|
+
const bytes = decodeBase64(range.data);
|
|
53
|
+
if (bytes.byteLength > length)
|
|
54
|
+
throw new Error('The Remote Host returned more file bytes than requested.');
|
|
55
|
+
chunks.push(bytes);
|
|
56
|
+
received += bytes.byteLength;
|
|
57
|
+
if (range.eof || bytes.byteLength === 0)
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
const merged = new Uint8Array(received);
|
|
61
|
+
let cursor = 0;
|
|
62
|
+
for (const chunk of chunks) {
|
|
63
|
+
merged.set(chunk, cursor);
|
|
64
|
+
cursor += chunk.byteLength;
|
|
65
|
+
}
|
|
66
|
+
return merged;
|
|
67
|
+
},
|
|
68
|
+
async list(locator, signal) {
|
|
69
|
+
const value = await call('fileviewer.list', { path: locator }, signal);
|
|
70
|
+
return value.entries.map(entry => ({
|
|
71
|
+
locator: entry.path,
|
|
72
|
+
name: entry.name,
|
|
73
|
+
size: entry.isDirectory ? 0 : (entry.size ?? 0),
|
|
74
|
+
mtimeMs: entry.mtimeMs,
|
|
75
|
+
isDirectory: entry.isDirectory,
|
|
76
|
+
}));
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function currentSaveAsAllowed(value) {
|
|
81
|
+
return typeof value === 'function' ? value() : value === true;
|
|
82
|
+
}
|
|
83
|
+
function currentSaveAsMaxBytes(value) {
|
|
84
|
+
return typeof value === 'function' ? value() : value ?? REMOTE_FILE_SAVE_AS_MAX_BYTES;
|
|
85
|
+
}
|
|
86
|
+
function decodeBase64(value) {
|
|
87
|
+
const binary = atob(value);
|
|
88
|
+
const bytes = new Uint8Array(binary.length);
|
|
89
|
+
for (let index = 0; index < binary.length; index += 1)
|
|
90
|
+
bytes[index] = binary.charCodeAt(index);
|
|
91
|
+
return bytes;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=remote-file-content-provider.js.map
|