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.
Files changed (65) hide show
  1. package/README.md +4 -4
  2. package/dist/acp.d.ts +75 -0
  3. package/dist/acp.d.ts.map +1 -0
  4. package/dist/acp.js +61 -0
  5. package/dist/acp.js.map +1 -0
  6. package/dist/client-runtime.d.ts +14 -1
  7. package/dist/client-runtime.d.ts.map +1 -1
  8. package/dist/client-runtime.js +34 -24
  9. package/dist/client-runtime.js.map +1 -1
  10. package/dist/client.github.js +224 -9
  11. package/dist/client.js +224 -9
  12. package/dist/client.js.map +1 -1
  13. package/dist/codex/method-policy.d.ts +10 -10
  14. package/dist/codex/peer-bridge.d.ts.map +1 -1
  15. package/dist/codex/peer-bridge.js +3 -4
  16. package/dist/codex/peer-bridge.js.map +1 -1
  17. package/dist/config.d.ts +24 -0
  18. package/dist/config.d.ts.map +1 -1
  19. package/dist/config.js +3 -0
  20. package/dist/config.js.map +1 -1
  21. package/dist/connection-controller.d.ts +5 -0
  22. package/dist/connection-controller.d.ts.map +1 -1
  23. package/dist/connection-controller.js +16 -1
  24. package/dist/connection-controller.js.map +1 -1
  25. package/dist/control-route.d.ts +22 -0
  26. package/dist/control-route.d.ts.map +1 -1
  27. package/dist/control-route.js +120 -0
  28. package/dist/control-route.js.map +1 -1
  29. package/dist/control-runtime.d.ts +6 -1
  30. package/dist/control-runtime.d.ts.map +1 -1
  31. package/dist/control-runtime.js +58 -5
  32. package/dist/control-runtime.js.map +1 -1
  33. package/dist/harness-api-bridge.d.ts.map +1 -1
  34. package/dist/harness-api-bridge.js +32 -11
  35. package/dist/harness-api-bridge.js.map +1 -1
  36. package/dist/harness-remote-bridge.d.ts +2 -1
  37. package/dist/harness-remote-bridge.d.ts.map +1 -1
  38. package/dist/harness-remote-bridge.js +47 -6
  39. package/dist/harness-remote-bridge.js.map +1 -1
  40. package/dist/index.d.ts +2 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +801 -147
  43. package/dist/index.js.map +4 -4
  44. package/dist/remote-typert-gateway.d.ts +3 -1
  45. package/dist/remote-typert-gateway.d.ts.map +1 -1
  46. package/dist/remote-typert-gateway.js +16 -5
  47. package/dist/remote-typert-gateway.js.map +1 -1
  48. package/dist/rpc-router.d.ts +5 -2
  49. package/dist/rpc-router.d.ts.map +1 -1
  50. package/dist/rpc-router.js +18 -1
  51. package/dist/rpc-router.js.map +1 -1
  52. package/dist/service.d.ts +9 -0
  53. package/dist/service.d.ts.map +1 -1
  54. package/dist/service.js +32 -3
  55. package/dist/service.js.map +1 -1
  56. package/dist/session-format-compat.d.ts +3 -0
  57. package/dist/session-format-compat.d.ts.map +1 -0
  58. package/dist/session-format-compat.js +183 -0
  59. package/dist/session-format-compat.js.map +1 -0
  60. package/dist/tui-command.js +5 -3
  61. package/dist/tui-command.js.map +1 -1
  62. package/dist/version.d.ts +1 -1
  63. package/dist/version.js +1 -1
  64. package/dsh-plugin.json +1 -1
  65. 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.12
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.12
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.12` supports:
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
- Both Desktop endpoints must use the same Harness carrier and Session generation. ApiProxy/Typert and v0.1.2/V3 connections are not translated; mixed-generation connections are rejected before mutations.
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":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,eAAe,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAErN,2FAA2F;AAC3F,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;IAC5B,UAAU,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;IACrE,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpE,WAAW,CAAC,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACtE,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjG,iBAAiB,CAAC,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtE,MAAM,CAAC,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/C,OAAO,CAAC,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACxB;AAED,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,iBAAiB,GAAG,QAAQ,CAAC,iBAAiB,CAAC;IACtF,OAAO,CAAC,GAAG;IACX,UAAU,CAAC,CAAC,EAAE,mBAAmB;IACjC,UAAU,CAAC,CAAC,EAAE,gBAAgB,GAAG;QAAE,OAAO,CAAC,EAAE,UAAU,CAAA;KAAE;mBAbE,MAAM;;IAcjE,WAAW,CAAC,CAAC,EAAE,gBAAgB,GAAG;QAAE,OAAO,CAAC,EAAE,UAAU,CAAA;KAAE;mBAbG,MAAM;;IAcnE,MAAM,CAAC,CAAC,EAAE,eAAe,GAAG;QAAE,OAAO,CAAC,EAAE,UAAU,CAAA;KAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC;IAClG,iBAAiB,CAAC,CAAC,EAAE,2BAA2B,GAAG;QAAE,OAAO,CAAC,EAAE,UAAU,CAAA;KAAE;IAC3E,MAAM,CAAC,CAAC,EAAE,eAAe,GAAG;QAAE,OAAO,CAAC,EAAE,UAAU,CAAA;KAAE;IACpD,OAAO,CAAC,CAAC,EAAE,gBAAgB,GAAG;QAAE,OAAO,CAAC,EAAE,UAAU,CAAA;KAAE;CACvD;AAID,MAAM,WAAW,YAAY;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE;AAC5F,eAAO,MAAM,gBAAgB,EAAE,SAAS,YAAY,EAInD,CAAA;AAED,gEAAgE;AAChE,qBAAa,eAAe;IAId,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;IAC5B,OAAO,CAAC,KAAK,CAAC,CAAgC;IAC9C,OAAO,CAAC,MAAM,CAAI;gBACW,MAAM,EAAE,YAAY;IACjD,OAAO,CAAC,MAAM;IACR,UAAU,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IACrE,UAAU,CAAC,MAAM,EAAE,gBAAgB;;;IACnC,WAAW,CAAC,MAAM,EAAE,gBAAgB;;;IACpC,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC;IAC5E,MAAM,CAAC,CAAC,EAAE,eAAe;IACzB,OAAO,CAAC,CAAC,EAAE,gBAAgB;IAC3B,iBAAiB,CAAC,CAAC,EAAE,2BAA2B;IAChD,KAAK;IACX,OAAO,CAAC,IAAI;CACb"}
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp.js","sourceRoot":"","sources":["../src/acp.ts"],"names":[],"mappings":"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"}
@@ -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":"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"}
1
+ {"version":3,"file":"client-runtime.d.ts","sourceRoot":"","sources":["../src/client-runtime.ts"],"names":[],"mappings":"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"}
@@ -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 { CONTROL_RPC_PREFIX } from './control-route.js';
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.rpc.handle(CONTROL_RPC_PREFIX, (endpoint, payload, signal) => this.handleControl(endpoint, payload, signal), {
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.assertRemoteCompatible(remote);
253
+ const transport = this.selectHarnessRemoteTransport(remote);
256
254
  let workspace;
257
- if (remote.features.remoteGateway) {
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.assertRemoteCompatible(remote);
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.assertRemoteCompatible(remote);
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 (this.gatewaySwitch.supportsCarrier()) {
529
- this.gatewaySwitch.selectRemote(new RemoteTypertGateway(remote.client), undefined, target);
526
+ if (transport === 'remoteGateway') {
527
+ this.gatewaySwitch.selectRemote(this.remoteTypertGateway(remote), undefined, target);
530
528
  return;
531
529
  }
532
- this.proxySwitch.selectRemote(new RemoteHarnessApiProxy(remote.client).api, target);
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
- const localSessionGeneration = harnessSessionGeneration(this.host?.localHarnessVersion?.());
556
- const remoteSessionGeneration = remote.features.sessionFormat === 3 ? 'v3' : 'legacy';
557
- if (localSessionGeneration === remoteSessionGeneration)
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 (!localRemoteGateway && this.proxySwitch !== undefined && remote.features.apiProxy)
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 the Harness v0.1.2 Typert Remote Gateway transport.'
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: capabilities.has('codex.appserver.v1'),
1113
+ codex,
1104
1114
  };
1105
1115
  }
1106
1116
  async function waitForCodexFrames(stream, signal) {