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 +57 -9
- package/bin/ds-harness-remote.js +11 -0
- package/cordis.patch.yml +22 -0
- package/dist/cli.d.ts +31 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +283 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex/domain.d.ts +4 -2
- package/dist/codex/domain.d.ts.map +1 -1
- package/dist/codex/domain.js +192 -68
- package/dist/codex/domain.js.map +1 -1
- package/dist/codex/method-policy.d.ts +7 -7
- package/dist/codex/virtual-harness.d.ts +3 -0
- package/dist/codex/virtual-harness.d.ts.map +1 -1
- package/dist/codex/virtual-harness.js +89 -20
- package/dist/codex/virtual-harness.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1147 -258
- package/dist/index.js.map +4 -4
- package/dist/server-api.d.ts.map +1 -1
- package/dist/server-api.js +15 -2
- package/dist/server-api.js.map +1 -1
- package/dist/server-credentials.d.ts +2 -2
- package/dist/service.d.ts +4 -1
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +34 -2
- package/dist/service.js.map +1 -1
- package/dist/tui-command.d.ts +13 -0
- package/dist/tui-command.d.ts.map +1 -0
- package/dist/tui-command.js +378 -0
- package/dist/tui-command.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dsh-plugin.json +41 -0
- package/package.json +6 -1
- package/public.d.ts +1 -0
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
|
|
124
|
-
|
|
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
|
-
|
|
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
|
-
|
|
196
|
+
Add the package to the `web` profile through DSH's plugin manager:
|
|
151
197
|
|
|
152
|
-
通过
|
|
198
|
+
通过 DSH 插件管理命令将包加入 `web` profile:
|
|
153
199
|
|
|
154
200
|
```sh
|
|
155
|
-
dsh plugin --profile web add ds-harness-remote@0.4.
|
|
201
|
+
dsh plugin --profile web add ds-harness-remote@0.4.4
|
|
156
202
|
```
|
|
157
203
|
|
|
158
|
-
|
|
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.
|
|
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.
|
|
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>
|
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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/codex/domain.d.ts
CHANGED
|
@@ -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
|
|
71
|
+
private readWorkspaceAuthority;
|
|
70
72
|
private findKnownThreadInList;
|
|
71
73
|
private requireCodexWorkspacePath;
|
|
72
|
-
private
|
|
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":"
|
|
1
|
+
{"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../src/codex/domain.ts"],"names":[],"mappings":"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"}
|