@artenx/dshb 0.1.33 → 0.1.35
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/cordis.patch.yml +8 -4
- package/lib/auth/reset-cli.d.ts +15 -0
- package/lib/auth/reset-cli.js +47 -0
- package/lib/auth/reset-cli.js.map +1 -0
- package/lib/client.js +34 -3
- package/lib/client.js.map +1 -1
- package/lib/core/index.js +1 -1
- package/lib/core/routes.d.ts +1 -1
- package/lib/core/sync/coordinator.d.ts +14 -5
- package/lib/core/sync/coordinator.js +83 -18
- package/lib/core/sync/coordinator.js.map +1 -1
- package/lib/core/sync/host-key.d.ts +1 -1
- package/lib/core/sync/internal-routes.d.ts +3 -3
- package/lib/core/sync/internal-routes.js +1 -1
- package/lib/core/sync/model.d.ts +1 -1
- package/lib/core/sync/model.js.map +1 -1
- package/lib/core/sync/node-sync.d.ts +1 -1
- package/lib/core/sync/offline-archive.d.ts +3 -3
- package/lib/core/sync/offline-archive.js +1 -1
- package/lib/core/sync/offline-routes.js +1 -1
- package/lib/core/sync/peer-manager.d.ts +2 -2
- package/lib/core/sync/routes.d.ts +1 -1
- package/lib/core/sync/routes.js +19 -0
- package/lib/core/sync/routes.js.map +1 -1
- package/lib/core/sync/session-journal.d.ts +1 -1
- package/lib/core/sync/session-journal.js +16 -0
- package/lib/core/sync/session-journal.js.map +1 -1
- package/lib/core/sync/session-routes.d.ts +1 -1
- package/lib/core/sync/session-routes.js +1 -1
- package/lib/core/sync/session-sync.d.ts +1 -1
- package/lib/core/sync/session-sync.js +1 -1
- package/lib/core/sync/ssh-transport.d.ts +1 -1
- package/lib/core/sync/ssh-transport.js +29 -2
- package/lib/core/sync/ssh-transport.js.map +1 -1
- package/lib/core/sync/stores.d.ts +1 -1
- package/lib/core/sync/stores.js +1 -1
- package/lib/core/sync/stores.js.map +1 -1
- package/lib/core/workspaces.d.ts +1 -1
- package/lib/{host-key-C5afhAUd.d.ts → host-key-CSnpIrjq.d.ts} +2 -2
- package/lib/{model-BP7Gw1yk.d.ts → model-CKTBf-Pl.d.ts} +2 -2
- package/lib/{node-sync-3Z9QLz2n.d.ts → node-sync-C3Ym-HDu.d.ts} +3 -3
- package/lib/{session-journal-pgPqcWn9.d.ts → session-journal-VE_1tA2-.d.ts} +8 -2
- package/lib/{session-sync-CIqjuWkh.js → session-sync-DLr_BdvN.js} +15 -1
- package/lib/{session-sync-CIqjuWkh.js.map → session-sync-DLr_BdvN.js.map} +1 -1
- package/lib/{session-sync-BuOJvFxK.d.ts → session-sync-DrKShc5c.d.ts} +11 -5
- package/lib/{ssh-transport-C7povM0s.d.ts → ssh-transport-BxPWfu9X.d.ts} +13 -6
- package/lib/{stores-CKyEt0yk.d.ts → stores-puyTC075.d.ts} +2 -2
- package/package.json +6 -4
- package/lib/auth/startup.d.ts +0 -15
- package/lib/auth/startup.js +0 -68
- package/lib/auth/startup.js.map +0 -1
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { o as NodeRegistry } from "./node-registry-BTnnM5-k.js";
|
|
2
2
|
import { r as WorkspaceBindingsStore } from "./workspace-bindings-CsB0TIJB.js";
|
|
3
3
|
import { r as SyncRevision } from "./revision-C9sOlDZ6.js";
|
|
4
|
-
import { d as SyncSessionArchive, i as SyncOrigin, l as SyncRecordMetadata, r as SyncImportMethod } from "./model-
|
|
5
|
-
import { n as SyncStateStore } from "./stores-
|
|
6
|
-
import { s as SyncNodeService } from "./node-sync-
|
|
4
|
+
import { d as SyncSessionArchive, i as SyncOrigin, l as SyncRecordMetadata, r as SyncImportMethod } from "./model-CKTBf-Pl.js";
|
|
5
|
+
import { n as SyncStateStore } from "./stores-puyTC075.js";
|
|
6
|
+
import { s as SyncNodeService } from "./node-sync-C3Ym-HDu.js";
|
|
7
7
|
import { S as BrandedNumber, _ as FileAttachmentRef, a as SystemPromptUpdate, b as TypertResource, c as ToolSchema, d as Message, f as SystemMessage, g as ToolCallId, i as LlmFailure, l as AssistantMessage, m as UserMessage, n as LlmCallConfig, o as TokenUsage, p as ToolResultMessage, r as LlmCallConfigAdapterDefaults, s as ToolHistory, t as AssistantStreamRecord, u as DeveloperMessage, v as ImageAttachmentRef, x as Branded, y as TypertLookup } from "./index-VF8bcBeX.js";
|
|
8
8
|
import { a as SessionInstructionSnapshotStore } from "./workspace-instructions-DirYYiku.js";
|
|
9
|
-
import { t as SyncSessionJournalStore } from "./session-journal-
|
|
9
|
+
import { t as SyncSessionJournalStore } from "./session-journal-VE_1tA2-.js";
|
|
10
10
|
import { Context, Service } from "@deepseek-ai/cordis";
|
|
11
11
|
//#region ../../node_modules/@deepseek-ai/dsh-scope/lib/types/index.d.ts
|
|
12
12
|
declare const ScopedBrand: unique symbol;
|
|
@@ -1314,6 +1314,12 @@ declare class SyncSessionService {
|
|
|
1314
1314
|
applyBundle(value: unknown, sourceName: string, peerId?: string, options?: SyncSessionApplyOptions): Promise<SyncSessionApplyResult>;
|
|
1315
1315
|
preflightBundle(value: unknown, options?: SyncSessionApplyOptions): void;
|
|
1316
1316
|
pendingPeerIds(): string[];
|
|
1317
|
+
/**
|
|
1318
|
+
* 丢弃指定对端的全部未完成 journal 批次(含正在应用中的当前批)。
|
|
1319
|
+
* 手动停止同步时调用:未应用的条目不再落地,重启后也不会回放;
|
|
1320
|
+
* 已应用完成的条目不受影响。
|
|
1321
|
+
*/
|
|
1322
|
+
discardPendingBatches(peerId: string): number;
|
|
1317
1323
|
recoverPending(): Promise<void>;
|
|
1318
1324
|
cleanupOrphanedStaging(): void;
|
|
1319
1325
|
listArchives(): SyncSessionArchive[];
|
|
@@ -1363,4 +1369,4 @@ declare class SyncSessionService {
|
|
|
1363
1369
|
}
|
|
1364
1370
|
//#endregion
|
|
1365
1371
|
export { sessionEventListDigest as C, validateSyncSessionManifest as D, validateSyncSessionBundle as E, planSessionTransfers as S, validateObjectPayload as T, SyncSessionWorkspace as _, SyncSessionBundle as a, makeSyncSessionBundle as b, SyncSessionEventDelta as c, SyncSessionManifest as d, SyncSessionManifestEntry as f, SyncSessionTransferPlan as g, SyncSessionService as h, SyncSessionApplyResult as i, SyncSessionEventPrefix as l, SyncSessionObjectInbox as m, SyncObjectInboxWriter as n, SyncSessionEntry as o, SyncSessionObject as p, SyncSessionApplyOptions as r, SyncSessionError as s, ExportObjectCache as t, SyncSessionInstructionSnapshot as u, WorkspaceRegistryLike as v, syncSessionEntryKey as w, makeSyncSessionManifest as x, estimateJsonBytes as y };
|
|
1366
|
-
//# sourceMappingURL=session-sync-
|
|
1372
|
+
//# sourceMappingURL=session-sync-DrKShc5c.d.ts.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { a as SyncPeer } from "./model-
|
|
2
|
-
import { i as SyncNodeManifest, t as SyncNodeApplyResult } from "./node-sync-
|
|
1
|
+
import { a as SyncPeer } from "./model-CKTBf-Pl.js";
|
|
2
|
+
import { i as SyncNodeManifest, t as SyncNodeApplyResult } from "./node-sync-C3Ym-HDu.js";
|
|
3
3
|
import { SyncPeerManager, SyncPeerSecrets } from "./core/sync/peer-manager.js";
|
|
4
|
-
import { r as SyncHostKeyChallenges, t as SyncHostKeyChallengeError } from "./host-key-
|
|
4
|
+
import { r as SyncHostKeyChallenges, t as SyncHostKeyChallengeError } from "./host-key-CSnpIrjq.js";
|
|
5
5
|
import { d as SyncFrame } from "./protocol-DJ0zyVlB.js";
|
|
6
|
-
import { a as SyncSessionBundle, d as SyncSessionManifest, i as SyncSessionApplyResult, l as SyncSessionEventPrefix, p as SyncSessionObject } from "./session-sync-
|
|
6
|
+
import { a as SyncSessionBundle, d as SyncSessionManifest, i as SyncSessionApplyResult, l as SyncSessionEventPrefix, p as SyncSessionObject } from "./session-sync-DrKShc5c.js";
|
|
7
7
|
import { Client, ClientChannel, ConnectConfig } from "ssh2";
|
|
8
8
|
//#region src/core/sync/ssh-transport.d.ts
|
|
9
9
|
type SyncSshErrorCategory = 'auth' | 'network' | 'hostkey' | 'timeout' | 'helper' | 'protocol';
|
|
@@ -25,6 +25,7 @@ interface SyncRemoteNodeManifest extends SyncNodeManifest {
|
|
|
25
25
|
declare class SyncSshSession {
|
|
26
26
|
private readonly client;
|
|
27
27
|
private readonly channel;
|
|
28
|
+
private readonly onClosed?;
|
|
28
29
|
private readonly decoder;
|
|
29
30
|
private readonly closeSignal;
|
|
30
31
|
private reading;
|
|
@@ -32,7 +33,7 @@ declare class SyncSshSession {
|
|
|
32
33
|
private inputEnded;
|
|
33
34
|
private nextDataSequence;
|
|
34
35
|
private pendingError;
|
|
35
|
-
constructor(client: Client, channel: ClientChannel);
|
|
36
|
+
constructor(client: Client, channel: ClientChannel, onClosed?: (() => void) | undefined);
|
|
36
37
|
sendControl(value: Record<string, unknown>): Promise<void>;
|
|
37
38
|
sendData(sequence: number, data: Buffer): Promise<void>;
|
|
38
39
|
endInput(): void;
|
|
@@ -44,7 +45,13 @@ declare function buildSyncSshConnectConfig(peer: SyncPeer, secrets: SyncPeerSecr
|
|
|
44
45
|
declare class SyncSshTransport {
|
|
45
46
|
private readonly peerManager;
|
|
46
47
|
private readonly hostKeyChallenges;
|
|
48
|
+
/** 每对端当前打开的 SSH 会话:手动停止同步时立即关闭通道,等待中的 readFrames 随即返回。 */
|
|
49
|
+
private readonly openSessions;
|
|
47
50
|
constructor(peerManager: SyncPeerManager);
|
|
51
|
+
private trackSession;
|
|
52
|
+
private untrackSession;
|
|
53
|
+
/** 立即关闭该对端的全部活跃 SSH 会话(幂等;用于手动停止同步)。 */
|
|
54
|
+
stopActiveSessions(peerId: string): number;
|
|
48
55
|
probe(peerId: string): Promise<SyncRemoteHandshake>;
|
|
49
56
|
openSession(peerId: string): Promise<{
|
|
50
57
|
peer: SyncPeer;
|
|
@@ -112,4 +119,4 @@ declare class SyncRemoteProbe {
|
|
|
112
119
|
}
|
|
113
120
|
//#endregion
|
|
114
121
|
export { parseRemoteProbeOutput as _, SyncRemoteProbe as a, SyncRemoteProbeProfile as c, SyncSshErrorCategory as d, SyncSshProbeError as f, buildSyncSshConnectConfig as g, buildRemoteProbeScript as h, SyncRemoteNodeManifest as i, SyncRemoteProbeResult as l, SyncSshTransport as m, REMOTE_PROBE_END_MARKER as n, SyncRemoteProbeDraft as o, SyncSshSession as p, SyncRemoteHandshake as r, SyncRemoteProbeHandshake as s, REMOTE_PROBE_BEGIN_MARKER as t, SyncSessionDeltaPrefixError as u };
|
|
115
|
-
//# sourceMappingURL=ssh-transport-
|
|
122
|
+
//# sourceMappingURL=ssh-transport-BxPWfu9X.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as SyncRevision } from "./revision-C9sOlDZ6.js";
|
|
2
|
-
import { a as SyncPeer, f as SyncState, o as SyncPeerDraft } from "./model-
|
|
2
|
+
import { a as SyncPeer, f as SyncState, o as SyncPeerDraft } from "./model-CKTBf-Pl.js";
|
|
3
3
|
//#region src/core/sync/stores.d.ts
|
|
4
4
|
declare function getOrCreateSyncInstanceId(home?: string): string;
|
|
5
5
|
declare class SyncPeerStore {
|
|
@@ -28,4 +28,4 @@ declare class SyncStateStore {
|
|
|
28
28
|
}
|
|
29
29
|
//#endregion
|
|
30
30
|
export { SyncStateStore as n, getOrCreateSyncInstanceId as r, SyncPeerStore as t };
|
|
31
|
-
//# sourceMappingURL=stores-
|
|
31
|
+
//# sourceMappingURL=stores-puyTC075.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@artenx/dshb",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.35",
|
|
4
4
|
"description": "Routes DSH filesystem, shell, subprocess, and PTY operations to local, SSH, and Docker execution nodes, with a node registry, an authentication gate, a mobile-aware management UI, and per-workspace custom project instructions.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
"exports": {
|
|
9
9
|
".": "./lib/index.js",
|
|
10
10
|
"./auth": "./lib/auth/index.js",
|
|
11
|
-
"./auth/startup": "./lib/auth/startup.js",
|
|
12
11
|
"./auth/decorate-webserver": "./lib/auth/decorate-webserver.js",
|
|
13
12
|
"./auth/loopback": "./lib/auth/loopback.js",
|
|
14
13
|
"./auth/loopback-compat": "./lib/auth/loopback-compat.js",
|
|
@@ -83,8 +82,8 @@
|
|
|
83
82
|
"./package.json": "./package.json"
|
|
84
83
|
},
|
|
85
84
|
"files": [
|
|
86
|
-
"
|
|
87
|
-
"
|
|
85
|
+
"cordis.patch.yml",
|
|
86
|
+
"lib"
|
|
88
87
|
],
|
|
89
88
|
"dsh": {
|
|
90
89
|
"bundle": {
|
|
@@ -180,5 +179,8 @@
|
|
|
180
179
|
"homepage": "https://github.com/Artenx/dsh-honeybee#readme",
|
|
181
180
|
"bugs": {
|
|
182
181
|
"url": "https://github.com/Artenx/dsh-honeybee/issues"
|
|
182
|
+
},
|
|
183
|
+
"bin": {
|
|
184
|
+
"dshb-auth-reset": "./lib/auth/reset-cli.js"
|
|
183
185
|
}
|
|
184
186
|
}
|
package/lib/auth/startup.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Context } from "@deepseek-ai/cordis";
|
|
2
|
-
//#region src/auth/startup.d.ts
|
|
3
|
-
declare const name = "web-startup";
|
|
4
|
-
declare const inject: string[];
|
|
5
|
-
declare const WEB_STARTUP_SERVICE = "webStartup";
|
|
6
|
-
interface WebStartupValues {
|
|
7
|
-
openBrowser: boolean;
|
|
8
|
-
host?: string;
|
|
9
|
-
port?: number;
|
|
10
|
-
trustedHosts: string[];
|
|
11
|
-
}
|
|
12
|
-
declare function apply(ctx: Context): void;
|
|
13
|
-
//#endregion
|
|
14
|
-
export { WEB_STARTUP_SERVICE, WebStartupValues, apply, inject, name };
|
|
15
|
-
//# sourceMappingURL=startup.d.ts.map
|
package/lib/auth/startup.js
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { sanitizeUsername, sharedCredentialStore } from "./credentials.js";
|
|
2
|
-
import { Command } from "commander";
|
|
3
|
-
import { parseCmdline } from "@deepseek-ai/dsh-cmdline";
|
|
4
|
-
//#region src/auth/startup.ts
|
|
5
|
-
const name = "web-startup";
|
|
6
|
-
const inject = ["cmdlineArgs"];
|
|
7
|
-
const WEB_STARTUP_SERVICE = "webStartup";
|
|
8
|
-
function runAuthReset(args) {
|
|
9
|
-
const store = sharedCredentialStore();
|
|
10
|
-
if (!store.isInitialized()) {
|
|
11
|
-
console.error("auth-reset: 尚未初始化管理员账号");
|
|
12
|
-
process.exit(1);
|
|
13
|
-
}
|
|
14
|
-
let password;
|
|
15
|
-
let username;
|
|
16
|
-
for (let i = 1; i < args.length; i++) if (args[i] === "--password") password = args[++i];
|
|
17
|
-
else if (args[i] === "--username") username = args[++i];
|
|
18
|
-
if (password === void 0 && username === void 0) {
|
|
19
|
-
console.error("auth-reset: 需要 --password <新密码> 和/或 --username <新用户名>");
|
|
20
|
-
process.exit(1);
|
|
21
|
-
}
|
|
22
|
-
if (password !== void 0 && password.length < 8) {
|
|
23
|
-
console.error("auth-reset: 密码至少 8 个字符");
|
|
24
|
-
process.exit(1);
|
|
25
|
-
}
|
|
26
|
-
if (username !== void 0) {
|
|
27
|
-
username = sanitizeUsername(username);
|
|
28
|
-
if (!username) {
|
|
29
|
-
console.error("auth-reset: 用户名不能为空");
|
|
30
|
-
process.exit(1);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
if (password !== void 0) store.changePassword(username ?? store.username, password);
|
|
34
|
-
else store.changeUsername(username);
|
|
35
|
-
console.log("auth-reset: 已更新凭据并轮换会话密钥,全部已签发会话作废");
|
|
36
|
-
process.exit(0);
|
|
37
|
-
}
|
|
38
|
-
function webCommand() {
|
|
39
|
-
return new Command().name("dsh --profile web").description("Serve the DeepSeek Harness UI.").helpOption("-h, --help", "show this help").option("--host <host>", "bind host").option("--no-open", "do not open the UI in the default browser").option("--port <port>", "listen port; pass 0 to let the OS pick a free one").option("--trusted-host <authority...>", "extra authority the /api browser-trust fence accepts (host or host:port; repeatable)").addHelpText("after", `
|
|
40
|
-
Examples:
|
|
41
|
-
dsh --profile web serve on the composed host and port
|
|
42
|
-
dsh --profile web --no-open serve without opening a browser (desktop app ignores this)
|
|
43
|
-
dsh --profile web --port 8080 serve on another port
|
|
44
|
-
dsh --profile web --host 0.0.0.0 serve on all interfaces (DSHB: auth plugin guards access)
|
|
45
|
-
dsh --profile web auth-reset --password <新密码> reset admin credentials and revoke all sessions
|
|
46
|
-
`);
|
|
47
|
-
}
|
|
48
|
-
function apply(ctx) {
|
|
49
|
-
const args = ctx.cmdlineArgs?.get() ?? [];
|
|
50
|
-
if (args[0] === "auth-reset") runAuthReset(args);
|
|
51
|
-
const program = webCommand();
|
|
52
|
-
program.action(() => {
|
|
53
|
-
const options = program.opts();
|
|
54
|
-
if (options.port !== void 0 && !/^\d+$/.test(options.port)) program.error(`error: --port must be a number, got ${JSON.stringify(options.port)}`);
|
|
55
|
-
const values = {
|
|
56
|
-
openBrowser: options.open,
|
|
57
|
-
...options.host !== void 0 && { host: options.host },
|
|
58
|
-
...options.port !== void 0 && { port: Number(options.port) },
|
|
59
|
-
trustedHosts: options.trustedHost ?? []
|
|
60
|
-
};
|
|
61
|
-
ctx.provide(WEB_STARTUP_SERVICE, values);
|
|
62
|
-
});
|
|
63
|
-
parseCmdline(ctx, program);
|
|
64
|
-
}
|
|
65
|
-
//#endregion
|
|
66
|
-
export { WEB_STARTUP_SERVICE, apply, inject, name };
|
|
67
|
-
|
|
68
|
-
//# sourceMappingURL=startup.js.map
|
package/lib/auth/startup.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"startup.js","names":[],"sources":["../../src/auth/startup.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { parseCmdline } from '@deepseek-ai/dsh-cmdline'\nimport type { Context } from '@deepseek-ai/cordis'\nimport { sanitizeUsername, sharedCredentialStore } from './credentials.js'\n\nexport const name = 'web-startup'\n\nexport const inject = ['cmdlineArgs']\n\nexport const WEB_STARTUP_SERVICE = 'webStartup'\n\nexport interface WebStartupValues {\n openBrowser: boolean\n host?: string\n port?: number\n trustedHosts: string[]\n}\n\nfunction runAuthReset(args: readonly string[]): never {\n const store = sharedCredentialStore()\n if (!store.isInitialized()) {\n console.error('auth-reset: 尚未初始化管理员账号')\n process.exit(1)\n }\n let password: string | undefined\n let username: string | undefined\n for (let i = 1; i < args.length; i++) {\n if (args[i] === '--password') password = args[++i]\n else if (args[i] === '--username') username = args[++i]\n }\n if (password === undefined && username === undefined) {\n console.error('auth-reset: 需要 --password <新密码> 和/或 --username <新用户名>')\n process.exit(1)\n }\n if (password !== undefined && password.length < 8) {\n console.error('auth-reset: 密码至少 8 个字符')\n process.exit(1)\n }\n if (username !== undefined) {\n username = sanitizeUsername(username)\n if (!username) {\n console.error('auth-reset: 用户名不能为空')\n process.exit(1)\n }\n }\n if (password !== undefined) store.changePassword(username ?? store.username!, password)\n else store.changeUsername(username!)\n console.log('auth-reset: 已更新凭据并轮换会话密钥,全部已签发会话作废')\n process.exit(0)\n}\n\nfunction webCommand(): Command {\n return new Command()\n .name('dsh --profile web')\n .description('Serve the DeepSeek Harness UI.')\n .helpOption('-h, --help', 'show this help')\n .option('--host <host>', 'bind host')\n .option('--no-open', 'do not open the UI in the default browser')\n .option('--port <port>', 'listen port; pass 0 to let the OS pick a free one')\n .option(\n '--trusted-host <authority...>',\n 'extra authority the /api browser-trust fence accepts (host or host:port; repeatable)',\n )\n .addHelpText(\n 'after',\n `\nExamples:\n dsh --profile web serve on the composed host and port\n dsh --profile web --no-open serve without opening a browser (desktop app ignores this)\n dsh --profile web --port 8080 serve on another port\n dsh --profile web --host 0.0.0.0 serve on all interfaces (DSHB: auth plugin guards access)\n dsh --profile web auth-reset --password <新密码> reset admin credentials and revoke all sessions\n`,\n )\n}\n\nexport function apply(ctx: Context): void {\n const args = ctx.cmdlineArgs?.get() ?? []\n if (args[0] === 'auth-reset') runAuthReset(args)\n const program = webCommand()\n program.action(() => {\n const options = program.opts()\n if (options.port !== undefined && !/^\\d+$/.test(options.port)) {\n program.error(`error: --port must be a number, got ${JSON.stringify(options.port)}`)\n }\n const values: WebStartupValues = {\n openBrowser: options.open,\n ...(options.host !== undefined && { host: options.host }),\n ...(options.port !== undefined && { port: Number(options.port) }),\n trustedHosts: options.trustedHost ?? [],\n }\n ctx.provide(WEB_STARTUP_SERVICE, values)\n })\n parseCmdline(ctx, program)\n}\n"],"mappings":";;;;AAKA,MAAa,OAAO;AAEpB,MAAa,SAAS,CAAC,aAAa;AAEpC,MAAa,sBAAsB;AASnC,SAAS,aAAa,MAAgC;CACpD,MAAM,QAAQ,sBAAsB;CACpC,IAAI,CAAC,MAAM,cAAc,GAAG;EAC1B,QAAQ,MAAM,wBAAwB;EACtC,QAAQ,KAAK,CAAC;CAChB;CACA,IAAI;CACJ,IAAI;CACJ,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAC/B,IAAI,KAAK,OAAO,cAAc,WAAW,KAAK,EAAE;MAC3C,IAAI,KAAK,OAAO,cAAc,WAAW,KAAK,EAAE;CAEvD,IAAI,aAAa,KAAA,KAAa,aAAa,KAAA,GAAW;EACpD,QAAQ,MAAM,uDAAuD;EACrE,QAAQ,KAAK,CAAC;CAChB;CACA,IAAI,aAAa,KAAA,KAAa,SAAS,SAAS,GAAG;EACjD,QAAQ,MAAM,wBAAwB;EACtC,QAAQ,KAAK,CAAC;CAChB;CACA,IAAI,aAAa,KAAA,GAAW;EAC1B,WAAW,iBAAiB,QAAQ;EACpC,IAAI,CAAC,UAAU;GACb,QAAQ,MAAM,qBAAqB;GACnC,QAAQ,KAAK,CAAC;EAChB;CACF;CACA,IAAI,aAAa,KAAA,GAAW,MAAM,eAAe,YAAY,MAAM,UAAW,QAAQ;MACjF,MAAM,eAAe,QAAS;CACnC,QAAQ,IAAI,oCAAoC;CAChD,QAAQ,KAAK,CAAC;AAChB;AAEA,SAAS,aAAsB;CAC7B,OAAO,IAAI,QAAQ,CAAC,CACjB,KAAK,mBAAmB,CAAC,CACzB,YAAY,gCAAgC,CAAC,CAC7C,WAAW,cAAc,gBAAgB,CAAC,CAC1C,OAAO,iBAAiB,WAAW,CAAC,CACpC,OAAO,aAAa,2CAA2C,CAAC,CAChE,OAAO,iBAAiB,mDAAmD,CAAC,CAC5E,OACC,iCACA,sFACF,CAAC,CACA,YACC,SACA;;;;;;;CAQF;AACJ;AAEA,SAAgB,MAAM,KAAoB;CACxC,MAAM,OAAO,IAAI,aAAa,IAAI,KAAK,CAAC;CACxC,IAAI,KAAK,OAAO,cAAc,aAAa,IAAI;CAC/C,MAAM,UAAU,WAAW;CAC3B,QAAQ,aAAa;EACnB,MAAM,UAAU,QAAQ,KAAK;EAC7B,IAAI,QAAQ,SAAS,KAAA,KAAa,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAC1D,QAAQ,MAAM,uCAAuC,KAAK,UAAU,QAAQ,IAAI,GAAG;EAErF,MAAM,SAA2B;GAC/B,aAAa,QAAQ;GACrB,GAAI,QAAQ,SAAS,KAAA,KAAa,EAAE,MAAM,QAAQ,KAAK;GACvD,GAAI,QAAQ,SAAS,KAAA,KAAa,EAAE,MAAM,OAAO,QAAQ,IAAI,EAAE;GAC/D,cAAc,QAAQ,eAAe,CAAC;EACxC;EACA,IAAI,QAAQ,qBAAqB,MAAM;CACzC,CAAC;CACD,aAAa,KAAK,OAAO;AAC3B"}
|