ds-harness-remote 0.5.7 → 0.5.10
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/dist/acp/adapter.d.ts +1 -1
- package/dist/acp/adapter.d.ts.map +1 -1
- package/dist/acp/adapters/antigravity/transcript-loader.d.ts.map +1 -1
- package/dist/acp/adapters/antigravity/transcript-loader.js +4 -1
- package/dist/acp/adapters/antigravity/transcript-loader.js.map +1 -1
- package/dist/acp/adapters/claude-history.d.ts +3 -0
- package/dist/acp/adapters/claude-history.d.ts.map +1 -0
- package/dist/acp/adapters/claude-history.js +118 -0
- package/dist/acp/adapters/claude-history.js.map +1 -0
- package/dist/acp/adapters/claude-process.d.ts +21 -0
- package/dist/acp/adapters/claude-process.d.ts.map +1 -0
- package/dist/acp/adapters/claude-process.js +147 -0
- package/dist/acp/adapters/claude-process.js.map +1 -0
- package/dist/acp/adapters/cursor-process.d.ts +9 -4
- package/dist/acp/adapters/cursor-process.d.ts.map +1 -1
- package/dist/acp/adapters/cursor-process.js +31 -3
- package/dist/acp/adapters/cursor-process.js.map +1 -1
- package/dist/acp/adapters/opencode-process.d.ts +67 -0
- package/dist/acp/adapters/opencode-process.d.ts.map +1 -0
- package/dist/acp/adapters/opencode-process.js +272 -0
- package/dist/acp/adapters/opencode-process.js.map +1 -0
- package/dist/acp/adapters/opencode.d.ts +8 -0
- package/dist/acp/adapters/opencode.d.ts.map +1 -0
- package/dist/acp/adapters/opencode.js +8 -0
- package/dist/acp/adapters/opencode.js.map +1 -0
- package/dist/acp/adapters/pi-process.d.ts +42 -0
- package/dist/acp/adapters/pi-process.d.ts.map +1 -0
- package/dist/acp/adapters/pi-process.js +410 -0
- package/dist/acp/adapters/pi-process.js.map +1 -0
- package/dist/acp/gateway.d.ts +10 -0
- package/dist/acp/gateway.d.ts.map +1 -1
- package/dist/acp/gateway.js +344 -103
- package/dist/acp/gateway.js.map +1 -1
- package/dist/acp/method-policy.d.ts +19 -19
- package/dist/acp/method-policy.js +5 -5
- package/dist/acp/method-policy.js.map +1 -1
- package/dist/acp/pi-tool-result.d.ts +9 -0
- package/dist/acp/pi-tool-result.d.ts.map +1 -0
- package/dist/acp/pi-tool-result.js +22 -0
- package/dist/acp/pi-tool-result.js.map +1 -0
- package/dist/acp/virtual-catalog.d.ts +50 -0
- package/dist/acp/virtual-catalog.d.ts.map +1 -0
- package/dist/acp/virtual-catalog.js +103 -0
- package/dist/acp/virtual-catalog.js.map +1 -0
- package/dist/acp/virtual-contract.d.ts +165 -0
- package/dist/acp/virtual-contract.d.ts.map +1 -0
- package/dist/acp/virtual-contract.js +216 -0
- package/dist/acp/virtual-contract.js.map +1 -0
- package/dist/acp/virtual-event-carrier.d.ts +50 -0
- package/dist/acp/virtual-event-carrier.d.ts.map +1 -0
- package/dist/acp/virtual-event-carrier.js +222 -0
- package/dist/acp/virtual-event-carrier.js.map +1 -0
- package/dist/acp/virtual-harness.d.ts +13 -112
- package/dist/acp/virtual-harness.d.ts.map +1 -1
- package/dist/acp/virtual-harness.js +129 -911
- package/dist/acp/virtual-harness.js.map +1 -1
- package/dist/acp/virtual-live.d.ts +78 -0
- package/dist/acp/virtual-live.d.ts.map +1 -0
- package/dist/acp/virtual-live.js +513 -0
- package/dist/acp/virtual-live.js.map +1 -0
- package/dist/acp/workspace-tools.js +2 -2
- package/dist/acp/workspace-tools.js.map +1 -1
- package/dist/acp.d.ts.map +1 -1
- package/dist/acp.js +1 -0
- package/dist/acp.js.map +1 -1
- package/dist/client/header.d.ts +10 -0
- package/dist/client/header.d.ts.map +1 -0
- package/dist/client/header.js +169 -0
- package/dist/client/header.js.map +1 -0
- package/dist/client/icons.d.ts +3 -0
- package/dist/client/icons.d.ts.map +1 -0
- package/dist/client/icons.js +3 -0
- package/dist/client/icons.js.map +1 -0
- package/dist/client/navigation.d.ts +5 -0
- package/dist/client/navigation.d.ts.map +1 -0
- package/dist/client/navigation.js +30 -0
- package/dist/client/navigation.js.map +1 -0
- package/dist/client/presentation.d.ts +17 -0
- package/dist/client/presentation.d.ts.map +1 -0
- package/dist/client/presentation.js +208 -0
- package/dist/client/presentation.js.map +1 -0
- package/dist/client/progress.d.ts +10 -0
- package/dist/client/progress.d.ts.map +1 -0
- package/dist/client/progress.js +82 -0
- package/dist/client/progress.js.map +1 -0
- package/dist/client/settings.d.ts +10 -0
- package/dist/client/settings.d.ts.map +1 -0
- package/dist/client/settings.js +335 -0
- package/dist/client/settings.js.map +1 -0
- package/dist/client/shell.d.ts +6 -0
- package/dist/client/shell.d.ts.map +1 -0
- package/dist/client/shell.js +128 -0
- package/dist/client/shell.js.map +1 -0
- package/dist/client/types.d.ts +264 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client/workspaces.d.ts +11 -0
- package/dist/client/workspaces.d.ts.map +1 -0
- package/dist/client/workspaces.js +1179 -0
- package/dist/client/workspaces.js.map +1 -0
- package/dist/client-capabilities.d.ts +6 -0
- package/dist/client-capabilities.d.ts.map +1 -0
- package/dist/client-capabilities.js +88 -0
- package/dist/client-capabilities.js.map +1 -0
- package/dist/client-codex-streams.d.ts +23 -0
- package/dist/client-codex-streams.d.ts.map +1 -0
- package/dist/client-codex-streams.js +156 -0
- package/dist/client-codex-streams.js.map +1 -0
- package/dist/client-connection.d.ts +38 -0
- package/dist/client-connection.d.ts.map +1 -0
- package/dist/client-connection.js +210 -0
- package/dist/client-connection.js.map +1 -0
- package/dist/client-control.d.ts +48 -0
- package/dist/client-control.d.ts.map +1 -0
- package/dist/client-control.js +273 -0
- package/dist/client-control.js.map +1 -0
- package/dist/client-locale.d.ts +8 -0
- package/dist/client-locale.d.ts.map +1 -1
- package/dist/client-locale.js +16 -0
- package/dist/client-locale.js.map +1 -1
- package/dist/client-runtime-contract.d.ts +161 -0
- package/dist/client-runtime-contract.d.ts.map +1 -0
- package/dist/client-runtime-contract.js +127 -0
- package/dist/client-runtime-contract.js.map +1 -0
- package/dist/client-runtime.d.ts +24 -126
- package/dist/client-runtime.d.ts.map +1 -1
- package/dist/client-runtime.js +171 -867
- package/dist/client-runtime.js.map +1 -1
- package/dist/client-secure-transport.d.ts +1 -0
- package/dist/client-secure-transport.d.ts.map +1 -1
- package/dist/client-secure-transport.js +35 -16
- package/dist/client-secure-transport.js.map +1 -1
- package/dist/client-workspace-queries.d.ts +12 -0
- package/dist/client-workspace-queries.d.ts.map +1 -0
- package/dist/client-workspace-queries.js +66 -0
- package/dist/client-workspace-queries.js.map +1 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.github.js +2091 -1896
- package/dist/client.js +2091 -1896
- package/dist/client.js.map +1 -1
- package/dist/codex/domain.d.ts.map +1 -1
- package/dist/codex/domain.js +67 -46
- package/dist/codex/domain.js.map +1 -1
- package/dist/codex/method-policy.d.ts +9 -9
- package/dist/codex/virtual-catalog.d.ts +90 -0
- package/dist/codex/virtual-catalog.d.ts.map +1 -0
- package/dist/codex/virtual-catalog.js +317 -0
- package/dist/codex/virtual-catalog.js.map +1 -0
- package/dist/codex/virtual-contract.d.ts +96 -0
- package/dist/codex/virtual-contract.d.ts.map +1 -0
- package/dist/codex/virtual-contract.js +192 -0
- package/dist/codex/virtual-contract.js.map +1 -0
- package/dist/codex/virtual-event-carrier.d.ts +52 -0
- package/dist/codex/virtual-event-carrier.d.ts.map +1 -0
- package/dist/codex/virtual-event-carrier.js +212 -0
- package/dist/codex/virtual-event-carrier.js.map +1 -0
- package/dist/codex/virtual-harness.d.ts +16 -117
- package/dist/codex/virtual-harness.d.ts.map +1 -1
- package/dist/codex/virtual-harness.js +123 -1909
- package/dist/codex/virtual-harness.js.map +1 -1
- package/dist/codex/virtual-history.d.ts +74 -0
- package/dist/codex/virtual-history.d.ts.map +1 -0
- package/dist/codex/virtual-history.js +546 -0
- package/dist/codex/virtual-history.js.map +1 -0
- package/dist/codex/virtual-live.d.ts +75 -0
- package/dist/codex/virtual-live.d.ts.map +1 -0
- package/dist/codex/virtual-live.js +563 -0
- package/dist/codex/virtual-live.js.map +1 -0
- package/dist/codex/virtual-values.d.ts +29 -0
- package/dist/codex/virtual-values.d.ts.map +1 -0
- package/dist/codex/virtual-values.js +75 -0
- package/dist/codex/virtual-values.js.map +1 -0
- package/dist/config.js +4 -4
- package/dist/config.js.map +1 -1
- package/dist/control-runtime.js +2 -2
- package/dist/control-runtime.js.map +1 -1
- package/dist/harness-remote-bridge.d.ts +2 -1
- package/dist/harness-remote-bridge.d.ts.map +1 -1
- package/dist/harness-remote-bridge.js +13 -5
- package/dist/harness-remote-bridge.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23304 -15332
- package/dist/index.js.map +4 -4
- package/dist/plugin-route-dispatcher.d.ts +2 -2
- package/dist/plugin-route-dispatcher.d.ts.map +1 -1
- package/dist/plugin-route-dispatcher.js +2 -2
- package/dist/plugin-route-dispatcher.js.map +1 -1
- package/dist/remote-terminal-controller.d.ts +90 -0
- package/dist/remote-terminal-controller.d.ts.map +1 -0
- package/dist/remote-terminal-controller.js +494 -0
- package/dist/remote-terminal-controller.js.map +1 -0
- package/dist/remote-terminal-provider.d.ts +46 -0
- package/dist/remote-terminal-provider.d.ts.map +1 -0
- package/dist/remote-terminal-provider.js +147 -0
- package/dist/remote-terminal-provider.js.map +1 -0
- package/dist/remote-typert-gateway.js +7 -1
- package/dist/remote-typert-gateway.js.map +1 -1
- package/dist/server-api.d.ts +3 -0
- package/dist/server-api.d.ts.map +1 -1
- package/dist/server-api.js +24 -9
- package/dist/server-api.js.map +1 -1
- package/dist/server-connection.d.ts +1 -0
- package/dist/server-connection.d.ts.map +1 -1
- package/dist/server-connection.js +8 -1
- package/dist/server-connection.js.map +1 -1
- package/dist/service.d.ts +1 -1
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +15 -8
- package/dist/service.js.map +1 -1
- package/dist/terminal-carrier-compat.d.ts +14 -0
- package/dist/terminal-carrier-compat.d.ts.map +1 -0
- package/dist/terminal-carrier-compat.js +259 -0
- package/dist/terminal-carrier-compat.js.map +1 -0
- package/dist/terminal-policy.d.ts +6 -0
- package/dist/terminal-policy.d.ts.map +1 -1
- package/dist/terminal-policy.js +24 -6
- package/dist/terminal-policy.js.map +1 -1
- package/dist/typert-gateway-contract.d.ts +6 -1
- package/dist/typert-gateway-contract.d.ts.map +1 -1
- package/dist/typert-gateway-switch.d.ts +2 -1
- package/dist/typert-gateway-switch.d.ts.map +1 -1
- package/dist/typert-gateway-switch.js +39 -18
- package/dist/typert-gateway-switch.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/workspace-bridge.d.ts +6 -89
- package/dist/workspace-bridge.d.ts.map +1 -1
- package/dist/workspace-bridge.js +37 -294
- package/dist/workspace-bridge.js.map +1 -1
- package/dsh-plugin.json +1 -1
- package/package.json +24 -20
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { RemoteClientCore } from '@dsh-remote/client-core';
|
|
2
|
+
import { AdaptiveTransport } from '@dsh-remote/webrtc';
|
|
3
|
+
import { probeRemoteHostFeatures } from './client-capabilities.js';
|
|
4
|
+
import { assertAuthorizedHost, ClientModeError, diagnosticReason, DIRECT_LAN_PROGRESS_DISPLAY_MS, DIRECT_WEBRTC_NEGOTIATE_TIMEOUT_MS, iceServersForAttempt, preferredTransportsForAttempt, shortId, transportPreferenceForMode, webrtcDiagnosticsLogFields, websocketUrl, } from './client-runtime-contract.js';
|
|
5
|
+
import { ClientSecureTransport } from './client-secure-transport.js';
|
|
6
|
+
export class ClientConnection {
|
|
7
|
+
context;
|
|
8
|
+
constructor(context) {
|
|
9
|
+
this.context = context;
|
|
10
|
+
}
|
|
11
|
+
async connect(targetDeviceId, signal) {
|
|
12
|
+
signal?.throwIfAborted();
|
|
13
|
+
const progressRunId = this.context.connectionProgressRun + 1;
|
|
14
|
+
this.context.connectionProgressRun = progressRunId;
|
|
15
|
+
this.context.connectionProgress = { runId: progressRunId, targetDeviceId, phase: 'checking-host' };
|
|
16
|
+
const identity = this.context.requireIdentity();
|
|
17
|
+
let client;
|
|
18
|
+
try {
|
|
19
|
+
const serverDevice = (await this.context.server.listDevices()).find(device => device.deviceId === targetDeviceId);
|
|
20
|
+
if (serverDevice === undefined) {
|
|
21
|
+
throw new ClientModeError('MEMBERSHIP_REQUIRED', 'The selected Host is not authorized for this account.');
|
|
22
|
+
}
|
|
23
|
+
this.updateConnectionProgress(progressRunId, 'authorizing-peer');
|
|
24
|
+
const target = await this.authorizeHostPeer(serverDevice);
|
|
25
|
+
const presence = await this.context.server.presenceFor(targetDeviceId);
|
|
26
|
+
if (!presence.online)
|
|
27
|
+
throw new ClientModeError('HOST_OFFLINE', 'The selected Host is offline.', true);
|
|
28
|
+
const credentials = await this.context.server.authenticate(identity);
|
|
29
|
+
const rtcFactory = this.context.config.forceRelay
|
|
30
|
+
? undefined
|
|
31
|
+
: await this.context.rtcFactoryProvider({ routeTargets: [this.context.server.baseUrl] }).catch(() => undefined);
|
|
32
|
+
if (!this.context.config.forceRelay && rtcFactory === undefined) {
|
|
33
|
+
this.context.logger.warn('remote Harness WebRTC backend unavailable; using relay', {
|
|
34
|
+
targetDeviceId: shortId(target.deviceId),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
let webRtcFallback = false;
|
|
38
|
+
const createTransport = (attempt) => new AdaptiveTransport(websocketUrl(this.context.server.baseUrl), {
|
|
39
|
+
role: 'client',
|
|
40
|
+
deviceId: identity.deviceId,
|
|
41
|
+
accessToken: credentials.accessToken,
|
|
42
|
+
targetDeviceId,
|
|
43
|
+
forceRelay: this.context.config.forceRelay || attempt === 'relay',
|
|
44
|
+
preferredTransports: preferredTransportsForAttempt(attempt),
|
|
45
|
+
negotiateTimeoutMs: attempt === 'direct' ? DIRECT_WEBRTC_NEGOTIATE_TIMEOUT_MS : undefined,
|
|
46
|
+
...(rtcFactory === undefined || attempt === 'relay' ? {} : { rtcFactory }),
|
|
47
|
+
fetchIceServers: async (connectionId) => iceServersForAttempt(attempt, await this.context.server.turnCredentials(connectionId)),
|
|
48
|
+
onWebRtcFallback: (error, diagnostics) => {
|
|
49
|
+
webRtcFallback = true;
|
|
50
|
+
this.context.logger.warn(attempt === 'direct'
|
|
51
|
+
? 'remote Harness direct WebRTC failed; trying TURN'
|
|
52
|
+
: 'remote Harness TURN WebRTC failed; using relay', {
|
|
53
|
+
targetDeviceId: shortId(target.deviceId),
|
|
54
|
+
attempt,
|
|
55
|
+
reason: diagnosticReason(error),
|
|
56
|
+
});
|
|
57
|
+
if (diagnostics !== undefined) {
|
|
58
|
+
this.context.logger.debug('remote Harness WebRTC fallback diagnostics', {
|
|
59
|
+
targetDeviceId: shortId(target.deviceId),
|
|
60
|
+
attempt,
|
|
61
|
+
...webrtcDiagnosticsLogFields(diagnostics),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
const attempts = this.context.config.forceRelay || rtcFactory === undefined
|
|
67
|
+
? ['relay']
|
|
68
|
+
: ['direct', 'turn', 'relay'];
|
|
69
|
+
let transport;
|
|
70
|
+
for (const attempt of attempts) {
|
|
71
|
+
webRtcFallback = false;
|
|
72
|
+
const stopProgressTimer = this.beginAttemptProgress(progressRunId, attempt);
|
|
73
|
+
try {
|
|
74
|
+
transport = createTransport(attempt);
|
|
75
|
+
client = new RemoteClientCore(new ClientSecureTransport(transport, identity, target), 60_000);
|
|
76
|
+
const attemptClient = client;
|
|
77
|
+
const onAbort = () => { void attemptClient.close(); };
|
|
78
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
79
|
+
try {
|
|
80
|
+
signal?.throwIfAborted();
|
|
81
|
+
await attemptClient.connect();
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
signal?.removeEventListener('abort', onAbort);
|
|
85
|
+
}
|
|
86
|
+
signal?.throwIfAborted();
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
stopProgressTimer();
|
|
90
|
+
}
|
|
91
|
+
if (attempt === 'relay' || !webRtcFallback)
|
|
92
|
+
break;
|
|
93
|
+
await client.close();
|
|
94
|
+
client = undefined;
|
|
95
|
+
transport = undefined;
|
|
96
|
+
if (attempt === 'turn') {
|
|
97
|
+
this.context.logger.info('remote Harness relay fallback re-established', {
|
|
98
|
+
targetDeviceId: shortId(target.deviceId),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (client === undefined || transport === undefined) {
|
|
103
|
+
throw new ClientModeError('CONNECTION_FAILED', 'Unable to establish a remote transport.', true);
|
|
104
|
+
}
|
|
105
|
+
const connectedClient = client;
|
|
106
|
+
const connectedTransport = transport;
|
|
107
|
+
const connectedPreference = transportPreferenceForMode(connectedClient.getStats().mode);
|
|
108
|
+
this.updateConnectionProgress(progressRunId, 'connected', connectedPreference === undefined ? undefined : [connectedPreference]);
|
|
109
|
+
connectedClient.onClose(() => {
|
|
110
|
+
if (this.context.connected?.client !== connectedClient)
|
|
111
|
+
return;
|
|
112
|
+
void this.context.closePreview();
|
|
113
|
+
this.context.connected = undefined;
|
|
114
|
+
this.context.connectionProgress = undefined;
|
|
115
|
+
this.context.pendingWorkspaceSelection = undefined;
|
|
116
|
+
void this.context.closeCodexVirtual();
|
|
117
|
+
void this.context.closeCursorVirtual();
|
|
118
|
+
this.context.proxySwitch?.disconnectRemote();
|
|
119
|
+
this.context.gatewaySwitch.disconnectRemote();
|
|
120
|
+
void connectedClient.close().catch(() => undefined);
|
|
121
|
+
this.context.logger.warn('remote Harness transport closed; keeping Remote authority disconnected', {
|
|
122
|
+
targetDeviceId: shortId(target.deviceId),
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
const connectionDetails = await connectedTransport.connectionDetails().catch(() => undefined);
|
|
126
|
+
this.context.logger.info('remote Harness transport ready', {
|
|
127
|
+
targetDeviceId: shortId(target.deviceId),
|
|
128
|
+
transport: connectedClient.getStats().mode,
|
|
129
|
+
...(connectionDetails === undefined ? {} : {
|
|
130
|
+
preferredTransports: connectionDetails.preferredTransports,
|
|
131
|
+
negotiatedCapabilities: connectionDetails.negotiatedCapabilities,
|
|
132
|
+
webRtcEnabled: connectionDetails.webRtcEnabled,
|
|
133
|
+
}),
|
|
134
|
+
});
|
|
135
|
+
if (connectionDetails?.webRtc?.diagnostics !== undefined) {
|
|
136
|
+
this.context.logger.debug('remote Harness transport diagnostics', {
|
|
137
|
+
targetDeviceId: shortId(target.deviceId),
|
|
138
|
+
...webrtcDiagnosticsLogFields(connectionDetails.webRtc.diagnostics),
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
const features = await probeRemoteHostFeatures(connectedClient, serverDevice.clientVersion);
|
|
142
|
+
return {
|
|
143
|
+
client: connectedClient,
|
|
144
|
+
target,
|
|
145
|
+
transport: connectedTransport,
|
|
146
|
+
features,
|
|
147
|
+
progressRunId,
|
|
148
|
+
...(serverDevice.clientVersion === undefined ? {} : { clientVersion: serverDevice.clientVersion }),
|
|
149
|
+
...(serverDevice.harnessVersion === undefined ? {} : { harnessVersion: serverDevice.harnessVersion }),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
this.clearConnectionProgress(progressRunId);
|
|
154
|
+
await client?.close().catch(() => undefined);
|
|
155
|
+
throw error;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
beginAttemptProgress(runId, attempt) {
|
|
159
|
+
if (attempt !== 'direct') {
|
|
160
|
+
this.updateConnectionProgress(runId, 'probing', [attempt]);
|
|
161
|
+
return () => undefined;
|
|
162
|
+
}
|
|
163
|
+
this.updateConnectionProgress(runId, 'probing', ['lan']);
|
|
164
|
+
// LAN and P2P candidates are gathered inside one ICE attempt. The
|
|
165
|
+
// linear Remote UI still needs a single active route, so advance the
|
|
166
|
+
// visible cue if direct negotiation takes longer than a local probe.
|
|
167
|
+
const timer = setTimeout(() => {
|
|
168
|
+
if (this.context.connectionProgress?.runId === runId && this.context.connectionProgress.phase === 'probing') {
|
|
169
|
+
this.updateConnectionProgress(runId, 'probing', ['p2p']);
|
|
170
|
+
}
|
|
171
|
+
}, DIRECT_LAN_PROGRESS_DISPLAY_MS);
|
|
172
|
+
return () => clearTimeout(timer);
|
|
173
|
+
}
|
|
174
|
+
updateConnectionProgress(runId, phase, activeTransports) {
|
|
175
|
+
if (this.context.connectionProgress?.runId !== runId)
|
|
176
|
+
return;
|
|
177
|
+
this.context.connectionProgress = {
|
|
178
|
+
runId,
|
|
179
|
+
targetDeviceId: this.context.connectionProgress.targetDeviceId,
|
|
180
|
+
phase,
|
|
181
|
+
...(activeTransports === undefined ? {} : { activeTransports }),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
clearConnectionProgress(runId) {
|
|
185
|
+
if (this.context.connectionProgress?.runId === runId)
|
|
186
|
+
this.context.connectionProgress = undefined;
|
|
187
|
+
}
|
|
188
|
+
async authorizeHostPeer(serverDevice) {
|
|
189
|
+
const descriptor = await this.context.server.deviceFor(serverDevice.deviceId);
|
|
190
|
+
assertAuthorizedHost(serverDevice, descriptor);
|
|
191
|
+
const existing = this.context.identities.trustedPeer(descriptor.deviceId);
|
|
192
|
+
if (existing !== undefined && existing.publicKey !== descriptor.identityKey) {
|
|
193
|
+
throw new ClientModeError('PEER_IDENTITY_MISMATCH', 'The authorized Host identity key changed unexpectedly.');
|
|
194
|
+
}
|
|
195
|
+
if (existing !== undefined
|
|
196
|
+
&& existing.membershipId === descriptor.membershipId
|
|
197
|
+
&& existing.name === descriptor.name
|
|
198
|
+
&& existing.platform === descriptor.platform) {
|
|
199
|
+
return existing;
|
|
200
|
+
}
|
|
201
|
+
return this.context.identities.trustPeer({
|
|
202
|
+
deviceId: descriptor.deviceId,
|
|
203
|
+
name: descriptor.name,
|
|
204
|
+
platform: descriptor.platform,
|
|
205
|
+
publicKey: descriptor.identityKey,
|
|
206
|
+
membershipId: descriptor.membershipId,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=client-connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-connection.js","sourceRoot":"","sources":["../src/client-connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { RpcResult } from '@deepseek-ai/dsh-host-apiproxy/api';
|
|
2
|
+
import type { PluginRouteCallResult } from '@dsh-remote/protocol';
|
|
3
|
+
import type { AcpVirtualWorkspaceView } from './acp/virtual-harness.js';
|
|
4
|
+
import type { HarnessMode } from './api-proxy-switch.js';
|
|
5
|
+
import type { ConnectedRemote, HostAuthorizationControl, RemoteDeviceView, RemoteDirectoryListing, RemoteWorkspaceSelection, RemoteWorkspaceView } from './client-runtime-contract.js';
|
|
6
|
+
import type { CodexVirtualWorkspaceView } from './codex/virtual-harness.js';
|
|
7
|
+
import type { RemoteFileViewerEndpoint } from './file-viewer-contract.js';
|
|
8
|
+
import { LoopbackPreview } from './loopback-preview.js';
|
|
9
|
+
import type { OAuthProvider } from './server-api.js';
|
|
10
|
+
import { ClientServerApi } from './server-api.js';
|
|
11
|
+
/** Collaborates with one ClientModeRuntime; never creates a second session or connection state. */
|
|
12
|
+
export interface ClientControlContext {
|
|
13
|
+
readonly detailedStatus: () => Promise<Record<string, unknown>>;
|
|
14
|
+
readonly devices: () => Promise<RemoteDeviceView[]>;
|
|
15
|
+
readonly server: ClientServerApi;
|
|
16
|
+
readonly authorizeClientWithAccount: (email: string, password: string) => Promise<unknown>;
|
|
17
|
+
readonly startClientOAuthQrLogin: (provider: OAuthProvider) => Promise<unknown>;
|
|
18
|
+
readonly pollClientOAuthQrLogin: (qrId: string) => Promise<unknown>;
|
|
19
|
+
readonly activeRemote: () => ConnectedRemote | undefined;
|
|
20
|
+
preview: LoopbackPreview | undefined;
|
|
21
|
+
readonly listRemoteDirectory: (targetDeviceId: string, path?: string, signal?: AbortSignal) => Promise<RemoteDirectoryListing>;
|
|
22
|
+
readonly listRemoteWorkspaces: (targetDeviceId: string, signal?: AbortSignal) => Promise<RemoteWorkspaceView[]>;
|
|
23
|
+
readonly listCodexWorkspaces: (targetDeviceId: string, signal?: AbortSignal) => Promise<CodexVirtualWorkspaceView[]>;
|
|
24
|
+
readonly openRemoteWorkspace: (targetDeviceId: string, path: string, signal?: AbortSignal) => Promise<Record<string, unknown>>;
|
|
25
|
+
readonly openCodexWorkspace: (targetDeviceId: string, workspaceId: string, signal?: AbortSignal) => Promise<Record<string, unknown>>;
|
|
26
|
+
readonly createCodexWorkspace: (targetDeviceId: string, path: string, signal?: AbortSignal) => Promise<Record<string, unknown>>;
|
|
27
|
+
readonly listCursorWorkspaces: (targetDeviceId: string, signal?: AbortSignal, backend?: "cursor" | "antigravity" | "pi" | "opencode") => Promise<AcpVirtualWorkspaceView[]>;
|
|
28
|
+
readonly openCursorWorkspace: (targetDeviceId: string, workspaceId: string, signal?: AbortSignal, backend?: "cursor" | "antigravity" | "pi" | "opencode") => Promise<Record<string, unknown>>;
|
|
29
|
+
readonly createCursorWorkspace: (targetDeviceId: string, path: string, signal?: AbortSignal, backend?: "cursor" | "antigravity" | "pi" | "opencode") => Promise<Record<string, unknown>>;
|
|
30
|
+
readonly consumeWorkspaceSelection: (selection: RemoteWorkspaceSelection) => Record<string, unknown>;
|
|
31
|
+
readonly callRemoteFileViewer: (endpoint: RemoteFileViewerEndpoint, payload: unknown, signal?: AbortSignal) => Promise<unknown>;
|
|
32
|
+
readonly activeCodexRemote: () => ConnectedRemote | undefined;
|
|
33
|
+
readonly requireLocalCodex: () => Required<Pick<HostAuthorizationControl, "codexCall" | "codexRespond" | "codexOpenStream" | "codexCloseStream">>;
|
|
34
|
+
readonly localCodexAvailable: () => boolean;
|
|
35
|
+
readonly pluginRoute: (route: string, body: unknown, signal: AbortSignal) => Promise<PluginRouteCallResult>;
|
|
36
|
+
readonly openCodexStream: (payload: unknown, signal?: AbortSignal) => Promise<unknown>;
|
|
37
|
+
readonly nextCodexFrames: (payload: unknown, signal?: AbortSignal) => Promise<unknown>;
|
|
38
|
+
readonly closeCodexStream: (payload: unknown) => Promise<unknown>;
|
|
39
|
+
readonly host: HostAuthorizationControl | undefined;
|
|
40
|
+
readonly setHostAuthorization: (enabled: boolean) => Promise<unknown>;
|
|
41
|
+
readonly setMode: (mode: HarnessMode, targetDeviceId?: string, signal?: AbortSignal) => Promise<Record<string, unknown>>;
|
|
42
|
+
}
|
|
43
|
+
export declare class ClientControl {
|
|
44
|
+
private readonly context;
|
|
45
|
+
constructor(context: ClientControlContext);
|
|
46
|
+
handleControl(endpoint: string, payload: unknown, signal: AbortSignal): Promise<RpcResult<unknown>>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=client-control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-control.d.ts","sourceRoot":"","sources":["../src/client-control.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { CodexRemoteClient } from '@dsh-remote/client-core';
|
|
2
|
+
import { probeRemoteHostFeatures } from './client-capabilities.js';
|
|
3
|
+
import { ClientModeError, fail, isRecord, ok, record } from './client-runtime-contract.js';
|
|
4
|
+
import { LoopbackPreview } from './loopback-preview.js';
|
|
5
|
+
import { isAllowedPluginRoute } from './plugin-route-bridge.js';
|
|
6
|
+
export class ClientControl {
|
|
7
|
+
context;
|
|
8
|
+
constructor(context) {
|
|
9
|
+
this.context = context;
|
|
10
|
+
}
|
|
11
|
+
async handleControl(endpoint, payload, signal) {
|
|
12
|
+
try {
|
|
13
|
+
if (endpoint === 'status')
|
|
14
|
+
return ok(await this.context.detailedStatus());
|
|
15
|
+
if (endpoint === 'devices')
|
|
16
|
+
return ok(await this.context.devices());
|
|
17
|
+
if (endpoint === 'client.account.providers')
|
|
18
|
+
return ok(await this.context.server.oauthProviders());
|
|
19
|
+
if (endpoint === 'client.account.login') {
|
|
20
|
+
const value = record(payload);
|
|
21
|
+
if (typeof value.email !== 'string' || typeof value.password !== 'string') {
|
|
22
|
+
throw new ClientModeError('INVALID_MESSAGE', 'Email and password are required.');
|
|
23
|
+
}
|
|
24
|
+
return ok(await this.context.authorizeClientWithAccount(value.email, value.password));
|
|
25
|
+
}
|
|
26
|
+
if (endpoint === 'client.account.qr.start') {
|
|
27
|
+
const value = record(payload);
|
|
28
|
+
const provider = value.provider ?? 'zhihu';
|
|
29
|
+
if (typeof provider !== 'string' || !/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$/.test(provider)) {
|
|
30
|
+
throw new ClientModeError('INVALID_MESSAGE', 'An OAuth provider ID is required.');
|
|
31
|
+
}
|
|
32
|
+
return ok(await this.context.startClientOAuthQrLogin(provider));
|
|
33
|
+
}
|
|
34
|
+
if (endpoint === 'client.account.qr.poll') {
|
|
35
|
+
const value = record(payload);
|
|
36
|
+
if (typeof value.qrId !== 'string' || value.qrId.length < 20) {
|
|
37
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A QR login session is required.');
|
|
38
|
+
}
|
|
39
|
+
return ok(await this.context.pollClientOAuthQrLogin(value.qrId));
|
|
40
|
+
}
|
|
41
|
+
if (endpoint === 'preview.open') {
|
|
42
|
+
const remote = this.context.activeRemote();
|
|
43
|
+
if (remote === undefined)
|
|
44
|
+
throw new ClientModeError('TRANSPORT_CLOSED', 'Connect to a Remote Host first.');
|
|
45
|
+
this.context.preview ??= new LoopbackPreview(remote.client);
|
|
46
|
+
return ok(await this.context.preview.open(record(payload).port));
|
|
47
|
+
}
|
|
48
|
+
if (endpoint === 'directory.list') {
|
|
49
|
+
const value = record(payload);
|
|
50
|
+
if (typeof value.targetDeviceId !== 'string')
|
|
51
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host is required.');
|
|
52
|
+
return ok(await this.context.listRemoteDirectory(value.targetDeviceId, typeof value.path === 'string' ? value.path : undefined, signal));
|
|
53
|
+
}
|
|
54
|
+
if (endpoint === 'workspaces.list') {
|
|
55
|
+
const value = record(payload);
|
|
56
|
+
if (typeof value.targetDeviceId !== 'string')
|
|
57
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host is required.');
|
|
58
|
+
return ok(await this.context.listRemoteWorkspaces(value.targetDeviceId, signal));
|
|
59
|
+
}
|
|
60
|
+
if (endpoint === 'codex.workspaces.list') {
|
|
61
|
+
const value = record(payload);
|
|
62
|
+
if (typeof value.targetDeviceId !== 'string')
|
|
63
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host is required.');
|
|
64
|
+
return ok(await this.context.listCodexWorkspaces(value.targetDeviceId, signal));
|
|
65
|
+
}
|
|
66
|
+
if (endpoint === 'workspace.open') {
|
|
67
|
+
const value = record(payload);
|
|
68
|
+
if (typeof value.targetDeviceId !== 'string' || typeof value.path !== 'string') {
|
|
69
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host and working directory are required.');
|
|
70
|
+
}
|
|
71
|
+
return ok(await this.context.openRemoteWorkspace(value.targetDeviceId, value.path, signal));
|
|
72
|
+
}
|
|
73
|
+
if (endpoint === 'codex.workspace.open') {
|
|
74
|
+
const value = record(payload);
|
|
75
|
+
if (typeof value.targetDeviceId !== 'string' || typeof value.workspaceId !== 'string') {
|
|
76
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host and CodeX Workspace are required.');
|
|
77
|
+
}
|
|
78
|
+
return ok(await this.context.openCodexWorkspace(value.targetDeviceId, value.workspaceId, signal));
|
|
79
|
+
}
|
|
80
|
+
if (endpoint === 'codex.workspace.create') {
|
|
81
|
+
const value = record(payload);
|
|
82
|
+
if (typeof value.targetDeviceId !== 'string' || typeof value.path !== 'string') {
|
|
83
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host and CodeX project directory are required.');
|
|
84
|
+
}
|
|
85
|
+
return ok(await this.context.createCodexWorkspace(value.targetDeviceId, value.path, signal));
|
|
86
|
+
}
|
|
87
|
+
if (endpoint === 'cursor.workspaces.list') {
|
|
88
|
+
const value = record(payload);
|
|
89
|
+
if (typeof value.targetDeviceId !== 'string')
|
|
90
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host is required.');
|
|
91
|
+
return ok(await this.context.listCursorWorkspaces(value.targetDeviceId, signal, 'cursor'));
|
|
92
|
+
}
|
|
93
|
+
if (endpoint === 'cursor.workspace.open') {
|
|
94
|
+
const value = record(payload);
|
|
95
|
+
if (typeof value.targetDeviceId !== 'string' || typeof value.workspaceId !== 'string') {
|
|
96
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host and Cursor Workspace are required.');
|
|
97
|
+
}
|
|
98
|
+
return ok(await this.context.openCursorWorkspace(value.targetDeviceId, value.workspaceId, signal, 'cursor'));
|
|
99
|
+
}
|
|
100
|
+
if (endpoint === 'cursor.workspace.create') {
|
|
101
|
+
const value = record(payload);
|
|
102
|
+
if (typeof value.targetDeviceId !== 'string' || typeof value.path !== 'string') {
|
|
103
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host and Cursor project directory are required.');
|
|
104
|
+
}
|
|
105
|
+
return ok(await this.context.createCursorWorkspace(value.targetDeviceId, value.path, signal, 'cursor'));
|
|
106
|
+
}
|
|
107
|
+
if (endpoint === 'antigravity.workspaces.list') {
|
|
108
|
+
const value = record(payload);
|
|
109
|
+
if (typeof value.targetDeviceId !== 'string')
|
|
110
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host is required.');
|
|
111
|
+
return ok(await this.context.listCursorWorkspaces(value.targetDeviceId, signal, 'antigravity'));
|
|
112
|
+
}
|
|
113
|
+
if (endpoint === 'antigravity.workspace.open') {
|
|
114
|
+
const value = record(payload);
|
|
115
|
+
if (typeof value.targetDeviceId !== 'string' || typeof value.workspaceId !== 'string') {
|
|
116
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host and Antigravity Workspace are required.');
|
|
117
|
+
}
|
|
118
|
+
return ok(await this.context.openCursorWorkspace(value.targetDeviceId, value.workspaceId, signal, 'antigravity'));
|
|
119
|
+
}
|
|
120
|
+
if (endpoint === 'antigravity.workspace.create') {
|
|
121
|
+
const value = record(payload);
|
|
122
|
+
if (typeof value.targetDeviceId !== 'string' || typeof value.path !== 'string') {
|
|
123
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host and Antigravity project directory are required.');
|
|
124
|
+
}
|
|
125
|
+
return ok(await this.context.createCursorWorkspace(value.targetDeviceId, value.path, signal, 'antigravity'));
|
|
126
|
+
}
|
|
127
|
+
if (endpoint === 'pi.workspaces.list') {
|
|
128
|
+
const value = record(payload);
|
|
129
|
+
if (typeof value.targetDeviceId !== 'string')
|
|
130
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host is required.');
|
|
131
|
+
return ok(await this.context.listCursorWorkspaces(value.targetDeviceId, signal, 'pi'));
|
|
132
|
+
}
|
|
133
|
+
if (endpoint === 'pi.workspace.open') {
|
|
134
|
+
const value = record(payload);
|
|
135
|
+
if (typeof value.targetDeviceId !== 'string' || typeof value.workspaceId !== 'string') {
|
|
136
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host and PI Workspace are required.');
|
|
137
|
+
}
|
|
138
|
+
return ok(await this.context.openCursorWorkspace(value.targetDeviceId, value.workspaceId, signal, 'pi'));
|
|
139
|
+
}
|
|
140
|
+
if (endpoint === 'pi.workspace.create') {
|
|
141
|
+
const value = record(payload);
|
|
142
|
+
if (typeof value.targetDeviceId !== 'string' || typeof value.path !== 'string') {
|
|
143
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host and PI project directory are required.');
|
|
144
|
+
}
|
|
145
|
+
return ok(await this.context.createCursorWorkspace(value.targetDeviceId, value.path, signal, 'pi'));
|
|
146
|
+
}
|
|
147
|
+
if (endpoint === 'opencode.workspaces.list') {
|
|
148
|
+
const value = record(payload);
|
|
149
|
+
if (typeof value.targetDeviceId !== 'string')
|
|
150
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host is required.');
|
|
151
|
+
return ok(await this.context.listCursorWorkspaces(value.targetDeviceId, signal, 'opencode'));
|
|
152
|
+
}
|
|
153
|
+
if (endpoint === 'opencode.workspace.open') {
|
|
154
|
+
const value = record(payload);
|
|
155
|
+
if (typeof value.targetDeviceId !== 'string' || typeof value.workspaceId !== 'string') {
|
|
156
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host and OpenCode Workspace are required.');
|
|
157
|
+
}
|
|
158
|
+
return ok(await this.context.openCursorWorkspace(value.targetDeviceId, value.workspaceId, signal, 'opencode'));
|
|
159
|
+
}
|
|
160
|
+
if (endpoint === 'opencode.workspace.create') {
|
|
161
|
+
const value = record(payload);
|
|
162
|
+
if (typeof value.targetDeviceId !== 'string' || typeof value.path !== 'string') {
|
|
163
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host and OpenCode project directory are required.');
|
|
164
|
+
}
|
|
165
|
+
return ok(await this.context.createCursorWorkspace(value.targetDeviceId, value.path, signal, 'opencode'));
|
|
166
|
+
}
|
|
167
|
+
if (endpoint === 'workspace.selection.consume') {
|
|
168
|
+
const value = record(payload);
|
|
169
|
+
if (typeof value.targetDeviceId !== 'string' || typeof value.workspaceId !== 'string') {
|
|
170
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host and Workspace are required.');
|
|
171
|
+
}
|
|
172
|
+
return ok(this.context.consumeWorkspaceSelection({
|
|
173
|
+
targetDeviceId: value.targetDeviceId,
|
|
174
|
+
workspaceId: value.workspaceId,
|
|
175
|
+
...(value.backend === 'codex' || value.backend === 'cursor' || value.backend === 'antigravity' || value.backend === 'pi' || value.backend === 'opencode' ? { backend: value.backend } : {}),
|
|
176
|
+
...(typeof value.sessionId === 'string' ? { sessionId: value.sessionId } : {}),
|
|
177
|
+
}));
|
|
178
|
+
}
|
|
179
|
+
if (endpoint === 'fileviewer.stat' || endpoint === 'fileviewer.readRange' || endpoint === 'fileviewer.list') {
|
|
180
|
+
const method = endpoint === 'fileviewer.stat'
|
|
181
|
+
? 'stat'
|
|
182
|
+
: endpoint === 'fileviewer.readRange' ? 'readRange' : 'list';
|
|
183
|
+
return ok(await this.context.callRemoteFileViewer(method, payload, signal));
|
|
184
|
+
}
|
|
185
|
+
if (endpoint === 'codex.call') {
|
|
186
|
+
const value = record(payload);
|
|
187
|
+
if (typeof value.method !== 'string' || !('params' in value)) {
|
|
188
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Codex method and params are required.');
|
|
189
|
+
}
|
|
190
|
+
const remote = this.context.activeCodexRemote();
|
|
191
|
+
if (remote !== undefined)
|
|
192
|
+
return ok(await new CodexRemoteClient(remote.client).request(value.method, value.params, signal));
|
|
193
|
+
const host = this.context.requireLocalCodex();
|
|
194
|
+
return ok(await host.codexCall(value, signal));
|
|
195
|
+
}
|
|
196
|
+
if (endpoint === 'codex.probe') {
|
|
197
|
+
const local = this.context.localCodexAvailable();
|
|
198
|
+
let remoteSupported = false;
|
|
199
|
+
const remote = this.context.activeRemote();
|
|
200
|
+
if (remote !== undefined) {
|
|
201
|
+
try {
|
|
202
|
+
remote.features = await probeRemoteHostFeatures(remote.client, remote.clientVersion);
|
|
203
|
+
remoteSupported = remote.features.codex;
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
if (!local)
|
|
207
|
+
throw error;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return ok({ supported: local || remoteSupported, local, remote: remoteSupported });
|
|
211
|
+
}
|
|
212
|
+
if (endpoint === 'codex.respond') {
|
|
213
|
+
const value = record(payload);
|
|
214
|
+
const remote = this.context.activeCodexRemote();
|
|
215
|
+
if (remote !== undefined)
|
|
216
|
+
return ok(await remote.client.rpc('codex.app.respond', value, signal));
|
|
217
|
+
const host = this.context.requireLocalCodex();
|
|
218
|
+
return ok(await host.codexRespond(value, signal));
|
|
219
|
+
}
|
|
220
|
+
if (endpoint === 'plugin.route') {
|
|
221
|
+
const value = record(payload);
|
|
222
|
+
if (typeof value.route !== 'string' || !isAllowedPluginRoute(value.route)) {
|
|
223
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A valid plugin route is required.');
|
|
224
|
+
}
|
|
225
|
+
if (!isRecord(value.body))
|
|
226
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A plugin route body object is required.');
|
|
227
|
+
return ok(await this.context.pluginRoute(value.route, value.body, signal));
|
|
228
|
+
}
|
|
229
|
+
if (endpoint === 'codex.stream.open')
|
|
230
|
+
return ok(await this.context.openCodexStream(payload, signal));
|
|
231
|
+
if (endpoint === 'codex.stream.next')
|
|
232
|
+
return ok(await this.context.nextCodexFrames(payload, signal));
|
|
233
|
+
if (endpoint === 'codex.stream.close')
|
|
234
|
+
return ok(await this.context.closeCodexStream(payload));
|
|
235
|
+
if (endpoint === 'host.account.login') {
|
|
236
|
+
if (this.context.host === undefined)
|
|
237
|
+
throw new ClientModeError('METHOD_NOT_ALLOWED', 'This plugin is not running as a Host.');
|
|
238
|
+
const value = record(payload);
|
|
239
|
+
if (typeof value.email !== 'string' || typeof value.password !== 'string') {
|
|
240
|
+
throw new ClientModeError('INVALID_MESSAGE', 'Email and password are required.');
|
|
241
|
+
}
|
|
242
|
+
return ok(await this.context.host.authorizeHostWithAccount(value.email, value.password));
|
|
243
|
+
}
|
|
244
|
+
if (endpoint === 'host.authorization.set') {
|
|
245
|
+
const value = record(payload);
|
|
246
|
+
if (typeof value.enabled !== 'boolean') {
|
|
247
|
+
throw new ClientModeError('INVALID_MESSAGE', 'Host authorization state is required.');
|
|
248
|
+
}
|
|
249
|
+
return ok(await this.context.setHostAuthorization(value.enabled));
|
|
250
|
+
}
|
|
251
|
+
if (endpoint === 'host.registration-code.submit') {
|
|
252
|
+
if (this.context.host === undefined)
|
|
253
|
+
throw new ClientModeError('METHOD_NOT_ALLOWED', 'This plugin is not running as a Host.');
|
|
254
|
+
const value = record(payload);
|
|
255
|
+
if (typeof value.code !== 'string' || value.code.trim() === '') {
|
|
256
|
+
throw new ClientModeError('INVALID_MESSAGE', 'A Host registration code is required.');
|
|
257
|
+
}
|
|
258
|
+
return ok(await this.context.host.authorizeHostWithCode(value.code));
|
|
259
|
+
}
|
|
260
|
+
if (endpoint === 'mode.set') {
|
|
261
|
+
const value = record(payload);
|
|
262
|
+
if (value.mode !== 'local' && value.mode !== 'remote')
|
|
263
|
+
throw new ClientModeError('INVALID_MESSAGE', 'Mode must be local or remote.');
|
|
264
|
+
return ok(await this.context.setMode(value.mode, typeof value.targetDeviceId === 'string' ? value.targetDeviceId : undefined, signal));
|
|
265
|
+
}
|
|
266
|
+
throw new ClientModeError('METHOD_NOT_FOUND', 'The remote-mode control method does not exist.');
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
return fail(error);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=client-control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-control.js","sourceRoot":"","sources":["../src/client-control.ts"],"names":[],"mappings":"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"}
|
package/dist/client-locale.d.ts
CHANGED
|
@@ -153,15 +153,21 @@ export declare const en: {
|
|
|
153
153
|
readonly addCodexWorkspace: "Add CodeX workspace";
|
|
154
154
|
readonly addCursorWorkspace: "Add Cursor workspace";
|
|
155
155
|
readonly addAntigravityWorkspace: "Add Antigravity workspace";
|
|
156
|
+
readonly addPiWorkspace: "Add PI workspace";
|
|
157
|
+
readonly addOpencodeWorkspace: "Add OpenCode workspace";
|
|
156
158
|
readonly noCodexWorkspaces: "No CodeX workspaces yet.";
|
|
157
159
|
readonly noCursorWorkspaces: "No Cursor workspaces yet. Add a project directory to start.";
|
|
158
160
|
readonly noAntigravityWorkspaces: "No Antigravity workspaces yet. Add a project directory to start.";
|
|
161
|
+
readonly noPiWorkspaces: "No PI workspaces yet. Add a project directory to start.";
|
|
162
|
+
readonly noOpencodeWorkspaces: "No OpenCode workspaces yet. Add a project directory to start.";
|
|
159
163
|
readonly cancelAddWorkspace: "Cancel";
|
|
160
164
|
readonly confirmAddWorkspace: "Add and open";
|
|
161
165
|
readonly showAllWorkspaces: "Show all DSH workspaces";
|
|
162
166
|
readonly showAllCodexWorkspaces: "Show all CodeX workspaces";
|
|
163
167
|
readonly showAllCursorWorkspaces: "Show all Cursor workspaces";
|
|
164
168
|
readonly showAllAntigravityWorkspaces: "Show all Antigravity workspaces";
|
|
169
|
+
readonly showAllPiWorkspaces: "Show all PI workspaces";
|
|
170
|
+
readonly showAllOpencodeWorkspaces: "Show all OpenCode workspaces";
|
|
165
171
|
readonly remoteModeLabel: "Remote mode · {name}";
|
|
166
172
|
readonly remoteNetworkP2p: "P2P";
|
|
167
173
|
readonly remoteNetworkTurn: "TURN";
|
|
@@ -256,6 +262,8 @@ export declare const en: {
|
|
|
256
262
|
readonly codexVirtualWorkspace: "CodeX virtual workspace";
|
|
257
263
|
readonly cursorVirtualWorkspace: "Cursor virtual workspace";
|
|
258
264
|
readonly antigravityVirtualWorkspace: "Antigravity virtual workspace";
|
|
265
|
+
readonly piVirtualWorkspace: "PI virtual workspace";
|
|
266
|
+
readonly opencodeVirtualWorkspace: "OpenCode virtual workspace";
|
|
259
267
|
readonly codexVirtualSessions: "Sessions";
|
|
260
268
|
};
|
|
261
269
|
export declare const zh: Record<keyof typeof en, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-locale.d.ts","sourceRoot":"","sources":["../src/client-locale.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,eAAe,sBAAsB,CAAA;AAElD,eAAO,MAAM,EAAE
|
|
1
|
+
{"version":3,"file":"client-locale.d.ts","sourceRoot":"","sources":["../src/client-locale.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,eAAe,sBAAsB,CAAA;AAElD,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2QL,CAAA;AAEV,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,OAAO,EAAE,EAAE,MAAM,CA2Q9C,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,EAAE,CAAA;AACvC,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CAAA;AAC5F,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,SAAS,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;CACzC"}
|