@blue-soda/dsh-remote 0.5.6 → 0.5.7
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 +2 -2
- package/cordis.patch.yml +30 -30
- package/dist/client.github.js +1 -1
- package/dist/client.js +1 -1
- package/dist/index.js +321 -57
- package/dist/index.js.map +3 -3
- package/dsh-plugin.json +41 -41
- package/package.json +165 -165
- package/dist/acp.d.ts +0 -75
- package/dist/acp.d.ts.map +0 -1
- package/dist/acp.js +0 -61
- package/dist/acp.js.map +0 -1
- package/dist/api-proxy-switch.d.ts +0 -33
- package/dist/api-proxy-switch.d.ts.map +0 -1
- package/dist/api-proxy-switch.js +0 -109
- package/dist/api-proxy-switch.js.map +0 -1
- package/dist/atomic-file.d.ts +0 -16
- package/dist/atomic-file.d.ts.map +0 -1
- package/dist/atomic-file.js +0 -81
- package/dist/atomic-file.js.map +0 -1
- package/dist/bin/doctor.d.ts +0 -3
- package/dist/bin/doctor.d.ts.map +0 -1
- package/dist/bin/doctor.js +0 -13
- package/dist/bin/doctor.js.map +0 -1
- package/dist/cli.d.ts +0 -32
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -289
- package/dist/cli.js.map +0 -1
- package/dist/client-runtime.d.ts +0 -375
- package/dist/client-runtime.d.ts.map +0 -1
- package/dist/client-runtime.js +0 -1768
- package/dist/client-runtime.js.map +0 -1
- package/dist/client-secure-transport.d.ts +0 -23
- package/dist/client-secure-transport.d.ts.map +0 -1
- package/dist/client-secure-transport.js +0 -144
- package/dist/client-secure-transport.js.map +0 -1
- package/dist/client-target-store.d.ts +0 -40
- package/dist/client-target-store.d.ts.map +0 -1
- package/dist/client-target-store.js +0 -79
- package/dist/client-target-store.js.map +0 -1
- package/dist/client.d.ts +0 -13
- package/dist/client.d.ts.map +0 -1
- package/dist/codex/app-server.d.ts +0 -71
- package/dist/codex/app-server.d.ts.map +0 -1
- package/dist/codex/app-server.js +0 -268
- package/dist/codex/app-server.js.map +0 -1
- package/dist/codex/codex-image-codec.d.ts +0 -7
- package/dist/codex/codex-image-codec.d.ts.map +0 -1
- package/dist/codex/codex-image-codec.js +0 -288
- package/dist/codex/codex-image-codec.js.map +0 -1
- package/dist/codex/domain.d.ts +0 -102
- package/dist/codex/domain.d.ts.map +0 -1
- package/dist/codex/domain.js +0 -1323
- package/dist/codex/domain.js.map +0 -1
- package/dist/codex/method-policy.d.ts +0 -338
- package/dist/codex/method-policy.d.ts.map +0 -1
- package/dist/codex/method-policy.js +0 -141
- package/dist/codex/method-policy.js.map +0 -1
- package/dist/codex/peer-bridge.d.ts +0 -57
- package/dist/codex/peer-bridge.d.ts.map +0 -1
- package/dist/codex/peer-bridge.js +0 -299
- package/dist/codex/peer-bridge.js.map +0 -1
- package/dist/codex/permissions.d.ts +0 -4
- package/dist/codex/permissions.d.ts.map +0 -1
- package/dist/codex/permissions.js +0 -21
- package/dist/codex/permissions.js.map +0 -1
- package/dist/codex/session-id.d.ts +0 -10
- package/dist/codex/session-id.d.ts.map +0 -1
- package/dist/codex/session-id.js +0 -15
- package/dist/codex/session-id.js.map +0 -1
- package/dist/codex/virtual-harness.d.ts +0 -209
- package/dist/codex/virtual-harness.d.ts.map +0 -1
- package/dist/codex/virtual-harness.js +0 -2650
- package/dist/codex/virtual-harness.js.map +0 -1
- package/dist/codex-workspace-bridge.d.ts +0 -108
- package/dist/codex-workspace-bridge.d.ts.map +0 -1
- package/dist/codex-workspace-bridge.js +0 -502
- package/dist/codex-workspace-bridge.js.map +0 -1
- package/dist/config.d.ts +0 -99
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -127
- package/dist/config.js.map +0 -1
- package/dist/connection-controller.d.ts +0 -44
- package/dist/connection-controller.d.ts.map +0 -1
- package/dist/connection-controller.js +0 -185
- package/dist/connection-controller.js.map +0 -1
- package/dist/control-route.d.ts +0 -34
- package/dist/control-route.d.ts.map +0 -1
- package/dist/control-route.js +0 -136
- package/dist/control-route.js.map +0 -1
- package/dist/control-runtime.d.ts +0 -138
- package/dist/control-runtime.d.ts.map +0 -1
- package/dist/control-runtime.js +0 -543
- package/dist/control-runtime.js.map +0 -1
- package/dist/control-stream.d.ts +0 -67
- package/dist/control-stream.d.ts.map +0 -1
- package/dist/control-stream.js +0 -179
- package/dist/control-stream.js.map +0 -1
- package/dist/defaults.d.ts +0 -9
- package/dist/defaults.d.ts.map +0 -1
- package/dist/defaults.js +0 -9
- package/dist/defaults.js.map +0 -1
- package/dist/file-viewer-bridge.d.ts +0 -30
- package/dist/file-viewer-bridge.d.ts.map +0 -1
- package/dist/file-viewer-bridge.js +0 -128
- package/dist/file-viewer-bridge.js.map +0 -1
- package/dist/file-viewer-contract.d.ts +0 -5
- package/dist/file-viewer-contract.d.ts.map +0 -1
- package/dist/file-viewer-contract.js +0 -4
- package/dist/file-viewer-contract.js.map +0 -1
- package/dist/harness-api-bridge.d.ts +0 -81
- package/dist/harness-api-bridge.d.ts.map +0 -1
- package/dist/harness-api-bridge.js +0 -862
- package/dist/harness-api-bridge.js.map +0 -1
- package/dist/harness-api-history.d.ts +0 -3
- package/dist/harness-api-history.d.ts.map +0 -1
- package/dist/harness-api-history.js +0 -59
- package/dist/harness-api-history.js.map +0 -1
- package/dist/harness-remote-bridge.d.ts +0 -60
- package/dist/harness-remote-bridge.d.ts.map +0 -1
- package/dist/harness-remote-bridge.js +0 -540
- package/dist/harness-remote-bridge.js.map +0 -1
- package/dist/harness-version.d.ts +0 -23
- package/dist/harness-version.d.ts.map +0 -1
- package/dist/harness-version.js +0 -95
- package/dist/harness-version.js.map +0 -1
- package/dist/identity-store.d.ts +0 -45
- package/dist/identity-store.d.ts.map +0 -1
- package/dist/identity-store.js +0 -186
- package/dist/identity-store.js.map +0 -1
- package/dist/ids.d.ts +0 -2
- package/dist/ids.d.ts.map +0 -1
- package/dist/ids.js +0 -17
- package/dist/ids.js.map +0 -1
- package/dist/index.d.ts +0 -78
- package/dist/index.d.ts.map +0 -1
- package/dist/logging.d.ts +0 -18
- package/dist/logging.d.ts.map +0 -1
- package/dist/logging.js +0 -30
- package/dist/logging.js.map +0 -1
- package/dist/loopback-host.d.ts +0 -20
- package/dist/loopback-host.d.ts.map +0 -1
- package/dist/loopback-host.js +0 -245
- package/dist/loopback-host.js.map +0 -1
- package/dist/loopback-preview.d.ts +0 -19
- package/dist/loopback-preview.d.ts.map +0 -1
- package/dist/loopback-preview.js +0 -232
- package/dist/loopback-preview.js.map +0 -1
- package/dist/native-rtc-helper.d.ts +0 -14
- package/dist/native-rtc-helper.d.ts.map +0 -1
- package/dist/native-rtc-helper.js +0 -575
- package/dist/native-rtc-helper.js.map +0 -1
- package/dist/remote-api-proxy.d.ts +0 -17
- package/dist/remote-api-proxy.d.ts.map +0 -1
- package/dist/remote-api-proxy.js +0 -451
- package/dist/remote-api-proxy.js.map +0 -1
- package/dist/remote-directory-browser.d.ts +0 -16
- package/dist/remote-directory-browser.d.ts.map +0 -1
- package/dist/remote-directory-browser.js +0 -48
- package/dist/remote-directory-browser.js.map +0 -1
- package/dist/remote-file-content-provider.d.ts +0 -48
- package/dist/remote-file-content-provider.d.ts.map +0 -1
- package/dist/remote-file-content-provider.js +0 -93
- package/dist/remote-file-content-provider.js.map +0 -1
- package/dist/remote-typert-gateway.d.ts +0 -20
- package/dist/remote-typert-gateway.d.ts.map +0 -1
- package/dist/remote-typert-gateway.js +0 -334
- package/dist/remote-typert-gateway.js.map +0 -1
- package/dist/rpc-binary-attachments.d.ts +0 -33
- package/dist/rpc-binary-attachments.d.ts.map +0 -1
- package/dist/rpc-binary-attachments.js +0 -142
- package/dist/rpc-binary-attachments.js.map +0 -1
- package/dist/rpc-router.d.ts +0 -31
- package/dist/rpc-router.d.ts.map +0 -1
- package/dist/rpc-router.js +0 -201
- package/dist/rpc-router.js.map +0 -1
- package/dist/safe-error.d.ts +0 -8
- package/dist/safe-error.d.ts.map +0 -1
- package/dist/safe-error.js +0 -20
- package/dist/safe-error.js.map +0 -1
- package/dist/server-api.d.ts +0 -109
- package/dist/server-api.d.ts.map +0 -1
- package/dist/server-api.js +0 -520
- package/dist/server-api.js.map +0 -1
- package/dist/server-connection.d.ts +0 -79
- package/dist/server-connection.d.ts.map +0 -1
- package/dist/server-connection.js +0 -1023
- package/dist/server-connection.js.map +0 -1
- package/dist/server-credentials.d.ts +0 -55
- package/dist/server-credentials.d.ts.map +0 -1
- package/dist/server-credentials.js +0 -108
- package/dist/server-credentials.js.map +0 -1
- package/dist/service.d.ts +0 -151
- package/dist/service.d.ts.map +0 -1
- package/dist/service.js +0 -448
- package/dist/service.js.map +0 -1
- package/dist/session-format-compat.d.ts +0 -3
- package/dist/session-format-compat.d.ts.map +0 -1
- package/dist/session-format-compat.js +0 -183
- package/dist/session-format-compat.js.map +0 -1
- package/dist/status-stream.d.ts +0 -48
- package/dist/status-stream.d.ts.map +0 -1
- package/dist/status-stream.js +0 -133
- package/dist/status-stream.js.map +0 -1
- package/dist/terminal-policy.d.ts +0 -21
- package/dist/terminal-policy.d.ts.map +0 -1
- package/dist/terminal-policy.js +0 -68
- package/dist/terminal-policy.js.map +0 -1
- package/dist/tui-command.d.ts +0 -13
- package/dist/tui-command.d.ts.map +0 -1
- package/dist/tui-command.js +0 -392
- package/dist/tui-command.js.map +0 -1
- package/dist/typert-gateway-contract.d.ts +0 -59
- package/dist/typert-gateway-contract.d.ts.map +0 -1
- package/dist/typert-gateway-contract.js +0 -2
- package/dist/typert-gateway-contract.js.map +0 -1
- package/dist/typert-gateway-switch.d.ts +0 -85
- package/dist/typert-gateway-switch.d.ts.map +0 -1
- package/dist/typert-gateway-switch.js +0 -448
- package/dist/typert-gateway-switch.js.map +0 -1
- package/dist/types.d.ts +0 -20
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/version.d.ts +0 -12
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js +0 -12
- package/dist/version.js.map +0 -1
- package/dist/werift-rtc.d.ts +0 -121
- package/dist/werift-rtc.d.ts.map +0 -1
- package/dist/werift-rtc.js +0 -490
- package/dist/werift-rtc.js.map +0 -1
package/dist/api-proxy-switch.js
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
const SWITCHED_DOMAINS = [
|
|
2
|
-
'sessions',
|
|
3
|
-
'subagents',
|
|
4
|
-
'host',
|
|
5
|
-
'workspace',
|
|
6
|
-
'skills',
|
|
7
|
-
'agentPresets',
|
|
8
|
-
'events',
|
|
9
|
-
'goals',
|
|
10
|
-
'llm',
|
|
11
|
-
'settings',
|
|
12
|
-
'credentials',
|
|
13
|
-
];
|
|
14
|
-
/**
|
|
15
|
-
* Installs stable forwarding objects into the official ApiProxy instance.
|
|
16
|
-
* Existing HTTP/WebSocket carriers retain the same service identity while new
|
|
17
|
-
* requests resolve against the currently selected local or remote target.
|
|
18
|
-
*/
|
|
19
|
-
export class ApiProxySwitch {
|
|
20
|
-
remote;
|
|
21
|
-
target;
|
|
22
|
-
mode = 'local';
|
|
23
|
-
installed = false;
|
|
24
|
-
local;
|
|
25
|
-
originals;
|
|
26
|
-
localRespond;
|
|
27
|
-
constructor(local) {
|
|
28
|
-
this.local = local;
|
|
29
|
-
this.originals = new Map(SWITCHED_DOMAINS.map(domain => [domain, local[domain]]));
|
|
30
|
-
this.localRespond = local.respond.bind(local);
|
|
31
|
-
}
|
|
32
|
-
install() {
|
|
33
|
-
if (this.installed)
|
|
34
|
-
return;
|
|
35
|
-
for (const domain of SWITCHED_DOMAINS) {
|
|
36
|
-
const localDomain = this.local[domain];
|
|
37
|
-
const forwarder = new Proxy({}, {
|
|
38
|
-
get: (_target, key) => {
|
|
39
|
-
const selected = this.selected(domain);
|
|
40
|
-
const value = selected[key];
|
|
41
|
-
return typeof value === 'function' ? value.bind(selected) : value;
|
|
42
|
-
},
|
|
43
|
-
});
|
|
44
|
-
Object.defineProperty(this.local, domain, {
|
|
45
|
-
configurable: true,
|
|
46
|
-
enumerable: true,
|
|
47
|
-
writable: true,
|
|
48
|
-
value: forwarder,
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
Object.defineProperty(this.local, 'respond', {
|
|
52
|
-
configurable: true,
|
|
53
|
-
enumerable: true,
|
|
54
|
-
writable: true,
|
|
55
|
-
value: (...args) => this.mode === 'remote'
|
|
56
|
-
? this.requireRemote().respond(...args)
|
|
57
|
-
: this.localRespond(...args),
|
|
58
|
-
});
|
|
59
|
-
this.installed = true;
|
|
60
|
-
}
|
|
61
|
-
selectRemote(api, target) {
|
|
62
|
-
if (!this.installed)
|
|
63
|
-
throw new Error('The Harness API switch is not installed.');
|
|
64
|
-
this.remote = api;
|
|
65
|
-
this.target = { ...target };
|
|
66
|
-
this.mode = 'remote';
|
|
67
|
-
}
|
|
68
|
-
selectLocal() {
|
|
69
|
-
this.mode = 'local';
|
|
70
|
-
this.remote = undefined;
|
|
71
|
-
this.target = undefined;
|
|
72
|
-
}
|
|
73
|
-
status() {
|
|
74
|
-
return { mode: this.mode, ...(this.target === undefined ? {} : { target: { ...this.target } }) };
|
|
75
|
-
}
|
|
76
|
-
restore() {
|
|
77
|
-
if (!this.installed)
|
|
78
|
-
return;
|
|
79
|
-
this.selectLocal();
|
|
80
|
-
for (const [domain, value] of this.originals)
|
|
81
|
-
Object.defineProperty(this.local, domain, {
|
|
82
|
-
configurable: true,
|
|
83
|
-
enumerable: true,
|
|
84
|
-
writable: true,
|
|
85
|
-
value,
|
|
86
|
-
});
|
|
87
|
-
Object.defineProperty(this.local, 'respond', {
|
|
88
|
-
configurable: true,
|
|
89
|
-
enumerable: true,
|
|
90
|
-
writable: true,
|
|
91
|
-
value: this.localRespond,
|
|
92
|
-
});
|
|
93
|
-
this.installed = false;
|
|
94
|
-
}
|
|
95
|
-
selected(domain) {
|
|
96
|
-
if (this.mode === 'local')
|
|
97
|
-
return this.originalDomain(domain);
|
|
98
|
-
return this.requireRemote()[domain];
|
|
99
|
-
}
|
|
100
|
-
originalDomain(domain) {
|
|
101
|
-
return this.originals.get(domain);
|
|
102
|
-
}
|
|
103
|
-
requireRemote() {
|
|
104
|
-
if (this.remote === undefined)
|
|
105
|
-
throw new Error('No remote Harness target is selected.');
|
|
106
|
-
return this.remote;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=api-proxy-switch.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api-proxy-switch.js","sourceRoot":"","sources":["../src/api-proxy-switch.ts"],"names":[],"mappings":"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"}
|
package/dist/atomic-file.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export interface ReplaceFileOptions {
|
|
2
|
-
/** Delay before each retry. Fewer entries than failures means the last error is thrown. */
|
|
3
|
-
delaysMs?: readonly number[];
|
|
4
|
-
}
|
|
5
|
-
export interface SweepOptions {
|
|
6
|
-
maxAgeMs?: number;
|
|
7
|
-
}
|
|
8
|
-
/** Replace `target` with `temporary`, retrying the transient Windows failures. */
|
|
9
|
-
export declare function replaceFile(temporary: string, target: string, options?: ReplaceFileOptions): Promise<void>;
|
|
10
|
-
/**
|
|
11
|
-
* Remove abandoned `*.tmp` files a crashed write left beside the state files, and return
|
|
12
|
-
* the paths removed. Only names this module produces are considered, and only once they
|
|
13
|
-
* are old enough that no live writer can own them, so a concurrent write is never deleted.
|
|
14
|
-
*/
|
|
15
|
-
export declare function sweepStaleTemporaries(directory: string, options?: SweepOptions): Promise<string[]>;
|
|
16
|
-
//# sourceMappingURL=atomic-file.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"atomic-file.d.ts","sourceRoot":"","sources":["../src/atomic-file.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,kBAAkB;IACjC,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,kFAAkF;AAClF,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsB5G"}
|
package/dist/atomic-file.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { readdir, rename, rm, stat } from 'node:fs/promises';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
/**
|
|
4
|
-
* Atomic replacement of a state file, with the retry Windows needs.
|
|
5
|
-
*
|
|
6
|
-
* On Windows `rename` is `MoveFileEx(..., MOVEFILE_REPLACE_EXISTING)`, which fails with
|
|
7
|
-
* `EPERM` while another handle holds the *destination* without `FILE_SHARE_DELETE`. The
|
|
8
|
-
* holders are short-lived and outside this process: antivirus and indexer scans, Explorer
|
|
9
|
-
* previews, backup or sync agents, and a second process writing the same state directory.
|
|
10
|
-
* Node always opens with `FILE_SHARE_DELETE` itself, so this process cannot cause it, and
|
|
11
|
-
* the failure disappears on the next attempt - which is why `EPERM` here means "retry",
|
|
12
|
-
* not "permission denied", and why exclusions or packaging changes do not fix it.
|
|
13
|
-
*
|
|
14
|
-
* A retry only hides a second *writer*: two instances sharing one `DSH_HOME` still race on
|
|
15
|
-
* a read-modify-write, so keep parallel Hosts on separate `DSH_HOME` values (see the
|
|
16
|
-
* refresh lock in `server-credentials.ts` for the same rule applied to credentials).
|
|
17
|
-
*/
|
|
18
|
-
const TRANSIENT_REPLACE_CODES = new Set(['EPERM', 'EBUSY', 'EACCES']);
|
|
19
|
-
const REPLACE_RETRY_DELAYS_MS = [20, 40, 80, 160, 320];
|
|
20
|
-
/** `<state file>.<pid>.<uuid v7>.tmp`, the temporary name every caller here creates. */
|
|
21
|
-
const TEMPORARY_NAME = /\.\d+\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.tmp$/iu;
|
|
22
|
-
/** A live write lasts milliseconds, so anything this old was abandoned by a crash. */
|
|
23
|
-
const STALE_TEMPORARY_AGE_MS = 10 * 60 * 1000;
|
|
24
|
-
/** Replace `target` with `temporary`, retrying the transient Windows failures. */
|
|
25
|
-
export async function replaceFile(temporary, target, options = {}) {
|
|
26
|
-
const delays = options.delaysMs ?? REPLACE_RETRY_DELAYS_MS;
|
|
27
|
-
for (let attempt = 0;; attempt += 1) {
|
|
28
|
-
try {
|
|
29
|
-
await rename(temporary, target);
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
catch (error) {
|
|
33
|
-
const delay = delays[attempt];
|
|
34
|
-
if (delay === undefined || !TRANSIENT_REPLACE_CODES.has(errorCode(error) ?? ''))
|
|
35
|
-
throw error;
|
|
36
|
-
await sleep(delay);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Remove abandoned `*.tmp` files a crashed write left beside the state files, and return
|
|
42
|
-
* the paths removed. Only names this module produces are considered, and only once they
|
|
43
|
-
* are old enough that no live writer can own them, so a concurrent write is never deleted.
|
|
44
|
-
*/
|
|
45
|
-
export async function sweepStaleTemporaries(directory, options = {}) {
|
|
46
|
-
const maxAgeMs = options.maxAgeMs ?? STALE_TEMPORARY_AGE_MS;
|
|
47
|
-
const removed = [];
|
|
48
|
-
let entries;
|
|
49
|
-
try {
|
|
50
|
-
entries = await readdir(directory);
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
return removed;
|
|
54
|
-
}
|
|
55
|
-
for (const entry of entries) {
|
|
56
|
-
if (!TEMPORARY_NAME.test(entry))
|
|
57
|
-
continue;
|
|
58
|
-
const path = join(directory, entry);
|
|
59
|
-
try {
|
|
60
|
-
const info = await stat(path);
|
|
61
|
-
if (!info.isFile() || Date.now() - info.mtimeMs < maxAgeMs)
|
|
62
|
-
continue;
|
|
63
|
-
await rm(path, { force: true });
|
|
64
|
-
removed.push(path);
|
|
65
|
-
}
|
|
66
|
-
catch {
|
|
67
|
-
// Best effort: a file another process is removing is already gone.
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return removed;
|
|
71
|
-
}
|
|
72
|
-
function errorCode(error) {
|
|
73
|
-
if (typeof error !== 'object' || error === null || !('code' in error))
|
|
74
|
-
return undefined;
|
|
75
|
-
const code = error.code;
|
|
76
|
-
return typeof code === 'string' ? code : undefined;
|
|
77
|
-
}
|
|
78
|
-
function sleep(ms) {
|
|
79
|
-
return new Promise(resolve => { setTimeout(resolve, ms); });
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=atomic-file.js.map
|
package/dist/atomic-file.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"atomic-file.js","sourceRoot":"","sources":["../src/atomic-file.ts"],"names":[],"mappings":"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"}
|
package/dist/bin/doctor.d.ts
DELETED
package/dist/bin/doctor.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/bin/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEtD,wBAAgB,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAWzD"}
|
package/dist/bin/doctor.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export function doctor(runtime) {
|
|
2
|
-
const state = runtime.diagnostics();
|
|
3
|
-
return [
|
|
4
|
-
'DSH Remote doctor',
|
|
5
|
-
`Plugin: ${state.loaded ? 'loaded' : 'starting'}`,
|
|
6
|
-
`Identity: ${state.identityValid ? `valid (${state.deviceId})` : 'unavailable'}`,
|
|
7
|
-
`Server: ${state.serverConfigured ? state.serverOnline ? 'online' : 'configured, offline' : 'not configured'}`,
|
|
8
|
-
...(state.serverError === undefined ? [] : [`Server error: ${state.serverError}`]),
|
|
9
|
-
`Peer channel: ${state.online ? 'online' : 'offline'}`,
|
|
10
|
-
`Trusted devices: ${state.trustedPeers}`,
|
|
11
|
-
].join('\n');
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=doctor.js.map
|
package/dist/bin/doctor.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/bin/doctor.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,MAAM,CAAC,OAA0B;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;IACnC,OAAO;QACL,mBAAmB;QACnB,WAAW,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,EAAE;QACjD,aAAa,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE;QAChF,WAAW,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,gBAAgB,EAAE;QAC9G,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,iBAAiB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAClF,iBAAiB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE;QACtD,oBAAoB,KAAK,CAAC,YAAY,EAAE;KACzC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
|
package/dist/cli.d.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { IdentityStore, type HostIdentity, type IdentityStoreOptions } from './identity-store.js';
|
|
2
|
-
import { type DeviceAuthorization, 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
|
-
authorizeHostWithCode(identity: HostIdentity, code: string): Promise<DeviceAuthorization>;
|
|
15
|
-
}
|
|
16
|
-
export interface RemoteCliDependencies {
|
|
17
|
-
env?: NodeJS.ProcessEnv;
|
|
18
|
-
stdout?: CliWriter;
|
|
19
|
-
stderr?: CliWriter;
|
|
20
|
-
now?: () => number;
|
|
21
|
-
wait?: (milliseconds: number) => Promise<void>;
|
|
22
|
-
renderQr?: (url: string) => Promise<string>;
|
|
23
|
-
createIdentityStore?: (options: IdentityStoreOptions) => IdentityStore;
|
|
24
|
-
createHostApi?: (serverUrl: string, store: ServerCredentialStore) => CliHostApi;
|
|
25
|
-
}
|
|
26
|
-
/** TUI-friendly account bootstrap. Configuration remains owned by the DSH profile. */
|
|
27
|
-
export declare function runCli(args?: readonly string[], dependencies?: RemoteCliDependencies): Promise<number>;
|
|
28
|
-
export declare function renderTerminalQr(url: string): Promise<string>;
|
|
29
|
-
/** Square terminal modules at half the row count for fullscreen TUI scenes. */
|
|
30
|
-
export declare function renderCompactTerminalQr(url: string): Promise<string>;
|
|
31
|
-
export {};
|
|
32
|
-
//# sourceMappingURL=cli.d.ts.map
|
package/dist/cli.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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,EAML,KAAK,mBAAmB,EACxB,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;IACpC,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;CAC1F;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,CAkBjB;AA2JD,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
DELETED
|
@@ -1,289 +0,0 @@
|
|
|
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 { ENABLED_QR_PROVIDERS, HostServerApi, ServerApiError, isEnabledQrProvider, oauthProviderName, } 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 === 'register')
|
|
18
|
-
return await register(rest, runtime);
|
|
19
|
-
if (command === 'status')
|
|
20
|
-
return await status(rest, runtime);
|
|
21
|
-
if (command === 'logout')
|
|
22
|
-
return await logout(rest, runtime);
|
|
23
|
-
if (command === 'help' || command === '--help' || command === '-h' || command === undefined) {
|
|
24
|
-
write(runtime.stdout, helpText());
|
|
25
|
-
return 0;
|
|
26
|
-
}
|
|
27
|
-
throw new CliUsageError(`Unknown command: ${command}`);
|
|
28
|
-
}
|
|
29
|
-
catch (error) {
|
|
30
|
-
write(runtime.stderr, `${cliErrorMessage(error)}\n`);
|
|
31
|
-
if (error instanceof CliUsageError)
|
|
32
|
-
write(runtime.stderr, `\n${helpText()}`);
|
|
33
|
-
return error instanceof CliUsageError ? 2 : 1;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
async function register(args, runtime) {
|
|
37
|
-
if (args.length !== 1 || args[0] === undefined || args[0].trim() === '') {
|
|
38
|
-
throw new CliUsageError('Usage: ds-harness-remote register <server-token>');
|
|
39
|
-
}
|
|
40
|
-
const context = await hostContext(runtime);
|
|
41
|
-
await context.api.authorizeHostWithCode(context.identity, args[0]);
|
|
42
|
-
write(runtime.stdout, 'Remote Host registration complete. Restart dsh-tui to bring the Remote Host online.\n');
|
|
43
|
-
return 0;
|
|
44
|
-
}
|
|
45
|
-
async function login(args, runtime) {
|
|
46
|
-
const usage = `Usage: ds-harness-remote login [${ENABLED_QR_PROVIDERS.join('|')}]`;
|
|
47
|
-
if (args.length > 1)
|
|
48
|
-
throw new CliUsageError(usage);
|
|
49
|
-
const provider = args[0] ?? ENABLED_QR_PROVIDERS[0] ?? 'wechat';
|
|
50
|
-
if (!isEnabledQrProvider(provider)) {
|
|
51
|
-
throw new CliUsageError(`Login provider must be one of: ${ENABLED_QR_PROVIDERS.join(', ')}.`);
|
|
52
|
-
}
|
|
53
|
-
const context = await hostContext(runtime);
|
|
54
|
-
const session = await context.api.startOAuthQrLogin(provider);
|
|
55
|
-
const qr = await runtime.renderQr(session.scanUrl);
|
|
56
|
-
const providerName = oauthProviderName(provider);
|
|
57
|
-
write(runtime.stdout, `Using ${providerName} QR login. ${alternativeProviderHint(provider)}\n`);
|
|
58
|
-
write(runtime.stdout, 'Scan this QR code to authorize this Host:\n\n');
|
|
59
|
-
write(runtime.stdout, `${qr.trimEnd()}\n`);
|
|
60
|
-
write(runtime.stdout, `Authorization URL: ${terminalLink(session.scanUrl, runtime.stdout)}\n\nWaiting for authorization...\n`);
|
|
61
|
-
const deadline = runtime.now() + session.expiresIn * 1_000;
|
|
62
|
-
let identity = context.identity;
|
|
63
|
-
while (runtime.now() < deadline) {
|
|
64
|
-
let result;
|
|
65
|
-
try {
|
|
66
|
-
result = await context.api.pollOAuthQrLogin(identity, session.qrId, async () => {
|
|
67
|
-
identity = await context.identities.reset(context.deviceName);
|
|
68
|
-
return identity;
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
if (!(error instanceof ServerApiError) || !error.retryable)
|
|
73
|
-
throw error;
|
|
74
|
-
await runtime.wait(Math.min(QR_POLL_INTERVAL_MS, Math.max(1, deadline - runtime.now())));
|
|
75
|
-
continue;
|
|
76
|
-
}
|
|
77
|
-
if (result.status === 'complete') {
|
|
78
|
-
write(runtime.stdout, `${authorizedMessage(result.authorization)} Restart dsh-tui to bring the Remote Host online.\n`);
|
|
79
|
-
return 0;
|
|
80
|
-
}
|
|
81
|
-
if (result.status === 'expired')
|
|
82
|
-
break;
|
|
83
|
-
await runtime.wait(Math.min(QR_POLL_INTERVAL_MS, Math.max(1, deadline - runtime.now())));
|
|
84
|
-
}
|
|
85
|
-
write(runtime.stderr, 'The QR login expired. Run the login command again to generate a new code.\n');
|
|
86
|
-
return 1;
|
|
87
|
-
}
|
|
88
|
-
async function status(args, runtime) {
|
|
89
|
-
if (args.length !== 0)
|
|
90
|
-
throw new CliUsageError('Usage: ds-harness-remote status');
|
|
91
|
-
const serverUrl = selectedServer();
|
|
92
|
-
const root = new IdentityStore({ env: runtime.env }).directory;
|
|
93
|
-
const directory = serverStorageDirectory(root, serverUrl, 'host');
|
|
94
|
-
const lines = [
|
|
95
|
-
'Remote Host status',
|
|
96
|
-
`Server: ${serverUrl}`,
|
|
97
|
-
'Host control: enabled (dsh-TUI default)',
|
|
98
|
-
];
|
|
99
|
-
if (!await exists(join(directory, 'device.json'))) {
|
|
100
|
-
lines.push('Device: not initialized', 'Authorization: logged out', 'Credential: unavailable');
|
|
101
|
-
write(runtime.stdout, `${lines.join('\n')}\n\nRun "ds-harness-remote login" or use "/remote login" in dsh-TUI.\n`);
|
|
102
|
-
return 0;
|
|
103
|
-
}
|
|
104
|
-
const identities = runtime.createIdentityStore({ directory, env: runtime.env });
|
|
105
|
-
const identity = await identities.loadOrCreate(hostname());
|
|
106
|
-
const store = new ServerCredentialStore(directory);
|
|
107
|
-
const stored = await store.load(serverUrl, identity.deviceId);
|
|
108
|
-
lines.push(`Device: ${identity.name} (${identity.deviceId})`);
|
|
109
|
-
if (stored === undefined) {
|
|
110
|
-
lines.push('Authorization: logged out', 'Credential: unavailable');
|
|
111
|
-
write(runtime.stdout, `${lines.join('\n')}\n\nRun "ds-harness-remote login" or use "/remote login" in dsh-TUI.\n`);
|
|
112
|
-
return 0;
|
|
113
|
-
}
|
|
114
|
-
lines.push(`Authorization: logged in (${authorizationLabel(stored.authorizationMethod)})`);
|
|
115
|
-
if (stored.account !== undefined)
|
|
116
|
-
lines.push(`Account: ${stored.account}`);
|
|
117
|
-
const api = runtime.createHostApi(serverUrl, store);
|
|
118
|
-
api.bindIdentity(identity);
|
|
119
|
-
try {
|
|
120
|
-
await api.authenticate(identity);
|
|
121
|
-
lines.push('Credential: ready');
|
|
122
|
-
lines.push('Presence: published while dsh-tui is running');
|
|
123
|
-
write(runtime.stdout, `${lines.join('\n')}\n`);
|
|
124
|
-
return 0;
|
|
125
|
-
}
|
|
126
|
-
catch (error) {
|
|
127
|
-
lines.push(`Credential: unavailable (${statusErrorCode(error)})`);
|
|
128
|
-
write(runtime.stdout, `${lines.join('\n')}\n`);
|
|
129
|
-
return 1;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
async function logout(args, runtime) {
|
|
133
|
-
if (args.length !== 0)
|
|
134
|
-
throw new CliUsageError('Usage: ds-harness-remote logout');
|
|
135
|
-
const serverUrl = selectedServer();
|
|
136
|
-
const root = new IdentityStore({ env: runtime.env }).directory;
|
|
137
|
-
const directory = serverStorageDirectory(root, serverUrl, 'host');
|
|
138
|
-
if (!await exists(join(directory, 'device.json'))) {
|
|
139
|
-
await new ServerCredentialStore(directory).clear();
|
|
140
|
-
write(runtime.stdout, 'This Host is already logged out.\n');
|
|
141
|
-
return 0;
|
|
142
|
-
}
|
|
143
|
-
const deviceName = hostname();
|
|
144
|
-
const identities = runtime.createIdentityStore({ directory, env: runtime.env });
|
|
145
|
-
await identities.loadOrCreate(deviceName);
|
|
146
|
-
// Clear the credentials and keep the device identity. Revoking and rotating
|
|
147
|
-
// would register a second device for this installation on the next login, and
|
|
148
|
-
// an account holds at most 256 devices. Signing in again reuses this device and
|
|
149
|
-
// the Server invalidates the previous tokens at that point.
|
|
150
|
-
await new ServerCredentialStore(directory).clear();
|
|
151
|
-
write(runtime.stdout, 'Remote Host logged out. This device stays registered and is reused on the next login. Restart dsh-tui.\n');
|
|
152
|
-
return 0;
|
|
153
|
-
}
|
|
154
|
-
async function hostContext(runtime) {
|
|
155
|
-
const serverUrl = selectedServer();
|
|
156
|
-
const root = new IdentityStore({ env: runtime.env }).directory;
|
|
157
|
-
const directory = serverStorageDirectory(root, serverUrl, 'host');
|
|
158
|
-
const deviceName = hostname();
|
|
159
|
-
const identities = runtime.createIdentityStore({ directory, env: runtime.env });
|
|
160
|
-
const identity = await identities.loadOrCreate(deviceName);
|
|
161
|
-
const api = runtime.createHostApi(serverUrl, new ServerCredentialStore(directory));
|
|
162
|
-
return { api, identities, identity, deviceName };
|
|
163
|
-
}
|
|
164
|
-
function selectedServer() {
|
|
165
|
-
return normalizeServerUrl(DEFAULT_REMOTE_SERVER_URL);
|
|
166
|
-
}
|
|
167
|
-
function resolveDependencies(input) {
|
|
168
|
-
return {
|
|
169
|
-
env: input.env ?? process.env,
|
|
170
|
-
stdout: input.stdout ?? process.stdout,
|
|
171
|
-
stderr: input.stderr ?? process.stderr,
|
|
172
|
-
now: input.now ?? Date.now,
|
|
173
|
-
wait: input.wait ?? (milliseconds => new Promise(resolve => setTimeout(resolve, milliseconds))),
|
|
174
|
-
renderQr: input.renderQr ?? renderTerminalQr,
|
|
175
|
-
createIdentityStore: input.createIdentityStore ?? (options => new IdentityStore(options)),
|
|
176
|
-
createHostApi: input.createHostApi ?? ((serverUrl, store) => new HostServerApi(serverUrl, store)),
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
export async function renderTerminalQr(url) {
|
|
180
|
-
// Keep the terminal-only renderer off the Host plugin startup path. The
|
|
181
|
-
// built-in compact renderer has only a one-module quiet zone and relies on
|
|
182
|
-
// half-height glyphs, which is difficult for phone cameras to recognize in
|
|
183
|
-
// some terminal profiles. Render square modules with an explicit standard
|
|
184
|
-
// four-module quiet zone instead.
|
|
185
|
-
const { default: QRCode } = await import('qrcode');
|
|
186
|
-
const modules = QRCode.create(url, { errorCorrectionLevel: 'M' }).modules;
|
|
187
|
-
const width = modules.size + TERMINAL_QR_MARGIN * 2;
|
|
188
|
-
const quietLine = `\u001B[47m${' '.repeat(width * 2)}\u001B[0m`;
|
|
189
|
-
const lines = Array.from({ length: TERMINAL_QR_MARGIN }, () => quietLine);
|
|
190
|
-
for (let row = 0; row < modules.size; row += 1) {
|
|
191
|
-
let line = `\u001B[47m${' '.repeat(TERMINAL_QR_MARGIN * 2)}`;
|
|
192
|
-
for (let column = 0; column < modules.size; column += 1) {
|
|
193
|
-
line += modules.get(row, column) === 1 ? '\u001B[40m ' : '\u001B[47m ';
|
|
194
|
-
}
|
|
195
|
-
line += `\u001B[47m${' '.repeat(TERMINAL_QR_MARGIN * 2)}\u001B[0m`;
|
|
196
|
-
lines.push(line);
|
|
197
|
-
}
|
|
198
|
-
lines.push(...Array.from({ length: TERMINAL_QR_MARGIN }, () => quietLine));
|
|
199
|
-
return lines.join('\n');
|
|
200
|
-
}
|
|
201
|
-
/** Square terminal modules at half the row count for fullscreen TUI scenes. */
|
|
202
|
-
export async function renderCompactTerminalQr(url) {
|
|
203
|
-
const { default: QRCode } = await import('qrcode');
|
|
204
|
-
const modules = QRCode.create(url, { errorCorrectionLevel: 'M' }).modules;
|
|
205
|
-
const size = modules.size + TERMINAL_QR_MARGIN * 2;
|
|
206
|
-
const lines = [];
|
|
207
|
-
const isBlack = (row, column) => {
|
|
208
|
-
const qrRow = row - TERMINAL_QR_MARGIN;
|
|
209
|
-
const qrColumn = column - TERMINAL_QR_MARGIN;
|
|
210
|
-
return qrRow >= 0 && qrRow < modules.size
|
|
211
|
-
&& qrColumn >= 0 && qrColumn < modules.size
|
|
212
|
-
&& modules.get(qrRow, qrColumn) === 1;
|
|
213
|
-
};
|
|
214
|
-
for (let row = 0; row < size; row += 2) {
|
|
215
|
-
let line = '\u001B[30;47m';
|
|
216
|
-
for (let column = 0; column < size; column += 1) {
|
|
217
|
-
const top = isBlack(row, column);
|
|
218
|
-
const bottom = isBlack(row + 1, column);
|
|
219
|
-
line += top ? bottom ? '█' : '▀' : bottom ? '▄' : ' ';
|
|
220
|
-
}
|
|
221
|
-
lines.push(`${line}\u001B[0m`);
|
|
222
|
-
}
|
|
223
|
-
return lines.join('\n');
|
|
224
|
-
}
|
|
225
|
-
function authorizedMessage(authorization) {
|
|
226
|
-
return authorization.account === undefined
|
|
227
|
-
? 'Remote Host login complete.'
|
|
228
|
-
: `Remote Host login complete for ${authorization.account}.`;
|
|
229
|
-
}
|
|
230
|
-
function alternativeProviderHint(provider) {
|
|
231
|
-
const alternatives = ENABLED_QR_PROVIDERS.filter(candidate => candidate !== provider);
|
|
232
|
-
if (alternatives.length === 0)
|
|
233
|
-
return '';
|
|
234
|
-
return `Also supported: ${alternatives.map(candidate => `ds-harness-remote login ${candidate}`).join(', ')}`;
|
|
235
|
-
}
|
|
236
|
-
function authorizationLabel(method) {
|
|
237
|
-
if (method === 'host_registration_code')
|
|
238
|
-
return 'Host registration code';
|
|
239
|
-
if (method === 'owned_device')
|
|
240
|
-
return 'owned device';
|
|
241
|
-
return 'account';
|
|
242
|
-
}
|
|
243
|
-
function statusErrorCode(error) {
|
|
244
|
-
return error instanceof ServerApiError ? error.code : 'CONNECTION_FAILED';
|
|
245
|
-
}
|
|
246
|
-
function cliErrorMessage(error) {
|
|
247
|
-
const message = error instanceof Error ? error.message : 'The Remote command failed.';
|
|
248
|
-
const code = error instanceof Error && 'code' in error && typeof error.code === 'string'
|
|
249
|
-
? error.code
|
|
250
|
-
: undefined;
|
|
251
|
-
return code === undefined ? message : `${message} (${code})`;
|
|
252
|
-
}
|
|
253
|
-
function helpText() {
|
|
254
|
-
return [
|
|
255
|
-
'Usage:',
|
|
256
|
-
' ds-harness-remote login [github|zhihu]',
|
|
257
|
-
' ds-harness-remote register <server-token>',
|
|
258
|
-
' ds-harness-remote status',
|
|
259
|
-
' ds-harness-remote logout',
|
|
260
|
-
'',
|
|
261
|
-
'Inside dsh-TUI, use /remote login, /remote status, or /remote logout.',
|
|
262
|
-
'login defaults to Zhihu and authorizes this computer as a Remote Host with a terminal QR code.',
|
|
263
|
-
`The Server is ${DEFAULT_REMOTE_SERVER_URL}.`,
|
|
264
|
-
'Host configuration is not exposed by this CLI yet. Restart dsh-tui after login or logout.',
|
|
265
|
-
'',
|
|
266
|
-
].join('\n');
|
|
267
|
-
}
|
|
268
|
-
function write(target, value) {
|
|
269
|
-
target.write(value);
|
|
270
|
-
}
|
|
271
|
-
function terminalLink(url, target) {
|
|
272
|
-
if (target.isTTY !== true)
|
|
273
|
-
return url;
|
|
274
|
-
return `\u001B]8;;${url}\u0007${url}\u001B]8;;\u0007`;
|
|
275
|
-
}
|
|
276
|
-
async function exists(path) {
|
|
277
|
-
try {
|
|
278
|
-
await stat(path);
|
|
279
|
-
return true;
|
|
280
|
-
}
|
|
281
|
-
catch (error) {
|
|
282
|
-
if (error instanceof Error && 'code' in error && error.code === 'ENOENT')
|
|
283
|
-
return false;
|
|
284
|
-
throw error;
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
class CliUsageError extends Error {
|
|
288
|
-
}
|
|
289
|
-
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|