ds-harness-remote 0.4.12 → 0.4.14
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 +4 -4
- 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/client-runtime.d.ts +14 -1
- package/dist/client-runtime.d.ts.map +1 -1
- package/dist/client-runtime.js +34 -24
- package/dist/client-runtime.js.map +1 -1
- package/dist/client.github.js +224 -9
- package/dist/client.js +224 -9
- package/dist/client.js.map +1 -1
- package/dist/codex/method-policy.d.ts +10 -10
- package/dist/codex/peer-bridge.d.ts.map +1 -1
- package/dist/codex/peer-bridge.js +3 -4
- package/dist/codex/peer-bridge.js.map +1 -1
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -0
- package/dist/config.js.map +1 -1
- package/dist/connection-controller.d.ts +5 -0
- package/dist/connection-controller.d.ts.map +1 -1
- package/dist/connection-controller.js +16 -1
- package/dist/connection-controller.js.map +1 -1
- package/dist/control-route.d.ts +22 -0
- package/dist/control-route.d.ts.map +1 -1
- package/dist/control-route.js +120 -0
- package/dist/control-route.js.map +1 -1
- package/dist/control-runtime.d.ts +6 -1
- package/dist/control-runtime.d.ts.map +1 -1
- package/dist/control-runtime.js +58 -5
- package/dist/control-runtime.js.map +1 -1
- package/dist/harness-api-bridge.d.ts.map +1 -1
- package/dist/harness-api-bridge.js +32 -11
- package/dist/harness-api-bridge.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 +47 -6
- package/dist/harness-remote-bridge.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +801 -147
- package/dist/index.js.map +4 -4
- package/dist/remote-typert-gateway.d.ts +3 -1
- package/dist/remote-typert-gateway.d.ts.map +1 -1
- package/dist/remote-typert-gateway.js +16 -5
- package/dist/remote-typert-gateway.js.map +1 -1
- package/dist/rpc-router.d.ts +5 -2
- package/dist/rpc-router.d.ts.map +1 -1
- package/dist/rpc-router.js +18 -1
- package/dist/rpc-router.js.map +1 -1
- package/dist/service.d.ts +9 -0
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +32 -3
- package/dist/service.js.map +1 -1
- 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/tui-command.js +5 -3
- package/dist/tui-command.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dsh-plugin.json +1 -1
- package/package.json +21 -21
package/README.md
CHANGED
|
@@ -29,7 +29,7 @@ Continue your DeepSeek Harness sessions and experimental Codex workspaces from a
|
|
|
29
29
|
Add the exact package version to the `web` profile, then restart Harness:
|
|
30
30
|
|
|
31
31
|
```sh
|
|
32
|
-
dsh plugin --profile web add ds-harness-remote@0.4.
|
|
32
|
+
dsh plugin --profile web add ds-harness-remote@0.4.13
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
### dsh-TUI Host
|
|
@@ -37,7 +37,7 @@ dsh plugin --profile web add ds-harness-remote@0.4.12
|
|
|
37
37
|
Remote can also run as a Host in a terminal-only [dsh-TUI](https://github.com/ccch1mneyyy/dsh-TUI) profile:
|
|
38
38
|
|
|
39
39
|
```sh
|
|
40
|
-
dsh plugin --profile dsh-tui add ds-harness-remote@0.4.
|
|
40
|
+
dsh plugin --profile dsh-tui add ds-harness-remote@0.4.13
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
After starting dsh-TUI, manage Remote with its native slash command:
|
|
@@ -79,7 +79,7 @@ Codex support is enabled by default and can be disabled in the DeepSeek Remote s
|
|
|
79
79
|
|
|
80
80
|
## Compatibility
|
|
81
81
|
|
|
82
|
-
Plugin `0.4.
|
|
82
|
+
Plugin `0.4.13` supports:
|
|
83
83
|
|
|
84
84
|
- DeepSeek Harness `dsh-v0.1.1-rc.2` through the official legacy `ApiProxy`
|
|
85
85
|
- DeepSeek Harness `dsh-v0.1.2-alpha.1` through `dsh-v0.1.2-rc.1` through the official Typert Remote Gateway
|
|
@@ -89,7 +89,7 @@ Remote Web/Desktop and Android clients normalize released sessions that still re
|
|
|
89
89
|
`code` agent preset to `ptc`, so old sessions can resume on `dsh-v0.1.5-rc.1` without patching
|
|
90
90
|
DeepSeek Harness itself.
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
Desktop endpoints must use a compatible Harness carrier. Plugin `0.4.13` selects ApiProxy for rc.2 Hosts when available, and Session V3 Desktop clients can open legacy v0.1.2 Typert Remote Hosts through Remote-side normalization. Legacy Typert clients still reject Session V3 Hosts before mutations.
|
|
93
93
|
|
|
94
94
|
## Documentation
|
|
95
95
|
|
package/dist/acp.d.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { AcpBackend, AcpInitializeParams, AcpInitializeResult, AcpPromptParams, AcpSessionParams, AcpPermissionResponseParams, AcpCancelParams, AcpSetModeParams, AcpSessionUpdate } from '@dsh-remote/protocol';
|
|
2
|
+
/** Backend-neutral ACP adapter. Implementations must keep state scoped to a connection. */
|
|
3
|
+
export interface AcpBackendAdapter {
|
|
4
|
+
readonly backend: AcpBackend;
|
|
5
|
+
initialize(params: AcpInitializeParams): Promise<AcpInitializeResult>;
|
|
6
|
+
sessionNew(params: AcpSessionParams): Promise<{
|
|
7
|
+
sessionId: string;
|
|
8
|
+
}>;
|
|
9
|
+
sessionLoad?(params: AcpSessionParams): Promise<{
|
|
10
|
+
sessionId: string;
|
|
11
|
+
}>;
|
|
12
|
+
prompt(params: AcpPromptParams, emit: (update: AcpSessionUpdate) => Promise<void>): Promise<void>;
|
|
13
|
+
respondPermission?(params: AcpPermissionResponseParams): Promise<void>;
|
|
14
|
+
cancel?(params: AcpCancelParams): Promise<void>;
|
|
15
|
+
setMode?(params: AcpSetModeParams): Promise<void>;
|
|
16
|
+
close?(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export declare class AcpGateway {
|
|
19
|
+
private readonly adapters;
|
|
20
|
+
constructor(adapters: AcpBackendAdapter | Iterable<AcpBackendAdapter>);
|
|
21
|
+
private get;
|
|
22
|
+
initialize(p: AcpInitializeParams): Promise<AcpInitializeResult>;
|
|
23
|
+
sessionNew(p: AcpSessionParams & {
|
|
24
|
+
backend?: AcpBackend;
|
|
25
|
+
}): Promise<{
|
|
26
|
+
sessionId: string;
|
|
27
|
+
}>;
|
|
28
|
+
sessionLoad(p: AcpSessionParams & {
|
|
29
|
+
backend?: AcpBackend;
|
|
30
|
+
}): Promise<{
|
|
31
|
+
sessionId: string;
|
|
32
|
+
}>;
|
|
33
|
+
prompt(p: AcpPromptParams & {
|
|
34
|
+
backend?: AcpBackend;
|
|
35
|
+
}, emit: (u: AcpSessionUpdate) => Promise<void>): Promise<void>;
|
|
36
|
+
respondPermission(p: AcpPermissionResponseParams & {
|
|
37
|
+
backend?: AcpBackend;
|
|
38
|
+
}): Promise<void>;
|
|
39
|
+
cancel(p: AcpCancelParams & {
|
|
40
|
+
backend?: AcpBackend;
|
|
41
|
+
}): Promise<void>;
|
|
42
|
+
setMode(p: AcpSetModeParams & {
|
|
43
|
+
backend?: AcpBackend;
|
|
44
|
+
}): Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
export interface AcpIdeConfig {
|
|
47
|
+
id: string;
|
|
48
|
+
command: string;
|
|
49
|
+
args?: string[];
|
|
50
|
+
cwd?: string;
|
|
51
|
+
}
|
|
52
|
+
export declare const DEFAULT_ACP_IDES: readonly AcpIdeConfig[];
|
|
53
|
+
/** JSON-RPC stdio bridge for ACP agents (Cursor/Kimi/CodeX). */
|
|
54
|
+
export declare class StdioAcpAdapter {
|
|
55
|
+
private readonly config;
|
|
56
|
+
readonly backend: AcpBackend;
|
|
57
|
+
private child?;
|
|
58
|
+
private nextId;
|
|
59
|
+
constructor(config: AcpIdeConfig);
|
|
60
|
+
private ensure;
|
|
61
|
+
initialize(params: AcpInitializeParams): Promise<AcpInitializeResult>;
|
|
62
|
+
sessionNew(params: AcpSessionParams): Promise<{
|
|
63
|
+
sessionId: string;
|
|
64
|
+
}>;
|
|
65
|
+
sessionLoad(params: AcpSessionParams): Promise<{
|
|
66
|
+
sessionId: string;
|
|
67
|
+
}>;
|
|
68
|
+
prompt(params: AcpPromptParams, emit: (u: AcpSessionUpdate) => Promise<void>): Promise<void>;
|
|
69
|
+
cancel(p: AcpCancelParams): Promise<void>;
|
|
70
|
+
setMode(p: AcpSetModeParams): Promise<void>;
|
|
71
|
+
respondPermission(p: AcpPermissionResponseParams): Promise<void>;
|
|
72
|
+
close(): Promise<void>;
|
|
73
|
+
private call;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=acp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp.d.ts","sourceRoot":"","sources":["../src/acp.ts"],"names":[],"mappings":"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"}
|
package/dist/acp.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export class AcpGateway {
|
|
2
|
+
adapters;
|
|
3
|
+
constructor(adapters) {
|
|
4
|
+
this.adapters = adapters;
|
|
5
|
+
}
|
|
6
|
+
get(p) { const list = this.adapters instanceof Object && 'backend' in this.adapters ? [this.adapters] : [...this.adapters]; const a = list.find(x => !p.backend || x.backend === p.backend); if (!a)
|
|
7
|
+
throw new Error('CAPABILITY_NOT_SUPPORTED'); return a; }
|
|
8
|
+
initialize(p) { return this.get(p).initialize(p); }
|
|
9
|
+
sessionNew(p) { return this.get(p).sessionNew(p); }
|
|
10
|
+
sessionLoad(p) { const a = this.get(p); if (!a.sessionLoad)
|
|
11
|
+
throw new Error('CAPABILITY_NOT_SUPPORTED'); return a.sessionLoad(p); }
|
|
12
|
+
prompt(p, emit) { return this.get(p).prompt(p, emit); }
|
|
13
|
+
respondPermission(p) { const a = this.get(p); if (!a.respondPermission)
|
|
14
|
+
throw new Error('CAPABILITY_NOT_SUPPORTED'); return a.respondPermission(p); }
|
|
15
|
+
cancel(p) { const a = this.get(p); if (!a.cancel)
|
|
16
|
+
throw new Error('CAPABILITY_NOT_SUPPORTED'); return a.cancel(p); }
|
|
17
|
+
setMode(p) { const a = this.get(p); if (!a.setMode)
|
|
18
|
+
throw new Error('CAPABILITY_NOT_SUPPORTED'); return a.setMode(p); }
|
|
19
|
+
}
|
|
20
|
+
import { spawn } from 'node:child_process';
|
|
21
|
+
export const DEFAULT_ACP_IDES = [
|
|
22
|
+
{ id: 'codex', command: 'codex', args: ['acp'] },
|
|
23
|
+
{ id: 'cursor', command: 'agent', args: ['acp'] },
|
|
24
|
+
{ id: 'kimi', command: 'kimi', args: ['acp'] },
|
|
25
|
+
];
|
|
26
|
+
/** JSON-RPC stdio bridge for ACP agents (Cursor/Kimi/CodeX). */
|
|
27
|
+
export class StdioAcpAdapter {
|
|
28
|
+
config;
|
|
29
|
+
backend;
|
|
30
|
+
child;
|
|
31
|
+
nextId = 1;
|
|
32
|
+
constructor(config) {
|
|
33
|
+
this.config = config;
|
|
34
|
+
this.backend = config.id;
|
|
35
|
+
}
|
|
36
|
+
ensure() { if (!this.child)
|
|
37
|
+
this.child = spawn(this.config.command, this.config.args ?? [], { cwd: this.config.cwd, stdio: 'pipe' }); return this.child; }
|
|
38
|
+
async initialize(params) { await this.call('initialize', params); return { protocolVersion: 1, capability: 'agent.acp.v1', backend: this.backend, capabilities: ['session.new', 'session.load', 'session.prompt', 'session.cancel'] }; }
|
|
39
|
+
async sessionNew(params) { const r = await this.call('session/new', params); if (!r.sessionId)
|
|
40
|
+
throw new Error('INVALID_MESSAGE'); return { sessionId: r.sessionId }; }
|
|
41
|
+
async sessionLoad(params) { const r = await this.call('session/load', params); if (!r.sessionId)
|
|
42
|
+
throw new Error('INVALID_MESSAGE'); return { sessionId: r.sessionId }; }
|
|
43
|
+
async prompt(params, emit) { await this.call('session/prompt', params, async (n) => emit({ sessionId: params.sessionId, update: n, seq: this.nextId++ })); }
|
|
44
|
+
async cancel(p) { await this.call('session/cancel', p); }
|
|
45
|
+
async setMode(p) { await this.call('session/set_mode', p); }
|
|
46
|
+
async respondPermission(p) { await this.call('session/request_permission', p); }
|
|
47
|
+
async close() { this.child?.kill(); this.child = undefined; }
|
|
48
|
+
call(method, params, onNotification) { const c = this.ensure(); const id = this.nextId++; c.stdin.write(JSON.stringify({ jsonrpc: '2.0', id, method, params }) + '\n'); return new Promise((resolve, reject) => { let buf = ''; const onData = async (d) => { buf += d; const lines = buf.split('\n'); buf = lines.pop() ?? ''; for (const l of lines) {
|
|
49
|
+
try {
|
|
50
|
+
const m = JSON.parse(l);
|
|
51
|
+
if (m.id === id) {
|
|
52
|
+
c.stdout.off('data', onData);
|
|
53
|
+
m.error ? reject(new Error(m.error.message ?? 'ACP error')) : resolve(m.result);
|
|
54
|
+
}
|
|
55
|
+
else if (m.method && onNotification)
|
|
56
|
+
await onNotification(m.params);
|
|
57
|
+
}
|
|
58
|
+
catch { }
|
|
59
|
+
} }; c.stdout.on('data', onData); c.once('error', reject); }); }
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=acp.js.map
|
package/dist/acp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp.js","sourceRoot":"","sources":["../src/acp.ts"],"names":[],"mappings":"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"}
|
package/dist/client-runtime.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { RemoteClientCore } from '@dsh-remote/client-core';
|
|
|
4
4
|
import { type RtcPeerConnectionFactory } from '@dsh-remote/webrtc';
|
|
5
5
|
import { type HarnessMode } from './api-proxy-switch.js';
|
|
6
6
|
import type { ResolvedConfig } from './config.js';
|
|
7
|
+
import { type HostWebServerLike } from './control-route.js';
|
|
7
8
|
import type { IdentityStore } from './identity-store.js';
|
|
8
9
|
import type { TypertGatewayLike } from './typert-gateway-contract.js';
|
|
9
10
|
import type { SafeLogger } from './logging.js';
|
|
@@ -51,6 +52,9 @@ export interface HostConnectionRpc {
|
|
|
51
52
|
}): () => Promise<void>;
|
|
52
53
|
}
|
|
53
54
|
export interface HostConnectionHandle {
|
|
55
|
+
requestRejection?(request: {
|
|
56
|
+
headers: Record<string, string | string[] | undefined>;
|
|
57
|
+
}): number | undefined;
|
|
54
58
|
rpc: HostConnectionRpc;
|
|
55
59
|
}
|
|
56
60
|
export interface HostAuthorizationControl {
|
|
@@ -64,6 +68,12 @@ export interface HostAuthorizationControl {
|
|
|
64
68
|
account?: string;
|
|
65
69
|
authorized: boolean;
|
|
66
70
|
accountRequired: boolean;
|
|
71
|
+
connectedClients?: Array<{
|
|
72
|
+
deviceId: string;
|
|
73
|
+
name: string;
|
|
74
|
+
platform?: string;
|
|
75
|
+
mode?: 'LAN' | 'P2P' | 'TURN' | 'Relay';
|
|
76
|
+
}>;
|
|
67
77
|
};
|
|
68
78
|
reconnectHost(): void;
|
|
69
79
|
clearHostAuthorization(): Promise<void>;
|
|
@@ -100,7 +110,7 @@ export declare class ClientModeRuntime {
|
|
|
100
110
|
private closed;
|
|
101
111
|
constructor(config: ResolvedConfig, identities: IdentityStore, server: ClientServerApi, apiProxy: ApiProxy | undefined, typertGateway: TypertGatewayLike, logger: SafeLogger, host?: HostAuthorizationControl | undefined, rtcFactoryProvider?: (options?: WeriftFactoryOptions) => Promise<RtcPeerConnectionFactory | undefined>);
|
|
102
112
|
start(): Promise<void>;
|
|
103
|
-
registerControl(connection: HostConnectionHandle): () => Promise<void>;
|
|
113
|
+
registerControl(connection: HostConnectionHandle, webServer?: HostWebServerLike): () => Promise<void>;
|
|
104
114
|
status(): Record<string, unknown>;
|
|
105
115
|
private detailedStatus;
|
|
106
116
|
devices(): Promise<RemoteDeviceView[]>;
|
|
@@ -130,9 +140,12 @@ export declare class ClientModeRuntime {
|
|
|
130
140
|
private closeCodexStream;
|
|
131
141
|
private closeCodexStreams;
|
|
132
142
|
private selectRemoteTarget;
|
|
143
|
+
private remoteTypertGateway;
|
|
133
144
|
private selectCodexTarget;
|
|
134
145
|
private closeCodexVirtual;
|
|
135
146
|
private assertRemoteCompatible;
|
|
147
|
+
private selectHarnessRemoteTransport;
|
|
148
|
+
private assertLocalHarnessCarrierAvailable;
|
|
136
149
|
private connect;
|
|
137
150
|
private ensureConnected;
|
|
138
151
|
private beginAttemptProgress;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-runtime.d.ts","sourceRoot":"","sources":["../src/client-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAA;AAC7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AACvF,OAAO,EAAqB,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC7E,OAAO,EAKL,KAAK,wBAAwB,EAC9B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAExE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"client-runtime.d.ts","sourceRoot":"","sources":["../src/client-runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/client-runtime.js
CHANGED
|
@@ -2,7 +2,7 @@ import { CodexRemoteClient, RemoteClientCore } from '@dsh-remote/client-core';
|
|
|
2
2
|
import { AdaptiveTransport, stunOnlyIceServers, } from '@dsh-remote/webrtc';
|
|
3
3
|
import { ApiProxySwitch } from './api-proxy-switch.js';
|
|
4
4
|
import { ClientSecureTransport } from './client-secure-transport.js';
|
|
5
|
-
import {
|
|
5
|
+
import { registerControlRoute } from './control-route.js';
|
|
6
6
|
import { uuidV7 } from './ids.js';
|
|
7
7
|
import { harnessSessionGeneration } from './harness-version.js';
|
|
8
8
|
import { RemoteHarnessApiProxy } from './remote-api-proxy.js';
|
|
@@ -54,10 +54,8 @@ export class ClientModeRuntime {
|
|
|
54
54
|
fingerprint: this.identity.fingerprint,
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
|
-
registerControl(connection) {
|
|
58
|
-
return connection
|
|
59
|
-
authority: 'loopback',
|
|
60
|
-
});
|
|
57
|
+
registerControl(connection, webServer) {
|
|
58
|
+
return registerControlRoute(connection, (endpoint, payload, signal) => this.handleControl(endpoint, payload, signal), webServer);
|
|
61
59
|
}
|
|
62
60
|
status() {
|
|
63
61
|
const targetStatus = this.gatewaySwitch.supportsCarrier()
|
|
@@ -252,9 +250,9 @@ export class ClientModeRuntime {
|
|
|
252
250
|
if (path.trim() === '')
|
|
253
251
|
throw new ClientModeError('INVALID_MESSAGE', 'A remote working directory is required.');
|
|
254
252
|
const remote = await this.ensureConnected(targetDeviceId, signal);
|
|
255
|
-
this.
|
|
253
|
+
const transport = this.selectHarnessRemoteTransport(remote);
|
|
256
254
|
let workspace;
|
|
257
|
-
if (
|
|
255
|
+
if (transport === 'remoteGateway') {
|
|
258
256
|
workspace = await new RemoteTypertGateway(remote.client).invoke({
|
|
259
257
|
namespace: 'workspace',
|
|
260
258
|
method: 'create',
|
|
@@ -271,7 +269,7 @@ export class ClientModeRuntime {
|
|
|
271
269
|
workspace = unwrapNativeResult(response);
|
|
272
270
|
}
|
|
273
271
|
await this.closeCodexVirtual();
|
|
274
|
-
this.selectRemoteTarget(remote);
|
|
272
|
+
this.selectRemoteTarget(remote, transport);
|
|
275
273
|
const workspaceId = workspaceRecordId(workspace.workspace);
|
|
276
274
|
this.pendingWorkspaceSelection = { targetDeviceId: remote.target.deviceId, workspaceId };
|
|
277
275
|
this.logger.info('Remote workspace opened', { targetDeviceId: shortId(remote.target.deviceId) });
|
|
@@ -291,7 +289,7 @@ export class ClientModeRuntime {
|
|
|
291
289
|
if (!remote.features.codex) {
|
|
292
290
|
throw new ClientModeError('FEATURE_NOT_SUPPORTED', 'The selected Host does not provide CodeX workspaces.');
|
|
293
291
|
}
|
|
294
|
-
this.
|
|
292
|
+
this.assertLocalHarnessCarrierAvailable();
|
|
295
293
|
const virtual = CodexVirtualHarness.remote(remote.client, {
|
|
296
294
|
deviceId: remote.target.deviceId,
|
|
297
295
|
name: remote.target.name,
|
|
@@ -326,7 +324,7 @@ export class ClientModeRuntime {
|
|
|
326
324
|
if (!remote.features.codex) {
|
|
327
325
|
throw new ClientModeError('FEATURE_NOT_SUPPORTED', 'The selected Host does not provide CodeX workspaces.');
|
|
328
326
|
}
|
|
329
|
-
this.
|
|
327
|
+
this.assertLocalHarnessCarrierAvailable();
|
|
330
328
|
const result = record(await new CodexRemoteClient(remote.client).request('project/create', {
|
|
331
329
|
name: remoteWorkspaceTitle(trimmedPath),
|
|
332
330
|
roots: [{ path: trimmedPath }],
|
|
@@ -523,18 +521,22 @@ export class ClientModeRuntime {
|
|
|
523
521
|
await stream.close();
|
|
524
522
|
}));
|
|
525
523
|
}
|
|
526
|
-
selectRemoteTarget(remote) {
|
|
524
|
+
selectRemoteTarget(remote, transport = this.selectHarnessRemoteTransport(remote)) {
|
|
527
525
|
const target = { deviceId: remote.target.deviceId, name: remote.target.name };
|
|
528
|
-
if (
|
|
529
|
-
this.gatewaySwitch.selectRemote(
|
|
526
|
+
if (transport === 'remoteGateway') {
|
|
527
|
+
this.gatewaySwitch.selectRemote(this.remoteTypertGateway(remote), undefined, target);
|
|
530
528
|
return;
|
|
531
529
|
}
|
|
532
|
-
this.proxySwitch
|
|
530
|
+
this.proxySwitch?.selectRemote(new RemoteHarnessApiProxy(remote.client).api, target);
|
|
533
531
|
this.gatewaySwitch.selectRemote(request => invokeRemoteCommand(remote.client, request), {
|
|
534
532
|
execute: true,
|
|
535
533
|
list: remote.features.commandList,
|
|
536
534
|
}, target);
|
|
537
535
|
}
|
|
536
|
+
remoteTypertGateway(remote) {
|
|
537
|
+
const localSessionGeneration = harnessSessionGeneration(this.host?.localHarnessVersion?.());
|
|
538
|
+
return new RemoteTypertGateway(remote.client, localSessionGeneration === 'v3' && remote.features.sessionFormat !== 3 ? 'legacy-to-v3' : undefined);
|
|
539
|
+
}
|
|
538
540
|
selectCodexTarget(virtual, remote) {
|
|
539
541
|
const target = { deviceId: remote.target.deviceId, name: remote.target.name };
|
|
540
542
|
if (this.gatewaySwitch.supportsCarrier()) {
|
|
@@ -550,20 +552,27 @@ export class ClientModeRuntime {
|
|
|
550
552
|
await virtual?.close();
|
|
551
553
|
}
|
|
552
554
|
assertRemoteCompatible(remote) {
|
|
555
|
+
this.selectHarnessRemoteTransport(remote);
|
|
556
|
+
}
|
|
557
|
+
selectHarnessRemoteTransport(remote) {
|
|
553
558
|
const localRemoteGateway = this.gatewaySwitch.supportsCarrier();
|
|
559
|
+
const localSessionGeneration = harnessSessionGeneration(this.host?.localHarnessVersion?.());
|
|
554
560
|
if (localRemoteGateway && remote.features.remoteGateway) {
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
return;
|
|
559
|
-
throw new ClientModeError('HARNESS_VERSION_INCOMPATIBLE', `The local and remote Harness Session formats differ (${localSessionGeneration} vs ${remoteSessionGeneration}).`);
|
|
561
|
+
if (localSessionGeneration === 'v3' || remote.features.sessionFormat !== 3)
|
|
562
|
+
return 'remoteGateway';
|
|
563
|
+
throw new ClientModeError('HARNESS_VERSION_INCOMPATIBLE', 'The selected Host uses Harness Session V3, but this Client uses the legacy Typert Remote session format.');
|
|
560
564
|
}
|
|
561
|
-
if (
|
|
562
|
-
return;
|
|
565
|
+
if (this.proxySwitch !== undefined && remote.features.apiProxy)
|
|
566
|
+
return 'apiProxy';
|
|
563
567
|
throw new ClientModeError('HARNESS_VERSION_INCOMPATIBLE', localRemoteGateway
|
|
564
|
-
? 'The selected Host does not provide
|
|
568
|
+
? 'The selected Host does not provide a compatible Harness Typert Remote Gateway transport.'
|
|
565
569
|
: 'The selected Host does not provide the legacy Harness ApiProxy transport.');
|
|
566
570
|
}
|
|
571
|
+
assertLocalHarnessCarrierAvailable() {
|
|
572
|
+
if (this.gatewaySwitch.supportsCarrier() || this.proxySwitch !== undefined)
|
|
573
|
+
return;
|
|
574
|
+
throw new ClientModeError('HARNESS_VERSION_INCOMPATIBLE', 'This Client does not provide a compatible Harness carrier for the selected remote workspace.');
|
|
575
|
+
}
|
|
567
576
|
async connect(targetDeviceId, signal) {
|
|
568
577
|
signal?.throwIfAborted();
|
|
569
578
|
const progressRunId = this.connectionProgressRun + 1;
|
|
@@ -1086,12 +1095,13 @@ export async function probeRemoteHostFeatures(client, clientVersion) {
|
|
|
1086
1095
|
const apiProxy = capabilities.has('harness.api.v1');
|
|
1087
1096
|
const remoteV1 = capabilities.has('harness.remote.v1');
|
|
1088
1097
|
const remoteV3 = capabilities.has('harness.remote.v3');
|
|
1098
|
+
const codex = capabilities.has('codex.appserver.v1');
|
|
1089
1099
|
if (remoteV1 && remoteV3) {
|
|
1090
1100
|
throw new ClientModeError('INVALID_MESSAGE', 'The remote Host advertised conflicting Harness Session formats.');
|
|
1091
1101
|
}
|
|
1092
1102
|
const sessionFormat = remoteV3 ? 3 : undefined;
|
|
1093
1103
|
const remoteGateway = remoteV3 || remoteV1;
|
|
1094
|
-
if (!apiProxy && !remoteGateway) {
|
|
1104
|
+
if (!apiProxy && !remoteGateway && !codex) {
|
|
1095
1105
|
throw new ClientModeError('FEATURE_NOT_SUPPORTED', 'The remote Host exposes no supported Harness transport.');
|
|
1096
1106
|
}
|
|
1097
1107
|
return {
|
|
@@ -1100,7 +1110,7 @@ export async function probeRemoteHostFeatures(client, clientVersion) {
|
|
|
1100
1110
|
apiProxy,
|
|
1101
1111
|
remoteGateway,
|
|
1102
1112
|
...(sessionFormat === undefined ? {} : { sessionFormat }),
|
|
1103
|
-
codex
|
|
1113
|
+
codex,
|
|
1104
1114
|
};
|
|
1105
1115
|
}
|
|
1106
1116
|
async function waitForCodexFrames(stream, signal) {
|