ds-harness-remote 0.4.3 → 0.4.4

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 CHANGED
@@ -8,6 +8,12 @@ DeepSeek Remote plugin for DSH Host + Remote workspaces. One install provides en
8
8
 
9
9
  DeepSeek Remote 是 DSH Host + Remote 工作区插件。一次安装可提供本地设备到远端的加密远程访问能力,以及在现有 Harness UI 内切换远端工作区。
10
10
 
11
+ > Install this DSH bundle with `dsh plugin`, not with npm directly. The DSH command updates the
12
+ > selected profile and adds the bundle configuration layer.
13
+ >
14
+ > 这是 DSH bundle,请通过 `dsh plugin` 安装,不要直接使用 npm。DSH 命令会更新指定 profile,
15
+ > 并加入 bundle 配置层。
16
+
11
17
  No Client mode switch is required. Choosing a remote workspace keeps the local UI unchanged, routes rc.2 through `RemoteHarnessApiProxy` or the alpha generation through the Typert Remote Gateway carrier, and falls back to the matching local transport on disconnect or exit.
12
18
 
13
19
  无需启动或切换 Client 模式。选择远端工作区后,本地 UI 不变:rc.2 请求通过 `RemoteHarnessApiProxy` 路由,alpha 代际请求通过 Typert Remote Gateway carrier 路由;断线或退出时恢复对应的本地 transport。
@@ -119,9 +125,48 @@ Settings are written to `$DSH_HOME/settings.yaml` under `ds-harness-remote` (res
119
125
 
120
126
  配置写入 `$DSH_HOME/settings.yaml` 的 `ds-harness-remote`(重启后生效)。
121
127
 
128
+ ### dsh-TUI Host login / dsh-TUI Host 登录
129
+
130
+ The Host runtime can start without the Desktop browser `connection` service. For a terminal-only
131
+ [dsh-TUI](https://github.com/ccch1mneyyy/dsh-TUI) profile, install the plugin, start `dsh-tui`, and
132
+ use the native `/remote` slash command:
133
+
134
+ 纯终端 [dsh-TUI](https://github.com/ccch1mneyyy/dsh-TUI) profile 不需要 Desktop 浏览器的
135
+ `connection` 服务。安装插件并启动 `dsh-tui` 后,使用原生 `/remote` Slash Command:
136
+
137
+ ```sh
138
+ dsh plugin --profile dsh-tui add ds-harness-remote@0.4.4
139
+ ```
140
+
141
+ ```text
142
+ /remote
143
+ /remote login [github|zhihu]
144
+ /remote status
145
+ /remote logout
146
+ ```
147
+
148
+ `/remote login` defaults to Zhihu and opens a TUI-native QR scene with a clickable authorization URL
149
+ below the code. GitHub is also supported. dsh-TUI enables Host control by default; `/remote logout`
150
+ revokes the Host and rotates its local identity. Host configuration is intentionally not exposed yet;
151
+ the Server is `https://dsh.r2049.cn`.
152
+
153
+ `/remote login` 默认使用知乎,并打开 TUI 原生二维码场景,二维码下方会显示可点击的授权 URL;
154
+ 同时支持 GitHub。dsh-TUI 默认开启 Host 控制;`/remote logout` 会撤销 Host 并轮换本地身份。
155
+ 目前不提供 Host 配置,Server 固定为 `https://dsh.r2049.cn`。
156
+
157
+ Install the package through `dsh plugin`; installing it directly with npm does not update a DSH
158
+ profile or add the bundle configuration layer. Use `/remote` for dsh-TUI Host authorization and
159
+ status management. Server presence remains visible to authorized Remote clients while dsh-TUI is
160
+ running.
161
+
162
+ 请通过 `dsh plugin` 安装。直接使用 npm 安装不会更新 DSH profile,也不会加入 bundle 配置层。
163
+ dsh-TUI Host 的授权与状态管理统一使用 `/remote`;dsh-TUI 运行时,Server presence 仍由已授权的
164
+ Remote Client 查询。
165
+
122
166
  Codex Session/History is an experimental optional domain inside this same plugin. It is enabled by
123
- default and can be disabled from the DeepSeek Remote settings card; CodeX App Server `project/list`
124
- is the only source of truth for virtual Workspaces. The current release includes the Host carrier,
167
+ default and can be disabled from the DeepSeek Remote settings card. Virtual Workspaces prefer CodeX
168
+ App Server `project/list` and fall back to exact absolute `thread/list.cwd` entries when that catalog
169
+ is unavailable or empty. The current release includes the Host carrier,
125
170
  shared Client Core, Desktop Plugin Web history/live UI with
126
171
  create/rename/archive/restore, dynamic capability re-probing, and bounded App Server restart. Opening
127
172
  history is read-only and resume is deferred until the user continues work. Current
@@ -129,7 +174,8 @@ stdio/project/list/read compatibility is smoke-tested; encrypted cross-machine t
129
174
  remains pending. Android is outside the current Plugin-only scope.
130
175
 
131
176
  Codex Session/History 是当前插件内部的实验性可选领域,默认开启,可在 DeepSeek Remote 设置卡片
132
- 中关闭,并以 CodeX App Server 的 `project/list` 作为虚拟 Workspace 的唯一来源。当前已完成 Host carrier、共享 Client Core、
177
+ 中关闭。虚拟 Workspace 优先使用 CodeX App Server 的 `project/list`,该目录为空或不可用时回退到
178
+ `thread/list` 已返回的绝对 `cwd`。当前已完成 Host carrier、共享 Client Core、
133
179
  Desktop Plugin Web History/live UI(包括新建、改名、归档/恢复)、动态 capability 重探测与 App
134
180
  Server 有界重启。打开 History 仅执行只读,继续操作时才 resume。当前 stdio/project/list/read 已完成
135
181
  真实冒烟验证;加密跨机 turn/approval 联调仍待完成。Android 不属于当前仅 Plugin 的交付范围。
@@ -147,26 +193,28 @@ ds-harness-remote:
147
193
  export DSH_REMOTE_SERVER=https://dsh.r2049.cn
148
194
  ```
149
195
 
150
- Install the npm package for the `web` profile:
196
+ Add the package to the `web` profile through DSH's plugin manager:
151
197
 
152
- 通过 npm 包安装到 `web` profile:
198
+ 通过 DSH 插件管理命令将包加入 `web` profile:
153
199
 
154
200
  ```sh
155
- dsh plugin --profile web add ds-harness-remote@0.4.2
201
+ dsh plugin --profile web add ds-harness-remote@0.4.4
156
202
  ```
157
203
 
158
- npm / npm 包地址:<https://www.npmjs.com/package/ds-harness-remote>
204
+ Do not run npm directly; it does not configure the DSH profile.
205
+
206
+ 不要直接运行 npm;它不会配置 DSH profile。
159
207
 
160
208
  Alternatively, install the pinned GitHub release in DSH Desktop or with the CLI:
161
209
 
162
210
  也可以在 DSH Desktop 中安装固定版本的 GitHub Release,或使用命令行安装:
163
211
 
164
212
  ```text
165
- github:liguobao/ds-harness-remote#v0.4.2
213
+ github:liguobao/ds-harness-remote#v0.4.4
166
214
  ```
167
215
 
168
216
  ```sh
169
- dsh plugin --profile web add "github:liguobao/ds-harness-remote#v0.4.2"
217
+ dsh plugin --profile web add "github:liguobao/ds-harness-remote#v0.4.4"
170
218
  ```
171
219
 
172
220
  GitHub / 项目地址:<https://github.com/liguobao/ds-harness-remote>
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { runCli } from '../dist/index.js'
4
+
5
+ runCli().then(
6
+ code => { process.exitCode = code },
7
+ error => {
8
+ console.error(error instanceof Error ? error.message : 'The Remote command failed.')
9
+ process.exitCode = 1
10
+ },
11
+ )
package/cordis.patch.yml CHANGED
@@ -1,6 +1,28 @@
1
1
  - insert:
2
2
  - id: ds-harness-remote
3
3
  name: 'ds-harness-remote'
4
+ # dsh-TUI needs a scoped entry with explicit command/scene injects.
5
+ # Keep this ordinary Desktop entry inactive when that front door exists.
6
+ disabled: !!js >-
7
+ [...ctx.loader.entries()].some(entry =>
8
+ (entry.options.id === 'dsh-tui' || entry.options.name === '@deepseek-harness-tui/dsh-tui')
9
+ && !entry.disabled
10
+ )
11
+ config:
12
+ enabled: true
13
+ role: host
14
+ serverUrl: https://dsh.r2049.cn
15
+ codex:
16
+ enabled: true
17
+ binary: codex
18
+ - id: ds-harness-remote-tui
19
+ name: 'ds-harness-remote'
20
+ disabled: !!js >-
21
+ ![...ctx.loader.entries()].some(entry =>
22
+ (entry.options.id === 'dsh-tui' || entry.options.name === '@deepseek-harness-tui/dsh-tui')
23
+ && !entry.disabled
24
+ )
25
+ inject: [settings, typertGateway, commands, tuiCommandTrees, tuiScenes]
4
26
  config:
5
27
  enabled: true
6
28
  role: host
package/dist/cli.d.ts ADDED
@@ -0,0 +1,31 @@
1
+ import { IdentityStore, type HostIdentity, type IdentityStoreOptions } from './identity-store.js';
2
+ import { type OAuthProvider, type OAuthQrPollResult, type OAuthQrSession } from './server-api.js';
3
+ import { ServerCredentialStore, type ServerCredentials } from './server-credentials.js';
4
+ interface CliWriter {
5
+ isTTY?: boolean;
6
+ write(value: string): unknown;
7
+ }
8
+ interface CliHostApi {
9
+ startOAuthQrLogin(provider: OAuthProvider): Promise<OAuthQrSession>;
10
+ pollOAuthQrLogin(identity: HostIdentity, qrId: string, recoverIdentity?: () => Promise<HostIdentity>): Promise<OAuthQrPollResult>;
11
+ bindIdentity(identity: HostIdentity): void;
12
+ authenticate(identity?: HostIdentity): Promise<ServerCredentials>;
13
+ revokeCurrentDevice(): Promise<void>;
14
+ }
15
+ export interface RemoteCliDependencies {
16
+ env?: NodeJS.ProcessEnv;
17
+ stdout?: CliWriter;
18
+ stderr?: CliWriter;
19
+ now?: () => number;
20
+ wait?: (milliseconds: number) => Promise<void>;
21
+ renderQr?: (url: string) => Promise<string>;
22
+ createIdentityStore?: (options: IdentityStoreOptions) => IdentityStore;
23
+ createHostApi?: (serverUrl: string, store: ServerCredentialStore) => CliHostApi;
24
+ }
25
+ /** TUI-friendly account bootstrap. Configuration remains owned by the DSH profile. */
26
+ export declare function runCli(args?: readonly string[], dependencies?: RemoteCliDependencies): Promise<number>;
27
+ export declare function renderTerminalQr(url: string): Promise<string>;
28
+ /** Square terminal modules at half the row count for fullscreen TUI scenes. */
29
+ export declare function renderCompactTerminalQr(url: string): Promise<string>;
30
+ export {};
31
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,aAAa,EAEb,KAAK,YAAY,EACjB,KAAK,oBAAoB,EAC1B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAKvF,UAAU,SAAS;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;CAC9B;AAED,UAAU,UAAU;IAClB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;IACnE,gBAAgB,CACd,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,MAAM,EACZ,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,GAC5C,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC7B,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAA;IAC1C,YAAY,CAAC,QAAQ,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACjE,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACrC;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3C,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,aAAa,CAAA;IACtE,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,KAAK,UAAU,CAAA;CAChF;AAaD,sFAAsF;AACtF,wBAAsB,MAAM,CAC1B,IAAI,GAAE,SAAS,MAAM,EAA0B,EAC/C,YAAY,GAAE,qBAA0B,GACvC,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAuJD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBnE;AAED,+EAA+E;AAC/E,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuB1E"}
package/dist/cli.js ADDED
@@ -0,0 +1,283 @@
1
+ import { stat } from 'node:fs/promises';
2
+ import { hostname } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { DEFAULT_REMOTE_SERVER_URL, normalizeServerUrl } from './config.js';
5
+ import { IdentityStore, serverStorageDirectory, } from './identity-store.js';
6
+ import { HostServerApi, ServerApiError, } from './server-api.js';
7
+ import { ServerCredentialStore } from './server-credentials.js';
8
+ const QR_POLL_INTERVAL_MS = 2_000;
9
+ const TERMINAL_QR_MARGIN = 4;
10
+ /** TUI-friendly account bootstrap. Configuration remains owned by the DSH profile. */
11
+ export async function runCli(args = process.argv.slice(2), dependencies = {}) {
12
+ const runtime = resolveDependencies(dependencies);
13
+ const [command, ...rest] = args;
14
+ try {
15
+ if (command === 'login')
16
+ return await login(rest, runtime);
17
+ if (command === 'status')
18
+ return await status(rest, runtime);
19
+ if (command === 'logout')
20
+ return await logout(rest, runtime);
21
+ if (command === 'help' || command === '--help' || command === '-h' || command === undefined) {
22
+ write(runtime.stdout, helpText());
23
+ return 0;
24
+ }
25
+ throw new CliUsageError(`Unknown command: ${command}`);
26
+ }
27
+ catch (error) {
28
+ write(runtime.stderr, `${cliErrorMessage(error)}\n`);
29
+ if (error instanceof CliUsageError)
30
+ write(runtime.stderr, `\n${helpText()}`);
31
+ return error instanceof CliUsageError ? 2 : 1;
32
+ }
33
+ }
34
+ async function login(args, runtime) {
35
+ if (args.length > 1)
36
+ throw new CliUsageError('Usage: ds-harness-remote login [github|zhihu]');
37
+ const provider = args[0] ?? 'zhihu';
38
+ if (provider !== 'github' && provider !== 'zhihu') {
39
+ throw new CliUsageError('Login provider must be github or zhihu.');
40
+ }
41
+ const context = await hostContext(runtime);
42
+ const session = await context.api.startOAuthQrLogin(provider);
43
+ const qr = await runtime.renderQr(session.scanUrl);
44
+ const providerName = provider === 'github' ? 'GitHub' : 'Zhihu';
45
+ write(runtime.stdout, `Using ${providerName} QR login. ${alternativeProviderHint(provider)}\n`);
46
+ write(runtime.stdout, 'Scan this QR code to authorize this Host:\n\n');
47
+ write(runtime.stdout, `${qr.trimEnd()}\n`);
48
+ write(runtime.stdout, `Authorization URL: ${terminalLink(session.scanUrl, runtime.stdout)}\n\nWaiting for authorization...\n`);
49
+ const deadline = runtime.now() + session.expiresIn * 1_000;
50
+ let identity = context.identity;
51
+ while (runtime.now() < deadline) {
52
+ let result;
53
+ try {
54
+ result = await context.api.pollOAuthQrLogin(identity, session.qrId, async () => {
55
+ identity = await context.identities.reset(context.deviceName);
56
+ return identity;
57
+ });
58
+ }
59
+ catch (error) {
60
+ if (!(error instanceof ServerApiError) || !error.retryable)
61
+ throw error;
62
+ await runtime.wait(Math.min(QR_POLL_INTERVAL_MS, Math.max(1, deadline - runtime.now())));
63
+ continue;
64
+ }
65
+ if (result.status === 'complete') {
66
+ write(runtime.stdout, `${authorizedMessage(result.authorization)} Restart dsh-tui to bring the Remote Host online.\n`);
67
+ return 0;
68
+ }
69
+ if (result.status === 'expired')
70
+ break;
71
+ await runtime.wait(Math.min(QR_POLL_INTERVAL_MS, Math.max(1, deadline - runtime.now())));
72
+ }
73
+ write(runtime.stderr, 'The QR login expired. Run the login command again to generate a new code.\n');
74
+ return 1;
75
+ }
76
+ async function status(args, runtime) {
77
+ if (args.length !== 0)
78
+ throw new CliUsageError('Usage: ds-harness-remote status');
79
+ const serverUrl = selectedServer();
80
+ const root = new IdentityStore({ env: runtime.env }).directory;
81
+ const directory = serverStorageDirectory(root, serverUrl, 'host');
82
+ const lines = [
83
+ 'Remote Host status',
84
+ `Server: ${serverUrl}`,
85
+ 'Host control: enabled (dsh-TUI default)',
86
+ ];
87
+ if (!await exists(join(directory, 'device.json'))) {
88
+ lines.push('Device: not initialized', 'Authorization: logged out', 'Credential: unavailable');
89
+ write(runtime.stdout, `${lines.join('\n')}\n\nRun "ds-harness-remote login" or use "/remote login" in dsh-TUI.\n`);
90
+ return 0;
91
+ }
92
+ const identities = runtime.createIdentityStore({ directory, env: runtime.env });
93
+ const identity = await identities.loadOrCreate(hostname());
94
+ const store = new ServerCredentialStore(directory);
95
+ const stored = await store.load(serverUrl, identity.deviceId);
96
+ lines.push(`Device: ${identity.name} (${identity.deviceId})`);
97
+ if (stored === undefined) {
98
+ lines.push('Authorization: logged out', 'Credential: unavailable');
99
+ write(runtime.stdout, `${lines.join('\n')}\n\nRun "ds-harness-remote login" or use "/remote login" in dsh-TUI.\n`);
100
+ return 0;
101
+ }
102
+ lines.push(`Authorization: logged in (${authorizationLabel(stored.authorizationMethod)})`);
103
+ if (stored.account !== undefined)
104
+ lines.push(`Account: ${stored.account}`);
105
+ const api = runtime.createHostApi(serverUrl, store);
106
+ api.bindIdentity(identity);
107
+ try {
108
+ await api.authenticate(identity);
109
+ lines.push('Credential: ready');
110
+ lines.push('Presence: published while dsh-tui is running');
111
+ write(runtime.stdout, `${lines.join('\n')}\n`);
112
+ return 0;
113
+ }
114
+ catch (error) {
115
+ lines.push(`Credential: unavailable (${statusErrorCode(error)})`);
116
+ write(runtime.stdout, `${lines.join('\n')}\n`);
117
+ return 1;
118
+ }
119
+ }
120
+ async function logout(args, runtime) {
121
+ if (args.length !== 0)
122
+ throw new CliUsageError('Usage: ds-harness-remote logout');
123
+ const serverUrl = selectedServer();
124
+ const root = new IdentityStore({ env: runtime.env }).directory;
125
+ const directory = serverStorageDirectory(root, serverUrl, 'host');
126
+ if (!await exists(join(directory, 'device.json'))) {
127
+ await new ServerCredentialStore(directory).clear();
128
+ write(runtime.stdout, 'This Host is already logged out.\n');
129
+ return 0;
130
+ }
131
+ const deviceName = hostname();
132
+ const identities = runtime.createIdentityStore({ directory, env: runtime.env });
133
+ const identity = await identities.loadOrCreate(deviceName);
134
+ const api = runtime.createHostApi(serverUrl, new ServerCredentialStore(directory));
135
+ api.bindIdentity(identity);
136
+ let revokeFailure;
137
+ try {
138
+ await api.revokeCurrentDevice();
139
+ }
140
+ catch (error) {
141
+ revokeFailure = error;
142
+ }
143
+ await identities.reset(deviceName);
144
+ if (revokeFailure !== undefined) {
145
+ throw new Error(`Local Host credentials were cleared, but Server revocation failed: ${cliErrorMessage(revokeFailure)}`);
146
+ }
147
+ write(runtime.stdout, 'Remote Host logged out and its local device identity was rotated. Restart dsh-tui.\n');
148
+ return 0;
149
+ }
150
+ async function hostContext(runtime) {
151
+ const serverUrl = selectedServer();
152
+ const root = new IdentityStore({ env: runtime.env }).directory;
153
+ const directory = serverStorageDirectory(root, serverUrl, 'host');
154
+ const deviceName = hostname();
155
+ const identities = runtime.createIdentityStore({ directory, env: runtime.env });
156
+ const identity = await identities.loadOrCreate(deviceName);
157
+ const api = runtime.createHostApi(serverUrl, new ServerCredentialStore(directory));
158
+ return { api, identities, identity, deviceName };
159
+ }
160
+ function selectedServer() {
161
+ return normalizeServerUrl(DEFAULT_REMOTE_SERVER_URL);
162
+ }
163
+ function resolveDependencies(input) {
164
+ return {
165
+ env: input.env ?? process.env,
166
+ stdout: input.stdout ?? process.stdout,
167
+ stderr: input.stderr ?? process.stderr,
168
+ now: input.now ?? Date.now,
169
+ wait: input.wait ?? (milliseconds => new Promise(resolve => setTimeout(resolve, milliseconds))),
170
+ renderQr: input.renderQr ?? renderTerminalQr,
171
+ createIdentityStore: input.createIdentityStore ?? (options => new IdentityStore(options)),
172
+ createHostApi: input.createHostApi ?? ((serverUrl, store) => new HostServerApi(serverUrl, store)),
173
+ };
174
+ }
175
+ export async function renderTerminalQr(url) {
176
+ // Keep the terminal-only renderer off the Host plugin startup path. The
177
+ // built-in compact renderer has only a one-module quiet zone and relies on
178
+ // half-height glyphs, which is difficult for phone cameras to recognize in
179
+ // some terminal profiles. Render square modules with an explicit standard
180
+ // four-module quiet zone instead.
181
+ const { default: QRCode } = await import('qrcode');
182
+ const modules = QRCode.create(url, { errorCorrectionLevel: 'M' }).modules;
183
+ const width = modules.size + TERMINAL_QR_MARGIN * 2;
184
+ const quietLine = `\u001B[47m${' '.repeat(width * 2)}\u001B[0m`;
185
+ const lines = Array.from({ length: TERMINAL_QR_MARGIN }, () => quietLine);
186
+ for (let row = 0; row < modules.size; row += 1) {
187
+ let line = `\u001B[47m${' '.repeat(TERMINAL_QR_MARGIN * 2)}`;
188
+ for (let column = 0; column < modules.size; column += 1) {
189
+ line += modules.get(row, column) === 1 ? '\u001B[40m ' : '\u001B[47m ';
190
+ }
191
+ line += `\u001B[47m${' '.repeat(TERMINAL_QR_MARGIN * 2)}\u001B[0m`;
192
+ lines.push(line);
193
+ }
194
+ lines.push(...Array.from({ length: TERMINAL_QR_MARGIN }, () => quietLine));
195
+ return lines.join('\n');
196
+ }
197
+ /** Square terminal modules at half the row count for fullscreen TUI scenes. */
198
+ export async function renderCompactTerminalQr(url) {
199
+ const { default: QRCode } = await import('qrcode');
200
+ const modules = QRCode.create(url, { errorCorrectionLevel: 'M' }).modules;
201
+ const size = modules.size + TERMINAL_QR_MARGIN * 2;
202
+ const lines = [];
203
+ const isBlack = (row, column) => {
204
+ const qrRow = row - TERMINAL_QR_MARGIN;
205
+ const qrColumn = column - TERMINAL_QR_MARGIN;
206
+ return qrRow >= 0 && qrRow < modules.size
207
+ && qrColumn >= 0 && qrColumn < modules.size
208
+ && modules.get(qrRow, qrColumn) === 1;
209
+ };
210
+ for (let row = 0; row < size; row += 2) {
211
+ let line = '\u001B[30;47m';
212
+ for (let column = 0; column < size; column += 1) {
213
+ const top = isBlack(row, column);
214
+ const bottom = isBlack(row + 1, column);
215
+ line += top ? bottom ? '█' : '▀' : bottom ? '▄' : ' ';
216
+ }
217
+ lines.push(`${line}\u001B[0m`);
218
+ }
219
+ return lines.join('\n');
220
+ }
221
+ function authorizedMessage(authorization) {
222
+ return authorization.account === undefined
223
+ ? 'Remote Host login complete.'
224
+ : `Remote Host login complete for ${authorization.account}.`;
225
+ }
226
+ function alternativeProviderHint(provider) {
227
+ return provider === 'zhihu'
228
+ ? 'GitHub is also supported: ds-harness-remote login github'
229
+ : 'Zhihu is also supported: ds-harness-remote login zhihu';
230
+ }
231
+ function authorizationLabel(method) {
232
+ if (method === 'host_registration_code')
233
+ return 'Host registration code';
234
+ if (method === 'owned_device')
235
+ return 'owned device';
236
+ return 'account';
237
+ }
238
+ function statusErrorCode(error) {
239
+ return error instanceof ServerApiError ? error.code : 'CONNECTION_FAILED';
240
+ }
241
+ function cliErrorMessage(error) {
242
+ const message = error instanceof Error ? error.message : 'The Remote command failed.';
243
+ const code = error instanceof Error && 'code' in error && typeof error.code === 'string'
244
+ ? error.code
245
+ : undefined;
246
+ return code === undefined ? message : `${message} (${code})`;
247
+ }
248
+ function helpText() {
249
+ return [
250
+ 'Usage:',
251
+ ' ds-harness-remote login [github|zhihu]',
252
+ ' ds-harness-remote status',
253
+ ' ds-harness-remote logout',
254
+ '',
255
+ 'Inside dsh-TUI, use /remote login, /remote status, or /remote logout.',
256
+ 'login defaults to Zhihu and authorizes this computer as a Remote Host with a terminal QR code.',
257
+ `The Server is ${DEFAULT_REMOTE_SERVER_URL}.`,
258
+ 'Host configuration is not exposed by this CLI yet. Restart dsh-tui after login or logout.',
259
+ '',
260
+ ].join('\n');
261
+ }
262
+ function write(target, value) {
263
+ target.write(value);
264
+ }
265
+ function terminalLink(url, target) {
266
+ if (target.isTTY !== true)
267
+ return url;
268
+ return `\u001B]8;;${url}\u0007${url}\u001B]8;;\u0007`;
269
+ }
270
+ async function exists(path) {
271
+ try {
272
+ await stat(path);
273
+ return true;
274
+ }
275
+ catch (error) {
276
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT')
277
+ return false;
278
+ throw error;
279
+ }
280
+ }
281
+ class CliUsageError extends Error {
282
+ }
283
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,EACL,aAAa,EACb,sBAAsB,GAGvB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,aAAa,EACb,cAAc,GAKf,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,qBAAqB,EAA0B,MAAM,yBAAyB,CAAA;AAEvF,MAAM,mBAAmB,GAAG,KAAK,CAAA;AACjC,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAyC5B,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,OAA0B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAC/C,eAAsC,EAAE;IAExC,MAAM,OAAO,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAA;IACjD,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;IAC/B,IAAI,CAAC;QACH,IAAI,OAAO,KAAK,OAAO;YAAE,OAAO,MAAM,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC1D,IAAI,OAAO,KAAK,QAAQ;YAAE,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC5D,IAAI,OAAO,KAAK,QAAQ;YAAE,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC5D,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC5F,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;YACjC,OAAO,CAAC,CAAA;QACV,CAAC;QACD,MAAM,IAAI,aAAa,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAA;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACpD,IAAI,KAAK,YAAY,aAAa;YAAE,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,QAAQ,EAAE,EAAE,CAAC,CAAA;QAC5E,OAAO,KAAK,YAAY,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,IAAuB,EAAE,OAAmB;IAC/D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,+CAA+C,CAAC,CAAA;IAC7F,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAA;IACnC,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAClD,MAAM,IAAI,aAAa,CAAC,yCAAyC,CAAC,CAAA;IACpE,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;IAC1C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IAC7D,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAClD,MAAM,YAAY,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAA;IAC/D,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY,cAAc,uBAAuB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC/F,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,+CAA+C,CAAC,CAAA;IACtE,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IAC1C,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,sBAAsB,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAA;IAE9H,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,GAAG,KAAK,CAAA;IAC1D,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;IAC/B,OAAO,OAAO,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAChC,IAAI,MAAyB,CAAA;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;gBAC7E,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;gBAC7D,OAAO,QAAQ,CAAA;YACjB,CAAC,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS;gBAAE,MAAM,KAAK,CAAA;YACvE,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;YACxF,SAAQ;QACV,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,iBAAiB,CAAC,MAAM,CAAC,aAAa,CAAC,qDAAqD,CAAC,CAAA;YACtH,OAAO,CAAC,CAAA;QACV,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,MAAK;QACtC,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;IAC1F,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,6EAA6E,CAAC,CAAA;IACpG,OAAO,CAAC,CAAA;AACV,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAuB,EAAE,OAAmB;IAChE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,iCAAiC,CAAC,CAAA;IACjF,MAAM,SAAS,GAAG,cAAc,EAAE,CAAA;IAClC,MAAM,IAAI,GAAG,IAAI,aAAa,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,CAAA;IAC9D,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;IACjE,MAAM,KAAK,GAAG;QACZ,oBAAoB;QACpB,WAAW,SAAS,EAAE;QACtB,yCAAyC;KAC1C,CAAA;IAED,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,yBAAyB,EAAE,2BAA2B,EAAE,yBAAyB,CAAC,CAAA;QAC7F,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAA;QAClH,OAAO,CAAC,CAAA;IACV,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC/E,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC1D,MAAM,KAAK,GAAG,IAAI,qBAAqB,CAAC,SAAS,CAAC,CAAA;IAClD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAC7D,KAAK,CAAC,IAAI,CAAC,WAAW,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAA;IAC7D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,2BAA2B,EAAE,yBAAyB,CAAC,CAAA;QAClE,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAA;QAClH,OAAO,CAAC,CAAA;IACV,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,6BAA6B,kBAAkB,CAAC,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAA;IAC1F,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;IAC1E,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IACnD,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;QAChC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAC/B,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAA;QAC1D,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,OAAO,CAAC,CAAA;IACV,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,4BAA4B,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACjE,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,OAAO,CAAC,CAAA;IACV,CAAC;AACH,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAuB,EAAE,OAAmB;IAChE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,iCAAiC,CAAC,CAAA;IACjF,MAAM,SAAS,GAAG,cAAc,EAAE,CAAA;IAClC,MAAM,IAAI,GAAG,IAAI,aAAa,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,CAAA;IAC9D,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;IACjE,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,qBAAqB,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAA;QAClD,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,oCAAoC,CAAC,CAAA;QAC3D,OAAO,CAAC,CAAA;IACV,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,EAAE,CAAA;IAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC/E,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,CAAA;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAA;IAClF,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;IAC1B,IAAI,aAAsB,CAAA;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,mBAAmB,EAAE,CAAA;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,aAAa,GAAG,KAAK,CAAA;IACvB,CAAC;IACD,MAAM,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IAClC,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,sEAAsE,eAAe,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;IACzH,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,sFAAsF,CAAC,CAAA;IAC7G,OAAO,CAAC,CAAA;AACV,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,OAAmB;IAM5C,MAAM,SAAS,GAAG,cAAc,EAAE,CAAA;IAClC,MAAM,IAAI,GAAG,IAAI,aAAa,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,CAAA;IAC9D,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;IACjE,MAAM,UAAU,GAAG,QAAQ,EAAE,CAAA;IAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC/E,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,CAAA;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAA;IAClF,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAA;AAClD,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,kBAAkB,CAAC,yBAAyB,CAAC,CAAA;AACtD,CAAC;AAED,SAAS,mBAAmB,CAAC,KAA4B;IACvD,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG;QAC7B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM;QACtC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM;QACtC,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG;QAC1B,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;QAC/F,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,gBAAgB;QAC5C,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;QACzF,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;KAClG,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAChD,wEAAwE;IACxE,2EAA2E;IAC3E,2EAA2E;IAC3E,0EAA0E;IAC1E,kCAAkC;IAClC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAA;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,CAAA;IACzE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,GAAG,kBAAkB,GAAG,CAAC,CAAA;IACnD,MAAM,SAAS,GAAG,aAAa,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,WAAW,CAAA;IAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IAEzE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAC/C,IAAI,IAAI,GAAG,aAAa,GAAG,CAAC,MAAM,CAAC,kBAAkB,GAAG,CAAC,CAAC,EAAE,CAAA;QAC5D,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;YACxD,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAA;QAC1E,CAAC;QACD,IAAI,IAAI,aAAa,GAAG,CAAC,MAAM,CAAC,kBAAkB,GAAG,CAAC,CAAC,WAAW,CAAA;QAClE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAClB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAC1E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,GAAW;IACvD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAA;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,CAAA;IACzE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,GAAG,kBAAkB,GAAG,CAAC,CAAA;IAClD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,MAAc,EAAW,EAAE;QACvD,MAAM,KAAK,GAAG,GAAG,GAAG,kBAAkB,CAAA;QACtC,MAAM,QAAQ,GAAG,MAAM,GAAG,kBAAkB,CAAA;QAC5C,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,OAAO,CAAC,IAAI;eACpC,QAAQ,IAAI,CAAC,IAAI,QAAQ,GAAG,OAAO,CAAC,IAAI;eACxC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;IACzC,CAAC,CAAA;IAED,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACvC,IAAI,IAAI,GAAG,eAAe,CAAA;QAC1B,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;YAChD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YAChC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,EAAE,MAAM,CAAC,CAAA;YACvC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;QACvD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,WAAW,CAAC,CAAA;IAChC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,SAAS,iBAAiB,CAAC,aAAkC;IAC3D,OAAO,aAAa,CAAC,OAAO,KAAK,SAAS;QACxC,CAAC,CAAC,6BAA6B;QAC/B,CAAC,CAAC,kCAAkC,aAAa,CAAC,OAAO,GAAG,CAAA;AAChE,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAuB;IACtD,OAAO,QAAQ,KAAK,OAAO;QACzB,CAAC,CAAC,0DAA0D;QAC5D,CAAC,CAAC,wDAAwD,CAAA;AAC9D,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAgD;IAC1E,IAAI,MAAM,KAAK,wBAAwB;QAAE,OAAO,wBAAwB,CAAA;IACxE,IAAI,MAAM,KAAK,cAAc;QAAE,OAAO,cAAc,CAAA;IACpD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,KAAK,YAAY,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAA;AAC3E,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAA;IACrF,MAAM,IAAI,GAAG,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QACtF,CAAC,CAAC,KAAK,CAAC,IAAI;QACZ,CAAC,CAAC,SAAS,CAAA;IACb,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,IAAI,GAAG,CAAA;AAC9D,CAAC;AAED,SAAS,QAAQ;IACf,OAAO;QACL,QAAQ;QACR,0CAA0C;QAC1C,4BAA4B;QAC5B,4BAA4B;QAC5B,EAAE;QACF,uEAAuE;QACvE,gGAAgG;QAChG,iBAAiB,yBAAyB,GAAG;QAC7C,2FAA2F;QAC3F,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,SAAS,KAAK,CAAC,MAAiB,EAAE,KAAa;IAC7C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AACrB,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,MAAiB;IAClD,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI;QAAE,OAAO,GAAG,CAAA;IACrC,OAAO,aAAa,GAAG,SAAS,GAAG,kBAAkB,CAAA;AACvD,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,CAAA;QAChB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAA;QACtF,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,aAAc,SAAQ,KAAK;CAAG"}
@@ -19,6 +19,7 @@ export declare class CodexRemoteDomain {
19
19
  private unsubscribeInbound?;
20
20
  private unsubscribeUnavailable?;
21
21
  private readonly peers;
22
+ private readonly peerDeviceIds;
22
23
  private readonly turnOwners;
23
24
  private readonly approvals;
24
25
  private approvalExpiryTimer?;
@@ -60,16 +61,17 @@ export declare class CodexRemoteDomain {
60
61
  private logHistoryFallback;
61
62
  private assertResultThreadAllowed;
62
63
  private claimTurn;
64
+ private rememberTurnId;
63
65
  private hasSubscriber;
64
66
  private resolveUpstreamApproval;
65
67
  private expireApprovals;
66
68
  private scheduleApprovalExpiry;
67
69
  private requireAppServer;
68
70
  private callUpstream;
69
- private readProjectAuthority;
71
+ private readWorkspaceAuthority;
70
72
  private findKnownThreadInList;
71
73
  private requireCodexWorkspacePath;
72
- private listCodexProjectWorkspacePaths;
74
+ private listCodexWorkspacePaths;
73
75
  }
74
76
  export type CodexDomainFrame = CodexAppFrameData | CodexAppStreamClosedData;
75
77
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../src/codex/domain.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../src/codex/domain.ts"],"names":[],"mappings":"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"}